複数のパイプラインを並べて1クロックで複数命令を実行する方式
スーパースカラとは、パイプライン(命令を流れ作業で処理する仕組み)を複数本並べ、1クロックで同時に複数の命令を実行する方式です。
身近な例で考えると、スーパーのレジを2列に増やすのと同じです。1列(1本のパイプライン)でも客は流れますが、レジを2列にすれば同じ時間で2人ずつ会計でき、行列が倍の速さでさばけます。スーパースカラはCPUの中に「実行レーン」を複数用意して、命令を同時並行で処理しているのです。
上のツールで▶ボタンを押すと、シナリオに応じて1本または2本のパイプラインに命令が投入される様子が見られます。「スーパースカラ(2本)」では、1クロックで命令が2つずつ投入され、表の同じT列に同じステージが2つ並ぶのが分かります。
スーパースカラを実現するには、同じ働きをする装置(実行ユニット)を複数組そろえる必要があります。レジを2列にするにはレジ係も2人必要、というのと同じ理屈です。具体的には次のような工夫が行われます。
・命令フェッチを複数同時に:1クロックで複数の命令をメモリから取り出す
・演算ユニットの複数化:ALU(演算装置)などを複数持ち、同時に計算できるようにする
・命令の振り分け(ディスパッチ):取り出した命令を空いているレーンに割り当てる
ここで重要なのが、同時に実行する命令どうしが互いに依存していないことです。たとえば「Aを計算してからAを使ってBを計算する」という関係(依存)があると、同時には実行できません。そこでCPUは、依存のない命令を見つけて並べ替えるアウトオブオーダー実行などの技術を使い、できるだけ多くのレーンを埋めようとします。
1クロックあたりに完了できる命令数の指標をIPC(Instructions Per Cycle)と呼びます。通常のパイプラインは IPC が最大1ですが、2本のスーパースカラなら理論上 IPC は最大2になります。実際にはハザード(依存や競合)があるため、理論値より低くなるのが普通です。
通常のパイプラインとスーパースカラの違いは、「1クロックに何命令を投入・完了できるか」にあります。
| 項目 | 通常パイプライン | スーパースカラ |
|---|---|---|
| パイプライン本数 | 1本 | 複数本(2〜4本など) |
| 1クロックの投入命令 | 1命令 | 複数命令(本数分) |
| 最大IPC | 1 | 本数(理論値) |
| 実行ユニット | 各1組 | 複数組(多重化) |
| 回路の複雑さ | シンプル | 複雑(振り分けが必要) |
上のツールで「通常(1本)」と「スーパースカラ(2本)」を切り替えて、同じ命令数でも所要クロック数が変わることを確認してください。6 命令なら、1本だと 10 クロック、2本だと 7 クロックで完了します。
用語の整理:
・パイプラインは「1本の流れ作業で命令を重ねる」高速化
・スーパースカラは「複数本のパイプラインで1クロックに複数命令」を実行
・スーパーパイプラインは段数を細かく増やす方式で、スーパースカラとは別物
スーパースカラを理解するには、まずパイプラインの仕組みを押さえておく必要があります。パイプラインとは、1命令の処理を複数の段階(ステージ)に分け、流れ作業で複数の命令を同時進行させる技術です。
なぜ流れ作業にするのか。1命令を終わらせてから次の命令を始めるより、先の命令が次のステージへ進んだ瞬間に後の命令を最初のステージに流し込んだほうが、全体としての処理量が増えるからです。工場の組み立てラインで「前の製品がベルトを進んだら、次の製品を投入する」のと同じ発想です。
・IF(Instruction Fetch):命令をメモリから読み込む
・ID(Instruction Decode):命令の意味を解釈する
・EX(Execute):計算を実行する
・MEM(Memory access):メモリへの読み書きをする
・WB(Write Back):結果をレジスタに書き戻す
パイプラインが「1本の流れ作業」なら、スーパースカラはその流れ作業ラインを並べて複数本にしたものです。上のツールで「通常(1本)」と「スーパースカラ(2本)」を比べると、タイムライン表の行が2倍になり、同じクロックで2命令が並んで進むのが分かります。
スーパースカラは複数の命令を同時に実行できますが、すべての命令を並べられるわけではありません。実際にはハザード(hazard)=「衝突・障害」と呼ばれる問題があり、これがスーパースカラの限界を決めます。
ハザードには主に3種類あります。
・データハザード:命令Bが命令Aの計算結果を使う(A が終わるまで B を始められない)
・制御ハザード:「条件によって次の命令が変わる」分岐命令(どちらへ進むか決まるまで次を読めない)
・構造ハザード:2命令が同じ装置(例:メモリ読み書き回路)を同時に使おうとする
なぜスーパースカラの実際のIPCは理論値より低いのか。それはこのハザードのせいで、常に全パイプラインを埋め続けることができないからです。依存する命令が多いプログラムでは、片方のパイプラインが「待ち」になり、結果として 2本あっても IPC が 1.5 前後にとどまることもあります。CPUメーカーはこれを減らすために、依存のない命令を探して並べ替える(アウトオブオーダー実行)などの工夫を重ねています。