高效的SSE NxN矩阵乘法

3
我想实现基于SSE的大矩阵乘法版本。我正在寻找一种基于SIMD实现的高效算法。
我的期望方法如下:
A(n x m) * B(m x k) = C(n x k)

所有矩阵都被认为是16字节对齐的浮点数组。

我在网上搜索并找到了一些描述8x8乘法甚至更小的文章。我真的需要尽可能高效,并且不想使用Eigen库或类似库(只使用SSE3更具体)。

因此,如果有人可以帮助我找到一些关于如何开始实现这个的文章或资源,我将不胜感激。


4
使用已经建立的库可能是最简单、性价比最高的方式。那么问题在哪里呢? - user395760
我最终想要在设备上实现它。我希望它不依赖于第三方库。 - Hamid Bazargani
@PaulR 你说得对。我的矩阵是float类型的。 - Hamid Bazargani
1
不妨看一下BLAS实现的源代码,看看它们是如何做的?这些代码有很多优化。ATLAS(http://math-atlas.sourceforge.net/)是BSD许可证。 - Adam
2
可能是[高效的4x4矩阵乘法(C vs汇编)]的重复问题(https://dev59.com/2mMl5IYBdhLWcg3wTlnZ)。 - Ciro Santilli OurBigBook.com
显示剩余3条评论
1个回答

9
实现任意大小的矩阵乘法的主要挑战不在于使用SIMD,而是重复使用缓存数据。如果您想实现缓存友好的矩阵乘法,并讨论适合于SIMD的内核选择,请务必阅读Goto和Van de Geijn的《高性能矩阵乘法解剖学》这篇论文Anatomy of High-Performance Matrix Multiplication by Goto and Van de Geijn。阅读完这篇论文后,预计在两周的努力后,矩阵乘法将达到机器峰值的50%。

然而,如果这项工作的目的不是纯粹学习,我强烈建议使用高度优化的库。在x86上,您最好的选择是OpenBLAS(BSD许可证,支持动态CPU调度),BLIS(BSD许可证,易于移植到新处理器)和Intel MKL(商业用途,支持Intel处理器上的动态CPU调度)。出于性能原因,最好避免ATLAS,除非您的目标是非常奇特的架构,其他库不支持该架构。


1
感谢您提供非常有用的文章。 - Hamid Bazargani
很好的论文Marat。我花了比两周更长的时间才达到50%的破解(同时使用多个线程),但我没有那篇论文。现在我在Ivy Bridge上使用AVX可以超过70%,在Haswell上使用FMA3可以达到55%(与Ivy Bridge相比仍然优于100%)。 - Z boson
2
@Zboson 我也建议你看一下关于BLIS的论文,特别是如果你对线性代数的多核优化感兴趣的话。它们在这里:https://code.google.com/p/blis/#Citations - Marat Dukhan

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