2012-08-06 23 views
7

Vorrei generare numeri casuali nella mia funzione e conservarlo nel mio tab interno [500], ho trovato alcuni esempi, ma hanno utilizzato un tipo denominato curandState. Ho solo bisogno di una funzione come una rand() in C++.Generazione casuale numero CUDA

+0

il kernel di installazione non è mai in esecuzione perché si sta cercando di lanciarlo con un blocco contenente 40000 filettature. – talonmies

+0

Perché hai cancellato il tuo codice? – talonmies

risposta

5

ecco il mio codice, ho N3 [40000] array nella memoria del mio dispositivo, genero alcuni numeri casuali nel mio kernel che lavorano per un thread (intendo questo "kernel < < 1,1 >>> .. . "), allora copio nella mia N2 [40000] dalla CPU, e stamparlo, ecco il codice

#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

Does 'setup_kernel <<< 1, N > >> (devstates, unsigned (time (NULL)));' funziona? Credo che avere 40000 thread in un blocco non sia possibile ... – Curious

3

È possibile utilizzare la libreria di rastrellamento per generare numeri casuali nella memoria del dispositivo e quindi eseguire il kernel senza dover copiare quei valori nell'host.

+0

grazie, ma non so quale funzione e come utilizzare per il numero casuale da curand e la mia scheda [500] nella memoria del mio dispositivo. puoi scrivere il codice per la mia commissione? Sarò così grato –

+1

Credo che questo sia lo scenario più basilare (anche se dovresti seminare la generazione - altrimenti otterrai sempre la stessa sequenza): cudaMalloc (& randoms_dev, sizeof (float) * WORK_SIZE); curandCreateGenerator (& generator, CURAND_RNG_PSEUDO_DEFAULT); curandGenerateUniform (generator, randoms_dev, WORK_SIZE); curandDestroyGenerator (generatore); – Eugene

+0

grazie mille –