スーパースカラの発行幅とディスパッチ ─ 並列度の限界
なぜ発行幅を倍にしても性能は倍にならないのか。依存検査のO(n^2)爆発とウェイクアップ・セレクトの臨界パスを原理から押さえ、幅拡大が頭打ちになる理由を掴めます。
- 1.スーパースカラは1サイクルに複数命令を発行する。発行幅Wの群を並べるには命令間依存をすべて調べる必要があり、比較器の数はWの2乗で増える。
- 2.順不同の心臓部はウェイクアップ・セレクトのループで、ここがクロック周波数を縛る臨界パス。発行キューを広げると配線遅延と電力が非線形に膨らむ。
- 3.プログラムの実効ILPは多くの汎用コードで数前後に頭打ちになり、発行幅を広げても収穫逓減に陥る。だから現実の幅は4〜8程度に落ち着く。
1サイクルに何命令を流し込めるか
パイプラインはステージを命令で埋めることでスループットを上げますが、理想でも1サイクルに1命令(IPC=1)が限界です。これを超えるには、同じサイクルに複数命令を同時に処理する横方向の並列化が要ります。これがスーパースカラで、フロントエンドから演算器まで複数レーンを並べ、1サイクルにW命令を流し込みます。このWを**発行幅(issue width)**と呼びます。
問題は「W本のレーンを並べれば素直にW倍速くなる」とはいかないことです。並べた命令どうしに依存があれば同時には実行できず、依存を見抜く検査自体のコストがWとともに急増します。本稿は、発行幅・ディスパッチ帯域がどこで頭打ちになるかを、ハードウェアの臨界パスと組合せ爆発の観点から原理的に追います。
ディスパッチ:幅を揃えて並べる関門
まず用語を整理します。実装で呼び分けはありますが、本稿では次の段階に分けます。
| 段階 | やること | ボトルネックの源 |
|---|---|---|
| フェッチ | 命令を毎サイクルW個取り込む | 分岐・キャッシュライン跨ぎ |
| デコード/リネーム | W個を並列に解読しリネーム | 依存検査・リネームポート |
| ディスパッチ | 発行キュー/ROBへW個割り当て | ポート数・空き確保 |
| 発行(issue) | 準備できた命令を演算器へ送る | ウェイクアップ・セレクト |
毎サイクルW命令を絶え間なく供給するには、フェッチ・デコード・リネーム・ディスパッチのすべてが幅Wを維持しなければなりません。どこか1段でも幅が細れば、そこがその群の上限になります。たとえば命令が平均5〜6個に1回分岐するなら、分岐予測が当たり続けてもフェッチ群が分岐で切れやすく、幅8のフロントエンドを毎サイクル満たすこと自体が難しくなります。
依存検査の組合せ爆発:O(n^2)比較器
W個の命令を同じサイクルにリネーム/ディスパッチする際、群の内部にある依存を取りこぼせません。とくに同一群内のRAW依存(前の命令の書き先を後の命令が読む)は厄介です。リネームテーブルは群の先頭時点のスナップショットしか持たないので、群内で先に書かれた値は表に載っておらず、群の中だけで突き合わせる必要があります。
i番目の命令のソースが、自分より前のj番目(j が i 未満)の書き先と一致するかを総当たりで調べると、比較の数はおよそ次のようになります。
群内の依存比較(ソース2個/命令と仮定)
比較数 ≒ 2 × (0 + 1 + 2 + … + (W-1))
= 2 × W(W-1)/2
= W(W-1)
→ オーダーは O(W^2)
つまり発行幅を倍にすると、群内依存をチェックする比較器の数はおよそ4倍に膨らみます。幅2なら数個で済む比較器が、幅8では数十個、幅16では百を超え、しかもこれを1サイクル内に並列で回さねばなりません。リネームの依存解決はデコード段の臨界パスに直結するため、この2乗則が発行幅を広げる際の最初の重い壁になります。
リネームは「論理レジスタ→物理レジスタ」の対応表を引きますが、表は1サイクルの群を処理する前の状態です。同じ群でr1に書く命令とそのr1を読む命令が並ぶと、読む側は表ではなく群内の書き手から物理タグを受け取らねばなりません。この群内転送(intra-group bypass)の照合こそがO(W^2)の比較器を要求します。
ウェイクアップ・セレクト:周波数を縛る臨界パス
順不同実行の心臓部は、アウトオブオーダ実行で見たリザベーションステーション(発行キュー)にあります。ここで毎サイクル次の2段が回ります。
ウェイクアップ : 完了した命令のタグをバスへ放送し、
キュー内の全エントリが自分の待つタグと照合。
一致したオペランドを「準備完了」に変える。
セレクト : 準備完了になった命令の中から、空いている
演算ポートぶんだけ優先度で選び、発行する。
このウェイクアップ→セレクト→次サイクルのウェイクアップが1ループを成し、これを1サイクル内に閉じる必要があります。なぜなら、レイテンシ1の命令(加算など)に依存する命令を背中合わせに連続発行するには、生産者を選んだその同じサイクルに、消費者を起こして次に選べる状態にしておかねばならないからです。このループが発行ロジックの臨界パスで、多くの設計でクロック周波数を直接決めます。
ウェイクアップは放送タグとキュー全エントリの並列比較(連想照合)です。キューをN段にすると、N個のエントリへ配るタグ配線とN入力のセレクト(優先度エンコーダ)が大きくなり、配線遅延がエントリ数に対して超線形に伸びます。発行キューを広げるほど臨界パスが延び、周波数を下げるか段数を割るしかなくなる——発行幅と動作周波数のトレードオフの正体です。
ILPの実効上限と収穫逓減
仮に依存検査もウェイクアップも無コストだったとしても、引き出せる並列度はプログラム自身が持つ**命令レベル並列性(ILP)**で頭打ちになります。命令ウィンドウ内で同時に実行できる独立命令の平均数がILPで、これはRAW依存の鎖の長さと分岐の頻度で決まります。
理想IPCの上限(概念)
IPC ≦ min( 発行幅W,
演算ポート数,
プログラムの実効ILP )
→ どれか最小の項が天井を決める
古典的な研究(Wall らのリミットスタディなど)では、完全な分岐予測とリネームを仮定しても、汎用整数コードの実効ILPはおおむね数前後にとどまることが知られています。ループの多い数値コードは高いILPを示しますが、分岐とポインタ追跡の多いコードでは独立命令がすぐ枯れます。したがって発行幅を4から8、8から16へ広げても、稼げるIPCはILPの天井に漸近するだけで、面積と電力はO(W^2)で増えるのに性能はほとんど伸びないという収穫逓減に陥ります。
「発行幅Wの群内依存検査はO(W^2)の比較器を要する」「ウェイクアップ・セレクトのループが発行ロジックの臨界パスでクロックを縛る」「実効ILPの上限により幅拡大は収穫逓減する」の3点が核心です。だから現実のスーパースカラは幅4〜8に収束し、それ以上の性能はSMT(複数スレッドでウィンドウを埋める)やSIMDのようにILP以外の並列性へ向かう、という流れを押さえましょう。
まとめ
- スーパースカラは1サイクルにW命令を発行するが、フェッチからディスパッチまで全段で幅Wを維持できて初めて効く。
- 群内の依存検査はW(W-1)、すなわちO(W^2)で比較器が増え、幅を倍にすると検査コストは約4倍に膨らむ。
- ウェイクアップ・セレクトのループは1サイクルで閉じねばならず、発行キューを広げると配線遅延が延びてクロックを下げる臨界パスになる。
- 実効ILPは汎用コードで数前後に頭打ちのため、幅拡大は面積・電力O(W^2)に対し性能が漸近する収穫逓減を招き、現実の幅は4〜8に収束する。
CPU/メモリ/ディスク Article
スーパースカラの発行幅とディスパッチ ─ 並列度の限界を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
スーパースカラ
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
順不同の心臓部はウェイクアップ・セレクトのループで、ここがクロック周波数を縛る臨界パス。発行キューを広げると配線遅延と電力が非線形に膨らむ。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「スーパースカラ / 発行幅」に近いか確認する。
- 強みである「スーパースカラは1サイクルに複数命令を発行する。発行幅Wの群を並べるには命令間依存をすべて調べる必要があり、比較器の数はWの2乗で増える。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。