質問
クラスターの各マシンで独立して集団通信を簡単に実行したいと考えています。それぞれ 8 コアを備えた 4 台のマシンがあるとします。私の mpi プログラムは 32 個の MPI タスクを実行します。私が望むのは、特定の関数について次のとおりです。
- 各ホスト上で 1 つのタスクのみが計算を実行し、他のタスクはこの計算中に何も実行しません。この例では、4 つの MPI タスクが計算を実行し、他の 28 のタスクが待機しています。
- 計算が完了すると、それぞれの MPI タスクはローカル タスク (同じホスト上で実行されているタスク) に対してのみ集合通信を実行します。
概念的には、ホストごとに 1 つのコミュニケータを作成する必要があることを理解しています。調べてみましたが、明示的にそれを行うものは見つかりませんでした。私は MPI グループやコミュニケーターにあまり慣れていません。ここで私の 2 つの質問があります。
- MPI_Get_processor_name はそのような動作にとって十分に一意なものですか?
- もっと一般的に言えば、それを行うコードはありますか?
解決
仕様が言うことMPI_Get_processor_name
戻り、私はあなたがそれで大丈夫と思うので、「ノード(仮想ではなく)実際の一意の指定」。私はあなたがすべてのホスト名を組み立てるために、その後、プロセッサの割り当てグループがオフに行くと彼らのコミュニケーターを作るために集まるんだろうと思います。またはDUP MPI_COMM_WORLD、整数ハッシュに名前を入れて、セットを分割するmpi_comm_splitを使用します。
また、そのMPIの実装が割り当てるタスクを確実にするためのmpirunするアプローチjannebを提案し、使用の実装固有のオプションを取ることができるそのように。 OpenMPIのは、この順序付けを生成する--byslot使用しています。 MPICH2であなたは、マッピングを参照してください-print-ランクマップを使用することができます。
しかし、これはあなたが何をしたいのか本当に? 1つのプロセッサが働いている間に、他のプロセスがアイドル状態に座っている場合は、どのようにこれは誰もが重複して計算を行うよりも良いですか? (または、この非常にメモリやI / O集中型で、あなたは競合を心配している?)あなたはこのをたくさんやっているつもりなら - オフノード並列化とは非常に異なっ上のノード並列化を処理する - その後、あなたは、ハイブリッドプログラミングモデルについて考えてよいでしょう - HPMによって提案さの両方として、1つのノードあたりのMPIタスクとMPI_spawningのサブタスクを実行しているかのノードの通信にOpenMPのを使用して
。他のヒント
私はあなたがあなたのMPIプログラム内から完全にやりたいことができるでしょうことを(教育を考え、決定的ではない)とは思わない。
MPI_Get_processor_name
へのコールに対するシステムの応答はシステム依存です。お使いのシステムには、必要に応じてnode00
、node01
、node02
、node03
を返すことがあります、またはそれはあなたが実際に実行されているものは何でもプロセッサのためのmy_big_computer
を返すことがあります。前者は可能性が高いですが、それは保証されません。
は、32個のプロセスを開始すると、あなたはそれぞれが上で実行されているノードかを判断できる場合は、4つのグループにあなたのコミュニケータを分割、各ノード上のものであろう。あなたが望むようあなたが間および内コミュニケーションを自分で管理することができますこの方法です。
別の戦略は、4つのプロセスを起動し、別のノードにそれらを固定することであろう。あなたは、ノード(またはプロセッサ)へのプロセスをピンどのようなGrid Engineのように、あなたのMPIランタイムとあなたが持つかもしれない任意のジョブ管理システムに依存します。これはおそらく、環境変数を設定する伴うだろう - しかし、我々は、彼らが何であるかを推測することはできませんので、あなたは私達にあなたのランタイムシステムについては何も教えていません。その後、4つのプロセスの各々を動的さらに7(又は8)プロセスを起動し、初期のプロセスと同じノードにそれらを固定有することができます。これを行うには、intercommunicatorsのトピックとあなたのランタイムシステムのマニュアルをよく読んでます。
第三の戦略は、今では少しクレイジーなってきた、4つの別々のMPIプログラム(8つのプロセス毎)、クラスタの各ノードの1を開始する、と彼らは実行するとそれらを結合することです。詳細については、MPI_Comm_connect
とMPI_Open_port
についての記事を読むます。
最後に、余分な楽しみのために、各ノードで1つのMPIプロセスを実行している、あなたのプログラムをハイブリダイズを検討し、必要がある場合がありますそれらのプロセスのそれぞれは、OpenMP共有メモリ(サブ)プログラムを実行します。
通常、MPI ランタイム環境は制御できます。環境変数によってタスクがノードにどのように分散されるか。デフォルトは順次割り当てになる傾向があります。つまり、32 個のタスクが 4 台の 8 コア マシンに分散される例では、
- マシン 1:MPI ランク 0 ~ 7
- マシン 2:MPI ランク 8 ~ 15
- マシン 3:MPI ランク 16 ~ 23
- マシン 4:MPI ランク 24 ~ 31
はい、MPI_Get_processor_name はホスト名を取得するので、ホスト間の境界がどこにあるのかを把握できます。