Dukungan NEON

NDK mendukung ARM Advanced SIMD, umumnya disebut NEON, sebuah ekstensi set instruksi opsional untuk ARMv7 dan ARMv8. NEON menyediakan instruksi dan register skalar/vektor (digunakan bersama FPU) yang setara dengan MMX/SSE/3DNow! pada platform x86. Untuk memfungsikannya, diperlukan hardware VFPv3-D32 (32 register 64-bit FPU hardware, bukan minimum 16 bit).

Tidak semua perangkat Android berbasis ARMv7 mendukung NEON, tetapi perangkat yang mendukung NEON bisa banyak diuntungkan dari dukungannya untuk instruksi skalar/vektor.

NDK mendukung kompilasi modul, atau bahkan file sumber tertentu, dengan dukungan NEON.

Menggunakan LOCAL_ARM_NEON

Agar NDK membuat semua file sumber dengan dukungan NEON, sertakan baris berikut dalam definisi modul: makefile LOCAL_ARM_NEON := true

Membuat semua file sumber dengan dukungan NEON dapat sangat berguna jika Anda ingin membuat library statis atau library bersama yang khusus memuat kode NEON.

Menggunakan Akhiran .neon

Saat mencantumkan file sumber untuk variabel LOCAL_SRC_FILES, Anda memiliki opsi untuk menggunakan akhiran .neon guna menunjukkan bahwa Anda ingin membuat file individual dengan dukungan NEON. Misalnya, kode berikut membuat satu file dengan dukungan NEON (foo.c) dan satu file lagi yang tanpa dukungan NEON (bar.c): makefile LOCAL_SRC_FILES := foo.c.neon bar.c

Anda dapat menggabungkan akhiran .neon dengan akhiran .arm, yang menentukan set instruksi ARM 32-bit (bukan Thumb2) untuk instruksi non-NEON. Dalam kasus semacam itu, .arm harus ditulis sebelum .neon. Misalnya: foo.c.arm.neon akan berfungsi, tetapi foo.c.neon.arm tidak.

Persyaratan Build

Dukungan NEON berfungsi dengan ABI armeabi-v7a dan arm64-v8a. Jika skrip build NDK menemukan ABI lain saat berupaya membuat file dengan dukungan NEON, skrip build NDK akan keluar. Penting untuk menggunakan pemeriksaan seperti berikut ini pada file Android.mk Anda:

# define a static library containing our NEON code
    ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
    include $(CLEAR_VARS)
    LOCAL_MODULE    := mylib-neon
    LOCAL_SRC_FILES := mylib-neon.c
    LOCAL_ARM_NEON  := true
    include $(BUILD_STATIC_LIBRARY)
    endif # TARGET_ARCH_ABI == armeabi-v7a
    

Deteksi Runtime

Aplikasi Anda harus melakukan deteksi runtime untuk mengonfirmasi bahwa kode mesin yang berkemampuan NEON dapat dijalankan pada perangkat target. Hal ini karena tidak semua perangkat Android berbasis ARMv7 mendukung NEON. Aplikasi dapat menjalankan pemeriksaan ini menggunakan library cpufeatures yang disertakan dengan NDK.

Anda perlu memastikan bahwa android_getCpuFamily() menampilkan ANDROID_CPU_FAMILY_ARM dan bahwa android_getCpuFeatures() menampilkan nilai dengan kumpulan tanda ANDROID_CPU_ARM_FEATURE_NEON. Contoh:

    #include <cpu-features.h>
    ...
    ...
    if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&
        (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0)
    {
        // use NEON-optimized routines
        ...
    }
    else
    {
        // use non-NEON fallback routines instead
        ...
    }

    ...
    

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 lebih lanjut tentang topik ini, baca Dari ARM NEON ke Intel SSE - tips, trik, dan solusi porting otomatis.

Kode Sampel

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