并行伪随机数生成器


20

这个问题主要与一个实际的软件工程问题有关,但是我很想知道理论家是否可以对此提供更多的见解。


简而言之,我有一个使用伪随机数生成器的蒙特卡洛模拟,我想对其进行并行化,以便有1000台计算机并行运行同一模拟。因此,我需要1000个独立的伪随机数流。

我们可以拥有具有以下属性的1000个并行流吗?在此,X应该是一个非常著名且经过广泛研究的PRNG,具有各种良好的理论和经验特性。

  1. 事实证明,这些流与我仅使用X并将生成的流拆分X为1000个流的情况一样好。

  2. 在任何流中生成下一个数字(几乎)与使用生成下一个数字一样快X

换句话说:我们可以“免费”获得多个独立的流吗?

当然,如果我们仅使用X,总是丢弃999个数字并选择1,那么我们当然将拥有属性1,但是运行时间将损失1000倍。

一个简单的想法是使用 1000个副本X,并带有种子1、2,...,1000。这当然会很快,但是如果流具有良好的统计特性,则并不明显。


经过一番谷歌搜索后,我发现了以下内容:

  • SPRNG库似乎是专出于这样的目的,它支持多种的PRNG

  • 如今,梅森捻线机似乎是一种流行的PRNG,我发现了一些引用,该引用可以并行产生多个流。

但是所有这一切都离我自己的研究领域很远,以至于我无法弄清楚什么是最先进的技术,以及哪种结构不仅在理论上而且在实践上都行之有效。


一些澄清:我不需要任何类型的密码属性;这是用于科学计算。我将需要数十亿个随机数,因此我们可以忘记周期任何生成器<232

编辑:我不能使用真正的RNG;我需要确定性PRNG。首先,它在调试方面有很大帮助,并使所有内容都可重复。其次,它使我能够利用我可以使用多次通过模型的事实非常有效地进行中值查找(请参阅此问题)。

编辑2:有一个密切相关的问题@ StackOverflow:用于集群环境的伪随机数生成器


6
为什么不将PRNG与独立采样的种子一起使用?我不明白这不能满足1和2,因为您不需要在不同机器之间进行协调1000
Sasho Nikolov

我不是专家,但是最近(搜索有关TCS问题的信息)我发现了以下硬件:idquantique.com/true-random-number-generator / ... ...可以产生16Mbits / sec流的PCI板(量子)随机位。...您可以购买其中的一堆并实现一些随机数生成器服务器...虽然不是很好的理论方法,但是可以保证这些位是“好”的:-) :-)
Marzio De Biasi

@Vor:我想让一切保持可重复性和确定性。给定一个固定的种子,如果我重新运行实验,我希望得到完全相同的结果。而且我希望能够在一台计算机上运行相同的实验并再次获得相同的结果。(其中之一,在调试并行算法时
很有帮助

@Jukka:好的!...而且我想将数十亿个不可压缩的野比特与实验结果一起存储是不太可行的:-) ...需要PRNG专家!
Marzio De Biasi

2
感谢您到目前为止的回答!让我们看看是否有更多的赏金参与……
Jukka Suomela 2011年

Answers:


7

您可以使用由Saito和Matsumoto开发的Mersenne Twister算法的改进:

面向SIMD的快速梅森捻线器(SFMT)

SFMT是一种线性反馈移位寄存器(LFSR)生成器,可一步生成128位伪随机整数。SFMT是针对现代CPU的最新并行性而设计的,例如多级流水线和SIMD(例如128位整数)指令。它支持32位和64位整数,以及双精度浮点作为输出。在大多数平台上,SFMT比MT快得多。不仅速度提高了,而且以v位精度改进了均分布的尺寸。此外,从0过量的初始状态恢复要快得多。有关详细信息,请参见斋藤睦男的硕士论文

的期间从改变2 216091 - 12607122160911

使用一个相同的伪随机数生成器通过更改初始值来生成多个独立的流可能会引起问题(可能性很小)。为避免此问题,最好为每一代使用不同的参数。该技术称为MT参数的动态创建

