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
risposta
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;
}
Does 'setup_kernel <<< 1, N > >> (devstates, unsigned (time (NULL)));' funziona? Credo che avere 40000 thread in un blocco non sia possibile ... – Curious
È 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.
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 –
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
grazie mille –
il kernel di installazione non è mai in esecuzione perché si sta cercando di lanciarlo con un blocco contenente 40000 filettature. – talonmies
Perché hai cancellato il tuo codice? – talonmies