MPI_Gatherv関数
グループのすべてのメンバーから 1 つのメンバーに変数データを収集します。 MPI_Gatherv関数は、各プロセスからのデータの数を変えることで、MPI_Gather関数に柔軟性を追加します。
構文
int MPIAPI MPI_Gatherv(
_In_ void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
_Out_opt_ void *recvbuf,
_In_opt_ int *recvcounts[],
_In_opt_ int *displs[],
MPI_Datatype recvtype,
int root,
MPI_Comm comm
);
パラメーター
sendbuf [in]
ルート プロセスに送信されるデータを含むバッファーへのハンドル。comm パラメーターがコマンド内を参照している場合は、すべてのプロセスで MPI_IN_PLACEを指定することでインプレース オプションを指定できます。 sendcount パラメーターと sendtype パラメーターは無視されます。 各プロセスは、対応する受信バッファー要素にデータを入力します。 n番目のプロセスは、受信バッファーの n番目の要素にデータを送信します。 ルート プロセスによって送信されるデータは、受信バッファー内の正しい場所にあると見なされます。
sendcount
送信バッファー内の要素の数。 sendcount が 0 の場合、メッセージのデータ部分は空です。sendtype
バッファー内の各要素のデータ型。recvbuf [out, optional]
ルート プロセスによって送信されるデータを含む、各プロセスから受信したデータを含むルート プロセス上のバッファーへのハンドル。 このパラメーターは、ルート プロセスでのみ重要です。 recvbuf パラメーターは、ルート以外のすべてのプロセスでは無視されます。recvcounts[] [in, optional]
各プロセスから受け取る要素の数。 配列内の各要素は、送信プロセスのランクに対応します。 カウントが 0 の場合、メッセージのデータ部分は空です。 このパラメーターは、ルート プロセスでのみ重要です。displs[] [in, optional]
各コミュニケーター プロセスからのデータの recvbuf パラメーターに対する相対位置。 プロセス j から受信したデータは、sendbuf ポインターからルート プロセス オフセット displs[j] 要素の受信バッファーに配置されます。recvbuf、recvcounts、displs パラメーター配列では、各配列の n番目の要素は、n番目のコミュニケーター プロセスから受信したデータを参照します。
このパラメーターは、ルート プロセスでのみ重要です。
recvtype
バッファー内の各要素のデータ型。 このパラメーターは、ルート プロセスでのみ重要です。root
指定したコミュニケーター内の受信プロセスのランク。comm
MPI_Comm コミュニケーター ハンドル。
戻り値
成功 したMPI_SUCCESS を返します。 それ以外の場合、戻り値はエラー コードです。
Fortran では、戻り値は IERROR パラメーターに格納されます。
Fortran
MPI_GATHERV(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNTS, DISPLS, RECVTYPE, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNTS(*), DISPLS(*), RECVTYPE, ROOT, COMM, IERROR
注釈
すべての関数パラメーターはルート プロセスで重要であり、sendbuf、sendcount、sendtype、root、および comm のみが他のプロセスで重要です。 ルート パラメーターと comm パラメーターは、すべてのプロセスで同じである必要があります。
一般に、 sendtype パラメーターと recvtype パラメーターの両方に対して派生データ型を使用できます。 各プロセスの sendtype パラメーターと recvtype パラメーターで指定される型シグネチャは、ルート プロセスの recvcount パラメーターと sendcount パラメーターの型シグネチャと等しい必要があります。 送信されるデータの量は、ルート プロセスと個々のプロセスの間で受信されるデータの量と同じである必要があります。 送信者と受信側の間の個別の型マップは引き続き許可されます。
カウントと型を指定しても、ルート上の場所が複数回書き込まれないようにする必要があります。 このような呼び出しは間違っています。
comm パラメーターがコマンド内を参照している場合、すべてのプロセスは、その送信バッファーの内容をルート プロセスに送信します。 ルート プロセスはメッセージを受信し、ランク順に格納します。 結果は、 の呼び出しが実行されるグループ内の n 個のプロセスのそれぞれと、ルートが に対して n 回の呼び出MPI_Send(sendbuf, sendcount, sendtype, root, …)
しをMPI_Recv(recvbuf + i*recvcount*extent(recvtype), recvcount, recvtype, i, …)
実行したかのように見えます。 の extent(recvtype)
値は、 MPI_Type_get_extent 関数を使用して取得されます。 関数の別の説明として、グループ内のプロセスによって送信される n 個のメッセージがランク順に連結され、 の呼び出し MPI_RECV(recvbuf, recvcountn, recvtype, ...)
の場合と同様に、結果のメッセージがルートによって受信されます。 ルート以外のすべてのプロセスでは、受信バッファーは無視されます。
comm パラメーターがインターコミュニケーターを参照している場合、呼び出しには、ルート プロセスを定義する 1 つのグループ A を使用して、インターコミュニケーター内のすべてのプロセスが含まれます。 他のグループ (グループ B) 内のすべてのプロセスは、ルート パラメーターに同じ値を設定します。つまり、グループ A のルート プロセスのランクを設定します。ルート プロセスは、ルート パラメーターにMPI_ROOT値を設定します。 グループ A 内の他のすべてのプロセスは、ルート パラメーターにMPI_PROC_NULL値を設定します。 データは、ルート プロセスからグループ B 内のすべてのプロセスにブロードキャストされます。グループ B のプロセスの バッファー パラメーターは、ルート プロセスの buffer パラメーターと一致している必要があります。
要件
製品 |
HPC Pack 2012 MS-MPI 再頒布可能パッケージ、HPC Pack 2008 R2 MS-MPI 再頒布可能パッケージ、HPC Pack 2008 MS-MPI 再頒布可能パッケージまたは HPC Pack 2008 クライアント ユーティリティ |
ヘッダー |
Mpi.h;Mpif.h |
ライブラリ |
Msmpi.lib |
[DLL] |
Msmpi.dll |