c++ OpenMP修改共享犰狳矩阵时出现的问题

de90aj5v  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(179)

在下面的示例中,我尝试在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来处理一个复杂得多的脚本。我试图通过这个简单的例子来找出我是否遗漏了一些明显的东西。

j9per5c4

j9per5c41#

正如我的评论中所暗示的,并行循环中的Rcpp::Rcout会让您陷入困境。当我使用std::cout时(但输出当然是乱码),或者当我简单地删除它时,它对我都有效。
我包含了你的代码的一个小更新版本。我们不再需要C++11插件,因为(当前)R默认为新版本。

代码
#include <RcppArmadillo.h>
#include <omp.h>

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(openmp)]]

// [[Rcpp::export]]
arma::mat mod_cube(int nrun, int d, int nthr=1) {
    arma::mat x(d, nrun);
#pragma omp parallel for shared(x) num_threads(nthr)
    for (size_t run = 0; run < nrun; run++) {
        x.col(run).fill((double) run+1);
    }
    return x;
}

/*** R
mod_cube(10, 10, 10)
*/
输出
> Rcpp::sourceCpp("question.cpp")

> mod_cube(10, 10, 10)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    2    3    4    5    6    7    8    9    10
 [2,]    1    2    3    4    5    6    7    8    9    10
 [3,]    1    2    3    4    5    6    7    8    9    10
 [4,]    1    2    3    4    5    6    7    8    9    10
 [5,]    1    2    3    4    5    6    7    8    9    10
 [6,]    1    2    3    4    5    6    7    8    9    10
 [7,]    1    2    3    4    5    6    7    8    9    10
 [8,]    1    2    3    4    5    6    7    8    9    10
 [9,]    1    2    3    4    5    6    7    8    9    10
[10,]    1    2    3    4    5    6    7    8    9    10
>

相关问题