Dukungan Neon

NDK mendukung ARM Advanced SIMD, yang umumnya disebut Neon, yakni ekstensi kumpulan petunjuk opsional untuk ARMv7 dan ARMv8. Neon menyediakan petunjuk dan register skalar/vektor (digunakan bersama FPU) yang setara dengan MMX/SSE/3DNow! pada platform x86.

Semua perangkat Android berbasis ARMv8 ("arm64") mendukung Neon. Hampir semua berbasis ARMv7 Perangkat Android ("32-bit") mendukung Neon, termasuk semua perangkat yang dikirimkan dengan API level 21 atau yang lebih baru. NDK mengaktifkan Neon secara default untuk keduanya.

Jika Anda menargetkan perangkat yang sangat lama, Anda dapat memfilter perangkat yang tidak kompatibel di Konsol Google Play. Anda juga dapat menggunakan konsol untuk aplikasi Anda guna melihat berapa banyak perangkat yang akan terpengaruh.

Atau, untuk kompatibilitas maksimum, kode 32-bit dapat melakukan runtime deteksi untuk mengonfirmasi bahwa kode Neon dapat dijalankan di perangkat target. Aplikasi dapat melakukan pemeriksaan ini menggunakan salah satu opsi yang disebutkan dalam Fitur CPU.

Anda dapat menggunakan intrinsik Neon dalam kode C dan C++ untuk memanfaatkan ekstensi Advanced SIMD. Panduan Programmer Neon untuk Armv8-A memberikan informasi selengkapnya tentang intrinsik Neon dan pemrograman Neon secara umum.

Build

Nonaktifkan Neon secara global

ndk-build

ndk-build tidak mendukung penonaktifan Neon secara global. Untuk menonaktifkan Neon di seluruh ndk-build, terapkan langkah per modul ke setiap modul aplikasi.

CMake

Teruskan -DANDROID_ARM_NEON=ON saat memanggil CMake. Jika mem-build dengan Android Studio/Gradle, tetapkan opsi berikut dalam build.gradle:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_ARM_NEON=OFF"
            }
        }
    }
}

Nonaktifkan Neon per modul

ndk-build

Untuk mem-build semua file sumber dalam modul ndk-build tanpa Neon, tambahkan berikut ke definisi modul dalam Android.mk Anda:

LOCAL_ARM_NEON := false

CMake

Untuk membangun semua file sumber dalam target CMake tanpa Neon, tambahkan berikut ke CMakeLists.txt:

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

Ganti ${TARGET} dengan nama library Anda.

Dukungan lintas platform untuk x86

NDK mendukung kompilasi lintas platform fungsi intrinsik ARM SIMD (Neon) yang ada ke dalam kode SSE x86, melalui penggunaan NEON_2_SSE.h pihak ketiga. Untuk informasi selengkapnya tentang topik ini, lihat Dari ARM NEON ke Intel® SSE - solusi porting otomatis, tips dan trik.

Kode contoh

Contoh hello-neon menunjukkan cara menggunakan intrinsik NEON dan library cpufeatures secara bersamaan. Contoh ini mengimplementasikan tolok ukur kecil untuk loop filter FIR dengan versi C dan versi yang dioptimalkan untuk Neon bagi perangkat yang mendukung Neon.