次の方法で共有


MPI_Alltoallw関数

からデータを収集し、グループのすべてのメンバーにデータを分散します。 MPI_Alltoallw関数は、この API で最も一般的な完全なデータ交換形式です。 MPI_Alltoallw では、カウント、変位、データ型を個別に指定できます。

構文

int MPIAPI MPI_Alltoallw(
  _In_  void         *sendbuf,
  _In_  int          *sendcounts[],
  _In_  int          *sdispls[],
  _In_  MPI_Datatype sendtypes[],
  _Out_ void         *recvbuf,
  _In_  int          *recvcounts[],
  _In_  int          *rdispls[],
  _In_  MPI_Datatype recvtypes[],
        MPI_Comm     comm
);

パラメーター

  • sendbuf [in]
    グループ内のすべてのプロセスに送信されるデータへのポインター。 バッファー内の要素の数値とデータ型は、 sendcount パラメーターと sendtype パラメーターで指定されます。 バッファー内の各要素は、グループ内のプロセスに対応します。

    comm パラメーターがコマンド内を参照している場合は、すべてのプロセスで MPI_IN_PLACE を指定することでインプレース オプションを指定できます。 sendcountsdisplssendtype の各パラメーターは無視されます。 各プロセスは、対応する受信バッファー要素にデータを入力します。

    送受信されるデータは、 recvcounts 配列と recvtype パラメーターで指定されたのと同じ型マップを持ち、 rdispls パラメーターで指定された受信バッファーの場所から読み取られる必要があります。

  • sendcounts [in]
    sendbuf パラメーターで指定されたバッファー内でこのプロセスが送信するデータ要素の数。 sendcount の要素が 0 の場合、そのプロセスからのメッセージのデータ部分は空です。

  • sdispls [in]
    各コミュニケーター プロセスのデータの sendbuf パラメーターに対する相対位置 (バイト単位)。

    エントリ j は、プロセス j 宛ての送信データを取得する sendbuf パラメーターに対する相対変位を指定 します

  • sendtypes [in]
    送信バッファー内の各要素のデータ型。 エントリ j は、グループ内のプロセス j に送信されるデータの種類を指定します。

  • recvbuf [out]
    各プロセスから受信したデータを含むバッファーへのポインター。 バッファー内の要素の数値とデータ型は、 recvcount パラメーターと recvtype パラメーターで指定されます。

  • recvcounts [in]
    受信バッファー内の各コミュニケーター プロセスからのデータ要素の数。

  • rdispls [in]
    各コミュニケーター プロセスからのデータの recvbuf パラメーターに対する相対位置 (バイト単位)。 エントリ i は、プロセス i から受信データを配置する recvbuf パラメーターに対する相対変位を指定します。

    recvbufrecvcounts、および rdispls パラメーター配列では、各配列の n番目の要素は、n番目のコミュニケーター プロセスから受信したデータを参照します。

  • recvtypes [in]
    バッファー内の各要素のデータ型。 エントリ i は、プロセス i から受信されるデータの種類 指定します。

  • comm
    MPI_Comm コミュニケーター ハンドル。

戻り値

成功 したMPI_SUCCESS を返します。 それ以外の場合、戻り値はエラー コードです。

Fortran では、戻り値は IERROR パラメーターに格納されます。

Fortran

    MPI_ALLTOALLW(SENDBUF, SENDCOUNT, SDISPLS, SENDTYPE, RECVBUF, RECVCOUNTS, RDISPLS, RECVTYPE,COMM, IERROR)
        <type> SENDBUF(*), R.ECVBUF(*)
        INTEGER SENDCOUNT, SENDTYPES(*), SDISPLS(*), RECVCOUNTS(*), RDISPLS(*), RECVTYPE, COMM, IERROR

注釈

重要

柔軟性を最大限に高めるために、送受信バッファー内のブロックの変位をバイト単位で指定します。 

すべてのパラメーターは、すべてのプロセスで重要です。 comm パラメーターは、すべてのプロセスで同じである必要があります。

comm パラメーターがコマンド内を参照している場合、プロセス i から送信された j番目のブロックはプロセス j によって受信され、受信バッファーの i番目のブロックに配置されます。 これらのブロックはすべて同じサイズである必要はありません。

プロセス isendcounts[j] パラメーターと sendtypes[j] パラメーターで指定される型シグネチャは、プロセス jrecvcounts[i] および recvtypes[i] に関連付けられている型シグネチャと等しい必要があります。 したがって、送信されるデータの量は、プロセスのペア間で受信されるデータの量と同じである必要があります。 送信者と受信側の間の個別の型マップは引き続き許可されます。

MPI_Alltoallw 関数の呼び出しの結果は、各プロセスが を使用MPI_Send(sendbuf+sdispls[i],sendcounts[i],sendtypes[i] ,i,...)して他のすべてのプロセスにメッセージを送信し、 を呼び出MPI_Recv(recvbuf+rdispls[i],recvcounts[i],recvtypes[i] ,i,...)して他のすべてのプロセスからメッセージを受信した場合と同じになります。

インプレース オプションを指定すると、コミュニケーターのグループ内の 2 つのプロセス間で同じ量と種類のデータが送受信されることを示します。 プロセスのペアによって、異なる量のデータを交換できます。 ユーザーは、プロセス irecvcounts[j]recvtype がプロセス jrecvcounts[i]recvtype と一致していることを確認する必要があります。

comm パラメーターが相互通信子を参照している場合、結果はグループ A の各プロセスがグループ B の各プロセスにメッセージを送信するかのように、その逆になります。 グループ A のプロセス ij番目の送信バッファーは、グループ B のプロセス ji番目の受信バッファーと一致している必要があります。その逆も同様です。

要件

製品

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_Alltoallv

MPI_Gather

MPI_Scatter

MPI_Send

MPI_Recv