3

私はプロセッサーを持っています (これは一例です)。これらのプロセッサーにファイルに書き込みをさ2せたいと思っています。2私は彼らにファイルの最後に書いてもらいたいのですが、そのような混合パターンではありません:

[file content]
proc0
proc1
proc0
proc1
proc0
proc1
(and so on..)

私は彼らにこの種のパターンに従って書いてもらいたい:

[file content]
proc0
proc0
proc0
proc1
proc1
proc1
(and so on..)

出来ますか?もしそうなら、使用する設定は何ですか?

4

3 に答える 3

5

プロセスが出力を報告する準備ができている順序は、基本的に、事前に知ることはできません。まったく同じ MPI プログラムを繰り返し実行しても、出力の順序に違いが見られます。そのため、どこかで、ファイルへの書き込みに順序を課す必要があります。

Wesley がすでに述べた非常に一般的なパターンは、すべてのプロセスが出力を 1 つのプロセス (多くの場合プロセス 0) に送信し、ファイルへの書き込みを処理させることです。このマスターライターは書き込み前に出力を並べ替えることができますが、これにはいくつかの問題が生じます。出力を書き込む前に出力を格納するためのスペースを割り当てることと、出力レコードのコレクションをいつ並べ替えてファイルに書き込むことができるかを判断することと、より扱いが難しいことです。出力バッファは再利用されます。マスターライターはどのくらい待機し、プロセスがまだ機能しているかどうかをどのように認識しますか?

そのため、マスターライターが出力を取得したときに出力を書き込み、並列プログラムが終了した後に別のプログラムが必要に応じて出力ファイルを並べ替えるのが一般的です。これを次のステップとして並列プログラムに追加することも、完全に別のプログラム ( Linux マシンmpi_finalizeなど) を使用することもできます。sortもちろん、これが機能するためには、各出力レコードに並べ替えの対象となるシーケンス情報が含まれている必要があります。

もう 1 つの一般的なパターンは、書き込みを行うプロセスを 1 つだけ持つことです。つまり、他のプロセスはまったく出力を行いません。これにより、書き込みの順序付けの非決定性が完全に回避されます。

別のパターンは、一部は実装がより困難であり、一部は常に利用できるとは限らない基礎となるメカニズムに依存するため、あまり一般的ではありませんが、 を使用することmpi ioです。複数のプロセスを使用mpi ioすると、ファイルのさまざまな部分に同時に書き込むことができます。実際に同時に書き込むには、並列 I/O をサポートするハードウェア、ネットワーク、およびオペレーティング システム上でプログラムを実行する必要があります。適切なプラットフォームを使用しても、特にプロセスからの出力量が不明な場合は、これを実装するのが難しい場合があります。

ここでの私の経験では、あなたのような質問をしている人々は、必要なハードウェアにアクセスできたとしても、並列 I/O に取り組むには MPI 経験の初期段階にある可能性があります。

于 2014-10-01T16:27:25.407 に答える
3

私はハイパフォーマンスマークに同意しません。MPI-IO は 2014 年にはそれほどトリッキーではありません (NFS 以外のファイル システムにアクセスできる限り、安価で簡単な並列ファイル システムが必要な場合は PVFS をインストールしてください)。

各プロセスのデータ量がわかっている場合は、MPI_SCAN を使用して「以前の」プロセスによって書き込まれたデータ量を効率的に計算し、MPI_FILE_WRITE_AT_ALL を使用して I/O を効率的に実行できます。これを行う方法の 1 つを次に示します。

incr = (count*datatype_size);
MPI_Scan(&incr, &new_offset, 1, MPI_LONG_LONG_INT, 
                      MPI_SUM, MPI_COMM_WORLD);
MPI_File_write_at_all(mpi_fh, new_offset, buf, count,
                              datatype, status)
于 2014-10-02T02:42:47.957 に答える
1

あなたの質問に対する答えはノーです。そのようにすると、あちこちからごちゃごちゃした出力になってしまいます。

ただし、出力を単一のプロセッサに送信して、書き込み自体をすべて実行させることで、同じことを得ることができます。たとえば、アプリケーションの最後に、すべてをランク 0 に送信し、ランク 0 にすべてをファイルに書き込むようにします。

于 2014-10-01T16:06:29.910 に答える