我有一个澄清问题。据我了解,sourceCpp 会自动传递 RNG 状态,因此 set.seed(123) 在调用 Rcpp 代码时会为我提供可重现的随机数。编译包时,我必须添加一个 set RNG 语句。现在,这一切如何在 sourceCpp 或包中与 openMP 一起工作?
考虑以下 Rcpp 代码
#include <Rcpp.h>
#include <omp.h>
// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::export]]
Rcpp::NumericVector rnormrcpp1(int n, double mu, double sigma ){
Rcpp::NumericVector out(n);
for (int i=0; i < n; i++) {
out(i) =R::rnorm(mu,sigma);
}
return(out);
}
// [[Rcpp::export]]
Rcpp::NumericVector rnormrcpp2(int n, double mu, double sigma, int cores=1 ){
omp_set_num_threads(cores);
Rcpp::NumericVector out(n);
#pragma omp parallel for schedule(dynamic)
for (int i=0; i < n; i++) {
out(i) =R::rnorm(mu,sigma);
}
return(out);
}
然后运行
set.seed(123)
a1=rnormrcpp1(100,2,3,2)
set.seed(123)
a2=rnormrcpp1(100,2,3,2)
set.seed(123)
a3=rnormrcpp2(100,2,3,2)
set.seed(123)
a4=rnormrcpp2(100,2,3,2)
all.equal(a1,a2)
all.equal(a3,a4)
虽然 a1 和 a2 相同,但 a3 和 a4 不同。如何使用 openMP 循环调整 RNG 状态?我可以吗?