3

並列化されたルーチンdoMCの並列バックエンドとして Rのパッケージを使い始めました。plyr

並列化自体は正常に機能しているように見えますが (スピードアップのベンチマークはまだ行っていません)、私の問題は、ロギングが非同期になり、異なるコアからのメッセージが混ざり合っていることです。コアごとに異なるログファイルを作成することもできますが、コアごとに異なるラベルを追加するだけでより適切な解決策になると思います。現在log4r、ログのニーズに合わせてパッケージを使用しています。

MPI を使用しているときに、各プロセッサがランクを取得したことを覚えています。これは、各プロセスを互いに区別する方法でした。これを行う方法はありdoMCますか? 私は PID を抽出するという考えを持っていましたが、これは面倒に見え、反復ごとに変化します。

私はアイデアを受け入れますので、どんな提案も大歓迎です。

編集 (2011-04-08):log() 1 つの回答の提案に従いますが、正しいファイルに書き込むために呼び出しごとに個別のクロージャーが必要になるため、現在どのサブプロセスにいるのかを正しく識別するという問題がまだ残っています。 、または単一のlog()関数を持ちますが、追加するログファイルを決定するロジックが内部にあります。どちらの場合でも、現在のサブプロセスにラベルを付ける何らかの方法が必要ですが、これを行う方法がわかりません。

mpi_rank()MPI ライブラリに関数に相当するものはありますか?

4

1 に答える 1

4

複数のプロセスが同じファイルに書き込むことは災害のレシピだと思います(ただし、これは単なるログなので、「災害」は少し強いかもしれません)。

多くの場合、私は染色体上で作業を並列化します。これが私がすることの例です (私は主に foreach/doMC を使用しています):

foreach(chr=chromosomes, ...) %dopar% {
  cat("+++", chr, "+++\n")
  ## ... some undoubtedly amazing code would then follow ...
}

そして、お互いを踏みにじる出力を得ることは珍しいことではありません... (正確ではありませんが)次のようなものです:

+++chr1+++
+++chr2+++
++++chr3++chr4+++

...あなたはアイデアを得る...

私があなたの立場だったら、プロセスごとにログを分割し、それぞれのファイル名を、そのプロセスのループで起こっていることに関して一意になるように設定すると思います (chr上記の私の場合のように)。必要に応じて後で照合します...つまり。ログファイルをマップ/削減します:-)

于 2011-03-29T13:13:42.253 に答える