NDK obsługuje kartę SIM ARM Advanced, powszechnie znaną jako Neon, jest opcjonalnym rozszerzeniem zestawu instrukcji dla ARMv7 i ARMv8. Neon udostępnia instrukcje dotyczące skalarnych/wektorów oraz rejestry (udostępniane z FPU) porównywalne z MMX/SSE/3DNow! w świecie x86.
Wszystkie urządzenia z Androidem i procesorami ARMv8 („arm64”) obsługują Neon. Prawie wszystkie urządzenia z Androidem z procesorami ARMv7 („32-bitowymi”) obsługują Neon, w tym wszystkie urządzenia z interfejsem API na poziomie 21 lub nowszym. NDK pozwala domyślnie włączyć neon w obu wersjach.
Jeśli kierujesz reklamy na bardzo stare urządzenia, możesz odfiltrować niezgodne urządzenia w Konsoli Google Play. W konsoli aplikacji możesz też sprawdzić, na ile urządzeń ta zmiana będzie miała wpływ.
Jeśli chcesz uzyskać maksymalną zgodność, 32-bitowy kod może wykrywać środowisko w czasie działania, aby potwierdzić, że kod neonowy może być uruchomiony na urządzeniu docelowym. Aplikacja może przeprowadzić to sprawdzenie, korzystając z dowolnej opcji wymienionej w sekcji Funkcje procesora.
Aby skorzystać z rozszerzenia Advanced SIMD, możesz użyć Neon intrinsics w języku C i C++. Poradnik Neon Programmer's Guide for Armv8-A zawiera więcej informacji o włoskości neonów i ogólnej tematyce programowania.
Budowanie
Wyłącz neon globalnie
NK Build
Narzędzie ndk-build nie obsługuje globalnie wyłączenia neonu. Aby wyłączyć neon w całej aplikacji ndk-build, zastosuj kroki dla każdego modułu do każdego modułu w aplikacji.
CMake
Przekaż -DANDROID_ARM_NEON=ON
przy wywołaniu CMake. Jeśli tworzysz kompilację przy użyciu Android Studio/Gradle, w pliku build.gradle ustaw tę opcję:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
Wyłącz neony na moduł
NK Build
Aby skompilować wszystkie pliki źródłowe w module ndk-build bez Neonu, dodaj ten kod do definicji modułu w pliku Android.mk:
LOCAL_ARM_NEON := false
CMake
Aby skompilować wszystkie pliki źródłowe w miejscu docelowym CMake bez Neon, dodaj do pliku CMakeLists.txt ten kod:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
Gdzie ${TARGET}
jest zastępowane nazwą biblioteki.
Obsługa wielu platform x86
NDK umożliwia kompilację na wielu platformach istniejących funkcji instrukcyjnych ARM SIMD (Neon) w kod x86 SSE przy użyciu zewnętrznego rozwiązania NEON_2_SSE.h. Więcej informacji na ten temat znajdziesz w artykule Od ARM NEON do Intel SSE – rozwiązanie do automatycznego przenoszenia, wskazówki i wskazówki.
Kod demonstracyjny
Przykład hello-neon pokazuje, jak jednocześnie korzystać z biblioteki cpufeatures
i właściwości Neon. W tym przykładzie wdrożono niewielką wersję porównawczą dla pętli filtra FIR z wersją C oraz wersję zoptymalizowaną pod kątem urządzeń obsługujących neony.