Автор: Павел Головко
В данной статье рассмотрены вопросы простого профилирования
программ, т.е. каким образом можно отследить различные временные
характеристики разработанной параллельной программы.
* * *
1. Средства, предлагаемые Hewlett Packard (SPP-1600)
Hewllet Packard предлагает
несколько средств для профилирования параллельных программ.
Мне извесны 2 способа. С
опцией t и с опцией i spec.
Первый способ описан в трудах
Ильи Евсеева.
Второй способ заключается
в указании опции i spec. Это выглядит следующим образом:
mpirun -i spec -np 4 ./prof.exe
Здесь -i spec
- опция MPI загрузчика, сообщающая о необходимости сформировать профилировочный
файл
- np 4 - количество
процессов
- prof.exe - профилируемая программа
Если все проходит корректно, то после завершения программы, MPI формирует текстовый файл spec.instr, в который пишет информацию собранную в процессе работы программы.
В файле:
User
- время работы программы, в процентах от общего
времени работы программы, потраченное
непосредственно на пользовательскую часть.
MPI - время работы
программы, в процентах от общего времени работы программы, потраченное
на работу MPI.
Rank - номер ветви в параллельной программе
Duration - время выполнения программы (от функции MPI_Init, до фунции MPI_Finalize)
Overhead - время ожидания каждой отдельной ветви конца процесса. Дело в том, что после того, как ветвь доходит до функции MPI_Finalize, MPI ждет, пока все ветки параллельной программы не завершатся (это можно увидеть, если посмотреть столбец Duration, там все время почти одинаковое).
User, MPI - те же, что и описанные ранее, только
конкретно для данной ветки.
Все остальное касается выполнения функций.
2. Средства предлагаемые MPI
Стандарт MPI 1.1. оговаривает функцию, которая возвращает
время в секундах, прошедшее с некоторого момента. Данная функция одинаково
работает на любых платформах.
Она имеет следующий вид:
double MPI_Wtime(void)
Пример:
{
double starttime,
endtime;
starttime
= MPI_Wtime();
...
endtime
= MPI_Wtime();
printf("That took
%f seconds\n",endtime-starttime);
}
Таким образом можно вычислить "грязное" время работы процесса, то есть величину, включающую время выполнения самого процесса + ожидание, во время которого выполняются другие процессы в многозадачной операционной системе. Каким образом найти чистое время работы процесса, пока не знаю. Кто знает - пишите.
Также есть функция, которая возвращает число секунд, прошедшее между двумя последовательными тиками таймера. Функция объявляется следующим образом:
double MPI_Wtick(void)
DOUBLE PRECISION MPI_WTICK()
Так, например, если между соседними тиками таймера проходит одна милисекунда, то функция возвращает 0.001 с.
NB! Необходимо отметить, что если первая функия платформонезависимая (т.к. измеряет время в секундах), то вторая непосредственно зависит от архитектуры.