나는 명확한 질문이 있습니다. SourceCpp가 자동으로 RNG 상태를 전달하므로 set.seed (123)는 Rcpp 코드를 호출 할 때 재현 가능한 난수를 제공합니다. 패키지를 컴파일 할 때 set RNG 문을 추가해야합니다. 이제이 모든 것이 sourceCpp 또는 패키지 내에서 openMP와 어떻게 작동합니까?openMP와 Rcpp로 RNG 상태를 설정하십시오.
다음 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);
}
을 고려 그리고 A1과 A2는 동일하지만
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)
을 실행, A3와 A4는 없습니다. openMP 루프를 사용하여 RNG 상태를 어떻게 조정할 수 있습니까? 그럴 수있어?
이것은 해결책이 아니지만 답변입니다. 감사. – Inferrator