하드 부동 소수점 숫자와 소프트 부동 소수점 숫자의 차이점은 무엇입니까?


98

크로스 툴체인으로 C 코드를 컴파일하면 링커는 실행 파일이 하드 플로트를 사용하지만 libc는 소프트 플로트를 사용한다는 경고 페이지를 인쇄합니다. 차이점이 뭐야?


ARM 아키텍처라면 태그에 넣어주세요 :-)
Nils Pipenbrinck 2010-07-23

3
@Nils Pipenbrinck : MIPS 칩에도이 문제가 있습니다
Javier

답변:


100

하드 플로트는 온칩 부동 소수점 단위를 사용합니다. 소프트 플로트는 소프트웨어에서 하나를 에뮬레이트합니다. 차이점은 속도입니다. 칩에 FPU가 있거나없는 것이기 때문에 동일한 타겟 아키텍처에서 둘 다 사용되는 것을 보는 것은 이상합니다. -msoft-float를 사용하여 GCC에서 소프트 부동 소수점을 활성화 할 수 있습니다. libc를 사용하는 경우 하드웨어 부동 소수점을 사용하도록 libc를 다시 컴파일 할 수 있습니다.


3
"동일한 타겟 아키텍처에서 둘 다 사용되는 것은 이상합니다."이것은 라이브러리가 정확도가 중요한 부분에서 기계 독립적이고 비트 정확 (소프트 플로트)이고 작은 편차가없는 부분에서는 빠르다 (하드 플로트) 합리적 일 수 있습니다. 상관 없습니다.
PhilLab

32 비트 ARM에서 발생합니다.
Aaron Franke

31

부동 소수점 산술을 수행하는 세 가지 방법이 있습니다.

  • CPU에 FPU가있는 경우 부동 명령을 사용하십시오. (빠른)
  • 컴파일러가 부동 소수점 산술을 정수 산술로 변환하도록하십시오. (느린)
  • FPU가없는 CPU와 float 명령어를 사용합니다. CPU는 예외 (예약 명령어, 구현되지 않은 명령어 또는 이와 유사한 명령어)를 생성하고 OS 커널에 부동 소수점 에뮬레이터가 포함 된 경우 해당 명령어 (가장 느림)를 에뮬레이션합니다.

23

엄밀히 말해서,이 모든 대답은 나에게 잘못된 것 같습니다.

크로스 툴체인으로 C 코드를 컴파일하면 링커는 실행 파일이 하드 플로트를 사용하지만 libc는 소프트 플로트를 사용한다는 경고 페이지를 인쇄합니다. 차이점이 뭐야?

데비안 위키 VFP 에 대한 세 가지 선택에 대한 정보를 가지고 -mfloat-abi,

  • soft -이것은 순수한 소프트웨어입니다
  • softfp-하드웨어 FPU를 지원하지만 ABI 는 소프트 호환됩니다.
  • hard-ABI는 부동 또는 VFP 레지스터를 사용합니다.

링커 (로더) 오류는 정수 레지스터에 부동 소수점 값을 전달하는 공유 라이브러리가 있기 때문입니다. -mfpu=vfp, 등으로 코드를 컴파일 할 수 있지만 libc 에 float가 필요한 -mfloat-abi=softfp경우 라이브러리가 이해하는 방식으로 전달 되도록 사용해야합니다 .

Linux 커널은 VFP 명령어의 에뮬레이션을 지원할 수 있습니다. 분명히이 -mfpu=none경우에는 컴파일하는 것이 더 좋으며 Linux 커널 에뮬레이션에 의존하는 대신 컴파일이 코드를 직접 생성하도록합니다. 그러나 OP의 오류가 실제로이 문제와 관련이 있다고 생각하지 않습니다. 그것은 분리되어 있으며 또한 -mfloat-abi.

ArmV7 CPU 가있는 Armv5 공유 라이브러리는 이와 반대입니다. 의 libc는 하드 플로트했지만 응용 프로그램은이었다 소프트 . 문제를 해결할 수있는 몇 가지 방법이 있지만 올바른 옵션으로 다시 컴파일하는 것이 항상 가장 쉽습니다.

또 다른 문제는 Linux 커널이 컨텍스트 스위치에서 레지스터를 저장 / 복원하기 위해 VFP 작업 (또는 ARM 부동 소수점이있는 모든 것)을 지원해야한다는 것입니다.


1
최신 GCC (~ 4.8 +) 버전은 hard float 및 soft float 라이브러리가있는 'multi-lib'를 지원합니다. 이전 버전에서는 특정 버전으로 빌드 된 컴파일러가 필요했습니다. 여러 버전의 라이브러리가 있기 때문에 'multi-lib'gcc 배포판과 연결할 때 때때로 올바른 라이브러리 경로가 필요합니다 (컴파일러를 빌드하는 데 더 오랜 시간이 필요함). 디렉토리 이름은 'hf', 'hardf', 'libhf'또는 'hard-float'일 수 있지만 일반적으로 일반 'soft'디렉토리 또는 근처 위치에 있습니다.
artless noise

이것이 정답입니다. float에 대한 호출 변환은 코드와 libc간에 일치해야합니다. 부동 소수점 libc 함수를 절대 호출하지 않으면 여전히 불일치로 작동 할 수 있습니다.
Tor Klingberg 2017-04-04

13

libc가 소프트웨어 부동 소수점 연산을 위해 만들어진 것처럼 들리지만 exe는 부동 소수점에 대한 하드웨어 지원을 가정하여 컴파일되었습니다. 단기적으로는 컴파일러 플래그로 소프트 플로트를 강제 할 수 있습니다. (gcc를 사용하는 경우 -msoft-float라고 생각합니다)

장기적으로 타겟의 프로세서가 부동 소수점 연산에 대한 하드웨어 지원을 가지고 있다면 일반적으로 속도를 위해 하드웨어 부동이 활성화 된 크로스 툴체인을 구축하거나 찾고 싶을 것입니다. 일부 프로세서 제품군에는 하드웨어 지원이있는 모델과없는 모델이 있습니다. 예를 들어, 프로세서가 ARM이라고 말하는 것만으로는 하드웨어 부동 소수점 지원 여부를 알 수 없습니다.


8

계산은 부동 소수점 하드웨어 또는 정수 산술을 기반으로하는 소프트웨어에서 수행 할 수 있습니다.

하드웨어에서 수행하는 것이 훨씬 빠르지 만 많은 마이크로 컨트롤러에는 부동 소수점 하드웨어가 없습니다. 이 경우 부동 소수점 (일반적으로 최상의 옵션) 사용을 피하거나 C 라이브러리의 일부가 될 소프트웨어 구현에 의존 할 수 있습니다.

ARM과 같은 일부 컨트롤러 제품군에서는 부동 소수점 하드웨어가 제품군의 일부 모델에 있지만 다른 제품군에는 존재하지 않으므로 이러한 제품군에 대한 gcc는 둘 다 지원합니다. 귀하의 문제는 두 가지 옵션을 혼합 한 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.