キャッシュミスによるプロセッサ ストール
パイプラインを忙しく保つには、最初の命令がパイプラインを完全に通過する前に、プロセッサが2番目の命令を実行し始める必要があります。ここで、次のように、3つの数の合計操作を必要とする命令があると考えてください。
X = A + B + C
AとBは既にプロセッサによりそれぞれレジスタに格納されているが、Cはメモリから取得しなければならない場合にはどうなるでしょうか。この場合、「バブル」と呼ばれるパイプライン
ストールが起きます。メモリからCの値を取得してくるまで、プロセッサは命令を実行できません。このバブルはパイプラインの前段階にわたって伝わり、バブルのある各ステージでアイドル状態を発生させ、そのクロックサイクルの間、実行リソースを無駄にします。
明らかに、パイプラインが長いほどこの問題は深刻になります。
【分岐予測失敗によるプロセッサ ストール 】
ある命令が別の命令に依存していることによるプロセッサ ストールもよく発生します。プログラムにIF... THENループのような分岐がある場合、プロセッサには2つの選択肢があります。決め手となる命令が終了するまで、採用するプログラム分岐を決定しない(パイプラインはストールする)か、プログラムが採用する分岐を予測するかです。
プロセッサによるコード分岐予測が誤りだった場合は、パイプラインをフラッシュして、正しい分岐を使用してIF... THEN文からやり直す必要があります。パイプラインが長くなるほど、分岐予測の失敗によるパフォーマンスへの影響も大きくなります。たとえば、パイプラインが長くなれば、予測が外れたときに破棄するべき命令の実行も増えます。
【Xeon】
Intelが文書で述べているように、Xeonで使われたNetBurstアーキテクチャでは、業界トップのクロックレートを可能にする、深いパイプラインが実現されています
。言い替えれば、Intelは実際のクロック速度を高くできるようにプロセッサを設計していますXeonファミリプロセッサの最新バージョンでは31段の整数パイプラインが使用されており、2つの「高速」演算装置(ALU)、1つの「低速」ALU、2つのアドレス生成ユニット(AGU)、および2つの浮動小数点実行ユニットが搭載されています(図4)。Xeonでは、長いパイプラインにより、最大3.6GHzの周波数で動作可能です。
こうした長いパイプラインの欠点を補う方法としてIntelが採用した方法の1つは、実行トレースキャッシュと呼ばれる12KBの命令キャッシュです。Intelは、この12Kキャッシュのヒット率が従来の8〜16KBの命令キャッシュに近いと報告しています10 。このキャッシュは命令を翻訳、デコードして、トレース(ミニプログラムのようなもの)に入れます。L1キャッシュがヒットするとプロセッサはそのトレースを実行します。その特定のトレースを実行する場合に毎回命令を翻訳、デコードする必要はありません。メインのパイプラインがする作業の量をその分減少させることができます。さらに、実行トレースキャッシュにはそれ自身の分岐予測アルゴリズムがあり、翻訳されたマイクロ命令を投機的な順序で格納することができます。 |