次の方法で共有


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関数は、指定された操作が連想操作であることを前提として実装されます。 定義済みの操作はすべて、連想的で可換的に設計されています。 ユーザーは、連想するように設計されているが、可換ではない操作を定義できます。 削減操作の既定の評価順序は、グループ内のプロセスのランクによって決まります。 ただし、実装では、結合性、または結合性と可換性を利用して、評価の順序を変更できます。 このプロセスでは、浮動小数点加算など、厳密に結合や可換ではない操作の削減の結果を変更できます。

一部のアプリケーションでは、浮動小数点演算の非結合の性質を無視できないか、特別な順序の評価を必要とし、連想として扱うことができないユーザー定義操作を使用する場合があります。 この場合は、評価の順序を明示的に適用できます。 たとえば、厳密な左から右、または右から左への評価順序を必要とする操作の場合は、次のプロセスを使用できます。

  1. たとえば、MPI_Gather関数を使用して、すべてのオペランドを 1 つのプロセスで収集します。
  2. たとえば、MPI_Reduce_local関数を使用して、必要な順序で削減操作を適用します。
  3. 必要に応じて、結果をブロードキャストするか、他のプロセスに分散します。

注意

各プロセスで、 MPI_Reduce関数に 異なるユーザー定義操作を提供できます。 この場合、この関数では、どの演算がどのオペランドで使用されているかを定義しません。 MPI_Reduce関数の実装方法を想定することはできません。 各プロセスで同じ操作を指定するのが最も安全です。

 

ユーザー定義演算子は、一般的な派生データ型を操作できます。 この場合、reduce 操作が適用される各引数は、このようなデータ型で記述される 1 つの要素であり、いくつかの基本的な値を含めることができます。

重複するデータ型は送信バッファーでは許可されますが、受信バッファーでは許可されません。 受信バッファー内のデータ型が重複すると、予期しない結果が発生する可能性があり、エラーと見なされます。

comm パラメーターがコマンド内を参照している場合、MPI_Reduce関数は、グループ内の各プロセスの入力バッファーで指定された要素を結合し、指定した操作を使用して、ルート プロセスの出力バッファーに結合された値を返します。

入力バッファーと出力バッファーには、同じデータ型の同じ数の要素があります。 countdatatypeoprootおよび 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

こちらもご覧ください

MPI 集合関数

MPI_Datatype

MPI_Gather

MPI_Op

MPI_Bcast