什么是最好的矩阵乘法算法?

时间:2010-12-15 22:32:34

标签: algorithm math matrix matrix-multiplication

什么是最佳矩阵乘法算法?什么对我来说意味着什么?它意味着最快,为今天的机器做好准备。

如果可以,请提供伪代码的链接。

8 个答案:

答案 0 :(得分:12)

BLAS是最好的即用型高效矩阵乘法库。有许多不同的实现。这是我在具有双核英特尔酷睿2双核2.66 GHz的MacBook Pro上进行的一些基准测试:

alt text

还有其他商业实施,我没有在这里测试:

答案 1 :(得分:8)

最佳矩阵乘法算法是具有详细建筑知识的人已经为您的目标平台手动调整的算法。

有许多好的库提供调整的矩阵乘法实现。使用其中一个。

答案 2 :(得分:7)

可能有更好的,但这些是我的头脑(比标准立方复杂度算法更好)。

Strassen's - O(N ^ 2.8)

Coppersmith Winograd - O(N ^ 2.376)

答案 3 :(得分:6)

为什么要伪码?为什么要自己实施呢?如果速度是您关注的问题,那么可以使用高度优化的算法,包括针对特定指令集(例如SIMD)的优化,实现这些算法并不能带来真正的好处(除了可能学习),

查看不同的BLAS实现,例如:

http://www.netlib.org/blas/

http://math-atlas.sourceforge.net/

答案 4 :(得分:3)

答案 5 :(得分:2)

取决于矩阵的大小,以及它是否稀疏。

对于中小型密集矩阵,我认为“天真”O(N ^ 3)算法的一些变化是胜利,如果你注意缓存一致性并使用平台的矢量指令。

数据排列很重要 - 对于标准矩阵布局对缓存不友好的情况(例如,column-major * row-major),您应该尝试对矩阵乘法进行二进制分解 - 即使您不使用Strassen或其他“快速”算法,这种操作顺序可以产生“缓存无关”算法,该算法自动充分利用每个级别的缓存。如果您可以重新排列矩阵,可以尝试将其与数据元素的位交错(或“Z顺序”)排序相结合。

最后,请记住:过早优化是万恶之源。当它不再为时过早时,总是个人资料&优化之前,期间和之后的基准......

答案 6 :(得分:0)

有一种算法调用Cannon's algorithm分布式矩阵乘法算法。更多here

答案 7 :(得分:0)

所有现代CPU上的所有矩阵都没有“最佳算法”。

您需要对可用的许多方法进行一些研究,然后找到最适合您正在处理的特定硬件上计算的特定问题的解决方案。

例如,硬件平台上的“最快”方式可能是使用“慢”算法,但要求GPU将其并行应用于256个矩阵。或者使用“快速”通用(mxn)算法可能比使用优化的3x3矩阵乘法产生更慢的结果。如果您真的希望它快速,那么您可能需要考虑采用裸机来确保您充分利用特定的CPU功能,如SIMD指令,分支预测和缓存一致性,但代价是可移植性。