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

Содержание

Слайд 2

Ползать или летать?

Вы купите машину у которой из передач только первая? И

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

Слайд 3

Что для этого надо?

Знать где он находится.

А можно и не знать.
Просто

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

Слайд 4

Программа

Компиляторы Intel®

И их практическое применение

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

Слайд 5

Компиляторы Intel®

C, C++, FORTRAN
Имеются для Windows* и Linux*
Имеются для 32 и 64-битных

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

Слайд 6

Факторы повышения производительности

SIMD методика для архитектуры NetBurst™
Программная конвейеризация под архитектуру Itanium®
Предварительная выборка

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

Слайд 7

Встроенные средства SIMD-расширений

встроенные средства SIMD-расширений работают с упакованными данными до 128 бит

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

Слайд 8

Встроенные средства SIMD-расширений

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

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

Слайд 9

Пример использования

void quarter(int array[], int len)
{
int i;
for(i=0; i array[i]

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

Слайд 10

Автовекторизация

Автоматически применяет SIMD команды в наборах команд SSE, SSE2, SSE3 и MMX™

Автовекторизация Автоматически применяет SIMD команды в наборах команд SSE, SSE2, SSE3 и

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

Слайд 11

Программная конвейеризация

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

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

Слайд 12

Распространяет оптимизацию на все файлы

-Qipo

Межпроцедурная оптимизация

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

Слайд 13

Оптимизация по профилированию

Оптимальна для кода с часто выполняемыми ветвлениями, которые трудно предсказать

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

Слайд 14

Диспетчеризация ЦП

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

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

Слайд 15

Поддержка многопоточной разработки в компиляторах Intel®

Поддержка OpenMP* в компиляторах Intel® -Qopenmp
Предоставляет стандартный

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

Слайд 16

Дополнительные опции оптимизации

Optimization report -Qopt_report
Vectorizarion report –Qvec_report
Parallelization report –Qpar_report
Возможность регулирования развертки циклов

Дополнительные опции оптимизации 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[-]

Слайд 17

Основные показатели: Компиляторы Intel® 7.0 для Linux*

Более подробную информацию о производительности продукции

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

Слайд 18

Intel Compilers

"The Intel compilers have performed excellently on our ROOT code. On

Intel Compilers "The Intel compilers have performed excellently on our ROOT code.
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.

Слайд 19

Программа

Компиляторы Intel®

И их практическое применение

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

Слайд 20

Компиляторная оптимизация

Используем опцию -QaxW – агрессивная оптимизация по производительности для Pentium4
Включает HLO

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

Слайд 21

Проверим, что сделал компилятор?

Опции –Qopt_report3 и –Qvec_report3 создают отчёт о проведённой оптимизации
Разбираемся,

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

Слайд 22

VortexMovement demo

VortexMovement demo

Слайд 23

Другие опции компилятора Intel®

Что ещё можно попробовать?
Развёртка циклов #pragma unroll(8)
Предварительная подгрузка данных

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

Слайд 24

Что обычно даёт эффект?

Переход от массива структур к структуре массивов
typedef struct Vortex
{
float

Что обычно даёт эффект? Переход от массива структур к структуре массивов typedef
Gamma;
double x;
double y;
} vortex;
vortex* m_vortex;

Особенно если в цикле используется лишь некоторые поля
typedef struct Vortex
{
float* Gamma;
double* x;
double* y;
} vortex;
vortex m_vortex;

Слайд 25

Что обычно даёт эффект?

Последовательный доступ к элементам массивов (data cache misses)
Для многомерных

Что обычно даёт эффект? Последовательный доступ к элементам массивов (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
Удачная смесь инструкций

Слайд 26

Распараллелим приложение

Даёт эффект
На многопроцессорных машинах
На Pentium4 с HT
Возможные опции:
Автопараллелизация компилятором –Qparallel
С

Распараллелим приложение Даёт эффект На многопроцессорных машинах На Pentium4 с HT Возможные
помощью OpenMP
Вручную

Intel Thread Checker и Thread Profiler помогут добиться
эффективного распараллеливания и устранить проблемы

Слайд 27

VortexMovement на P4 с HT

Распараллелено с помощью OpenMP.
Тест проведён на Pentium4

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

Слайд 29

Необходимые условия векторизации

Короткое тело цикла (один basic block)
Векторные или векторизуемые типы данных
Избегайте

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