【问题标题】:Why cuSparse is much slower than cuBlas for sparse matrix multiplication为什么 cuSparse 的稀疏矩阵乘法比 cuBlas 慢得多
【发布时间】:2015-07-19 01:34:00
【问题描述】:

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

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

实验 A:

  1. 稀疏矩阵大小:192x2400
  2. 密集矩阵大小:2400x256
  3. cusparse 时间:1.4ms
  4. cublas时间:0.21ms

实验 B:

  1. 稀疏矩阵大小:192x75
  2. 密集矩阵大小:75x1024
  3. cusparse 时间:0.27ms
  4. cublas时间:0.04ms

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

【问题讨论】:

    标签: matrix cuda multiplication sparse-matrix cublas


    【解决方案1】:

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

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

    这适用于 CPU,不仅适用于 GPU:将矩阵视为稀疏矩阵有很大的开销,并且只有在......大多数元素为零时才使用稀疏算法变得方便(典型:十个或更少每行非零,秩为数千 - 十万 - (百万?)的矩阵。

    还有其他矩阵形状具有有效的解决算法,如果它适用于您的问题,您可以尝试,例如带矩阵。我不知道它们是否已经移植到 cuBlas。

    关于间接费用

    密集线性代数算法可以以最佳方式执行,因为处理器的设计目的是为了最有效地解决此类系统。考虑 DGEMM 操作(矩阵-矩阵乘法):对于大型矩阵(即,不适合系统任何缓存的矩阵),它允许您以 >95% 的理论峰值浮点性能使用处理器。怎么样?

    • 预取
    • 最佳缓存使用率
    • 矢量化(SSE、AVX)
    • 流水线

    在稀疏 LA 算法中,只有非零元素及其对应的索引存储到内存中:内存访问实际上是间接。所以稀疏算法无法在相同的优化级别上利用硬件:我不知道这方面的具体数字,但 10% 到 20% 并不奇怪。

    收益显然是根本不执行对零的操作(对非存储元素),从而导致数量级更少的操作和更少的存储需求。

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

    GPU 呢?

    密集 LA 算法最适合 GPU 和 CPU:在这种情况下,您可以优化使用:

    • 合并
    • 共享内存
    • 内存访问模式

    再次间接访问稀疏LA算法中的矩阵元素阻止利用相同级别的优化。

    参考文献

    我不记得遇到稀疏问题时使用的是哪个...我认为是PSBLAS:http://people.uniroma2.it/salvatore.filippone/psblas/

    但在这里你会不知所措: http://www.netlib.org/utk/people/JackDongarra/la-sw.html

    【讨论】:

    • 非常感谢您的回答!顺便说一句,当您将矩阵处理为上面提到的稀疏矩阵时,您能否简要描述一下“开销”?如果您也给我一些相关的参考资料,我们将不胜感激!谢谢!
    • 我在答案中添加了一些信息以解决您的进一步问题。
    • 相当详细的答案!非常感谢您的帮助!我还有两个问题。第一个是确认对于我的问题,MKL 的稀疏矩阵乘法函数在 CPU 情况下会比其密集的对应函数慢,对吧?另一个问题是:虽然严格来说我的问题不是大规模和真正稀疏的,但是否仍然存在任何 BLAS 库或任何加速矩阵乘法的方法?顺便说一句,在我的问题中,稀疏矩阵没有特殊结构,非零条目只是随机分布在矩阵中。再次感谢!
    • 是的,我猜你也会观察到 mkl 的减速。关于另一个问题,我不知道,这取决于问题:有很多关于改进稀疏矩阵解决方案的方法的文献:在更面向数学的论坛中提问可能更好。
    • 非常感谢您的回答!实际上,现在我想找到一些能够利用我自己问题中的稀疏性的 BLAS 库或方法,从而使矩阵乘法比使用 BLAS 库的密集函数更快。现在看来,我最好的选择仍然是使用 BLAS 库中的密集函数,对吧?
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2015-06-23
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2016-10-10
    • 1970-01-01
    相关资源
    最近更新 更多