gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:28:49 31 4
gpt4 key购买 nike

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

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

实验一:

  • 稀疏矩阵大小:192x2400
  • 密集矩阵大小:2400x256
  • cusparse时间:1.4ms
  • cublas 时间:0.21 毫秒

  • 实验乙:
  • 稀疏矩阵大小:192x75
  • 密集矩阵大小:75x1024
  • cusparse时间:0.27ms
  • cublas 时间:0.04 毫秒

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

    最佳答案

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

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

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

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

    关于间接费用

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

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

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

    增益显然是不执行对零(对非存储元素)的操作,导致操作数量级减少,并且需要的存储更少。

    整数逻辑、条件还有进一步的开销,但现代 CPU 在重叠整数和 FP 运算以及“推测执行”方面表现得非常好。不幸的是,它们也可以防止矢量化,因此在密集情况下会产生进一步的开销。

    GPU呢?

    密集 LA 算法最适合 GPU 和 CPU:在这种情况下,您可以最佳使用:
  • 聚结
  • 共享内存
  • 内存访问模式

  • 同样,对稀疏 LA 算法中矩阵元素的间接访问阻止了利用相同级别的优化。

    引用

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

    但在这里你会被它们淹没:
    http://www.netlib.org/utk/people/JackDongarra/la-sw.html

    关于matrix - 为什么 cuSparse 在稀疏矩阵乘法方面比 cuBlas 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30118673/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com