iOS – Dilema de transposition, multiplicación y Eigen-Descomposition de la matriz acelerada de la GPU

Estoy trabajando en una biblioteca que requiere el uso de vectores y matrices en la plataforma iOS. Decidí investigar OpenGLES porque la matriz y las manipulaciones de vectores que planeo hacer (principalmente, la transposition, la multiplicación de matrices y la composition electrónica) definitivamente podrían beneficiarse de la aceleración de la GPU.

El problema es que no estoy familiarizado con OpenGLES y, sinceramente, podría no ser la mejor opción. Si tuviera que utilizar OpenGLES, ¿tendría que escribir manualmente los algorithms que hacen la transposition de matriz, la multiplicación y la composition de la matriz? ¿O hay otro marco Apple o de terceros que me puede ayudar con estas tareas?

Sin embargo, el principal problema de split es que quiero acelerar la GPU.


Voy a implementar mi progtwig usando Accelerate Framework y aritmética vectorizada y luego probar para ver si es lo suficientemente rápido para mis propósitos y, si no es así, testing la implementación de la GPU.

Como estados combinatorios, Accelerate usa SIMD para acelerar muchas de sus funciones, pero está basado en CPU. Para los sets de datos más pequeños, definitivamente es el path a seguir, pero operar en la GPU puede superar significativamente a los sets de datos lo suficientemente grandes con operaciones fácilmente paralelizadas.

Para evitar tener que escribir todo el código de interacción de OpenGL ES usted mismo, puede echar un vistazo a mi marco GPUImage , que encapsula las operaciones de shader de fragment en Objective-C. En particular, puede usar las classs GPUImageRawDataInput y GPUImageRawDataOutput para alimentar datos de byte sin procesar en la GPU, y luego operar sobre eso usando un sombreador de fragment personalizado.

Una operación de transposition de matriz sería rápida de implementar, ya que todos los elementos de la matriz son independientes entre sí. La multiplicación de matrices por una matriz constante o pequeña también sería razonablemente fácil de hacer, pero no estoy seguro de cómo escalar correctamente la multiplicación de dos matrices grandes. Del mismo modo, no tengo una buena implementación de eigendecomposition que pueda señalar desde la parte superior de mi cabeza.

La desventaja de tratar con el procesamiento de fragmentación de sombreadores es el hecho de que, por defecto, OpenGL ES admite y produce valores de RGBA de 4 bytes en cada píxel. Puedes cambiar eso a la mitad de los flotadores en los dispositivos más nuevos, y sé que otros han hecho esto con este marco, pero no lo he intentado yo mismo. Puede empacar valores flotantes individuales en bytes RGBA y descomprimirlos al final, como otro método para get y sacar estos datos de la GPU.

La compatibilidad con OpenGL ES 3.0 en los dispositivos A7 más recientes ofrece otras oportunidades para trabajar con datos flotantes. Puede usar los datos de vértice en lugar de la input de textura, lo que le permite suministrar cuatro flotadores por vértice y extraer esos flotadores al final. Bartosz Ciechanowski tiene una descripción muy detallada de esto en su blog . Ese podría ser un mejor enfoque general para las operaciones de GPGPU, pero si puede hacer que sus operaciones se ejecuten contra datos de textura en un shader de fragment, verá aceleraciones enormes en el último hardware (el iPhone 5S puede ser ~ 100-1000X más rápido que el iPhone 4 en este sentido, donde el procesamiento de vértices y la velocidad de la CPU no han avanzado tan rápido).

El marco de aceleración no se acelera en la GPU, pero está muy bien optimizado y utiliza SIMD en Neon cuando corresponde.