Кодирование для ARM NEON: с чего начать?

ФОН (пропустите это, если хотите)

Позвольте мне начать с того, что я не опытный программист. Я молодой младший инженер по компьютерному зрению (CV), и у меня достаточно опыта в программировании на C ++, главным образом из-за широкого использования великолепного OpenCV2 C ++ API. Все, что я узнал, это необходимость выполнения проектов, необходимость решения проблем и соблюдения сроков, как это происходит в отрасли.

Недавно мы начали разработку программного обеспечения CV для встроенных систем (плат ARM), и мы делаем это, используя простой C ++ оптимизированный код. Тем не менее, создать такую ​​систему CV в реальном времени для такой архитектуры очень сложно из-за ее ограниченных ресурсов по сравнению с традиционными компьютерами.

Вот когда я узнал о НЕОН. Я прочитал кучу статей на эту тему, но это довольно недавняя тема, поэтому о ней не так много информации, и чем больше я читаю, тем больше путаюсь.

Вопрос

Я ищу для оптимизации кода C ++ (в основном некоторыедля петель) используя возможность NEON вычислять 4 или 8 элементов массива одновременно. Есть ли какая-то библиотека или набор функций, которые можно использовать в среде C ++? Основным источником моего замешательства является тот факт, что почти все фрагменты кода, которые я вижу, находятся в сборке, для которой у меня нет абсолютно никакого опыта, и я не могу позволить себе учиться на этом этапе. Я использую Eclipse IDE в Linux Gentoo для написания кода на C ++.

ОБНОВИТЬ

После прочтения ответов я провел несколько тестов с программным обеспечением. Я скомпилировал свой проект со следующими флагами:

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

Имейте в виду, что этот проект включает в себя обширные библиотеки, такие как openframeworks, OpenCV и OpenNI, и все было скомпилировано с этими флагами. Для компиляции платы ARM мы используем кросс-компилятор Linaro, а версия GCC - 4.8.3. Вы ожидаете, что это улучшит производительность проекта? Потому что мы не претерпели никаких изменений, что довольно странно, учитывая все ответы, которые я здесь прочитал.

Другой вопрос: вседля циклов имеют очевидное количество итераций, но многие из них перебирают пользовательские типы данных (структуры или классы). Может ли GCC оптимизировать эти циклы, даже если они перебирают пользовательские типы данных?

Ответы на вопрос(7)

Ваш ответ на вопрос