2

クラスターの各マシンで個別に集合通信を簡単に実行したい。それぞれに8コアのマシンが4台あるとすると、MPIプログラムは32個のMPIタスクを実行します。私が欲しいのは、与えられた関数についてです:

  • 各ホストでは、1つのタスクのみが計算を実行し、他のタスクはこの計算中に何も実行しません。私の例では、4つのMPIタスクが計算を行い、他の28のタスクが待機しています。
  • 計算が完了すると、それぞれの各MPIタスクは、ローカルタスク(同じホストで実行されているタスク)に対してのみ集合通信を実行します。

概念的には、ホストごとに1つのコミュニケーターを作成する必要があることを理解しています。私は周りを検索しましたが、それを明示的に行っているものは何も見つかりませんでした。私はMPIグループやコミュニケーターにあまり慣れていません。ここに私の2つの質問があります:

  • MPI_Get_processor_nameそのような振る舞いには十分にユニークですか?
  • より一般的には、それを行うコードがありますか?
4

3 に答える 3

6

仕様では、MPI_Get_processor_name「実際の(仮想ではなく)ノードの一意の指定子」が返されると書かれているので、それで問題ないと思います。ギャザーを作成してすべてのホスト名を組み立ててから、プロセッサーのグループを割り当ててコミュニケーターを作成すると思います。またはdupMPI_COMM_WORLDで、名前を整数ハッシュに変換し、mpi_comm_splitを使用してセットを分割します。

また、jannebが提案するアプローチを採用し、mpirunに実装固有のオプションを使用して、MPI実装がタスクをそのように割り当てるようにすることもできます。OpenMPIは--byslotを使用してこの順序を生成します。mpich2では、-print-rank-mapを使用してマッピングを確認できます。

しかし、これは本当にあなたがやりたいことですか?1つのプロセッサが動作しているときに他のプロセスがアイドル状態になっている場合、誰もが冗長に計算を行うよりも、これはどのように優れていますか?(または、これは非常にメモリまたはI / Oを集中的に使用し、競合について心配していますか?)これを多く行う場合(オンノードの並列化をオフノードの並列化とは大きく異なる方法で処理する)、 HPMによって提案されているように、ハイブリッドプログラミングモデルについて考えることができます。ノードごとに1つのMPIタスクとMPI_spawningサブタスクを実行するか、オンノード通信にOpenMPを使用します。

于 2010-10-28T12:17:08.487 に答える
2

MPIプログラム内から完全にやりたいことができるとは思いません(知識に基づいた考えであり、決定的なものではありません)。

呼び出しに対するシステムの応答は、システムにMPI_Get_processor_name依存します。システムでは、必要に応じて、、、を返すnode00場合もあれば、実際に実行しているプロセッサに対して返す場合もあります。前者の可能性が高いですが、保証されていません。node01node02node03my_big_computer

1つの戦略は、32のプロセスを開始し、それぞれが実行されているノードを判別できる場合は、コミュニケーターを各ノードに1つずつ、合計4つのグループに分割することです。このようにして、必要に応じて相互通信と内部通信を自分で管理できます。

もう1つの戦略は、4つのプロセスを開始し、それらを異なるノードに固定することです。プロセスをノード(またはプロセッサ)に固定する方法は、MPIランタイムと、GridEngineなどのジョブ管理システムによって異なります。これにはおそらく環境変数の設定が含まれますが、ランタイムシステムについては何も教えてくれないので、それらが何であるかを推測することはできません。次に、4つのプロセスのそれぞれにさらに7つ(または8つ)のプロセスを動的に生成させ、それらを最初のプロセスと同じノードに固定することができます。これを行うには、インターコミュニケータのトピックとランタイムシステムのドキュメントを読んでください。

3番目の戦略は、少しおかしくなりつつありますが、クラスターの各ノードに1つずつ、合計4つの個別のMPIプログラム(それぞれ8つのプロセス)を開始し、実行時にそれらに参加することです。詳細についてはMPI_Comm_connectMPI_Open_portをお読みください。

最後に、さらに楽しくするために、プログラムをハイブリッド化し、各ノードで1つのMPIプロセスを実行し、それらの各プロセスにOpenMP共有メモリ(サブ)プログラムを実行させることを検討してください。

于 2010-10-28T11:04:08.897 に答える
1

通常、MPIランタイム環境は、タスクがノードにどのように分散されるかなどの環境変数によって制御できます。デフォルトは順次割り当てになる傾向があります。つまり、たとえば、32台のタスクが4台の8コアマシンに分散されている場合です。

  • マシン1:MPIランク0〜7
  • マシン2:MPIランク8〜15
  • マシン3:MPIランク16〜23
  • マシン4:MPIランク24〜31

はい、MPI_Get_processor_nameでホスト名を取得して、ホスト間の境界がどこにあるかを把握できるようにする必要があります。

于 2010-10-28T10:54:31.220 に答える