Как я могу включить определенный набор оптимизаций gcc?

gcc имеет большое количество методов оптимизации, некоторые из которых соответствуют параметрам командной строки, начинающимся с -f. Есть ли способ включить какой-то конкретный набор из них, а не другие?

Очевидным предположением было бы, что вы могли бы сделать что-то вроде gcc -fauto-inc-dec a.c, если бы вам нужна была просто оптимизация auto-inc-dec (выбрана случайным образом, меня не волнует эта конкретная оптимизация), но в руководстве сказано, что не будет работать:

Большинство оптимизаций полностью отключены при -O0 или если уровень -O не установлен в командной строке, даже если указаны отдельные флаги оптимизации.

(мой акцент). Я немного сомневался в этом, потому что видел в SO случаи, когда люди использовали флаги -f без -O (например, здесь), но в руководстве кажется довольно ясным, что, по крайней мере, в большинстве случаев это ничего не дает.

Если вы используете -O1 или выше, включается длинный список опций -f (показан по ссылке на руководство выше). Я хотел бы знать, как, если это возможно, использовать только часть из них.

Мотивация: я хотел бы понять, какие именно оптимизации ответственны за некоторые особенности работы с плавающей запятой.

if it's possible, to use only a subset of these что происходит, когда вы это делаете?
KamilCuk 07.08.2024 15:50

Возможно, потребуется просто использовать -fno-<name> для всех перечисленных опций с -O1 и включать их по одному.

dbush 07.08.2024 15:53

@KamilCuk, насколько я могу судить, ничего, в соответствии с тем, что написано в руководстве.

Matthew Towers 07.08.2024 15:54

Я хотел бы понять, какие именно оптимизации ответственны за некоторые странности с плавающей запятой. - возможно, вы могли бы просто спросить здесь :)

Eugene Sh. 07.08.2024 15:57

@ЕвгенийШ. конечно, но мне также хотелось бы знать, как это сделать в целом (и чтобы мне сказали, ошибаюсь ли я насчет использования опции -f без -O, поскольку меня очень смущает видеть, как люди делают это, когда кажется, что руководство сказать, что в целом это не имеет никакого эффекта)

Matthew Towers 07.08.2024 16:01

> Я хотел бы понять, какие именно оптимизации ответственны за некоторые странности с плавающей запятой. Что именно вы подразумеваете под причудами с плавающей запятой? Если я правильно понимаю, «причудливые» флаги с плавающей запятой, такие как -freciprocal-math, -fassociative-math и т. д., используются в -ffast-math, а не в -O1/2/3.

loonatick 07.08.2024 17:00

См., например. stackoverflow.com/a/77781732/13389627 для флагов оптимизации с плавающей запятой.

loonatick 07.08.2024 17:06

Также помните, что оптимизации влияют друг на друга. Отключение некоторых из них вполне может вообще предотвратить срабатывание более причудливых (или создать что-то отличное от того, когда они объединены).

Mat 07.08.2024 17:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Согласно документации, которую вы упомянули:

Большинство оптимизаций полностью отключены при -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-кода — нетривиальное занятие.

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