CUDA的随机数生成方法

本博客已迁往http://coredumper.cn


CUDA Runtime API 没有提供用于生成随机数的接口,但是CURAND这个库提供了通过GPU生成随机数的接口,详细内容可参考http://docs.nvidia.com/cuda/curand/index.html

下面给出了通过GPU生成0.0到1.0之间(不包括0.0,包括1.0)服从均匀分布的单精度浮点伪随机数的CUDA程序。

#include <cuda.h>
#include <curand.h>

#define ERROR_EXIT -1

/* Check the return value of CUDA Runtime API */
#define CHECK_CUDA(err) do{\
    if((err) != cudaSuccess){\
        fprintf(stderr, "CUDA Runtime API error %d at file %s line %d: %s.\n",\
                               (int)(err), __FILE__, __LINE__, cudaGetErrorString((err)));\
        exit(ERROR_EXIT);\
    }}while(0)

/* Check the return value of CURAND api. */
#define CHECK_CURAND(err) do{\
    if( (err) != CURAND_STATUS_SUCCESS ){\
        fprintf(stderr, "CURAND error %d at file %s line %d.\n", (int)(err), __FILE__, __LINE__);\
	exit(ERROR_EXIT);\
    }}while(0)

/* Function: produce random float data by GPU
 * Input:   dataHost: the memory to store data produced
 *          number: the number of data to produce
 *          seed: the seed for random generator
 * Output: void
 */
extern "C"
void randomGenerator(float *dataHost, int number, unsigned long long seed)
{   
    float *dataDev;
    CHECK_CUDA( cudaMalloc( (void **) &dataDev, number * sizeof(float) ) );

    curandGenerator_t gen;
    CHECK_CURAND( curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT) );
    CHECK_CURAND( curandSetPseudoRandomGeneratorSeed(gen, seed) );
    CHECK_CURAND( curandGenerateUniform(gen, dataDev, number) );
    CHECK_CURAND( curandDestroyGenerator(gen) );

    CHECK_CUDA( cudaMemcpy(dataHost, dataDev, number * sizeof(float), cudaMemcpyDeviceToHost) );
    CHECK_CUDA( cudaFree(dataDev) );

    return;
}

使用CURAND生成随机数需要注意以下几个问题:

1. 函数curandCreateGenerator()的第二个参数指定的是随机数生成器的类型,共有7种类型,分为伪随机数生成器和准随机数生成器两类。

2. 函数curandSetPseudoRandomGeneratorSeed()的第二个参数为随机数生成器指定种子,相同的种子将会生成相同的随机数序列。

3. 函数curandGenerateUniform()用于生成0.0到1.0之间(不包括0.0,包括1.0)服从均匀分布的单精度浮点数,共有8个类似的函数,分别用于生成服从不同分布的不同类型的随机数。另外一个比较常用的函数是curandGenerate(),用于生成unsigned int类型的随机数。

4. 在编译包含CURAND接口的文件时,需要添加指定链接库的编译选项-lcurand。




  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值