Red de conocimiento informático - Material del sitio web - Cómo generar números aleatorios en la función del kernel cuda

Cómo generar números aleatorios en la función del kernel cuda

Primero, se deben usar tres funciones:

curandCreateGenerator(& gen, CURAND_RNG_pseudo_default);

Especifique el disparador como gen y el modo aleatorio como CURAND_RNG _pseudo_default.

curandSetPseudoRandomGeneratorSeed(gen, 1234 ull);

Especifique la semilla como 1234ULL (diferentes semillas generan diferentes secuencias aleatorias).

curandGenerateUniform(gen, devData, n);

Según el gen de activación, el puntero de destino de salida es devData y el tamaño es n.

/*

*Este programa utiliza la API CURAND del host para generar 100

* flotantes pseudoaleatorios.

*/

# incluir & ltstdio.h & gt

# incluir & ltstdlib.h & gt

# incluir & ltcuda .h & gt

# include & ltcurand.h & gt

#define CUDA_CALL(x) do { if((x)!=cudaSuccess) { \

printf("Error ubicado en %s:%d\n ", __FILE__, _ _ LINE _ _);\

Devolver EXIT _ FAILURE}} while(0)

#define CURAND_CALL(x) do { if((x)!=CURAND_STATUS_SUCCESS) { \

printf("Error ubicado en %s:%d\n ", __FILE__, _ _ LINE _ _) ;\

Regresar EXIT _ FAILURE}} while(0)

int main(int argc, char *argv[])

{

size_t n = 100;

size_t I;

curandGenerator_t gen

float *devData, *hostData

/*Asignar n puntos flotantes en el host*/

hostData = (float *)calloc(n, sizeof(float));

/*Asignar n en el dispositivo Punto flotante */

CUDA_CALL(cudaMalloc((void * *)& devData, n * sizeof(float)));

/*Crear generador de generación de números pseudoaleatorios*/

CURAND_CALL(curandCreateGenerator(& gen,

CURAND_RNG_pseudo_default));

/*Establecer semilla* /

CURAND _ CALL(curandSetPseudoRandomGeneratorSeed(gen,

1234 ull));

/*Generar n puntos flotantes en el dispositivo*/

CURAND_CALL(curandGenerateUniform(gen,devData,n));

/*Copiar la memoria del dispositivo al host*/

CUDA_CALL(cudamemacpy(hostData, devData, n * sizeof(float)),

cudamemacpydevicetohost));

/*Mostrar resultados*/

for(I = 0;i<n ; i++) {

printf("%1.4f ", hostData[I]);

}

printf(" \ n ");

p>

/*Limpiar*/

CURAND _ CALL( curandDestroyGenerator(gen));

CUDA _ CALL(CUDA free(datos de desarrollo));

Gratis(hostData);

Devolver EXIT _ SUCCESS

}