(57)【要約】制御スペキュレーションの性能を向上するメカニズムが開示されている。そのメカニズムは、スペキュレーティブロードを実行するステップと、そのスペキュレーティブロードがキャッシュでヒットしたとき、前記スペキュレーティブロードによりターゲットとされたレジスタのデータ値を返すステップと、前記スペキュレーティブロードが前記キャッシュでミスしたとき、遅延トークンを前記スペキュレーティブロードと関連づけるステップとを有する。前記スペキュレーティブロードが後で制御フローパスにあると決定されたとき、リカバリーコードの実行を速めるために、キャッシュミスにプリフェッチを発行する。
2006511867.tif 000002
【特許請求の範囲】
【請求項１】
スペキュレーティブロードを処理する方法であって、
前記スペキュレーティブロードを発行するステップと、
前記スペキュレーティブロードがキャッシュでヒットしたとき、前記スペキュレーティブロードによりターゲットにされたレジスタにデータ値を返すステップと、
前記スペキュレーティブロードがキャッシュでミスしたとき、前記ターゲットにされたレジスタを遅延トークンでタグするステップを有する方法。
【請求項２】
請求項１に記載の方法であって、
前記スペキュレーティブロードが前記キャッシュでミスしたとき、プリフェッチを発行するステップをさらに有することを特徴とする方法。
【請求項３】
請求項２に記載の方法であって、
前記プリフェッチ命令を発効するステップは前記スペキュレーティブロードをプリフェッチに変換するステップを有することを特徴とする方法。
【請求項４】
請求項１に記載の方法であって、
前記ターゲットにされたレジスタにタグするステップは、
前記スペキュレーティブロードの示されたキャッシュレベルを前記キャッシュのレベルと比較するステップと、
前記レベルがマッチしたとき、前記ターゲットにされたレジスタをタグするステップとをさらに有することを特徴とする方法。
【請求項５】
請求項１に記載の方法であって、
前記遅延トークンはビット値であり、
前記ターゲットにされたレジスタをタグするステップは、前記ターゲットにされたレジスタに関連するビットフィールドをビット値に設定するステップを有する方法。
【請求項６】
請求項１に記載の方法であって、
前記遅延トークンは第１の値であり、
前記ターゲットにされたレジスタをタグするステップは、前記第１の値を前記ターゲットにされたレジスタに書き込むステップを有することを特徴とする方法。
【請求項７】
請求項１に記載の方法であって、
前記ターゲットにされたレジスタをタグするステップは、キャッシュミス遅延が起こる可能性があり、前記スペキュレーティブロードが前記キャッシュでミスしたとき、前記ターゲットにされたレジスタを遅延値でタグするステップを有することを特徴とする方法。
【請求項８】
請求項１に記載の方法であって、
前記スペキュレーティブロードが必要なとき、前記遅延トークンをチェックするステップと、
前記遅延トークンを検出したとき、制御をリカバリルーチンに移すステップとをさらに有することを特徴とする方法。
【請求項９】
キャッシュと、
レジスタファイルと、
実行コアと、
前記実行コアにより処理される命令を格納するメモリとを有するシステムであって、
前記命令は、
前記キャッシュへのスペキュレーティブロードを発行し、
前記スペキュレーティブロードが前記キャッシュでミスしたとき、前記スペキュレーティブロードによりターゲットにされた前記レジスタファイル内のレジスタをタグすることを特徴とするシステム。
【請求項１０】
請求項９に記載のシステムであって、前記レジスタは、前記スペキュレーティブロードが前記キャッシュでミスしたことに応じて、第１の値を関連ビットに書き込むことによりタグされることを特徴とするシステム。
【請求項１１】
請求項９に記載のシステムであって、前記レジスタは、前記スペキュレーティブロードが前記キャッシュでミスしたことに応じて、第２の値を前記レジスタに書き込むことによりタグされることを特徴とするシステム。
【請求項１２】
請求項９に記載のシステムであって、
前記スペキュレーティブロードが前記キャッシュでミスしたとき、前記スペキュレーティブロードによりターゲットにされたアドレスへのプリフェッチを発行するために、前記格納された命令は前記実行コアにより処理されることを特徴とするシステム。
【請求項１３】
請求項９に記載のシステムであって、
前記キャッシュは少なくとも第１のレベルのキャッシュと第２のレベルのキャッシュとを含み、
前記スペキュレーティブロードが前記第１のレベルのキャッシュと前記第２のレベルのキャッシュの特定された１つでミスしたとき、前記ターゲットにされたレジスタがタグされることを特徴とするシステム。
【請求項１４】
請求項９に記載のシステムであって、
キャッシュミス遅延メカニズムが起動され、前記スペキュレーティブロードが前記キャッシュでミスしたときに、前記スペキュレーティブロードによりターゲットとされた前記レジスタファイルがタグされることを特徴とするシステム。
【請求項１５】
プロセッサにより実行可能な命令を格納した機械読み取り可能媒体であって、
前記命令は、
第１のスペキュレーティブ動作を実行するステップと、
前記スペキュレーティブ動作がマイクロアーキテクチャイベントをトリガするとき、遅延トークンを前記第１のスペキュレーティブ動作に関連づけるステップとを有する方法を実施するものであることを特徴とする機械読み取り可能媒体。
【請求項１６】
請求項１５に記載の機械読み取り可能媒体であって、
前記第１のスペキュレーティブ動作はスペキュレーティブロード動作であり、
前記マイクロアーキテクチャイベントはキャッシュでのミスであることを特徴とする機械読み取り可能媒体。
【請求項１７】
請求項１６に記載の機械読み取り可能媒体であって、
前記遅延トークンを関連づけるステップは、前記スペキュレーティブロード動作が前記キャッシュでミスし、キャッシュミス遅延がイネーブルされたとき、前記遅延トークンを前記スペキュレーティブロード動作と関連づけるステップを有することを特徴とする機械読み取り可能媒体。
【請求項１８】
請求項１６に記載の機械読み取り可能媒体であって、
前記方法は、前記遅延トークンを前記スペキュレーティブロード動作と関連づける前に、遅延メカニズムがイネーブルされているかどうかを決定するために制御レジスタを読み出すステップをさらに有することを特徴とする機械読み取り可能媒体。
【請求項１９】
請求項１８に記載の機械読み取り可能媒体であって、
前記方法は、
前記スペキュレーティブ動作に応じて第２のスペキュレーティブロード動作を実行するステップと、
遅延トークンが前記スペキュレーティブロード動作と関連づけられている時、遅延トークンを前記第２のスペキュレーティブ動作と関連づけるステップとを有することを特徴とする機械読み取り可能媒体。
【請求項２０】
請求項１６に記載の機械読み取り可能媒体であって、
前記スペキュレーティブロード動作が前記キャッシュでミスしたとき、前記スペキュレーティブロード動作によりターゲットにされたアドレスにプリフェッチ要求を発行するステップをさらに有することを特徴とする機械読み取り可能媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコンピューティングシステムに関し、特にコンピューティングシステムにおけるスペキュレーティブ実行をサポートするメカニズムに関する。
【背景技術】
【０００２】
制御スペキュレーションは、一部の先進的コンパイラにより使用された、命令の実行をより効率的にスケジュールするための最適化方法である。この方法により、プログラムの動的制御フローが、命令が必要とされるプログラム中のポイントに来る前に、コンパイラはその命令の実行をスケジュールすることができる。命令コードシーケンス中に条件付きブランチがあると、その扱いはランタイムにならないとはっきりとは決められない。
【０００３】
ブランチ命令は、関連するブランチ条件の正否に応じて、２以上の実行パスの内の１つにプログラムの制御フローを移す。ランタイムにブランチ条件の正否が決まるまで、プログラムが進む実行パスは確実には決まらない。これらのパスの１つの命令は、ブランチ命令により「ガードされている（guarded）」という。制御スペキュレーションをサポートするコンパイラは、これらのパスの命令をガードしているブランチ命令に先立ち、その命令をスケジュールすることができる。
【０００４】
制御スペキュレーションは、一般的に、長い実行レイテンシを有する命令に使用される。制御フローよりも早く、すなわち、これらの命令を実行する必要があるかどうかを知る前に、これらの命令の実行をスケジュールすれば、その実行を他の命令の実行とオーバーラップさせることにより、そのレイテンシを緩和することができる。制御スペキュレーションがなされた命令によりトリガされた例外条件は、制御フローが実際にその命令に到達したと分かるまで、遅延される。制御スペキュレーションにより、コンパイラはより多くの命令を並行して実行することができる。制御スペキュレーションにより、コンパイラは、高度の命令レベルパラレリズム（ILP）のためにプロセッサにより提供される大きな実行リソースをよりうまく使用することができる。
【０００５】
この有利な点にもかかわらず、制御スペキュレーションによりマイクロアーキテクチャは複雑になり、不要かつ予期せぬ性能ロスを引き起こすことがある。例えば、一定の条件下、キャッシュでスペキュレーションロード動作がはずれたとき、スペキュレーティブロードが必要ないと決定されても、プロセッサは数十から数百のクロックサイクルを無駄にしてしまう。
【０００６】
制御スペキュレーションをしたコードについてのこの種のマイクロアーキテクチャイベントの頻度とインパクトは、キャッシュポリシー、ブランチ予測精度、キャッシュミスレイテンシ等の要因に依存する。これらの要因は、システムにより異なり、実行される具体的なプログラム、そのプログラムを実行するプロセッサ、プログラム命令にデータを届けるメモリヒエラルキーに依存する。この可変性により、大規模なテストと分析をしなければ制御スペキュレーションの利益を享受することは、不可能ではなくても困難になる。性能低下の可能性が大きく、その性能低下が起こる条件を予見することが難しいので、制御スペキュレーションはそれほど使用されていない。
【０００７】
本発明は制御スペキュレーションに関連する上記その他の問題を解決するものである。
[発明の詳細な説明]
【０００８】
本発明を十分に理解してもらうために多数の具体的な詳細についても説明する。しかし、当業者には、この開示の利益により、本発明はこれらの具体的な詳細がなくとも実施できることが明らかであろう。また、本発明の特徴（features）に注意を集中するため、様々な周知の方法、手続、コンポーネント、回路については説明していない。
【０００９】
図１は、本発明を実施するために好適なコンピューティングシステムの一実施形態を示すブロック図である。システム１００は、１以上のプロセッサ１１０、メインメモリ１８０、システムロジック１７０、および周辺デバイス１９０とを含む。プロセッサ１１０、メインメモリ１８０、ペリフェラルデバイス１９０は、通信リンクを介してシステムロジック１７０と結合している。この通信リンクは、例えば、シェアードバスやポイント・ツー・ポイントリンク等である。システムロジック１７０は、システム１００の様々なコンポーネント間のデータの転送を管理する。システムロジック１７０は図示したように分離したコンポーネントであってもよいし、その一部はプロセッサ１１０やシステムのその他のコンポーネントに組み込まれていてもよい。
【００１０】
開示したプロセッサ１１０の実施形態は、実行リソース１２０、１以上のレジスタファイル１３０、第１と第２のキャッシュ１４０、１５０、キャッシュコントローラ１６０を含む。キャッシュ１４０、１５０とメインメモリ１８０は、システム１００のメモリヒエラルキーを形成する。以下の説明では、メモリヒエラルキーのコンポーネントはその応答レイテンシに従って高いまたは低いものと考える。例えば、キャッシュ１４０は、（高レベル）キャッシュ１５０よりも速くデータを返すので、低レベルキャッシュであると考える。本発明の実施形態はシステム１００のコンポーネントの具体的な構成やメモリヒエラルキーの具体的な構成には限定されない。他のコンピューティングシステムは、例えば、異なるオンチップおよびオフチップ構成で、異なるコンポーネントや異なるキャッシュ数を利用してもよい。
【００１１】
動作中に、実行リソース１２０は実行しているプログラムから命令を実施する。命令はレジスタファイル１３０から提供されたデータ（オペランド）、またはメモリヒエラルキーの様々なコンポーネントからバイパスされたデータ（オペランド）に作用する。オペランドデータは、ロード命令およびストア命令により、それぞれレジスタファイル１３０に、またはレジスタファイル１３０から転送される。一般的なプロセッサの構成では、ロード命令はデータがキャッシュ１４０にあれば１または２クロックサイクルで実行することができる。ロードがキャッシュ１４０でミスしたとき、要求がヒエラルキー中の次のキャッシュ（例えば、図１のキャッシュ１５０）に送られる。一般に、要求は、データが見つかるまで、メモリヒエラルキーの次のキャッシュに転送される。要求されたデータがどのキャッシュにも格納されていなければ、メインメモリ１８０から提供される。
【００１２】
上で説明したようなメモリヒエラルキーは、使用されるであろうデータを実行リソース（例えば、キャッシュ１４０）により近い場所に格納するキャッシングプロトコルを利用する。例えば、ロードと、そのロードにより返されたデータを使用するアド（add）は、ロードがキャッシュ１４０でヒットすれば３クロックサイクルで完了する。例えば、ロードに２サイクル、アドに１サイクルである。一定の条件の下、制御スペキュレーションにより、その３クロックサイクルのレイテンシは他の命令の実行のかげに隠れてしまう。
【００１３】
命令シーケンス（I）と（II）は、それぞれ、スペキュレーション実行のために修正される前と後のコードサンプルを示す。どちらのコードシーケンスにも明示的には示さなかったが、ロードとアドはキャッシュからデータをロードするために必要なクロックサイクル数を反映する期間だけ離れていると仮定した。例えば、ロードがキャッシュ１４０からデータを返すために２クロックサイクル要するとき、コンパイラは、不必要な停止（stall）を避けるために、アドを２または３クロックサイクル後に実行するようにスケジュールする。
【００１４】
【数１】
2006511867.tif 000003
【００１５】
シーケンス（I）について、比較命令（cmp.eq）は述語値（p1）の真偽を決定する。（p1）が真の時、ブランチ（br.cond）がされ（「TK」（taken））、制御フローはBR-TARGETにより表されるアドレスの命令に転送される。この場合、ロード（ld）は、br.condに続くアド（add）とストア（st）により、実行されない。（p1）が偽の時、ブランチはされず（「NT」（not  taken））、制御フローは「失敗に終わり」ブランチに続く命令に進む。この場合、br.condに順に続くld、add、stが実行される。
【００１６】
命令シーケンス（II）は、制御スペキュレーションをサポートしたコンパイラにより修正されたコードサンプルである。
【００１７】
【数２】
2006511867.tif 000004
【００１８】
コードシーケンス（II）について、ロード動作（ld.sで表す）はスペキュレーティブであり、その理由はコンパイラがそのロード動作をその実行（br.cond）をガード（guard）するブランチ命令の前に実行するとスケジュールしているからである。従属するアド命令はブランチの前にスケジュールされており、チェック動作chk.sがbr.condの次に挿入されている。下で説明するように、chk.sはプロセッサにスペキュレーションで実行されたロードによりトリガされた例外条件をチェックする。
【００１９】
コードシーケンス（II）のスペキュレーティブロードとそれに従属するアドは、シーケンス（I）のスペキュレーティブでないものより早く実行することができる。スペキュレーティブロードとそれに従属するアドをブランチの前の命令と並行して実行するようにスケジューリングすることにより、並行して実行される命令のレイテンシの陰にそれらのレイテンシを隠すことができる。例えば、ロード命令とアド命令の結果は、メモリ位置[r2]のデータがキャッシュ１４０にあれば、３クロックサイクルで準備完了となる。制御スペキュレーションにより、この実行レイテンシはブランチに先行する他の命令のレイテンシとオーバーラップする。このため、コードシーケンス（II）の実行に必要な時間は３クロックサイクルだけ減少する。チェック動作はコードシーケンス（II）に追加的クロックサイクルを付加せずにスケジュールできる（例えば、stと並行して）と仮定すると、制御スペキュレーションからの静的ゲインは、この場合３クロックサイクルである。
【００２０】
コードシーケンス（II）により例示された静的ゲインは、様々なマイクロアーキテクチャイベントにより、ランタイムに実現するかも知れない。上で注意したように、ロードレイテンシは、要求されたデータが見つかるメモリヒエラルキーのレベルに敏感である。図１のシステムについて、ロードは要求されたデータが見つかるメモリヒエラルキーの最低レベルから満たされる。データがより高いレベルのキャッシュやメインメモリにしかなければ、そのデータが必要なくても、制御スペキュレーションにより性能を悪化させる停止（stalls）がトリガされる。
【００２１】
テーブル１は、ブランチおよびキャッシュの異なるシナリオの下で、コードシーケンス（II）の性能をコードシーケンス（I）の性能と比較してまとめたものである。制御スペキュレーションにより３クロックサイクルのゲインと、キャッシュ１４０におけるミス（キャッシュ１５０により満たされる）による１２クロックサイクルのペナルティを仮定して、制御スペキュレーションにより提供される相対的ゲイン／ロスが示されている。
【００２２】
【表１】
2006511867.tif 000005
【００２３】
最初の２つのエントリは、ブランチがNTの時、すなわちスペキュレーションされた命令が実行パスにあるときの相対的ゲイン／ロスを示している。スペキュレーションされたロード動作がキャッシュでヒット（hit）またはミス（miss）したとき（エントリ１と２）、制御スペキュレーションはスペキュレーションされていないコードシーケンスより３クロックサイクルの静的ゲインを提供する（例えば、ロードにより２サイクル、アドにより１サイクル）。両方のコードシーケンスでロードとアドが２クロックサイクル離れていると仮定して、ロードがキャッシュでミスした後、アドは２クロックサイクルの停止をトリガする。１０クロックサイクル（12-2）の正味停止（net  stall）が両方のコードシーケンスで、スペキュレーションを有するNTブランチの前と、スペキュレーションを有しないNTブランチの後に生じる。
【００２４】
テーブル１の次の２つのエントリは、ブランチがTKの場合のゲイン／ロスの結果を示す。これらのエントリについて、プログラムはスペキュレーションされた命令により提供される結果を必要とない。ロード動作がキャッシュ（エントリ３）でヒットしたとき、スペキュレーションされていない場合と比べて制御スペキュレーションは提供するゲインはない。なぜなら、スペキュレーションで実行された命令により返される結果は必要ないからである。不必要な結果を３クロックサイクル早く返しても利益はない。
【００２５】
ロード動作がキャッシュでミスしたとき、制御スペキュレーションシーケンス（エントリ４）は、スペキュレーション無しのシーケンスと比較して１０クロックサイクルのペナルティ（ロス）を被る。制御スペキュレーションをしたシーケンスがペナルティを被るのは、ブランチ命令（TK）を評価する前にロードとアドを実行するからである。スペキュレーション無しのシーケンスはキャッシュミスとその後の停止（stall）を避ける。ロードとアドをTKブランチで実行しないからである。スペキュレーションされた命令（ld.s、add）により返された結果は必要ないが、TKブランチの前のキャッシュミスの制御スペキュレーションにより生じる相対的ロスは、１０クロックサイクルのペナルティである。スペキュレーションによるロードが高レベルキャッシュでミスし、データがメモリから返されたとき、ペナルティは数百クロックサイクルになることもある。
【００２６】
制御スペキュレーションにより得られる利益は、ブランチ方向（TK/NT）、キャッシュミス頻度、キャッシュミスペナルティの大きさに依存する。キャッシュヒットレートが特定構成閾値（例えば、約80%）より大きくない限り、不要な停止（stalls）に関連したペナルティが、例示したコードシーケンスの潜在的利益（NTブランチ時のキャッシュヒットに対して３クロックサイクルの静的ゲイン）を上回ってしまう。キャッシュミスペナルティが大きいと、キャッシュヒットレートは長い停止（stall）をオフセットするため相応に大きくなければならない。ブランチが高い確率でNTであると予測できるときには、キャッシュヒットレートはそれほど重要ではなくなる。この場合、いずれのコードシーケンスにおいても停止（stall）が発生するからである。一般に、ブランチ方向（TK/NT）とキャッシュヒットレートに関する不確定性により、制御スペキュレーションの利益評価は困難になり、不要な命令に対してキャッシュミスをすることに関連する大きなペナルティ（上の例では９クロックサイクルより大きい）により、プログラマーは制御スペキュレーションの利用に慎重になったり、制御スペキュレーションを全く利用しなかったりする。
【００２７】
本発明の実施形態は、制御スペキュレーションの使用による性能ロスを限定するメカニズムを提供するものである。一実施形態について、スペキュレーティブロードのキャッシュミスは、遅延メカニズムを通じて処理される。キャッシュミス時、トークンをスペキュレーティブロードによりターゲットにされたレジスタと関連づける。スペキュレーションされた命令が実際に必要なとき、キャッシュミスはリカバリールーチンを通じて処理される。リカバリールーチンの実行を速めるために、必要であれば、キャッシュミスに応じてプリフェッチ要求が発行されてもよい。いかなるキャッシュミスや特定のキャッシュレベルのミスに対して、遅延メカニズムを使用してもよい。
【００２８】
図２は、スペキュレーティブロードによりキャッシュミスを処理する、本発明による方法２００の一実施形態を示すフローチャートである。方法２００は、ステップ２１０でスペキュレーティブロードを実行するところから始まる。ステップ２２０でスペキュレーティブロードがキャッシュでヒットすると、ステップ２６０で方法２００は終了する。ステップ２２０でスペキュレーティブロードがキャッシュでミスすると、ステップ２３０で遅延処理のためのフラグを立てる。遅延処理とは、その後ステップ２４０で、スペキュレーティブロードの結果が必要であると判断されたときのみ、キャッシュミスを処理するのに必要なオーバーヘッドが生じることを意味する。必要な場合、ステップ２５０でリカバリーコードが実行される。必要なければ、ステップ２６０で方法２００は終了する。
【００２９】
一実施形態において、ノンスペキュレーティブ命令がタグされたレジスタを参照したとき、遅延されたキャッシュミスがリカバリをトリガする。これはスペキュレーティブロードの結果が実際に必要なときにのみ発生するからである。ノンスペキュレーティブ命令は、遅延トークンがあるかどうかレジスタをテストするチェック動作であってもよい。以下でもっと詳しく説明するように、そのトークンはスペキュレーティブ命令の遅延例外を知らせるものであってもよい。その場合、例外遅延メカニズムは、上で説明したキャッシュミスの例等のマイクロアーキテクチャイベントを処理するために修正される。
【００３０】
コードシーケンス（II）を参照して遅延例外メカニズムを説明する。上で注意したように、ブランチに続くチェック動作（chk.s）は、スペキュレーティブロードが例外条件をトリガしたかどうかを決定するために使用される。一般に、例外は比較的複雑なイベントであり、プロセッサに実行中のコードシーケンスを中断させ、一部の状態変数を保存し、オペレーティングシステムや様々な例外処理ルーチン等の低レベルソフトウェアに制御を渡す。例えば、変換ルックアサイドバッファ（TLB）は、ロード動作によりターゲットにされた論理アドレスの物理アドレス変換を有していなかったり、ロード動作が非特権コードシーケンスから特権コードをターゲットにすることがある。これらの例外は、一般に、問題を解決するためにはオペレーティングシステムやその他のシステムレベルリソースによる介入を要する。
【００３１】
スペキュレーティブ命令により生じた例外は、その例外条件をトリガした命令の実行が必要か、例えば制御フローパスにあるかどうかが決定されるまで、一般には遅延される。遅延例外は、スペキュレーティブ命令によりターゲットにされたレジスタと関連づけられたトークンにより示される。スペキュレーティブ命令が例外をトリガしたとき、レジスタはトークンでタグされ、例外を生じた命令に依存するいかなる命令もそのデスティネーションレジスタを介してこのトークンを伝搬する。チェック動作に到達すると、chk.sはレジスタがトークンでタグされているかどうかを決定する。トークンを見つけると、スペキュレーティブ命令が正しく実行されず、例外処理がなされたことを示す。トークンが見つからなければ、処理を続ける。このように、遅延例外により、スペキュレーションにより実行された命令によりトリガされた例外のコストが、その命令が実行される必要があるときにのみ発生するようになる。
【００３２】
インテル（登録商標）のItanium（登録商標）プロセッサファミリーは、Not  A  Thing（NaT）と呼ぶトークンを用いて、遅延例外処理メカニズムを実施する。NaTはターゲットレジスタと関連する、例えばビット（NaTビット）である。そのターゲットレジスタは、スペキュレーティブ命令が例外条件をトリガしたとき特定の状態に設定され、例外条件をトリガしたスペキュレーティブ命令に依存する。NaTは、スペキュレーティブ命令が例外条件をトリガしたときにターゲットレジスタに書き込まれる、または例外条件をトリガしたスペキュレーティブ命令に依存する特定の値である。Itanium（登録商標）の整数および浮動小数点レジスタは遅延例外を示すためのNaTビットとNaT値をそれぞれ使用する。
【００３３】
本発明の一実施形態において、スペキュレーティブロード命令によるキャッシュミスを遅延処理するために例外遅延メカニズムを修正する。キャッシュミスは例外ではなく、プロセッサハードウェアが割り込みやオペレーティングシステムへの通知無しに処理するマイクロアーキテクチャイベントである。以下の説明においては、マイクロアーキテクチャイベントを示すために使用されるNaTは自発NaTと呼び、例外を示すNaTとは区別する。
【００３４】
テーブル２は、キャッシュミス遅延メカニズムを有しない制御スペキュレーションと比較した、キャッシュミス遅延メカニズムを有する制御スペキュレーションの性能ゲイン／ロスを示す図である。テーブル１と同様に、３クロックサイクルの静的ゲインと１２クロックサイクルのキャッシュミスペナルティを示し、アドは、２クロックサイクルのキャッシュレイテンシを説明するため、スペキュレーションによるロードの２クロックサイクル後に実行するとスケジュールされていると仮定する。
【００３５】
遅延メカニズムの相対的ゲインに影響する２つの要因は、ターゲットされたデータがキャッシュにあるかどうかを決定するクロックサイクル数（遅延ロス）と、NTブランチのキャッシュミスのイベントにおいてリカバリールーチンを実行するために必要なクロックサイクル数（リカバリーロス）である。テーブル２について、キャッシュ内にデータがあるかどうかはスペキュレーティブロードの２クロックサイクル以内に決定することができると仮定した。アドはロードの２クロックサイクル後に実行するとスケジュールされているから、この場合には追加的停止（stall）は生じなく、遅延ロスはゼロである。この判断に２クロックサイクル以上かかると、アドにより停止（stall）が生じ、これは遅延ペナルティとして現れる。リカバリーロスは１５クロックサイクルであると仮定する。
【００３６】
テーブル２は、開示されたキャッシュミス遅延メカニズムにより得られる相対的ゲイン（ロス）を示す。テーブル２で使われるペナルティ値はすべて例示のためだけに与えられたものである。下で説明するように、コスト／利益分析の結果は変わらなければ、異なる値であってもよい。
【００３７】
【表２】
2006511867.tif 000006
【００３８】
遅延メカニズムはキャッシュミスの時にのみ起動されるので、キャッシュでヒットするスペキュレーティブロードには性能インパクトはない。遅延を有さない制御スペキュレーションと比較して、遅延を有する制御スペキュレーションのゲインは、キャッシュヒット時にはゼロであり、ブランチのTK/NT状態には依存しない（エントリ１と３）。
【００３９】
遅延がある場合とない場合の制御スペキュレーションの相対的ゲインは、スペキュレーティブロードがキャッシュでミスした場合には明らかである。スペキュレーティブロードのキャッシュミスを遅延無しで処理すると、ブランチがNTかTKかに係わらず、１０クロックサイクルペナルティを生じる。上で注意したように、キャッシュミスは完全にはなくせないが、制御フローパスにないと後で分かるスペキュレーティブ命令によるキャッシュミスで、１０サイクルのペナルティが生じるのは特に無駄である。
【００４０】
スペキュレーティブロードのキャッシュミスを遅延処理する利益は、（もしあれば）遅延ペナルティーとリカバリーペナルティに依存する。テーブル２について、遅延処理については遅延ペナルティを評価していない。その理由は、キャッシュミスを検出するために必要なクロックサイクルの数は、スペキュレーティブロードと使用の間の遅れ、例えば、本実施例では２クロックサイクルよりも大きくないと仮定したからである。
【００４１】
ブランチがTKのとき、キャッシュミスの遅延処理は遅延ペナルティのみを生じ、上記の実施例ではゼロである。このように、TKブランチのキャッシュミスの遅延処理により、遅延なしのキャッシュミス処理と比較して１０クロックサイクルのゲインがある（エントリ４）。ブランチがNTのとき、スペキュレーションされた命令はプログラムフローに必要であり、遅延処理により１５クロックサイクルのリカバリーペナルティが生じる。例えば、キャッシュミスはリカバリーコードに制御を移すことにより処理される。そのリカバリーコードは、スペキュレーティブロードとこれに依存するいかなるスペキュレーティブ命令をも再実行する。このように、NTブランチのキャッシュミスの遅延処理は、遅延しない処理（エントリ４）と比較して１８クロックサイクルのロスを与える。この１８クロックサイクルには、chk.sによりトリガされたミスハンドラの１５サイクル、プラススペキュレーティブコードを繰り返すための３サイクルを含む。１２サイクルのキャッシュミスは相殺される。
【００４２】
一実施形態において、遅延メカニズムは、リカバリールーチンが起動されると（キャッシュミスとそれに続くNTブランチ）、ロードレイテンシを減らすためにプリフェッチ要求が発行される。プリフェッチ要求により、キャッシュミスが検知されるとすぐに、リカバリーコードが起動されるのを待つのではなく、メモリヒエラルキーからターゲットにされたデータが返される。これにより、プリフェッチのレイテンシはスペキュレーティブロードに続く動作のレイテンシとオーバーラップする。その後リカバリーコードが起動されると、データ要求を早く出しておいたので実行が速くなる。プリフェッチによりトリガされる例外を処理するコストを避けるため、ノンフォルト（non-faulting）プリフェッチを使用する。
【００４３】
例示したペナルティとゲインの値に対して、開示した遅延メカニズムを有する制御スペキュレーションと遅延メカニズム無しの制御スペキュレーションに関するプリフェッチの正味コスト／利益は以下の通りである。
【００４４】
NTブランチについて、(-15)-(3)+12=6サイクルロス／キャッシュミス
TKブランチについて、(0)-(-10)=10サイクルゲイン／キャッシュミス
このように、プリフェッチメカニズムを入れることにより、テーブル２のエントリ２が18サイクルから6サイクルになる。開示した遅延を有する制御スペキュレーションと組み合わせることによる正味利益はこのようにブランチの振る舞い、キャッシュミスの頻度、様々なペナルティ（リカバリ、停止（stall）、遅延）に依存する。例えば、遅延メカニズムにより得られる利益は、キャッシュミスペナルティが大きくて、キャッシュミス頻度が低いときに生じる。同様に、スペキュレーションされた命令をタグするペナルティ（遅延ペナルティ）とリカバリコードを実行するペナルティ（リカバリペナルティ）の合計が停止ペナルティより大きくないとき、キャッシュミス頻度等に係わらず、遅延メカニズムを使用した制御スペキュレーションは遅延メカニズムを使用しない制御スペキュレーションより性能がよくなる。
【００４５】
遅延ペナルティとリカバリペナルティの合計が停止ペナルティよりも大きいとき、トレードオフは、遅延ペナルティとそれが発生する頻度（キャッシュミスとそれに続くTKブランチ）に対するリカバリペナルティとそれが発生する頻度（キャッシュミスとそれに続くNTブランチ）に依存する。以下で説明するように、プロセッサデザイナーは、NTの場合にキャッシュミス遅延の負のポテンシャルがほぼゼロになることを保証するために、与えられたリカバリペナルティと遅延ペナルティについて、キャッシュミス遅延を実施する条件を選択することができる。キャッシュミスをいつ遅延するかという決定は、すべてのld.sに対して単一の発見的方法（heuristic）で、またはヒントを用いてロードベースで決定することができる。一般に、キャッシュミスレイテンシが長ければ長いほど、遅延メカニズムのマイナスのポテンシャルは小さくなる。キャッシュミス遅延を実施する適当なキャッシュレベルを選択することにより、このマイナス面はほぼ無くすことができる。
【００４６】
開示された遅延メカニズムにより提供されるコスト／利益の様々なパラメータ（例えば、キャッシュのミスレート等）への依存性や、ミスに関連した停止ペナルティのデータの後使用への依存性を与えられると、遅延メカニズムを起動するかどうかを柔軟に決めると便利である。一実施形態において、スペキュレーティブロードが特定されたキャッシュレベルでミスすると、遅延メカニズムが起動される。図１のようなコンピューティングシステムにおいて、キャッシュには２つのレベルがあり、スペキュレーティブロードはこれらのキャッシュの一方（例えば、キャッシュ１４０）でミスすると自発NaTを生成する。
【００４７】
特定キャッシュレベル遅延（cache  level  specific  deferral）はプログラマブルにしてもよい。例えば、Itanium（登録商標）命令セットアーキテクチャ（ISA）は、データが見つかると期待できるキャッシュヒエラルキーのレベルを示すために使用されるヒントフィールドを含む。本発明の他の実施形態において、キャッシュミスが遅延メカニズムをトリガするキャッシュレベルを示すためにこのヒント情報を使用してもよい。ヒントにより示されたキャッシュレベルにおけるミスは自発NaTをトリガする。
【００４８】
図３は、本発明による方法３００の他の実施形態を示すフローチャートである。方法３００は、ステップ３１０におけるスペキュレーティブロードの実行で始まる。ステップ３２０で、スペキュレーティブロードが指定キャッシュでヒットすると、ステップ３３０でブランチ命令の解決（resolution）を待つ。スペキュレーティブロードがステップ３２０で指定キャッシュレベルでミスすると、ステップ３２４においてそのターゲットレジスタは遅延トークン（例えば、自発NaT）でタグされ、ステップ３２８でプリフェッチ要求が発行される。そのトークンは、スペキュレーティブロードに依存するスペキュレーティブ命令の目的レジスタを通して広がる。
【００４９】
ステップ３３０でブランチする（taken）と（TK）、ステップ３４０でブランチのターゲットアドレスの命令に続く。この場合、スペキュレーティブロードの結果は必要なく、追加のペナルティは生じない。ブランチしない（not  taken）と、ステップ３５０でスペキュレーティブロードをチェックする。例えば、スペキュレーティブロードによりターゲットされたレジスタ値がNaTに対して指定された値と比較されるか、またはNaTビットの状態が読み込まれる。ステップ３６０で遅延トークンが検出されると、スペキュレーションで実行された命令により返された結果は正しく、ステップ３７０においてロードチェックに続く命令が実行される。
【００５０】
ステップ３６０で遅延トークンが検出されると、ステップ３８０でキャッシュミスハンドラが実行される。このハンドラは、スペキュレーションによる実行がスケジュールされていたロードとそれに依存する命令を含む。ステップ３２８で、非スペキュレーティブロードのレイテンシはプリフェッチにより短くなる。このプリフェッチにより、キャッシュミスに応じて、メモリヒエラルキーの高いレベルからターゲットデータが返される。
【００５１】
スペキュレーティブロードミスが遅延されるキャッシュレベルの選択に加えて、スペキュレーティブロードを用いる一部のコードセグメントのキャッシュミス遅延メカニズムをディスエーブルすることが望ましい。例えば、オペレーティングシステムやその他の低レベルシステムソフトウェア等のクリティカルコードセグメントは、一般的に、決定論的振る舞いを要する。制御スペキュレーションにより不確定性が入り込む。スペキュレーションにより実行された命令によりトリガされた例外条件は、対応する例外ハンドラを実行することもあれば、しないこともあり、プログラムの制御フローに依存するからである。
【００５２】
ガードしているブランチ命令がどのように解決されるかによらず、スペキュレーティブロードの例外に応じて、例外ハンドラが決して（または常に）実行されないことを保証する条件で、このようなクリティカルコードセグメントは、性能上の理由から、スペキュレーティブロードをまだ使用することもある。例えば、例外を決してトリガしない条件でクリティカルコードセグメントがスペキュレーティブロードを実行してもよいし、プログラムフローを制御するためにトークン自体を使用してもよい。適切なケースは、Itaniumプロセッサファミリーの例外ハンドラであり、ネストしたフォルトに関連するオーバーヘッドを避けるためにスペキュレーティブロードを使用する。
【００５３】
Itaniumプロセッサファミリーについて、TLBミス例外に対応するハンドラは、仮想ハードウェアページテーブル（VHPT）からアドレス変換をロードしなければならない。ハンドラがVHPTへの非スペキュレーティブロードを実行するとき、このロードは失敗し、ネストしたフォルトに関連するオーバーヘッドをシステムが管理しなければならないかも知れない。TLBフォルトの性能の高いハンドラはVHPTへのスペキュレーティブロードを実行し、Test  NaT命令（TNaT）を実行することにより、NaTのターゲットレジスタをテストする。スペキュレーティブロードがNaTを返すとき、ハンドラはページテーブルフォルトを解決するために別のコードセグメントにブランチしてもよい。このように、TLBミス例外ハンドラは、スペキュレーティブロードによるVHPTミスのVHPTミス例外ハンドラを決して実行しない。
【００５４】
開示されたキャッシュミス遅延メカニズムの実施形態は、遅延例外類似の振る舞いをトリガするので、クリティカルコードセグメントの決定論的実行を不要にする（undermine）こともある。この遅延メカニズムはマイクロアーキテクチャイベントにより駆動されるので、非決定論的振る舞いの機会はむしろ大きい。
【００５５】
本発明の他の実施形態は、クリティカルコードセグメント中のスペキュレーティブロードや非決定論的振る舞いを防止するためのセーフガードの使用と干渉せずに、ソフトウェア制御下におけるキャッシュミス遅延のディスエーブルをサポートする。この実施形態はItaniumアーキテクチャを用いて説明する。このアーキテクチャは様々なシステムレジスタ中のフィールドを介して例外遅延の態様を制御する。例えば、プロセッサステータスレジスタ（PSR）は、現在実行中のプロセスについて実行環境、例えば制御情報を維持する。制御レジスタは、割り込みによるプロセッサの状態を捕捉する。TLBは最近使用された仮想対物理アドレス変換を格納する。この開示の利益を有する当業者には、このメカニズムを他のプロセッサアーキテクチャに適用するために必要な修正が明らかであろう。
【００５６】
Itaniumプロセッサで遅延実行処理がイネーブルされる条件は次の論理式により表される：
!PSR.ic||(PSR.it&&ITLB.ed&&DCR.xx)
例外が遅延される最初の条件は、プロセッサステータスレジスタ（PSR.ic）中の割り込みコレクション（ic）ビットの状態により制御される。PSR.ic=1のとき、割り込みが発生すると、プロセッサステートを反映するために様々なレジスタが更新され、割り込みハンドラへの制御の移し（すなわち、割り込み）は遅延されない。PSR.ic=0のとき、プロセッサステートは保存されない。プロセッサステートを保存しないで割り込みが発生すると、ほとんどの場合システムはクラッシュする。それゆえ、PSR.ic=0のときは例外がトリガされないようにオペレーティングシステムが設計されている。
【００５７】
割り込みが起きないことを保証する別のメカニズムを備えているのであれば、クリティカルコードは、PSR.ic=0であるスペキュレーティブロード（割り込みステートコレクションディスエーブル）を含んでもよい。この保証は、前の例では、NaTが検出されたとき、異なるコードセグメントにブランチするNaTビットをテストすることにより行われた。
【００５８】
例外が遅延される第２の条件は、（１）アドレス変換がイネーブルされ（PSR.it=1）、リカバリコードが利用可能であることをITLBが示している（ITLB.ed=1）、その例外は遅延がイネーブルされる例外に対応することを制御レジスタが示す（DCR.xx=1）ことである。第２の条件は、制御スペキュレーションを含むアプリケーションレベルコードに適用する条件である。
【００５９】
選択されたアプリケーションレベルプログラムについてキャッシュミス遅延をイネーブルしている間に、クリティカルコードセグメントによるスペキュレーティブロードの使用を保護するため、キャッシュミス遅延は次の論理式によりイネーブルされる：
(PSR.ic&&PSR.it&&ITLB.ed)
この条件は、例外遅延が無条件でイネーブルされている条件下（例えば、PSR.ic=0）では、キャッシュミス遅延がイネーブルされないことを保証する。アプリケーションコードについて、例外遅延はPSR.it、ITLB.ed、DCR中の対応する例外ビットに従ってイネーブルされるが、キャッシュミス遅延はPSR.it、ITLB.ed、PSR.icの状態に従ってイネーブルされる。
【００６０】
制御スペキュレーションのもっと広い範囲で使用をサポートするために、制御スペキュレーションのキャッシュミスの潜在的性能ペナルティを限定するためのメカニズムを提供した。本メカニズムはスペキュレーティブロードによるキャッシュミスを検出し、そのスペキュレーティブロードによりターゲットとされていたレジスタを遅延トークンでタグする。キャッシュミスに応じて、ターゲットにされたデータに対して、ノンフォルトプリフェッチを発行する。遅延トークンをチェックする動作は、スペキュレーティブロードの結果が必要なときにのみ実行される。チェック動作を実行し、遅延トークンを検出したとき、リカバリーコードがそのキャッシュミスを処理する。チェック動作を実行しないか、または実行しても遅延トークンが検出されないとき、リカバリーコードは実行されない。遅延メカニズムは指定されたキャッシュレベルのミスでトリガされ、選択されたコードシーケンスに対してはディスエーブルされる。
【００６１】
遅延メカニズムがキャッシュのスペキュレーティブロードミス時に起動される場合について本発明を説明したが、性能に大きく影響するスペキュレーティブ命令によりトリガされた他のマイクロアーキテクチャイベントにも本発明を利用することができる。本発明は、添付したクレームの精神と範囲のみによって限定される。
【図面の簡単な説明】
【００６２】
本発明は、以下の図面を参照することにより理解できるであろう。類似したエレメントには類似した数字を付した。これらの図面は本発明の実施形態を示すために提供されたものであり、添付された実施形態の範囲を限定するものではない。
【図１】本発明を実施するのに好適なコンピュータシステムを示すブロック図である。
【図２】本発明を実施する方法の一実施形態を示すフローチャートである。
【図３】本発明を実施する方法の他の実施形態を示すフローチャートである。
【図１】
2006511867.tif 000007
【図２】
2006511867.tif 000008
【図３】
2006511867.tif 000009
【国際調査報告】
2006511867.tif 000010
2006511867.tif 000011
2006511867.tif 000012