MPI と Fortran を使用して、同じノードにあるプロセスをグループに分離する実装を作成しようとしています。MPI にはそれを識別できるルーチンがありますか?
これらのプロセスを、使用しているマシンのノードで同じホスト名で区切るという考えがありました。しかし、それがすべてのクラスターに一般的かどうかはわかりません。
MPI と Fortran を使用して、同じノードにあるプロセスをグループに分離する実装を作成しようとしています。MPI にはそれを識別できるルーチンがありますか?
これらのプロセスを、使用しているマシンのノードで同じホスト名で区切るという考えがありました。しかし、それがすべてのクラスターに一般的かどうかはわかりません。
おそらく MPI_COMM_SPLIT_TYPE を確認したいと思うでしょう。split_type
パラメータとして渡す に基づいて、既存のコミュニケータを分割できます。
int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key,
MPI_Info info, MPI_Comm *newcomm)
現在、唯一の split_type はMPI_COMM_TYPE_SHARED
、標準で次のように定義されています。
このタイプは、コミュニケーターをサブコミュニケーターに分割し、それぞれが共有メモリー領域を作成できます。
これは通常、あなたが求めていることと同じですが、あなたのマシンでそれが真実であることを再確認する必要があります.
もう 1 つ知っておく必要があるのは、これは MPI-3 の新しい関数であるため、MPI のすべての実装で使用できるわけではないということです。私はそれがMPICHで利用可能であり、それが派生物であることを知っています。私の知る限り、 Open MPIの最後のリリースでは利用できません。そのため、MPI を実際にサポートするバージョンの MPI があることを確認してください。
環境が MPI 3.0 を提供しないシステムに対して同様の分割機能を実装しましたが、複数のクラスターで非常にうまく機能します。これはMPI_GET_PROCESSOR_NAME
、ほとんどのクラスター MPI 実装が結果としてノードの FQDN を返すという事実を利用し、依存しています。これは、Open MPI および Intel MPI (MPICH に基づいているため、他の MPICH 派生物でも同様の動作が予想されます) でテストされています。擬似コードでは、次のように機能します。
rank := MPI_COMM_RANK(communicator)
prev_rank := rank - 1; IF (prev_rank < 0) prev_rank := MPI_PROC_NULL
next_rank := rank + 1; IF (next_rank >= num_procs) next_rank := MPI_PROC_NULL
proc_name := MPI_GET_PROCESSOR_NAME
list := MPI_RECV(from prev_rank)
IF (list does not contain proc_name) THEN
list := list + proc_name
END IF
colour := index of proc_name in list
key := rank
MPI_SEND(list to next_rank)
MPI_COMM_SPLIT(communicator, colour, key, newcomm)
このコードは基本的に一意の MPI プロセッサ名 (ホスト名) のリストを作成し、各プロセスはこのリスト内の MPI プロセッサ名の位置を通常の分割関数の色として使用します。アルゴリズムの私の C 実装では、リストは単純な文字列です。つまり、すべての項目を区切り文字として 0 バイトで連結したものです。Fortran では、ホスト名で通常は許可されない任意の記号を使用できます;
。次に、文字列は単純にMPI_CHAR
(C) またはMPI_CHARACTER
(Fortran) の配列として渡されます。