Быстрое ознакомление с оптимизацией компиляторов Intel 10.0


Пошаговый подход к оптимизации приложения с использованием компиляторов Intel.

До того, как вы начнете настраивать программу на эффективную работу, вы можете проверить ее на корректность, компилируя ее без оптимизации, используя ключи /Od (-O0).

  1. Основные опции для настройки. В большинстве случаев следует начинать с опций /O2 (-O2) (установка по умолчанию). Следующим шагом следует попробовать /O3 (-O3) для приложений с большим количеством циклов, особенно на архитектурах IA-64.
  2. Специфичные настройки для процессоров. Для полного списка рекомендуемых опций смотрите соответствующую таблицу. Для двухъядерных процессоров Intel Itanium 2 9000 используйте опцию /G2-p9000 (-mtune=itanium2-p9000).
  3. Используйте анализатор производительности Intel Vtune для помощи в обнаружении ключевых мест в коде, чтобы знать, какие именно части вашего приложения могут быть улучшены дальнейшими настройками. Отчеты по оптимизации компиляторов Intel также помогают в обнаружении мест, где компилятор может нуждаться в дополнительной информации от пользователя.
  4. Добавление межпроцедурной оптимизации (IPO) /Qipo (-ipo) и/или управляемой профилем оптимизации (PGO) /Qprof-gen (-prof-gen и -prof-use), затем измерить производительность еще раз и определить, есть ли выигрыш от применения какой-то из этих оптимизаций, или от обоих сразу.
  5. Оптимизация приложения для гипертрединговых, многоядерных или многопроцессорных систем путем использования опций /Qparallel (-parallel), /Qopenmp (-openmp) или использования библиотек Intel Performance Libraries или элементов Intel Threading Building Blocks.
  6. Использование профилировщика Intel Thread Profile для помощи в понимании структуры программ и максимизации их производительности. Использование Intel Thread Checker для сокращения времени на доработку параллельных приложений путем обнаружения специфичных ошибок и увеличения скорости разработки приложения в целом. Оба инструмента работают с бинарным инструментарием. Использование компилятора Intel с кодом программы, оснащенным таким инструментарием, даст более полную информацию об исходном коде.

Более подробная информация может быть получена из документации компилятора и документа "Optimizing Applications with the Intel C++ & Fortran Compilers" (PDF, 1.14MB, eng.).

Основные опции

Начинайте настройку эффективности с использования ключей /O1, /O2 или /O3 (-O1, -O2 или -O3 ). Это основные опции для оптимизации, которые должны быть использованы, прежде всего, при настройке приложения для всех процессоров. Произведите замеры производительности до того, как приступите к использованию расширенных опций оптимизации.

Windows Linux,
Mac OS
Комментарии
/Od -O0 Без оптимизации. Используется на ранних стадиях разработки и отладки приложения для проверки корректности работы программы.
/O1 -O1 Оптимизация по размеру. Не использует методов оптимизации, которые могут увеличить размер кода. Создает в большинстве случаев самый маленький размер кода.
/O2 -O2 Максимизация скорости. Установка по умолчанию. Как правило, создает более быстрый код, чем /O1 (-O1).
/O3 -O3 Задействует методы оптимизации из /O2 (-O2) и, дополнительно, более агрессивные методы оптимизации циклов и доступа к памяти, такие как подстановка скаляров, раскрутка циклов, подстановка кода для избежания ветвлений, блокирование циклов для обеспечения более эффективного использования кэш-памяти и, только на системах архитектуры IA-64, дополнительная подготовка данных. Данная опция особенно рекомендуется для приложений, где есть циклы, которые активно используют вычисления с плавающей точкой или обрабатывают большие порции данных. Эти агрессивные методы оптимизации могут в ряде случаев и замедлить работу приложений других типов по сравнению с использованием /O2 (-O2).
/zi -g Генерирует отладочную информацию для использования с любым обычным отладчиком. Эта опция отключает /O2 (-O2) и делает /Od (-O0) по умолчанию до тех пор, пока тип оптимизации не будет указан явно.
/debug:full -debug full Облегчает отладку оптимизированного кода добавлением символьной информации, включая информацию о локальной таблице символов, независимо от используемого уровня оптимизации. Это может привести к минимальным снижениям производительности. Если эта опция указывается для приложения, которое делает вызовы к подпрограммам библиотек языка С, которые надо отладить, опция /dbglibs также должна быть указана для подключения соответствующих отладочных библиотек С.

Производительность параллельных программ

Компиляторы Intel поддерживают разработку многопроцессных приложений для гипертрединговых, многоядерных и/или многопроцессорных систем посредством двух опций: /Qparallel (-parallel) или /Qopenmp (-openmp). Если вы используете Intel Thread Profiler или Intel Thread Checker для настройки ваших приложений, используйте /Qtcheck (-tcheck) в случае Intel Thread Checker и /Qtprofile (-tprofile) в случае Intel Thread Profiler.

Windows Linux,
Mac OS
Комментарии
/Qopenmp -openmp Задействует создание кода на базе директив OpenMP.
/Qopenmp-report
{0|1|2}
-openmp-report
{0|1|2}
Задает уровень диагностики OpenMP. Установка по умолчанию /Qopenmp-report1.
/Qparallel -parallel Обнаруживает циклы с простой структурой, которые могут быть безопасно выполнены в параллельном режиме и автоматически создает параллельный код для таких циклов.
/Qpar-report
{0|1|2|3}
-par-report
{0|1|2|3}
Управляет уровнями диагностики автоматического распараллеливания:
0 - Не выдает диагностической информации.
1 - Помечает успешно распараллеленный циклы (установка по умолчанию).
2 - добавляет информацию о циклах, которые не удалось преобразовать.
3 - Добавляет информацию о всех найденных или подозреваемых зависимостях, не позволяющих распараллеливание.
/Qpar-threshold[n] -par-threshold[n] Устанавливает порог для автоматического распараллеливания циклов, базирующийся на вероятности выгодности выполнения цикла в параллельном режиме, параметр n - в диапазоне от 0 до 100 (по умолчанию n=100).
0 - Распараллеливать циклы вне зависиомти от вычислительной сложности.
100 - Распараллеливать циклы только в случае почти однозначной выгодности выполнения циклов в параллельном режиме.
Опция должна использоваться совместно с /Qparallel (-parallel)
/Qtprofile -tprofile Позволяет получить информацию о структуре параллельного приложения для использования в целях их настройки для достижения максимальной производительности. Опция создает бинарный файл, который сгенерирует данные о приложении, которые могут быть просмотрены с помощью Intel Thread Profiler.
/Qtcheck -tcheck Позволяет получить информацию для диагностики ошибок в параллельной части параллельного приложения. Эта опция создает бинарный файл, который сгенерирует данные о приложении, которые могут быть просмотрены с помощью Intel Thread Checker.
/Qopt-mem-bandwith
(только для IA-64)
-opt-mem-bandwith
(только для IA-64)
Запрещает использовать методы оптимизации, которые могут увеличить требования к объему используемой памяти.
/Qopt-mem-bandwidth0 (-opt-mem-bandwidth0) - нет запрета (установка по умолчанию)
/Qopt-mem-bandwidth1 (-opt-mem-bandwidth1) - запрещает оптимизацию циклов в секциях OpenMP (используется по умолчанию с /Qparallel (-parallel) или /Qopenmp (-openmp)).
/Qopt-mem-bandwidth2 (-opt-mem-bandwidth2) - запрещает оптимизацию для всех циклов. Может использоваться для MPI или других параллельных приложений.
Для Mac OS опция не поддерживается.

Cпецифичные для процессоров архитектур IA-32 и Intel 64

