MPI_Reduce関数
グループのすべてのメンバーに対してグローバルな reduce 操作を実行します。 定義済みの算術演算または論理演算、またはアプリケーション定義演算を指定できます。
構文
int MPIAPI MPI_Reduce(
_In_ void *sendbuf,
_Out_opt_ void *recvbuf,
int count,
MPI_Datatype datatype,
MPI_Op op,
int root,
MPI_Comm comm
);
パラメーター
sendbuf [in]
ルート プロセスに送信されるデータを含むバッファーへのハンドル。comm パラメーターがコマンド内を参照している場合は、すべてのプロセスで MPI_IN_PLACE を指定することで、インプレース オプションを指定できます。 sendcount パラメーターと sendtype パラメーターは無視されます。 各プロセスは、対応する受信バッファー要素にデータを入力します。 n番目のプロセスは、受信バッファーの n番目の要素にデータを送信します。 ルート プロセスは、受信バッファーの対応する要素から入力データを受け取り、それを出力データに置き換えます。
recvbuf [out, optional]
削減操作の結果を受け取るバッファーへのハンドル。 このパラメーターは、ルート プロセスでのみ重要です。count
このプロセスから送信する要素の数。datatype
バッファー内の各要素のデータ型。 このパラメーターは、 op パラメーターで指定されている操作と互換性がある必要があります。op
実行するグローバルな削減操作。 ハンドルは、組み込み操作またはアプリケーション定義操作を示すことができます。 定義済みの操作の一覧については、 MPI_Op トピックを参照してください。root
指定したコミュニケーター内の受信プロセスのランク。comm
MPI_Comm コミュニケーター ハンドル。
戻り値
成功 したMPI_SUCCESS を返します。 それ以外の場合、戻り値はエラー コードです。
Fortran では、戻り値は IERROR パラメーターに格納されます。
Fortran
MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR
注釈
MPI_Reduce関数は、指定された操作が連想操作であることを前提として実装されます。 定義済みの操作はすべて、連想的で可換的に設計されています。 ユーザーは、連想するように設計されているが、可換ではない操作を定義できます。 削減操作の既定の評価順序は、グループ内のプロセスのランクによって決まります。 ただし、実装では、結合性、または結合性と可換性を利用して、評価の順序を変更できます。 このプロセスでは、浮動小数点加算など、厳密に結合や可換ではない操作の削減の結果を変更できます。
一部のアプリケーションでは、浮動小数点演算の非結合の性質を無視できないか、特別な順序の評価を必要とし、連想として扱うことができないユーザー定義操作を使用する場合があります。 この場合は、評価の順序を明示的に適用できます。 たとえば、厳密な左から右、または右から左への評価順序を必要とする操作の場合は、次のプロセスを使用できます。
- たとえば、MPI_Gather関数を使用して、すべてのオペランドを 1 つのプロセスで収集します。
- たとえば、MPI_Reduce_local関数を使用して、必要な順序で削減操作を適用します。
- 必要に応じて、結果をブロードキャストするか、他のプロセスに分散します。
注意
各プロセスで、 MPI_Reduce関数に 異なるユーザー定義操作を提供できます。 この場合、この関数では、どの演算がどのオペランドで使用されているかを定義しません。 MPI_Reduce関数の実装方法を想定することはできません。 各プロセスで同じ操作を指定するのが最も安全です。
ユーザー定義演算子は、一般的な派生データ型を操作できます。 この場合、reduce 操作が適用される各引数は、このようなデータ型で記述される 1 つの要素であり、いくつかの基本的な値を含めることができます。
重複するデータ型は送信バッファーでは許可されますが、受信バッファーでは許可されません。 受信バッファー内のデータ型が重複すると、予期しない結果が発生する可能性があり、エラーと見なされます。
comm パラメーターがコマンド内を参照している場合、MPI_Reduce関数は、グループ内の各プロセスの入力バッファーで指定された要素を結合し、指定した操作を使用して、ルート プロセスの出力バッファーに結合された値を返します。
入力バッファーと出力バッファーには、同じデータ型の同じ数の要素があります。 count、datatype、op、root、および comm パラメーターに同じ値を使用して、すべてのグループ メンバーで 関数を呼び出します。 この方法により、すべてのプロセスで、同じ長さの入力バッファーと出力バッファーが、同じ型の要素と共に提供されます。
各プロセスは、1 つの要素または要素のシーケンスを提供できます。この場合、シーケンスの各エントリの要素ごとに操作が実行されます。 たとえば、操作が MPI_MAX であり、送信バッファーに浮動小数点数である 2 つの要素が含まれている場合 recvbuf(1)
、グローバル最大値 を (sendbuf(1))
受け取り、 recvbuf(2)
のグローバル最大値 (sendbuf(2))
を受け取ります。
comm パラメーターがインターコミュニケーターを参照している場合、呼び出しには、ルート プロセスを定義する 1 つのグループ A を使用して、インターコミュニケーター内のすべてのプロセスが含まれます。 他のグループ (グループ B) 内のすべてのプロセスは、ルート パラメーターに同じ値を設定します。つまり、グループ A のルート プロセスのランクを設定します。ルート プロセスは、ルート パラメーターにMPI_ROOT値を設定します。 グループ A 内の他のすべてのプロセスは、ルート パラメーターにMPI_PROC_NULL値を設定します。 グループ B プロセスでは送信バッファー パラメーターのみが重要であり、ルート プロセスでは受信バッファー パラメーターのみが重要です。
要件
製品 |
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 |