FE EXAM

スーパースカラ(複数パイプライン並列)

複数のパイプラインを並べて1クロックで複数命令を実行する方式

INTERACTIVE VISUALIZATION
パイプライン1
パイプライン2
命令数 n
6
パイプライン本数
2
所要クロック
7
1本なら
10
構成
クロック0 / 7
STEP 1/8開始前まだ命令は流れていません。スライダーを進めると、2本のパイプラインに1クロックで 2 命令ずつ投入される様子が分かります。
T1T2T3T4T5T6T7命令1(P1)命令2(P2)命令3(P1)命令4(P2)命令5(P1)命令6(P2)
完了した命令: 0 / 6 | 同じT列に 同じステージが複数並ぶ = 1クロックで複数命令を処理
通常パイプライン vs スーパースカラ
通常パイプライン(1本)
1クロックに投入できる命令は1つ。1クロックあたり最大1命令が完了(IPC ≦ 1)。
スーパースカラ(2本)
同じステージの装置を2組持ち、1クロックに2命令を投入。理論上 IPC ≦ 2
解説

📌
スーパースカラとは

パイプラインを2本並べるIFIDEXMEMWBIFIDEXMEMWBP1P2同じクロックで2命令が並んで進む

スーパースカラとは、パイプライン(命令を流れ作業で処理する仕組み)を複数本並べ、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命令複数命令(本数分)
最大IPC1本数(理論値)
実行ユニット各1組複数組(多重化)
回路の複雑さシンプル複雑(振り分けが必要)

上のツールで「通常(1本)」と「スーパースカラ(2本)」を切り替えて、同じ命令数でも所要クロック数が変わることを確認してください。6 命令なら、1本だと 10 クロック、2本だと 7 クロックで完了します。

用語の整理
パイプラインは「1本の流れ作業で命令を重ねる」高速化
スーパースカラは「複数本のパイプラインで1クロックに複数命令」を実行
スーパーパイプラインは段数を細かく増やす方式で、スーパースカラとは別物

💡
パイプラインとは(前提確認)

1命令 = 5つのステージに分けた流れ作業IFIDEXMEMWBIF=命令を読むID=解釈EX=計算MEM=メモリWB=書き戻し命令を重ねて流し込むと「1クロックごとに1命令完了」に近づく

スーパースカラを理解するには、まずパイプラインの仕組みを押さえておく必要があります。パイプラインとは、1命令の処理を複数の段階(ステージ)に分け、流れ作業で複数の命令を同時進行させる技術です。

なぜ流れ作業にするのか。1命令を終わらせてから次の命令を始めるより、先の命令が次のステージへ進んだ瞬間に後の命令を最初のステージに流し込んだほうが、全体としての処理量が増えるからです。工場の組み立てラインで「前の製品がベルトを進んだら、次の製品を投入する」のと同じ発想です。
IF(Instruction Fetch):命令をメモリから読み込む
ID(Instruction Decode):命令の意味を解釈する
EX(Execute):計算を実行する
MEM(Memory access):メモリへの読み書きをする
WB(Write Back):結果をレジスタに書き戻す

パイプラインが「1本の流れ作業」なら、スーパースカラはその流れ作業ラインを並べて複数本にしたものです。上のツールで「通常(1本)」と「スーパースカラ(2本)」を比べると、タイムライン表の行が2倍になり、同じクロックで2命令が並んで進むのが分かります。

⚠️
ハザードとは — スーパースカラの限界

命令1: A を計算中命令2: A を使う → 待ちデータハザード命令1の結果が出るまで命令2は待たされる依存がある命令は並べて実行できない

スーパースカラは複数の命令を同時に実行できますが、すべての命令を並べられるわけではありません。実際にはハザード(hazard)=「衝突・障害」と呼ばれる問題があり、これがスーパースカラの限界を決めます。

ハザードには主に3種類あります。
データハザード:命令Bが命令Aの計算結果を使う(A が終わるまで B を始められない)
制御ハザード:「条件によって次の命令が変わる」分岐命令(どちらへ進むか決まるまで次を読めない)
構造ハザード:2命令が同じ装置(例:メモリ読み書き回路)を同時に使おうとする

なぜスーパースカラの実際のIPCは理論値より低いのか。それはこのハザードのせいで、常に全パイプラインを埋め続けることができないからです。依存する命令が多いプログラムでは、片方のパイプラインが「待ち」になり、結果として 2本あっても IPC が 1.5 前後にとどまることもあります。CPUメーカーはこれを減らすために、依存のない命令を探して並べ替える(アウトオブオーダー実行)などの工夫を重ねています。

関連コンテンツ