C++ 生成随机数:CPU vs GPU,哪一个当前获胜?

C++ 生成随机数:CPU vs GPU,哪一个当前获胜?,c++,optimization,random,cuda,hardware,C++,Optimization,Random,Cuda,Hardware,我一直在做一个物理模拟,需要生成大量的随机数(如果你想知道的话,至少10^13)。我一直在使用Mersenne twister的C++11实现。我还读到,这个算法的GPU实现现在是Cuda库的一部分,GPU可以非常高效地完成这个任务;但我找不到明确的数字或基准比较。例如,与8核i7相比,上一代的Nvidia卡在生成随机数方面是否更具性能?如果是,价格是多少,在哪个价格范围内 我认为我的模拟可以从GPU生成大量随机数,CPU完成其余工作中获益。如果您有足够新的Intel CPU(IvyBridge

我一直在做一个物理模拟,需要生成大量的随机数(如果你想知道的话,至少10^13)。我一直在使用Mersenne twister的C++11实现。我还读到,这个算法的GPU实现现在是Cuda库的一部分,GPU可以非常高效地完成这个任务;但我找不到明确的数字或基准比较。例如,与8核i7相比,上一代的Nvidia卡在生成随机数方面是否更具性能?如果是,价格是多少,在哪个价格范围内


我认为我的模拟可以从GPU生成大量随机数,CPU完成其余工作中获益。

如果您有足够新的Intel CPU(IvyBridge或更新版本),可以使用RDRAND指令

这可以通过内部函数使用

可通过VS2012/13、英特尔编译器和gcc获得

生成的随机数最初是在实数随机数上播种的。为符合NIST SP 800-90A标准而设计,其随机性非常高

一些数字供参考:


在配备HT(2.3GHz)的IvyBridge双核笔记本电脑上,单线程使用2^32(4 Gigs)随机32位数字需要5.7秒,使用OpenMP则需要1.7秒。

可以在此处找到一些比较:

试试看?有这么多的GPU和CPU,它们的速度会有所不同…这可能取决于算法…@Plasmah:不幸的是,我没有任何Nvidia卡可供配置,我不能,不幸的是,花钱不知道该干什么expect@Mine:我只是在寻找Mersenne twister随机数生成、CPU端库中的随机数生成和GPU端Cuda库中已经实现的随机数生成之间的比较数据。一个关键方面是您将如何处理随机数?如果您在CPU内存中需要它们,无论GPU上的生成速度有多快,传输时间都可能导致该方法无效。这如何回答OP的问题?这是生成随机数的另一种快速解决方案。这就是问题的本质——如何快速生成数字。如果OP认为这无关紧要,我会删除有趣的答案egur。我想这只适用于Broadwell,但这是RdSeed的。我真的不知道区别。@Liam它是2个核心4个线程(超线程)。速度不如4核,但比2核要好得多。你不是在寻找一个快速的随机数生成器吗?在我的测试中,
std::mt19937
在一个紧循环中大约比RDRAND快100倍。是的,这肯定是我在寻找的,遗憾的是,他们没有将它与默认的c++11随机数生成器进行比较。不过,我很确定我已经找到了一个页面,给出了为不同CPU生成的随机数,如果我能找到它,我可以完成这个线程。再次感谢你;)