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 для обоих.
Если вы ориентируетесь на очень старые устройства, вы можете отфильтровать несовместимые устройства в консоли Google Play. Вы также можете использовать консоль своего приложения, чтобы увидеть, на скольких устройствах это повлияет.
В качестве альтернативы, для максимальной совместимости, 32-битный код может выполнять обнаружение во время выполнения, чтобы подтвердить, что код Neon может быть запущен на целевом устройстве. Приложение может выполнить эту проверку, используя любой из параметров, упомянутых в разделе «Функции ЦП» .
Вы можете использовать встроенные функции Neon в коде C и C++, чтобы воспользоваться преимуществами расширения Advanced SIMD. Руководство программиста Neon для Armv8-A предоставляет дополнительную информацию о встроенных функциях Neon и программировании Neon в целом.
Строить
Отключить Neon глобально
ndk-сборка
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"
}
}
}
}
Отключить неон для каждого модуля
ndk-сборка
Чтобы собрать все исходные файлы в модуле 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 — решение для автоматического портирования, советы и рекомендации» .
Пример кода
Пример hello-neon представляет собой пример одновременного использования библиотеки cpufeatures
и встроенных функций Neon. В этом примере реализован небольшой тест для цикла КИХ-фильтра с версией C и версией, оптимизированной для Neon, для устройств, поддерживающих Neon.