NDK hỗ trợ SIMD nâng cao của ARM (ARM Advanced SIMD) (thường gọi là Neon), một tiện ích tập lệnh không bắt buộc cho ARMv7 và ARMv8. Neon cung cấp các lệnh và thanh ghi vô hướng/vectơ (chia sẻ với FPU) tương đương với MMX/SSE/3DNow! trong kiến trúc x86.
Tất cả thiết bị Android dựa trên kiến trúc ARMv8 ("arm64") đều hỗ trợ Neon. Hầu hết các công nghệ dựa trên kiến trúc ARMv7 Các thiết bị Android ("32 bit") hỗ trợ Neon, bao gồm tất cả các thiết bị đi kèm API cấp 21 trở lên. Theo mặc định, NDK bật Neon cho cả hai.
Nếu nhắm đến các thiết bị quá cũ, bạn có thể lọc ra các thiết bị không tương thích trên Google Play Console. Bạn cũng có thể sử dụng bảng điều khiển cho ứng dụng của mình để xem số lượng người dùng thiết bị nào mà điều này sẽ ảnh hưởng đến.
Ngoài ra, để có khả năng tương thích tối đa, mã 32 bit có thể thực hiện thời gian chạy để xác nhận rằng mã Neon có thể chạy trên thiết bị mục tiêu. Một ứng dụng có thể thực hiện kiểm tra này bằng cách sử dụng bất kỳ tuỳ chọn nào được đề cập trong Các tính năng của CPU.
Bạn có thể sử dụng hàm nội tại Neon trong mã C và C++ để tận dụng tiện ích SIMD nâng cao. Hướng dẫn lập trình Neon cho kiến trúc Armv8-A cung cấp thêm thông tin về các hàm nội tại Neon nói riêng và lập trình Neon nói chung.
Tạo
Tắt Neon toàn cục
ndk-build
ndk-build không hỗ trợ tắt Neon toàn cục. Để tắt toàn bộ Neon ndk-build, áp dụng các bước theo từng mô-đun cho mọi mô-đun trong .
CMake
Hãy truyền -DANDROID_ARM_NEON=ON
khi gọi CMake. Nếu bạn tạo bản dựng bằng Android Studio/Gradle, hãy thiết lập những tuỳ chọn sau đây trong build.gradle:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
Tắt Neon trên mỗi mô-đun
ndk-build
Để tạo tất cả tệp nguồn trong một mô-đun ndk-build không có Neon, hãy thêm phương thức sau đây là định nghĩa mô-đun trong Android.mk:
LOCAL_ARM_NEON := false
CMake
Để xây dựng tất cả các tệp nguồn trong mục tiêu CMake không có Neon, hãy thêm phương thức sau đây vào CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
Thay thế ${TARGET}
bằng tên thư viện của bạn.
Hỗ trợ đa nền tảng dành cho x86
NDK có hỗ trợ chế độ biên dịch đa nền tảng hàm nội tại ARM SIMD (Neon) hiện có của bạn thành mã x86 SSE, thông qua việc sử dụng NEON_2_SSE.h của bên thứ ba. Để biết thêm thông tin về chủ đề này, hãy xem Từ ARM NEON đến Intel SSE – giải pháp chuyển đổi tự động, mẹo và thủ thuật..
Mã nguồn mẫu
Mẫu hello-neon là một ví dụ về cách sử dụng thư viện cpufeatures
và hàm nội tại Neon cùng lúc. Mẫu này triển khai một điểm chuẩn nhỏ dành cho vòng lặp bộ lọc FIR với một phiên bản C và một phiên bản được tối ưu hoá dành cho thiết bị hỗ trợ Neon.