網頁

2019年2月5日 星期二

cuda curand

curand--device API
一、簡介
二、device API
1.創建隨機算法狀態對象
2.對算法狀態進行初始化
3.生成隨機數



一、簡介
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)

參考
https://www.smwenku.com/a/5beb616d2b717720b51f4956

沒有留言:

張貼留言