Kota's Blog

パイプライン処理と高速化

2021-01-14 Computer Science

最近、基本情報技術者試験の勉強をする中でパイプライン処理について少し調べたので備忘録的に書き残しておきます。Zennに書こうとも思いましたがあっちにはもっと有益な記事だけ残していきたいのでしょうもない備忘録はこっちに書きます。

パイプライン処理ってなに?

パイプライン処理とは、CPUが複数の命令を実行段階をずらしながら同時並行的に実行することでスループットの向上を目指すという処理方式のことです。ここでいう実行段階とは、

  1. 実行プログラムをメモリからレジスタに読み込む命令フェッチ
  2. 実行プログラムを解析して実行準備を行う命令デコード
  3. CPUの演算ユニットで実際に演算を行う実行
  4. 演算結果をメモリに書き込むライトバック

の4段階に分かれます。もっと細かく分ける場合もありますがとりあえずこの4ステップということにしておきます。
従来の原始的なCPUの処理であれば、この4段階を順番に実行し、一つの命令が完了したら次の命令に移るという逐次処理を行うのですが、命令が複雑になるにつれそれではスループットが大幅に低下し処理性能が落ちてしまいます。そこで考案されたのがパイプライン処理です。パイプライン処理ではこの4段階を一つずつずらして並列処理を行うことで、従来の処理よりも高速に、複数の命令の実行を可能にしたのです。
pipeline-processing
Uploaded by Jean-Christophe Le Lann - researchgate.net

スーパー・パイプライン

上記のパイプライン処理より高速なスループットを実現するのがスーパー・パイプラインという処理方式です。スーパー・パイプラインでは、上記のパイプライン処理で4分割したステップのそれぞれをさらに2分割することで各ステップの処理をさらに単純化し、通常のパイプライン処理よりももっと高速な並列処理を実現しようという方式です。

スーパースカラー

スーパー・パイプラインと並んで通常のパイプライン処理を強化するもう一つの方法がスーパースカラーです。スーパースカラーはパイプライン処理を行うCPU等のプロセッサを複数動作させることで、ハードウェアレベルでスペックを上げてスループットを上げるという処理方式です。言うたら人海戦術です。ただスーパースカラーの場合、片方の演算結果をもう片方の演算に利用する場合等必ずしも同時にデコードされた複数の命令を並列に実行できないこともあるため、単純にプロセッサーが2倍になったからといって処理性能が2倍になるわけではありません。

パイプライン・ハザード

このパイプライン処理によってCPUの処理性能は大幅に上がったわけですが、従来のCPUでは起こり得なかったパイプライン・ハザードという問題が浮かび上がりました。
パイプライン・ハザードとは、主に依存関係のある命令同士で発生する、ある命令がライトバックを行わないうちに後続の命令がそのレジスタを読み込みに行ってしまう場合などのエラーです。これが起きると、理想的なパイプライン処理の場合1になるはずのCPI(Cycles Per Instruction)が大きくなる、つまりスループットが大幅に低下することになります。

このパイプライン・ハザードを防ぐために分岐予測やNop代入などさまざまな方法があるのですが、それについてはまた後ほど書きたいと思います