随机数和多核包

机器算法验证 r 随机生成 并行计算 多核
2022-02-04 12:48:49

在 R 中编程时,我曾多次使用多核包。但是,我从未见过关于它如何处理随机数的声明。当我将 openMP 与 C 一起使用时,我会小心地使用适当的并行 RNG,但对于 R,我假设会发生一些明智的事情。任何人都可以确认确实发生了一些明智的事情吗?

例子

从文档中,我们有

x <- foreach(icount(1000), .combine = "+") %do% rnorm(4)

rnorm`s是如何产生的?

2个回答

我不确定它是如何foreach工作的(我猜来自 doMC 包),但在多核中,如果你做了类似mclapply参数mc.set.seed默认值的操作,TRUE它会为每个进程提供不同的种子(例如mclapply(1:1000, rnorm))。我假设您的代码被翻译成类似的东西,即归结为parallel具有相同约定的调用。

但也请参阅Charlie Geyer幻灯片的第 16 页,其中推荐rlecuyer包用于具有理论保证的并行独立流。Geyer 的页面还有 R 中用于不同设置的示例代码。

您可能想查看本文档和本文档的第 5 页。默认情况下,在 R 下,每个核心集都是自己的种子(我似乎记得使用高精度时间)。

注意:如果您在 windows 下使用来自 Revolution-computing 的 foreach(),那么我怀疑不会发生一些明智的事情。Windows 不符合 POSIX,当每个核心需要不同的高精度时,这应该会带来问题。开始设置它的种子的时间(不幸的是,我手边没有窗户,所以我无法凭经验检查)。