ПОД_3.1 (кр_з)
Описание файла
Файл "ПОД_3.1" внутри архива находится в папке "кр_з". Документ из архива "кр_з", который расположен в категории "". Всё это находится в предмете "параллельная обработка данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "ПОД_3.1"
Текст из документа "ПОД_3.1"
Казачкин Дмитрий, 522 гр.
Цели и методы профилирования программ
Профилирование — измерение производительности как всей программы в целом, так и отдельных ее фрагментов, с целью нахождения "горячих" точек (Hot Spots), — тех участков программы, на выполнение которых расходуется наибольшее количество времени.
Поскольку большинство программ проводят 90% времени в 10% кода (правило «90/10», примененное к информационным технологиям), то было бы весьма неплохо выловить эти 10% и переписать их эффективнее. Однако простой взгляд на текст программы не всегда позволяет найти такие места. Вот тут и приходит на помощь профилировка.
Основная цель профилировки — исследовать характер поведения приложения во всех его точках. Под "точкой" в зависимости от степени детализации может подразумеваться как отдельная машинная команда, так целая конструкция языка высокого уровня (например: функция, цикл или одна–единственная строка исходного текста). Анализ данного поведения позволяет выделить наиболее «узкие» места, давая тем самым твердую почву для улучшений показателей программы путем модификаций подобных участков.
Для достижения данной цели, большинство современных профилировщиков поддерживают определение следующих базовых показателей для каждой точки программы общее время исполнения, удельное время исполнения, количества вызовов той или иной точки программы, причины/источники конфликтов и пенальти, а также степень покрытия кода программы, статистику использования кэша и многое другое. Рассмотрим подробнее каждый показатель.
-
Общее время исполнения – время, проведенное суммарно в пределах точки программы. Понятно, что таким образом определенная величина для функции main() равна 100%, что не очень интересно. Если под точками программы подразумеваются функции, то целесообразно также рассматривать чистое время работы каждой из функций (т.е. с вычетом времени дочерних функций).
Func Func+Child Hit Time % Time % Count Function --------------------------------------------------------- 350,192 95,9 360,982 98,9 10000 _do_pswd (pswd_x.obj) 5,700 1,6 5,700 1,6 10000 _CalculateCRC (pswd_x.obj) 5,090 1,4 10,790 3,0 10000 _CheckCRC (pswd_x.obj) 2,841 0,8 363,824 99,6 1 _gen_pswd (pswd_x.obj) 1,226 0,3 365,148 100,0 1 _main (pswd_x.obj) 0,098 0,0 0,098 0,0 1 _print_dot (pswd_x.obj) |
-
Удельное время выполнения (так же называемое растактовкой) соответствует времени выполнения точки программы в среднем, лучшем и худшем случае. Если для какой-либо строчки кода среднее значение существенно превышает некоторый разумный порог – имеет смысл задуматься, а все ли в порядке, к примеру, с кэшем и правильно ли вообще составлен алгоритм. В идеале, при работе на уровне машинных команд, удельное время для каждой точки должно мериться единицами тактов. Если разброс между минимальным и максимальным значением измеряется порядками, то также следует заподозрить неладное.
109 y = y | y << 8; 109 mov eax,DWORD PTR [ebp-28] 109 shl eax, 08h 109 mov ecx, DWORD PTR [ebp-28] 109 or ecx, eax 109 mov DWORD PTR [ebp-28], ecx | 2 1 (0,7.3,80) 1 1 |
-
Количество вызовов – простая и в то же время довольно важная характеристика точки программы. Если оно слишком низкое, то это означает, что не стоит доверять остальным данным, поскольку нет гарантии, что замеренное время и разброс не связаны с подгрузкой из ОП при первом запуски или других краевых эффектах, не выражающихся ярко при миллионах последовательных прогонов. Кроме того, данный параметр позволяет оценить важность оптимизации некоторой конструкции. Ведь улучшение на 1% при миллионах вызовов даст огромный прирост, в то время как ускорение на 10% может оказаться незначительным при числе вызовов, измеряемых десятками. Часто вызываемые функции просто необходимо делать in-line.
-
Причины/источники конфликтов и пенальти определяются, исходя из информации о пенальти машинных команд. Хотя современные процессоры x86 с некоторыми ограничениями позволяют получить эту информацию и так, гранды компьютерной индустрии — Intel и AMD уже давно выпустили свои профилировщики, содержащие полноценные эмуляторы выпускаемых ими процессоров, позволяющие визуализировать нюансы выполнения каждой машинной инструкции.
decoder minimum clocks = 0 Decoder Average Clocks = 0 Decoder Maximum Clocks = 4 retirement average clocks = 1 total cycles = 1011 (08,20%) micro-ops for this instruction = 1 The instruction had to wait (8,11.1,113) cycles for it's sources to be ready Dynamic Penalty: BTB_Miss_Penalty This instruction stalls because the branch was mispredicted. Occurances = 13 |
-
Покрытие кода – побочная функция профилировщиков, не имеющая прямого отношения к оптимизации. Покрытием кода называется процент достигнутых при профилировании точек программы от общего числа точек. Эта информация важна, чтобы убедиться, что весь код приложения протестирован целиком и в нем не осталось никаких "темных" мест, т.е. профилированы были все ветки программы.
call depth: 2 total functions: 5 Function coverage: 60,0% Module Statistics for pswd.exe ------------------------------ Functions in module: 5 Module function coverage: 60,0% Covered Function ---------------- . _DeCrypt (pswd.obj) . __real@4@4008fa00000000000000 (pswd.obj) * _gen_pswd (pswd.obj) * _main (pswd.obj) * _print_dot (pswd.obj) |
-
Многие современные профилировщики также проводят сбор статистики по попаданию в кэш первого и второго уровней процессора при выполнении операций чтения и записи данных и инструкций программ, а также статистику по работе модуля предсказания ветвлений в программах
I refs: 1,873,023 I1 misses: 2,222 L2i misses: 2,057 I1 miss rate: 0.11% L2i miss rate: 0.10% D refs: 808,914 (578,685 rd + 230,229 wr) D1 misses: 9,785 ( 9,212 rd + 573 wr) L2d misses: 5,119 ( 4,757 rd + 362 wr) D1 miss rate: 1.2% ( 1.5% + 0.2% ) L2d miss rate: 0.6% ( 0.8% + 0.1% ) L2 refs: 12,007 ( 11,434 rd + 573 wr) L2 misses: 7,176 ( 6,814 rd + 362 wr) L2 miss rate: 0.2% ( 0.2% + 0.1% ) |
Вся приведенная выше информация может быть собрана различными путями. Эти пути могут предполагать изменения в самой программе или в среде выполнения, но, так или иначе, в итоге это приводит к замедлению работы и отличием абсолютных значений измеряемых величин от их реальных значений при обычной работе. К счастью, качественные соотношения величин все же как правило, сохраняются, что дает возможность принимать полученные результаты как приближения реальных.
Пути сбора профилирующей информации можно разделить на следующие группы:
-
Event based. В данном случае, профилировщиком является сама среда выполнения (например, .NET framework или виртуальная машина Java, а также среды Python и Ruby). Профилировщики всех данных сред – событийно-ориентированные, т.е. профилировщик работает благодаря хуку, выполняемому при различных вызовах.
-
Statistical. В основе данного метода лежит статистический прием семплирования. По прерываниям системы проверяется значение счетчика команд изучаемой программы. Наиболее знаковые системы, использующие данный подход - GNU's gprof, AMD's CodeAnalyst, Intel VTune.
-
Hypervisor / Simulator. Программа запускается в виртуальном окружении или под симулятором. В первом случае используется реальная аппаратура (SIMMON), при симуляции же работа процессора лишь симулируется на языке высокого уровня (SIMON, OLIVER).
-
Instrumentation. Модификация программы для выполнения инструкций, связанных с профилировкой. Модификации должны быть в запущенном бинарном приложении, но внесены могут быть на любом этапе:
-
Модификация исходного кода, вручную при написании
-
Модификация компилятором («gcc –pg »)
-
Модификация бинарного приложения (ATOM)
-
Модификация во время выполнения (PIN, Valgrind)
-