回答
你可能想看看使用BLAS(基本线性代数子程序)库,特别是英特尔提供他们的MKL here,AMD有自己的ACML here,也有在(开源)转到BLAS here。
(密集)矩阵 - 矩阵乘内核将调用?GEMM
,其中?
指示浮点类型。例如,DGEMM
将调用double
例程。
除非你非常自信,你知道你在做什么低级别的优化,这些库可能会提供比你手动编写的东西更好的性能。
如果你想有在编码这个自己一展身手,那么你可能要考虑以下几点:
- 使用“矢量”的说明。
SSE, SSE2..4
指令得到广泛支持,一些较新的CPU
的指令也将支持AVX
指令。 - 嵌套循环展开以最大化浮点操作与加载/存储操作的比率。
- 确保有效缓存使用的分块算法。
- 多线程。
这种提法可能给你的东西的当前状态的一个想法:
级别3 BLAS的高性能实现 - K转到。
希望这会有所帮助。
+1我发现如果矩阵很小,DGEMM会花费很大一部分时间来检查它的字符参数,这是为了达到通用目的。所以对于小型矩阵,我可以通过简单的手工编码方式节省大量的执行时间。有时完全展开。 –
我建议阅读Golub and Van Loan的第1章,它解决了这个确切的问题。
- 缓存拦截 - 确保你正确使用和高速缓存中重用值
- 更好的算法 - “按定义”的方式来繁殖矩阵是不是最优的,看看Strassen's algorithm
- 并行 - 如果你的机器有一个以上的核心和/或处理器,可以分而治之
- SIMD - 利用SSE向量指令在现代CPU架构
- GPGPU - 现代GPU进行优化,以做到这这种事情。看看CUDA和OpenCL。
请注意,使用这些方法不能保证更好的性能。需要进行大量的调整才能实现显着的加速。研究如何迅速增加矩阵的方法有很多钱,因此不存在有关该主题的期刊文章短缺。
如果问题涉及多个矩阵乘法 - M1 x M2 x ... x Mn - 那么还有另一种基于动态规划的优化技术,这是另一种球类游戏。请注意,这不适用于提高两个矩阵相乘的效率;但是,如果您以成对方式乘以三个或更多矩阵,则可以在更高的水平上进行优化。只是以为我会把这个答案放在堆上来完成信息。
那么有Strassen's Algorithm,这取决于矩阵的大小,比你列出的标准算法稍快。当然有even faster algorithms,但它们不是很容易实现。
标准算法是O(N^3), Strassen重的算法中为O(N^2.8), 和铜匠-的Winograd是O(N^2.3)
- 1. Numpy高效矩阵乘法
- 2. NumPy的矩阵乘法效率的矩阵结构已知
- 3. 矩阵(scipy稀疏) - 矩阵(密集; numpy阵列)乘法效率
- 4. 高效矩阵乘法在Matlab
- 5. 矩阵计算的高效算法
- 6. 高阶矩阵乘法
- 7. numpy的/ Python的:高效矩阵作为输入矩阵的乘积的乘法
- 8. 算法矩阵加法和乘法
- 9. 如何提高此算法的效率?
- 10. 如何提高C中矩阵运算的效率?
- 11. Android上的基准矩阵乘法,C++
- 12. Matlab的:乘法矩阵高效和低效
- 13. 矩阵乘法
- 14. 矩阵乘法
- 15. 矩阵乘法
- 16. 矩阵乘法
- 17. SSE矩阵,矩阵乘法
- 18. 高效行标准化矩阵
- 19. 矩阵的乘法
- 20. 的矩阵乘法
- 21. C++矩阵运算效率
- 22. Java矩阵运算,并行柯尔特矩阵 - 矩阵乘法
- 23. Matlab有效的稀疏矩阵乘法
- 24. 什么是矩阵 - 矩阵乘法/矩阵 - 向量乘法的不同类型的算法
- 25. 计算矩阵乘法的子集
- 26. 链矩阵乘法:乘法算法不起作用
- 27. MATLAB中非常大的矩阵的高效乘法
- 28. 矩阵乘矢量乘法
- 29. 使矩阵乘法运算符@为numpy中的标量运算
- 30. 在高维Python Numpy矩阵乘法
@xtremer:什么样的矩阵的?广场?几乎方?双方的权力?高大和骨感?疏?等等。 – Mehrdad