我在互联网上进行了很多搜索,以找到一种在内核中在我的 CUDA 设备上生成随机数的方法。这些数字必须来自高斯分布。
我发现最好的东西来自 NVIDIA 本身。这是华莱士算法,它使用均匀分布来构建高斯分布。但是他们给出的代码示例缺乏解释,我真的需要了解算法是如何进行的,尤其是在设备上。例如,他们给出:
__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”是什么意思。我知道其他循环中的“4”与 4x4 正交矩阵块有关,对吗?谁能让我更好地了解这里发生了什么?
无论如何,有人有我可以使用的好的代码示例吗?或者有人有另一种在 CUDA 内核中生成随机高斯数的方法吗?代码示例将不胜感激。
谢谢!