Основы использования компилятора Intel

advertisement
Оптимизация производительности
вычислительных приложений
Практическое занятие №1
Основы использования
компилятора Intel
Разделы курса
●
Особенности процессора, влияющие на
производительность приложений
●
●
Методы оптимизации производительности
приложений и их реализация в компиляторах
Intel
●
●
Курсы Intel, семинары
Курсы Intel, семинары, практика
Готовая оптимизированная библиотека Intel
Math Kernel Library
●
Курсы Intel, практика
2
ПО Intel
●
●
Компилятор Intel и библиотека Intel MKL –
платное ПО
Бесплатная версия для Linux для
некоммерческого использования:
●
●
Intel® Developer Zone: Non-Commercial Software Developm
ПО Intel оптимизировано под процессоры Intel:
●
Intel Core i3, i5, i7
●
Intel Xeon
●
Intel Xeon Phi
3
Альтернативы
●
●
Компиляторы:
●
gcc (Linux, бесплатный)
●
Microsoft Visual Studio (Windows)
●
PGI (оптимизирован для AMD)
Математические библиотеки:
●
●
●
AMD Core Math Library (ACML) (оптимизированя
для процессоров AMD)
cuBLAS, cuSPARCE, cuFFT (оптимизирована для
GPU NVIDIA)
Magma (бесплатная, CUDA, OpenCL, Intel Xeon Phi)
4
Окружение для курса
●
ОС: Linux
●
Среда разработки: Eclipse
●
Компилятор:
●
●
●
Intel (преимущественно)
●
gcc (некоторые примеры, сравнение производительности)
Математическая библиотека:
●
Intel MKL (преимущественно)
●
CuBLAS/cuFFT (примеры, сравнение производительности)
Можно выбрать другую платформу
●
Самостоятельный поиск ПО и оборудования
5
Где взять ПО Intel
●
Бесплатная версия для Linux:
●
http://software.intel.com/en-us/non-commercial-software-development
●
Компилятор Intel отдельно не распространяется
●
Пакеты программ:
●
●
●
Intel® C++ Studio XE 2013 for Linux (компилятор С средстава Intel
для оптимизации производительности)
Intel® C++ Composer XE 2013 for Linux
●
●
Intel® Parallel Studio XE 2013 for Linux (компиляторы С и Fortran,
средстава Intel для оптимизации производительности)
Компилятор С, библиотеки MKL и др.
Intel® Math Kernel Library (Intel® MKL) 11.0 for Linux
●
Библиотека MKL, можно использовать с другими компиляторами
6
Как использовать компилятор Intel
●
Командная строка:
●
●
●
●
Будет использоваться преимущественно в
рамках курса
Изучение опций компилятора и их влияние на
производительность
Программы небольшие
Eclipse:
●
●
Интеграция с Eclipse встроена в Intel Composer
Отчеты компилятора рядом с участками кода, к
которым они относятся
7
Командная строка. Основы
●
●
Вызов компилятора C:
●
icc myprog.c -o myprog
●
myprog.c – файл с исходным кодом программы
●
myprog – получаемый испольняемый файл
Вызов компилятора C++:
●
●
icpc myprog.cpp -o myprog
Полезные опции:
●
-std=c99 – использовать стандарт С99
8
Примеры на С
●
Все примеры в рамках курса будут на C:
●
●
●
Объектно-ориентированное программирование
затруняет работу компилятору по оптимизации
Программы простые
Реальная жизнь:
●
●
●
ООП полезно! С++ нужно использовать!
90% времени программа исполняет 10% строк
кода
Оптимизировать только тот код, который
действительно этого требует
9
Опции управления оптимизацией
●
●
Компилятор Intel может выполнят
оптимизацию разного уровня
Опция управления уровнем оптимизации:
●
●
-Ox (x – уровень оптимизации)
Пример:
●
icc -O3 -std=c99 myprog.c -o myprog
10
Уровни оптимизации Intel
●
●
●
●
0 (d) – Оптимизация не выполняется
1 – Оптимизация производительности и уменьшение
размера кода
2 – (Уровень по умолчанию) Оптимизация
производительности
3 – Оптимизация производительности плюс
аггрессивные оптимизации:
●
Разворачивание циклов
●
Объединение/разбиение циклов
●
Протяжка констант
●
др.
11
Уровни оптимизации
●
●
Зачем нужны разные уровни оптимизации?
Почему нельзя сразу оптимизировать
максимально?
12
Уровни оптимизации
●
Компилятор может ошибится при
проведении оптимизации
●
●
●
Сгенерированный код будет делать не то, что
хотел программист
“Безопасный” уровень оптимизации:
●
-O2 (уровень по-умолчанию)
●
Даже на уровне 2 возможны ошибки!
Агрессивные оптимизации (уровень 3) часто
ведут к проблемам
13
Порядок оптимизации
1. Убедитесь, что программа работает
правильно без оптимизации (-O0)
2. Включите “безопасную” оптимизацию (-O2)
•
Сравните получаемые результаты и
производительность с -O0
3. Включите “аггрессивную” оптимизацию
●
Сравните получаемые результаты и
производительность с -O0 и -O2
14
Отчет по оптимизации
●
●
Компилятор может выдать отчет, какие
оптимизации он провел
Опция создания отчета:
●
●
-opt-report [n]
n – уровень отчета
●
0 – нет отчета,
●
3 – максимальная детализация
●
значение по-умолчанию – 2
15
Оптимизация в gcc
●
●
gcc также используют опцию -O для
управления оптимизацией
Уровни оптимизации gcc:
●
0,1,2,3, s, fast, g
●
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htm
●
●
gcc (в отличие от Intel) документировано, какая
оптимизация на каком уровне выполняется
Значение по умолчанию -O0 (оптимизация
не выполняется)
16
Использование Eclipse
●
●
Eclipse с поддержкой С/С++:
●
CDT (C/C++ Development Tools)
●
PTP (Parallel Tools Platform)
Инструкции по установке:
●
●
{compiler_base}/composerxe/Documentation/en_U
S/get_started_lc.htm
После установки появится дополнительный
toolchain для компилятора Intel
17
Использование Eclipse
18
Использование Eclipse
19
Уровень оптимизации в Eclipse
20
Отчет об оптимизации в Eclipse
21
Отчет об оптимизации в Eclipse
22
Измерение времени
●
●
●
Цель оптимизации – уменьшить время выполнения
программы
Чтобы оценить эффект той или иной оптимизации,
нужно научится измерять время
В курсах Intel используется утилита time:
$ time ./vect1
Sum is 250044.554837, Duration is 0.001176
real 0m0.033s
user 0m0.027s
sys
0m0.006s
23
Недостатки time
●
Низкая точность определения времени:
●
●
●
Приходится добавлять внешний цикл с большим числом
повторений (так делает лектор курса Intel)
Измерение времени всей программы, нельзя измерить
время конкретного участка кода
Предлагаемый вариант:
●
Использование функции gettimeofday()
●
Источник — примеры в комплекте компилятора Intel
●
Точность до микросекунд (зависит от платформы)
24
Измерение времени с помощью
gettimeofday
#include <sys/time.h>
struct timeval start, stop;
gettimeofday(&start, NULL);
// Do some work
gettimeofday(&stop, NULL);
double duration = (double)(stop.tv_sec ­ start.tv_sec + (stop.tv_usec ­ start.tv_usec)/1000000.0);
25
Измерение времени
●
Время выполнение одной и той же
программы может отличатся
●
●
Почему?
Чтобы оценить эффект от оптимизации,
необходимо запускать программу до и после
оптимизации несколько раз
●
●
Сравнивать средние значение до и после
оптимизации
Оценить разброс значений для одной версии
программы
26
Измерение времени
[u1213@avs Release]$ ./vectorization
Sum is 249875.068116, Duration is 0.003456
[u1213@avs Release]$ ./vectorization
Sum is 250158.808735, Duration is 0.003553
[u1213@avs Release]$ ./vectorization
Sum is 250286.697607, Duration is 0.003557
[u1213@avs Release]$ ./vectorization
Sum is 249999.288452, Duration is 0.003487
[u1213@avs Release]$ ./vectorization
Sum is 249847.917863, Duration is 0.003462
[u1213@avs Release]$ ./vectorization
Sum is 250017.182771, Duration is 0.003446
[u1213@avs Release]$ ./vectorization
Sum is 250222.846247, Duration is 0.003459
27
Итоги
●
●
Компилятор Intel, библиотека Intel MKL и их
альтернативы
Использование компилятора Intel из
командной строки и из Eclipse
●
Уровни оптимизации компилятора Intel
●
Измерение времени выполнения программы
28
Download