C/MPIで分散型Webサーバーを構築していて、コード内の最初のMPI_BARRIERの後にポイントツーポイント通信が完全に停止するようです。標準Cコードはバリアの後ろで動作するので、スレッドのそれぞれがバリアを通過することがわかります。ポイントツーポイント通信は、障壁の前でもうまくいきます。しかし、障壁の前の行に働いたのと同じコードを障壁の後の行にコピー&ペーストすると、それは完全に機能しなくなります。 SENDはちょうど永遠に待つでしょう。代わりにISENDを使ってみると、行を通って行こうとしますが、メッセージは受信されません。私はこの問題をたくさん探していましたが、MPI_BARRIERに問題がある人は誰でも障壁が正しく働き、コードが間違っていると言われていますが、私の人生は自分のコードが間違っている理由を理解できません。この現象の原因は何ですか?MPI_SENDが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
文の移動:ここ
EDIT - 最初の通信は、種類、動作、および将来のすべての通信に関係なく失敗するようです。これは私が最初に思ったよりはるかに一般的です。最初の通信が障壁またはその他のメッセージであるかどうかは関係ありません。将来の通信は適切に機能しません。
あなたが投稿したコードは私にはうまく見えます。あなたはどのバージョンのMPIを使用していますか? – suszterpatt
openmpi 1.5.5ではうまく動作します。 – chemeng
私はそれがopenmpiだと知っていますが、私はバージョン番号を把握できないようです。あなたに伝えるコマンドはありますか? – TEOUltimus