Используйте /QxT (-xT в случае Linux и Mac OS) для лучших результатов на процессорах семейства Intel Core2 и /QxP (-xP в Linux) на более старых системах на базе Intel, поддерживающих инструкции SSE3. Рекомендуется использовать /QaxT /QxW (-axT -xW в Linux) для лучших результатов на семействе Intel Core2 и хорошей производительности на других системах, поддерживающих SSE2, включая процессоры от AMD. Для лучшей производительности на не Intel процессорах, поддерживающих инструкции SSE3, рекомендуется использовать /QxO (-xO) вместо /QxW (-xW). Рекомендуемые опции для более старых процессоров смотрите ниже. Как и на предыдущих шагах, производите замер влияния на производительность каждой из опций, чтобы принять лучшие решения. Используйте отчеты оптимизаторов компилятора Intel для того чтобы понять, можно ли помочь компилятору разрешить какие-либо сложности, например, возможные зависимости или альясы.

Windows Linux,
Mac OS
Комментарии
/Qx{S|T|P|O|N|W|K} -x{S|T|P|O|N|W|K} Для создания приложения, исполняемого на конкретном типе процессора. Генерирует специальный код для такого процессора и задействует векторизацию. Исполняемый файл должен запускаться только на совместимых процессорах.

S - Может генерировать инструкции SSE4, SSSE3, SSE3, SSE2 и SSE для процессоров Intel. Оптимизирует и для будущих процессоров Intel, поддерживающих векторизацию компилятора SSE4 и медиа-акселераторы.

T - может генерировать инструкции SSSE3, SSE3, SSE2 и SSE для процессоров Intel. Оптимизирует для процессоров семейства Intel Core2 Duo, четырехъядерных процессоров Intel Xeon и двухъядерных процессоров Intel Xeon серий 5300, 5100 и 3000.

P - Может генерировать инструкции SSE3, SSE2 и SSE для процессоров Intel. Оптимизирует для микроархитектуры процессоров Intel Core, процессоров Intel Pentium 4 с SSE3, процессоров Intel Xeon с SSE3, двухъядерных процессоров Intel Pentium T2060, процессоров Intel Pentium Extreme Edition и процессоров Intel Pentium D. Осуществляет оптимизации, не задействованные с /QxO (-xO).

O - Может генерировать инструкции SSE3, SSE2 и SSE. Оптимизирует для микроархитектур процессоров Intel Core, процессоров Intel Pentium 4 с SSE3, процессоров Intel Xeon с SSE3, двухъядерных процессоров Intel Pentium T2060, процессоров Intel Pentium Extreme Edition и процессоров Intel Pentium D. Код может быть выполнен и не на процессорах Intel, поддерживающих SSE3*.

N - Может генерировать инструкции SSE2 и SSE для процессоров Intel. Оптимизирует для процессоров Intel Pentium 4, процессоров Intel Xeon с SSE2 и процессоров Intel Pentium M. Осуществляет оптимизации, не задействованные с /QxW (-xW).

W - может генерировать инструкции SSE2 и SSE. Оптимизирует для процессоров Intel Pentium 4 и процессоров Intel Xeon с SSE2. Код может быть выполнен и не на процессорах Intel, поддерживающих SSE2 и SSE*.

K - Может генерировать инструкции SSE. Оптимизирует для процессоров Intel Pentium III и процессоров Intel Pentium III Xeon. Код может быть выполнен и не на процессорах Intel, поддерживающих SSE*.

Примечание: на Mac OS значения опций O, N, W и K не поддерживаются. Для систем с Mac OS архитектуры IA-32 -xP является установкой по умолчанию. Для систем Mac OS архитектуры Intel 64 установкой по умолчанию является -xT.
/Qax{S|T|P|N|W|K} -ax{S|T|P|N|W|K} Автоматический выбор процессора. Генерирует специальный код и задействует векторизацию, создавая код, не привязанный к конкретному процессору. Можно использовать более одного значения для получения одного исполняемого файла под разные процессоры. Например, для наилучшей производительности на процессорах семейства Intel Core2 Duo, четырехъядерных процессорах Intel Xeon, двухъядерных процессорах Intel Xeon серий 5300, 5100 и 3000 при возможности хорошей работы и на процессорах AMD, поддерживающих только SSE2, используйте /QaxT /QxW (-axT -xW в Linux) для генерации бинарного файла, использующего SSSE3 и настроенного и для не-SSSE3 x86-64 процессоров.

