2

MPI_Barrier が正しく動作することを確認するにはどうすればよいですか? そのためのテスト方法は何ですか?
ありがとうございました

4

3 に答える 3

4

MPI_Barrier が正しく機能していることを確認するには、機能しているバリアと機能していないバリアで異なる動作を保証するプログラムを作成する必要があると思います。

@Neerajの答えがそのように動作することが保証されているとは思いません。バリアが正しく機能している場合、プロセスはすべて、2 番目の出力行を書き込む前に最初の出力行を書き込みます。ただし、バリアがなくても (または、このように考えたい場合は、バリアが完全に失敗した場合でも)、これが発生する可能性があります。私の主張は、彼が提案する非常に短い睡眠時間 (5 ミリ秒ランク)には依存しません。プロセスが待機していると仮定した場合でも (ランク 5)、バリアがない場合、ステートメントはバリアが課された順序で表示される可能性があります。特に、o/s が stdout への複数の書き込みをどのようにバッファリングするかを検討する必要がある場合は、許可する可能性は低いですが、不可能ではありません。実際には、バリアではなくそのプロセスをテストしている可能性があります。 おー最も不正確なコンピューターの時計でも、プロセス 1 の待機時間がプロセス 2 の待機時間よりも短く、バリアの正しい動作を示すことができます。 o / sがプロセッサ1(プロセス1が実行しようとしている)を10秒間プリエンプティブにグラブする場合はそうではありません。

同期をオンボード クロックに依存すると、実際にはプログラムの決定性が低下します。すべてのプロセッサには独自のクロックがあり、ハードウェアは、すべてがまったく同じレートまたはまったく同じティック長でティックすることを保証しません。

また、そのテストでは、バリアのすべての故障モードを適切に調査することもできません。せいぜい、完全な障害を調査するだけです。実装が実際に漏れやすいバリアであり、最後のプロセスがバリアに到達する前にプロセスが通過することがある場合はどうなりますか? プログラムでは、off-by-one エラーは非常に一般的です。あるいは、バリア コー​​ドが 3 年前に作成され、たとえば 2^12==4096 プロセスの到着を記録するのに十分なメモリしかなく、2^18 プロセッサを搭載した真新しいマシンにそれを配置したとします。バリアはダムというより堰のようなものです。

私は今までこれについて深く考えたことがありませんでした.私が使用した MPI 実装のいずれかが障害のあるバリアを持っていると疑ったことは一度もありません. 並列デバッガーを使用して、バリアを介したプログラムの実行を調べたいと思いますが、正しい動作を保証するものではありません。

しかし、それは興味深い質問です。

于 2010-01-14T16:06:39.107 に答える
0

#include <mpi.h>

int main (int argc , char *argv[])
{
  int rank;

  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */

  sleep(5*rank); // make sure each process waits for different amount of time
  std::cout << "Synchronization point for:" << rank << std::endl ;
  MPI_Barrier(MPI_COMM_WORLD) ;
  std::cout << "After Synchronization, id:" << rank << std::endl ;

  MPI_Finalize();
  return 0;
}
于 2010-01-14T07:25:13.080 に答える
0

Allen Downey は著書The Little Book of Semaphores で次のように述べています (彼が提示する再利用可能なバリア アルゴリズムについて):

残念ながら、この解決策は重要な同期コードの典型です。解決策が正しいことを確認するのは困難です。多くの場合、プログラム内の特定のパスがエラーを引き起こす微妙な方法があります。

さらに悪いことに、ソリューションの実装をテストしてもあまり役に立ちません。エラーが発生する特定のパスでは、非常に不運な状況の組み合わせが必要になる可能性があるため、エラーが発生することはめったにありません。このようなエラーは、従来の手段で再現してデバッグすることはほとんど不可能です。

唯一の代替手段は、コードを注意深く調べて、それが正しいことを「証明」することです。私が「証明」を引用符で囲んだのは、必ずしも正式な証明を書かなければならないという意味ではないからです (そのような狂気を助長する熱狂者はいますが)。

于 2011-06-09T10:00:34.060 に答える