Obsługa neonów

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.