2011-01-28 1 views
1

EABI와 함께 GCC를 사용하는 ARM-CPU 타겟에 대한 특별한 C 프로그래밍 기술에 대한 조언이 필요합니다. 내 응용 프로그램에는 대형 데이터 배열에 대한 부동 소수점 집중 계산이 포함되어 있습니다. 주요 목표는 가장 빠른 실행 파일을 얻는 것입니다. 주로, codesourcery와 android-ndk의 arm-eabi-gcc 버전을 사용합니다. 또한 네온 내장 함수를 사용하거나 다른 아키텍처의 다른 컴파일러와 호환되지 않는 C 코드의 변경 (IA32 용 인텔 컴파일러와 같은)을 원하지 않습니다.ARM (EABI) 아키텍처를위한 특별한 C 레벨 프로그래밍 기법이 있습니까?

+0

Android의 경우 VFP 하드웨어가 매우 일반적입니다. NDK는 "soft"FP (armv5te) 및 "hard"FP (armv7-a)를 대상으로합니다. 당신은 어떤 종류의 장치를 목표로 삼고 있는지 말하지 않았습니다. – fadden

+0

@fadden : 서로 다른 프로세서 중 일부는 NEON SIMD 명령어를 지원하고 일부는 부동 소수점 보조 프로세서를 지원하지 않습니다. 대부분 ARM v5, v6, v7 Cortex A8/A9. – psihodelia

답변

3

이식성을 유지하려면 "부동 소수점 사용 금지"라고 조언하십시오. 대부분의 ARM 칩에는 FPU가 없으므로 소프트웨어에서 연산을 에뮬레이트해야합니다.

일반적으로 벤치 마크, 변경 및 벤치 마크. 성능 측정 전/후의 철저한 성능 최적화는 효과가 없습니다.

+0

내 타겟 CPU에는 각각 FPU (Cortex A8, A9)가 있습니다. – psihodelia

+0

@psihodelia :이 경우에는 C 코드 수준에서 ARM에 대해 특별한 것은 없습니다. 단, 컴파일러가 SIMD 명령어를 활용하는 코드를 생성하지 않을 가능성이 있지만 라이브러리가 그렇게 할 수도 있습니다. 주어진 것이 아닙니다. 조사하고 어셈블러에서 일부 작업을 최적화해야합니다. 내가 사용한 라이브러리 중 하나가 하드웨어에서 직접 지원되는 함수 임에도 불구하고 수렴 알고리즘을 사용하여 sqrt()를 구현했습니다! – Clifford

+1

FPU를 가지고 있지만 성능에 관심이있는 경우에도 고정 소수점에서 수학을 시도해야합니다. –

4

대부분의 ARM 타겟에는 FPU가 없으므로 "가장 빠른 실행 파일"을 원하면 고정 소수점 라이브러리를 사용해야합니다. Dobb 박사 논문 : Optimizing Math-Intensive Applications with Fixed-Point Arithmetic에는 CORDIC 알고리즘에 대한 설명이 잘 나와 있으며이 기사에서 설명한 라이브러리의 전체 소스 코드를 제공합니다. 이 기사는 FPU가없는 ARM 디바이스에서 수학 집중 코드를 가속화하는 것과 정확히 일치합니다. 보고 된 결과는 부동 소수점 구현에 비해 일반적으로 4 배의 가속이었습니다. 벡터화를 사용하지 않는 VFP (컴파일러가 라이브러리 코드를 통하는 경우를 제외하고는 지원하지 않을 가능성이 있음)가 5 배의 가속을 제공하므로 소프트웨어 구현에 매우 적합합니다.

참고 :이 라이브러리를 사용하고 log() 함수에서 오류를 발견했습니다. 이것은 log_two_power_n_reversed [] 배열 초기화 프로그램의 끝에 0x0LL을 추가하여 정정됩니다. 나는이 수정을 저자와 함께 확인했다. 기사의 코드에 대한 링크가 깨진에서 찾을 : ftp://ftp.drdobbs.com/sourcecode/ddj/2008/0804.zip

[편집] 아차, 죄송 기사와 코드가 C++ 구현에 대해 설명 fixed 유형을 활용하기 위해 광범위하게 오버로드 연산자와 함수를 사용하여 가능한 한 투명하게 아마도 C++ 컴파일을 사용하는 좋은 이유 일지 모르지만 당신이 요구 한 것은 아닙니다.

0

FPU가없는 CPU의 성능을 최대화하려면 "하드 부동 소수점"대신 "소프트 부동 소수점"을 선택해야합니다. 이렇게하면 실행 파일은 커널이 불법 명령어를 트래핑하고 커널에서 에뮬레이션하는 대신에 부동 소수점 라이브러리에 링크됩니다 (컨텍스트 스위칭으로 인해 시간이 오래 걸립니다).

물론 하드웨어 부동 소수점 유닛이있는 CPU를 사용하려면 하드 부동 소수점을 사용하여 사용해야합니다.

다행히도 EABI는 두 유형의 실행 파일과 라이브러리를 평화롭게 공존 할 수 있습니다.

0

스마트 폰의 현재 사용중인 모든 ARM 프로세서에서 최상의 성능을 발휘하려면 가장 좋은 방법은 ARM 아키텍처마다 완전히 다른 무언가를 수행하는 것입니다. 즉, 스케일없는 정수 연산 또는 fpu-less 칩의 경우 느린 소프트 플로트입니다. , 파이프 라인 된 VFP 하드웨어가있는 칩의 경우 겹칠 수있는 부동 소수점 및 NEON 가능 칩의 경우 병렬 처리가 수행되지 않는 NEON 내장 함수가 포함됩니다. 이 모든 것을 코딩하고 CPU 아키텍처를 감지 한 후 런타임 계산 루틴 선택을 사용해야 할 수도 있습니다.