1,声明随机数指针,指定随机数生成算法。
2,为生成算法设定初始值。
3,指定随机数生成个数,生成随机数,并保存在global memory中。
声明随机数指针,指定随机数生成算法
使用curandGenerator_t 生成相应的随机数指针,使用curandCreateGenerator(curandGenerator_t* generator, curandRngType_t rng_type)
generator: 指向随机数的指针变量。
rng_type:算法类型
宏定义 算法类型
CURAND_RNG_PSEUDO_XORWOW XORWOW
CURAND_RNG_PSEUDO_MRG32K3A MRG32k3a
CURAND_RNG_PSEUDO_MTGP32 梅森・费尔拖斯特
CURAND_RNG_QUASI_SOBOL32 Sobol32
CURAND_RNG_QUASI_SCRAMBLED_SOBOL64 Scrambled Sobol64
CURAND_RNG_QUASI_DEFAULT XORWOW
为生成算法设定初始值
使用curandSetPseudoRandomGeneratorSeed(curandGenerator_t generator, unsigned long long seed)
generator: 随机数变量
seed: 初始值
在这里说明一下指定初始值的意义:因为所有的随机数生成算法都是按照即定的顺序来生成随机数,所以,如果不设定初值或者不改变初始值的话。那每次生成的随机数将不会发生改变。
指定随机数生成个数,生成随机数,并保存在global memory中
generator:随机数变量
outputPtr:global memory的首地址,将global memory做为随机数的缓冲器
num:生成随机数的个数
最后,需使用curandDestroyGenerotor将生成的随机数指针变量释放掉.
示例:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<cuda_runtime.h>
#include<curand.h>
#pragma comment(lib, "cudart.lib")
#pragma comment(lib, "curand.lib")
#define CUDA_CALL(x) do { if((x)!=cudaSuccess) { \
printf("Error at %s:%d\n",__FILE__,__LINE__);\
return EXIT_FAILURE;}} while(0)
#define CURAND_CALL(x) do { if((x)!=CURAND_STATUS_SUCCESS) { \
printf("Error at %s:%d\n",__FILE__,__LINE__);\
return EXIT_FAILURE;}} while(0)
int main(int argc, char *argv[])
{
size_t n = 100;
size_t i;
curandGenerator_t gen;
float *devData, *hostData;
/* Allocate n floats on host */
hostData = (float *)calloc(n, sizeof(float));
/* Allocate n floats on device */
CUDA_CALL(cudaMalloc((void **)&devData, n*sizeof(float)));
/* Create pseudo-random number generator */
CURAND_CALL(curandCreateGenerator(&gen,
CURAND_RNG_PSEUDO_MTGP32));
/* Set seed */
CURAND_CALL(curandSetPseudoRandomGeneratorSeed(gen,
1234ULL));
/* Generate n floats on device */
CURAND_CALL(curandGenerateUniform(gen, devData, n));
/* Copy device memory to host */
CUDA_CALL(cudaMemcpy(hostData, devData, n * sizeof(float),
cudaMemcpyDeviceToHost));
/* Show result */
for(i = 0; i < n; i++) {
printf("%1.4f ", hostData[i]);
}
printf("\n");
/* Cleanup */
CURAND_CALL(curandDestroyGenerator(gen));
CUDA_CALL(cudaFree(devData));
free(hostData);
getchar();
return EXIT_SUCCESS;
}