Main Content

spmdReduce

spmd ワーカー上の配列を削減する

R2022b 以降

    説明

    B = spmdReduce(fcn,A) は、関数 fcn を使用して、spmd ブロックまたは通信ジョブを実行している各ワーカー上で定義されている配列 A を削減します。この関数は、削減の結果 B を各ワーカーに保存します。

    たとえば、spmdReduce(@plus,A) は、各ワーカー上で定義されている配列 A の和を返します。

    MATLAB® は関数 fcn を使用し、この関数を N - 1 回呼び出すことにより、AJ を削減します。

    • N は、spmd ブロックまたは通信ジョブを実行しているワーカーの数。現在の spmd ブロックを実行しているワーカーの数を取得するには、関数 spmdSize を使用

    • Aj は、インデックスが j である spmd ワーカー上で定義された配列 A

    spmd ブロックまたは通信ジョブが常に同じ結果を生成するようにするには、fcn を結合関数として指定します。

    parforparfeval、または parfevalOnAll を使用して並列プールでコードを実行する場合、各ワーカーは独立しており、相互の通信は行われません。これらのワーカー上で spmdReduce を使用した場合、結果はクライアント上で spmdReduce を使用した場合と同じになります。

    現在の spmd ブロックを 1 つのワーカーが実行している場合、BA と等しくなります。

    B = spmdReduce(fcn,A,destination) は、A を削減し、結果を 1 つのワーカーにのみ保存します。

    すべて折りたたむ

    この例では、spmdReduce を使用して、全ワーカー間における配列の最大値を計算する方法を説明します。

    4 つのワーカーをもつ並列プールを作成します。

    parpool(4);

    並列プールの作成後に spmd ブロックを実行すると、既定ではそのプール内のすべての使用可能なワーカーで、spmd ブロック内のコードが実行されます。

    spmd ブロック内の各ワーカー上で spmdIndex を実行し、結果を A に保存します。spmdReducemax を使用して、各ワーカーの A の最大値を計算します。

    保存先を指定しない限り、spmdReduce は結果を各ワーカーに保存します。クライアント上では、結果は Composite オブジェクトです。結果を取得するには、Composite オブジェクトにインデックスを付けます。

    spmd
        A = spmdIndex;
        B = spmdReduce(@max,A);
    end
    disp(B{1})
         4

    入力引数

    すべて折りたたむ

    入力配列。スカラー、ベクトル、行列、多次元配列、table、timetable、または連結をサポートする任意の MATLAB 変数として指定します。

    例: A = magic(3)

    リダクション関数。関数ハンドルとして指定します。リダクション関数は、2 個の入力引数を受け入れなければなりません。

    例: fcn = @max

    データ型: function_handle

    保存先ワーカーのインデックス。正の整数または空の配列として指定します。この入力の値は、現在の spmd ブロックまたは通信ジョブを実行しているワーカーの数以下でなければなりません。

    この入力を指定した場合、関数は B の値を、このインデックスをもつワーカーにのみ保存します。インデックスが destination と等しいワーカーにおいて、B は演算の結果となります。他のすべてのワーカーでは、B[] です。

    例: 1

    アルゴリズム

    次の図は、spmdReduce(fcn,A) を呼び出したときに、関数 spmdReducefcn をどのように使用するかを示しています。

    Diagram showing how four workers combine arrays specified as A into a single array, B.

    拡張機能

    バージョン履歴

    R2022b で導入