V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NVIDIA CUDA
PyCUDA
Caffe
different
V2EX  ›  CUDA

关于使用 GPU 生成随机数(cuda/opencl)

  •  
  •   different · 2019-08-11 22:16:02 +08:00 · 9404 次点击
    这是一个创建于 1713 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于特殊原因(原因很特殊(手动狗头))并不能使用 cuda 自带的随机函数。

    因此,翻车了....。

    目的:在不使用 cuda 自带的随机函数前提下,使用 cuda/opencl 的一个内核函数生成 10000 个高斯分布的随机数。

    本人已尝试一下步骤:

    1.在 cpu 生成 10000 的随机函数(应该是线性同余算法)

    2.在 cpu 使用 The Box – Muller transform (听说和线性同余算法使用起来会翻车..)算法将步骤 1 的随机数转成正态分布

    3.然后检验是否为正态分布,结果是对的.

    4.至此,已经生成了一个 10000 个服从高斯分布的随机数啦,将其保存到数组 a。

    事实上需要不断生成并使用数组 a。

    因此考虑 GPU

    分析:上述的 cpu 代码是序列进行的,也就是只有一个随机种子,然后在一个线程内完成了 10000 个随机数的生成。

    然后将代码改改放到 GPU 上面来生成。(目标是实现与 cuda 的函数 curandGenerateNormal(cuda::generator, cudaRand, number, 0.0, 1.0); 一摸一样的功能)。

    为了得到与 curandGenerateNormal 函数相同的结果,我尝试每个内核线程维护一个种子,也就是有 10000 个随机数种子。(调用一次内核,然后执行一万个线程,每隔线程使用自己的种子生成一个随机数,然后组合到数组 a 中) 但是目前,我做了试验中,如果每个内核线程维护一个种子,每个线程维护 a[i](i 为线程 id),最后的出来的并不服从高斯分布。

    也就是说,纵向去看的话( cpu 串行)是可以得到高斯分布的随机数,横向并不行。

    也就是说,假如有 a 数组,b 数组....z 数组中,每个数组自个是高斯分布,但是 a...z 中,各取一个出来,组合在一起,并不服从高斯分布。

    而如果从直观上出发,上述应该也服从高斯分布,但是由于随机种子的问题,可能导致其 a....z 可能有相关性。具体原因我也不是很清楚。

    不知道表达清楚没,各位兄台有没有了解过相关的信息?

    一句话概括就是:curandGenerateNormal 函数相同的功能...

    所以想问问大伙有做过相关的研究吗?

    第 1 条附言  ·  2019-08-12 15:01:19 +08:00
    此贴终结:
    是我自己手残,在写 gpu kernel 的时候随机函数写错了,尴尬!
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3025 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:15 · PVG 08:15 · LAX 17:15 · JFK 20:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.