2

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と、このプログラムが正しく実行されます。

編集-タイプに関係なく、最初の通信は機能し、その後のすべての通信は失敗するようです。これは私が最初に思ったよりはるかに一般的です。最初の通信が障壁であるか他のメッセージであるかは関係ありません。将来の通信は適切に機能しません。

4

1 に答える 1

5

Open MPI には、通信に TCP/IP を使用する場合の既知の機能があります。「UP」状態にあるすべての構成済みネットワーク インターフェイスを使用しようとします。これは、他のノードの一部がこれらのすべてのインターフェイスを介して到達できない場合に問題になります。これは、Open MPI が採用する貪欲な通信最適化の一部であり、あなたの場合のように問題を引き起こすことがあります。

少なくとも 2 番目のノードにはアップしている複数のインターフェイスがあり、この事実はネゴシエーション フェーズ中に最初のノードに導入されたようです。

  • 128.2.100.167 で構成されたもの
  • 192.168.109.1 で構成されたもの (マシンでトンネルまたは Xen を実行していますか?)

バリア通信は最初のネットワークを介して行われ、次に、MPI_Send明らかにすべてのノードを接続していない 2 番目のネットワークを介して 2 番目のアドレスに送信しようとします。

最も簡単な解決策は、ノードを接続するネットワークのみを使用するよう Open MPI に指示することです。次の MCA パラメータを使用して、そうするように指示できます。

--mca btl_tcp_if_include 128.2.100.0/24

(またはあなたの通信ネットワークが何であれ)

すべてのマシンで同じである場合は、ネットワーク インターフェイスのリストを指定することもできます。

--mca btl_tcp_if_include eth0

または、特定のインターフェイスを明確に除外するように Open MPI に指示することもできます (ただし、そうする場合は、常にループバック "lo" を除外するように指示する必要があります)。

--mca btl_tcp_if_exclude lo,virt0

SOで同じ問題を抱えているように見えるあなたや他の多くの人に役立つことを願っています. 最近、ほぼすべての Linux ディストリビューションがデフォルトでさまざまなネットワーク インターフェイスを起動し始めたようで、Open MPI で問題が発生する可能性があります。

PSそれらのノードをファイアウォールの背後に置いてください!

于 2012-05-06T18:33:40.777 に答える