原文來自:cuda curand toolkit document
html
Translated by xingoo算法
若是有錯誤請聯繫:xinghl90@gmail.comapi
2Host API簡述dom
使用host api,用戶須要在頭文件的部分包含 curand.h,而且添加CURAND的動態連接庫,即在LINKER的INPUT裏面添加」curand.lib;」。這個文檔是基於CUDA runtime的,因此用戶的代碼也應該是在runtime時調用的。而driver API是不支持CURAND的。異步
觸發器生成隨機數,CURAND同過內部的封裝產生僞隨機數列或者真隨機數列。具體的步驟以下:函數
1 使用函數curandCreateGenerator建立一個新的目標類型(參考 觸發器類型)觸發器性能
2 設置觸發器的選項(參考 觸發器選項),好比,使用curandSetPseudoRandomGeneratorSeed() 來設置種子。spa
3 使用cudaMalloc()申請設備上的存儲空間線程
4 經過curandGenerate()或者其餘的生成函數 生成隨機數翻譯
5 使用生成結果
6 若是但願生成更多的隨機數,能夠屢次使用curandGenerate().
7 經過curandDestroyGenertator(),釋放地址空間
若是但願在cpu的host端生成隨機數,那麼第一步應該調用curandCreateGeneratorHost(),;在第三步,要申請主機的一段地址空間來接收生成結果。其餘步驟,在host端仍是device端的操做都是相同的。
同一時間段建立幾個觸發器是能夠的,每一個觸發器的封裝都獨立聲明。每一個觸發器本身肯定一組生成序列。若是每次運行的時候,設置相同的參數,生成隨機序列也都是相同的。在device端生成的序列與在host端生成的也是相同的。
注意步驟4裏面,curandGenerate()調用一段內核函數,而且異步返回。因此,若是你在不一樣的流裏面運行了另外一個內核函數,而這個內核函數又要使用curandGenerate()的結果,那麼就必須調用cudaThreadSynchronized() 來實現同步,以確保生成隨機序列的內核函數在被調用前結束執行。(也能夠經過下面這種方法解決:use the stream management/event management routines 實在不知道這個方法怎麼翻譯)
經過一個host端的指針來調用在device上運行的觸發器,以及經過一個device端的指針來調用運行在host端的觸發器,這種狀況都屬於未定義。
2.1觸發器類型Generator Types
隨機數觸發器經過curandCreateGenerator()來傳遞類型建立。在CURAND中有7種隨機數觸發器類型,咱們把他們分爲兩類。
2.1.1 僞隨機數觸發器
CURAND_RNG_PSEUDO_XORWOW,(基於異或移位算法XORWOW)
CURAND_RNG_PSEUDO_MRG32K3A,(基於Combined Multiplie Recursive)
CURAND_RNG_PSEUDO_MTGP32(基於梅森旋轉法Mersenne Twister)
2.1.2 真隨機數觸發器
這4種觸發器都是基於SOBOL序列的變種的真隨機數序列觸發器
CURAND_RNG_QUASI_SOBOL32(是一種32位序列的SOBOL觸發器)
CURAND_RNG_QUASI_SCRAMBLED_SOBOL32(srambled不知道怎麼翻譯纔好)
CURAND_RNG_QUASI_SOBOL64(是一種64位序列的SOBOL觸發器)
CURAND_RNG_QUASI_SCRAMBLED_SOBOL64
2.2觸發器選項 Generator Options
建立時,隨機數觸發器就能經過基本選項---seed種子,offset消耗和order順序來定義。
2.2.1 seed 種子
種子是一個64位的整型數,用來初始化僞隨機觸發器的產生。相同的種子,可以產生相同的序列。
2.2.2 Offset消耗/補償
這個選項用來跳過序列開始的一段隨機數。若是offset=100,那麼第一個隨機數產生的時候,會從原來的隨機數序列的第100個開始。這讓屢次運行同一段程序能夠繼續使用相同序列產生的隨機數,而不會重疊。這個跳過的功能不支持CURAND_RNG_PSEUDO_MTGP32觸發器。
2.2.4 Order順序
這個選項用來選擇在全局內存上生成的隨機數如何排序。
有三種僞隨機序列順序能夠選擇:
CURAND_ORDERING_PSEUDO_DEFAULT(默認的)
CURAND_ORDERING_PSEUDO_BEST
CURAND_ORDERING_PSEUDO_SEEDED.
有一種真隨機序列順序能夠選擇:
CURAND_ORDERING_DEFAULT.
目前,CURAND_ORDERING_PSEUDO_DEFAULT 和 CURAND_ORDERING_PSEUDO_BEST對於全部的僞隨機觸發器產生的結果都是相同的。然而,將來的版本,CURAND可能會調整CURAND_ORDERING_PSEUDO_BEST,使之不管是性能仍是質量上都得以改善。而CURAND_ORDERING_PSEUDO_DEFAULT對於任何的CURAND版本都會保持相同的產生結果。在目前的版本中,只有XORWOW觸發器擁有多種產生順序。
關於產生順序,每種觸發器的作法以下:
XORWOW僞隨機觸發器:
CURAND_ORDERING_PSEUDO_BEST
目前版本同CURAND_ORDERING_PSEUDO_DEFAULT的輸出順序是相同的
CURAND_ORDERING_PSEUDO_DEFAULT
當offset=n時,隨機序列在全局內存中從(n mpd 4096)-2 67+[n/4096]開始
CURAND_ORDERING_PSEUDO_SEEDED
當offset=n時,隨機序列在全局內存中從n mod 4096開始。也就是說,每4096個線程使用不一樣的種子。這種種子的方式,雖然節省了運行時間,但對於某些種子的值,僞隨機序列輸出結果統計也顯示出了一些不足。
MRG32K3A 僞隨機觸發器
CURAND_ORDERING_PSEUDO_BEST
跟下面的DEFAULT同樣
CURAND_ORDERING_PSEUDO_DEFAULT
當offset=n時,公式爲(n mod 4096) -276+[n/4096](注意這個觸發器產生的跨度跟XORWOW產生的跨度是不同的)
MTGP32 僞隨機觸發器
CURAND_ORDERING_PSEUDO_BEST
一樣跟DEFAULT的順序相同
CURAND_ORDERING_PSEUDO_DEFAULT
MTGP32觸發器基於基本算法,經過設置不一樣參數,可以產生64種隨機序列。使用S(p)來定義序列,p爲參數。Offset=n時,公式爲S([n/256]mod 64).也就是說,S(0)會有256個例子,而後是S(1)的256個,一直到S(63),一直重複。
Philox_4x32_10 僞隨機觸發器
CURAND_ORDERING_PSEUDO_BEST
跟下面的DEFAULT同樣
CURAND_ORDERING_PSEUDO_DEFAULT
每一個觸發器的線程都會產生不一樣的隨機序列。在host API中有8192種不一樣的序列。來自於一個序列的每四個值都依賴於下一個序列的四個值(Each four values from one sequence are followed by four values from next sequence)。
32位和64位的SOBOL以及快速SOBOL真隨機觸發器
CURAND_ORDERING_QUASI_DEFAULT
當在d個dimensions上面生成n個結果,第1個dimesion由n/d個結果組成,第2個也由n/d個組成,一直到第d個dimension.觸發器只能生成dimension的倍數大小的序列。這個dimension的參數d使用curandSetQuasiRandomGeneratorDimensions(),而且默認爲1.