【发布时间】:2011-01-24 13:34:53
【问题描述】:
所以我试图弄清楚在 C 代码中使用 MPI 在处理器之间发送和接收信息的通信开销。
我需要在发送和接收中都传递一个缓冲区,但我想做的只是计算两个处理器之间进行 n 次通信所需的时间。
这是我的完整代码:
main(int argc, char** argv){
int n;
int rank;
int time;
int i;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank == 0){
n = atoi(argv[1]);
printf("Size of data set = %d\n", n);
}
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
for(i = 0; i < n; i++){
if(rank == 0){
MPI_Send(&n, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
else{
MPI_Recv(&n, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
}
}
MPI_Barrier(MPI_COMM_WORLD);
time = clock();
printf("Time: %d\n", time);
MPI_Finalize();
}
我做了一些测试,发现当我取出 for 循环时它可以按照我想要的方式工作。那么导致无限循环或段错误的for循环有什么问题?
【问题讨论】:
-
我很惊讶即使没有循环也能正常工作。您的发送和接收调用使用不同的标签,因此接收不应返回。您正在运行多少个进程?另外,如果你要使用 MPI,你也应该使用它的定时器调用:MPI_Wtime()
-
我要做的只是从节点 0 发送到节点 1 并在节点 1 接收。这是处理器之间通信开销的简单收集。
-
下面有几个正确答案;我只想补充一点,如果您正在寻找这些时间,一组非常方便的工具是英特尔 MPI 基准,software.intel.com/en-us/articles/intel-mpi-benchmarks,其中包括 MPI“乒乓”时间。