从CUDA中的高斯分布生成随机数

时间:2011-01-20 05:30:44

标签: cuda random gaussian

我在互联网上搜索了很多,以便在内核中找到在我的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内核中生成随机高斯数的方法?我们非常感谢代码示例。

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用CURAND,它包含在CUDA工具包(版本3.2及更高版本)中。它会简单得多!

关于您发布的代码的一些注释:

  • 华莱士生成器将高斯变换为高斯(即非均匀到高斯)
  • CUDA代码有两个隐式变量:blockIdxthreadIdx - 这些变量用块定义块索引和线程索引,有关详细信息,请参阅CUDA Programming Guide
  • 代码在sm_20上使用__mul24,后来这实际上比“普通”32位乘法慢,所以我会避免它(即使在较旧的架构上也是为了简单)

答案 1 :(得分:1)

Box-Muller method也很好。

答案 2 :(得分:1)

Fast Walsh Hadamard变换由加法和减法模式完成。因此,中心极限定理适用。经历沃尔什哈达玛变换的均匀随机数阵列将具有高斯/正态分布。有一些轻微的技术细节。 Wallace没有发现该算法。它首次由我自己在1993/1994年左右在Servo杂志上发表。 我在www.code.google.com/p/lemontree上有关于Walsh Hadamard转换的代码 问候, 肖恩奥康纳