用于犰狳稀疏密集乘法的 CSCMM

     2023-02-16     14

关键词:

【中文标题】用于犰狳稀疏密集乘法的 CSCMM【英文标题】:CSCMM for Armadillo Sparse dense multiplications 【发布时间】:2014-09-16 02:21:50 【问题描述】:

环境:犰狳 4.320.0 和 4.400 编译器:英特尔 CPP 编译器 操作系统:Ubuntu 12.04

我正在尝试用英特尔 MKL 的 CSCMM 调用替换犰狳的原生稀疏密集乘法。我写了以下代码。

#include <mkl.h>  
#define ARMA_64BIT_WORD
#include <armadillo>

using namespace std;
using namespace arma;

int  main(int argc, char *argv[])

   long long m = atoi(argv[1]);
   long long k = atoi(argv[2]);
   long long n = atoi(argv[3]);
   float density = 0.3;
   sp_fmat A = sprandn<sp_fmat>(m,k,density);
   fmat B = randu<fmat>(k,n);
   fmat C(m,n);
   C.zeros();
 //C = alpha * A * B + beta * C;
 //mkl_scscmm (char *transa, MKL_INT *m, MKL_INT *n, MKL_INT *k, float *alpha, char *matdescra,       
 //float *val, MKL_INT *indx, MKL_INT *pntrb, MKL_INT *pntre, float *b, MKL_INT *ldb, float *beta, 
//float *c, MKL_INT *ldc);
  char transa = 'N';
  float alpha = 1.0;
  float beta = 0.0;
  char* matdescra = "GUUC";
  long long ldb = k;
  long long ldc = m;
  cout << "b4 Input A:" << endl << A;
  cout << "b4 Input B:" << endl << B;
  mkl_scscmm (&transa,&m,&n,&k,&alpha,matdescra,
              const_cast<float *>(A.values), (long long *)A.row_indices,
             (long long *)A.col_ptrs,(long long *)(A.col_ptrs + 1),
             B.memptr(),&ldb,
             &beta, C, &ldc);
  cout << "Input A:" << endl << A;
  cout << "Input B:" << endl << B;
  cout << "Input C:" << endl << C;
  return 0;

我编译了上面的代码并将其运行为“./testcscmm 10 4 6”。我遇到分段错误(核心转储)。

[矩阵大小:10x4; n_nonzero:12;密度:30.00%]

 (0, 0)         1.1123
 (4, 0)        -0.3453
 (8, 0)         0.6081
 (1, 1)         0.6410
 (4, 1)        -0.7121
 (5, 1)         1.1592
 (9, 1)        -1.7189
 (0, 2)         0.4175
 (2, 2)        -0.4001
 (4, 2)         2.2809
 (4, 3)        -2.2717
 (9, 3)         0.2251

b4 Input B:
0.1567   0.9989   0.6126   0.4936   0.5267   0.2833
0.4009   0.2183   0.2960   0.9728   0.7699   0.3525
0.1298   0.5129   0.6376   0.2925   0.4002   0.8077
0.1088   0.8391   0.5243   0.7714   0.8915   0.9190
Input A:
[matrix size: 13715672716573367337x13744746204899078486; n_nonzero: 12; density: 0.00%]

Segmentation fault (core dumped)

由于某种原因,A 的结构被破坏了。我有以下问题。

    MKL_CSCMM 是否修改输入数组?如果不是,为什么 A 会损坏? 我将矩阵 C 更改为原生浮点数。错误仍然存​​在。 Valgrind 显示一些内存错误。

让我知道如何使用 Armadillo 的矩阵数据结构进行英特尔 MKL 调用。特别是稀疏密集乘法。

【问题讨论】:

【参考方案1】:

Libarmadillo 库也必须与 mkl_ilp64 而不是 mkl_lp64 链接。请按照以下说明进行操作。

建造和安装犰狳:

