我刚开始用C语言学习MPI编程,而我正在执行一项任务,要求我让我的进程将他们的消息发送到下一个更高级别的进程,最后一个进程将其消息发送回过程0.我已经开始做测试,但即使使用这个更简单的代码,程序仍然会挂起。最后一个进程将消息发送回进程零可能是个问题。
这是我的代码:
#include <stdio.h>
#include <string.h> /* For strlen */
#include <mpi.h> /* For MPI functions, etc */
const int MAX_STRING = 100;
int main(void) {
char greeting[MAX_STRING];
int my_rank, p;
/* Start up MPI */
MPI_Init(NULL, NULL);
/* Get the number of processes */
MPI_Comm_size(MPI_COMM_WORLD, &p);
/* Get my rank among all the processes */
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
if (my_rank == 0) {
MPI_Recv(greeting, MAX_STRING, MPI_CHAR, 2,
0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("%s\n", greeting);
sprintf(greeting, "Greetings from Dank Meme 0");
MPI_Send(greeting, strlen(greeting)+1, MPI_CHAR, my_rank+1, 0,
MPI_COMM_WORLD);
} else if (my_rank == 1){
MPI_Recv(greeting, MAX_STRING, MPI_CHAR, 0,
0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("%s\n", greeting);
sprintf(greeting, "Greetings from Dank Meme 1");
MPI_Send(greeting, strlen(greeting)+1, MPI_CHAR, 2, 0,
MPI_COMM_WORLD);
} else if (my_rank == 2) {
MPI_Recv(greeting, MAX_STRING, MPI_CHAR, 1,
0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("%s\n", greeting);
sprintf(greeting, "Greetings from Dank Meme 2");
MPI_Send(greeting, strlen(greeting)+1, MPI_CHAR, 0, 0,
MPI_COMM_WORLD);
}
/* Shut down MPI */
MPI_Finalize();
return 0;
} /* main */
感谢您的帮助!
答案 0 :(得分:1)
问题确实是您的所有进程都在MPI_Recv
上阻止。要解决此问题,您可以继续:
initialize message
if( my_rank != 0 ){
receive message from my_rank-1
}
send message to (my_rank + 1)%p
if( my_rank == 0 ){
receive message from p - 1
}
首先,除主my_rank==0
之外的所有进程都在等待消息,而进程0
继续直接将消息发送给其邻居(等级1
)。然后,这会释放进程1
(在MPI_Recv
中被阻止),然后继续将消息发送到进程2
等。最后,进程0
接收来自上一进程的消息p-1
。
例如,请参阅此tutorial(Ring计划部分)。