Matrix 为什么cuSparse在稀疏矩阵乘法方面比cuBlas慢得多

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 密集矩阵大小

最近,当我在CUDA TOOLKIT 6.5中使用CUSPARE和cuBLAS进行稀疏矩阵乘法时,我发现CUSPARE在所有情况下都比cuBLAS慢得多

在我所有的实验中,我在cuSparse中使用了
cusparseScsrmm
,在cuBLAS中使用了
cublasSgemm
。在稀疏矩阵中,总元素的一半为零。我使用的GPU是NVIDIA Titan Black。此外,所有消耗的时间都是通过NVIDIA提供的
nvvp
工具获得的。以下是一些结果:

实验A:

  • 稀疏矩阵大小:192x2400
  • 密集矩阵大小:2400x256
  • 解析时间:1.4ms
  • 库布拉斯时间:0.21ms
  • 实验B:

  • 稀疏矩阵大小:192x75
  • 密度矩阵尺寸:75x1024
  • 解析时间:0.27ms
  • 库布拉斯时间:0.04毫秒

  • 所以,看到上面列出的结果很奇怪。因为cuSPARSE是专门为处理稀疏矩阵操作而设计的,它怎么可能比cuBLAS还要慢呢!?如果是这样,那么就根本不需要使用cuSPARSE。你能给我解释一下结果吗?另外,你能建议其他加速稀疏矩阵乘法的方法吗

    我不认为你可以将一个有半个零的矩阵归类为“稀疏”:你发现的时间是合理的(实际上稀疏算法运行得很好!)

    稀疏算法仅在考虑大多数元素为零的矩阵时有效(例如,有限元问题中的矩阵)

    这适用于CPU,而不仅仅是GPU:将矩阵视为稀疏矩阵有一个重要的开销,并且只有当。。。大多数元素都是零(典型情况:每行十个或更少的非零,矩阵的秩为数千-十万-(百万?)

    还有其他一些矩阵形状具有有效的求解算法,如果它适用于您的问题,您可以尝试,例如带状矩阵。不过,我不知道它们是否已被移植到库布拉斯

    关于日常开支 密集线性代数算法可以实现最佳性能,因为处理器的设计是为了最有效地求解此类系统。考虑DGEMM操作(矩阵矩阵乘法):这是一个操作,让您使用处理器的理论峰值浮点性能的>95%,对于大矩阵(即,矩阵不适合系统的任何高速缓存)。怎么做

    • 预取
    • 最佳缓存使用率
    • 矢量化(SSE、AVX)
    • 流水线
    在稀疏LA算法中,只有非零元素及其对应的索引存储在内存中:内存访问实际上是间接的。因此稀疏算法无法在相同的优化级别上利用硬件:我不知道在这种情况下的具体数字,但10%到20%并不奇怪

    好处很明显,零运算(非存储元件上)根本不执行,导致数量级的运算更少,所需的存储也更少

    整数逻辑、条件语句中还有更多的开销,但现代CPU在重叠整数和FP运算以及“推测性执行”方面非常出色。不幸的是,它们也会阻止矢量化,因此对于稠密情况来说,会产生更多的开销

    GPU呢? 密集LA算法是GPU的最佳选择,与CPU相同:在这种情况下,您可以优化使用:

    • 凝聚
    • 共享内存
    • 内存访问模式
    同样,稀疏LA算法中对矩阵元素的间接访问阻止了利用相同级别的优化

    工具书类 我不记得遇到稀疏问题时使用了哪一个。。。我想是PSBLAS:

    但在这里,你会被它们淹没:

    谢谢你的回答!顺便说一句,你能给我一个简短的描述“开销”时,处理矩阵是稀疏的,因为你上面提到的?如果你能给我一些相关的参考资料,我将不胜感激!谢谢!我在答案中添加了一些信息来回答您的进一步问题。非常详细的答案!非常感谢你的帮助!我还有两个问题。第一个是为了确认,对于我的问题,MKL的稀疏矩阵乘法函数在CPU情况下会比它的密集矩阵乘法函数慢,对吗?另一个问题是:虽然严格地说我的问题不是大规模的、真正稀疏的,但是否仍然存在BLAS库或任何加速矩阵乘法的方法?顺便说一下,在我的问题中,稀疏矩阵没有特殊的结构,非零项只是随机分布在矩阵中。又来了!是的,我想你也会观察到mkl的减速。关于另一个问题,我不知道,这取决于这个问题:有很多关于改进稀疏矩阵解的有用方法的文献:你最好在一个更加数学化的论坛上提问。谢谢你的回答!实际上,现在我想找到一些BLAS库或方法,它们能够利用我自己问题中的稀疏性,从而使矩阵乘法比使用BLAS库的密集函数更快。到目前为止,我的最佳选择似乎仍然是使用BLAS库中的密集函数,对吗?