Нижегородский государственный университет им. Н.И.Лобачевского Факультет Вычислительной математики и кибернетики Лекция 5 Элементы оптимизации прикладных.

Презентация:



Advertisements
Похожие презентации
Таблица умножения на 8. Разработан: Бычкуновой О.В. г.Красноярск год.
Advertisements

Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Лекция 1 Раздел 1 Windows Phone Темы раздела 3 Windows Phone Устройство на платформе Windows Phone 4.
OpenMP. Различие между тредами и процессами ПроцессыТреды.

Лекция 2 Раздел 2.1 Windows Phone Темы раздела 3.
1. Определить последовательность проезда перекрестка
ОДНОМЕРНЫЕ МАССИВЫ. РАБОТА С ЭЛЕМЕНТАМИ СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ.
1 Знаток математики Тренажер Таблица умножения 2 класс Школа 21 века ®м®м.
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 4500 к решению Совета депутатов города Новосибирска от
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Урок-обобщение (7 класс – алгебра) МОУ "СОШ 45 г. Чебоксары" Кабуркина М. Н.1.
Прототип задания В3 Площади фигур. Задание 1 Задание 2.
Матемтааки ЕТ СТ 2 класс Шипилова Наталия Викторовна учитель начальных классов, ВКК Шипилова Наталия Викторовна учитель начальных классов, ВКК.
1 До зеленых человечков: исследовательское тестирование приложений для мобильных Роман Твердохлебов, Санкт-Петербург.
Разработка параллельных приложений для многоядерных систем С.В. Ковальчук НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО.
П РОТОТИП ЗАДАНИЯ В3 В МАТЕРИАЛАХ ЕГЭ Площади фигур.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Томский политехнический университет.
Отделение ПФР по Тамбовской области Проведение кампании по повышению пенсионной грамотности молодежи в Тамбовской области в 2011 году 8 февраля 2012 г.
Урок повторения по теме: «Сила». Задание 1 Задание 2.
Транксрипт:

Нижегородский государственный университет им. Н.И.Лобачевского Факультет Вычислительной математики и кибернетики Лекция 5 Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Программирование для Intel Xeon Phi Горшков А.В. Кафедра математического обеспечения ЭВМ При поддержке компании Intel

Содержание Введение Расширения языков программирования C/С++ –Явная схема работы с памятью –Неявная схема работы с памятью –Сравнение явной и неявной схемы Векторизация –Автоматическая векторизация –Директива SIMD –Технология Array Notation –Элементарные функции –Элементы эффективной векторизации Подходы к оптимизации прикладных программ Литература Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 2 из 79

Введение Intel Xeon Phi – новый сопроцессор от компании Intel, призванный существенно ускорить процесс вычислений для некоторого класса задач, алгоритмы решения которых допускают существенную степень параллелизма и векторизации Сопроцессор основан на архитектуре Intel Many Integrated Core (MIC), содержит несколько десятков x86 CPU ядер, поддерживает сотни потоков исполнения Основное достоинство – для создания программ для Intel Xeon Phi используются знакомые инструменты (C/C++ Compiler, OpenMP, MPI), не требуется существенной модификации кода НО: для эффективной работы требуется оптимизация Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 3 из 79

Методы работы с сопроцессором Явная схема работы с памятью: –Использование директив компилятора: #pragma offload –Явное управление обменами данных с сопроцессором Неявная схема работы с памятью: –Использование ключевых слов расширения Intel Cilk Plus –Использование участков памяти, разделяемых между процессором и сопроцессором Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 4 из 79

1. Явная схема работы с памятью Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 5 из 79

Явная схема работы с памятью… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 6 из 79

Явная схема работы с памятью: С/C++ Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler ОписаниеC/C++ синтаксис Семантика Директива offload#pragma offload Запуск участка кода на сопроцессоре или CPU Ключевое слово для указания MIC функции или переменной __attribute__((target(mic)))Компиляция функции или объявление переменной одновременно для CPU и сопроцессора Указание MIC блока кода #pragma offload_attribute(push, target(mic)) … #pragma offload_attribute(pop) Компиляция блока кода одновременно для CPU и сопроцессора Отдельная передача данных #pragma offload_transfer target(mic) Обеспечивает синхронную или асинхронную передачу данных между CPU и сопроцессором Н. Новгород, 2013 г. 7 из 79

