foreach、doParallel 和随机生成
foreach, doParallel and random generation
考虑使用并行 foreach
生成随机值的非常基本(且效率低下)的代码:
cl <- makeCluster(2)
registerDoParallel(cl)
foreach(i = 1:100) %dopar% rnorm(1)
它是否正确,或者是否需要任何额外的步骤才能使随机生成正常工作?我想这已经足够了,而且快速检查似乎 "prove" 种子可以正常工作,但我想确保它在其他平台上也是如此,因为我希望代码是可移植的。
你的担心是对的;随机数生成并不能神奇地并行工作,需要采取进一步的步骤。使用 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)
然而,这样做的缺点是开发人员在函数内部以干净的方式使用 registerDoPNG()
更加复杂。正因为如此,我推荐使用%dorng%
来指定应该使用并行RNG。
考虑使用并行 foreach
生成随机值的非常基本(且效率低下)的代码:
cl <- makeCluster(2)
registerDoParallel(cl)
foreach(i = 1:100) %dopar% rnorm(1)
它是否正确,或者是否需要任何额外的步骤才能使随机生成正常工作?我想这已经足够了,而且快速检查似乎 "prove" 种子可以正常工作,但我想确保它在其他平台上也是如此,因为我希望代码是可移植的。
你的担心是对的;随机数生成并不能神奇地并行工作,需要采取进一步的步骤。使用 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)
然而,这样做的缺点是开发人员在函数内部以干净的方式使用 registerDoPNG()
更加复杂。正因为如此,我推荐使用%dorng%
来指定应该使用并行RNG。