-ffast-math 옵션은 어떤 종류의 최적화를 수행합니까?

간단한 $ O (n ^ 2) $ 알고리즘이 옵션을 사용하는 $ O (n) $ 알고리즘의 시간으로 단축되는 데 걸리는 시간.

댓글

답변

GCC의 위키 에이 질문에 대한 표준 답변이 있습니다. 아마도 유지되는 것으로 추정되며,이 유형의 질문에 대한 정보의 가장 권위있는 출처입니다. 반면에이 질문은 결국 구식이 될 수 있습니다.이 모든 내용은 예제와 함께 위키에 자세히 설명되어 있습니다. 다음은 이 정확한 질문에 대한 답을 설명하기위한 인용문입니다.

  • -fno-signaling-nans
  • -fno-trapping-math

    IEEE 표준은 구현시 트랩 처리기가 exc를 처리 할 수 있도록 권장합니다. 0으로 나누기 및 오버플로와 같은 eptions. 이 플래그는 사용 가능한 트랩이 발생하지 않는다고 가정합니다.

  • -funsafe-math-optimizations -이러한 최적화는 부동 소수점 산술의 법칙을 깨고이를 일반 무한 정밀도 산술의 법칙으로 대체 할 수 있습니다.

    반올림 오류로 인해 연관 대수의 법칙은 부동 소수점 숫자에 대해 유지 될 필요가 없으므로 (x + y) + z와 같은 표현식은 x + (y + z)와 같을 필요가 없습니다.

  • -ffinite-math-onlyinf 또는 nan는 표시되지 않는 것으로 간주되며이를 검색하고 적절하게 처리하는 데 소요되는 시간을 절약 할 수 있습니다. 예를 들어 $ x-x $는 항상 $ 0.0 $와 같아야합니까?

  • -fno-errno-math

    수학 라이브러리 루틴 호출시 C89 / C99에서 요구하는대로 errno 변수 설정을 비활성화합니다. Fortran의 경우 이것이 기본값입니다.

  • -fcx-limited-range

    복잡한 분할을 수행 할 때 범위 축소 단계가 생략됩니다. 이것은 $ a / b = ((ar * br + ai * bi) / t) + i ((ai * br-ar * bi) / t) $를 $ t = br * br + bi * bi $와 함께 사용합니다. 임의의 입력 범위에서 제대로 작동하지 않습니다.

  • -fno-rounding-math

  • -fno-signed-zeros

    반올림 오류로 인해 대수의 연관 법칙을 유지할 필요가 없습니다. 부동 소수점 숫자와 (x + y) + z와 같은 표현식은 x + (y + z)와 같을 필요가 없습니다.

엄밀히 말하면 마지막 두 가지의 의미가 생각만큼 직관적 인 것은 아닙니다. 예를 들어 (wiki 참조), $-(a-a) = a-a $, $ + 0.0 $ 또는 $ -0.0 $는 어떻습니까? 특히 Bill Kahan 에 의해 정확한 의미에 대한 문헌이 상당히 많이 있다고 생각합니다.

  • 직접 언급되지 않음 (I 보이지 않습니까?) 그러나 -ffast-math에서는 역수 $ 1 / x $ 및 제곱근 $ \ sqrt {x} $와 같은 특정 공통 특수 함수가 less로 대체됩니다. 더 빠르지 만 여전히 “허용 할 수있는”오류 수준이있는 정확한 버전 (표준에서 요구하는 0ulp 오류와 비교)-예를 들어 여기에서 일반적으로 제공되는 정밀도는 다음과 같습니다. glibc의 libm . 실제로 이것은 -ffast-math에서 속도를 높이는 가장 일반적인 원인입니다. 나눗셈과 제곱근으로 많은 산술을 수행하는 코드에서 거의 제가 ( 개인적으로 ) 다른 하위 옵션 (-ffinite-math-only 등-특히 NaN 신호를 보내는 것은 디버깅에 매우 유용함)이 약간의 원인이라고 생각합니다. 비용 / 혜택 측면에서 매우 번거 롭습니다.

단순한 $ O (n ^ 2) $에 걸리는 시간을 보았습니다. 이 옵션을 사용하여 알고리즘을 $ O (n) $ 알고리즘의 알고리즘으로 축소합니다.

이것은 가능성이 없으며 실수를했을 가능성이 있습니다. 당신의 분석에서.안전하지 않은 부동 소수점 최적화는 더 많은 최적화를 선택하기 때문에 개별 표현식을 평가하는 데 다소 저렴하게 만들 수 있습니다. 그러나 속도 향상은 항상 항상 일정한 요소 여야합니다. $ O (n ^ 2) $ 알고리즘을 $ O (n) $과 비교하여 $ n $가 충분하지 않은 경우를 비교할 수 있습니까?

Answer

$ n ^ 2 $ 알고리즘은 예를 들어 $ n $가 컴파일러에 알려져 있고 벡터 크기의 배수 인 경우 $ O (n) $처럼 작동하는 것으로 축소 될 수 있습니다. 프로세서에서 지원하는 벡터 명령어 (있는 경우) 컴파일러가이 모든 것을 볼 수 있다면 내부 루프를 풀고 벡터 명령어를 사용하여 작업을 수행 할 수 있습니다. 이렇게하면 전체 작업이 소수로 줄어들고 성능이 크게 향상 될 수 있습니다.

fast-math는 이러한 최적화를 활성화하지 않지만 unsafe-math-optimizations 내부에서 비활성화 된 연관성 제한 때문에

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다