C++ OpenMP并行填充犰狳稀疏矩阵
我需要将一个非常大的块双对角矩阵表示为犰狳中的稀疏矩阵。我将所有块的所有值分为两个C++ OpenMP并行填充犰狳稀疏矩阵,c++,performance,openmp,rcpp,armadillo,C++,Performance,Openmp,Rcpp,Armadillo,我需要将一个非常大的块双对角矩阵表示为犰狳中的稀疏矩阵。我将所有块的所有值分为两个arma::字段,以初始化sp_mat(提供非零位置并用1填充,然后并行更改它们)。这也失败了 看看犰狳的构造。我们使用的是具有内存重用的,这通常是正确的计划(“无拷贝”),但在这里可能会伤害您。尝试使用不同于R的内存,然后在末尾返回(可能是显式复制)。现在我只使用R作为高级接口,所以Armadillo中的所有事情都会发生。我现在正在尝试使用sp_mat构造函数的“form 2”,看看它是否能很好地与ompOne方
arma::字段,以初始化sp_mat
(提供非零位置并用1填充,然后并行更改它们)。这也失败了 看看犰狳的构造。我们使用的是具有内存重用的,这通常是正确的计划(“无拷贝”),但在这里可能会伤害您。尝试使用不同于R的内存,然后在末尾返回(可能是显式复制)。现在我只使用R作为高级接口,所以Armadillo中的所有事情都会发生。我现在正在尝试使用sp_mat
构造函数的“form 2”,看看它是否能很好地与ompOne方法配合使用。我也喜欢在独立的main()
中尝试R之外的代码。如果可行的话,将其粘贴到R上,用于数据i/o和所有其他细节。哪个代码?作为更新,构造函数#2也会失败
#include <RcppArmadillo.h>
#include <omp.h>
arma::sp_mat test_ll(int blocks=10, int rowcol_per_block=250){
arma::mat mat1 = arma::randn() * arma::ones(rowcol_per_block, rowcol_per_block);
arma::sp_mat tester(blocks * rowcol_per_block,
blocks * rowcol_per_block);
#pragma omp parallel for
for(int i=0; i<blocks; i++){
tester.submat( i*rowcol_per_block, i*rowcol_per_block,
(i+1)*rowcol_per_block-1, (i+1)*rowcol_per_block-1) = mat1;
}
return tester;
}