r - foreach、doParallel 和随机生成

标签 r parallel-processing parallel-foreach doparallel

考虑使用并行 foreach 生成随机值的非常基本(且效率低下)的代码:

cl <- makeCluster(2)
registerDoParallel(cl)
foreach(i = 1:100) %dopar% rnorm(1)

它是正确的还是需要任何额外的步骤才能使随机生成正常工作?我想这已经足够了,快速检查似乎“证明”种子可以正常工作,但我想确保它在其他平台上也是如此,因为我希望代码是可移植的。

最佳答案

你的担心是对的;随机数生成不会神奇地并行工作,需要采取进一步的步骤。使用foreach框架时,可以使用doRNG扩展以确保在并行完成时也能获得合理的随机数。

例子:

library("doParallel")
cl <- makeCluster(2)
registerDoParallel(cl)

## Declare that parallel RNG should be used for in a parallel foreach() call.
## %dorng% will still result in parallel processing; it uses %dopar% internally.
library("doRNG")

y <- foreach(i = 1:100) %dorng% rnorm(1)

编辑 2020-08-04:以前这个答案提出了替代方案:

library("doRNG")
registerDoRNG()
y <- foreach(i = 1:100) %dopar% rnorm(1)

然而,这样做的缺点是开发人员在函数内部以干净的方式使用 registerDoRNG() 更加复杂。因此,我建议使用 %dorng% 来指定应该使用并行 RNG。

关于r - foreach、doParallel 和随机生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43299428/

相关文章:

matlab - 神经网络训练matlab parfor问题

python - python中的并行/多线程差异进化

r - isplitVector 和 foreach 索引问题

python - 向量化前瞻性函数 pandas 数据框

regex - R正则表达式将字符串列拆分为多列

c++ - 使用 OpenMP 对集成进行并行计算

r - "un-register"一个 doParallel 集群

r - doParallel(包)foreach 不适用于 R 中的大迭代

r - 词云包: get “Error in strwidth(…) : invalid ' cex' value”

可在 R markdown `asis` block 中 react ,不显示循环