![]() |
1
36
不,Strassen或Coppersmith-Winograd算法在这里不会有什么不同。他们开始只为更大的矩阵付出代价。 如果你的矩阵乘法真的是一个瓶颈,你可以用氖单指令多数据指令重写算法。这只对ARMV7有帮助,因为ARMV6没有这个扩展。 我希望系数3在为您的案例编译的C代码上加速。 编辑:您可以在arm-neon中找到一个很好的实现: http://code.google.com/p/math-neon/ 对于您的C代码,您可以做两件事来加快代码的速度:
|
![]() |
2
20
只是吹毛求疵。我想知道为什么人们仍然故意混淆他们的代码?C已经很难阅读了,不需要添加到其中。
|
![]() |
3
3
您确定展开的代码比基于循环的显式方法更快吗?请注意,编译器通常比人类更好地执行优化! 事实上,我敢打赌,编译器从一个编写良好的循环中自动发出simd指令的可能性比从一系列“无关”语句中发出指令的可能性要大… 您还可以在参数声明中指定矩阵大小。然后可以使用普通的括号语法来访问元素,这也可以是编译器进行优化的一个好提示。 |
![]() |
4
2
这些矩阵是任意的还是对称的?如果是这样的话,这些对称性常常可以用来提高性能(例如在旋转矩阵中)。 此外,我同意上面的Fortran,并将运行一些计时测试来验证手动展开的代码比优化编译器创建的代码要快。至少,您可以简化代码。 保罗 |
![]() |
5
2
您完全展开的传统产品可能非常快。 您的矩阵太小,无法克服人们听到的用显式索引和分区代码管理传统形式的strassen乘法;您可能会失去对优化的任何影响。 但是如果你想快点的话,如果可以的话,我会用SIMD指令。如果这几天胳膊上没有碎片,我会很惊讶的。如果是这样,您可以在一条指令中以行/列的形式管理所有产品;如果simd是8宽的,您可以管理 二 行/列在一条指令中相乘。将操作数设置为执行该指令可能需要一些交替;SIMD指令将很容易拾取行(相邻值),但不会拾取列(非相邻)。计算行/列中的乘积和可能需要一些努力。 |