我正在为使用 iPhone(3GS 或更高版本)上的 SIMD 单元的游戏制作矢量/矩阵库。我怎样才能做到这一点?我搜索了这个,现在我知道了几个选项:
- Apple (iPhone OS 4) 的加速框架 (BLAS+LAPACK+...)
- 来自 ARM 的 OpenMAX 实现库
- GCC 自动矢量化功能
什么是最适合游戏矢量/矩阵库的方式?
随着时间的推移,会有新的答案:
子弹物理引擎现已针对 Apple 的 NEON SIMD 进行了优化。http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=8490
您应该假设 GCC 不会自动矢量化您的代码,因为这听起来不太可能发生!
就像 Paul 说的那样,为了让 iPhone 发挥最大性能,您应该尽可能多地使用 NEON SIMD 指令编写自己的 ARM 汇编代码。但这假设您了解 ARM 汇编语言以及 NEON、时序延迟等。因此,如果您不想学习 ARM 汇编语言,那么 Apple 的 Accelerate 框架和 ARM 的 OpenMAX 库都有许多已经用 ARM 汇编编写的函数带有 NEON SIMD 指令的语言。
因此,如果可以使用 Accelerate 或 OpenMAX,它们都应该非常好。我没有比较 2 来查看哪个实际上更快,但我认为 ARM 的 OpenMAX 比 Apple 的实现稍快,因为 ARM 设计了 NEON 规格!但是它们都应该运行得非常快。
I created a couple of NEON optimized Mat*Mat and Mat*Vec routine using inline ASM. They are part of the Oolong Engine, but they are under the MIT license, so you can use them as you like:
要做好它,您可能需要编写自己的 SIMD 例程。在 gcc 而不是汇编程序中使用 Neon C 内在函数来减轻这样做的痛苦。
Apple 现在拥有<simd/simd.h>
一个针对小型向量、矩阵和四元数的优化数学例程库,作为您提到的 Accelerate 框架的一部分。似乎这可能是今天最简单的方法。
https://developer.apple.com/documentation/accelerate/simd?language=objc