在SFMT源代码中,您可以找到一些参数集(可变周期)的示例,以及将CSV文件转换为可编译参数集的awk脚本。还有一个工具叫做“ 梅森捻线发生器的动态创建 ”。

作者最近开发了Mersenne Twister的另一个修改版本- 图形处理器的Mersenne Twister,旨在在GPU中运行并利用其本机并行执行线程。关键功能是速度:5×107 GeForce GTX 260上每4.6ms随机整数。

产生的序列的周期是2 23209 - 12 44497 - 1为32位版本,和2 23209 - 12 44497 - 12 110503 - 1为64位版本。它为每个周期支持128个参数集,换句话说,它可以为每个周期生成128个独立的伪随机数序列。我们已经为MTGP开发了Dynamic Creator,它可以生成更多参数集2112131223209124449712232091244497121105031

实际上,他们提供了MTGPDC工具来创建多达232参数集(即独立的流)。

该算法通过了Diehard和NIST等主要随机性测试。

关于arXiv的初步文章也可查阅:适用于图形处理器的Mersenne Twister的变体


一个相关但较旧的工具是Matsumoto and Nishimura(1998):伪随机数生成器的动态创建。但是我无法弄清楚这些工具中的哪些仅是概念证明,哪些是广泛使用的具有行业实力的软件包。
Jukka Suomela 2011年

@Jukka:也许您可以直接向MTGP算法的作者询问。在他们的网站上:“ ...欢迎任何反馈(向Saito Mutsuo Saito发送电子邮件,其中saito“ at sign” math.sci.hiroshima-u.ac.jp和m-mat“ at sign” math.sci.hiroshima- u.ac.jp)...”。也许他们可能不是100%公正的,但是他们肯定知道MTGP的优缺点,并且可以告诉您它是否适合您的目的。
Marzio De Biasi

在Mathematica中,似乎推荐使用Mersenne Twister +动态创建。
Jukka Suomela 2011年

