'

Ползать или летать? Компиляторы Intel и их возможности в плане оптимизации ПО.

Понравилась презентация – покажи это...





Слайд 0

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


Слайд 1

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


Слайд 2

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


Слайд 3

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


Слайд 4

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


Слайд 5

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


Слайд 6

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


Слайд 7

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


Слайд 8

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


Слайд 9

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


Слайд 10

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


Слайд 11

Распространяет оптимизацию на все файлы -Qipo Межпроцедурная оптимизация


Слайд 12

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


Слайд 13

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


Слайд 14

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


Слайд 15

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


Слайд 16

Основные показатели: Компиляторы Intel® 7.0 для Linux* Более подробную информацию о производительности продукции Intel можно получить по адресу http://www.intel.com/performance/resources/limits.htm.


Слайд 17

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.


Слайд 18

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


Слайд 19

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


Слайд 20

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


Слайд 21

VortexMovement demo


Слайд 22

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


Слайд 23

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


Слайд 24

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


Слайд 25

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


Слайд 26

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


Слайд 27

backup


Слайд 28

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


Слайд 29

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


×

HTML:





Ссылка: