在下面的示例中,我尝试在RcppArmadillo
中使用omp
#include <RcppArmadillo.h>
#include<omp.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::plugins(openmp)]]
using namespace arma;
// [[Rcpp::export]]
mat mod_cube(unsigned nrun, unsigned d, unsigned nthr=1 ) {
mat x(d,nrun );
x.print();
#pragma omp parallel for shared(x) num_threads(nthr)
for(unsigned run=0;run<x.n_cols;++run){
Rcpp::Rcout<<"thread_id ="<<omp_get_thread_num()<<endl;
(x.col(run )).fill((double) (run+1) );
}
return x;
}
也就是说,我用一个值并行地填充每一列。代码在nthr=1
上运行正常,但如果设置nthr=5
或更高,则会产生以下错误。
Error: C stack usage 589726373052 is too close to the limit
>
*** caught segfault ***
address 0x500004400, cause 'memory not mapped'
我无法找到原因,因为列修改显然是独立的任务。
我知道这个特殊的代码可以用各种其他的方式来编写。我需要使用omp
来处理一个复杂得多的脚本。我试图通过这个简单的例子来找出我是否遗漏了一些明显的东西。
1条答案
按热度按时间j9per5c41#
正如我的评论中所暗示的,并行循环中的
Rcpp::Rcout
会让您陷入困境。当我使用std::cout
时(但输出当然是乱码),或者当我简单地删除它时,它对我都有效。我包含了你的代码的一个小更新版本。我们不再需要C++11插件,因为(当前)R默认为新版本。
代码
输出