Использование инструментов Intel® для оптимизации программ Андрей Ануфриенко Идрисов Ренат Основные характеристики приложения, влияющие на его производительность • • • • • • Эффективность вычислений Эффективность работы с памятью Правильное предсказание переходов Эффективность использования векторных инструкций Эффективность параллелизации Уровень инструкционного параллелилизма Место и роль компилятора Компилятор — транслятор, который осуществляет перевод всей исходной программы в эквивалентную ей результирующую программу на языке машинных команд или на языке ассемблера. Основная задача оптимизирующего компилятора – получение кода максимально эффективного для используемого вычислительного комплекса. С точки зрения разработчика программа должна быть: • Легко читаемой и модифицируемой • Легко отлаживаемой • Быстро исполняемой Разработчику необходима • надежная унифицированная среда разработки • возможность варьировать уровни отладки и быстродействия • возможность получать высокоэффективный код для различных операционных систем и микропроцессорных архитектур. Компилятор должен удовлетворить эти требования. 10/17 /10 • Оптимизирующий компилятор Это программный комплекс, работа которого варьируется в зависимости от требований к результирующему коду. Возникают следующие проблемы: • Сложность доказательства допустимости тех или иных оптимизаций • Сложность расчет выгодности оптимизаций • Отсутствие во время компиляции представления о типичных входных данных • Для достижения хороших результатов требуется тесное сотрудничество с разработчиком Чтобы использовать умело средства компилятора, программист должен: • иметь представления о архитектуре, на которой будет использоваться его программа • ознакомиться с настройками компилятора • ознакомиться с основными техниками улучшения производительности, которые использует компилятор • ознакомиться с основными проблемами, вызывающими замедление работы программы • знать примерные данные, с которыми будет работать программа • уметь пользоваться инструментами для анализа производительности программы. Компиляторы Intel С/C++ и Fortran для операционных систем Windows, Linux и Mac OS Для Windows компилятор может быть интегрирован в Microsoft Visual Studio Главной целью корпорации является высокая производительность компиляторов и совместимость с Microsoft Visual Studio на Windows и с gcc на Linux и Mac OS. www.intel.com/software/products 10/17/10 Некоторые полезные опции компилятора • • • • • • /Od (-O0 for Linux) – оптимизации отключены, дебаг-режим. /O2 (-O2 for linux) – оптимизации «по-умолчанию» . /O3 (-O3 for linux) – дополнительные оптимизации. /xO (-xO for Linux) – оптимизация под неинтеловскую архитектуру. /Qipo (-ipo) - межпроцедурная оптимизация. /Qparallel (-parallel) – автопараллелизация. • /Qopt-report (-opt-report) • /Qopt-report-file • /Qopt-report-phase • /Qopt-report-help • /Qopt-report-routine • /Qvec-report [1/2/3] 6 Дополнительные инструменты оптимизации приложений • Существуют различные средства поиска неоптимальных участков кода в зависимости от типов решаемых задач и сред исполнения 7 Intel VTune™ Amplifier XE Performance Profiler •предоставляет информацию о производительности программ •подходит как для последовательных, так и для многопоточных приложений •версии как для Windows, так и для Linux •для Windows может интегрироваться в Visual Studio или работать отдельно с собственным GUI •для Linux – только отдельно •есть возможность использования из командной строки для удалённого сбора данных или регрессивного тестирования 8 Intel VTune™ Amplifier XE Performance Profiler Помогает проанализировать особенности алгоритма и определить фрагменты приложения, где оно может использовать доступные ресурсы более рационально. Позволяет найти и определить следующее: • функции, на вычисление которых тратится основное время (горячие функции) • фрагменты кода, которые не используют процессор эффективно • области, наиболее сильно нуждающиеся в оптимизации • синхронизации, влияющие на производительность приложения • фрагменты кода, создающие эффект бутылочного горлышка 9 Шаги по использованию VTune • Выбрать объект для анализа • Скомпилировать • Запустить анализ • Интерпретировать результаты • Улучшить приложение при помощи алгоритмов оптимизации 10 Сборка приложения • Для получения более детальной информации посредством VTune рекомендуется компилировать приложения в режиме debug с генерацией символьной информации 11 Запуск анализа • Запуск из графического интерфейса осуществляется интуитивно понятно 12 Анализ • После выполнения анализа отображается общая информация • Список содержит функции, на выполнение которых было затрачено наибольшее количество времени 13 Стек вызовов • Можно просматривать не только функцию, но и стек вызова 14 Просмотр по вычислительным потокам • 1 – время • 2 – вычислительные потоки • 3 – использование процессора 15 Исходный код • 1 – код программы, 2 – ассемблерный код, • 3 – процессорное время, • 4 и 5 – элементы навигации для быстрого перемещения по горячим строкам кода 16 Сравнение результатов • Для определения выигрыша, вызванного оптимизациями удобно воспользоваться функцией сравнения 17 Сравнение результатов • 1 – различие во времени между версиями • 2 – время до оптимизаций • 3 – время после оптимизаций 18 Оценка эффективности использования вычислительных ресурсов • Аналогичным образом можно произвести другие виды анализа, например, locks and waits 19 Осуществление анализа • После выполнения анализа вам также будет представлена краткая информация, но уже по другому аспекту 20 Осуществление анализа • Также имеется возможность просмотра более детальной информации по стеку вызова и объектам синхронизации • 1 – объект, 2 – использование процессора, • 3 – количество циклов ожидания 21 Анализ исходного кода • 1 – строки кода, 2 – использование процессора, • 3 – общее количество циклов ожидания, • 4 - навигация 22 Сравнение результатов • 1 – различия во времени ожидания, 2 – время ожидания до оптимизаций, 3 – время ожидания после оптимизаций, 4 – разница в количестве циклов ожидания, 5 и 6 – количество циклов ожидания 23 Некоторые события •CPU_CLK_UNHALTED.CORE – количество тактов процессора •INST_RETIRED.ANY – количество исполненных инструкций •BUS_TRANS_ANY.ALL_AGENTS – количество всех транзакций шины •L2_LINES_IN.SELF.DEMAND – количество промахов по L2 кэшу. •BR_INST_RETIRED.MISPRED – неправильно предсказанные ветвления 24 Время доступа к памяти 200 16000 Write Bandwidth(MB/s) Read Bandwidth(MB/s) 180 14000 160 MB/s 10000 140 CPU: Intel Pentium M (Dothan) 1.8 GHz RAM: DDR2 SDRAM 266MHz BUS: 133 MHz 120 cycles 12000 8000 CPU: Intel Pentium M (Dothan) 1.8 GHz RAM: DDR2 SDRAM 266MHz BUS: 133 MHz Latency(cycles) 100 80 60 6000 40 4000 20 0 10 24 12 28 8 23 55 2 35 84 0 58 36 8 88 06 12 4 90 2 18 4 73 9 26 2 82 8 38 8 29 7 54 6 47 6 77 8 10 10 72 89 5 15 3 6 36 0 21 0 0 60 6 30 4 0 36 1 42 6 0 65 9 59 8 4 90 4 84 0 0 08 06 4 2000 size (bytes) 24 20 20 88 00 32 36 40 76 76 64 20 44 68 12 1 6 3 2 7 6 4 8 8 8 88 10 19 35 58 96 15 2 23 9 37 4 58 1 90 1 3 92 1 47 3 09 0 95 8 45 076 584 597 004 706 170 1 2 3 5 7 12 18 28 44 67 0 4 1 size (bytes) 25 Что влияет на то, насколько плохо использует ресурсы компьютера программа? • Конкуренция за ресурсы • «Узкие места» - bottlenecks Зависимости (например, по данным) • Неиспользование каких-то возможностей (многоядерность, новые архитектурные возможности,..) 26 Спасибо за внимание!