为什么cuSparse比cuBlas慢得多,因为稀疏矩阵乘法

时间:2015-05-08 07:55:06

标签: matrix cuda multiplication sparse-matrix cublas

最近,当我在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 time:1.4ms
  4. cublas时间:0.21ms
  5. 实验B:

    1. 稀疏矩阵大小:192x75
    2. 密集矩阵大小:75x1024
    3. cusparse time:0.27ms
    4. cublas时间:0.04ms
    5. 所以,看到上面列出的结果是很奇怪的。因为cuSPARSE专门设计用于处理稀疏矩阵操作,所以它怎么能比cuBLAS更慢!?如果是这样,则根本不需要使用cuSPARSE。你能告诉我结果的任何解释吗?另外,你能否提出任何其他方法来加速稀疏矩阵乘法?

1 个答案:

答案 0 :(得分:13)

我不认为您可以将半零的矩阵分类为"稀疏":您发现的时间是合理的(实际上稀疏算法的表现非常好!)。

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

这适用于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