gpt4 book ai didi

c - MPI C 程序在 MPI_Recv/MPI_Send 期间挂起

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:46 35 4
gpt4 key购买 nike

我刚开始用 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 */

感谢您的帮助!

最佳答案

问题确实是您的所有进程都阻塞在 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继续直接发送消息给它的邻居(rank 1)。然后释放进程 1(在 MPI_Recv 中阻塞),进程 1 继续将消息发送到进程 2 等。最后,进程 0 收到来自最后一个进程 p-1 的消息。

参见,例如,这个 tutorial (环计划部分)。

关于c - MPI C 程序在 MPI_Recv/MPI_Send 期间挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32904437/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com