プロセスが出力を報告する準備ができている順序は、基本的に、事前に知ることはできません。まったく同じ MPI プログラムを繰り返し実行しても、出力の順序に違いが見られます。そのため、どこかで、ファイルへの書き込みに順序を課す必要があります。
Wesley がすでに述べた非常に一般的なパターンは、すべてのプロセスが出力を 1 つのプロセス (多くの場合プロセス 0) に送信し、ファイルへの書き込みを処理させることです。このマスターライターは書き込み前に出力を並べ替えることができますが、これにはいくつかの問題が生じます。出力を書き込む前に出力を格納するためのスペースを割り当てることと、出力レコードのコレクションをいつ並べ替えてファイルに書き込むことができるかを判断することと、より扱いが難しいことです。出力バッファは再利用されます。マスターライターはどのくらい待機し、プロセスがまだ機能しているかどうかをどのように認識しますか?
そのため、マスターライターが出力を取得したときに出力を書き込み、並列プログラムが終了した後に別のプログラムが必要に応じて出力ファイルを並べ替えるのが一般的です。これを次のステップとして並列プログラムに追加することも、完全に別のプログラム ( Linux マシンmpi_finalize
など) を使用することもできます。sort
もちろん、これが機能するためには、各出力レコードに並べ替えの対象となるシーケンス情報が含まれている必要があります。
もう 1 つの一般的なパターンは、書き込みを行うプロセスを 1 つだけ持つことです。つまり、他のプロセスはまったく出力を行いません。これにより、書き込みの順序付けの非決定性が完全に回避されます。
別のパターンは、一部は実装がより困難であり、一部は常に利用できるとは限らない基礎となるメカニズムに依存するため、あまり一般的ではありませんが、 を使用することmpi io
です。複数のプロセスを使用mpi io
すると、ファイルのさまざまな部分に同時に書き込むことができます。実際に同時に書き込むには、並列 I/O をサポートするハードウェア、ネットワーク、およびオペレーティング システム上でプログラムを実行する必要があります。適切なプラットフォームを使用しても、特にプロセスからの出力量が不明な場合は、これを実装するのが難しい場合があります。
ここでの私の経験では、あなたのような質問をしている人々は、必要なハードウェアにアクセスできたとしても、並列 I/O に取り組むには MPI 経験の初期段階にある可能性があります。