NDK поддерживает ARM Advanced SIMD, широко известный как Neon, — дополнительное расширение набора инструкций для ARMv7 и ARMv8. Neon предоставляет скалярные/векторные инструкции и регистры (общие с FPU), сопоставимые с MMX/SSE/3DNow! в мире x86.
Все устройства Android на базе ARMv8 («arm64») поддерживают Neon. Практически все устройства Android на базе ARMv7 («32-разрядные») поддерживают Neon, включая все устройства с API уровня 21 или выше. NDK включает Neon по умолчанию для обоих Arm ABI.
Если вы ориентируетесь на очень старые устройства, вы можете отфильтровать несовместимые устройства в консоли Google Play. Вы также можете использовать консоль для своего приложения, чтобы увидеть, сколько устройств это затронет.
В качестве альтернативы, для максимальной совместимости, 32-битный код может выполнять проверку во время выполнения, чтобы подтвердить возможность запуска кода Neon на целевом устройстве. Приложение может выполнить эту проверку, используя любой из вариантов, упомянутых в разделе «Характеристики ЦП» .
Не следует явно прописывать встроенные функции Neon в коде C/C++. Переносимые векторные типы Clang автоматически используют инструкции Neon. Встроенные функции Neon Clang на самом деле представляют собой непереносимую обёртку для переносимых типов, поэтому написание встроенных функций Neon не сделает ваш код быстрее, чем при использовании переносимых типов, а лишь менее переносимым.
Строить
Отключить Neon глобально
ndk-build
ndk-build не поддерживает глобальное отключение Neon. Чтобы отключить Neon во всём приложении ndk-build, выполните помодульные действия для каждого модуля в приложении.
CMake
Передайте -DANDROID_ARM_NEON=ON
при вызове CMake. При сборке с помощью Android Studio/Gradle установите следующий параметр в файле build.gradle:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
Отключить Neon для каждого модуля
ndk-build
Чтобы собрать все исходные файлы в модуле ndk-build без Neon, добавьте следующее в определение модуля в Android.mk:
LOCAL_ARM_NEON := false
CMake
Чтобы собрать все исходные файлы в целевом проекте CMake без Neon, добавьте в файл CMakeLists.txt следующее:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
Где ${TARGET}
заменяется на имя вашей библиотеки.
Кроссплатформенная поддержка для x86
NDK поддерживает кроссплатформенную компиляцию существующих встроенных функций ARM SIMD (Neon) в код x86 SSE с помощью стороннего NEON_2_SSE.h . Подробнее об этом см. в статье «От ARM NEON к Intel SSE — решение для автоматического портирования, советы и рекомендации» .
Пример кода
Пример векторизации демонстрирует, как использовать различные инструменты векторизации для реализации умножения матриц, а также сравнивает их производительность.