Java cuSparse中的有效矩阵向量乘法
我使用jCUSPARSE(cuSparse库包装器)进行矩阵向量乘法,但函数有问题Java cuSparse中的有效矩阵向量乘法,java,cuda,sparse-matrix,matrix-multiplication,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, cusparseM
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倍
我已经在一个对称矩阵10000x1000上测试了它,GENERAL works的速度比symmetric快10倍 我与CUDA图书馆团队进行了核实,他们提供了以下内容 说明:
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
。此操作使用原子,因为矩阵
需要将行解释为列,并将其解释为多个线程
通过遍历它们,不同的线程可能会向同一内存添加值
结果向量中的位置y
。这就是为什么
带矩阵转置和对称变换的矩阵向量乘法
矩阵比非对称矩阵慢CUSPARSE
例程
简言之:这是共享内存的瓶颈。这并不奇怪,但很有趣 看来OP把这个问题带到了一个旁道上,并且: 我与CUDA图书馆团队进行了核实,他们提供了以下内容 说明:
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
。此操作使用原子,因为矩阵
需要将行解释为列,并将其解释为多个线程
通过遍历它们,不同的线程可能会向同一内存添加值
结果向量中的位置y
。这就是为什么
带矩阵转置和对称变换的矩阵向量乘法
矩阵比非对称矩阵慢CUSPARSE
例程
简言之:这是共享内存的瓶颈。这并不奇怪,但很有趣 矩阵都是对称的和正方形的?我和复数对应物(CUSPARSE\u MATRIX\u TYPE\u HERMITIAN)有相同的问题。矩阵都是对称的和正方形的?我和复数对应物(CUSPARSE\u MATRIX\u TYPE\u HERMITIAN)有相同的问题。遗憾。在我的问题中,我真的负担不起转换为非对称,因为内存是一个主要的限制。我想我不得不接受较慢的计算!还是会有另一种不需要花费太多内存的可能性?@leftaroundabout直观地说,只为正在使用的部件优化矩阵是理想的。不幸的是,我不知道如何在一些低级扩展中使用当前缺少滑动流的API来实现这一点,这有点让我不知所措。我需要把这个留给比我更聪明、更熟悉CUDA内部结构的人,对不起!可怜。在我的问题中,我真的负担不起转换为非对称,因为内存是一个主要的限制。我想我不得不接受较慢的计算!还是会有另一种不需要花费太多内存的可能性?@leftaroundabout直观地说,只为正在使用的部件优化矩阵是理想的。不幸的是,我不知道如何在一些低级扩展中使用当前缺少滑动流的API来实现这一点,这有点让我不知所措。我需要把这个留给比我更聪明、更熟悉CUDA内部结构的人,对不起!