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

8
最近,当我在使用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.4毫秒 4. cublas时间:0.21毫秒
实验B: 1. 稀疏矩阵大小:192x75 2. 密集矩阵大小:75x1024 3. cusparse时间:0.27毫秒 4. cublas时间:0.04毫秒
所以,看到上面列出的结果非常奇怪。因为cuSPARSE是专门设计用于处理稀疏矩阵操作的,它怎么可能比cuBLAS还要慢!?如果是这样,那么根本没有必要使用cuSPARSE。您能给我解释一下这个结果吗?此外,您能提出任何其他加速稀疏矩阵乘法的方法吗?
1个回答

21
我认为,你不能将一半元素为零的矩阵归类为“稀疏”:你找到的时间是合理的(实际上,这个稀疏算法表现得非常好!)。
只有在考虑到大部分元素都为零的矩阵时(例如,来自有限元问题的矩阵),稀疏算法才能高效地工作。这不仅适用于CPU,还适用于GPU:将矩阵视为稀疏矩阵会产生重要的开销,只有当大部分元素都为零时(典型的情况是每行只有十个或更少的非零元素,矩阵的秩为数千-数十万-(百万?)。
如果适用于您的问题,还有其他有效的解决方案,例如带状矩阵。不过我不知道它们是否被移植到了cuBlas。
关于开销:
密集线性代数算法可以表现得最优,因为处理器的设计旨在以最佳方式高效地解决此类系统。考虑 DGEMM 操作(矩阵-矩阵相乘):对于大矩阵(即不适合任何系统缓存的矩阵),这是一种可以让你使用处理器 >95% 的理论最高浮点性能的操作。如何实现?
预取 最佳缓存使用 矢量化(SSE、AVX) 流水线
在稀疏 LA 算法中,只有非零元素及其相应的索引存储到内存中:内存访问事实上是间接的。因此,稀疏算法无法像密集算法一样充分利用硬件优化水平:在这种情况下,我不知道具体数字,但 10% 到 20% 不会引起奇怪的现象。
收益显然在于,对于零(非存储元素)的操作根本不进行,导致需要执行的操作数量大大降低,并且需要的存储空间也大大减少。
在整型逻辑、条件语句方面还有进一步的开销,但现代CPU在重叠整数和FP操作方面表现得非常好,并且具有“推测执行”的功能。不幸的是,它们也可能阻止矢量化,因此与密集情况相比,会存在进一步的开销。

GPU的应用呢?

像对于CPU一样,密集型线性代数算法同样适用于GPU:在这种情况下,您可以最大限度地使用以下内容:

  • 合并(coalescing)
  • 共享内存(shared memory)
  • 内存访问模式(memory access patterns)

同样,在稀疏线性代数算法中,间接 访问矩阵元素会阻止利用相同级别的优化。

参考文献

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

但是在这里,您将被压倒性的信息量淹没: http://www.netlib.org/utk/people/JackDongarra/la-sw.html


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接