在iPhone上使用ARM SIMD进行游戏矢量/矩阵操作的正确方法是什么?

时间:2010-05-01 09:26:09

标签: iphone math vector matrix simd

我正在为iPhone制作一个矢量/矩阵库,它使用iPhone上的SIMD单元(3GS或更高版本)。 我怎样才能做到这一点? 我搜索了这个,现在我知道几个选项:

  • 从Apple(iPhone OS 4)
  • 加速框架(BLAS + LAPACK + ...)
  • 来自ARM的OpenMAX实施库
  • GCC自动矢量化功能

游戏中矢量/矩阵库最适合的方式是什么?

5 个答案:

答案 0 :(得分:2)

您应该假设GCC不会自动对您的代码进行矢量化,因为这听起来不太可能发生!

就像保罗所说,为了从iPhone获得最佳性能,你应该尽可能多地使用NEON SIMD指令编写自己的ARM汇编代码。但这假设您了解ARM汇编语言以及NEON,时序延迟等。因此,如果您不想学习ARM汇编语言,那么Apple的Accelerate框架和ARM的OpenMAX库都有许多已经用ARM汇编编写的函数语言与NEON SIMD指令。

因此,如果您可以使用Accelerate或OpenMAX,那么它们应该非常好。我没有比较2,看看哪一个实际上更快,但我认为ARM的OpenMAX比Apple设计NEON规格的实施略快!但他们都应该跑得非常快。

答案 1 :(得分:2)

随着时间的推移,新答案:

现在,子弹物理引擎已针对NEON SIMD进行了优化。 http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=8490

答案 2 :(得分:1)

为了做得好,您可能需要编写自己的SIMD例程。在gcc而不是汇编程序中使用Neon C内在函数来减轻这样做的痛苦。

答案 3 :(得分:1)

我使用内联ASM创建了几个NEON优化的Mat * Mat和Mat * Vec例程。它们是乌龙引擎的一部分,但它们属于MIT许可证,因此您可以随意使用它们:

http://code.google.com/p/oolongengine/source/browse/trunk/Oolong%20Engine2/Math/neonmath/neon_matrix_impl.cpp

答案 4 :(得分:0)

Apple现在拥有<simd/simd.h>,它是针对小向量,矩阵和四元数进行优化的数学例程库,是您提到的Accelerate框架的一部分。 似乎这可能是当今最简单的方法。 https://developer.apple.com/documentation/accelerate/simd?language=objc