导出 CXX=icpc 导出 CC=icpc 导出 PATH=$PATH:/home/ramki/intel/bin: 编辑 $armadillo_root/cmake_aux/Modules/ARMA_FindMKL.cmake,正确包含路径。 编辑 $armadillo_root/cmake_aux/Modules/ARMA_FindMKL.cmake,将 mkl_lp64 更改为 mkl_ilp64 编辑 $armadillo_root/CMakeLists.txt 并 (1) 更改 CMAKE_SHARED_LINKER_FLAGS 以包含英特尔链接顾问的链接行和 (2) 更改英特尔链接顾问给出的 CMAKE_CXX_FLAGS 运行 ./configure 并确保 MKL 库用于 blas 和 lapack,icpc 作为编译器,其余的都可以。 运行 make 。 通过运行 ldd libarmadillo.so 来验证链接库。主要验证是否与mkl_ilp64库和mkl blas和lapack库链接。 现在运行 make install DESTDIR=local path。

在 C++ 程序中

不要使用 const_cast 函数将 A.values 的 const ptr 大小写为 ptr A.values。它扭曲了指针,并且不确定我们是否将正确的指针传递给 cscmm。而是将 A 的值单独复制到一个单独的数组中。 确保您设置了正确的 ldb 和 ldc。 pntrb 和 pntre 可以是 A.col_ptrs 和 A.col_ptrs+1。 使用 MKL_INT 代替 long long。

希望这对每个人都有帮助。

【讨论】:

将犰狳中的矩阵从稀疏转换为密集(spmat 到 mat)

】将犰狳中的矩阵从稀疏转换为密集(spmat到mat)【英文标题】:ConvertMatriciesinArmadillofromSparsetoDense(spmattomat)【发布时间】:2014-11-1100:07:54【问题描述】:我正在使用ArmadilloC++线性代数库,并试图弄清楚如何将sp_mat稀疏矩阵对象... 查看详情

稀疏矩阵与密集矩阵乘法 C++ Tensorflow

】稀疏矩阵与密集矩阵乘法C++Tensorflow【英文标题】:SparseMatrixVsDenseMatrixMultiplicationC++Tensorflow【发布时间】:2020-07-2805:32:16【问题描述】:我想用C++Tensorflow写稀疏矩阵密集向量(SPMv)乘法:y=Ax稀疏矩阵A以CSR格式存储。A的通常... 查看详情

Numpy/Scipy 稀疏与密集乘法

】Numpy/Scipy稀疏与密集乘法【英文标题】:Numpy/ScipySparsevsdensemultiplication【发布时间】:2013-05-2605:53:12【问题描述】:scipy稀疏矩阵类型和普通numpy矩阵类型之间似乎存在一些差异importscipy.sparseasspA=sp.dia_matrix(tri(3,4))vec=array([1,2,3,4])... 查看详情

为什么稀疏密集乘法比密集稀疏乘法更快?(代码片段)

我很好奇为什么用密集矩阵乘以稀疏矩阵需要不同于反向矩阵的时间。算法有明显的不同吗?这是matlab2018a中的一个例子:a=sprand(M,M,0.01);b=rand(M);tic;ref1=a*b;t_axb=toctic;ref2=b*a;t_bxa=toc以下是使用1个线程的Eigen3和C++的示例://prepareacol=... 查看详情

如何在犰狳中更新稀疏矩阵的值

