Hỗ trợ Neon

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 thiết bị Android dựa trên ARMv7 ("32 bit") đề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 cho cả hai ABI của Arm.

Nếu nhắm đến các thiết bị rất 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 có bao nhiêu thiết bị sẽ bị ảnh hưởng.

Ngoài ra, để 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.

Bạn không nên viết hàm nội tại Neon rõ ràng trong mã C/C++. Các loại vectơ di động của Clang sẽ tự động sử dụng các chỉ dẫn Neon. Các hàm nội tại Neon của Clang thực ra chỉ là một trình bao bọc không di động xung quanh các loại di động, vì vậy việc viết các hàm nội tại Neon sẽ không làm cho mã của bạn nhanh hơn so với việc sử dụng các loại di động, chỉ là ít di động hơn.

Tạo

Tắt Neon toàn cục

ndk-build

ndk-build không hỗ trợ chế độ tắt Neon toàn cục. Để tắ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=OFF"
            }
        }
    }
}

Tắ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 mà không có Neon, hãy thêm nội dung sau vào phần khai báo mô-đun trong Android.mk:

LOCAL_ARM_NEON := false

CMake

Để xây dựng tất cả tệp nguồn trong một mục tiêu CMake mà không có 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=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ã mẫu

Mẫu vectơ hoá minh hoạ cách sử dụng nhiều công cụ vectơ hoá để triển khai phép nhân ma trận và so sánh hiệu suất của các công cụ đó.