按照
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;
}
这是一个“常见问题”:您不能让任何并行代码与主 R 进程进行任何回调或交互,这对于此类回调来说是不安全的。 RcppArmadillo 提供的犰狳数据结构会重用(默认情况下)R 内存,因此您可以通过
gc()
与 R 进程进行交互。
请参阅 RcppParallel 及其文档以获取替代方案:
RMatrix
和 RVector
。