본문 바로가기
IT 기술/개발환경_유틸 관련 팁

[gcc] floating point ABI 에 대해서

by 땅뚱 2012. 11. 6.

gcc man page 를 살펴보면 ARM 옵션중에 다음과 같은 내용이 있다. (arm 옵션)

-mfloat-abi=name
Specifies which floating-point ABI to use. Permissible values are: soft, softfp and hard.

Specifying soft causes

GCC

to generate output containing library calls for floating-point operations. softfp allows the generation of code using hardware floating-point instructions, but still uses the soft-float calling conventions. hard allows generation of floating-point instructions and uses FPU-specific calling conventions.

Using -mfloat-abi=hard with

VFP

coprocessors is not supported. Use -mfloat-abi=softfp with the appropriate -mfpu option to allow the compiler to generate code that makes use of the hardware floating-point capabilities for these CPUs.

The default depends on the specific target configuration. Note that the hard-float and soft-float ABIs are not link-compatible; you must compile your entire program with the same

ABI

, and link with a compatible set of libraries.

-mhard-float
Equivalent to -mfloat-abi=hard.
-msoft-float
Equivalent to -mfloat-abi=soft.

요약하면 arm 에서 지원하는 컴파일 옵션중에 float-abi 를 설정하는 옵션이 있는데, 해당 옵션은 3가지로 선택할 수 있다. soft, softfp 그리고 hard. 간략하게 해석해보면..

soft : floating-point 연산을 위한 라이브러리 콜을 포함하도록 gcc 가 컴파일 결과를 만들어낸다.

softfp : hardware floating-point instruction 을 생성하도록 하지만, 여전히 soft-float 호출 규약(calling convention)을 사용한다.
hard : floating-point instructions 을 생성하고 FPU 특화된 호출 규약(calling convention)을 사용한다.

VFP coprocessors 를 사용하는 경우에 -mfloat-abi = hard 옵션은 지원되지 않는다. 그러한 CPU 들에 대해서 hardware floating-point 기능을 사용하는 코드를 생성하기 위해서는 -mfloat-abi=softfp 와 적절한 -mfpu 옵션을 사용해야 한다.

기본값은 특정 타겟의 설정에 의존적이다. hard-float 와 soft-float ABI 는 link-compatible 하지 않다. 반드시 모든 프로그램을 동일한 ABI 로 컴파일하고, 동일한 ABI로 컴파일된 라이브러리 집합(set)을 사용하여 링크해야 한다.

위 내용을 읽어보면, VFP coprocessor 는 -mfloat-abi=hard 옵션을 사용하여 컴파일하면 해당 보조프로세서를 사용할 수 없다는 것으로 보인다. 이상하네 그럼 hard 옵션은 언제 쓰는 거지?

우선 VFP 에 대해서 좀 알아보려면 다음 링크를 참조하면 될 것 같다.

http://www.arm.com/products/processors/technologies/vector-floating-point.php

여러가지 질문들이 떠오른다.

1. arm 에서는 floating 연산을 위해서 반드시 softfp 옵션을 사용해야 하는가? (VFP 가 유일한 HW floating 연산인것인가?)

2. 왜 저렇게 구분해서 사용하는가?

의문을 남겨둔채, VFP 보조 프로세서에서 사용해야 한다는 -mfpu 옵션에 대해서 먼저 살펴보았다.

-mfpu=name
-mfpe=number
-mfp=number
This specifies what floating point hardware (or hardware emulation) is available on the target. Permissible names are: fpa, fpe2, fpe3, maverick, vfp, vfpv3, vfpv3-d16 and neon. -mfp and -mfpe are synonyms for -mfpu=fpenumber, for compatibility with older versions of GCC .

If -msoft-float is specified this specifies the format of floating point values.

1번 의문이 조금 풀리는 듯하다. -mfpu 옵션은 타겟에서 어떤 floating point hardware (또는 hardware 에뮬레이션)이 사용가능한지를 결정해준다. 그 중에는 vfp 도 있지만, fpa, fpe 등 다양한 fpu 종류가 있다. 1번 의문은 결국 vfp 보조 프로세스를 사용하는 경우가 아니라면 -mfloat-abi=hard 옵션을 사용할 수 있다는 것으로 해석할 수 있을 듯 하다.

그런데 마지막에 -msoft-float 가 설정되어 있다면, 그것이 floating point 값의 형식을 설정한다라는 구문이 있다. 음 이 문장이 2번의 답에 대한 힌트를 주는 것인가??

구글링해서 아래 참고 사이트를 찾았다.

참고 : Advantages of Hard/Soft FPU Compiler Settings

질문한 사람은 soft FPU 옵션을 사용하면 FPU 가 존재하지 않아도 compatible 한데, 왜 굳이 hard FPU 옵션을 사용하냐? soft FPU 옵션을 사용하는 경우에 어떤 단점이 존재하느냐? 그리고 두 옵션간에 어떤 코드 차이가 존재하는지에 대한 질문을 던졌고, 그에 대한 답변이 몇개 달렸는데, 간단하게(?) 요약해보면..

ABI 는 사용자 코드의 함수 콜이 라이브러리 함수를 어떻게 호출할지를 결정하는 옵션이고, 3가지 방식이 존재한다

1) soft-abi 를 사용한 사용자 코드 호출, 라이브러리 인터페이스는 soft-abi 이고, 라이브러리는 FPU 에뮬레이션을 사용한다

2) soft-abi 를 사용한 사용자 코드 호출, 라이브러리 인터페이스는 soft-abi 이고, 라이브러리는 hardware-FPU 를 사용한다.(예를 들면 Cortex-M4 의 v*- 명령)

3) hard-abi 를 사용한 사용자 코드 호출, 라이브러리 인터페이스는 hard-abi 이고, 라이브러리도 hardware-FPU 를 사용한다.

여기서 말하는 라이브러리는 툴체인과 함께 딸려오는 라이브러리(libgcc 같은)를 말한다. 만일 위 3가지 모든 옵션에 대한 라이브러리가 사용가능하고, 사용자 어플리케이션을 재컴파일 할 수 있다면, 레지스터 내용을 transfer 할 일이 없기 때문에 3번째 방법이 가장 효율적일 것이다.(이 부분에 대한 내용은 아래서 설명)

soft-abi 를 사용하는 가장 큰 장점은 오브젝트 코드로서만 사용가능한 라이브러리(archives/"a-files")들을 섞어서 사용할 수 있는 가능성이다. 라이브러리가 soft-abi 로 컴파일된다면, 컴파일된 라이브러리는 내부적으로 FPU-emulation 을 사용하고, 그것은 soft-abi 를 사용하는 모든 다른 오브젝트 코드와 링크될 수 있다.

hard-abi 의 경우, 어플리케이션의 모든 코드는 반드시 hard-abi 세팅으로 컴파일 되어야 한다. 그리고 hardware-FPU 가 활성화 되어야 한다.

Mentor/Codesourcery 에서 CodeBench 를 위한 getting-started.pdf 를 읽어보면 좀더 상세한 내용을 알 수 있다.

softfp 를 사용하는 경우, 약간의 성능저하를 경험할 수 있는데, 이것이 느껴질 정도의 성능저하 현상이 발생할 지 여부는 실제 코드가 어떻게 구현되어있는지에 따라 다르다.

softfp 의 경우, floating point 함수 파라미터/리턴값이 프로세서의 core 레지스터를 통해 전달되지만, hard 의 경우에는 VFP 레지스터를 통해 전달된다.

음.. 실제 옵션을 주어서 instruction 이 어떻게 생성되는지를 비교해보면 좋겠군요. 이건 다음에 추가~