当前使用openMP时允许种子设置的最佳解决方案是什么?
简单示例:
#include "RcppArmadillo.h"
using namespace Rcpp;
using namespace arma;
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
vec rngtest(int N, double seed, int cores){
arma_rng::set_seed(seed);
omp_set_num_threads(cores);
vec out(N);
#pragma omp parallel for schedule(static)
for(int k=0; k<N; k++){
out(k)=randn(1)[0];
}
return(out);
}
问题
首先,当从呼叫时,不能在Armadillo中播种(再也不能了?(
rngtest(10,2,4)
Warning message:
In rngtest(10, 2, 4) :
When called from R, the RNG seed has to be set at the R level via set.seed()
现在,如果我使用set.seed并使用4个核心,我确实会得到偏差:
set.seed(123)
rngtest(10,2,4)
[,1]
[1,] 1.0034247
[2,] -0.5099541
[3,] 1.5406472
[4,] -1.2821739
set.seed(123)
rngtest(10,2,4)
[,1]
[1,] 1.0034247
[2,] -0.5099541
[3,] 1.5406472
[4,] -0.5437432
有些想法我认为一次就可以计算出分配计算的顺序,并尝试按正确的顺序排列结果。我该如何做到这一点?它是否会产生计算开销?不应该。我认为这是一个通用的armadillo/openMP问题,无论是否通过Rcpp致电。
我也希望能够为armadillo设置独立于R的RNG,即使在从R调用代码时也是如此。当为不同的环境开发包时,这将是非常好的。
这里有几个主题。
-
为了方便R用户,我们默认为R中的RNG,但您可以通过
#define
设置切换来关闭 -
使用OpenMP,您也可以简单地忽略R RNG,使用自己的RNG并依赖其中一个并行RNG,如sitmo或dqrng。