コンピュータサイエンスでは、リダクション演算子[ 1 ]は、配列の要素を単一の結果に削減するために並列プログラミングで一般的に使用される演算子の一種です。リダクション演算子は結合法則を満たし、多くの場合(必ずしもそうとは限りませんが)可換です。[ 2 ] [ 3 ] [ 4 ]要素の集合の削減は、MapReduceなどのプログラミングモデルの不可欠な部分であり、削減演算子は削減される前にすべての要素に適用(マッピング)されます。他の並列アルゴリズムでは、より複雑な問題を解決するために、リダクション演算子を主要な操作として使用します。多くのリダクション演算子は、データをすべてのプロセッサに分散するためのブロードキャストに使用できます。
削減演算子は、部分的な結果を計算して最終結果を得ることで、タスクを複数の部分的なタスクに分割するのに役立ちます。これにより、特定の逐次処理を並列実行し、それらの処理に必要なステップ数を削減できます。削減演算子は、部分的なタスクの結果を変数のプライベートコピーに格納します。これらのプライベートコピーは、最後に共有コピーにマージされます。
演算子が還元演算子であるのは、以下の条件を満たす場合である。
これらの2つの要件は、配列のすべての要素に適用される可換演算子と結合演算子に対して満たされます。
これらの要件を満たす演算子には、加算、乗算、および一部の論理演算子(and、orなど)があります。
還元演算子入力セットに定数時間で適用できるのベクトル要素ごとに。結果操作の要素の組み合わせはそして、実行終了時に指定されたルートプロセッサに格納されなければならない。計算が完了した後、すべてのプロセッサで利用可能である必要があり、しばしば Allreduce と呼ばれます。削減のための最適な逐次線形時間アルゴリズムは、演算子を前から後ろへ順次適用し、常に 2 つのベクトルをそのすべての要素に適用された操作の結果で置き換え、ベクトルが 1 つ少ないインスタンスを作成します。までステップ残されたのは、逐次アルゴリズムでは線形時間よりも優れたパフォーマンスを発揮できないが、並列アルゴリズムでは最適化の余地が残されているという点である。
配列があると仮定しますこの配列の合計は、'+'演算子を使用して配列を順次単一の合計に縮小することで、逐次的に計算できます。配列の先頭から合計を開始すると、次のようになります。 '+' は交換法則と結合法則の両方を満たすため、還元演算子です。したがって、この還元は複数のコアを使用して並列に実行できます。各コアは配列のサブセットの合計を計算し、還元演算子が結果をマージします。バイナリツリー還元を使用すると、4つのコアで計算できます。、、、 そしてすると、2つのコアが計算できるそしてそして最後に、シングルコアが計算します合計4つのコアを使用して合計を計算できます。ステップの代わりにシリアル版に必要な手順。この並列バイナリツリー技術は、もちろん結果は同じですが、それは還元演算子の結合法則によるものです。還元演算子の可換性は、マスターコアが複数のプロセッサに処理を分散させる場合に重要になります。なぜなら、その場合、結果は任意の順序でマスタープロセッサに戻ってくる可能性があるからです。可換性という性質は、結果が必ず同じになることを保証します。
IEEE 754-2019 では、 4 種類の和縮約と 3 種類のスケール積縮約が定義されています。これらの演算は縮約演算子であるため、規格では「実装は任意の順序で結合したり、任意のより広い形式で評価したりすることができる」と規定されています。[ 5 ]
行列乗算は可換性を持たないため、縮約演算子ではありません。プロセスが行列乗算の結果を任意の順序でマスタープロセスに返すことが許されている場合、結果が順不同で到着すると、マスターが計算する最終結果は誤っている可能性が高くなります。ただし、行列乗算は結合法則を満たすため、二分木縮約法のように適切な順序が強制されていれば、結果は正しくなります。
並列アルゴリズムに関して言えば、並列計算には主に2つのモデルがあります。1つは、処理ユニット間で共有メモリを持つRAMの拡張である並列ランダムアクセスマシン(PRAM)であり、もう1つは、通信と同期を考慮したバルク同期並列コンピュータです。どちらのモデルも時間計算量に異なる影響を与えるため、ここでは2つのアルゴリズムを示します。
このアルゴリズムは、入力を処理する広く普及した方法を表しています。は 2 のべき乗です。逆の手順は、要素の放送によく使用されます。[ 6 ] [ 7 ] [ 8 ]

