Optimization/lecture1
Материал из Computer Engineering Faculty.
«Все компьютеры когда-то были суперкомпьютерами».
Мотивация курса: современные приложения требуют большой производительности. Среди них: научные приложения, мультимедийные приложения, бизнес-приложения, системы управления технологическими процессами. Также высокая производительность важна в мобильных устройствах, где вычислительные ресурсы ограничены. На сегодняшний день мобильные устройства широко распространены и их количество будет увеличиваться в будущем.
Зачем изучать оптимизацию? Это даст знание микроархитектуры процессоров, как выполняется программа на процессоре, знание инструментов анализа производительности, знание типичных проблем производительности, знание лучших шаблонов кода для высокопроизводительных приложений. Важно понимать, что компьютер — это программно-аппаратный комплекс, и производительность выполнения программы следует рассматривать только в связке с той аппаратурой, на которой она выполняется, а не в отдельности.
Цель курса — дать общее видение процессов оптимизации производительности, основных проблем и способов их решения.
Использованные источники:
- The Software Optimization Cookbook (Intel Press)
- IA-32 Intel® Architecture Optimization Reference Manual
- IA-32 Intel® Architecture Software Developer’s Manual. Vol. 3: System Programming Guide
- Intel® C++ Compiler Optimizing Applications
- Agner Fog, Optimizing software in C++, http://www.agner.org
Рассмотрим типичные заблуждения при разработке и оптимизации программного обеспечения:
- «Нельзя улучшить производительность приложения до полного завершения разработки».
- «Сначала запрограммируем, а потом посмотрим на целевую платформу».
- «Удалим функциональность, если она тормозит работу программы».
- «На моём компьютере ничего не тормозит».
- «Максимальное быстродействие может быть достигнуто только с использованием языка ассемблера».
- «Если останется время — оптимизируем».
- «Оптимизация требует знания мельчайших деталей микроархитектуры микропроцессора, проектирования, VHDL и Verilog».
Существуют различные цели оптимизации:
- производительность (скорость работы программы);
- объем занимаемой памяти;
- время инсталляции;
- время запуска приложения;
- время, требуемое пользователям для выполнения поставленных задач.
Важно отметить, что в итоге все оптимизации должны быть полезны конечному пользователю.
Для удобства программистов разработан цикл оптимизации приложения. Необходимо совершать один виток после небольших изменений. Если на очередной итерации невозможно получить существенного ускорения и нельзя обнаружить новых проблем производительности, то нужно остановиться.
На первом шаге необходимо проанализировать приложение, собрать необходимую статистику для принятия решений о месте и способе оптимизации. Приложение может быть достаточно большим, и не всегда очевидно, где находится узкое место, которое ограничивает производительность. Разработаны специальные программы — анализаторы производительности (Intel VTune Performance Analyzer, Intel Thread Profiler), которые предоставляют достаточный объем информации об исполнении программы на процессоре.
На втором шаге необходимо проанализировать полученную статистику и определить проблемы.
На третьем шаге, когда определен список проблем производительности, нужно выбрать вариант решения этих проблем. Существует несколько подходов к реализации. Среди них:
- использовать более производительный алгоритм;
- использовать оптимизирующий распараллеливающий компилятор;
- использовать оптимизированные библиотеки;
- переписать фрагмент кода, который приводит к проблеме.
На четвертом шаге необходимо выполнить функциональное тестирование приложения. Необходимо убедиться, что внесенные исправления не повлияли на исправность функционирования приложения.
Далее цикл повторяется вновь. Необходимо собрать статистику и количественно оценить полученное ускорение, которые может быть вычислено, как отношение времени выполнения программы на шаге i к времени выполнения на шаге i-1.
Для объективной оценки производительности применяются специальные тесты. Существуют различные виды тестов: функциональные, нагрузочные, стресс-тесты, тесты на безопасность. Нагрузочные тесты — это повторяемая нагрузка на приложение для анализа производительности.
Свойства теста:
- повторяемость;
- представительность;
- удобство в эксплуатации;
- проверяемость;
- метрики выполнения (время выполнения, кадры в секунды, файлов в секунду);
- покрытие;
- точность измерения.
