与OpenMP并行填充Armadillo稀疏矩阵

时间:2019-09-03 18:10:06

标签: c++ performance openmp rcpp armadillo

我需要在Armadillo中将一个非常大的块对角矩阵表示为稀疏矩阵。我将所有块的所有值放入两个arma::field<arma::mat>列表中,因此我只需要将它们转换为arma::sp_mat对象。

我可以做到:

  • 顺序(较慢)
  • 使用arma::mat并行执行,然后将密集矩阵转换为稀疏矩阵(更快)

我想直接并行填充arma::sp_mat,这应该是最快的路线。我尝试使用与下面的代码段相似的代码(使用Rcpp),但是它崩溃了,我猜这是由于Armadillo中稀疏矩阵的增长方式所致。有办法使它起作用吗?

#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;
}

我尝试预填充适当大小的sp_mat的所有块,然后并行进行更改,但这也会崩溃。

更新 使用#2 constructor初始化sp_mat并没有区别(提供非零位置并用1填充它们,然后并行更改它们)。那也失败了。

0 个答案:

没有答案