Neon 지원

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

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

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

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

C/C++ 코드에 명시적 Neon 내장 함수를 작성해서는 안 됩니다. Clang의 휴대용 벡터 유형은 Neon 명령어를 자동으로 사용합니다. Clang의 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로의 자동 포팅 솔루션, 도움말 및 유용한 정보를 참조하세요.

샘플 코드

벡터화 샘플은 다양한 벡터화 도구를 사용하여 행렬 곱셈을 구현하는 방법을 보여주고 성능을 비교합니다.