Tính năng hỗ trợ Neon

NDK có 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 dành 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.

Hầu hết các thiết bị Android dựa trên kiến trúc ARMv7 đều hỗ trợ Neon, bao gồm tất cả các thiết bị đi kèm với API cấp 21 trở lên. Theo mặc định, NDK bật Neon.

Tất cả thiết bị Android dựa trên kiến trúc ARMv8 đều hỗ trợ Neon.

NDK có hỗ trợ tính năng biên dịch các mô-đun hoặc thậm chí cả các tệp nguồn cụ thể có hỗ trợ Neon. 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

Bật Neon toàn cục

ndk-build

ndk-build không hỗ trợ chế độ bật Neon toàn cục. Để bật Neon cho một ứng dụng được xây dựng hoàn toàn bằng ndk-build, hãy áp dụng các bước theo mô-đun cho từng mô-đun trong ứng dụng của bạn

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=ON"
            }
        }
    }
}

Bật Neon trên mỗi mô-đun

ndk-build

Để xây dựng tất cả tệp nguồn trong một mô-đun ndk-build bằng NEON, hãy thêm nội dung sau vào phần khai báo mô-đun trong Android.mk:

LOCAL_ARM_NEON := true

CMake

Để xây dựng tất cả tệp nguồn trong một mục tiêu CMake bằng NEON, hãy thêm nội dung sau vào CMakeLists.txt:

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()

Thay thế ${TARGET} bằng tên thư viện của bạn.

Việc xây dựng tất cả tệp nguồn đều hỗ trợ Neon có thể đặc biệt hữu ích nếu bạn muốn xây dựng một thư viện tĩnh hoặc thư viện dùng chung dành riêng cho mã Neon.

Bật Neon trên mỗi tệp nguồn

ndk-build

Khi liệt kê các tệp nguồn cho biến LOCAL_SRC_FILES, bạn có thể lựa chọn sử dụng hậu tố .neon để cho biết rằng bạn muốn xây dựng từng tệp riêng lẻ có hỗ trợ Neon. Ví dụ: đoạn mã sau đây tạo một tệp (foo.c) có hỗ trợ Neon và một tệp khác (bar.c) không có:

LOCAL_SRC_FILES := foo.c.neon bar.c

Bạn có thể kết hợp hậu tố .neon với hậu tố .arm để chỉ định tập lệnh ARM 32 bit (thay vì Thumb2) cho các lệnh không phải Neon. Trong trường hợp này, .arm phải đến trước .neon. Ví dụ: foo.c.arm.neon hoạt động, nhưng foo.c.neon.arm thì không.

CMake

Để xây dựng một tệp nguồn cụ thể bằng Neon, hãy thêm nội dung sau đây vào CMakeLists.txt:

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()

Phát hiện môi trường thời gian chạy

Hầu hết các thiết bị Android dựa trên kiến trúc ARMv7 đều hỗ trợ Neon, bao gồm tất cả các thiết bị đi kèm với API cấp 21 trở lên. Theo mặc định, NDK bật Neon. Để có khả năng tương thích tối đa, mã 32 bit có thể thực hiện việc phát hiện môi trường thời gian chạy để xác nhận rằng mã Neon có thể chạy được trên thiết bị mục tiêu. Ứng dụng có thể thực hiện quy trình kiểm tra này bằng cách sử dụng tuỳ chọn bất kỳ nêu trong nội dung Các tính năng của CPU.

Ngoài ra, 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 này để xem có bao nhiêu thiết bị sẽ bị ảnh hưởng.

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.