Лекция 1: Элементы оптимизации прикладных программ для Intel Xeon Phi: Intel MKL, Intel VTune Amplifier XE
Выполнение только на сопроцессоре
Режим исполнения только на сопроцессоре предполагает использование только сопроцессоров без CPU. Каждый сопроцессор представляет собой отдельный вычислительный узел, который может обмениваться данными с другими узлами посредством MPI сообщений.
Данная модель предполагает написание программы так, как это делается для обычного центрального процессора, а затем ее компиляцию с ключом "–mmic". Запуск полученного бинарного файла должен осуществляться непосредственно на сопроцессоре.
Иными словами, это обычная модель программирования с выполнением кода только на Intel Xeon Phi.
При использовании этой модели рекомендуется задействовать все доступные потоки ускорителя, например, для Intel Xeon Phi с 60 ядрами и 4 потоками на ядро:
MIC_OMP_NUM_THREADS=240
Переменную KMP_AFFINITY рекомендуется устанавливать как [1.9]:
KMP_AFFINITY=explicit,proclist=[1-240:1,0,241,242,243],granularity=fine
Также рекомендуется использовать большие 2 МБ страницы памяти.
Рекомендации по выбору модели программирования
При выборе модели программирования для вашего приложения следует обратить внимание на следующие факторы:
- Если код имеет высокую степень параллелизма либо необходимо использовать ускорители как отдельные вычислительные узлы, то имеет смысл использовать модель выполнения только на сопроцессоре;
- Если в вашем случае доля вычислений на единицу памяти велика и вам нужны функции *GEMM, *TRMM, *TRSM либо функции LU и QR факторизации (появятся в ближайших релизах), тогда лучше выбрать модель AO;
- Если в программе есть участки вычислений, подходящие для перекрытия передач данных либо возможно переиспользование участков памяти на сопроцессоре, тогда можно использовать модель CAO.
Отметим также, что в случае недостаточной производительности в режимах offload, вы всегда можете легко перейти на использование CPU.
Оптимизация приложений с помощью Intel VTune Amplifier XE
В данном разделе описаны подходы к оптимизации программ для Intel Xeon Phi с использованием инструмента профилировки приложений Intel VTune Amplifier XE. Дается краткий обзор Intel VTune Amplifier, приводятся способы запуска профилировщика на сопроцессоре как в режиме GUI, так и с помощью командной строки. Описываются основные метрики эффективности, получаемые с помощью профилировки, на которые следует обратить внимание при оптимизации приложений.
Основная рекомендация при оптимизации программ для Intel Xeon Phi состоит в том, что первым шагом должна стать оптимизация приложения для центрального процессора.
Для того чтобы выделить те участки программы, которые нуждаются в оптимизации прежде всего, имеет смысл воспользоваться инструментом Intel VTune Amplifier XE. Применение hotspot анализа покажет те функции и участки программы, на которые тратится больше всего времени. Часто этого бывает достаточно. А если требуется более детальная оптимизация, тогда можно обратиться к другим типам анализа с целью получения низкоуровневой информации о ходе выполнения приложения.
Отметим, что найти кандидатов для оптимизации можно и с помощью отчетов компилятора Intel. В частности, можно получить информацию о функциях и циклах, занимающих больше всего времени, а также о среднем, минимальном и максимальном числе итераций этих циклов. Для этого следует собирать приложение с ключами:
-profile-functions -profile-loops=all -profile-loops-report=2
Результаты профилировки, которые будут записаны в файлы в текущей директории по окончании работы приложения, можно будет посмотреть либо в виде таблицы (dump файл), либо с помощью специального инструмента с GUI – Loop Profile Viewer (xml файл).
В процессе оптимизации приложения необходимо поддерживать его корректность, что особенно актуально при распараллеливании. Для выявления ошибок многопоточности можно использовать инструмент Intel Inspector XE. Также для эффективного распараллеливания приложения полезно иметь возможность анализа его выполнения с точки зрения работы потоков в нем. Такая возможность присутствует в Intel VTune Amplifier XE.
Однако Intel Inspector XE и анализ многопоточного исполнения в Intel Amplifier XE поддерживаются только для CPU. Поэтому:
- Рекомендуется использовать Intel Inspector XE для вашего кода с отключенной функцией offload’а для выявления в нем таких ошибок, как зависимость по данным, тупики и т.п. После исправления всех выявленных ошибок можно включать offload режим и продолжать отладку на сопроцессоре;
- Рекомендуется использовать инструменты анализа эффективности параллельных приложений в Intel VTune Amplifier XE для вашего кода с отключенной функцией offload’а для выявления проблем эффективности распараллеливания. И только после того, как удастся устранить все, что возможно, переходить на работу с сопроцессором и проводить на нем дальнейшую оптимизацию. При этом следует обратить внимание на эффективность синхронизации, т.к. число потоков на ускорителе значительно превосходит это число на обычном CPU. А также следует позаботиться о балансировке нагрузки опять же в силу значительно большего числа потоков.
Краткий обзор инструмента Intel VTune Amplifier XE
Инструмент Intel VTune Amplifier XE является профилировщиком производительности и масштабируемости приложений на многоядерных системах. Входит в состав набора для разработки ПО Intel Parallel Studio XE.
Инструмент, в частности, позволяет:
- Находить функции и участки кода, на выполнение которых расходуется больше всего времени. Анализирует стеки вызовов и исходный код;
- Определять количество внутренних событий процессора, которые влияют на производительность. Например, промахи кэша разных уровней, неверно предсказанные ветвления и др.;
- Определять время ожидания в блокировках потоков, а также уровень загрузки CPU.
Intel VTune Amplifier XE позволяет настроить желаемые параметры анализа работы приложения, а также включает в себя определенное количество предварительно настроенных типов анализа, наиболее используемые из которых:
- Hotspots. Предназначен для выявления "узких мест" в программе. Определяет, какие функции или участки программы работают дольше всего. В основном используется на первом этапе оптимизации для выявления областей кода, требующих ускорения.
- Concurrency. Этот тип анализа показывает эффективность использования ядер процессора во время выполнения программы. Демонстрирует качество распараллеливания кода и участки, которые следует распараллелить.
- Locks and Waits. Показывает точки блокировки и время ожидания потоков. Предназначен для оценки эффективности используемой схемы синхронизации.
Кроме описанных выше типов анализа в инструменте присутствует возможность сбора информации о событиях микроархитектурного уровня, таких как доступ к кэшам различного уровня и промахи кэша, доступ к памяти, неверно предсказанные ветвления и др. Присутствуют и различные готовые типа анализа, направленные на выявление определенных проблем с производительностью (например, проблем доступа в кэши или память).
Инструмент доступен для операционных систем семейства Windows и Linux.