¿Cuál es la forma correcta de utilizar ARM SIMD en iPhone para la operación de vector/matriz de juego?

StackOverflow https://stackoverflow.com/questions/2749417

Pregunta

Estoy haciendo una biblioteca vectorial/matriz para el juego que utiliza la unidad SIMD en iPhone (3GS o posterior). ¿Cómo puedo hacer esto? Busqué sobre esto, ahora conozco varias opciones:

  • Acelerar el marco (BLAS+LAPACK+...) de Apple (iPhone OS 4)
  • Biblioteca de implementación de OpenMax desde el brazo
  • Función de autovectorización de GCC

¿Cuál es la forma más adecuada para la biblioteca Vector/Matrix para el juego?

¿Fue útil?

Solución

Para hacerlo bien, probablemente necesitará escribir sus propias rutinas SIMD. Use las intrínsecs de neón C en GCC en lugar de ensamblador para aliviar el dolor de hacer esto.

Otros consejos

Debe asumir que GCC no vectorizará automáticamente su código, ¡porque parece que es muy poco probable que suceda!

Como dijo Paul, para obtener el mayor rendimiento de su iPhone, debe escribir su propio código de ensamblaje de brazo utilizando instrucciones de neón SIMD durante la mayor cantidad posible. Pero eso supone que comprende el lenguaje de ensamblaje del brazo, así como el neón, los retrasos en el tiempo, etc., por lo que si no desea aprender el lenguaje de ensamblaje del brazo, entonces el marco de aceleración de Apple y las bibliotecas Openmax del brazo tienen numerosas funciones que ya están escritas en el ensamblaje del brazo Idioma con instrucciones de neón SIMD.

Por lo tanto, acelerar o OpenMax debería ser muy bueno si puede usarlos. No he comparado el 2 para ver cuál es realmente más rápido, ¡pero supongo que el OpenMax de ARM es un poco más rápido que la implementación de Apple desde que ARM diseñó las especificaciones de neón! Pero ambos deberían correr extremadamente rápido.

Con el tiempo llega nuevas respuestas:

El motor Bullet Physics ahora está optimizado para Neon SIMD por Apple. http://bulletphysics.org/bullet/phpbb3/viewtopic.php?t=8490

Creé un par de rutina de Mat*Mat*VEC optimizadas de neón usando ASM en línea. Son parte del motor Oolong, pero están bajo la licencia MIT, por lo que puede usarlos como desee:

http://code.google.com/p/oolongengine/source/browse/trunk/oolong%20engine2/math/neonmath/neon_matrix_impl.cpp

Apple ahora tiene <simd/simd.h> que es una biblioteca de rutinas de matemáticas optimizadas para pequeños vectores, matrices y cuaterniones como parte del marco de aceleración que menciona. Parece que esa es probablemente la forma más fácil hoy.https://developer.apple.com/documentation/accelerate/simd?language=objc

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top