NDK obsługuje ARM Advanced SIMD, czyli Neon, opcjonalne rozszerzenie zestawu instrukcji dla ARMv7 i ARMv8. Neon udostępnia instrukcje skalarne/wektorowe i rejestry (współdzielone z FPU) porównywalne z MMX/SSE/3DNow! w świecie x86.
Wszystkie urządzenia z Androidem oparte na architekturze ARMv8 („arm64”) obsługują Neon. Prawie wszystkie urządzenia z Androidem oparte na architekturze ARMv7 („32-bitowej”) obsługują Neon, w tym wszystkie urządzenia dostarczane z poziomem interfejsu API 21 lub nowszym. NDK domyślnie włącza Neon dla obu interfejsów ABI Arm.
Jeśli kierujesz reklamy na bardzo stare urządzenia, możesz odfiltrować niekompatybilne urządzenia w Konsoli Google Play. W konsoli aplikacji możesz też sprawdzić, na ilu urządzeniach będzie to miało wpływ.
Aby zapewnić maksymalną zgodność, kod 32-bitowy może przeprowadzać wykrywanie w czasie działania, aby potwierdzić, że kod Neon może być uruchamiany na urządzeniu docelowym. Aplikacja może przeprowadzić to sprawdzenie za pomocą dowolnej z opcji wymienionych w sekcji Funkcje procesora.
Nie należy pisać w kodzie C/C++ jawnych funkcji wewnętrznych Neon. Przenośne typy wektorowe Clang będą automatycznie korzystać z instrukcji Neon. Funkcje wewnętrzne Neon Clang to w rzeczywistości tylko nieprzenośna otoczka wokół przenośnych typów, więc pisanie funkcji wewnętrznych Neon nie przyspieszy kodu w porównaniu z używaniem typów przenośnych, a jedynie zmniejszy jego przenośność.
Koduj
Wyłączanie Neon na całym świecie
ndk-build
ndk-build nie obsługuje globalnego wyłączania Neon. Aby wyłączyć Neon w całej aplikacji ndk-build, wykonaj czynności dotyczące poszczególnych modułów w każdym module aplikacji.
CMake
Podczas wywoływania CMake przekaż -DANDROID_ARM_NEON=ON
. Jeśli kompilujesz za pomocą Androida Studio lub Gradle, ustaw w pliku build.gradle tę opcję:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
Wyłączanie Neon dla poszczególnych modułów
ndk-build
Aby skompilować wszystkie pliki źródłowe w module ndk-build bez Neon, dodaj do definicji modułu w pliku Android.mk ten wiersz:
LOCAL_ARM_NEON := false
CMake
Aby skompilować wszystkie pliki źródłowe w obiekcie CMake bez Neon, dodaj do pliku CMakeLists.txt ten wiersz:
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 różnych platform w przypadku architektury x86
NDK obsługuje kompilację międzyplatformową istniejących funkcji wewnętrznych ARM SIMD (Neon) do kodu x86 SSE za pomocą zewnętrznego pliku NEON_2_SSE.h. Więcej informacji na ten temat znajdziesz w artykule From ARM NEON to Intel SSE-the automatic porting solution, tips and tricks (artykuł w języku angielskim).
Kod demonstracyjny
Przykładowa wektoryzacja pokazuje, jak za pomocą różnych narzędzi do wektoryzacji zaimplementować mnożenie macierzy, i porównuje ich wydajność.