簡體   English   中英

MPI C程序在MPI_Recv / MPI_Send期間掛起

[英]MPI C Program Hangs During MPI_Recv/MPI_Send

我剛剛開始學習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_RecvMPI_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被阻止),該MPI_Recv又繼續將消息發送到進程2等。最后,進程0從最后一個進程p-1接收消息。

參見,例如,本教程 (Ring程序一節)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM