パイプライン処理による性能向上効果

命令フェッチからレジスタ書き込みまで5サイクルの処理をパイプラインを使わず実行すると、1サイクルあたりに実行できる命令数(IPC:Instruction Per Cycle)は平均的には0.2命令であるが、理想的なパイプライン処理ができれば、これが1.0命令となり、5倍に性能が向上する。しかし、各種のハザードがあるので、毎サイクル新しい命令を実行することはできず、これほどの性能向上は得られない。

資源の増強で構造ハザードを解消し、バイパスでデータハザードを解消したとしても、制御ハザードは残る。典型的に5命令に1命令の分岐命令があるとすると、図4.12のように分岐命令が出てくると分岐方向が確定するまで待ち、常に4サイクルのロスが発生する設計では、9サイクルで5命令の実行となり、制御ハザードによりIPCは0.56命令になってしまう。

そして、分岐命令で分岐する確率が1/2とすると、図4.13のような制御を行うと、平均的ロスは2.5サイクルとなりIPCは0.67命令に向上する。

そして、図4.14のようにアグレッシブに実行して分岐が起こる場合はパイプラインフラッシュすると、ロスは2サイクルとなりIPCは0.71命令まで向上する。さらに、ディレードブランチを使うと、分岐する場合でも5命令の実行に8サイクル、分岐が無い場合は5サイクルであり、平均的には6.5サイクルで5命令が実行でき、IPCは0.77まで改善する。ただし、これはDelay Slotに有効な命令を入れることができるという場合であり、有効に実行できる命令がなくてNOP(ノーオペレーション)命令しか入れられない場合は図4.14と同じ0.71命令まで低下する。

筆者の経験では、もう少し良いかと思うが、ヘネパタ本では、Delay Slotの有効利用率は50%~60%と書かれており、まあ、60%の有効利用率とすると、IPCは0.75命令/サイクルとなり、この辺りがパイプライン制御で達成できる最大値である。

この制御方式によるIPCの違いを図示すると、次のようになる。

図4.18 各種の分岐制御方式と1サイクルあたりの平均実行命令数(ただし、構造ハザードとデータハザードがすべて解消された場合)

また、ここで述べたケースではパイプラインの長さが5サイクルであるので、分岐があっても最大4サイクルのストールで済んでいるが、パイプラインの長さが長くなると、ほぼ、それに比例してストールサイクル数が増加する。したがって、NetburstアーキテクチャのPentium 4のような30段もある長いパイプラインのプロセサでは、制御ハザードはより大きな性能低下要因となる。