MPIと集団通信
並列プログラムが遅い原因の大半は通信設計にある。MPIの集団通信アルゴリズムと計算量を押さえれば、ノード数を増やしても性能が伸びない理由が原理から見抜けるようになる。
- 1.MPIはpoint-to-point(Send/Recv)と集団通信(Broadcast/Reduce/Allreduce/Scatter/Gather)を分けて提供し、後者は全プロセス参加の集団操作として最適化されている。
- 2.集団通信の内部実装はリング・二分木・バタフライなどのアルゴリズムで、データ量とプロセス数に応じて計算量とレイテンシのトレードオフが切り替わる。
- 3.通信アルゴリズムの選択はネットワークトポロジ(帯域・段数・リンク構成)と噛み合わせて初めて性能が出る。
MPIの二層構造 ── point-to-pointと集団通信
MPI(Message Passing Interface)は、共有メモリを持たない複数プロセス間でデータをやり取りするための標準規格です。通信は大きく2層に分かれます。point-to-point通信(MPI_Send / MPI_Recv)は1対1でメッセージを送受信する最小単位で、送信先・タグ・データ型を指定して明示的にペアで呼び出します。一方、**集団通信(collective communication)**はコミュニケータに属する全プロセスが同じ呼び出しに参加する操作で、MPI_Bcast や MPI_Allreduce のように全員が同じ関数を呼んで初めて完了します。
「全プロセスへ配る」「全プロセスから集める」という操作をpoint-to-pointの多重ループで書くことは可能ですが、素朴なループはプロセス数に比例して段数が増え非効率です。集団通信はMPI実装内部でネットワーク構成に応じたアルゴリズムに置き換えられるため、利用者はループを書かずに済み、かつ実装依存の最適化(アルゴリズム切り替え)の恩恵を受けられます。
集団通信の基本操作
代表的な集団通信は、データの流れる向きと集約の有無で整理できます。
| 操作 | データの動き | 典型用途 |
|---|---|---|
| Broadcast | 1プロセスの値を全プロセスへ複製 | 全員が同じ初期値・パラメータを持つ |
| Scatter | 1プロセスの配列を分割して各プロセスへ配布 | 入力データの分割配布 |
| Gather | 各プロセスの断片を1プロセスへ集約(結合のみ) | 計算結果の回収 |
| Reduce | 各プロセスの値を演算(総和・最大等)で1プロセスに集約 | 全体の総和・最大値の算出 |
| Allreduce | Reduceの結果を全プロセスへ配布 | 反復計算での全体量の共有 |
AllreduceはReduceとBroadcastを合成した操作に見えますが、実装上は両者を素直に連結するより効率的なアルゴリズムが使われます。この点が集団通信アルゴリズムを学ぶ核心です。
通信アルゴリズムと計算量
集団通信の実測性能は、メッセージサイズとプロセス数の組み合わせでどのアルゴリズムが選ばれるかに左右されます。ここではプロセス数をP、転送する総データ量をNとして、代表的な3つの構造を見ます。
二分木(binary tree)アルゴリズム
Broadcastの基本形です。ルートプロセスがまず半分のプロセスへデータを送り、受け取った側がさらに半分へ転送する、という具合に段数ごとに参加者が倍増します。
二分木Broadcastの段数(P個のプロセス)
段1: 1 → 1 (合計2プロセスがデータを持つ)
段2: 2 → 2 (合計4プロセスがデータを持つ)
段k: 2^(k-1) → 2^(k-1)
全プロセスに行き渡るまでの段数 = log2(P)
各段の通信は並列に行われるため、レイテンシ支配の項は log2(P) に比例
木構造の利点は段数がPの対数で済むことです。ただし各段で送るデータ量はNのままなので、大きなメッセージでは帯域幅(bandwidth)支配の項が効いてきます。
リング(ring)アルゴリズム ── Allreduceの主力
大きなメッセージのAllreduceでは、リングアルゴリズムが広く使われます。P個のプロセスを論理的な環状に並べ、データをP個のチャンクに分割し、隣接プロセスとだけ通信します。処理は2フェーズです。
Ring-Allreduceの2フェーズ(P プロセス、データを P チャンクに分割)
フェーズ1: Reduce-Scatter
P-1 ステップかけて、各プロセスが隣から部分和を受け取り自分のチャンクに足し込む
ステップ終了後、各プロセスは「担当チャンクの全プロセス分の合計」を1つずつ保持
フェーズ2: Allgather
P-1 ステップかけて、完成した合計チャンクをリング上に回して全員が全チャンクを取得
合計ステップ数 = 2(P-1)
1プロセスあたりの送受信データ量 = 2 × (P-1)/P × N ≒ 2N(Pが大きいとき)
リングアルゴリズムの本質は、1プロセスが送受信するデータ量がプロセス数Pにほぼ依存せず一定になる点です。木構造がレイテンシ(段数)をlog2(P)に抑えるのに対し、リングは帯域幅の使用効率を最大化します。このため、メッセージが大きく帯域幅がボトルネックになる場面(大規模数値シミュレーションの領域分割境界データ交換や、分散学習の勾配同期)ではリング型が有利です。
バタフライ(butterfly / recursive doubling)アルゴリズム
Allreduceの別解として、**再帰的倍加(recursive doubling)**とも呼ばれるバタフライ型があります。プロセス数がPのとき、通信相手との距離を1、2、4…と倍にしながらlog2(P)ステップで全交換を終えます。
バタフライAllreduceの段数(P = 2^m の場合)
段1: 距離1のペアと全データ交換・演算
段2: 距離2のペアと全データ交換・演算
段k: 距離2^(k-1) のペアと全データ交換・演算
段数 = log2(P)
各段で送受信するデータ量 = N(全量、分割しない)
総通信量(1プロセスあたり)= N × log2(P)
バタフライ型は段数が少なくレイテンシに強い一方、各段で送るデータ量を分割しないため、メッセージが大きいと総通信量がlog2(P)倍に膨らみます。したがって小さいメッセージ・多プロセスではバタフライ、大きいメッセージではリングが有利、という切り替えが成り立ちます。
| アルゴリズム | 段数(レイテンシ項) | 1プロセスあたり通信量(帯域項) | 有利な条件 |
|---|---|---|---|
| 二分木 | log2(P) | N(段ごとに全量) | Broadcast、中小メッセージ |
| バタフライ(再帰的倍加) | log2(P) | N × log2(P) | 小メッセージ・多プロセス |
| リング | 2(P-1) | ≒2N(Pに依存せず一定) | 大メッセージ・帯域幅律速 |
Open MPIやMPICHなどの実装は、メッセージサイズとプロセス数の閾値に応じて内部でBroadcast・Reduce・Allreduceのアルゴリズムを動的に切り替えます。利用者はAPIレベルでは同じMPI_Allreduceを呼ぶだけですが、裏側では木・リング・バタフライが使い分けられています。性能検証時にメッセージサイズを変えると挙動が急に変わることがあるのは、この閾値越えが原因です。
ネットワークトポロジとの関係
集団通信アルゴリズムの理論段数はあくまで論理構造上の値で、実機性能は物理的なネットワークトポロジと接続段数(ホップ数)に強く依存します。
| トポロジ | 特徴 | 集団通信への影響 |
|---|---|---|
| フラット・クロスバー | 全ノード間が等距離で直結 | リング・木のどちらも理論値に近い性能が出やすい |
| ファットツリー | 階層的スイッチ、上位段ほど帯域を太くする設計 | 木型アルゴリズムと相性が良く、段数がスイッチ階層と対応する |
| トーラス(多次元メッシュ) | 隣接ノードのみ直結、遠距離は多段中継 | リングの隣接通信と物理配線が一致すれば高効率、論理リングと物理配置がずれると中継増でレイテンシ悪化 |
重要なのは、論理的なアルゴリズム構造(リング・木・バタフライ)と物理トポロジの接続関係が一致するほど性能が出るという点です。例えばトーラス型のスーパーコンピュータでは、MPIランクの物理ノードへの割り当て(ランク配置、rank mapping)をトーラスの隣接関係に合わせることで、論理リングの1ステップが物理的にも1ホップで済み、中継によるレイテンシ増加を避けられます。逆に割り当てが乱雑だと、論理的には隣接のはずのステップが物理的には何ホップも離れ、通信段数の理論値どおりの性能が出ません。
プロセス数を増やしても性能が伸びない場合、多くは通信がボトルネック化しています。二分木やバタフライは段数がlog2(P)で増えるためレイテンシが伸び、リングは1ステップあたりの転送量は一定でもステップ数がプロセス数に比例して増えます。計算対通信の比率(ローカルな計算量をプロセス数で割った値)が小さくなるほど、通信時間が計算時間を上回る「通信律速」に転じる点を、性能予測の段階で見積もっておく必要があります。
まとめ
- MPIはpoint-to-point(
Send/Recvのペア通信)と集団通信(全プロセス参加のBroadcast/Reduce/Allreduce/Scatter/Gather)の二層で構成される。 - 集団通信の内部実装は二分木・リング・バタフライ(再帰的倍加)に大別され、段数(レイテンシ項)と1プロセスあたり通信量(帯域項)のトレードオフが異なる。
- リングはプロセス数によらず通信量がほぼ一定で大メッセージに強く、バタフライは段数が少なくレイテンシに強いが通信量が
log2(P)倍に増える。 - 実機性能はネットワークトポロジ(ファットツリー・トーラス等)とアルゴリズムの論理構造がどれだけ一致するかに左右され、ランク配置の設計次第で理論段数どおりの性能が出るかが決まる。
HPC・科学技術計算 Article
MPIと集団通信を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
MPI
比較で見る軸
難易度: advanced / カテゴリ: HPC・科学技術計算 / タグ数: 5
導入後に効く点
集団通信の内部実装はリング・二分木・バタフライなどのアルゴリズムで、データ量とプロセス数に応じて計算量とレイテンシのトレードオフが切り替わる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- HPC・科学技術計算
- タグ数
- 5
判断チェックリスト
- 自社の用途が「MPI / 並列計算」に近いか確認する。
- 強みである「MPIはpoint-to-point(Send/Recv)と集団通信(Broadcast/Reduce/Allreduce/Scatter/Gather)を分けて提供し、後者は全プロセス参加の集団操作として最適化されている。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。