2015-09-27 3 views
0

Цель состоит в том, чтобы измерять время выполнения по сравнению с процессами #of.общее измерение времени выполнения в MPI C

Я просто новичок в MPI и где-то застрял.

Я написал программу приветствия и хочу протестировать глобальное время выполнения.

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

Мой код:

#include <mpi.h> 
#include <stdio.h> 
int main(int argc, char *argv[]) { 
    double time1, time2; 
    double duration=0.0000; 
    int npes, myrank; 
    time1 = clock(); 
    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &npes); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    printf("From process %d out of %d, Hello World!\n", myrank, npes); 
    time2 = clock(); 
    if (time2-time1>duration) { 
    duration = time2-time1; 
    } 
    duration = time2-time1; 
    MPI_BARRIER(MPI_COMM_WORLD); 
    printf("runtime is %f ", duration); 
    MPI_Finalize(); 
    return 0; 
} 

Помоги мне понять, почему я получаю ошибку сегментации?

+3

C чувствителен к регистру. MPI_BARRIER будет захватывать символ Fortran во время соединения. – Jeff

+0

FYI Это скомпилировано с mpicc и работает mpirun –

ответ

1

Первое, что я могу заметить из вашего кода, - это то, что вы измерили время до MPI_Barrier, что означает, что время выполнения может быть измерено еще до того, как все процессы распечатывают «hello world".Чтобы обеспечить правильность измерения времени после MPI_Barrier.

Кроме того, вы можете использовать MPI_Wtime() для измерения времени, истекшего в процессе MPI.

Ваш код будет печатать только время выполнения на каждой машине, для вычисления глобального выполнения, вы должны использовать MPI_Reduce. Эта функция будет вычислять указанную операцию (MAX в этом случае) и хранить e результат в корне.

Так вот, что ваш код должен выглядеть следующим образом:

#include <mpi.h> 
#include <stdio.h> 
int main(int argc, char *argv[]) { 
    double time1, time2,duration,global; 
    int npes, myrank; 
    MPI_Init(&argc, &argv); 
    time1 = MPI_Wtime(); 
    MPI_Comm_size(MPI_COMM_WORLD, &npes); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    printf("From process %d out of %d, Hello World!\n", myrank, npes); 
    MPI_Barrier(MPI_COMM_WORLD); 
    time2 = MPI_Wtime(); 
    duration = time2 - time1; 
    MPI_Reduce(&duration,&global,1,MPI_DOUBLE,MPI_MAX,0,MPI_COMM_WORLD); 
    if(myrank == 0) { 
     printf("Global runtime is %f\n",global); 
    } 
    printf("Runtime at %d is %f \n", myrank,duration); 
    MPI_Finalize(); 
    return 0; 
} 
+0

Спасибо @Pooja, я полностью получил ваши баллы, вы хороший учитель! –

Смежные вопросы