Memory 一种包含转置的稀疏密集乘法加速方法

Memory 一种包含转置的稀疏密集乘法加速方法,memory,matrix,cuda,sparse-matrix,Memory,Matrix,Cuda,Sparse Matrix,我使用cusparse和cublas计算稀疏密集乘法:C=a'*B A是M*N稀疏矩阵 B是M*S密矩阵 M=9633792,N=617004,nnz为28901376,S=3 我尝试了不同的方法来加快速度 A以CSR格式存储,使用CUSPASSCSRMM计算A'*B,需要180毫秒 A'=At以CSR格式存储,使用CUSPASSCSRMM2计算At*(B'),其中转置B以提高矩阵B的内存访问,根据文档,如果op(B)=B^T,则只支持op(A)=A,因此我提前以CSR形式存储At,转置B需要8

我使用cusparse和cublas计算稀疏密集乘法:C=a'*B

A是M*N稀疏矩阵

B是M*S密矩阵

M=9633792,N=617004,nnz为28901376,S=3

我尝试了不同的方法来加快速度

  • A以CSR格式存储,使用CUSPASSCSRMM计算A'*B,需要180毫秒

  • A'=At以CSR格式存储,使用CUSPASSCSRMM2计算At*(B'),其中转置B以提高矩阵B的内存访问,根据文档,如果op(B)=B^T,则只支持op(A)=A,因此我提前以CSR形式存储At,转置B需要8毫秒,计算At*(B')需要4毫秒,总共12毫秒

  • A'=At以CSR格式存储,使用cusparseScsrmm计算A'*B,需要8毫秒

  • A在迭代中是常数,所以不能考虑在A上运行的时间,但应该考虑在B上运行的时间。更具体地说,A是一个二进制矩阵,它的每行有3个非零值

    所以我在想有什么方法可以加快速度吗?4ms是可以接受的。例如,改善矩阵B的内存访问,但不浪费时间。我也考虑过使用常量内存来存储A,但cuda似乎只有64K的常量内存,或者使用纹理内存来存储B,尽管它是只读内存,但可能并不合适

    /****补充***/


    我使用的GPU是GTX TITAN X,我使用
    Cubrasgeam
    转置矩阵B

    我不知道您使用的是哪种设备。但与高端GPU上B的单个D2D拷贝相比,矩阵转置速度非常慢

    M*S*sizeof(float)/8e-3/1e9=14GB/s
    
    如果使用
    cublas_geam()
    来转置矩阵B,可能意味着矩阵太薄,并且例程没有针对这种情况进行很好的优化。您可以实现自己的转置内核,并针对3列矩阵对其进行优化。一般矩阵转置仅适用于倍数为32或远大于32的维度。但它的代码是实现您自己的代码的良好开端


    如何转换B?geam()?它似乎比可能的峰值慢得多。是的,我将根据你的建议尝试编写一个内核@Kangshiyin我的GPU是GTX TITAN X,我使用
    cublas_geam()
    来转置矩阵B,感谢你的建议,我将尝试一下你的建议,我编写了一个简单的转置内核函数,大约需要1.9ms。我还有一个问题,cuda在发布和调试模式下同时运行是否正常,我运行cuda程序500次,但在不同模式下时间相同。我通过'cmake-DCMAKE\u build\u TYPE=Release'或'cmake-DCMAKE\u build\u TYPE=Debug'设置构建模式。@zjhthu-yes通常是相同的。