提高标准矩阵乘法算法的效率?

时间:2011-08-01 15:27:04

标签: performance algorithm matrix

如何提高标准矩阵乘法算法的效率?

此方法涉及的主要操作是:C[i][j]+=A[i][p]*B[p][j]

可以做些什么来提高算法的效率?

5 个答案:

答案 0 :(得分:1)

你可能想看看使用BLAS(基本线性代数子程序)库,特别是英特尔提供他们的MKL here,AMD有他们的ACML here,还有(开源)转到BLAS here

(密集)矩阵 - 矩阵乘法内核将是?GEMM调用,其中?表示浮点类型。例如,DGEMM将调用double例程。

除非您非常自信地知道自己在进行低级优化时所做的事情,否则这些库可能会提供比手动编码更好的性能。

如果您确实希望自己编码,那么您可能需要考虑以下事项:

  1. 使用“矢量”说明。 SSE, SSE2..4指令得到广泛支持,一些较新的CPU也会支持AVX指令。
  2. 嵌套循环展开以最大化浮点运算与加载/存储操作的比率。
  3. 逐块算法,以确保有效的缓存使用。
  4. 多线程。
  5. 此引用可能会让您了解事物的当前状态:

      

    3级BLAS的高性能实施 - K Goto。

    希望这有帮助。

答案 1 :(得分:0)

我建议阅读Golub and Van Loan的第1章,它解决了这个问题。

答案 2 :(得分:0)

  1. 缓存阻止 - 确保您正确使用和重用缓存中的值
  2. 更好的算法 - 乘以矩阵的“定义”方式不是最优的,请看Strassen's algorithm
  3. 并行化 - 如果您的计算机有多个核心和/或处理器,您可以分而治之
  4. SIMD - 利用现代CPU架构中的SSE向量指令
  5. GPGPU - 现代GPU经过优化,可以做到这一点。查看CUDAOpenCL
  6. 请注意,使用这些方法并不能保证更好的性能。需要进行大量调整才能获得显着的加速。有很多钱可以用来搞清楚如何快速增加矩阵,这样就不会缺少关于这个主题的期刊文章。

答案 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)