我使用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上测试了它,一般的工作速度是对称矩阵的4倍
我在一个对称矩阵10000x10000上测试了它,一般的工作速度是对称矩阵的10倍
发布于 2012-04-08 00:32:59
似乎OP把这个问题带下了一个侧通道,然后got an official answer from
我向CUDA图书馆团队进行了检查,他们提供了以下解释:
对于非对称稀疏矩阵-向量乘法,进行了explicitly).
A存储为y = A*x,对称矩阵仅存储在矩阵A的下(或上)三角形部分)。我们可以编写y = A*x = (L+D)*x + L^{T}*x,其中A = (L+D) + L^{T}的L是矩阵的严格下三角部分,D是对角线。因为只有L+D被存储,所以我们需要使用矩阵转置(L^{T})来计算得到的向量y。此操作使用atomics,因为矩阵行需要被解释为列,而且当多个线程正在遍历它们时,不同的线程可能会在生成的向量y中向相同的内存位置添加值。这就是矩阵转置和对称矩阵的矩阵向量乘法比非对称矩阵慢的原因。加快计算速度的最佳方法(除非受到内存的限制)是将对称矩阵转换为非对称矩阵,并在其上调用适当的CUSPARSE例程。
简而言之:这是共享内存的瓶颈。不奇怪,但很有趣。:)
https://stackoverflow.com/questions/7977768
复制相似问题