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)

 

以上是我的理解,若有錯誤的地方,忘批評指正

相關文章
相關標籤/搜索