Obsługa neonów

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.