gcc имеет большое количество методов оптимизации, некоторые из которых соответствуют параметрам командной строки, начинающимся с -f. Есть ли способ включить какой-то конкретный набор из них, а не другие?
Очевидным предположением было бы, что вы могли бы сделать что-то вроде gcc -fauto-inc-dec a.c
, если бы вам нужна была просто оптимизация auto-inc-dec (выбрана случайным образом, меня не волнует эта конкретная оптимизация), но в руководстве сказано, что не будет работать:
Большинство оптимизаций полностью отключены при -O0 или если уровень -O не установлен в командной строке, даже если указаны отдельные флаги оптимизации.
(мой акцент). Я немного сомневался в этом, потому что видел в SO случаи, когда люди использовали флаги -f без -O (например, здесь), но в руководстве кажется довольно ясным, что, по крайней мере, в большинстве случаев это ничего не дает.
Если вы используете -O1
или выше, включается длинный список опций -f (показан по ссылке на руководство выше). Я хотел бы знать, как, если это возможно, использовать только часть из них.
Мотивация: я хотел бы понять, какие именно оптимизации ответственны за некоторые особенности работы с плавающей запятой.
Возможно, потребуется просто использовать -fno-<name>
для всех перечисленных опций с -O1
и включать их по одному.
@KamilCuk, насколько я могу судить, ничего, в соответствии с тем, что написано в руководстве.
Я хотел бы понять, какие именно оптимизации ответственны за некоторые странности с плавающей запятой. - возможно, вы могли бы просто спросить здесь :)
@ЕвгенийШ. конечно, но мне также хотелось бы знать, как это сделать в целом (и чтобы мне сказали, ошибаюсь ли я насчет использования опции -f без -O, поскольку меня очень смущает видеть, как люди делают это, когда кажется, что руководство сказать, что в целом это не имеет никакого эффекта)
> Я хотел бы понять, какие именно оптимизации ответственны за некоторые странности с плавающей запятой. Что именно вы подразумеваете под причудами с плавающей запятой? Если я правильно понимаю, «причудливые» флаги с плавающей запятой, такие как -freciprocal-math
, -fassociative-math
и т. д., используются в -ffast-math
, а не в -O1/2/3.
См., например. stackoverflow.com/a/77781732/13389627 для флагов оптимизации с плавающей запятой.
Также помните, что оптимизации влияют друг на друга. Отключение некоторых из них вполне может вообще предотвратить срабатывание более причудливых (или создать что-то отличное от того, когда они объединены).
Согласно документации, которую вы упомянули:
Большинство оптимизаций полностью отключены при -O0 или если установлен уровень -O. не устанавливается в командной строке
«Большинство» не означает «все».
Например, вы можете посмотреть -fearly-inlining
, который работает всегда, даже без включенной оптимизации. Включать эту опцию нет смысла (поскольку она установлена по умолчанию), но вы можете ее отключить -fno-early-inlining
.
Если вы хотите разрешить только набор оптимизаций, вы можете сделать что-то вроде
gcc -S -O1 -fno-auto-inc-dec -fno-branch-count-reg my.c
Здесь -S создаст ассемблерный код для проверки результатов оптимизации, -O1
включит набор опций оптимизации и -fno-option
отключит некоторые из них. Да, в случае -O1
это был бы длинный список -fno-option
, а в случае -O2
еще больше... Увы...
Обратите внимание, что -O1
и -fno-option
в данном случае должны быть именно в таком порядке. Поскольку gcc/g++
применяйте последний вариант, если существует конфликт между вариантами.
gcc -fno-auto-inc-dec -fno-branch-count-reg -O1
отключит эти две опции, а затем снова включит их из-за -O1
Я немного сомневался в этом, потому что видел в SO случаи, когда люди использовали флаги -f без -O (например, здесь), но в руководстве кажется довольно ясным, что, по крайней мере, в большинстве случаев это ничего не дает.
Я не вижу оснований для сомнений. Руководства не являются непогрешимыми, но они гораздо надежнее, чем примеры использования случайных людей. А руководства GNU, в частности, в целом довольно хороши, потому что хорошая документация — это основной упор в проекте GNU.
Если вы используете
-O1
или выше, включается длинный список опций -f (показан по ссылке на руководство выше). Я хотел бы знать, как, если это возможно, использовать только часть из них.
Практически все опции GCC, выполняющие функцию переключателей включения/выключения, имеют как положительную, так и отрицательную форму. Отрицательную форму можно составить из положительной, вставив no-
сразу после лидирующего -f
или -W
. Например, -fno-auto-inc-dec
.
Кроме того, опции обрабатываются как бы слева направо в командной строке, поэтому, если в одной команде встречаются как положительная, так и отрицательная формы одной и той же опции, в том числе в виде собирательных опций, таких как -O1
, то преобладает последняя. .
Таким образом, если вы не хотите, чтобы всегда были доступны только параметры оптимизации из подмножества, вам следует включить -O1
(или -O2
, -O3
или -Os
), затем отключить все включенные таким образом параметры, которые вам не нужны, и, наконец, включить любые которые вам нужны, но они еще не включены.
Мотивация: я хотел бы понять, какие именно оптимизации ответственны за некоторые особенности работы с плавающей запятой.
Хотя полезно знать, какое влияние различные оптимизации могут оказать на ваш код FP, не следует упускать из виду вероятность того, что структура и детали самого кода играют наиболее важную роль в любом странном поведении, которое вы наблюдаете. Написание хорошего FP-кода — нетривиальное занятие.
if it's possible, to use only a subset of these
что происходит, когда вы это делаете?