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

标签 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 正交矩阵 block 有关,对吗?谁能让我更好地了解这里发生的事情?

无论如何,有人有我可以使用的好的代码示例吗?或者有人有另一种在 CUDA 内核中生成随机高斯数的方法吗?代码示例将不胜感激。

谢谢!

最佳答案

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

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

  • 华莱士生成器将高斯变换为高斯(即非均匀变换为高斯)
  • CUDA 代码有两个隐式变量:blockIdxthreadIdx - 它们定义 block 索引和线程索引,请参阅 CUDA Programming Guide了解更多信息
  • 该代码在 sm_20 及更高版本上使用 __mul24,这实际上比“普通”32 位乘法慢,因此我会避免使用它(即使在较旧的架构上,为了简单起见)

关于cuda - 从 CUDA 中的高斯分布生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4743755/

相关文章:

c++ - 在一个非常简单的 Cuda 和 C++ 程序上需要帮助

c++ - 高斯模糊不均匀

matlab - 检查天气预报值是否遵循高斯分布或不使用 matlab?

cuda - Visual Studio nVidia nsight 更改 cuda 工具包版本

linux - 在没有 sudo 访问权限的情况下添加到 CUDA 库的路径

c - C 中的 Tic Tac Toe AI 问题

php - 生成随机的 "pattern-lock"数字序列

javascript - 如何识别任意字符串?

matlab - MATLAB 中的高斯滤波器

linux - 在 Ubuntu 中安装文件