Явная схема работы с памятью: Fortran Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler ОписаниеC/C++ синтаксис Семантика Директивы offload!dir$ omp offload Запуск параллельного (OpenMP) участка кода на сопроцессоре или CPU dir$ offload Запуск участка кода (вызов функции) на сопроцессоре или CPU Ключевое слово для указания MIC функции или переменной !dir$ attributes offload: :: OR Компиляция функции или объявление переменной одновременно для CPU и сопроцессора Отдельная передача данных !dir$ offload_transfer target(mic) Обеспечивает синхронную или асинхронную передачу данных между CPU и сопроцессором Н. Новгород, 2013 г. 8 из 79

Явная схема работы с памятью… Код будет выполнен на одном из доступных сопроцессоров Если сопроцессоров нет или они не доступны, код будет выполнен на центральном процессоре Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Код будет выполнен на сопроцессоре с номером (n % ) Если сопроцессор недоступен – возникнет ошибка времени исполнения Н. Новгород, 2013 г. 9 из 79

Явная схема работы с памятью: механизм вызова функции на сопроцессоре На сопроцессоре выделяется память под массивы a[] и b[]. Выполняется передача данных (всех массивов и переменных) на сопроцессор. Функция запускается на исполнение на Intel Xeon Phi. Выполняется передача данных (всех массивов) с сопроцессора в оперативную память. Удаляется память на сопроцессоре. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 10 из 79

Явная схема работы с памятью… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Операторы (clauses)C/C++ синтаксис Семантика Target спецификацияtarget(name[:card_number])Явное указание того, где запускать код Условный offloadif (condition)Запуск кода, если условие истинно Входin (var-list [modifiers])Копирование с хоста на сопроцессор Выходout (var-list [modifiers])Копирование с сопроцессора на хост Вход и выходinout (var-list [modifiers])Копирование в обе стороны Отмена копированияnocopy (var-list [modifiers])Локальные данные сопроцессора Асинхронный offloadsignal(signal-slot)Режим асинхронного offloadа Асинхронный offloadwait(signal-slot)Ожидание завершения асинхронного offloadа Н. Новгород, 2013 г. 11 из 79

Явная работа с памятью… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Модификаторы (modifiers) С/C++ синтаксис Семантика Размер памяти при копировании length (element-count-expr)Размер указывается в элементах, а не в байтах Условное выделениеalloc_if (condition)Выделить память на сопроцессоре, если условие истинно Условное освобождениеfree_if (condition)Удалить память на сопроцессоре, если условие истинно Выравниваниеalign (expression)Задание минимального выравнивания данных на сопроцессоре Н. Новгород, 2013 г. 12 из 79

Явная схема работы с памятью: статическая память Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 13 из 79

Явная схема работы с памятью: динамическая память… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 14 из 79

Явная схема работы с памятью: динамическая память Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 15 из 79

Явная работа с памятью: одновременное выполнение на процессоре и сопроцессоре Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 16 из 79

Явная схема работы с памятью: схема двойной буферизации… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 17 из 79

Явная схема работы с памятью: схема двойной буферизации… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 18 из 79

Явная схема работы с памятью: схема двойной буферизации… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 19 из 79

Явная схема работы с памятью: схема двойной буферизации… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 20 из 79

Явная схема работы с памятью: схема двойной буферизации Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 21 из 79

Явная схема работы с памятью: работа со структурами… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 22 из 79

Явная схема работы с памятью: работа со структурами Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 23 из 79

2. Неявная схема работы с памятью Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 24 из 79

Неявная схема работы с памятью… Основана на использовании ключевых слов Позволяет работать со сложными типами данных Поддерживается только в языках C/C++ Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 25 из 79

Неявная схема работы с памятью… Для выделения участка разделяемой памяти динамически необходимо воспользоваться функциями: void *_Offload_shared_malloc(size_t size); void *_Offload_shared_aligned_malloc(size_t size, size_t alignment); Удаление памяти выполняется соответственно с помощью функций: void _Offload_shared_free(void *p); void _Offload_shared_aligned_free(void *p); Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 26 из 79

