原創做品,如要轉載請註明出處: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)
以上是我的理解,若有錯誤的地方,忘批評指正