Основные понятия
Профилирование предназначено для выявления наиболее затратных по времени мест в программе с целью увеличения ее быстродействия (см. Profile to Improve Performance).
Профилирование параллельных программ определяет как затраты на вычисление функций, так и затраты на коммуникации (см. Profiling Parallel Code).
Профилирование в Matlab осуществляется с помощью инструмента, называемого профилировщик или профайлер (profiler).
Результатом профилирования являются суммарный и детальный отчеты о выполнении программы.
Суммарный отчет о профилировании параллельной программы содержит для каждого параллельного процесса (lab
) информацию о времени вычисления функций и частоте их использования, а также о времени, затраченном на обмены (коммуникации) и ожидание обменов с другими процессами.
Для проблемных функций полезно выдавать детальный отчет, в котором содержится статистика по строкам функций, а именно: время выполнения и частота использования.
Код программы можно считать достаточно оптимизированным, если в результате изменения алгоритма большая часть времени выполнения программы будет приходиться на обращения к нескольким встроенным функциям.
Вверх
Действия пользователя
Действия пользователя иллюстрируются на примере функции colsum()
по аналогии с функцией foo()
из раздела Examples описания команды (функции) mpiprofile
.
Внесение изменений в текст программы
1) В заголовок функции добавить выходной параметр для информации о профилировании, назовем его p
:
function [p, total_sum] = colsum
2) В тело функции добавить команду mpiprofile
, а именно:
mpiprofile on
для включения профилирования (начала сбора данных)
mpiprofile off
для выключения профилирования при необходимости (или желании)
p = mpiprofile('info');
для доступа к сгенерированным данным и сохранения собранной информации в выходном параметре p
.
Пример скорректированной программы приведен ниже в файле ml_prof_colsum.PNG
.
Запуск программы на профилирование
1) При запуске функции указать увеличенное соответственно на 1 число выходных параметров.
2) Запустить программу-функцию из командной строки:
mlrun -np 9 -maxtime 5 colsum '2'
или в окне Matlab:
j = imm_sch(9,5,@colsum,2);
Замечание. Окончания счета при желании можно ждать с помощью команды wait(j)
.
Просмотр результатов профилирования
Пусть программа запущена в окне Matlab. Тогда по окончании счета следует
1) получить результаты:
out = j.fetchOutputs;
2) выделить вектор с информацией о профилировании:
p_vector = [out{:, 1}];
3) запустить вьюер:
mpiprofile('viewer', p_vector);
Подобные действия для ранних версий приведены ниже в файле ml_prof_session.PNG
.
Для повторного использования полученные переменные можно сохранить командой:
save ('res_prof', 'out', 'p_vector')
(в файле res_prof.mat
) и загрузить при необходимости в другом сеансе:
load ('res_prof')
Вверх
Некоторые советы
Первая реализация программы должна быть настолько проста, насколько возможно, т.е. не рекомендуется ранняя оптимизация.
Профилирование может быть использовано
- в качестве инструмента отладки;
- для изучения (понимания) незнакомых файлов.
При отладке программы детальный отчет даст представление о том, какие строки выполнялись, а какие нет. Эта информация может помочь в расширении набора тестов.
Для очень длинного файла с незнакомым матлабовским кодом можно использовать профайлер, чтобы посмотреть, как файл в реальности работает, т.е. посмотреть вызываемые строки в детальном отчете.
При использовании профилирования копию 1-го детального отчета рекомендуется сохранить в качестве основы для сравнения с последующими, полученными в ходе улучшения программы.
Замечание. Существуют неизбежные отклонения времени, не зависящие от кода, т.е. при профилировании идентичного кода дважды можно получить слегка различные результаты.
Прикрепленный файл | Размер |
---|---|
ml_prof_colsum.PNG | 38.44 КБ |
ml_prof_session.PNG | 85.25 КБ |