[英]Why is Strassen matrix multiplication so much slower than standard matrix multiplication?
[英]Why cuSparse is much slower than cuBlas for sparse matrix multiplication
最近当我在CUDA TOOLKIT 6.5中使用cuSparse和cuBLAS进行稀疏矩阵乘法时,我发现cuSPARSE在所有情况下都比cuBLAS慢得多!
在我所有的实验中,我用cusparseScsrmm
在cuSparse和cublasSgemm
在CUBLAS。 在稀疏矩阵中,总元素的一半为零。 我使用的GPU是NVIDIA Titan Black。 此外,所有消耗的时间都是通过NVIDIA提供的nvvp
工具获得的。 以下是一些结果:
实验A:
实验B:
所以,看到上面列出的结果是很奇怪的。 因为cuSPARSE专门设计用于处理稀疏矩阵操作,所以它怎么能比cuBLAS更慢!? 如果是这样,则根本不需要使用cuSPARSE。 你能告诉我结果的任何解释吗? 另外,你能否提出任何其他方法来加速稀疏矩阵乘法?
我不认为你可以将半零的矩阵归类为“稀疏”:你发现的时间是合理的(实际上稀疏算法的表现非常好!)。
稀疏算法仅在考虑大多数元素为零的矩阵时才有效(例如,来自有限元问题的矩阵)。
这适用于CPU,不仅适用于GPU:将矩阵视为稀疏处理有一个重要的开销,只有当......大多数元素为零时才使用稀疏算法变得很方便(典型:十个或更少的非零)每行,排名数千 - 数十万 - (数百万?))。
还有其他矩阵形状具有有效的解决方案算法,如果它适用于您的问题,您可以尝试,例如波段矩阵。 我不知道他们是否已被移植到cuBlas。
密集线性代数算法可以最佳地执行,因为处理器的设计是为了最有效地解决这样的系统。 考虑DGEMM操作(矩阵 - 矩阵乘法):对于大型矩阵(即,矩阵不适合系统的任何高速缓存),它允许您使用理论峰值浮点性能的95%以上的处理器。 怎么样?
在稀疏的LA算法中,只有非零元素及其相应的索引存储在存储器中:存储器访问实际上是间接的 。 因此,稀疏算法无法在相同的优化级别上利用硬件:我不知道在这种情况下的具体数字,但10%到20%不会很奇怪。
显而易见的是,对零的操作(在非存储元件上)根本不执行,导致操作量减少,所需存储量减少。
整数逻辑,条件有进一步的开销,但现代CPU在重叠整数和FP操作以及“推测执行”方面相当不错。 不幸的是,他们也可以防止矢量化,因此对于密集的情况也是如此。
密集LA算法是GPU的最佳选择,与CPU相同:在这种情况下,您可以优化使用:
再次,稀疏LA算法中对矩阵元素的间接访问阻止了利用相同级别的优化。
我不记得在遇到稀疏问题时我使用了哪一个......我认为这是PSBLAS: http ://people.uniroma2.it/salvatore.filippone/psblas/
但在这里你将被他们所淹没: http : //www.netlib.org/utk/people/JackDongarra/la-sw.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.