Ползать или летать? Компиляторы Intel и их возможности в плане оптимизации ПО. Харченко Евгений Intel, Нижний Новгород.

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



Advertisements
Похожие презентации
Инструменты компании Интел для разработки программного обеспечения. Дмитрий Тараканов Инженер по программному обеспечению ISDEF 2004, 17 сентября 2004.
Advertisements

Разработка параллельных приложений для многоядерных систем С.В. Ковальчук НИИ Наукоемких компьютерных технологий, СПбГУ ИТМО.
1 Процессоры семейства Intel® XScale®. Разработка эффективных приложений Василий Басов Intel
Архитектура микропроцессоров И ее эволюция. Процессор и память: Команды и данные.
Нижегородский государственный университет им. Н.И.Лобачевского Факультет Вычислительной математики и кибернетики Лекция 4 Векторные расширения Intel Xeon.
Help: настройка Visual Studio.Net для создания консоль-приложения на основе Intel C++ с применением OpenMP. Инструменты «Практическое параллельное программирование.
Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Томский политехнический университет.
Архитектуры с параллелизмом на уровне команд. Два класса Суперскалярные процессоры Процессоры с длинным командным словом.
Введение в параллельную обработку. Уровни параллелизма в процессорах Параллелизм данных (DLP – Data Level Parallelism) Параллелизм команд (ILP – Instruction.
RISC-архитектуры ( Reduced Instruction Set Computer)
Многопоточное программирование в OpenMP Киреев Сергей ИВМиМГ.
Тема 2. Способы адресации и система команд МП. Непосредственная адресация Суть способа. Требуемые данные (#data ̶ непосредственный операнд, константа)
Архитектуры с параллелизмом на уровне команд. Два класса Суперскалярные процессоры Процессоры с длинным командным словом.
Стадник Е. Г. ФПМИ НГТУ Руководитель: Городничев М.А., м.н.с. ИВМ и МГ СО РАН.
Планирование выполнения инструкций для векторных процессоров с переменной длиной векторов Пантелеев Алексей Юрьевич Национальный исследовательский ядерный.
1. Теоретические основы операционных систем (планирование заданий и использования процессора, обеспечение программ средствами коммуникации и синхронизации,
Министерство образования Республики Беларусь Белорусский государственный университет Управляющие структуры языков программирования.
Набор инструкций. Набор команд это множество операций, которое исполняет процессор. Набор команд это та граница, где проектировщик компьютера и программист.
Параллельное программирование для ресурсоёмких задач численного моделирования в физике В.О. Милицин, Д.Н. Янышев, И.А. Буткарев Центр компьютерной физики.
Современные микропроцессоры Тенденции развития. Рассматриваемые процессоры Intel Itanium 2 Intel Core 2 Duo IBM Cell.
Транксрипт:

Ползать или летать? Компиляторы Intel и их возможности в плане оптимизации ПО. Харченко Евгений Intel, Нижний Новгород

Ползать или летать? Вы купите машину у которой из передач только первая? И максимальная скорость 20 км/ч? Вы купите машину у которой из передач только первая? И максимальная скорость 20 км/ч? –Бывают случаи когда это вполне актуально –Но про адреналин забудьте (тракторы как узкий подкласс не рассматриваются) Снимите ограничитель скорости! Снимите ограничитель скорости!

Что для этого надо? Знать где он находится. А можно и не знать. Просто попросите того, кто знает. А можно и не знать. Просто попросите того, кто знает.

Программа Компиляторы Intel® И их практическое применение

Компиляторы Intel® C, C++, FORTRAN C, C++, FORTRAN –Имеются для Windows* и Linux* –Имеются для 32 и 64-битных платформ и XScale Поддержка кросс-платформенной разработки Поддержка кросс-платформенной разработки Использование последних достижений в области создания платформ и процессоров Использование последних достижений в области создания платформ и процессоров –Оптимизация под архитектуру NetBurst (Pentium ® 4 и Xeon) –Оптимизация под архитектуру Itanium ® и Itanium ® 2 –Поддержка Hyper-threading технологии и стандарта OpenMP* Беспроблемная интеграция в среды Windows* (IDE) и Linux* Беспроблемная интеграция в среды Windows* (IDE) и Linux* Компилятор, совместимый по исходному коду и двоичным файлам с Microsoft; совместимый* по исходному коду и двоичным файлам с GNU compiler collection (от gcc3.2 и новее) Компилятор, совместимый по исходному коду и двоичным файлам с Microsoft; совместимый* по исходному коду и двоичным файлам с GNU compiler collection (от gcc3.2 и новее)

Факторы повышения производительности SIMD методика для архитектуры NetBurst SIMD методика для архитектуры NetBurst Программная конвейеризация под архитектуру Itanium ® Программная конвейеризация под архитектуру Itanium ® Предварительная выборка данных Предварительная выборка данных Межпроцедурная оптимизация (IPO) Межпроцедурная оптимизация (IPO) Оптимизация по профилированию (PGO) Оптимизация по профилированию (PGO) Высокооптимизированные библиотеки стандарта Си Высокооптимизированные библиотеки стандарта Си Диспетчеризация ЦП Диспетчеризация ЦП Параллелизация, основанная на OpenMP, для многопроцессорных систем и систем с Hyper-threading Параллелизация, основанная на OpenMP, для многопроцессорных систем и систем с Hyper-threading Автопараллелизация Автопараллелизация

Встроенные средства SIMD- расширений встроенные средства SIMD-расширений работают с упакованными данными до 128 бит в длину, что обеспечивает возможность параллельной обработки элементов данных встроенные средства SIMD-расширений работают с упакованными данными до 128 бит в длину, что обеспечивает возможность параллельной обработки элементов данных позволяют использовать Си функции вместо кодирования на языке ассемблера позволяют использовать Си функции вместо кодирования на языке ассемблера обеспечивают доступ к основным возможностям, нереализуемым с применением обычных методик кодирования обеспечивают доступ к основным возможностям, нереализуемым с применением обычных методик кодирования большинство команд в рамках технологии MMX, SSE, SSE2 и SSE3 имеют соответствующие встроенные функции на языке Си большинство команд в рамках технологии MMX, SSE, SSE2 и SSE3 имеют соответствующие встроенные функции на языке Си

Встроенные средства SIMD- расширений Три варианта кодирования: Три варианта кодирования: –Векторные классы –Интринсики (intrinsic) Освобождают от необходимости непосредственного управления регистрами через ассемблер Освобождают от необходимости непосредственного управления регистрами через ассемблер Облегчают разработку и оптимизацию кода Облегчают разработку и оптимизацию кода –Встроенный ассемблер

Пример использования void quarter(int array[], int len) { int i; int i; for(i=0; i2; array[i] = array[i]>>2;} Модифицированная версия для len, кратной 4 и array, выровненного на 16 байт Модифицированная версия для len, кратной 4 и array, выровненного на 16 байт void quarterVect(int array[], int len) { I32vec4* array4 = (I32vec4*)array; I32vec4* array4 = (I32vec4*)array; int i; int i; for(i=0; i2; array4[i] = array4[i]>>2;}

Автовекторизация Автоматически применяет SIMD команды в наборах команд SSE, SSE2, SSE3 и MMX Автоматически применяет SIMD команды в наборах команд SSE, SSE2, SSE3 и MMX Определяет операции программы, которые можно выполнять параллельно, после чего конвертирует последовательную программу для обработки 2, 4, 8 или 16 элементов за одну операцию в зависимости от типа данных Определяет операции программы, которые можно выполнять параллельно, после чего конвертирует последовательную программу для обработки 2, 4, 8 или 16 элементов за одну операцию в зависимости от типа данных Все стандартные математические функции в Си имеют SIMD реализации Все стандартные математические функции в Си имеют SIMD реализации Достаточно указать ключ в командной строке -QxW, -QaxW или другие Достаточно указать ключ в командной строке -QxW, -QaxW или другие

Программная конвейеризация Программная конвейеризация предназначена для перекрытия итераций циклов Программная конвейеризация предназначена для перекрытия итераций циклов Использует мощную поддержку программной конвейеризации, обеспечиваемую архитектурой Itanium ® Использует мощную поддержку программной конвейеризации, обеспечиваемую архитектурой Itanium ® –циклический сдвиг регистров –специальные команды ветвления для циклов –большой массив регистров Компилятор работает автоматически без необходимости указания каких-либо ключей в командной строке Компилятор работает автоматически без необходимости указания каких-либо ключей в командной строке

Распространяет оптимизацию на все файлы Компилировать и оптимизировать file1.c file2.c file3.c file4.c -Qip Компилировать и оптимизировать file1.c file4.cfile2.c file3.c -Qipo Межпроцедурная оптимизация

Оптимизация по профилированию Оптимальна для кода с часто выполняемыми ветвлениями, которые трудно предсказать во время компиляции Оптимальна для кода с часто выполняемыми ветвлениями, которые трудно предсказать во время компиляции Оптимизирует принятие компилятором решений о подстановке функций Оптимизирует принятие компилятором решений о подстановке функций Включает следующие стадии Включает следующие стадии –Инструментальная компиляция и связывание -Qprof_gen –Запуск полученного файла для создания файлов динамической информации (.dyn) –Компиляция с использованием.dyn файла -Qprof_use

Диспетчеризация ЦП Выбирает соответствующий код в период выполнения в зависимости от фактического типа процессора Выбирает соответствующий код в период выполнения в зависимости от фактического типа процессора Позволяет использовать единый код при оптимальной производительности для всех семейств процессоров Позволяет использовать единый код при оптимальной производительности для всех семейств процессоров Достигается использованием опций Достигается использованием опций –оптимизировать под Pentium® -G5 –оптимизировать под Pentium® Pro, Pentium® II, Pentium® III -G6 –оптимизировать под Pentium® 4 -G7 (DEFAULT) –генерировать код для заданного процессора и одновременно единый код для семейства IA-32 –Qax[n].

Поддержка многопоточной разработки в компиляторах Intel ® Поддержка OpenMP* в компиляторах Intel ® - Qopenmp Поддержка OpenMP* в компиляторах Intel ® - Qopenmp –Предоставляет стандартный набор библиотечных функций для упрощения управления программой в режиме параллельного исполнения –Обеспечивает расширение библиотеки OpenMP для работы с памятью в многопоточном режиме Автопараллелизатор компилятора Intel ® -Qparallel Автопараллелизатор компилятора Intel ® -Qparallel –Обнаруживает циклы, которые могут безопасно выполняться в параллели, и автоматически генерирует многопотоковый код для подобных циклов –Освобождает пользователя от необходимости заниматься низкоуровневыми задачами по декомпозиции итераций, совместному использованию данных, планированию и синхронизации потоков –Обеспечивает повышение производительности для многопроцессорных систем

Дополнительные опции оптимизации Optimization report -Qopt_report Optimization report -Qopt_report Vectorizarion report –Qvec_report Vectorizarion report –Qvec_report Parallelization report –Qpar_report Parallelization report –Qpar_report Возможность регулирования развертки циклов -Qunroll[n] Возможность регулирования развертки циклов -Qunroll[n] Задание точности вычислений для типов с плавающей точкой -Qpc[n] Задание точности вычислений для типов с плавающей точкой -Qpc[n] Задание/отмена быстрой конвертации из плавающей точки в целочисленные типы -QIfist[-], -Qrcd Задание/отмена быстрой конвертации из плавающей точки в целочисленные типы -QIfist[-], -Qrcd Управление работой со строками -Gf и –GF Управление работой со строками -Gf и –GF Управление function inlining -Qip_no_inlining, -Qip_no_pinlining Управление function inlining -Qip_no_inlining, -Qip_no_pinlining Установка/отмена ANSI aliasing rules -Qansi_alias[-] Установка/отмена ANSI aliasing rules -Qansi_alias[-]

Основные показатели: Компиляторы Intel ® 7.0 для Linux* Более подробную информацию о производительности продукции Intel можно получить по адресу Более подробную информацию о производительности продукции Intel можно получить по адресу

Intel Compilers "The Intel compilers have performed excellently on our ROOT code. On average, the Intel C++ Compiler for Linux produces executables that run 30% faster than ones produced by gcc 3.2. [With the] excellent compatibility with the GNU compilers, the porting effort was reduced to a minimum. …" Dr. Fons Rademakers Senior Scientist CERN Geneva "When we ran our standard benchmarks on GNU C and Intel C++ compilers for Linux, the Intel compiler gave us up to a 37% performance improvement." Dr. Dipankar Choudhury Chief Technology Officer Fluent Inc.

Программа Компиляторы Intel® И их практическое применение

Компиляторная оптимизация Используем опцию -QaxW – агрессивная оптимизация по производительности для Pentium4 Используем опцию -QaxW – агрессивная оптимизация по производительности для Pentium4 –Включает HLO (high level optimizer): Векторизация циклов Векторизация циклов Развёртка циклов Развёртка циклов Активная предварительная выборка данных (prefetching) Активная предварительная выборка данных (prefetching) –Одновременно генерирует общую и процессор- специфичную версии кода –Для других процессоров свои опции -QaxK – для Pentium3 -QaxK – для Pentium3 -Qaxi – для PentiumPro и Pentium II -Qaxi – для PentiumPro и Pentium II -QaxM – MMX -QaxM – MMX -QaxB – Pentium M (Banias) -QaxB – Pentium M (Banias) -QaxP – Pentium4 (Prescott) -QaxP – Pentium4 (Prescott)

Проверим, что сделал компилятор? Опции –Qopt_report3 и –Qvec_report3 создают отчёт о проведённой оптимизации Опции –Qopt_report3 и –Qvec_report3 создают отчёт о проведённой оптимизации –Разбираемся, где компилятор справился, а где ему надо помочь. Основное внимание hotspots. Как помочь? Как помочь? –В первую очередь векторизация. Смотрим в репорт и устраняем проблемы Упрощаем адресацию Упрощаем адресацию #pragma ivdep – подскажем, что нет зависимости по данным #pragma ivdep – подскажем, что нет зависимости по данным #pragma vector aligned – с выровненными данными производительность возрастёт. Для правильного выделения памяти используем _mm_malloc(…) #pragma vector aligned – с выровненными данными производительность возрастёт. Для правильного выделения памяти используем _mm_malloc(…) Если в векторизуемом цикле есть вызов стандартной функции, убедимся, что используется векторизуемая версия (help компилятора) Если в векторизуемом цикле есть вызов стандартной функции, убедимся, что используется векторизуемая версия (help компилятора)

VortexMovement demo

Другие опции компилятора Intel® Что ещё можно попробовать? Что ещё можно попробовать? – –Развёртка циклов #pragma unroll(8) – –Предварительная подгрузка данных #pragma prefetch your_array – –Подсказка примерного количества итераций цикла #pragma loop count (128) – –Межпроцедурная оптимизация –Qip –Qipo – –Оптимизация по профилированию -Qprof_gen -Qprof_use – –Многое другое (смотри help компилятора)

Что обычно даёт эффект? Переход от массива структур к структуре массивов Переход от массива структур к структуре массивов typedef struct Vortex { float Gamma; double x; double x; double y; } vortex; vortex* m_vortex; Особенно если в цикле используется лишь некоторые поля Особенно если в цикле используется лишь некоторые поля typedef struct Vortex { float* Gamma; double* x; double* y; } vortex; vortex m_vortex;

Что обычно даёт эффект? Последовательный доступ к элементам массивов (data cache misses) Последовательный доступ к элементам массивов (data cache misses) –Для многомерных циклов важен порядок использования идексов a[i][k] или a[k][i] –Важно количество и выравнивание используемых буферов Выравнивание данных (data cache misses) и их правильное размещение в памяти (64K aliasing) Выравнивание данных (data cache misses) и их правильное размещение в памяти (64K aliasing) Правильная развёртка циклов (data cache misses), (trace buffer misses) Правильная развёртка циклов (data cache misses), (trace buffer misses) Устранение ветвлений (branch misprediction) Устранение ветвлений (branch misprediction) Flush-to-zero мода для denormalized values (FP assists). Округление вместо обрезания дробной части. -Qrcd Flush-to-zero мода для denormalized values (FP assists). Округление вместо обрезания дробной части. -Qrcd Удачная смесь инструкций Удачная смесь инструкций

Распараллелим приложение Даёт эффект Даёт эффект –На многопроцессорных машинах –На Pentium4 с HT Возможные опции: Возможные опции: –Автопараллелизация компилятором –Qparallel –С помощью OpenMP –Вручную Intel Thread Checker и Thread Profiler помогут добиться эффективного распараллеливания и устранить проблемы Intel Thread Checker и Thread Profiler помогут добиться эффективного распараллеливания и устранить проблемы

VortexMovement на P4 с HT Распараллелено с помощью OpenMP. Распараллелено с помощью OpenMP. Тест проведён на Pentium4 с HT (3060MHz, 512K cache). Тест проведён на Pentium4 с HT (3060MHz, 512K cache). Не параллельная версия: Не параллельная версия: Параллельная версия: Параллельная версия: Итого ~17% прироста производительности Итого ~17% прироста производительности

backup backup

Необходимые условия векторизации Короткое тело цикла (один basic block) Короткое тело цикла (один basic block) Векторные или векторизуемые типы данных Векторные или векторизуемые типы данных Избегайте зависимостей по данным между итерациями Избегайте зависимостей по данным между итерациями Избегайте вызовов функций Избегайте вызовов функций Избегайте невекторизуемых операций Избегайте невекторизуемых операций Избегайте использования разных векторизуемых типов в одном цикле (текущая версия компилятора не поддерживает, но работа ведётся) Избегайте использования разных векторизуемых типов в одном цикле (текущая версия компилятора не поддерживает, но работа ведётся) Избегайте выходов из цикла, зависящих от данных Избегайте выходов из цикла, зависящих от данных Не разворачивайте циклы вручную, доверьте это компилятору Не разворачивайте циклы вручную, доверьте это компилятору Не делите цикл с небольшим количеством инструкций на несколько Не делите цикл с небольшим количеством инструкций на несколько Не пользуйтесь глобальными указателями Не пользуйтесь глобальными указателями Упростите операторы в теле цикла Упростите операторы в теле цикла

Поможем компилятору векторизовать код #pragma ivdep – данная прагма указывает компилятору игнорировать предполагаемые зависимости между элементами вектора #pragma ivdep – данная прагма указывает компилятору игнорировать предполагаемые зависимости между элементами вектора #pragma vector{aligned | unaligned} – данная прагма предписывает компилятору векторизовать цикл. Опция aligned | unaligned сообщает компилятору, что данные выровнены | не выровнены в памяти. На выровненных данных обычно достигается более высокая производительность, но если в действительности данные не выровнены, а указана опция aligned, программа может работать некорректно. #pragma vector{aligned | unaligned} – данная прагма предписывает компилятору векторизовать цикл. Опция aligned | unaligned сообщает компилятору, что данные выровнены | не выровнены в памяти. На выровненных данных обычно достигается более высокая производительность, но если в действительности данные не выровнены, а указана опция aligned, программа может работать некорректно. Ключевое слово restrict при описании указателей сообщает компилятору, что они указывают на различные адреса памяти Ключевое слово restrict при описании указателей сообщает компилятору, что они указывают на различные адреса памяти