Неоновая поддержка

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.