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

2019-08-11 22:16:02 +08:00
 different

由于特殊原因(原因很特殊(手动狗头))并不能使用 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 函数相同的功能...

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

9428 次点击
所在节点    CUDA
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/591013

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX