Как правильно использовать ARM SIMD на iPhone для векторной / матричной работы игры? - PullRequest
3 голосов
/ 01 мая 2010

Я делаю векторную / матричную библиотеку для Game, которая использует SIMD-модуль на iPhone (3GS или более поздней версии). Как я могу это сделать? Я искал об этом, теперь я знаю несколько вариантов:

  • Ускорение фреймворка (BLAS + LAPACK + ...) от Apple (iPhone OS 4)
  • Библиотека реализации OpenMAX от ARM
  • Функция автоматической векторизации GCC

Какой наиболее подходящий способ для векторной / матричной библиотеки для игры?

Ответы [ 5 ]

2 голосов
/ 17 октября 2012

Со временем приходят новые ответы:

Ядро физики пуль теперь оптимизировано для NEON SIMD от Apple. http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=8490

2 голосов
/ 13 октября 2010

Вы должны предположить, что GCC не будет автоматически векторизовать ваш код, потому что, похоже, это вряд ли произойдет!

Как сказал Пол, чтобы получить максимальную производительность от вашего iPhone, вы должны написать свой собственный код ARM Assembly, используя инструкции NEON SIMD для максимально возможной его части. Но это предполагает, что вы понимаете язык ассемблера ARM, а также NEON, задержки синхронизации и т. Д. Итак, если вы не хотите изучать язык ассемблера ARM, то среда Apple Accelerate и библиотеки ARMA OpenMAX имеют множество функций, уже написанных на ассемблере ARM язык с инструкциями NEON SIMD.

Так что либо Accelerate, либо OpenMAX должны быть очень хорошими, если вы можете их использовать. Я не сравнивал 2, чтобы увидеть, какой из них на самом деле быстрее, но я предполагаю, что OpenMAX ARM немного быстрее, чем реализация Apple, так как ARM разработал спецификации NEON! Но они оба должны бежать очень быстро.

1 голос
/ 21 апреля 2011

Я создал пару оптимизированных NEON процедур Mat * Mat и Mat * Vec, используя встроенный ASM. Они являются частью Oolong Engine, но имеют лицензию MIT, поэтому вы можете использовать их по своему усмотрению:

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

1 голос
/ 01 мая 2010

Чтобы сделать это хорошо, вам, вероятно, потребуется написать свои собственные процедуры SIMD. Используйте встроенные функции Neon C в gcc, а не на ассемблере, чтобы облегчить эту задачу.

0 голосов
/ 12 июля 2018

У Apple теперь есть <simd/simd.h>, которая представляет собой библиотеку оптимизированных математических процедур для небольших векторов, матриц и кватернионов в рамках упомянутой вами инфраструктуры ускорения. Похоже, это, наверное, самый простой способ сегодня. https://developer.apple.com/documentation/accelerate/simd?language=objc

...