我想知道什么是一个好的,性能好的算法,矩阵乘法的4x4矩阵。我正在实现一些仿射变换,并且我知道有几种有效的矩阵乘法算法,比如Strassen。但是,对于如此小的矩阵,是否有一些特别有效的算法呢?我看过的大多数资源都是看渐近线上最有效的。
发布于 2015-12-26 11:14:41
通常,对于非常小的集合,简单的算法是最快的,因为更复杂的算法通常使用一些转换来增加一些开销。我认为您最好的选择不是一个更高效的算法(我认为大多数库都使用简单的方法),而是更高效的实现,例如,使用SIMD扩展(假设x86或amd64代码),或者在程序集中手工编写。此外,内存布局应该仔细考虑。你应该能在这方面找到足够的资源。
发布于 2015-12-27 19:25:13
对于4x4 mat/mat乘法,算法改进常常是不存在的。基本的三次时间复杂度算法往往运行得很好,任何比这更时髦的算法都更有可能退化而不是改善时间。一般情况下,如果不涉及可伸缩性因素(例如:试图加快排序一个总是有6个元素的数组,而不是简单的插入或气泡排序),那么花哨的算法是不合适的。在这里做诸如矩阵转换这样的事情来提高引用的局部性也并不能帮助引用的局部性,因为当一个完整的矩阵可以放进一个或两个缓存行中时。在这种微型规模下,如果你做的是4x4垫/垫乘法,这些改进通常来自于指令和内存的微观优化,比如适当的高速缓存线对齐。
发布于 2015-12-28 10:21:52
如果您确实知道只需要乘4x4矩阵,那么根本不需要担心通用算法。您只需输入两个指针,并使用以下内容:
(我强烈建议以某种自动化的方式翻译这篇文章)。
然后,编译器将最优地定位于优化这段代码(重用部分和、重新排序数学等),因为它可以看到一切,没有动态循环,也没有控制流。
很难想象,如果不使用本质,这是可以克服的。
https://softwareengineering.stackexchange.com/questions/305908
复制相似问题