여러 아키텍처에 최적화된 NDK 코드를 생성하시겠습니까?
나는 낮은 수치의 크런치를 많이 하는 안드로이드용 C코드를 가지고 있다.생성된 코드가 모든 현재 Android 기기에서 실행될 뿐만 아니라 특정 칩셋에 대한 최적화를 활용하기 위해 어떤 설정(예: 내 Android.mk 및 Application.mk)을 사용해야 하는지 알고 싶다.나는 사용할 좋은 디폴트 Android.mk과 Application.mk 설정을 찾고 있으며, 나의 C 코드를 #ifdef 지점과 함께 낭비하지 않기를 원한다.
예를 들어 ARMv7에는 부동소수점 지침이 있고 일부 ARMv7 칩은 NEO 명령을 지원하며 기본 ARM은 이 두 가지를 모두 지원하지 않는다는 것을 알고 있다.NEON으로 ARMv7, NEON 없이 ARMv7, 기본 ARM 빌드로 빌드할 수 있도록 플래그를 설정할 수 있는가?나는 후자 두 개를 할 줄 알지만 세 개를 다 할 수는 없다.현재 기본값이 가장 안전한 설정이라고 가정할 때 사용하는 설정과 다른 옵션에 어떤 위험이 있는지 주의한다.
GCC별 최적화를 위해 다음 플래그를 사용하십시오.
LOCAL_CFLAGS=-ffast-math -O3 -funroll-loops
이 세 가지 속도 모두 내 코드를 확인했어.다른 공통점이 있을까?
내가 가지고 있는 또 다른 조언은 Android.mk에 "LOCAL_ARM_MODE := Arm"을 추가하여 새로운 암 칩에서 속도를 높일 수 있도록 하는 것이다(그러나 나는 이것이 정확히 무엇을 하고 구형 칩에서 무슨 일이 일어나는지 혼란스럽다).
ARM 프로세서는 "ARM"과 "Tumb"라는 두 가지 일반적인 명령 집합을 가지고 있다.두 가지 맛 모두 다르지만 ARM 지침은 각각 32비트, 엄지손가락 지침은 16비트다.둘 사이의 가장 큰 차이점은 ARM 지침서가 엄지손가락이 할 수 있는 것보다 더 많은 것을 단일 지침으로 할 수 있다는 것이다.예를 들어, 단일 ARM 지침서는 두 번째 레지스터에서 왼쪽 시프트를 수행하는 동안 한 레지스터를 다른 레지스터에 추가할 수 있다.엄지손가락에서 한 지시는 시프트를 해야 하고, 그 다음 두 번째 지시는 추가 작업을 해야 한다.
ARM 지침은 2배는 아니지만, 어떤 경우에는 더 빠를 수 있다.특히 손으로 밀은 ARM 조립체에서는 "무료 변속"을 가장 잘 활용할 수 있는 새로운 방법으로 튜닝할 수 있다.엄지손가락 사용 설명서는 크기뿐만 아니라 배터리 소모량도 적다는 장점이 있다.
어쨌든, 이것이 LOCAL_ARM_MODE가 하는 것이다 - 이것은 당신이 당신의 코드를 엄지손가락 명령 대신에 ARM 명령으로 컴파일한다는 것을 의미한다.NDK에서는 더 작은 이진수를 생성하는 경향이 있고 속도 차이가 대부분의 코드에서 그다지 두드러지지 않기 때문에 엄지손가락으로 컴파일하는 것이 기본값이다.컴파일러는 항상 ARM이 제공할 수 있는 추가 "옴프"를 이용할 수 없기 때문에 결국 같은 수의 지시가 필요하게 된다.
C/C++ 코드에서 ARM 또는 Summer로 컴파일된 결과(barring compiler bugs)는 동일하다.
이 자체만으로도 현재 사용 가능한 모든 안드로이드폰용 새 ARM 프로세서와 구형 ARM 프로세서가 호환된다.이는 기본적으로 NDK가 ARMv5TE 명령 집합을 지원하는 ARM 기반 CPU에 대해 "응용프로그램 이진 인터페이스"로 컴파일되기 때문이다.이 ABI는 "armeabi"로 알려져 있으며, Application.mk에서 명시적으로 설정할 수 있다.APP_ABI := armeabi
.
새로운 프로세서는 Android 고유의 ABI도 지원하며,armeabi-v7a
armeabi를 확장하여 Summe-2 명령 집합과 VFPv3-D16이라고 하는 하드웨어 부동 소수점 명령 집합을 추가할 수 있다. armeabi-v7a 호환 CPU는 또한 선택적으로 NEO 명령 집합을 지원할 수 있다. NEO 명령 집합은 런타임에 확인하고 사용 가능한 시간과 그렇지 않은 경우에 대한 코드 경로를 제공해야 한다.NDK/샘플 디렉토리에 이 작업을 수행하는 예가 있다(Hello-neon).후드 아래에서는 엄지-2의 지시사항이 한 번의 지시로 더 많은 작업을 할 수 있는 동시에 공간을 덜 차지한다는 장점이 있다는 점에서 더 "ARM"하다.
armeabi 및 armeabi-v7a 라이브러리를 모두 포함하는 "뚱뚱한 이진"을 컴파일하려면 Application.mk에 다음을 추가하십시오.
APP_ABI := armeabi armeabi-v7a
.apk 파일이 설치되면 Android 패키지 관리자는 장치에 가장 적합한 라이브러리를 설치한다.그래서 오래된 플랫폼에서는 아르메아비 라이브러리를 설치했고, 새로운 장치에는 아르메아비-v7a를 설치했다.
런타임에 CPU 기능을 테스트하려면 NDK 기능을 사용하십시오.uint64_t android_getCpuFeatures()
프로세서에서 지원되는 기능을 가져오십시오.이렇게 하면 약간 허황된 것이 돌아온다만일.ANDROID_CPU_ARM_FEATURE_ARMv7
V7a 프로세서에서,ANDROID_CPU_ARM_FEATURE_VFPv3
하드웨어 부동 소수점이 지원되는 경우ANDROID_CPU_ARM_FEATURE_NEON
고급 SIMD 지침이 지원되는 경우.ARM은 VFPv3가 없으면 NEON을 가질 수 없다.
요약: 기본적으로 프로그램이 가장 호환된다.LOCAL_ARM_MODE를 사용하면 ARM 명령의 사용으로 인해 배터리 수명을 희생하면서 사물이 약간 더 빨라질 수 있으며, 기본 설정만큼 호환이 가능하다.추가APP_ABI := armeabi armeabi-v7a
새로운 기기에서 성능을 향상시키고 이전 기기와 호환성을 유지하지만 .apk 파일은 (라이브러리가 2개 있기 때문에) 더 커진다.NEO 명령을 사용하려면 런타임에 CPU의 기능을 감지하는 특수 코드를 작성해야 하며, 이는 아르메아비-v7a를 실행할 수 있는 최신 장치에만 적용된다.
좋은 대답이야. 네가 꼭 사용해야 한다고 덧붙이는 것처럼.
APP_ABI := all
이것은 4개의 바이너리, armv5, armv7, x86 및 mips를 컴파일할 것이다.
당신은 새로운 버전의 ndk가 필요할지도 모른다.
참조URL: https://stackoverflow.com/questions/5089783/producing-optimised-ndk-code-for-multiple-architectures
'programing' 카테고리의 다른 글
C 또는 C++가 어레이 < 어레이 + SIZE>를 보증하는가? (0) | 2022.04.21 |
---|---|
Nuxt vuex 상태 메뉴목록:구성 요소에서 정의되지 않음 (0) | 2022.04.21 |
왜 거꾸로 쓰여진 이 코드가 "Hello World!"를 인쇄하는가? (0) | 2022.04.21 |
형식화된 메시지, 개체 배열, 예외를 기록하는 방법 (0) | 2022.04.21 |
왜 우리는 국가 관리를 위해 돌연변이, 세터, 게이터가 필요한가? (0) | 2022.04.21 |