CUDA隨機數生成庫curand——deviceAPI


原創作品,如要轉載請注明出處: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)

 

以上是個人理解,如有錯誤的地方,忘批評指正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM