由于特殊原因(原因很特殊(手动狗头))并不能使用 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 函数相同的功能...
所以想问问大伙有做过相关的研究吗?