Obsługa neonów

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ść.