カーネル内の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カーネルでランダムなガウス数を生成する別の方法を持っていますか?コードサンプルは非常に高く評価されます。
ありがとうございます!
U1は、しかし、私はちょうどかましてきたほぼゼロであるときの不安定を探してくださいその1つ - ハード。 – endian