【问题标题】:MPI C Program Hangs During MPI_Recv/MPI_SendMPI C 程序在 MPI_Recv/MPI_Send 期间挂起
【发布时间】:2015-12-30 12:03:57
【问题描述】:

我刚开始学习 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,没有人发送任何东西。每个人都在等待其他人先采取行动;)。
  • 谢谢!后来我意识到我的问题是我的代码先接收,而不是发送。

标签: c parallel-processing mpi


【解决方案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(环计划部分)。

【讨论】:

    猜你喜欢
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2021-08-03
    • 2011-11-05
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多