cuSparse中的有效矩阵 - 向量乘法

时间:2011-11-02 08:59:46

标签: java cuda sparse-matrix matrix-multiplication

我使用jCUSPARSE(cuSparse库包装器)进行矩阵向量乘法,我的函数有问题

cusparseDcsrmv(handle, cusparseOperation.CUSPARSE_OPERATION_NON_TRANSPOSE, matrixSize, matrixSize, alpha, descra, d_csrValA, d_rowPtrA, d_colIndA, x, beta, y);

如果我用于描述符初始化

cusparseSetMatType(descra, cusparseMatrixType.CUSPARSE_MATRIX_TYPE_GENERAL); 

它比我使用

快5到10倍
cusparseSetMatType(descra, cusparseMatrixType.CUSPARSE_MATRIX_TYPE_SYMMETRIC);

我在一个小对称矩阵5x5上进行了测试,GENERAL的工作速度比对称快了4倍

我在对称矩阵10000x10000上测试了它,GENERAL的工作速度比对称矩阵快10倍

1 个答案:

答案 0 :(得分:1)

OP似乎将这个问题放在了一个侧面频道和got an official answer from njuffa

  

我与CUDA图书馆团队核实过,他们提供了以下内容   说明:

     
      
  1. 对于非对称稀疏矩阵向量乘法,执行操作y = A*x(显式存储A)。

  2.   
  3. 对于对称矩阵,仅存储矩阵A的下(或上)三角形部分。我们可以写y = A*x = (L+D)*x + L^{T}*x,   A = (L+D) + L^{T} LL+D严格低于三角形的部分   矩阵,D是对角线。由于只存储(L^{T}),我们需要   使用矩阵转置y进行计算   结果向量y。此操作使用原子,因为矩阵   行需要被解释为列,并且作为多个线程   遍历它们,不同的线程可能会将值添加到同一个内存中   结果向量CUSPARSE中的位置。这就是为什么   矩阵向量乘法与矩阵转置和对称   矩阵比非对称矩阵慢。

  4.         

    加速计算的最佳方法(除非你受到限制   记忆)将对称变换为非对称   矩阵并在其上调用适当的{{1}}例程

简而言之:它是共享内存的瓶颈。不足为奇,但有趣。 :)