MPI_Alltoallv関数
からデータを収集し、グループのすべてのメンバーにデータを分散します。 MPI_Alltoallv関数は、各プロセスからのデータの数を変えることで、MPI_Alltoall関数に柔軟性を追加します。
構文
int MPIAPI MPI_Alltoallv(
_In_ void *sendbuf,
_In_ int *sendcounts,
_In_ int *sdispls,
MPI_Datatype sendtype,
_Out_ void *recvbuf,
_In_ int *recvcounts,
_In_ int *rdispls,
MPI_Datatype recvtype,
MPI_Comm comm
);
パラメーター
sendbuf [in]
グループ内のすべてのプロセスに送信されるデータへのポインター。 バッファー内の要素の数値とデータ型は、 sendcount パラメーターと sendtype パラメーターで指定されます。 バッファー内の各要素は、グループ内のプロセスに対応します。comm パラメーターがコマンド内を参照している場合は、すべてのプロセスで MPI_IN_PLACE を指定することでインプレース オプションを指定できます。 sendcount、sdispls、sendtype の各パラメーターは無視されます。 各プロセスは、対応する受信バッファー要素にデータを入力します。
送受信されるデータは、 recvcounts 配列と recvtype パラメーターで指定された型マップと同じである必要があります。 データは、 rdispls パラメーターで指定された受信バッファーの場所から読み取られます。
sendcounts [in]
sendbuf パラメーターで指定されたバッファー内でこのプロセスが送信するデータ要素の数。 sendcount の要素が 0 の場合、そのプロセスからのメッセージのデータ部分は空です。sdispls [in]
各コミュニケーター プロセスのデータの sendbuf パラメーターに対する相対位置。エントリ j は、プロセス j 宛ての送信データを取得する sendbuf パラメーターを基準とした変位を指定 します。
sendtype
送信バッファー内の要素の MPI データ型。recvbuf [out]
各プロセスから受信したデータを含むバッファーへのポインター。 バッファー内の要素の数値とデータ型は、 recvcount パラメーターと recvtype パラメーターで指定されます。recvcounts [in]
受信バッファー内の各コミュニケーター プロセスからのデータ要素の数。rdispls [in]
各コミュニケーター プロセスからのデータの recvbuf パラメーターに対する相対位置。recvbuf、recvcounts、および rdispls パラメーター配列では、各配列の n番目の要素は、n番目のコミュニケーター プロセスから受信したデータを参照します。
recvtype
バッファー内の各要素の MPI データ型。comm
コミュニケーター ハンドル MPI_Comm 指定します。
戻り値
成功 したMPI_SUCCESS を返します。 それ以外の場合、戻り値はエラー コードです。
Fortran では、戻り値は IERROR パラメーターに格納されます。
Fortran
MPI_ALLTOALL(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE,
COMM, IERROR)
<type> SENDBUF(*), R.ECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, COMM, IERROR
注釈
sendcount で指定される型シグネチャ、およびプロセスの sendtype パラメーターは、recvcount で指定された型シグネチャと、受信プロセスの recvtype パラメーターと等しい必要があります。 したがって、送信されるデータの量は、プロセスのペア間で受信されるデータの量と等しい必要があります。 送信者と受信側の間の個別の型マップは引き続き許可されます。
すべてのパラメーターは、すべてのプロセスで重要です。 comm パラメーターは、すべてのプロセスで同一である必要があります。
comm パラメーターがコマンド内を参照している場合、プロセス i から送信される j番目のブロックはプロセス j によって受信され、受信バッファーの i番目のブロックに配置されます。 これらのブロックは、すべて同じサイズである必要はありません。
MPI_Alltoallv関数を呼び出した結果は、各プロセスが、 を使用して他のすべてのプロセスにメッセージを送信し、 MPI_Send(sendbuf + sdispls[i]*extent(sendtype), sendcounts[i], sendtype, I, …)
を呼び出して他のすべてのプロセスからメッセージを受信した場合と同様ですMPI_Recv(recvbuf + rdispls[i]*extent(recvtype), recvcounts[i], recvtype, I, …)
。
インプレース オプションを指定すると、コミュニケーターのグループ内の任意の 2 つのプロセス間で同じ量と種類のデータが送受信されます。 プロセスのペアが異なると、異なる量のデータを交換できます。 ユーザーは、プロセス i の recvcounts[j] と recvtype が、プロセス j の recvcounts[i] と recvtype と一致していることを確認する必要があります。 この対称交換は、送信するデータが、 MPI_Alltoallv 関数呼び出し後に送信プロセスで使用されないアプリケーションで役立ちます。
comm パラメーターが相互通信子を参照している場合、結果はグループ A の各プロセスがグループ B の各プロセスにメッセージを送信するかのように、またはその逆になります。 グループ A のプロセス i の j番目の送信バッファーは、グループ B のプロセス j の i番目の受信バッファーと一致している必要があります。その逆も同様です。
要件
製品 |
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 |