7

最近、複数のプロセス (これらは MPI ベースの並列計算の一部) に分散されたデータを同じファイルに書き込むための、十分にテストされていないレガシー コードに出くわしました。これは実際に動作することが保証されていますか?

こんなふうになります:

  • すべてのプロセスが書き込み用に同じファイルを開きます。

  • 各プロセスはfseek、ファイル内の異なる場所をシークするために呼び出します。この位置は、ファイルの末尾を超えている可能性があります。

  • 次に、各プロセスは、データのブロックをファイルに書き込みますfwrite。シーク位置とブロック サイズは、これらの書き込みがファイルのセクションを完全にタイル化するようなものです (ギャップやオーバーラップはありません)。

これは動作することが保証されていますか、それとも時々ひどく失敗しますか? 書き込みをシリアル化するためのロックはなく、実際には同期ポイントから開始される可能性があります。一方、複数のプロセスから「ファイルの最後」に書き込もうとして問題があった他の質問とは異なり、それらが異なるファイル位置に書き込んでいることを保証できます。

プロセスは、NFS 経由でファイルをマウントする別のマシン上にある可能性があると思います。これはおそらく私の質問に答えると思いますが、ファイルがローカルの場合は機能しますか?

4

1 に答える 1

4

これは通常うまくいくと思いますが、私が見つけられるという保証はありません。fwrite(3) の Posix 仕様は ISO C に従っており、どちらの標準も並行性について言及していません。

したがって、通常は機能すると思いますが、fseek(3) と fwrite(3) はバッファリングされた I/O 関数であるため、成功はライブラリ実装の内部の詳細に依存します。したがって、絶対に保証するものではありませんが、動作することを期待するさまざまな理由があります.

さて、プログラムが lseek(2) と write(2) を使用する場合、結果が保証されていると考えることができると思いますが、現在は Posix オペレーティング システムに制限されています。

1 つのことは...奇妙に思えます...なぜMPI プログラムはメッセージ API ではなくNFS経由でデータを共有することを決定するのでしょうか? 動作が遅く、移植性が低く、トラブルが発生しやすく、一般的に MPI 機能セットの無駄遣いにすぎないように思われます。単一の NFS サーバーに依存していることを考えると、分散型ではありません。

于 2012-05-12T18:41:41.840 に答える