使用iPhone上的ARM SIMD进行游戏矢量/矩阵操作的正确方法是什么?
题
我正在为游戏制作矢量/矩阵库,该库利用iPhone上的SIMD单元(3GS或更高版本)。我怎样才能做到这一点?我搜索了这一点,现在我知道了几个选择:
- Apple(iPhone OS 4)的加速框架(Blas+Lapack+...)
- ARM的OpenMax实施库
- GCC自动矢量化功能
矢量/矩阵库最适合游戏的方法是什么?
解决方案
为了做得很好,您可能需要编写自己的SIMD例程。使用GCC中的霓虹灯C固有,而不是汇编器来减轻这样做的痛苦。
其他提示
您应该假设GCC不会自动化您的代码,因为听起来这不太可能发生!
就像保罗所说的那样,要从iPhone获得最多的性能,您应该使用霓虹灯SIMD说明为自己的武器组装代码编写自己的手臂装配代码。但这假设您了解手臂组装语言以及霓虹灯,时机延迟等。因此,如果您不想学习ARM组装语言,那么Apple的加速框架和Arm的OpenMax库都具有许多已经在Arm Assembly中写成的功能带有霓虹灯SIMD说明的语言。
因此,如果您可以使用它们,则加速或OpenMax应该非常好。我还没有比较2个实际上更快的速度,但是我认为Arm的OpenMax比Apple的实现速度稍快,因为ARM设计了霓虹灯规格!但是他们都应该非常快。
随着时间的流逝,新答案:
现在,Bullet Physics引擎已由Apple优化为NEON SIMD。 http://bulletphysics.org/bullet/phpbb3/viewtopic.php?t=8490
我使用Inline ASM创建了几个霓虹灯优化的垫子*MAT*MAT*VEC例程。它们是Oolong Engine的一部分,但它们属于MIT许可证,因此您可以根据自己的方式使用它们:
苹果现在有 <simd/simd.h>
这是您提到的加速框架的一部分,包括针对小型矢量,矩阵和四元组的优化数学例程库。似乎这可能是当今最简单的方法。https://developer.apple.com/documentation/accelerate/simd?language=Objc