...有一个固定的umatlocations存储索引矩阵和一个变量vecvalues用于每个位置。在迭代开始之前,我创建了一个稀疏矩阵,其中犰狳为sp_matA(locat 查看详情

为啥 cusparse 没有 cusparse<t>cscmm?

...:cusparse手册只提供了一个函数cusparsecsrmm,它将CSR格式的稀疏矩阵乘以密集矩阵,但是为什么它没有为CSC 查看详情

稀疏 x 密集矩阵乘以 Armadillo 出乎意料地慢

...:37【问题描述】:这是我刚刚遇到的。出于某种原因,在犰狳中将密集矩阵与稀疏矩阵相乘比将稀疏矩阵和密集矩阵相乘(即颠倒顺序)要慢得多。//[[Rcpp::depends(RcppArmadillo)]]#include&l 查看详情

使用 GMRES 求解带有犰狳的复杂稀疏矩阵

】使用GMRES求解带有犰狳的复杂稀疏矩阵【英文标题】:UsingGMREStosolveacomplexsparsematrixwitharmadillo【发布时间】:2018-08-0917:59:37【问题描述】:我正在将一个MATLAB程序移植到C++。Matlab能够解决我的C++库犰狳无法解决的线性系统(复... 查看详情

犰狳中的稀疏 svd (C++)

】犰狳中的稀疏svd(C++)【英文标题】:SparsesvdinArmadillo(C++)【发布时间】:2015-01-1411:43:51【问题描述】:根据http://arma.sourceforge.net/docs.html#part_c,犰狳支持以下功能:eig_symeig_geneigs_symeigs_gensvdsvd_econ但似乎没有像“svds_econ”这样的... 查看详情

犰狳稀疏lu(或cholesky)分解

】犰狳稀疏lu(或cholesky)分解【英文标题】:armadillosparselu(orcholesky)decomposition【发布时间】:2018-10-2011:11:58【问题描述】:我需要求解一个线性方程(Ax=b),它具有大的稀疏A和不同的b多次。因此,LU(或Cholesky,如果A是对称的)... 查看详情

犰狳中的高效稀疏矩阵加法

】犰狳中的高效稀疏矩阵加法【英文标题】:EfficientsparsematrixadditioninArmadillo【发布时间】:2017-12-0200:36:06【问题描述】:我正在尝试构建形式为L的稀疏矩阵L和Hi分别是一个非常稀疏的矩阵和行向量。最终的L矩阵的密度应该在1%... 查看详情

使用 LAPACK 和 SuperLU 的犰狳线性稀疏系统求解器

】使用LAPACK和SuperLU的犰狳线性稀疏系统求解器【英文标题】:armadillolinearsparsesystemsolverusingLAPACKandSuperLU【发布时间】:2016-10-0411:10:20【问题描述】:我尝试使用犰狳库解决稀疏线性系统。#include<iostream>#include<armadillo>usin... 查看详情

C++犰狳稀疏矩阵类型转换

】C++犰狳稀疏矩阵类型转换【英文标题】:C++armadillosparsematrixtypeconversion【发布时间】:2016-01-2507:25:27【问题描述】:我想用operator+添加两个任意(不同)类型的稀疏犰狳矩阵,例如SpMat<double>M1(2,2);SpMat<cx_double>M2(2,2);//..... 查看详情

在犰狳c ++中返回稀疏矩阵的位置和值

】在犰狳c++中返回稀疏矩阵的位置和值【英文标题】:Returninglocationsandvaluesofasparsematrixinarmadilloc++【发布时间】:2015-03-1106:48:03【问题描述】:如何在ArmadilloC++中获取一组非零位置(索引)和稀疏矩阵的值?到目前为止,我可以... 查看详情

犰狳中是不是有类似稀疏立方体的东西,或者使用稀疏矩阵作为立方体中的切片的某种方式?

】犰狳中是不是有类似稀疏立方体的东西,或者使用稀疏矩阵作为立方体中的切片的某种方式?【英文标题】:Isthereasomethinglikeasparsecubeinarmadilloorsomewayofusingsparsematricesasslicesinacube?犰狳中是否有类似稀疏立方体的东西,或者使用... 查看详情

如何在犰狳中按元素划分2个稀疏矩阵?

】如何在犰狳中按元素划分2个稀疏矩阵?【英文标题】:Howtoelement-wisedivide2sparsematricesinArmadillo?【发布时间】:2021-02-0514:50:55【问题描述】:我是C++新手,但我正在使用R和RcppArmadillo,我的目标是按元素划分2个稀疏矩阵。我在犰... 查看详情

使用 Rcpp 通过引用传递犰狳稀疏矩阵

】使用Rcpp通过引用传递犰狳稀疏矩阵【英文标题】:PassinganArmadillosparsematrixbyreferencewithRcpp【发布时间】:2018-04-0414:49:23【问题描述】:此问题与this和this有关。这里的不同之处在于,我传递的不是NumericVector或NumericMatrix之类的Rcp... 查看详情

犰狳:乘法时出错

】犰狳:乘法时出错【英文标题】:Armadillo:errorwhenmultiplying【发布时间】:2013-04-1215:40:11【问题描述】:我在一个项目中使用犰狳,总的来说它运行良好。该项目是基于Xcode的,到目前为止,我设法让它工作的唯一方法是使用(... 查看详情