r语言 - RcppArmadillo, OpenMP and RNG seeds



当前使用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调用代码时也是如此。当为不同的环境开发包时,这将是非常好的。

这里有几个主题。

  1. 为了方便R用户,我们默认为R中的RNG,但您可以通过#define设置切换来关闭

  2. 使用OpenMP,您也可以简单地忽略R RNG,使用自己的RNG并依赖其中一个并行RNG,如sitmo或dqrng。

最新更新