Кодирование для 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 оптимизировать эти циклы, даже если они перебирают пользовательские типы данных?