Сравнение опций оптимизации компиляторов Intel, GNU, PGI, PathScale.
Рассмотрим решение уравнения Пуассона:
Intel Compiler 11
Применяемые опции оптимизации
- -O0 - без оптимизации
- -O1 - оптимизация для максимальной скорости, но без включения оптимизаций, которые увеличивают размер кода и при этом дают небольшой выигрыш по скорости
- -О2 - оптимизация для максимальной скорости (используется по умолчанию)
- -О3 - То же что и -O2, но включена более агрессивная оптимизация (в основном более агрессивная оптимизация для циклов), которая может не улучшать производительность для некоторых программ
- -fast - включает в себя -O3, а также ряд других флагов оптимизации, таких как -ipo (межпроцедурный анализ, замена вызовов небольших функций на их inline подстановки) и -xHOST (в случае процессоров Intel эта опция включает специальную оптимизацию для процессоров Intel с поддержкой SSE инструкций, в случае остальных процессоров код с поддержкой SSE инструкций для остальных архитекур).
flags | -O0 | -O1 | -O2 | -O3 | -fast |
---|---|---|---|---|---|
Решение уравнения Пуассона (сек.) | 19.98 | 9.04 | 6.99 | 6.9 | 6.51 |
Здесь применение более агрессивной оптимизации дает выигрыш по времени порядка 7%.
Использование опций оптимизации компилятора дает существенный выигрыш в производительности, но не всегда более агрессивная оптимизация даст лучший результат. Во многих случаях достаточно базовой оптимизации -O2. Для компилирования программ на кластере СКИФ МГУ для начала следует попробовать опцию -O2, а уже затем пытаться использовать более агрессивную оптимизацию. Для получения базовой информации об оптимизации по компилятору Intel можно набрать icc -help opt в коммандной строке при входе на кластер. Для получения расширенной информации об опциях оптимизации можно набрать icc -help advanced либо обратиться к документации.
GNU 4.1.2
Применяемые опции оптимизации:
- -O0 - без оптимизации
- -O1 - оптимизация для максимальной скорости, но без включения оптимизаций, которые увеличивают размер кода и при этом дают небольшой выигрыш по скорости
- -О2 - оптимизация для максимальной скорости (используется по умолчанию)
- -О3 - То же что и -O2, но включена более агрессивная оптимизация (в основном более агрессивная оптимизация для циклов), которая может не улучшать производительность для некоторых программ
flags | -O0 | -O1 | -O2 | -O3 |
---|---|---|---|---|
Решение уравнения Пуассона (сек.) | 22.53 | 9.29 | 9.31 | 9.26 |
Использование опций оптимизации дает прирост производительностиб, однако, в данном случае, использование агрессивной оптимизации не дает значительного эффекта. Для более подробной информации об оптимизации можно обратиться к документации.
PathScale Compiler Suite: Version 3.2
Используемые опции компилятора:
- -O0 - без оптимизации
- -O1 - оптимизация для максимальной скорости, но без включения оптимизаций, которые увеличивают размер кода и при этом дают небольшой выигрыш по скорости
- -О2 - оптимизация для максимальной скорости (используется по умолчанию)
- -О3 - То же что и -O2, но включена более агрессивная оптимизация (в основном более агрессивная оптимизация для циклов), которая может не улучшать производительность для некоторых программ
- -O3 -ipa - тоже что и O3, но дополнительно включен межпроцедурный анализ
- -O3 -OPT:Ofast - Более агрессивная небезопасная оптимизация, чем -O3.
- -Ofast - Более агрессивная небезопасная оптимизация, чем -O3.
flags | -O0 | -O1 | -O2 | -O3 | -O3 -ipa | -O3 -OPT:Ofast | -Ofast |
---|---|---|---|---|---|---|---|
Решение уравнения Пуассона (сек.) | 24.82 | 15.61 | 9.31 | 7.79 | 7.65 | 7.67 | 7.56 |
Использование опций оптимизации дает существенный прирост производительности. Для более подробной информации об оптимизации можно обратиться к документации.
Portland Group Inc. Compilers 7.2-3
Используемые опции компилятора:
- -O0 - без оптимизации
- -O1 - оптимизация для максимальной скорости, но без включения оптимизаций, которые увеличивают размер кода и при этом дают небольшой выигрыш по скорости
- -О2 - оптимизация для максимальной скорости (используется по умолчанию)
- -О3 - То же что и -O2, но включена более агрессивная оптимизация (в основном более агрессивная оптимизация для циклов), которая может не улучшать производительность для некоторых программ
- -fast - включает в себя -O2 и ряд других опций, таких как использование векторизации с поддержкой SSE инструкций.
- -fastsse - то же самое что и -fast
- -Mipa=fast - влючение межпроцедурного анализа
- -fast -O3 - тот же самый -fast, только вместо -O2 используется -O3.
flags | -O0 | -O1 | -O2 | -O3 | -fast | -fastsse -Mipa=fast | -fastsse -Mipa=fast -O3 |
---|---|---|---|---|---|---|---|
Решение уравнения Пуассона (сек.) | 12.95 | 10.31 | 7.95 | 7.87 | 6.41 | 6.42 | 6.37 |
Разработчики PGI рекомендуют в качестве универсальной оптимизации использовать -fastsse -Mipa=fast. Как видно из таблицы, время выполнения программы при использования оптимизации сократилось почти в 2 раза.
Для более подробной информации об опциях оптимизации можно набрать pgcc -help НУЖНАЯ_ОПЦИЯ_ОПТИМИЗАЦИИ либо обратиться к документации.
Сравнение
График наглядно демонстрирует, что на данном примере наилучшие результаты показали компиляторы Intel и Portland. Чуть хуже себя показал PathScale. И на последнем месте GNU Compiler.