0

マスターとスレーブの2つのプログラムがあります。私のマスターはデータ分解を行い、スレーブは分解されたデータの部分で計算を行います。MPI scaterv は、作業の分散のために実装されています。最初にマスター プログラムを実行し、次に子プロセスまたはスレーブ プロセスを動的に生成し、スレーブは別のコード (つまり計算) を実行します。ここでも、マスターはスレーブから結果を収集し、次のレベルの分解を実行する必要があります。MPIを使用してそれを行うにはどうすればよいですか? 実際には、マスター コードとスレーブ コードを交互に実行したかったのですが、これをどのように実装できますか?

前もって感謝します..

4

1 に答える 1

0

MPI-2 (私の記憶が正しければ) は、動的プロセス管理のメカニズムを導入しましmpi_comm_spawnた。したがって、マスター タスクを実行する 1 つのプロセスとワーカー タスクを実行する複数のプロセスを交互に実行する MPI プログラムを作成することは確かに可能です (スレーブという用語は非推奨です)。1 つのプログラムがマスター タスクを実行し、別のプログラムが (複数の) ワーカー タスクを実行するように計算を設計し、2 つの間でメッセージを渡すために MPI を使用することも可能です。

しかし (これは大きな問題ですが) 多くのリソース マネージャー (並列コンピューター システムを管理する人間、またはジョブ マネージャーなどのオペレーティング システムとシステム ソフトウェア) がそのような動的プロセス管理をサポートしているとは思いません。提案する基本設計を使用して 2 つ以上のプログラムをスケジュールし、管理する複雑さを想像してみてください。プログラム A が 2^10 のワーカー プロセスを起動しようとするのと同じように、プログラム B とプログラム C も起動しようとしますが、プログラム D は 2^8 のワーカー プロセスを削除しようとします。これはすべて、2^10 個のプロセッサ (またはコア) のみを備えたクラスターで行われます。複数のジョブが不足しているリソースをめぐって競合するため、クラスター上のジョブのスループットがゼロに向かって低下するシナリオを構築することは、おそらくそれほど難しくありません。

お使いのプラットフォームが動的プロセス管理をサポートしている場合は、すぐに進んでください。プラットフォームにない可能性が高い場合、少なくとも 2 つの選択肢があります。どちらを選択するかは、マスターとワーカーの時間の比率と、おそらく他の要因にも依存します。あなたは出来る:

  1. 私たちのほとんどが常に行ってきたことを実行し、ジョブ全体のプロセッサの総数を要求し、マスターのみのフェーズでは 1 つを除いてすべてをアイドル状態のままにします。無駄かもしれませんが、リソース管理者が対処するのは簡単です。プログラミングも比較的簡単。
  2. マスターがワーカー フェーズ間で多くの作業を行う場合、マスターとワーカーが別のプログラムになるようにプログラムを変更できます。最初にマスターに 1 つのプロセスを実行させ、それが終了したら、ジョブ管理システムに要求を送信して、ワーカー計算の第 1 フェーズを開始します。次に、次のマスター フェーズの実行を開始します。
于 2013-10-15T08:11:21.247 に答える