Что именно делает опция -ffast-math при компиляции с gcc

Может ли кто-нибудь помочь мне понять, что делает опция -ffast-math при компиляции с gcc. Я вижу разницу в 20 секунд во времени выполнения моих программ при выполнении с -O3 и -ffast-math по сравнению только с использованием -O3

1 ответ

Решение

Почему бы не прочитать справочную страницу gcc, это ваш друг, а также мой. Вот что он сказал мне:

Устанавливает -fno-math-errno, -funsafe-math-optimizations, -ffinite-math-only, -fno-rounding-math, -fno-signaling-nans и -fcx-limited-range.

Таким образом, он не делает ничего интересного сам по себе, а является лишь кратким описанием нескольких более интересных опций компилятора. Что делают отдельные флаги?

  • fno-math-errno делает математические операции без инструкций не заданными ERRNO
  • funsafe-math-optimizations разрешает математическую оптимизацию, которая принимает действительные аргументы и может нарушать стандарты ANSI и IEEE (осторожно, не очень весело и безопасно)
  • ffinite-math-onlyтакже позволяет математические оптимизации, которые предполагают, что любые значения с плавающей запятой не являются ни бесконечными, ни NaN
  • fno-rounding-math а также fno-signaling-nans на самом деле включены по умолчанию. Их противоположности frounding-math а также fsignaling-nans отключить некоторые потенциально небезопасные / непереносимые оптимизации.
  • fcx-limited-range позволяет компилятору не выполнять определенные арифметические проверки комплексных чисел. Скорее всего, это не повлияет на вашу программу, если вы на самом деле не работаете со сложными числами!

Короче говоря, это позволяет компилятору оптимизировать вашу программу за счет потери стандартного соответствия и некоторой безопасности.

Другие вопросы по тегам