2010-07-23 2 views

답변

81

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

+0

"둘 다 동일한 대상 아키텍처에서 사용되는 것이 이상합니다"이것은 라이브러리가 정밀도가 중요한 부품에서는 기계에 의존하지 않고 비트 정밀도 (소프트 플로트)가 좋고 작은 편차는 중요하지 않은 부품에서는 빠르다 (하드 플로트). – PhilLab

10

부동 소수점에 대한 하드웨어 지원을 가정 할 때 exe가 컴파일되는 동안 libc가 소프트웨어 부동 소수점 연산 용으로 만들어진 것처럼 들립니다. 단기적으로는 컴파일러 플래그로 소프트 플로트를 강제 실행할 수 있습니다. (gcc를 사용하고 있다면 gm을 -msoft-float으로 생각하십시오.)

장기적으로 타겟 프로세서에 부동 소수점 연산에 대한 하드웨어 지원이있는 경우 일반적으로 하드웨어 부동 소수점을 사용할 수있는 교차 도구 체인을 빌드하거나 찾으려고합니다. 속도. 일부 프로세서 제품군에는 하드웨어 지원이 있거나없는 모델 변형이 있습니다. 예를 들어, 프로세서가 ARM이라고 말하는 것은 하드웨어 부동 소수점 지원 여부를 알기에는 불충분합니다.

28

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

  • 사용 플로트 지침 당신의 CPU가 FPU가있는 경우가. (빠름)
  • 컴파일러에서 부동 소수점 산술을 정수 산술로 변환하도록하십시오. (느림)
  • 플로트 명령어와 FPU가없는 CPU를 사용하십시오. CPU는 예외 (예약 된 명령어, 구현되지 않은 명령어 등)를 생성하며, OS 커널에 부동 소수점 에뮬레이터가 포함되어 있으면 가장 느린 명령어를 에뮬레이트합니다.
6

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

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

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

11

엄밀히 말하자면,이 모든 대답은 나에게 잘못된 것처럼 보입니다.

내 크로스 툴 체인으로 C 코드를 컴파일 할 때 링커는 내 실행 파일이 하드 플로트를 사용하지만 libc는 소프트 플로트를 사용한다는 경고 페이지를 인쇄합니다. 차이점이 뭐야? 데비안 VFP wiki-mfloat-abi에 대한 세 가지 선택에 대한 정보를 가지고

,

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

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

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

Armv5 shared library with ArmV7 CPU은이 반대입니다. libc은 하드 플로트 였지만 응용 프로그램은 소프트뿐이었습니다. 이 문제를 해결할 수있는 몇 가지 방법이 있지만 올바른 옵션으로 다시 컴파일하는 것이 가장 쉽습니다.

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

+0

현대 GCC (~ 4.8 +) 버전은 하드 플로트 및 소프트 플로트 라이브러리가있는 'multi-lib'를 지원합니다. 이전 버전에서는 특정 버전으로 작성된 컴파일러가 필요했습니다. 때로는 여러 라이브러리 버전이 있기 때문에 'multi-lib'gcc 배포판으로 링크 할 때 올바른 라이브러리 경로가 필요합니다 (컴파일러를 빌드하는 데 더 많은 시간이 필요합니다). 디렉토리 이름은 'hf', 'hardf', 'libhf'또는 'hard-float'일 수 있지만 일반적으로 일반적인 'soft'디렉토리 또는 근처 위치에 있습니다. –

+0

이것은 올바른 대답입니다. float에 대한 호출 변환은 코드와 libc 사이에서 일치해야합니다. 부동 소수점 libc 함수를 절대 절대로 호출하지 않으면 불일치로 작동 할 수도 있습니다. –