他の人の質問に対する長い回答をしばらく書いていましたが、回答を投稿する前に削除するだけでした。努力を無駄にしたくないので、質問と回答をここに投稿します。
特定のコンパイラでのみ機能する興味深い半分の解決策も見つけたので、送受信のデッドロックに関する単なる標準的な回答ではありません。
並行コースでは、マスター プロセス 0 がメッセージをすべてのスレーブに送信し、メッセージを左右の隣人 (プロセッサ ID +/- 1、左の隣人を持たないプロセッサ 0 と、右の隣人を持たない最後のプロセッサ ID を除きます)。ネイバーにメッセージを再送信した後、スレーブ プロセッサは、ジョブが終了したというコンフォメーションをマスター プロセッサに送信します。
演習は簡単ですが、コードに問題があります。プログラムの開始時に確認終了メッセージが表示されるためです...ここで何が問題なのかわかりません。私は fflush で試しましたが、実際には、プログラムの最後の行は受信後にのみコンソールに書き込まれるはずです。
誰かが何か考えがありますか?私は MPI/C の概念に慣れていないので、何か問題があるのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char *argv[]){
int np, myId;
char send[100], recv[100];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &np);
MPI_Comm_rank(MPI_COMM_WORLD, &myId);
MPI_Status stat;
if(myId == 0){
int t = sprintf(send, "hey!"); //MPI_get_processor_name
for(int i = 1; i < np; i++){
printf("send %d => %d\n", myId, i);
fflush(stdout);
MPI_Send(send, 50, MPI_CHAR, i, 0, MPI_COMM_WORLD);
}
for(int i = 1; i < np; i++){
MPI_Recv(recv, 50, MPI_CHAR, i, 0, MPI_COMM_WORLD, &stat);
printf("%s\n", recv);
fflush(stdout);
}
}else{
if(myId < (np - 1)){
printf("send %d => %d\n", myId, myId + 1);
fflush(stdout);
MPI_Send(send, 50, MPI_CHAR, myId + 1, 0, MPI_COMM_WORLD);
}
if(myId > 1){
printf("Envoie %d => %d\n", myId, myId - 1);
fflush(stdout);
MPI_Send(send, 50, MPI_CHAR, myId - 1, 0, MPI_COMM_WORLD);
}
MPI_Recv(send, 50, MPI_CHAR, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &stat);
printf("Réception %d <= %d\n", myId, 0);
fflush(stdout);
if(myId != (np - 1)){
MPI_Recv(send, 50, MPI_CHAR, myId + 1, 0, MPI_COMM_WORLD, &stat);
printf("Receive %d <= %d\n", myId, myId + 1);
fflush(stdout);
}
if(myId != 1){
MPI_Recv(send, 50, MPI_CHAR, myId - 1, 0, MPI_COMM_WORLD, &stat);
printf("Receive %d <= %d\n", myId, myId - 1);
fflush(stdout);
}
int t = sprintf(recv, "End for %d.", myId);
MPI_Send(recv, 50 , MPI_CHAR, 0, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}