我使用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倍
答案 0 :(得分:1)
OP似乎将这个问题放在了一个侧面频道和got an official answer from njuffa:
我与CUDA图书馆团队核实过,他们提供了以下内容 说明:
对于非对称稀疏矩阵向量乘法,执行操作
y = A*x
(显式存储A
)。- 醇>
对于对称矩阵,仅存储矩阵A的下(或上)三角形部分。我们可以写
y = A*x = (L+D)*x + L^{T}*x
,A = (L+D) + L^{T}
L
与L+D
严格低于三角形的部分 矩阵,D是对角线。由于只存储(L^{T})
,我们需要 使用矩阵转置y
进行计算 结果向量y
。此操作使用原子,因为矩阵 行需要被解释为列,并且作为多个线程 遍历它们,不同的线程可能会将值添加到同一个内存中 结果向量CUSPARSE
中的位置。这就是为什么 矩阵向量乘法与矩阵转置和对称 矩阵比非对称矩阵慢。加速计算的最佳方法(除非你受到限制 记忆)将对称变换为非对称 矩阵并在其上调用适当的{{1}}例程
简而言之:它是共享内存的瓶颈。不足为奇,但有趣。 :)