2012-08-06 52 views
7

Me gustaría generar números aleatorios en mi función __device__, y mantenerlo en mi Junta int [500], encontré algunos ejemplos, pero utilizaron algún tipo llamado curandState. Solo necesito una función como rand() en C++.Número aleatorio CUDA que genera

+0

núcleo configurar no está en funcionamiento, ya que están tratando de lanzarlo con un bloque que contiene 40000 trapos. – talonmies

+0

¿Por qué eliminaste tu código? – talonmies

Respuesta

5

aquí es mi código, tengo N3 [40000] matriz en memoria en el dispositivo, genero algunos números aleatorios en mi núcleo que trabaja para un hilo (me refiero a esto "kernel < < < 1,1 >>> .. . "), entonces lo copio a mi N2 [40000] a partir de la CPU, e imprimirlo, por lo que aquí está el código

#include <iostream> 
#include <Cuda.h> 
#include<curand.h> 
#include<curand_kernel.h> 


int n = 200; 
using namespace std; 

__device__ float generate(curandState* globalState, int ind) 
{ 
    //int ind = threadIdx.x; 
    curandState localState = globalState[ind]; 
    float RANDOM = curand_uniform(&localState); 
    globalState[ind] = localState; 
    return RANDOM; 
} 

__global__ void setup_kernel (curandState * state, unsigned long seed) 
{ 
    int id = threadIdx.x; 
    curand_init (seed, id, 0, &state[id]); 
} 

__global__ void kernel(float* N, curandState* globalState, int n) 
{ 
    // generate random numbers 
    for(int i=0;i<40000;i++) 
    { 
     int k = generate(globalState, i) * 100000; 
     while(k > n*n-1) 
     { 
      k-=(n*n-1); 
     } 
     N[i] = k; 
    } 
} 

int main() 
{ 
    int N=40000; 

    curandState* devStates; 
    cudaMalloc (&devStates, N*sizeof(curandState)); 

    // setup seeds 
    setup_kernel <<< 1, N >>> (devStates,unsigned(time(NULL))); 

    float N2[40000]; 
    float* N3; 
    cudaMalloc((void**) &N3, sizeof(float)*N); 

    kernel<<<1,1>>> (N3, devStates, n); 

    cudaMemcpy(N2, N3, sizeof(float)*N, cudaMemcpyDeviceToHost); 

    for(int i=0;i<N;i++) 
    { 
     cout<<N2[i]<<endl; 
    } 

    return 0; 
} 
+0

¿'setup_kernel <<< 1, N > >> (devStates, unsigned (time (NULL)));' funciona? Creo que tener 40000 hilos en un bloque no es posible ... – Curious

3

Puede usar la biblioteca curand para generar números aleatorios en la memoria del dispositivo y luego ejecutar su kernel sin siquiera tener que copiar esos valores al host.

+0

gracias, pero no sé qué función y cómo usar para el número aleatorio de curand, y mi placa [500] en la memoria de mi dispositivo. ¿Puedes escribir el código de mi Junta? Estaré tan agradecido –

+1

Creo que este es el escenario más básico (aunque también tendría que sembrar la generación, de lo contrario obtendrá la misma secuencia cada vez): cudaMalloc (& randoms_dev, sizeof (float) * WORK_SIZE); curandCreateGenerator (y generador, CURAND_RNG_PSEUDO_DEFAULT); curandGenerateUniform (generador, randoms_dev, WORK_SIZE); curandDestroyGenerator (generador); – Eugene

+0

muchas gracias –

Cuestiones relacionadas