原創作品,如要轉載請注明出處:http://www.cnblogs.com/shrimp-can/p/6590152.html
最近要在device函數中使用curand庫生成隨機數,查找了下資料,除了NVIDIA官網的介紹外,其他介紹deviceAPI的我沒有找到,倒是介紹hostAPI的一大堆,因此簡單整理下自己所理解的deviceAPI的使用。
一、簡介
curand由兩部分組成:host端的庫和device端的頭文件。
host端的庫就像其他的CPU庫一樣curand.h,隨機數可以在設備端生成或者CPU端生成。在設備端生成的時候,對庫的調用發生在host端,但是隨機數的生成實際上發生在device端,隨機數存儲在global memory中,用戶可以調用kernel直接使用這個隨機數,也可以將此隨機數拷貝回kernel。
device端的庫頭文件curand_kernel.h,這個頭文件里面定義了設置隨機數生成器的狀態以及生成一系列隨機數的設備函數,使得kernel可以調用函數生成隨機數,而不需要從global memory處讀寫。
二、device API
包含頭文件curand_kernel.h,工程需要鏈接到庫curand。
cuda Nsignt鏈接到庫curand的做法:右擊工程名-屬性-c/c++ General-Paths and Symbols,在Library Paths中添加上curand.lib所在的目錄
我安裝cuda時是默認目錄,在目錄:/usr/local/cuda-7.5/lib64中
使用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)
以上是個人理解,如有錯誤的地方,忘批評指正