目标是衡量运行时间与#of进程的关系。
我只是MPI的初学者并被困在某个地方。
我写了一个hello world程序,想要测试全局运行时。
我尝试使用barrier,以确保在测量系统时间之前所有进程都终止,但是我遇到了分段错误。
我的代码:
#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;
}
帮我弄清楚为什么我会出现分段错误?
答案 0 :(得分:1)
我可以从代码中注意到的第一件事是你已经测量了MPI_Barrier
之前的时间,这意味着甚至在所有进程打印“hello world"
之前就可以测量运行时。”确保正确性衡量MPI_Barrier
之后的时间。
此外,您可能希望使用MPI_Wtime()
来衡量MPI流程所用的时间。
您的代码只会在每台机器上打印运行时,为了计算全局运行时,您必须使用MPI_Reduce
。此函数将计算指定的操作(在本例中为MAX)并将结果存储在根目录中。
所以这就是你的代码应该是什么样的:
#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;
}