基于 Tbb 的犰狳矩阵行和

问题描述 投票:0回答:1

按照

tbb
here
的基本数据类型的 parallel_reduce 示例,我想尝试实现犰狳矩阵行和的
tbb
版本。 (我意识到使用
arma::sum
来达到此目的,但这是尝试了解
tbb
Armadillo
以及它们如何更好地协同工作。)

以下代码旨在循环矩阵

X
的列,并将列值添加到运行总向量中。它编译得很好,但在运行时崩溃。我想知道我哪里出了问题。
X.col(j)
的用法是否不正确?谢谢!

arma::vec parallelRowsumTBB_withArma(arma::mat X){

   arma::vec y=tbb::parallel_reduce(
      tbb::blocked_range<size_t>(0,X.n_cols),
      arma::vec(X.n_rows).fill(0),
      [&](const tbb::blocked_range<size_t>& r, arma::vec runningTotal) { //note the definition of runningTotal here
         for(int j=r.begin(); j!=r.end(); ++j){
            runningTotal = runningTotal + X.col(j);
         }
         return runningTotal;
      },
      [](arma::vec a, arma::vec b){
         return a + b;
      }
   );
   return y;
}
c++ rcpp armadillo tbb rcpparmadillo
1个回答
0
投票

这是一个“常见问题”:您不能让任何并行代码与主 R 进程进行任何回调或交互,这对于此类回调来说是不安全的。 RcppArmadillo 提供的犰狳数据结构会重用(默认情况下)R 内存,因此您可以通过

gc()
与 R 进程进行交互。

请参阅 RcppParallel 及其文档以获取替代方案:

RMatrix
RVector

© www.soinside.com 2019 - 2024. All rights reserved.