ベクトルの二項演算子は、要素ごとに次のように定義されます。
このアルゴリズムはさらに、最初はすべての人々のためにそして2のべき乗であり、処理ユニットを使用する各反復において、処理ユニットの半分が非アクティブになり、それ以上の計算には寄与しなくなります。図は、加算を演算子として使用したアルゴリズムの視覚化を示しています。垂直線は、その線上の要素の計算が行われる処理ユニットを表しています。8つの入力要素は下部に配置されており、各アニメーションステップはアルゴリズムの実行における1つの並列ステップに対応しています。アクティブなプロセッサ要素に対して指定された演算子を評価する現在保有しており、どこ最小インデックスは、 となることによって現在のステップでは、非アクティブなプロセッサになります。そして入力セットの要素とは限らないフィールドは上書きされ、以前に評価された式に再利用されるためです。各ステップで処理ユニットの役割を調整し、それらの間の追加の通信を引き起こさないようにするため、処理ユニットは番号でインデックス付けされています。にが使用されています。各プロセッサは、下位ビットは、非アクティブになるか、自身の要素とインデックスを持つ要素に対して演算子を計算するかを決定します。番目のビットは設定されていません。このアルゴリズムの基本的な通信パターンは二項ツリーであるため、この名前が付けられています。
のみ は最終的に結果を保持するため、ルートプロセッサです。Allreduce操作の場合、結果を分散する必要があります。これは、からブロードキャストを追加することで実現できます。さらに、その数はプロセッサ数は2のべき乗に制限されています。これは、プロセッサ数を次の2のべき乗にパディングすることで解除できます。また、このユースケースに特化したアルゴリズムもあります。[ 9 ]
メインループが実行されます倍、並列処理に必要な時間は処理ユニットは、2 つのベクトルを結合するか、非アクティブになるかのいずれかです。したがって、並列処理時間はPRAM の場合読み取りと書き込みの競合を処理する戦略は、排他的読み取りと排他的書き込み(EREW)のように制限的なものにすることもできます。アルゴリズムのしたがって効率は効率が低下するのは、各ステップ後にアクティブな処理ユニットの半分が非アクティブになるためです。ユニットはステップでアクティブになります。
PRAMアルゴリズムとは対照的に、分散メモリモデルでは、メモリは処理ユニット間で共有されず、データは処理ユニット間で明示的に交換する必要があります。したがって、以下のアルゴリズムに示すように、ユニット間でデータを明示的に交換する必要があります。
分散アルゴリズムとPRAMバージョンの唯一の違いは、明示的な通信プリミティブが含まれているかどうかであり、動作原理は同じです。
ユニット間の通信には多少のオーバーヘッドが発生する。アルゴリズムの簡単な解析では、BSPモデルを使用し、時間も考慮に入れる。コミュニケーションを開始し、1バイトを送信するのに必要な時間。すると、結果として得られる実行時間は、 としてベクトルの要素は各イテレーションで送信され、サイズは合計で。

分散メモリモデルの場合、パイプライン通信を使用することが理にかなっている場合があります。これは特に次のような場合に当てはまります。に比べて小さい通常、線形パイプラインはデータまたはタスクをより小さな部分に分割し、段階的に処理します。二項ツリーアルゴリズムとは対照的に、パイプラインアルゴリズムはベクトルが分離不可能ではないという事実を利用しますが、演算子は単一の要素に対して評価できます。[ 10 ]
アルゴリズムが正しく動作するためには、送信操作と受信操作を同時に実行する必要があることに注意してください。結果ベクトルは以下に格納されます。最後に、関連するアニメーションでは、5つの処理ユニットを用いてサイズ4のベクトル上でアルゴリズムを実行する様子を示しています。アニメーションの2つのステップは、1つの並列実行ステップを視覚化したものです。
並列実行におけるステップ数は、 かかる最後の処理ユニットが最初の要素と追加の要素を受け取るまでのステップすべての要素が受信されるまで。したがって、BSP モデルの実行時間は仮定するとこれはベクトルの合計バイトサイズです。
それでも固定値を持つ場合、ベクトルの要素を論理的にグループ化して削減することが可能です。例えば、サイズが4のベクトルを持つ問題インスタンスは、ベクトルを最初の2つと最後の2つの要素に分割し、それらを常に一緒に送信および計算することで処理できます。この場合、各ステップで送信されるボリュームは2倍になりますが、ステップ数はほぼ半分になります。これは、パラメータが合計バイトサイズは半分になり、同じままです。ランタイムこのアプローチは、これは、そしては既知です。結果としてより小さくなると仮定するとそれは元のものを分割する。
削減は、メッセージパッシングインターフェースで実装されている主要な集合演算の 1 つです。ここでは、使用されるアルゴリズムのパフォーマンスが重要であり、さまざまなユースケースに対して常に評価されます。[ 11 ] 演算子は、およびのパラメータとして使用できますが、結果が 1 つの (ルート) 処理ユニットで利用可能か、すべての処理ユニットで利用可能かが異なります。MPI_ReduceMPI_Allreduce
OpenMPは、並列操作の結果をどのようにまとめて収集するかを記述するための削減句を提供します。 [ 12 ]
MapReduceは、大規模なクラスタであっても、ビッグデータセットを処理するために効率的な削減アルゴリズムに大きく依存しています。[ 13 ] [ 14 ]
並列ソートアルゴリズムの中には、非常に大きなデータセットを処理できるようにするためにリダクションを使用するものがある。[ 15 ]