В настоящее время я пишу простую программу для Android с использованием C ++ с помощью JNI и OpenCV.
На входе изображение хранится в виде мата.
Вместо использования функции нормализации OpenCV, я хочу написать свою собственную функцию нормализации на C ++.
Из того, что я знаю, есть поддержка NEON.
Однако, взглянув на образец HelloNeon в папке NDK, я понял, что код написан на основе NEON.
Вопрос:
Есть ли способ напрямую скомпилировать мой код C ++ в код NEON?
Т.е. я хочу избежать написания своей функции в присущем NEON.
Спасибо.
Во многом зависит от компилятора. И gcc, и clang поддерживают «автоматическую векторизацию» в последних версиях, но качество сгенерированного кода очень различно — в основном в зависимости от реального исходного кода. Как всегда, компилятор, во-первых, отвечает за генерацию правильного кода, во-вторых, за генерацию быстрого / эффективного кода. Если есть сомнения, перейдите на «безопасный» вариант.
Это должно, однако, работать, чтобы использовать -mfpu=neon -ftree-vectorize
,
Однако я ожидаю, что вам нужно «помассировать» код, чтобы он хорошо векторизовался — по крайней мере, это мой опыт на x86, где компилятор будет пытаться создавать инструкции SSE при векторизации. Это удается в довольно простых случаях, но возвращается к «обычному коду», когда код более сложный. Более поздние компиляторы, как правило, работают лучше, чем старые версии.
Если вам действительно нужно получить хорошие результаты векторизации, вам, вероятно, придется использовать встроенные Neon.