Dukungan Neon

NDK mendukung ARM Advanced SIMD, yang umumnya disebut Neon, sebuah 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.

Tidak semua perangkat Android berbasis ARMv7 mendukung Neon, tetapi perangkat yang mendukung Neon dapat banyak diuntungkan dari dukungannya untuk petunjuk skalar/vektor.

Semua perangkat 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 menyediakan informasi selengkapnya tentang intrinsik Neon dan pemrograman Neon secara umum.

Mem-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 project dengan Android Studio/Gradle, tetapkan opsi berikut di build.gradle Anda:

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 library bersama yang khusus memuat 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 Anda:

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

Deteksi Waktu Proses

Tidak semua perangkat Android berbasis ARMv7 mendukung Neon. Untuk mendapatkan kompatibilitas maksimum, kode 32 bit harus 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 Menangani fitur-fitur CPU.

Sebagai alternatif, Anda dapat memfilter perangkat yang tidak kompatibel di Konsol Google Play. Anda juga dapat menggunakan konsol ini untuk melihat jumlah perangkat yang akan terpengaruh.

Dukungan Lintas Platform untuk x86

NDK mendukung kompilasi lintas platform dari 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.

Contoh Kode

Contoh hello-neon ini 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.