CPUの回路は、複数の回路ブロックを直列につないだパイプラインと呼ばれる構造をとっています。
いま、メモリから足し算の命令がCPUに読み込まれたとしましょう。すると、CPUの内部ではパイプラインの先頭に命令が投入されて、命令がパイプラインの中を流れながらいろいろな処理が行われ、最後に計算結果の値がパイプラインから出てくるのです。
このページでは、次の4つのことを図解します。
1.パイプラインの基本的な働き
2.パイプラインの段数を増やすと動作周波数を上げられる理由
3.条件分岐命令とプログラムの流れ
4.パイプラインの段数が増えた場合のデメリット
1.パイプラインの基本的な働き
単純なCPUでは、1つの命令が、フェッチ、デコード、実行、ライトバックの4つのステージを通って実行されます。それぞれのステージでは、1つの命令の処理が終わったら、休むことなく次の命令の処理にとりかかります。
それぞれのステージの回路が1クロックで処理を終えるとすると、1つの命令の実行には4クロックかかることになります。しかし、パイプラインは流れ作業で命令を実行することに注意してください。もしあなたがパイプラインの出口付近に立っていれば、1クロックごとに1命令の実行が完了してパイプラインから命令の処理結果が流れてくるところを目撃できるでしょう。
2.スーパーパイプライン
作業を細分化して、パイプラインのステージ数を増やしたのがスーパーパイプラインです。各ステージの処理時間が短くなるため、より高い周波数のクロックでの動作が可能であり、結果として処理スピードが向上します。
Pentium 4では、パイプラインを20〜30ステージに細分化することで、3GHz以上の高クロック動作を実現しました。
3.分岐命令
あらゆる種類のプログラムは、多数の命令を組み合わせて作られています。1+1を計算するような、非常に単純なプログラムであれば、数個の命令を直線的に並べるだけでできます。この場合は、すべての命令がパイプラインを滞りなく流れて行き、計算の答えが求まります。
しかし、ちょっとしたプログラムであれば、計算途中の状況に応じてプログラムの流れを変更する、条件分岐命令を数多く含んでいます。PCのプログラムが、高度で知的な処理を行えるのは、分岐命令のおかげです。
条件分岐命令にもいくつかの種類がありますが、たとえばjzという命令は、「直前に実行した演算の結果が0ならば、プログラムの流れを変えて別のアドレスにジャンプする。演算の結果が0でない場合はジャンプしない(後続の命令の実行に進む)」という働きをします。
プログラムにもよりますが、平均して10命令に1つ以上の条件分岐命令が含まれると言われます。
4.分岐ミスとペナルティ
実行中のプログラムに条件分岐命令が出てくると、そこからプログラムの流れは2つに分かれます。どちらに進むかは、条件分岐命令の処理がパイプラインの最後まで来ないと決まりません。それまで続く命令の処理を止めておくのはもったいないので、分岐しそうな方向を予想して、そちらの命令をパイプラインに投入して処理を進めてしまいます。Pentiumシリーズには、こうした分岐予測機能が実装されています。分岐予測機能により、分岐先の確定に先行して命令を実行することを投機実行といいます。
分岐予測の仕組みは単純で、各分岐命令について過去数回の分岐履歴を記録します。たとえば過去4回続けて分岐が発生していれば、次も分岐する可能性が非常に高いというわけです。
Pentium 4の分岐予測の的中率は、実に95%以上と言われますが、5%程度は外れるわけです。予想が外れた場合は、処理を進めていたパイプライン上にある命令をすべてフラッシュ(破棄)して、正しい分岐先から命令の処理をやり直します。
下図ではパイプラインのステージ数を8個で描いています。分岐ミスが判明してから、7クロックの間はパイプラインから処理結果が出てきません。CPUの外からは、7クロックの間CPUの動作が停止したように見えるでしょう。これが分岐予測ミスに伴うペナルティです。このペナルティは、パイプラインのステージ数が多いほど重くなります。
Copyright © ITmedia, Inc. All Rights Reserved.