Intel Fortran Compiler: советы по оптимизации при компиляции

21

Я начну с моего личного опыта в нашей лаборатории. В 9 и 10 днях раньше мы были довольно агрессивны с оптимизацией, компилируя с -O3 и специфичными для процессора флагами (например, -xW -xSSE4.2). Но начиная с ifort 11, мы начали замечать:
1. некоторые несоответствия в результатах (поскольку семантика не сохранилась)
2. меньший выигрыш по сравнению с -O2.

Поэтому в настоящее время мы обычно просто компилируем с -O2 и -xhost. Есть ли у вас лучшие предложения с ifort 11? Изменится ли это еще раз, когда мы перейдем к ifort 12? Заранее спасибо.

FrenchKheldar
источник
7
Оптимизация не приносит выгоды всем кодам одинаково. Таким образом, я думаю, что лучшим вопросом будет «Как я могу профилировать мой код, чтобы сказать, какие оптимизации компилятора эффективны?»
Мэтт Кнепли
1
Потому что семантика не сохранилась или потому что что-то было переупорядочено? Это может немного отклоняться от темы, но было бы хорошо увидеть фрагмент кода, который воспроизводит проблему. Возможно, что-то было переупорядочено таким образом, что вам не нравится, но компилятор считает, что все должно быть в порядке. Мой опыт показывает, что Intel 12 лучше справляется с векторизацией, чем любой из ее предшественников, поэтому я ожидаю, что когда вы перейдете на последнюю версию, произойдет больше изменений.
Билл Барт
Я думал, что сказать, что семантика не сохранилась, было равносильно тому, что порядок не был сохранен. Во всяком случае, я понимаю, что мой вопрос (тоже?) Является общим, и я не хотел останавливаться на деталях. У нас было несколько проблем с Intel 10, некоторые были ошибками компилятора, а некоторые остались необъяснимыми. Таким образом, с 11 мы играем безопасно, и мы были довольны производительностью. Но, возможно, мы играем слишком безопасно, и я хотел знать, есть ли у сообщества какие-то советы.
ФранцузскийХелдар

Ответы:

16

Мы настоятельно рекомендуем всем нашим пользователям начать с -O3 -xHost -ipoifort 11 и ifort 12. Если в O3 есть конкретные преобразования с плавающей запятой, которые влияют на точность некоторых ваших вычислений, вы можете отключить их специально с помощью-fp-model precise -fp-model except (или, что более резко -fp-model strict) при сохранении других оптимизаций, которые поддерживает O3, таких как блокировка цикла для кэша, объединение и развертывание цикла и оптимизация доступа к памяти.

Я бы посоветовал попробовать материал с плавающей запятой для отдельных файлов и выяснить, где это имеет значение, а не отключать его глобально; это может быть скачок скорости ~ 15%, и вы хотите иметь возможность сохранить его там, где это не повлияет на ваши расчеты. Если вы не уверены, где влияет точность, вы можете поиграть с включением и выключением флагов модели с плавающей запятой для этих файлов, или с режимами округления .

Недавно мы кратко рассказали нашим пользователям о флагах оптимизации, сосредоточившись на компиляторах gnu и intel для x86; Вы можете увидеть слайды этого разговора здесь .

Кстати, в то время как мы говорим о выборе флагов оптимизации для вашего кода, время от времени также стоит посмотреть на вывод -vec-report, чтобы увидеть, где компилятор попытался векторизовать цикл и не смог; иногда есть небольшие изменения, которые вы можете внести в ваш цикл, что может привести к возможности векторизации (что может быть в 4 раза быстрее). Аналогично для более общего -opt-report .

nullglob
источник
Мне нравится ваш ответ, но я попробовал его еще раз с одним из наших тестов и -O3 -xhost -fp-model precise -fp-model exceptпривел к замедлению на 30% . Я еще раз посмотрю на профилирование и, -vec-reportчтобы попытаться увидеть, что происходит ...
FrenchKheldar
2
Более -O2 -xhost? Это интересно; это очень необычно, но это может случиться. В таких случаях оптимизатор делает что-то, что, как он имеет веские основания полагать, улучшит скорость, но, оказывается, ухудшает ситуацию. Обычно для научного кода, который имеет довольно простую структуру, этого не происходит. В таких случаях часто может помочь оптимизация профиля - software.intel.com/sites/products/documentation/hpc/compilerpro/…
5

Я работаю в компании, которая производит большие, высокотехнологичные приложения на Фортране с помощью IFort - приложения очень важны для производительности, так как скорость (при сохранении точности) является основным преимуществом.

Мы всегда компилируем с -O3, и, насколько мне известно, главное, что делает -O3, - это развертывание цикла и предварительная выборка. Я подозреваю, что большинство научных вычислительных приложений выигрывают от них, в частности, от циклических оптимизаций. Мы не видели ошибок компилятора довольно давно (хотя мы видели несколько ошибок компоновщика при использовании Ifort на Mac). Мы используем 11.1.095.

Надеюсь, это поможет.

OscarB
источник
4

Я понимаю, что этот ответ, вероятно, слишком, слишком поздно, но для агрессивной оптимизации вариант «-fast» кажется самым простым решением. Выдержки из справочной страницы:

-fast
    Maximizes speed across the entire program.
    Description:
    This option maximizes speed across the entire program.

    It sets the following options:
     - On Linux* systems: -ipo, -O3, -no-prec-div, -static, and -xHost
     - On OS X* systems: -ipo, -mdynamic-no-pic, -O3, -no-prec-div, and -xHost
     - On Windows*  systems:  /O3,  /Qipo,  /Qprec-div-,  and /QxHost

    NOTE: Option fast sets some aggressive optimizations that may not be appropriate for all
    applications. The resulting executable may not run on processor types different from the
    one on which you compile. You should make sure that you understand the individual optimi-
    zation options that are enabled by option fast.
user5428
источник