@Jukka:MT + DC软件包也可以在松本的网站上找到(math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html);我认为MTGP只是适用于GPU的变体。因此,MT + DC似乎是更好(且经过测试/稳定)的选择(除非您绝对必须在每个流上每4.6ms每5ms分配随机整数:5×107
Marzio De Biasi

@Vor:如果您编辑答案并将MTGP替换为dcmt,我可以接受。
Jukka Suomela 2011年

12

解决这个问题的方法似乎很多,但一种简单的方法是使用Blum Blum Shub PRNG。此PRNG由复发时关系式定义,其中Ñ是一个半素。为了从中得到一个随机位,您可以简单地取x i的位奇偶校验。什么是这个很好的是,由于X + ķ = X 2 ķ  国防部  Ñ = X 2 ķ  MOD  λ Ñ xi+1=xi2 mod NNxi您可以直接计算任何以 k为单位的时间常数(即 O log N 3或更快),具体取决于您使用的模块化指数乘法算法。因此是你中号机,然后用于通过索引的机器 ÿ可以使用发电机 X + 1 ÿ = X 2 中号MOD  λ Ñ  国防部  Ñ,其中 X 0 ÿ = Xxi+k=xi2k mod N=xi2k mod λ(N)mod NkO(log(N)3)Myxi+1,y=xi2Mmod λ(N) mod N,其中X0是您的种子。方便地,这将生成与使用单个流完全相同的数字流,并将其输出依次分配到每台计算机。x0,y=x02y mod λ(N) mod Nx0

但是,这并不是PRNG最快的,因此,仅当您在模拟中所做的任何事情的开销明显大于PRNG的成本时,它才有用。然而,值得指出的是,它会为的某些组合快得多Ñ比其他,尤其是当的二进制表示2 中号 MOD  λ Ñ 含少量的1或较小。MN2M mod λ(N)


1
我认为让每台机器生成序列的连续部分,将它们间隔开得太远,以致它们不会相交会更快。无论如何,将Blum Blum Shub用于非加密应用程序在我看来似乎有些过分。
Antonio Valerio Miceli-Barone

1
@Antonio:是的,那会稍微快一点,特别是如果您提前知道确切需要多少次试验的话。如果您不知道,那么我认为您将以两种方式获得相同的缩放比例。奇怪的是Blum Blum Shub正是我们几年前在计算物理学中被抛弃的PRNG。如果您不将其用于加密目的,则可以使用更小的模数,因此它并不是真的那么慢,并且对于许多任务而言,与您需要计算的随机变量的任何函数相比,它会更快。
Joe Fitzsimons

5

预处理阶段如何?给定一个随机种子(大小为n),运行X以获得大小为1000 n的伪随机流。表示由该流小号1s ^ 2... s ^ 1000,其中对于1 1000š 是大小的流的连续部分ÑsnX1000ns1,s2,,s10001i1000sin

鉴于是有效的PRNG(今天,我们拥有非常快的PRNG)这一事实,可以以非常低的开销完成此预处理阶段。X

siiX

Xs1i<j1000sisjs


这与@Antonio建议的方法本质上不是相同的方法:使用PRNG为其自身生成种子。我对此感到有些不安...要举一个可能出问题的简单例子,请考虑PRNG,其中输出=内部状态,而种子仅设置内部状态。
Jukka Suomela 2011年

@Jukka:我的方法类似于安东尼奥的方法,但我的方法更笼统。您的示例(输出=内部状态)中的PRNG似乎不是加密安全的。如果PRNG的输出在计算上与均匀分布没有区别,则从密码上讲是安全的。请参阅以获取更多信息。PS: Blum-Blum-Shub PRNG满足此条件。
MS Dousti 2011年

2

您可以使用伪随机函数 F例如使用单个随机密钥的AESChaCha对计数器进行加密。分配每个中号=1000 并行处理一个唯一的起始值 {0,1,,M1}, and then compute the jth random block of bits for process i as f(i+jM), i.e. increment the counter in each process by M for every subsequent block of random bits.

This will give you a cryptographic RNG on every process, but it does not necessarily come with a performance cost. AES is fast if you have hardware that supports it, and ChaCha is fast regardless. Of course, you'll want to measure this in your specific setting to be sure.

Both desired properties 1 and 2 are directly satisfied by this. It's moreover convenient that the behavior of the entire system of parallel tasks is controlled by a single "seed" (the key for f).


If I do not care about cryptographic strength, how does ChaCha(counter) compare with, e.g., Mersenne Twister? Is it faster or slower? Does it have have at least as good statistical properties? I tried to google, but failed to find any articles that compare these two in a non-cryptographic context.
Jukka Suomela

2

There is now a jump function for SFMT (a fast Mersenne Twister implementation).

This allows me to initialise 1000 MTs so that there is no cycle overlap. And SFMT should be faster than MTGP. Almost perfect for my purposes.


1

You can just use 1000 instances of the Mersenne Twister initialized with different seeds.

You can sample the seeds from another Mersenne Twister, or, to be surer of their independence, from the OS cryptographic pseudorandom number generator (/dev/urandom in Linux).

The Mersenne Twister always operates on the same cyclic sequence, the seed controls where you start generating it. With indepenently sampled seeds, each generator will start at different, typically very far points, with a very small probability of intersection.


So MT has some nice special properties that guarantee that seeding MT with another MT makes sense?
Jukka Suomela

does MT have any provable pseudorandomness properties?
Sasho Nikolov

@Jukka: not any I'm aware of. That's why I suggested to use another type of PRNG for seeding if you are particularly afraid of some strange unknown kind of correlations.
Antonio Valerio Miceli-Barone

@Sasho: the Wikipedia page mentions k-distribution and the large period.
Antonio Valerio Miceli-Barone

1
these indirect measures perplex me; is it ever the case that all you want from a PRNG is a large period and k-distribution? i doubt that; those are just heuristic sanity checks; contrast with k-wise independence which actually is a pseudorandom property that guarantees accuracy in many settings. also even if you combine two PRNG's, you at least should still show that at least the heuristic "randomness" properties hold
Sasho Nikolov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.