Matrix 为什么cuSparse在稀疏矩阵乘法方面比cuBlas慢得多
最近,当我在CUDA TOOLKIT 6.5中使用CUSPARE和cuBLAS进行稀疏矩阵乘法时,我发现CUSPARE在所有情况下都比cuBLAS慢得多 在我所有的实验中,我在cuSparse中使用了Matrix 为什么cuSparse在稀疏矩阵乘法方面比cuBlas慢得多,matrix,cuda,multiplication,sparse-matrix,cublas,Matrix,Cuda,Multiplication,Sparse Matrix,Cublas,最近,当我在CUDA TOOLKIT 6.5中使用CUSPARE和cuBLAS进行稀疏矩阵乘法时,我发现CUSPARE在所有情况下都比cuBLAS慢得多 在我所有的实验中,我在cuSparse中使用了cusparseScsrmm,在cuBLAS中使用了cublasSgemm。在稀疏矩阵中,总元素的一半为零。我使用的GPU是NVIDIA Titan Black。此外,所有消耗的时间都是通过NVIDIA提供的nvvp工具获得的。以下是一些结果: 实验A: 稀疏矩阵大小:192x2400 密集矩阵大小
cusparseScsrmm
,在cuBLAS中使用了cublasSgemm
。在稀疏矩阵中,总元素的一半为零。我使用的GPU是NVIDIA Titan Black。此外,所有消耗的时间都是通过NVIDIA提供的nvvp
工具获得的。以下是一些结果:
实验A:
所以,看到上面列出的结果很奇怪。因为cuSPARSE是专门为处理稀疏矩阵操作而设计的,它怎么可能比cuBLAS还要慢呢!?如果是这样,那么就根本不需要使用cuSPARSE。你能给我解释一下结果吗?另外,你能建议其他加速稀疏矩阵乘法的方法吗 我不认为你可以将一个有半个零的矩阵归类为“稀疏”:你发现的时间是合理的(实际上稀疏算法运行得很好!) 稀疏算法仅在考虑大多数元素为零的矩阵时有效(例如,有限元问题中的矩阵) 这适用于CPU,而不仅仅是GPU:将矩阵视为稀疏矩阵有一个重要的开销,并且只有当。。。大多数元素都是零(典型情况:每行十个或更少的非零,矩阵的秩为数千-十万-(百万?) 还有其他一些矩阵形状具有有效的求解算法,如果它适用于您的问题,您可以尝试,例如带状矩阵。不过,我不知道它们是否已被移植到库布拉斯 关于日常开支 密集线性代数算法可以实现最佳性能,因为处理器的设计是为了最有效地求解此类系统。考虑DGEMM操作(矩阵矩阵乘法):这是一个操作,让您使用处理器的理论峰值浮点性能的>95%,对于大矩阵(即,矩阵不适合系统的任何高速缓存)。怎么做
- 预取
- 最佳缓存使用率
- 矢量化(SSE、AVX)
- 流水线
- 凝聚
- 共享内存
- 内存访问模式
谢谢你的回答!顺便说一句,你能给我一个简短的描述“开销”时,处理矩阵是稀疏的,因为你上面提到的?如果你能给我一些相关的参考资料,我将不胜感激!谢谢!我在答案中添加了一些信息来回答您的进一步问题。非常详细的答案!非常感谢你的帮助!我还有两个问题。第一个是为了确认,对于我的问题,MKL的稀疏矩阵乘法函数在CPU情况下会比它的密集矩阵乘法函数慢,对吗?另一个问题是:虽然严格地说我的问题不是大规模的、真正稀疏的,但是否仍然存在BLAS库或任何加速矩阵乘法的方法?顺便说一下,在我的问题中,稀疏矩阵没有特殊的结构,非零项只是随机分布在矩阵中。又来了!是的,我想你也会观察到mkl的减速。关于另一个问题,我不知道,这取决于这个问题:有很多关于改进稀疏矩阵解的有用方法的文献:你最好在一个更加数学化的论坛上提问。谢谢你的回答!实际上,现在我想找到一些BLAS库或方法,它们能够利用我自己问题中的稀疏性,从而使矩阵乘法比使用BLAS库的密集函数更快。到目前为止,我的最佳选择似乎仍然是使用BLAS库中的密集函数,对吗?