Неявная схема работы с памятью: _Cilk_shared Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Что Синтаксис Семантика Функцииint _Cilk_shared f(int x) { return x + 1; } Компиляция для CPU и MIC, функция может быть вызвана на любой стороне Глобальные переменные _Cilk_shared int x = 0;Переменная доступна на обеих сторонах Статические переменные static _Cilk_shared int x;Переменная доступна на обеих сторонах, видна только в рамках файла/функции Классыclass _Cilk_shared x {…};Поля, методы и операторы класса доступны на обеих сторонах Указатели на разделяемые данные int _Cilk_shared *p;Локальный указатель на разделяемые данные Разделяемые указатели int* _Cilk_shared p;Разделяемый указатель, должен указывать на разделяемые данные Блоки кода#pragma offload_attribute(push, target(mic)) … #pragma offload_attribute(pop) Аналог _Cilk_shared для целого блока кода Н. Новгород, 2013 г. 27 из 79

Неявная схема работы с памятью: _Cilk_offload Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Функциональность ПримерОписание Вызов функции на сопроцессоре x = _Cilk_offload func(y);Функция выполняется на сопроцессоре, если это возможно x = _Cilk_offload_to(card_num) func(y); Функция должна выполниться на указанном сопроцессоре Асинхронный вызов на сопроцессоре x = _Cilk_spawn _Cilk_offload func(y); Неблокирующее выполнение на сопроцессоре Параллельный цикл for на сопроцессоре _Cilk_offload _Cilk_for(i=0; i

Неявная схема работы с памятью Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 29 из 79

Сравнение явной и неявной схемы Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Явная схема Неявная схема Типы данных, для которых возможно автоматическое копирование Скаляры, массивы, структуры с возможностью побитового копирования Все типы данных Когда происходит передача данных Пользователь может явно контролировать передачу данных для каждой Offload директивы Разделяемые данные синхронизируются в начале и в конце операторов _Cilk_offload Когда Offload код копируется на сопроцессор При первом вызове #pragma offload В начале работы программы Поддержка языков программирования Fortran, C, C++ (без возможности передачи объектов класса) C, C++ Синтаксис Директивы #pragma offload (С/C++) и !dir$ offload (Fortran) Ключевые слова _Cilk_shared и _Cilk_offload Используется для…Передачи непрерывных блоков данных Передачи сложных структур данных или многих маленьких участков данных Н. Новгород, 2013 г. 30 из 79

3. Векторизация Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 31 из 79

Векторизация… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 32 из 79

Векторизация… В некоторых простых случаях компилятор может сам векторизовать ваш код Можно использовать возможности параллельного расширения Intel Cilk Plus для самостоятельной векторизации кода Можно воспользоваться библиотеками с уже векторизованным кодом, например, Intel MKL Можно использовать язык ассемблера с векторными инструкциями для оптимизации критичных участков кода, либо, что более удобно, оболочки этих инструкций в виде функций языка Си (intrinsics). Существуют также библиотеки классов SIMD Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 33 из 79

Автоматическая векторизация… *p является инвариантом цикла A, B и C являются инвариантами цикла A[] не является другим именем для B[], C[] и/или sum (нет перекрытия по памяти между этими данными) sum не является другим именем для B[] и/или C[] (нет перекрытия по памяти между этими данными) операция + является ассоциативной ожидается ускорение векторной версии данного кода по отношению к скалярной Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 34 из 79

Автоматическая векторизация Для компилятора часто сложным является ответ на вопрос о том, что массив A[] не перекрываются с массивами B[] и C[]. Для того чтобы отразить это в синтаксисе языка, можно объявить указатель A с ключевым словом restrict: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Для того чтобы сказать компилятору об отсутствии зависимостей в цикле, используется директива #pragma ivdep перед телом цикла: Н. Новгород, 2013 г. 35 из 79

Использование директивы SIMD… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 36 из 79

Использование директивы SIMD… vectorlength(n) – данный параметр определяет количество итераций цикла, которые могут быть выполнены независимо за одну векторную операцию Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler linear(var1:step1 [,var2:step2]...) – этот параметр сообщает компилятору, что переменные var инкрементируются с шагом step на каждой итерации цикла Н. Новгород, 2013 г. 37 из 79

Использование директивы SIMD… reduction(oper:var1 [,var2]…) – параметр аналогичен соответствующему параметру директивы OMP, обеспечивает выполнение операции редукции для заданного списка переменных по окончании выполнения операций цикла Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler private(var1[, var2]...) – параметр аналогичен соответствующему параметру директивы OMP, сообщает компилятору о необходимости создания отдельного экземпляра переменной для каждой итерации цикла. Определены также параметры firstprivate и lastprivate, позволяющие задать начальное и конечное значение переменной в рамках каждой итерации цикла Н. Новгород, 2013 г. 38 из 79

Использование директивы SIMD Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 39 из 79

Технология Array Notation… C помощью выражения A[:] задается весь массив A (размер массива определяется на этапе компиляции, а значит должен быть константным) Выражение A[start_index : length] задает отрезок массива, начиная со start_index длиной length Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 40 из 79

Технология Array Notation… Выражение A[start_index : length : stride] говорит о том, что мы хотим использовать каждый stride элемент массива, начиная со start_index. Количество таких элементов должно быть равно length Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Поддерживаются многомерные массивы Н. Новгород, 2013 г. 41 из 79

Технология Array Notation: поддерживаемые операции… Возможно использование операторов языков C/C++: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Возможна передача массивов в качестве аргументов функции. При этом вызов функции осуществляется для каждого заданного элемента массива: Поддерживается операция редукции для сложения, минимума, максимума и т.п.: Н. Новгород, 2013 г. 42 из 79

Технология Array Notation: поддерживаемые операции… Поддерживаются условные операторы if-then-else: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Поддерживаются операции типа scatter/gather, с помощью которых можно собрать определенные элементы одного массива в другой (собрать разрозненные элементы в один непрерывный массив), и наоборот: Н. Новгород, 2013 г. 43 из 79

Технология Array Notation: поддерживаемые операции Поддерживаются операции сдвига. Операция shift сдвигает элементы массива на shift_val позиций влево/вправо, освободившиеся элементы заполняются значением fill_val. Операция rotate обеспечивает циклический сдвиг элементов влево/вправо на rotate_val позиций. Результат работы этих функций записывается в новый массив: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 44 из 79

Технология Array Notation: принципы работы Размер массива должен быть известен на стадии компиляции. Если используется динамический массив, то при использовании данной нотации необходимо явно указывать начальную позицию (start_index) и длину (length) отрезка массива. В случае если векторизация кода невозможна, будет сгенерирован обычный цикл. Оптимальный векторный код будет получен только в случае работы с выровненными данными. Требуется соответствие рангов и длин массивов в рамках одной операции. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 45 из 79

Технология Array Notation: скалярное произведение Скалярный код: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Векторный код: Н. Новгород, 2013 г. 46 из 79

Технология Array Notation: динамические массивы Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 47 из 79

Элементарные функции… Элементарная функция – это функция, выполняющая вычисления над скалярными элементами данных. Строка __declspec(vector) указывает на необходимость векторизации кода этой функции: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 48 из 79

Элементарные функции: способы вызова В цикле для элементов массива: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler С использованием технологии Array Notation: Из другой элементарной функции: В скалярном коде: Н. Новгород, 2013 г. 49 из 79

Элементарные функции: ограничения Непрямые вызовы запрещены; Запрещена передача структур по значению (по ссылке допустимо); Запрещена синхронизация; Запрещено использование многопоточных конструкций (_Cilk_spawn/_Cilk_for). Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 50 из 79

Использование отчетов компилятора Опция компилятора, отвечающая за отчеты по векторизации, имеет вид -vec-report[n] для Linux и /Qvec- report[n] для Windows версии компилятора. –vec-report3: loop was not vectorized: unsupported data type –vec-report6: vectorization support: type TTT is not supported for operation OOO –vec-report7 позволяет получить дополнительную информацию о векторизуемом коде, например, ожидаемое ускорение от векторизации, используемый здесь шаблон доступа к памяти и др. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 51 из 79

Выравнивание данных… При работе с Intel Xeon Phi необходимо выравнивать данные по границе в 64 Б. Выравнивание статических массивов: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Выравнивание динамических массивов: Помимо выделения выровненных данных в программе, для эффектной векторизации вашего кода необходимо сообщить компилятору о выравнивании в том месте кода, где эти данные непосредственно используются. Н. Новгород, 2013 г. 52 из 79

Выравнивание данных… Допустим, используется цикл, который обращается к массиву A как A[i], и к массиву B как B[i+n1]. Здесь i – это счетчик цикла. Для того чтобы компилятор использовал команды работы с выровненными данными, ему необходимо сообщить: –Адрес начала массивов A и B кратен 64 байтам. Используется конструкция __assume_aligned(A, 64). В случае если массивы выделены статически, ничего дополнительно делать не надо. –Величина n1 кратна 16 (при размере типа данных в 4 байта). Эта информация может быть указана с помощью конструкции __assume(n1%16==0). Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 53 из 79

Выравнивание данных… Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 54 из 79

Выравнивание данных… В качестве альтернативы предложенным конструкциям можно использовать директиву #pragma vector align перед телом векторизуемого цикла: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Обратите внимание, что данная директива относится ко всем массивам, используемым в рамках цикла. Н. Новгород, 2013 г. 55 из 79

Выравнивание данных: использование параллелизма… Вариант кода без векторизации: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 56 из 79

Выравнивание данных: использование параллелизма С использованием векторизации: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 57 из 79

Векторизация внешних циклов… По умолчанию компилятор пытается векторизовать только внутренние циклы. Если число итераций внутренних циклов Способы векторизации внешних циклов: –Посредством добавления директивы #pragma simd перед внешним циклом. –С помощью директивы #pragma simd и элементарных функций. –С использованием технологии Array Notation. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 58 из 79

Векторизация внешних циклов… Исходный код: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 59 из 79

Векторизация внешних циклов Код с векторизацией: Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 60 из 79

4. Подходы к оптимизации прикладных программ для Intel Xeon Phi Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 61 из 79

Итеративный процесс оптимизации Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 62 из 79

Уровни оптимизации приложений Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 63 из 79

Использование встроенного профилировщика циклов… Для профилировки приложения необходимо включить инструментацию кода в процессе компиляции: icc -O1 -profile-functions -profile-loops=all -profile-loops-report=2 … Далее нужно запустить приложение на интересующем вас тесте. Программа соберет статистику о своей работе и запишет ее в формате таблицы (понятном для пользователя) и в формате xml (который можно проанализировать с использованием специального GUI приложения – Loop Profile Viewer). Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 64 из 79

Использование встроенного профилировщика циклов… Файлы содержат такую информацию, как: –имена и количество вызовов функций, количество циклов в них; –общее время работы функций и циклов; –время работы функций и циклов без учета внутренних вызовов; –среднее, минимальное и максимальное количество итераций циклов. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 65 из 79

Использование встроенного профилировщика циклов Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 66 из 79

Использование отчетов компилятора Отчет о векторизации: -vec-report[n] Руководство по векторизации: -guide-vec[=n] –Данная опция позволяет получить рекомендации по изменению кода, которые позволят компилятору найти больше возможностей для векторизации. Руководство по дополнительной оптимизации: -guide –Позволяет получить ряд советов касательно модификации вашего кода с тем, чтобы компилятор мог лучше его оптимизировать. Отчет об оптимизации: -opt-report [n] –Данная опция информирует программиста о том, как компилятор модифицирует ваш код, пытаясь сгенерировать наиболее оптимальную его версию. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 67 из 79

Балансировка нагрузки… Сопроцессор Intel Xeon Phi позволяет запускать одновременно 4 логических потока на ядро. Однако часто бывает эффективнее запускать меньшее их количество, т.к.: –это позволяет минимизировать нагрузку на кэши разных уровней (L1, L2, TLB), т.к. если потоков на ядре много, они начинают соперничать за доступ в кэш; –меньше соревнований между потоками за единственный векторный модуль ядра; –уменьшаются запросы к основной памяти. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 68 из 79

Балансировка нагрузки… Существуют доводы и за использование 4-х потоков на ядро: –можно получить преимущества от локальности данных при обращении в основную память и в кэш (когда все потоки используют одни и те же данные, которые удается загрузить в кэш); –хорошо подходит для задач, требующих больших вычислительных ресурсом и не требующих много памяти. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 69 из 79

Балансировка нагрузки… В силу специфики архитектуры ядра сопроцессора при использовании 1 потока на ядро сопроцессор будет простаивать минимум половину времени, соответственно в большинстве случаем использование 2- х потоков на ядро будет эффективнее, нежели использование 1-го потока; Для большинства приложений подойдет использование 3 потоков на ядро (экспериментальные данные специалистов компании Intel); Для приложений с хорошей локальностью данных и большими требованиями к вычислительным ресурсам лучше использовать 4 потока на ядро. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 70 из 79

Балансировка нагрузки KMP_AFFINITY=compact –В этом случае на ядро будет приходиться максимально возможное число потоков, часть ядер будет свободна. Подходит приложениям с хорошей локальностью данных. Для остальных приложений может вызвать снижение производительности. KMP_AFFINITY=scatter –Потоки равномерно распределяются по ядрам. Подходит для максимального использования системных ресурсов. KMP_AFFINITY=balanced –Потоки равномерно распределяются по ядрам, но с условием, что на каждом ядре лежат потоки с соседними номерами. Это позволяет использовать локальность данных приложения вместе с эффективным использованием системных ресурсов. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 71 из 79

Дополнительные рекомендации… Следует позаботиться о выравнивании данных в памяти (полезно не только в случае векторизации). Следует использовать такие структуры данных, которые лучше всего соотносятся с шаблонами доступа к ним во время вычислений. Например, часто лучше использовать структуры массивов вместо привычных в языках C/C++ массивов структур. Применение правильных структур данных позволяет существенно повысить эффективность работы с кэш памятью. Следует обратить внимание на эффективное использование кэшей L1 и L2, т.к. стоимость доступа в память более чем в 10 раз медленнее, чем в кэш L2. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 72 из 79

Дополнительные рекомендации Сопроцессор Intel Xeon Phi имеет аппаратное устройство предвыборки. Компилятор также генерирует указания для предвыборки автоматически. Однако для некоторых задач с нерегулярным доступом к данным лучше делать предвыборку самостоятельно. Для этого применяется функция _mm_prefetch(char* addr, int hint). Заметим, что предвыборку лучше не делать для L1 кэша, т.к. обычно это не эффективно. Следует использовать страницы памяти размеров 2 МБ в приложениях с большими структурами и частыми обращениями к памяти для минимизации количества промахов TLB кэша. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 73 из 79

Литература Intel Corporation. Beginning Intel Xeon Phi Coprocessor Workshop, Offload Compilation, September Fourestey G. Intel Xeon Phi Programming Models [ 6/68/XeonPhi.pdf] 6/68/XeonPhi.pdf Intel Corporation. Intel® C++ Compiler XE 13.1 User and Reference Guides: User-mandated or SIMD Vectorization [ ss/2013/compiler/cpp-lin/GUID-42986DEF A-9DAC- 2086EE55F1F5.htm] ss/2013/compiler/cpp-lin/GUID-42986DEF A-9DAC- 2086EE55F1F5. htm Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 74 из 79

Литература Intel Corporation. Intel® C++ Compiler XE 13.1 User and Reference Guides: SIMD [ composer/en- us/2011Update/compiler_c/cref_cls/common/cppref_pragma_ simd.htm] composer/en- us/2011Update/compiler_c/cref_cls/common/cppref_pragma_ simd.htm Intel Corporation. Advanced Intel Xeon Phi Coprocessor Workshop, Extracting Vector Performance with Intel Compilers, September Green R.W. Effective Use of the Intel Compiler's Offload Features: [ use-of-the-intel-compilers-offload-features] use-of-the-intel-compilers-offload-features Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 75 из 79

Литература Green R.W. Overview of Vectorization Reports and new vec- report6: [ vectorization-reports-and-new-vec-report6] vectorization-reports-and-new-vec-report6 Krishnai R. Data Alignment to Assist Vectorization: [ assist-vectorization] assist-vectorization Green R.W. Outer Loop Vectorization via Intel Cilk Plus Array Notations: [ vectorization-via-intel-cilk-plus-array-notations] vectorization-via-intel-cilk-plus-array-notations Green R.W. Outer Loop Vectorization: [ vectorization] vectorization Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 76 из 79

Литература Intel Corporation. Beginning Intel Xeon Phi Coprocessor Workshop, Optimization, September Intel Corporation. A case study comparing AoS (Arrays of Structures) and SoA (Structures of Arrays) data layouts for a compute-intensive loop run on Intel® Xeon® processors and Intel® Xeon Phi product family coprocessors: [ comparing-aos-arrays-of-structures-and-soa-structures-of- arrays-data-layouts] comparing-aos-arrays-of-structures-and-soa-structures-of- arrays-data-layouts J. Jeffers, J. Reinders. Intel Xeon Phi Coprocessor High Performance Programming. -Morgan Kaufmann, p. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 77 из 79

Литература Руководство по использованию Intel® Cilk Plus: [ guides/docs/cilk-plus-evaluation-guide.pdf] guides/docs/cilk-plus-evaluation-guide.pdf Спецификация синтаксических конструкций Intel® Cilk Plus: [ plus/cilk_plus_language_specification.pdf] plus/cilk_plus_language_specification.pdf Intel Developer Zone [ developer] developer Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 78 из 79

Авторский коллектив Горшков Антон Валерьевич, ассистент кафедры Математического обеспечения ЭВМ факультета ВМК ННГУ. Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel Compiler Н. Новгород, 2013 г. 79 из 79