1

Rmpi (v. 0.6-2) パッケージを使用して、R (v. 2.15) コードを並列化しています。私は次のコードの平和を持っています:

library(Rmpi)
source("slaveFunction04.r")
mpi.spawn.Rslaves(nslaves=2)
mpi.bcast.Robj2slave(slaveFunction04)
mpi.remote.exec(slaveFunction04())
mpi.close.Rslaves()
mpi.quit()

スレーブが slaveFunction04 を実行している間、マスター プロセスはアイドル状態になり、リソースをほとんど消費しないことが予想されます。これは、C または Fortran で MPI を使用する場合に発生します。しかし代わりに、マスターはスレーブと同じように CPU を 100% 消費します (各プロセスは独自のコアで実行されます)。

なぜこれが起こるのか、どうすれば解決できますか?

MPI については、OpenSuse 12.3 で OpenMPI v. 1.6-3.1.2 を使用しています。

前もって感謝します。

4

1 に答える 1

5

これは珍しいことではありません。実際、C や Fortran と同様に、マスター/スレーブの分解で見られると予想されることとほとんど同じです。

MPI は高性能並列コンピューティング用に設計されており、通常、タスクがメッセージを待ってブロックされている場合、そのメッセージをできるだけ早く取得することほど重要なことはないため、実装は「ビジー待機」し、繰り返しポーリングして確認しますメッセージが到着した場合、CPU を拘束します。これにより CPU 時間が消費されますが、仮説によると、他に何もする必要がなく、メッセージ到着したときの待ち時間がマイクロ秒短縮されます。通常、ほとんどの MPI 実装では、この操作モードがデフォルトです。これは OpenMPI では「アグレッシブ」モードと呼ばれ、ここで説明されています。

これは、多くの問題に対して非常に賢明なデフォルトの動作ですが、常に希望どおりになるとは限らないため、これをオフにする方法があります。OMPI_MCA_mpi_yield_when_idleこれが原因である場合は、環境変数を 1 (またはゼロ以外) に設定してアグレッシブ モードを終了することにより、マスターの CPU 負荷をいくらか軽減できるはずです。

于 2013-03-15T21:12:31.347 に答える