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 по умолчанию для обоих ABI Arm.
Если вы ориентируетесь на очень старые устройства, вы можете отфильтровать несовместимые устройства в консоли Google Play. Вы также можете использовать консоль своего приложения, чтобы увидеть, на скольких устройствах это будет затронуто.
В качестве альтернативы, для обеспечения максимальной совместимости, 32-битный код может выполнять проверку во время выполнения, чтобы подтвердить возможность запуска кода Neon на целевом устройстве. Приложение может выполнить эту проверку, используя любой из вариантов, упомянутых в разделе «Особенности ЦП» .
В коде на C/C++ не следует явно указывать встроенные функции Neon. Переносимые векторные типы 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"
}
}
}
}
Отключить неоновую подсветку для каждого модуля
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 — автоматическое решение для портирования, советы и рекомендации» .
Пример кода
В примере векторизации показано, как использовать различные инструменты векторизации для реализации умножения матриц, и сравнивается их производительность.