การสนับสนุน Neon

NDK รองรับ ARM Advanced SIMD ซึ่งโดยทั่วไปเรียกว่า Neon ซึ่งเป็นส่วนขยายชุดคำสั่งที่ไม่บังคับสำหรับ ARMv7 และ ARMv8 Neon มีคำสั่งและรีจิสเตอร์แบบสเกลาร์/เวกเตอร์ (ใช้ร่วมกับ FPU) ที่เทียบเท่ากับ MMX/SSE/3DNow! ในโลก x86

อุปกรณ์ Android ทั้งหมดที่ใช้ ARMv8 ("arm64") รองรับ Neon อุปกรณ์ Android ที่ใช้ ARMv7 ("32 บิต") เกือบทั้งหมดรองรับ Neon รวมถึงอุปกรณ์ทั้งหมดที่จัดส่งพร้อม API ระดับ 21 ขึ้นไป NDK จะเปิดใช้ Neon โดยค่าเริ่มต้นสำหรับทั้ง ABI ของ Arm

หากกำหนดเป้าหมายเป็นอุปกรณ์รุ่นเก่ามาก คุณสามารถกรองอุปกรณ์ที่ไม่รองรับใน Google Play Console ได้ นอกจากนี้ คุณยังใช้คอนโซลสำหรับแอปเพื่อดูจำนวนอุปกรณ์ที่จะได้รับผลกระทบได้ด้วย

หรือหากต้องการความเข้ากันได้สูงสุด โค้ด 32 บิตสามารถทำการตรวจหารันไทม์ เพื่อยืนยันว่าโค้ด Neon สามารถเรียกใช้ในอุปกรณ์เป้าหมายได้ แอปสามารถ ทำการตรวจสอบนี้โดยใช้ตัวเลือกใดก็ได้ที่ระบุไว้ใน ฟีเจอร์ของ CPU

คุณไม่ควรเขียนฟังก์ชัน Neon ที่ชัดเจนในโค้ด C/C++ ประเภทเวกเตอร์แบบพกพาของ Clang จะใช้คำสั่ง Neon โดยอัตโนมัติ Intrinsic ของ Neon ใน Clang เป็นเพียง Wrapper ที่ใช้กับประเภทแบบพกพาซึ่งไม่สามารถพกพาได้ ดังนั้นการเขียน Intrinsic ของ Neon จะไม่ทำให้โค้ดเร็วขึ้นกว่าการใช้ ประเภทแบบพกพา เพียงแต่จะพกพาได้น้อยลง

สร้าง

ปิดใช้ Neon ทั่วโลก

ndk-build

ndk-build ไม่รองรับการปิดใช้ Neon ทั่วโลก หากต้องการปิดใช้ Neon ในแอปพลิเคชัน ndk-build ทั้งหมด ให้ทำตามขั้นตอนต่อโมดูลกับทุกโมดูลในแอปพลิเคชัน

CMake

ส่ง -DANDROID_ARM_NEON=ON เมื่อเรียกใช้ CMake หากสร้างด้วย Android Studio/Gradle ให้ตั้งค่าตัวเลือกต่อไปนี้ใน build.gradle

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

ปิดใช้ Neon ต่อโมดูล

ndk-build

หากต้องการสร้างไฟล์แหล่งที่มาทั้งหมดในโมดูล ndk-build โดยไม่มี Neon ให้เพิ่ม รายการต่อไปนี้ลงในการกำหนดโมดูลใน Android.mk

LOCAL_ARM_NEON := false

CMake

หากต้องการสร้างไฟล์ต้นฉบับทั้งหมดในเป้าหมาย CMake โดยไม่มี Neon ให้เพิ่มข้อมูลต่อไปนี้ลงใน CMakeLists.txt

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

โดย ${TARGET} จะแทนที่ด้วยชื่อของไลบรารี

การรองรับข้ามแพลตฟอร์มสำหรับ x86

NDK รองรับการคอมไพล์ฟังก์ชัน ARM SIMD (Neon) Intrinsic ที่มีอยู่ข้ามแพลตฟอร์มเป็นโค้ด x86 SSE โดยใช้ NEON_2_SSE.h ของบุคคลที่สาม ดูข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ได้ที่ จาก ARM NEON ไปยัง Intel SSE - โซลูชันการพอร์ตอัตโนมัติ เคล็ดลับและเทคนิค

โค้ดตัวอย่าง

ตัวอย่างการแปลงเป็นเวกเตอร์แสดงวิธีใช้เครื่องมือการแปลงเป็นเวกเตอร์ ที่หลากหลายเพื่อใช้การคูณเมทริกซ์ และเปรียบเทียบประสิทธิภาพของเครื่องมือเหล่านั้น