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는 Neo 전역 사용 중지를 지원하지 않습니다. 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로의 자동 포팅 솔루션, 도움말 및 유용한 정보를 참조하세요.
샘플 코드
벡터화 샘플에서는 다양한 벡터화 도구를 사용하여 행렬 곱셈을 구현하는 방법을 보여주고 성능을 비교합니다.