CUDA随机数生成库curand——deviceAPI

原创做品,如要转载请注明出处:http://www.cnblogs.com/shrimp-can/p/6590152.htmlhtml

最近要在device函数中使用curand库生成随机数,查找了下资料,除了NVIDIA官网的介绍外,其余介绍deviceAPI的我没有找到,却是介绍hostAPI的一大堆,所以简单整理下本身所理解的deviceAPI的使用。c++

1、简介算法

curand由两部分组成:host端的库和device端的头文件。api

host端的库就像其余的CPU库同样curand.h,随机数能够在设备端生成或者CPU端生成。在设备端生成的时候,对库的调用发生在host端,可是随机数的生成实际上发生在device端,随机数存储在global memory中,用户能够调用kernel直接使用这个随机数,也能够将此随机数拷贝回kernel。函数

device端的库头文件curand_kernel.h,这个头文件里面定义了设置随机数生成器的状态以及生成一系列随机数的设备函数,使得kernel能够调用函数生成随机数,而不须要从global memory处读写。spa

2、device APIorm

包含头文件curand_kernel.h,工程须要连接到库curand。htm

cuda Nsignt连接到库curand的作法:右击工程名-属性-c/c++ General-Paths and Symbols,在Library Paths中添加上curand.lib所在的目录对象

我安装cuda时是默认目录,在目录:/usr/local/cuda-7.5/lib64中blog

 

使用curand的deviceAPI生成随机数主要须要三个步骤

a.建立一个随机算法状态的对象,如curandState state

b.对状态进行初始化,使用curand_init()函数

c.生成随机数,使用curand等

deviceAPI的做用也是这些,下面进行更详细的介绍

1.建立随机算法状态对象

在deviceAPI中,有4中为随机算法,4种真随机算法

伪随机算法     对应的状态

Mtgp32                       curandStateMtgp32_t

MRG32k3a                 curandStateMRG32k3a_t

Philox4_32_10           curandStatePhilox4_32_10_t

XORWOW                  curandStateWORWOW_t

真随机算法     对应的状态

scrambled Sobol64     curandStateScrambledSobol64_t

Sobol64                    curandStateSobol64_t

scrambled Sobol32     curandStateScrambledSobol32_t

Sobol32                    curandStateSobol32_t

如要建立算法XORWOW状态对象:curandStateWORWOW_t   state

2.对算法状态进行初始化

curand_init()函数,不一样的算法,函数的参数不相同,具体算法所须要的参数能够看NVIDIA官网curand_initAPI:http://docs.nvidia.com/cuda/curand/group__DEVICE.html#group__DEVICE

对于除了MTGP32的伪随机算法,初始化参数都是:种子、序列、偏移、要初始化的随机算法状态对象

注意:算法MTGP32的初始化是经过两个hostAPI,curandMakeMTGP32Constants和cirandMakeMTGP32KernelState

如要初始化算法XORWOW状态对象:curand_init ( unsigned long long seed, unsigned long long subsequence, unsigned long long offset, curandStateXORWOW_t* state )

 

3.生成随机数

生成随机数除了可使用不一样的算法(由参数决定)之外,还能生成不一样分布、不一样浮点类型的随机数,这根据调用的生成随机数的API决定。

主要有如下几种API:

curand                                                  生成unsigned int型整数,没有特殊分布

curand_uniform                                    生成服从均匀分布的float

curand_uniform4                                  生成4个服从均匀分布的float

curand_uniform_double                     生成服从均匀分布的double

curand_uniform2_double                     生成2个服从均匀分布的double

curand_poisson                                 生成服从泊松分布的int

curand_poisson4                               生成4个服从泊松分布的int

curand_normal                                  生成服从正态分布的float

curand_normal2                                生成2个服从正态分布的float

curand_normal4                                生成4个服从正态分布的float

curand_normal_double                     生成服从正态分布的double

curand_normal2_double                   生成2个服从正态分布的double

curand_log_normal                           生成服从对数正态分布的float

curand_log_normal2                           生成2个服从对数正态分布的float

curand_log_normal4                           生成4个服从对数正态分布的float

curand_log_normal_double                生成服从对数正态分布的double

curand_log_normal2_double              生成2个服从对数正态分布的double

curand_mtgp32_single                    生成mtgp32算法中服从均匀分布的float

curand_mtgp32_single_specific         生成mtgp32算法中服从特殊泊松分布的float

curand_mtgp32_specific                    生成mtgp32算法中的32bits的int

如要生成一个int型的随机数,采用XORWOW算法:curand(curandStateXORWOW_t* state)

 

以上是我的理解,若有错误的地方,忘批评指正

相关文章
相关标签/搜索