какие флаги компиляции активируются с помощью O3

мы находимся в процессе изменения версии компилятора Intel с v14 на v18 в наших системах, и, запустив тесты, мы заметили, что O3 в некоторых случаях дает неправильные результаты, тогда как тот же код работает правильно с O3 и v14. Мне было интересно, каковы различия в оптимизации между этими двумя версиями и как я могу получить полный список флагов, которые активируются с помощью O3 в каждой версии. Всем заранее спасибо за помощь и предложения.


person user2348209    schedule 01.10.2020    source источник
comment
Какие флаги вы использовали кроме O3? Проходят ли ваши тесты, когда вы используете O2 с v18?   -  person Dai    schedule 01.10.2020
comment
Наконец-то хоть какая-то группа, которая умеет тестировать! Я впечатлен. Поздравляем. Теперь, я полагаю, вашей команде пора пересмотреть требования и определить, почему, по их мнению, им нужен O3. Возможно, ваши тесты могут подтвердить (или нет), что меньшая/нижняя оптимизация всегда позволяет избежать «неправильных результатов», и если это так, возможно, результат достаточно быстрый (при этом правильный).   -  person 2785528    schedule 01.10.2020
comment
Также обратите внимание, что вы можете изолировать проблемные результаты для компиляции на более низком/более медленном уровне оптимизации. Весь остальной код можно полностью оптимизировать. Если ваше тестирование продолжает работать, этот подход может быть разумной первой попыткой обойти обнаруженные вами проблемы.   -  person 2785528    schedule 01.10.2020
comment
@Dai Я не проверял с O2, но с O0 все в порядке   -  person user2348209    schedule 01.10.2020
comment
@ 2785528, к сожалению, разница во времени значительна, и неоптимизированная компиляция не принимается. Более того, как я уже сказал, версия 14 O3 работает отлично, и у нас нет никаких проблем. Поскольку код используется для решения физической проблемы, мы можем проверить окончательные результаты, а проблема нестабильности с O3 v18 не имеет никакого смысла.   -  person user2348209    schedule 01.10.2020
comment
@ 2785528 ​​Знаете ли вы, как быстро найти проблемную часть кода?   -  person user2348209    schedule 01.10.2020


Ответы (1)


Поведение -O3 задокументировано на веб-сайте Intel: https://software.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/compiler-options/compiler-option-details/optimization-options/o.html

O3

  • Выполняет O2 оптимизацию и обеспечивает более агрессивные преобразования циклов, такие как Fusion, Block-Unroll-and-Jam и сворачивающие операторы IF.
  • Этот параметр может устанавливать другие параметры. Это определяется компилятором в зависимости от того, какую операционную систему и архитектуру вы используете. Установленные параметры могут меняться от выпуска к выпуску.
  • Когда O3 используется с опциями -ax или -x (Linux) или с опциями /Qax или /Qx (Windows), компилятор выполняет более агрессивный анализ зависимостей данных, чем для O2, что может привести к увеличению времени компиляции.
  • Оптимизация O3 может не привести к повышению производительности, если не выполняются преобразования циклов и доступа к памяти. Оптимизация может в некоторых случаях замедлить код по сравнению с оптимизацией O2.
  • Параметр O3 рекомендуется для приложений с циклами, которые интенсивно используют вычисления с плавающей запятой и обрабатывают большие наборы данных.
  • Многие подпрограммы в общих библиотеках более оптимизированы для микропроцессоров Intel®, чем для микропроцессоров других производителей.

В нижней части страницы перечислены альтернативные варианты, в которых перечислены только -Od (что отключает все оптимизации: возможно, это не то, что вам нужно).

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

Глядя на страницу Intel о методах, используемых для высокоуровневой оптимизации, похоже, что они не могут быть включены по меню, так что с HLO все или ничего и включается с помощью O2 или O3 (за исключением того, что O2 использует подмножество методов O3).

Сравните это с -Ofast, у которого есть полный эквивалент:

Ofast

  • Он устанавливает параметры компилятора -O3, -no-prec-div и -fp-model fast=2.
person Dai    schedule 01.10.2020
comment
Спасибо за предоставление этой части документации. Я видел это, но, к сожалению, в нем явно не упоминается, какие флаги активируются с помощью O3. Я хочу деактивировать их один за другим и найти флаг, вызывающий проблему. - person user2348209; 01.10.2020
comment
@ user2348209 Пожалуйста, перечитайте мой ответ. HLO, включенные с O3, являются делом «все или ничего». Нет никаких флагов для выборочного включения/отключения этих оптимизаций. - person Dai; 01.10.2020
comment
спасибо за комментарий, при всем уважении, я думаю, что вы сказали неправду. Например, просто взгляните на следующую страницу GNU GCC gcc.gnu.org/ onlinedocs/gcc/Optimize-Options.html, в котором четко перечислены флаги, которые активируются на каждом уровне оптимизации. Я ищу аналогичный список в компиляторе Intel - person user2348209; 02.10.2020
comment
Со всем уважением, но Intel — это не GNU, а ICC — это не GCC. Нет ничего, что требовало бы оптимизации компилятора, которую вы могли бы индивидуально переключать через командную строку. Учитывая, что компилятор Intel поддерживается корпорацией Intel, вам следует связаться с ними самостоятельно через службу поддержки, чтобы получить авторитетный ответ. - person Dai; 02.10.2020