Java 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

我使用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倍


我已经在一个对称矩阵10000x1000上测试了它,GENERAL works的速度比symmetric快10倍

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

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

  • 对于对称矩阵,只存储矩阵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
    显式存储)

  • 对于对称矩阵,只存储矩阵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内部结构的人,对不起!