2012-07-30 152 views
2

我正在閱讀CURAND Library API,並且我是CUDA的新手,我想看看是否有人能真正向我展示使用CURAND庫生成隨機數的簡單代碼。我正在研究生成大量的數字以用於離散事件模擬。我的任務是開發算法來使用GPGPU來加速隨機數的生成。我已經在標準C語言編程中實現了LCG,乘法和斐波那契方法。不過,我想將這些代碼「移植」到CUDA中,並利用線程和塊來加速生成隨機數的過程。CUDA - 使用CURAND傻瓜庫

鏈接1:http://adnanboz.wordpress.com/tag/nvidia-curand/

那人有兩個,我會需要(LCG和梅森難題),但代碼不提供太多細節的方法。我想知道是否有人能夠在這些初始實現上進行擴展,以便實際指出我如何正確使用它們的正確方向。

謝謝!

+0

在演示簡單CURAND使用的SDK示例程序中,應該有蒙特卡羅估計PI。例如。在MonteCarloCURAND下估算PiP。你有機會看看嗎? – njuffa 2012-07-30 22:04:31

+0

是的,我看着它。不過,我正在尋找一個隨機數生成器的例子。我將編輯我的問題,發佈我開發的代碼,我遇到了麻煩。 – 2012-07-31 00:57:00

+0

@njuffa任何人都想分享/詳細說明這一點? – 2012-08-01 18:05:57

回答

4

你的問題是誤導 - 你說「使用cuRAND圖書館傻瓜」,但你實際上並不想使用cuRAND。如果我理解正確,您實際上想從頭開始實施自己的 RNG,而不是使用cuRAND中可用的優化RNG。

  1. 第一個建議是重新決定使用自己的RNG,爲什麼不使用cuRAND?如果統計屬性適用於您的應用程序,那麼使用cuRAND可以更好地瞭解它適用於所有代GPU。它包括Marsaglia的XORWOW,l'Ecuyer的MRG32k3a和MTGP32 Mersenne Twister(以及Sobol'準RNG)。
  2. 你也可以看看Thrust,它有一些簡單的RNG,例如見Monte Carlo sample
  3. 如果您確實需要創建自己的生成器,那麼在GPU Computing Gems(Emerald Edition,第16章:隨機數生成器的並行化技術)中有一些有用的技巧。

作爲一個方面說明,請記住,雖然簡單的LCG快速且易於跳過,但它們通常具有fairly poor statistical properties,特別是在使用大量繪圖時。當你說你需要「Mersenne Twister」時,我認爲你的意思是MT19937。引用的Gems的書談到了MT19937的並行化,但是最初的開發者創建了MTGP生成器(上面也提到過),因爲MT19937實現跳過(skip-ahead)相當複雜。

另外作爲另一方面的說明,只是使用不同的種子來實現並行化通常是一個壞主意,統計上你不能保證獨立性。您需要先行跳躍或跳躍式跳躍,或者使用其他技術(例如DCMT)來確保序列之間沒有關聯。