首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPI_Recv/ MPI _Send期间MPI C程序挂起

MPI_Recv/ MPI _Send期间MPI C程序挂起
EN

Stack Overflow用户
提问于 2015-10-02 17:37:26
回答 1查看 2K关注 0票数 1

我刚刚开始学习C中的MPI编程,我正在进行一项任务,要求我让我的进程将它们的消息发送到下一个排序更高的进程,最后一个进程将其消息发送回进程0。我已经开始做测试了,但是即使有了这个更简单的代码,程序仍然挂起。这可能是最后一个进程将消息发送回进程0的问题。

下面是我的代码:

代码语言:javascript
复制
#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 */

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2015-10-02 20:34:08

问题确实是你所有的进程都阻塞在MPI_Recv上。要解决此问题,您可以执行以下操作:

代码语言:javascript
复制
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 (环路程序部分)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32904437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档