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

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 — автоматическое решение для портирования, советы и рекомендации» .

Пример кода

В примере векторизации показано, как использовать различные инструменты векторизации для реализации умножения матриц, и сравнивается их производительность.