NEON 지원

NDK에서는 ARMv7 및 ARMv8용 선택적 명령 집합 확장인 ARM 고급 SIMD(통칭 NEON)를 지원합니다. NEON은 x86 환경에서 MMX/SSE/3DNow!와 비슷한 스칼라/벡터 명령과 레지스터(FPU와 공유)를 제공합니다. NEON이 작동하려면 VFPv3-D32(최소 16개가 아니라 32개의 하드웨어 FPU 64비트 레지스터)가 필요합니다.

일부 ARMv7 기반 Android 기기에서는 NEON을 지원하지 않지만, NEON을 지원하는 기기에서는 스칼라/벡터 명령이 지원되어 상당한 이점을 누릴 수 있습니다.

NDK에서는 NEON 지원을 포함한 모듈 컴파일은 물론 특정 소스 파일까지도 지원합니다.

LOCAL_ARM_NEON 사용

NDK에서 NEON을 지원하는 것으로 가정하는 모든 소스 파일을 빌드하도록 하려면 모듈 정의에 다음 줄을 포함하세요. makefile LOCAL_ARM_NEON := true

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

.neon 접미사 사용

LOCAL_SRC_FILES 변수의 소스 파일을 표시할 때 옵션으로 .neon 접미사를 사용하면 개별 파일을 NEON 지원으로 빌드하려는 의도를 나타낼 수 있습니다. 다음 예에서는 NEON 지원으로 파일 하나(foo.c)를 빌드하고 다른 하나(bar.c)는 NEON 지원 없이 빌드합니다. makefile LOCAL_SRC_FILES := foo.c.neon bar.c

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

빌드 요구사항

NEON 지원은 armeabi-v7aarm64-v8a ABI와 함께 작동합니다. NEON 지원으로 빌드를 시도하는 동안 다른 ABI를 발견하면 NDK 빌드 스크립트가 종료됩니다. Android.mk 파일에서 다음과 같은 검사 기능을 사용하는 것이 중요합니다.

# define a static library containing our NEON code
    ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
    include $(CLEAR_VARS)
    LOCAL_MODULE    := mylib-neon
    LOCAL_SRC_FILES := mylib-neon.c
    LOCAL_ARM_NEON  := true
    include $(BUILD_STATIC_LIBRARY)
    endif # TARGET_ARCH_ABI == armeabi-v7a
    

런타임 검색

앱에서 런타임 검색을 수행하여 대상 기기에서 NEON 지원 기계어 코드를 실행할 수 있는지 확인해야 합니다. 모든 ARMv7 기반 Android 기기에서 NEON을 지원하지는 않기 때문입니다. 앱에서는 cpufeatures 라이브러리를 사용해 이러한 검사를 수행할 수 있으며, 이 라이브러리는 NDK와 함께 제공됩니다.

android_getCpuFamily()에서 ANDROID_CPU_FAMILY_ARM을 반환하고, android_getCpuFeatures()에서는 ANDROID_CPU_ARM_FEATURE_NEON 플래그 집합이 포함된 값을 반환하는지 확인해야 합니다. 예:

    #include <cpu-features.h>
    ...
    ...
    if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&
        (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0)
    {
        // use NEON-optimized routines
        ...
    }
    else
    {
        // use non-NEON fallback routines instead
        ...
    }

    ...
    

x86의 플랫폼 간 지원

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

샘플 코드

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