Neon 지원

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

API 수준 21 이상으로 출시된 모든 기기를 포함하여 거의 모든 ARMv7 기반 Android 기기에서는 Neon을 지원합니다. NDK에서는 기본적으로 Neon을 사용 설정합니다.

모든 ARMv8 기반 Android 기기는 Neon을 지원합니다.

NDK에서는 Neon 지원을 포함한 모듈 컴파일은 물론 특정 소스 파일까지도 지원합니다. C 및 C++ 코드에서 Neon 내장 함수를 사용하여 고급 SIMD 확장을 활용할 수 있습니다. Armv8-A용 Neon 프로그래머 가이드에서는 일반적으로 Neon 내장 함수 및 Neon 프로그래밍에 관한 자세한 정보를 제공합니다.

빌드

전역으로 Neon 사용 설정

ndk-build

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

CMake

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

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

모듈별 Neon 사용 설정

ndk-build

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

LOCAL_ARM_NEON := true

CMake

Neon으로 CMake 대상에 모든 소스 파일을 빌드하려면 CMakeLists.txt에 다음을 추가하세요.

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

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

특히 Neon 전용 코드를 포함한 정적 라이브러리나 공유 라이브러리를 빌드하려는 경우 Neon 지원 기능으로 모든 소스 파일을 빌드하는 것이 유용할 수 있습니다.

소스 파일별 Neon 사용 설정

ndk-build

LOCAL_SRC_FILES 변수에 대해 소스 파일을 나열할 때 .neon 접미사를 사용하여 Neon 지원으로 개별 파일을 빌드한다고 표시할 수 있습니다. 예를 들어 다음 예에서는 Neon 지원으로 하나의 파일(foo.c)을 빌드하고 다른 하나(bar.c)는 Neon 지원 없이 빌드합니다.

LOCAL_SRC_FILES := foo.c.neon bar.c

.neon 접미사를 .arm 접미사와 결합해도 되는데, 이렇게 하면 Neon 외의 명령에 대하여 Thumb2가 아닌 32비트 ARM 명령 집합을 지정합니다. 이 경우 .arm.neon 앞에 와야 합니다. 예를 들어 foo.c.arm.neon은 유효하지만 foo.c.neon.arm은 유효하지 않습니다.

CMake

Neon으로 특정 소스 파일을 빌드하려면 CMakeLists.txt에 다음을 추가하세요.

if(ANDROID_ABI STREQUAL armeabi-v7a)
    set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -mfpu=neon)
endif()

런타임 검색

API 수준 21 이상으로 출시된 모든 기기를 포함하여 거의 모든 ARMv7 기반 Android 기기에서는 Neon을 지원합니다. NDK에서는 기본적으로 Neon을 사용 설정합니다. 호환성을 최대화하기 위해 32비트 코드는 런타임 검색을 실행하여 Neon 코드가 대상 기기에서 실행되는지 확인할 수 있습니다. 앱은 CPU 기능에서 언급한 옵션을 사용하여 이 확인을 실행할 수 있습니다.

또는 Google Play Console에서 호환되지 않는 기기를 필터링할 수 있습니다. 콘솔을 사용하여 얼마나 많은 기기가 영향을 받지 않는지 확인할 수도 있습니다.

x86의 크로스 플랫폼 지원

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

샘플 코드

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