ПРОСТОЕ ПРОФИЛИРОВАНИЕ ПАРАЛЛЕЛЬНЫХ ПРОГРАММ СРЕДСТВАМИ MPI





Автор: Павел Головко
 

    В данной статье рассмотрены вопросы простого профилирования программ, т.е. каким образом можно отследить  различные временные характеристики разработанной параллельной программы.
 
 

*                     *                     *



1. Средства, предлагаемые Hewlett Packard (SPP-1600)

        Hewllet Packard предлагает несколько средств для профилирования параллельных программ.
        Мне извесны 2 способа. С опцией  и с опцией  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! Необходимо отметить, что если первая функия платформонезависимая (т.к. измеряет время в секундах),  то вторая непосредственно зависит от архитектуры.