Что именно делает опция -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
позволяет компилятору не выполнять определенные арифметические проверки комплексных чисел. Скорее всего, это не повлияет на вашу программу, если вы на самом деле не работаете со сложными числами!
Короче говоря, это позволяет компилятору оптимизировать вашу программу за счет потери стандартного соответствия и некоторой безопасности.