Neon 지원

NDK에서는 ARMv7 및 ARMv8용 선택적 명령 집합 확장인 ARM 고급 SIMD(통칭 Neon)를 지원합니다. NEON은 x86의 MMX/SSE/3DNow!와 유사한 스칼라/벡터 명령 및 레지스터(FPU와 공유)를 제공합니다.

모든 ARMv8 기반 ('arm64') Android 기기는 Neon을 지원합니다. API 수준 21 이상으로 출시된 모든 기기를 포함하여 거의 모든 ARMv7 기반('32비트') Android 기기는 Neon을 지원합니다. NDK는 기본적으로 두 가지 모두에 Neon을 사용 설정합니다.

매우 오래된 기기를 타겟팅한다면 Google Play Console에서 호환되지 않는 기기를 필터링할 수 있습니다. 앱의 콘솔을 사용하여 영향을 받는 기기 수를 확인할 수도 있습니다.

또는 호환성을 최대화하기 위해 32비트 코드는 런타임 감지를 실행하여 Neon 코드가 대상 기기에서 실행되는지 확인할 수 있습니다. 앱은 CPU 기능에서 언급한 옵션을 사용하여 이 확인을 실행할 수 있습니다.

C 및 C++ 코드에서 Neon 내장 함수를 사용하여 고급 SIMD 확장을 활용할 수 있습니다. Armv8-A용 Neon 프로그래머 가이드에서는 일반적으로 Neon 내장 함수 및 Neon 프로그래밍에 관한 자세한 정보를 제공합니다.

빌드

전역적으로 Neon 사용 중지

ndk-build

ndk-build는 Neon 전역 사용 중지를 지원하지 않습니다. Neon을 전체 ndk-build 애플리케이션에서 사용 중지하려면 애플리케이션의 모든 모듈에 모듈별 단계를 적용합니다.

CMake

CMake를 호출할 때 -DANDROID_ARM_NEON=ON를 전달합니다. Android 스튜디오/Gradle로 빌드한다면 build.gradle에서 다음 옵션을 설정합니다.

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_ARM_NEON=OFF"
            }
        }
    }
}

모듈별 Neon 사용 중지

ndk-build

Neon 없이 ndk-build 모듈의 모든 소스 파일을 빌드하려면 Android.mk의 모듈 정의에 다음을 추가하세요.

LOCAL_ARM_NEON := false

CMake

Neon 없이 CMake 타겟의 모든 소스 파일을 빌드하려면 CMakeLists.txt에 다음을 추가하세요.

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_target_properties(${TARGET} PROPERTIES COMPILE_FLAGS -mfpu=vfpv3-d16)
endif()

${TARGET}이 라이브러리 이름을 대체하는 위치

x86의 크로스 플랫폼 지원

NDK에서는 제3자 NEON_2_SSE.h를 사용하여 기존 ARM SIMD(NEON) 내장 함수를 x86 SSE 코드로 크로스 플랫폼 컴파일할 수 있습니다. 이 주제에 관한 자세한 내용은 ARM NEON에서 Intel SSE로의 자동 포팅 솔루션, 도움말 및 유용한 정보를 참조하세요.

샘플 코드

hello-neon 샘플에서는 cpufeatures 라이브러리와 Neon 내장 함수를 동시에 사용하는 방법의 예를 제공합니다. 이 샘플에서는 Neon을 지원하는 기기에서 C 버전 및 Neon에 최적화된 버전으로 FIR 필터 루프를 위한 아주 작은 벤치마크를 구현합니다.