Оптимизация производительности вычислительных приложений Практическое занятие №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