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.
אם אתם מטargetים מכשירים ישנים מאוד, אתם יכולים לסנן מכשירים לא תואמים ב-Google Play Console. אפשר גם להשתמש במסוף של האפליקציה כדי לראות על כמה מכשירים זה ישפיע.
לחלופין, כדי להשיג תאימות מקסימלית, קוד 32 ביט יכול לבצע זיהוי בזמן ריצה כדי לוודא שאפשר להריץ קוד Neon במכשיר היעד. אפליקציה יכולה לבצע את הבדיקה הזו באמצעות אחת מהאפשרויות שמוזכרות בקטע תכונות של CPU.
לא מומלץ לכתוב פונקציות Neon intrinsics מפורשות בקוד C/C++. portable vector types של Clang ישתמשו אוטומטית בהוראות Neon. הפונקציות הפנימיות של Neon ב-Clang הן למעשה רק wrapper לא נייד סביב הסוגים הניידים, כך שכתיבת פונקציות פנימיות של Neon לא תגרום לקוד לפעול מהר יותר מאשר שימוש בסוגים הניידים, אלא רק יהפוך אותו לנייד פחות.
תכנות
השבתה של Neon בכל העולם
ndk-build
ndk-build לא תומך בהשבתה של Neon באופן גלובלי. כדי להשבית את Neon באפליקציית NDK-build שלמה, צריך להחיל את השלבים לכל מודול על כל מודול באפליקציה.
CMake
מעבירים את -DANDROID_ARM_NEON=ON
כשמפעילים את CMake. אם מבצעים build באמצעות 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) לקוד x86 SSE, באמצעות השימוש ב-NEON_2_SSE.h של צד שלישי. מידע נוסף בנושא הזה זמין במאמר From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks.
קוד לדוגמה
הדוגמה לוקטוריזציה מדגימה איך להשתמש במגוון כלים לוקטוריזציה כדי להטמיע כפל מטריצות, ומשווה את הביצועים שלהם.