我在互联网上搜索了很多,以便在内核中找到在我的CUDA设备上生成随机数的方法。这些数字必须来自高斯分布。
The best thing I found来自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内核中生成随机高斯数的方法?我们非常感谢代码示例。
谢谢!
答案 0 :(得分:4)
您可以使用CURAND,它包含在CUDA工具包(版本3.2及更高版本)中。它会简单得多!
关于您发布的代码的一些注释:
blockIdx
和threadIdx
- 这些变量用块定义块索引和线程索引,有关详细信息,请参阅CUDA Programming Guide 答案 1 :(得分:1)
答案 2 :(得分:1)
Fast Walsh Hadamard变换由加法和减法模式完成。因此,中心极限定理适用。经历沃尔什哈达玛变换的均匀随机数阵列将具有高斯/正态分布。有一些轻微的技术细节。 Wallace没有发现该算法。它首次由我自己在1993/1994年左右在Servo杂志上发表。 我在www.code.google.com/p/lemontree上有关于Walsh Hadamard转换的代码 问候, 肖恩奥康纳