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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值