Memory 一种包含转置的稀疏密集乘法加速方法
我使用cusparse和cublas计算稀疏密集乘法:C=a'*B A是M*N稀疏矩阵 B是M*S密矩阵 M=9633792,N=617004,nnz为28901376,S=3 我尝试了不同的方法来加快速度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
我使用的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通常是相同的。