Общее время выполнения MPI - PullRequest
19 голосов
/ 14 марта 2011

Я работаю над небольшим приложением, которое умножает массив на матрицу. Работает без проблем. Я жажду измерить время выполнения приложения. Я могу найти индивидуальное время выполнения каждого процесса (его начало и окончание), но мне нужно глобальное время.

Это мой код:

int main(int argc, char **argv){
    int rang, procesus;
    MPI_Status statut;
    double start, end, max_end = 0, min_start = 10000;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rang);
    MPI_Comm_size(MPI_COMM_WORLD, &procesus);
    MPI_Barrier(MPI_COMM_WORLD);

    start = MPI_Wtime();
    printf("Starting time of process n. %d %f\n",rang, start);
    if(rang==0){
        //Master work
    }else{
        //slaves work
    }
    MPI_Barrier(MPI_COMM_WORLD);
    end = MPI_Wtime();
    printf("Ending time of process n.%d %f\n\n\n",rang, end);

    MPI_Finalize();
//Out of the Parallelized task

    if(min_start > start){
        min_start = start;
        printf("New minumum starting time %f\n", min_start);
    }

    if(max_end < end){
        max_end = end;
        printf("New maximum ending time %f\n", max_end);
    }

    if(rang == 0){
        printf("Start %f\n", min_start);
        printf("End %f\n", max_end);
    }
    return 0;
}

Я использую переменные min_start и max_end в качестве «глобальных» переменных, чтобы попытаться перехватить максимальную и минимальную температуры всех процессов, но я всегда получаю начальный и конечный время последнего процесса, время окончания в порядке. , но время запуска неверно, потому что последний процесс был не первым запустившимся. Что я делаю неправильно? Могу ли я использовать действительно глобальную переменную в MPI для всех процессов, и если я могу, как?

Вот что у меня на выходе

Starting time of process n.2. 0.101562
Ending time of process n.2. 0.105469
New minumum starting time 0.101562
New maximum ending time 0.105469

Starting time of process n.3. 0.058594
Ending time of process n.3. 0.062500
New minumum starting time 0.058594
New maximum ending time 0.062500

Starting time of process n. 4. 0.007812
Ending time of process n. 4. 0.011719
New minumum starting time 0.007812
New maximum ending time 0.011719

Starting time of process n.1. 0.148438
Ending time of process n.1. 0.152344
New minumum starting time 0.148438
New maximum ending time 0.152344

Starting time of process n.0. 0.207031 
Ending time of process n.0. 0.210938
New minumum starting time 0.207031
New maximum ending time 0.210938

Start 0.207031
End 0.210938

Ответы [ 2 ]

33 голосов
/ 14 марта 2011

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

Стоит отметить, что вы должны установить барьер до сбора времени начала (чтобы убедиться, что все узлы готовы к продолжению) и до времени окончания (чтобы убедиться, что все узлы выполнены).

double start, end;

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */
start = MPI_Wtime();

/* ... do work ... */

MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */
end = MPI_Wtime();

MPI_Finalize();

if (rank == 0) { /* use time on master node */
    printf("Runtime = %f\n", end-start);
}

То же самое на всех узлах даст почти одинаковые результаты с небольшими отклонениями в зависимости от того, как быстро каждый узел возвращается из вызова MPI_Barrier.Это обычно очень небольшое значение по сравнению с большинством практических прогонов, и его можно сбрасывать со счетов.

Попытка получить время, используя время начала / окончания из разных узлов, не стоит усилий и может дать ваши неправильные ответы, если MPI_Wtime не использует глобальные синхронизированные часы .Обратите внимание, что синхронизированное время Wtime не поддерживается в некоторых реализациях MPI (проверьте MPI_WTIME_IS_GLOBAL).

11 голосов
/ 14 марта 2011

MPI_Init() и MPI_Finalize() не отмечают начало и конец параллельного выполнения, только начало и конец, где разрешены вызовы MPI. В MPI все ваши процессы работают параллельно от начала до конца и не используют глобальные данные вообще.

Вы можете использовать MPI_Reduce(), чтобы найти минимальное время начала и максимальное время окончания процессов.

...