CUDA 库函数-----cuRAND生成随机数

在主机侧使用随机数生成的库函数大致分为三个步骤:

1,声明随机数指针,指定随机数生成算法。

2,为生成算法设定初始值。

3,指定随机数生成个数,生成随机数,并保存在global memory中。

声明随机数指针,指定随机数生成算法

 使用curandGenerator_t 生成相应的随机数指针,使用curandCreateGenerator(curandGenerator_t*  generator, curandRngType_t   rng_type)
    generator:  指向随机数的指针变量。

    rng_type:算法类型


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中


使用curandGenerateUniform(curandGenerator_t generator, float* outputPtr, size_t num)函数来生成多个随机数,并将它们存放到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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值