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.
Hampir semua perangkat Android berbasis ARMv7 mendukung Neon, termasuk semua perangkat yang dikirimkan dengan level API 21 atau yang lebih baru. NDK mengaktifkan Neon secara default.
Semua perangkat Android berbasis ARMv8 mendukung Neon.
NDK mendukung kompilasi modul, atau bahkan file sumber spesifik, dengan dukungan Neon. 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
Mengaktifkan Neon secara global
ndk-build
ndk-build tidak mendukung pengaktifan Neon secara global. Jika ingin mengaktifkan Neon untuk aplikasi ndk-build secara keseluruhan, 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=ON"
}
}
}
}
Mengaktifkan Neon per modul
ndk-build
Untuk mem-build semua file sumber dalam modul ndk-build dengan NEON, tambahkan baris berikut ke definisi modul dalam Android.mk Anda:
LOCAL_ARM_NEON := true
CMake
Untuk mem-build semua file sumber dalam target CMake dengan NEON, tambahkan baris berikut ke CMakeLists.txt Anda:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()
Ganti ${TARGET}
dengan nama library Anda.
Mem-build semua file sumber dengan dukungan Neon dapat sangat berguna jika Anda ingin mem-build library statis atau bersama yang khususnya hanya berisi kode Neon.
Mengaktifkan Neon per file sumber
ndk-build
Saat mencantumkan file sumber untuk variabel LOCAL_SRC_FILES
, Anda memiliki opsi untuk menggunakan akhiran .neon
guna menunjukkan bahwa Anda ingin mem-build file individual dengan dukungan Neon. Misalnya, baris berikut akan mem-build satu file (foo.c
) dengan dukungan Neon dan satu file lagi (bar.c
) tanpa dukungan Neon:
LOCAL_SRC_FILES := foo.c.neon bar.c
Anda dapat menggabungkan akhiran .neon
dengan akhiran .arm
, yang menentukan kumpulan petunjuk ARM 32 bit (bukan Thumb2) untuk petunjuk non-Neon.
Dalam kasus semacam itu, .arm
harus ditulis sebelum .neon
. Misalnya: foo.c.arm.neon
akan berfungsi, tetapi foo.c.neon.arm
tidak.
CMake
Untuk mem-build file sumber khusus dengan Neon, tambahkan baris berikut ke CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()
Deteksi runtime
Hampir semua perangkat Android berbasis ARMv7 mendukung Neon, termasuk semua perangkat yang dikirimkan dengan level API 21 atau yang lebih baru. NDK mengaktifkan Neon secara default. Untuk mendapatkan kompatibilitas maksimum, kode 32 bit dapat melakukan deteksi waktu proses untuk memastikan bahwa kode Neon dapat dijalankan di perangkat target. Aplikasi dapat menjalankan pemeriksaan ini menggunakan salah satu opsi yang disebutkan dalam fitur CPU.
Sebagai alternatif, Anda dapat memfilter perangkat yang tidak kompatibel di Konsol Google Play. Anda juga dapat menggunakan konsol tersebut untuk melihat jumlah perangkat yang akan terpengaruh.
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.