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
คุณไม่ควรเขียนฟังก์ชัน Intrinsics ของ 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 - โซลูชัน เคล็ดลับ และเทคนิคการพอร์ตอัตโนมัติ
โค้ดตัวอย่าง
ตัวอย่างการเวกเตอร์แสดงวิธีใช้เครื่องมือการเวกเตอร์ ต่างๆ เพื่อใช้การคูณเมทริกซ์ และเปรียบเทียบประสิทธิภาพของเครื่องมือเหล่านั้น