Codificación para ARM NEON: ¿Cómo comenzar?

ANTECEDENTES (omita esto si lo desea)

Permítanme comenzar diciendo que no soy un programador experto. Soy un joven ingeniero junior de visión por computadora (CV) y tengo bastante experiencia en programación en C ++, principalmente debido al uso extenso de la gran API OpenCV2 C ++. Todo lo que aprendí fue a través de la necesidad de ejecutar proyectos, la necesidad de resolver problemas y cumplir con los plazos, ya que es la realidad en la industria.

Recientemente, comenzamos a desarrollar software de CV para sistemas embebidos (placas ARM), y lo hacemos utilizando código optimizado C ++. Sin embargo, es un gran desafío construir un sistema de CV en tiempo real en este tipo de arquitectura debido a sus recursos limitados en comparación con las computadoras tradicionales.

Eso fue cuando me enteré de NEON. He leído un montón de artículos sobre esto, pero este es un tema bastante reciente, por lo que no hay mucha información al respecto y cuanto más leo, más me confundo.

La pregunta

Estoy buscando optimizar el código C ++ (principalmente algunospara bucles) utilizando la capacidad NEON de calcular 4 u 8 elementos de matriz a la vez. ¿Hay algún tipo de biblioteca o conjunto de funciones que se puedan usar en un entorno C ++? La principal fuente de mi confusión es el hecho de que casi todos los fragmentos de código que veo están en la Asamblea, para lo cual no tengo absolutamente ningún fondo, y no puedo darme el lujo de aprender en este momento. Utilizo Eclipse IDE en Linux Gentoo para escribir código C ++.

ACTUALIZAR

Después de leer las respuestas, hice algunas pruebas con el software. Compilé mi proyecto con las siguientes banderas:

-O3 -mcpu=cortex-a9 -ftree-vectorize -mfloat-abi=hard -mfpu=neon 

Tenga en cuenta que este proyecto incluye amplias bibliotecas como openframeworks, OpenCV y OpenNI, y todo se compiló con estos indicadores. Para compilar para la placa ARM, utilizamos un compilador cruzado de cadena de herramientas Linaro, y la versión de GCC es 4.8.3. ¿Esperaría que esto mejore el rendimiento del proyecto? Debido a que no experimentamos ningún cambio en absoluto, lo cual es bastante extraño teniendo en cuenta todas las respuestas que leí aquí.

Otra pregunta: todos lospara ciclos tienen un número aparente de iteraciones, pero muchas de ellas iteran a través de tipos de datos personalizados (estructuras o clases). ¿Puede GCC optimizar estos ciclos a pesar de que iteran a través de tipos de datos personalizados?

Respuestas a la pregunta(7)

Su respuesta a la pregunta