次の方法で共有


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] 要素の受信バッファーに配置されます。

    recvbufrecvcountsdispls パラメーター配列では、各配列の 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

注釈

すべての関数パラメーターはルート プロセスで重要であり、sendbufsendcount、sendtyperootおよび 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

こちらもご覧ください

MPI 集合関数

MPI_Datatype

MPI_Gather