2011-01-20 63 views
1

カーネル内のCUDAデバイスで乱数を生成する方法を見つけるために、インターネット上で多くのものを検索しました。数字はガウス分布から来なければなりません。CUDAのガウス分布から乱数を生成する

The best thing I foundは、NVIDIAからのものでした。 Wallaceのアルゴリズムであり、一様分布を使ってガウス分布を構築しています。しかし、コードサンプルには説明がなく、アルゴリズムがどのように動くか、特にデバイス上でどのように理解する必要があります。たとえば、次のように指定します。

__device__ void generateRandomNumbers_wallace( 
unsigned seed, // Initialization seed 
float *chi2Corrections, // Set of correction values 
float *globalPool, // Input random number pool 
float *output // Output random numbers 


    unsigned tid=threadIdx.x; 
    // Load global pool into shared memory. 
    unsigned offset = __mul24(POOL_SIZE, blockIdx.x); 
    for(int i = 0; i < 4; i++) 
     pool[tid+THREADS*i] = globalPool[offset+TOTAL_THREADS*i+tid]; 
    __syncthreads(); 
     const unsigned lcg_a=241; 
     const unsigned lcg_c=59; 
     const unsigned lcg_m=256; 
     const unsigned mod_mask = lcg_m-1; 
     seed=(seed+tid)&mod_mask ; 
     // Loop generating outputs repeatedly 
    for(int loop = 0; loop < OUTPUTS_PER_RUN; loop++) 
     { 
     Transform(); 
     unsigned intermediate_address; 
     i_a = __mul24(loop,8*TOTAL_THREADS)+8*THREADS * 
      blockIdx.x + threadIdx.x; 
     float chi2CorrAndScale=chi2Corrections[ 
      blockIdx.x * OUTPUTS_PER_RUN + loop]; 
     for(i = 0; i < 4; i++) 
      output[i_a + i*THREADS]=chi2CorrAndScale*pool[tid+THREADS*i]; 
    } 

まず、宣言された変数の多くは関数内で使用されていません。そして、私は本当に "8"が2番目のループにあるものを取得しません。私は他のループの "4"が4x4直交行列ブロックと何か関係があると理解しています、そうですか?誰が私にここで何が起こっているの良いアイデアを与えることができますか?

とにかく、誰も私が使用できる良いコードサンプルを持っていますか?あるいは、誰かがCUDAカーネルでランダムなガウス数を生成する別の方法を持っていますか?コードサンプルは非常に高く評価されます。

ありがとうございます!

答えて

3

CURANDは、CUDAツールキット(バージョン3.2以降)に付属しています。それははるかに簡単だろう!

あなたが投稿したコードには、いくつかの注意事項は: - これらは定義blockIdxthreadIdx

  • ウォレス・ジェネレータは、ガウス分布(ガウス分布にすなわちない制服)
  • CUDAコードは、2つの暗黙の変数を持つガウス変換しますブロックのインデックスとブロックのインデックスは、ブロックの詳細についてはCUDA Programming Guideを参照してください。
  • このコードではsm_20で__mul24を使用していますが、これは実際には通常の32ビット乗算よりも遅いため、シンプルさ)
1

Box-Muller methodでもよい。

+0

U1は、しかし、私はちょうどかましてきたほぼゼロであるときの不安定を探してくださいその1つ - ハード。 – endian

1

高速ウォルシュアダマール変換は、加減算のパターンによって行われます。したがって、中心極限定理が適用される。ウォルシュアダマール変換を受ける均一な乱数の配列は、ガウス/正規分布を有する。それに関する若干の技術的詳細があります。アルゴリズムはWallaceによって発見されなかった。 Servo Magazineで1993/1994年頃に最初に出版されました。 私はwww.code.google.com/p/lemontreeで変換に よろしく、 ショーン・オコナーのウォルシュ・アダマールについてのコードを持って

関連する問題