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 perangkat Android berbasis ARMv7 ("32-bit") mendukung Neon, termasuk semua perangkat yang dikirimkan dengan level API 21 atau yang lebih baru. NDK mengaktifkan Neon secara default untuk keduanya.

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

Atau, untuk mendapatkan kompatibilitas maksimum, kode 32-bit dapat melakukan deteksi runtime 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

Menonaktifkan Neon secara global

ndk-build

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

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

Menonaktifkan Neon per modul

ndk-build

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

LOCAL_ARM_NEON := false

CMake

Untuk mem-build semua file sumber dalam target CMake tanpa Neon, tambahkan baris 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.