Neon 지원

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

모든 ARMv8 기반('arm64') Android 기기는 Neon을 지원합니다. 거의 모든 ARMv7 기반 ('32비트') Android 기기는 Neon을 지원하며 API 수준 21 이상 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 필터 루프를 위한 아주 작은 벤치마크를 구현합니다.