プログラミングとデータ処理の分野において、集合通信(collective communication)は並列計算において複数のプロセス間でデータを交換するための操作です。以下は一般的な集合通信操作とその意味です:
1. ブロードキャスト(Broadcast)#
- 操作:データを 1 つのプロセスから他のすべてのプロセスに送信します。
- 意味:1 つのプロセスが特定のデータを持っており、そのデータを他のすべてのプロセスに配布する必要があります。これは通常、すべてのプロセスが同じ値を共有するために使用されます。
- 例:分散計算において、1 つのマスタープロセスが設定パラメータをすべてのワーカープロセスに送信する必要があります。
2. リデュース(Reduce)#
- 操作:複数のプロセスのデータを特定の演算(合計、最大値、最小値など)に従って集約し、結果を指定されたプロセスに送信します。
- 意味:複数のプロセスがそれぞれ一部のデータを持ち、特定の結合操作を通じて最終結果を得て、それをマスタープロセスに渡すことを望んでいます。
- 例:各ノードの計算結果の合計を求め、その合計をマスターノードに渡します。
3. オールリデュース(All-Reduce)#
- 操作:リデュースと似ていますが、最終的なリデュース結果がすべてのプロセスに送信されます。
- 意味:すべてのプロセスがリデュース操作後の最終結果を共有する必要があり、1 つのプロセスにのみ送信されるわけではありません。
- 例:深層学習において、複数のノードがモデルパラメータを更新するために勾配情報を同期する必要があります。
4. スキャッター(Scatter)#
- 操作:1 つのプロセス内のデータを分割し、他のプロセスにそれぞれ送信し、各プロセスがその一部を受け取ります。
- 意味:1 つのプロセスが大量のデータを持ち、分散計算を行うために複数のプロセスに割り当てる必要があります。
- 例:行列の掛け算において、一部の行列行を異なるノードに割り当てて並列計算を行います。
5. ギャザー(Gather)#
- 操作:スキャッター操作とは逆に、複数のプロセスがそれぞれデータを持ち、最終的にそれらを 1 つのプロセスに集めます。
- 意味:複数のプロセスがそれぞれのデータ部分を処理した後、結果を 1 つのプロセスに統合する必要があります。
- 例:並列処理後、マスタープロセスが各サブプロセスの結果を収集して最終結果を構築する必要があります。
6. オールギャザー(All-Gather)#
- 操作:各プロセスが自分のデータを他のすべてのプロセスに送信します。
- 意味:各プロセスが独立したデータを持ち、最終的にすべてのプロセスがすべてのプロセスのデータを共有する必要があります。
- 例:分散学習において、各ノードの局所的な勾配をすべての他のノードに送信してパラメータを更新する必要があります。
7. オールトゥオール(All-to-All)#
- 操作:各プロセスが自分のデータを他のすべてのプロセスに送信し、各プロセスも他のすべてのプロセスからデータを受け取ります。
- 意味:すべてのプロセスが互いにデータを交換する必要があり、通常はグローバル通信が必要なシナリオで使用されます。
- 例:並列ソートアルゴリズムにおいて、各ノードが部分的なソートデータを交換してグローバルなソートを行う必要があります。
8. スキャン(Scan)#
- 操作:順番に複数のプロセスのデータを累積し、結果として各プロセスがそのプロセスおよび以前のプロセスのデータの累積結果を受け取ります。
- 意味:前置累積操作の一種で、各プロセスが以前のすべてのプロセスのデータの結合結果を取得します。
- 例:累積和や累積積などの操作を計算するために使用されます。
これらの集合通信操作は分散計算と並列アルゴリズムにおいて非常に重要であり、複数の処理ユニットが効率的にデータ交換と同期を行うのを助けます。