В данном примере комбинация /QaxT /QxW (-axT -xW в Linux) даст бинарный файл с двумя видами кода. Один код даст возможность использовать полное преимущество процессоров семейства Intel Core2 Duo, четырехъядерных процессоров Intel Xeon processors и двухъядерных процессоров Intel Xeon серий 5300, 5100 и 3000. Другой код также даст возможность использовать возможности процессоров Intel и будет работать и на процессорах, не поддерживающих SSE3.

Во время работы приложение автоматически определяет тип используемого процессора и выбирает соответствующий вариант кода. Примечания: Значение опции O не поддерживается для /Qax (-ax). Значения P, N, W и K не поддерживаются в Mac OS.
/Qvec-report[n] -vec-report[n] Разметка возможности векторизации циклов:
n = 0: без информации
n = 1: размечает векторизуемые циклы (настройка по умолчанию)
n = 2: размечает и векторизуемые, и не векторизуемые циклы
n = 3: размечает векторизуемые циклы и объяснения, почему не векторизуемые не могут векторизоваться

*Значения опций O, W и K создают бинарные файлы, которые должны запускаться не на процессорах Intel, таких как AMD, имеющих такие же возможности, как и соответствующие процессоры Intel. Значения опции P и N добавляют дополнительные оптимизации, которые не задействуются опциями O и W.

Cпецифичные для процессоров архитектур IA-64

В основном, использование /O3 (-O3), IPO и/или PGO, в сочетании с отчетами оптимизации (описанными в разделе тонкой настройки), помогающими разрешить возможные проблемы с альясами и улучшить использование памяти, обеспечивает наилучшую производительность на системах на базе IA-64.

Windows Linux,
Mac OS
Комментарии
/G2 -mtune=itanium2 Оптимизирует приложение для процессоров Intel Itanium 2.
Сгенерированный код также совместим с более старыми процессорами IA-64.
(установка по умолчанию)
/G2-p9000 -mtune=itanium2-p9000 Оптимизирует для двухъядерных процессоров Intel Itanium 2 9000.
Сгенерированный код также совместим со всеми процессорами IA-64, пока в программе нет вызовов функций, специфичных для процессоров Intel Itanium 2 9000.
/QIPF-fma[-] -IPF-fma[-] Активирует [деактивирует] комбинирование операций умножения с плавающей точкой и операций сложения/вычитания.
(включено по умолчанию)
/Qivdep-parallel -ivdep-parallel Задает отсутствие зависимостей по памяти в циклах, где указана директива IVDEP. Обычно используется в сочетании с /Qparallel (-parallel).
/Qprefetch[-] -prefetch[-] Включает или выключает предварительные подстановки.

Межпроцедурная (IPO) и профильно-зависимая оптимизация (PGO)

IPO включает в себя подстановку функций для сокращения накладных расходов на их вызовы и предоставляет другие возможности для оптимизации.

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

Однако IPO может увеличивать размер кода. Следует обратить внимание на оценки как производительности, так и времени компиляции и изменение размера кода с этими опциями. IPO лучше всего использовать в сочетании с PGO для определения тех функций, тело которых имеет смысл подставлять вместо вызова.

Windows Linux,
Mac OS
Комментарии
/Qip -ip Оптимизация отдельного файла.
Межпроцедурные оптимизации, включая выборочные подстановки внутри этого файла.

Внимание: Для больших файлов эта опция может существенно увеличить время компиляции и размер кода.
/Qipo[value] -ipo[value] Разрешает подстановки и другие межпроцедурные оптимизации с несколькими исходными файлами. Значение в опции управляет максимальным числом выполненных компиляций (или числом объектных файлов). Значение по умолчанию - 0 (выбирает компилятор).

Внимание: Эта опция может существенно увеличить время компиляции и размер кода.
/Qipo-jobs[n] -ipo-jobs[n] Определяет количество команд (заданий) для одновременного выполнения на фазе линкования IPO. Значение по умолчанию - 1.
/Ob2 -finline-functions-finline-level=2 Эта опция разрешает подстановку функций внутри текущего исходного файла на усмотрение компилятора. Опция задействована по умолчанию при /O2 и /O3 (-O2 и -O3).

