MPI-2 (私の記憶が正しければ) は、動的プロセス管理のメカニズムを導入しましmpi_comm_spawn
た。したがって、マスター タスクを実行する 1 つのプロセスとワーカー タスクを実行する複数のプロセスを交互に実行する MPI プログラムを作成することは確かに可能です (スレーブという用語は非推奨です)。1 つのプログラムがマスター タスクを実行し、別のプログラムが (複数の) ワーカー タスクを実行するように計算を設計し、2 つの間でメッセージを渡すために MPI を使用することも可能です。
しかし (これは大きな問題ですが) 多くのリソース マネージャー (並列コンピューター システムを管理する人間、またはジョブ マネージャーなどのオペレーティング システムとシステム ソフトウェア) がそのような動的プロセス管理をサポートしているとは思いません。提案する基本設計を使用して 2 つ以上のプログラムをスケジュールし、管理する複雑さを想像してみてください。プログラム A が 2^10 のワーカー プロセスを起動しようとするのと同じように、プログラム B とプログラム C も起動しようとしますが、プログラム D は 2^8 のワーカー プロセスを削除しようとします。これはすべて、2^10 個のプロセッサ (またはコア) のみを備えたクラスターで行われます。複数のジョブが不足しているリソースをめぐって競合するため、クラスター上のジョブのスループットがゼロに向かって低下するシナリオを構築することは、おそらくそれほど難しくありません。
お使いのプラットフォームが動的プロセス管理をサポートしている場合は、すぐに進んでください。プラットフォームにない可能性が高い場合、少なくとも 2 つの選択肢があります。どちらを選択するかは、マスターとワーカーの時間の比率と、おそらく他の要因にも依存します。あなたは出来る:
- 私たちのほとんどが常に行ってきたことを実行し、ジョブ全体のプロセッサの総数を要求し、マスターのみのフェーズでは 1 つを除いてすべてをアイドル状態のままにします。無駄かもしれませんが、リソース管理者が対処するのは簡単です。プログラミングも比較的簡単。
- マスターがワーカー フェーズ間で多くの作業を行う場合、マスターとワーカーが別のプログラムになるようにプログラムを変更できます。最初にマスターに 1 つのプロセスを実行させ、それが終了したら、ジョブ管理システムに要求を送信して、ワーカー計算の第 1 フェーズを開始します。次に、次のマスター フェーズの実行を開始します。