C / MPIで分散Webサーバーを構築していますが、コードの最初のMPI_BARRIERの後で、ポイントツーポイント通信が完全に機能しなくなったようです。標準のCコードはバリアの後で機能するので、各スレッドがバリアを通過することを知っています。ポイントツーポイント通信も、バリアの前で問題なく機能します。ただし、バリアの前の行で機能していたのと同じコードをコピーして、バリアの後の行に貼り付けると、完全に機能しなくなります。SENDは永遠に待ちます。代わりにISENDを使用しようとすると、回線を通過しますが、メッセージが受信されません。私はこの問題をよく調べており、MPI_BARRIERに問題がある人は誰でも、バリアが正しく機能し、コードが間違っていると言われていますが、私のコードが間違っている理由を一生理解することはできません。
これを示すサンプルプログラムは次のとおりです。
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int procID;
int val;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &procID);
MPI_Barrier(MPI_COMM_WORLD);
if (procID == 0)
{
val = 4;
printf("Before send\n");
MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD);
printf("after send\n");
}
if (procID == 1)
{
val = 1;
printf("before: val = %d\n", val);
MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
printf("after: val = %d\n", val);
}
MPI_Finalize();
return 0;
}
バリアの前に2つのステートメントを移動するif
と、このプログラムが正しく実行されます。
編集-タイプに関係なく、最初の通信は機能し、その後のすべての通信は失敗するようです。これは私が最初に思ったよりはるかに一般的です。最初の通信が障壁であるか他のメッセージであるかは関係ありません。将来の通信は適切に機能しません。