Внимание: Эта опция может существенно увеличить время компиляции и размер кода. Она может быть отключена с помощью /Ob0 (-fno-inline-functions в Linux и Mac OS).
/Qinline-factor=n -finline-factor=n Эта опция масштабирует общий и максимальный размеры функций, которые могут подставляться. Значение по умолчанию - 100, т.е. 100% или единичный масштаб.
/Qprof-gen -prof-gen Обеспечивает инструментами для профилирования.
/Qprof-use -prof-use Включает использование профильной информации в ходе оптимизации.
/Qprof-dir dir -prof-dir dir Определяет директорию для выходных файлов профилирования *.dyn и *.dpi.

Арифметика с плавающей точкой

Компиляторы Intel предоставляют опции для улучшения последовательности использования или точности результатов операций с плавающей точкой на всех архитектурах Intel ценой некоторого снижения производительности. Более подробную информацию можно найти в полном описании опций оптимизаторов.

Windows Linux,
Mac OS
Комментарии
/fp:name -fp-model name Этот метод управления последовательностью результатов выполнения операций с плавающей точкой путем запрещения оптимизаций рекомендуется с опциями /Op (-mp) и /Qprec (-mp1). Возможные значения:

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

double/extended/source - неявно выражает точность, вычисляя промежуточные значения с точностью double, extended или исходной. Значения double и extended недоступны для компилятора Intel Fortran.

fast=[1|2] - позволяет использовать более агрессивные методы оптимизации ценой незначительного падения точности или последовательности вычислений. (fast=1 по умолчанию)

except - разрешает семантику floating point exception.

strict - режим строгого выполнения, включает как опции precise, так и except и отключает сжатие fma.

Рекомендация: /fp:source (-fp-model source) рекомендуется для большинства ситуаций с процессорами IA-64, на процессорах, поддерживающих Intel 64, и на IA-32 в случае использования SSE с помощью /QxW (-xW) или выше, когда требуется дополнительная связанность и повторимость операций с плавающей точкой.
/Qfp-speculation mode -fp-speculation mode Управляет анализом операций с плавающей точкой в следующих режимах:

fast - анализировать операции с плавающей точкой. (по умолчанию)

off - отключает анализ операций с плавающей точкой.

safe - Не анализировать, если это может вызвать несоответствие.

strict - то же, что и off.
/Qftz[-] -ftz[-] Когда основная программа или dll компилируется с этой опцией, не инициализированные значения обнуляются для всей программы (dll). Установка этой опции не гарантирует, что все не инициализированные значения будут обнулены. Обнуляются лишь те значения, которые были сгенерированы во время запуска.
В системах на базе IA-64 опция по умолчанию выключена, кроме /O3 (-O3).
В системах на базе IA-32 и Intel 64 опция по умолчанию включена, кроме /Od (-O0), но обнуляются только замеченные не инициализированные значения в результате выполнения инструкций SSE.

Тонкая настройка (все процессоры)

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

Полная документация по компиляторам Intel С++ и Fortran содержит детальное описание прагм, директив и интринзиков, которые могут быть использованы для раскрутки циклов, векторизации и других методов для тонкой настройки внутри кода вашего приложения.

Windows Linux,
Mac OS
Комментарии
/Qunroll[n] -unroll[n] Устанавливает максимально число раскруток циклов.

/Qunroll0 (-unroll0) отключает раскрутку.

/Qunroll (-unroll) позволяет выбирать число раскруток компилятору (значение по умолчанию).
/Qrestrict[-] -[no]restrict Включает [выключает] устранение неоднозначности с указателями с помощью запрещающих ключевых слов.
/Oa -fno-alias Указывает отсутствие алиасов в программе.
/Ow -fno-fnalias Указывает отсутствие алиасов в теле функций.
/Qalias-args[-] -alias-args[-] Подразумевает, что аргументы функций могут иметь алиасы [не могут].
/Qopt-class-analysis[-] -[no-]opt-class-analysis Эта опция использует информацию об иерархии классов С++ для анализа и разрешения виртуальных вызовов функций во время компиляции. Если приложение на С+++ содержит нестандартные конструкции, это может привести к разным результатам. По умолчанию, опция выключена, но включена при использовании /Qipo (-ipo), делая доступным улучшенную оптимизацию для С++.

Примечание: Поддерживается только для С++.
-fexceptions Опция включает создание таблицы обработки несоответствий. В приложениях, написанных на нескольких языках, опция не дает подпрограммам Fortran конфликтовать с обработкой несоответствий в подпрограммах С++. Используется по умолчанию для С++.
-fno-exceptions Опция отключает создание таблицы обработки несоответствий, делая код меньше. Когда опция используется, при любой обработке несоответствий С++ во время вызова подпрограмм Fortran будет получена ошибка.
/Qopt-report -opt-report Генерирует отчет об оптимизации в stderr.
/Qopt-report-levellevel -opt-report-levellevel Устанавливает подробность сообщений на выходе. Возможные значения: min (по умолчанию), med и max.
/Qopt-report-phasename -opt-report-phasename Создание отчетов. По умолчанию не создаются. Опция может использоваться несколько раз для получения отчетов на разных фазах хода компиляции. Возможные значения аргумента:

all - все возможные отчеты для данной фазы

ipo - отчеты IPO

ipo_inl - только отчеты IPO по подстановке функций

hlo - отчеты HLO

hpo - отчеты HPO

ecg - отчеты Code Generator (только Windows и Linux на IA-64)

ecg_swp - только отчеты по пайплайнингу от Code Generator (только Windows и Linux на IA-64)

pgo - отчеты PGO
/Qopt-report-routine[rtn] -opt-report-routine[rtn] Определяет подпрограмму rtn. Генерирует отчеты от всех подпрограмм с именами, для которых rtn является частью имени. По умолчанию, выдает отчеты по всем подпрограммам.
/Qopt-report-help -opt-report-help Показывает все возможные установки для /Qopt-report-phase (-opt-report-phase). При этом компиляция не производится.

Рекомендуемые опции для конкретных процессоров

Для наилучшей производительности на процессоре: Windows Mac OS Linux
Будущий процессор Intel, поддерживающий SSE4, векторизующий компилятор и медиа-ускорители /QxS
/QaxS
-xS
-axS
-xS
-axS
Intel Core2 Extreme
Intel Core2 Duo
Dual-Core Intel Xeon серий 5300, 5100 и 3000
Quad-Core Intel Xeon
/QxT
/QaxT
-xT
-axT
-xT
-axT
Intel Core Duo, Intel Core Solo
Intel Pentium 4 с поддержкой инструкций SIMD Extension 3 (SSE3)
Intel Pentium D
Intel Xeon (только с поддержкой SSE3)
Intel Pentium dual-core T2060
Intel Pentium Extreme Edition
Dual-Core Intel Xeon 7000, 5000 и 3200
Dual-Core Intel Xeon ULV и LV
Dual-Core Intel Xeon 2.8
/QxP
/QaxP
-xP -xP
-axP
Системы на базе процессора Intel, поддерживающие SSE2 и SSE*
Системы на безе не-Intel процессоров, поддерживающие SSE3, SSE2 и SSE*, такие как AMD
/QxO -xO
Intel Pentium 4
Intel Pentium M
Intel Xeon без поддержки SSE3(только IA-32)
/QxN
/QaxN
-xN
-axN
Системы на базе процессоров Intel, поддерживающие SSE*
Системы на базе не-Intel процессоров, поддерживающие SSE2 и SSE*, такие как AMD
/QxW
/QaxW
-xW
-axW
Intel Pentium III
Intel Pentium III Xeon
Системы на базе не-Intel процессоров x86, поддерживающие SSE*, такие как AMD
/QxK
/QaxK
-xK
-axK
Intel Itanium 2 /G2 -mtune=itanium2
Dual-core Intel Itanium 2 9000 /G2-p9000 -mtune=itanium2-p9000

© Лаборатория Параллельных информационных технологий НИВЦ МГУ
Rambler's Top100