NDK obsługuje standard ARM Advanced SIMD, znany potocznie jako Neon, rozszerzenie zestawu instrukcji dla procesorów ARMv7 i ARMv8. Neonowy znak skalarny/wektorowy instrukcje i rejestry (współdzielone z FPU) porównywalne z MMX/SSE/3DNow! w świecie technologii x86.
Wszystkie urządzenia z Androidem z procesorami ARMv8 („arm64”) obsługują neon. Prawie wszystkie modele oparte na ARMv7 („32-bitowe”) urządzenia z Androidem obsługują neon, w tym wszystkie urządzenia z Interfejs API na poziomie 21 lub nowszym. NDK domyślnie włącza neonowe w obu przypadkach.
Jeśli kierujesz reklamy na bardzo stare urządzenia, możesz odfiltrować niezgodne urządzenia Konsola Google Play. W konsoli możesz też sprawdzić, ile urządzeń.
Aby uzyskać maksymalną zgodność, możesz też uruchomić 32-bitowy kod w czasie działania w celu potwierdzenia, że kod neonowy może zostać uruchomiony na urządzeniu docelowym. Aplikacja może przeprowadź tę kontrolę, używając dowolnej z opcji wymienionych w Funkcje procesora.
Za pomocą Neonowe elementy wewnętrzne w języku C i C++, aby korzystać z rozszerzenia Advanced SIMD. Neon Programmer's Guide for Armv8-A zawiera więcej informacji o neonowej istocie oraz o programowaniu neonów.
Budowanie
Wyłącz globalnie Neon
ndk-build
ndk-build nie obsługuje wyłączania neonów na całym świecie. Aby wyłączyć cały neon ndk-build aplikację, zastosuj kroki poszczególnych modułów w każdym module aplikacji.
CMake
Przekazuj -DANDROID_ARM_NEON=ON
podczas wywoływania CMake. Tworząc z Androidem
Studio lub Gradle, ustaw w pliku build.gradle tę opcję:
android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=OFF"
}
}
}
}
Wyłącz neonowy na moduł
ndk-build
Aby utworzyć wszystkie pliki źródłowe w module ndk-build bez użycia neonów, dodaj atrybut zgodnie z definicją modułu w Android.mk:
LOCAL_ARM_NEON := false
CMake
Aby utworzyć wszystkie pliki źródłowe w miejscu docelowym CMake bez neonu, dodaj do pliku CMakeLists.txt:
if(ANDROID_ABI STREQUAL armeabi-v7a)
set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()
Gdzie ${TARGET}
jest zastępowana nazwą biblioteki.
Obsługa x86 na wielu platformach
NDK obsługuje kompilację istniejących kart ARM SIMD (Neon) na wielu platformach do kodu x86 SSE przy użyciu zewnętrznych funkcji NEON_2_SSE.h Więcej informacji na ten temat można znaleźć w artykule Od ARM NEON po Intel SSE – rozwiązanie do automatycznego przenoszenia oraz porady i wskazówki.
Kod demonstracyjny
Fragment z hello-neonem
zawiera przykład korzystania z biblioteki cpufeatures
i neonowych elementów
z powrotem. W tym przykładzie zastosowano model porównawczy dla pętli filtra FIR
wersji C i wersji zoptymalizowanej pod kątem neonów pod kątem urządzeń obsługujących neon.