如何提高标准矩阵乘法算法的效率?
此方法涉及的主要操作是:C[i][j]+=A[i][p]*B[p][j]
可以做些什么来提高算法的效率?
答案 0 :(得分:1)
你可能想看看使用BLAS(基本线性代数子程序)库,特别是英特尔提供他们的MKL here,AMD有他们的ACML here,还有(开源)转到BLAS here。
(密集)矩阵 - 矩阵乘法内核将是?GEMM
调用,其中?
表示浮点类型。例如,DGEMM
将调用double
例程。
除非您非常自信地知道自己在进行低级优化时所做的事情,否则这些库可能会提供比手动编码更好的性能。
如果您确实希望自己编码,那么您可能需要考虑以下事项:
SSE, SSE2..4
指令得到广泛支持,一些较新的CPU
也会支持AVX
指令。此引用可能会让您了解事物的当前状态:
3级BLAS的高性能实施 - K Goto。
希望这有帮助。
答案 1 :(得分:0)
我建议阅读Golub and Van Loan的第1章,它解决了这个问题。
答案 2 :(得分:0)
请注意,使用这些方法并不能保证更好的性能。需要进行大量调整才能获得显着的加速。有很多钱可以用来搞清楚如何快速增加矩阵,这样就不会缺少关于这个主题的期刊文章。
答案 3 :(得分:0)
如果问题涉及多个矩阵乘法 - M1 x M2 x ... x Mn - 那么还有另一种基于动态编程的优化技术,这是另一种球类游戏。注意,这不适用于提高两个矩阵相乘的效率;但是,如果您以成对方式将三个或更多矩阵相乘,那么您可以在更高的水平上进行优化。我以为我会把这个答案扔到堆上以完善信息。
答案 4 :(得分:0)
那里有Strassen's Algorithm,根据矩阵的大小,它比你列出的标准算法快一点。当然有even faster algorithms,但它们实现起来并不那么简单。
标准算法是O(N ^ 3), 斯特拉森的算法是O(N ^ 2.8), 和Coppersmith-Winograd是O(N ^ 2.3)