(57)【要約】  上位キャッシュ層による、下位キャッシュ層がインフラックスをどのようにログに記録するべきかについての判定に基づいた、トレースログの記録。第２キャッシュは、下位層の第１キャッシュから、メモリアドレスを参照するログ記録要求を受信する。第２キャッシュはこのメモリアドレスに対するキャッシュラインを有しているかどうかを判定する。キャッシュラインが存在する場合、第２キャッシュは、ログ記録を行う次のキャッシュ層へ要求を転送する、又は第２キャッシュがログ記録を行う最も外側の層である場合にキャッシュラインをログに記録する、のいずれかを行う。キャッシュラインが存在しない場合、第２キャッシュは、キャッシュラインがログに記録されるべきではないと特定の第２キャッシュが判定している場合、又はログに記録されるべきであると特定の第２キャッシュにより判定されているが第２キャッシュのキャッシュラインの現在の値を第１キャッシュが認識していないと判定された場合に、キャッシュラインをログに記録する。【選択図】図６
2021515287.tif 000002
【特許請求の範囲】
【請求項１】
複数の処理ユニットと、
複数のキャッシュ層に配列された複数のキャッシュであって、第１キャッシュ層の中に複数の第１キャッシュ、及び第２キャッシュ層の中に１つ又は複数の第２キャッシュを含み、前記第２キャッシュ層の中の特定の第２キャッシュが少なくとも前記第１キャッシュ層の中の特定の第１キャッシュに対するバッキングストアとして機能する、複数のキャッシュと、
制御論理であって、
前記特定の第１キャッシュから特定のメモリアドレスを参照するログ記録要求を受信することと、
前記要求に基づいて、前記メモリアドレスに対応するキャッシュラインが前記特定の第２キャッシュに存在するかどうかを判定することと、
前記特定の第２キャッシュに前記キャッシュラインが存在しない場合に、
ログ記録に関与し、少なくとも前記特定の第２キャッシュに対するバッキングストアとして機能する第３キャッシュが存在しない場合は前記キャッシュラインをログに記録する、若しくは
前記第３キャッシュが存在する場合は前記第３キャッシュへ前記要求を転送する、
のうちの一つを実行する、又は
前記特定の第２キャッシュに前記キャッシュラインが存在する場合に、
前記キャッシュラインが（ｉ）ログに記録されるべきではないと前記特定の第２キャッシュが判定している場合、若しくは（ｉｉ）ログに記録されるべきであると前記特定の第２キャッシュにより判定されているが前記特定の第２キャッシュのキャッシュラインに記憶された現在の値を前記特定の第１キャッシュが認識していないと前記特定の第２キャッシュが判定した場合に、前記キャッシュラインをログに記録する、若しくは
（ｉ）前記キャッシュラインがログに記録されるべきであると前記特定の第２キャッシュにより判定されていて、（ｉｉ）前記特定の第２キャッシュの前記キャッシュラインに記憶された現在の値を前記第１キャッシュが認識していると判定される場合に、前記キャッシュラインをログに記録する必要はないと判定する、
のうちの少なくとも一つを実行することと、
を少なくとも実行するように少なくとも前記特定の第２キャッシュを構成する制御論理と、
を備える、マイクロプロセッサ。
【請求項２】
前記キャッシュラインをログに記録することは、トレースバッファ内で前記キャッシュラインをログに記録することと、
前記特定の第２キャッシュの中で前記キャッシュラインにログに記録されているという印を付けることと、
を含む、請求項１に記載のマイクロプロセッサ。
【請求項３】
前記キャッシュラインをログに記録することは、
前記第１キャッシュへ前記特定のメモリアドレスの値を直接ログに記録するよう指示すること、又は
前記第１キャッシュへ前記特定のメモリアドレスに対する以前のログエントリへの参照をログに記録するよう指示すること、
のうちの一つを含む、請求項１に記載のマイクロプロセッサ。
【請求項４】
前記キャッシュラインがログに記録されるべきではないと前記特定の第２キャッシュが判定している場合に前記キャッシュラインをログに記録することは、
前記第３キャッシュ層が存在すると判定することと、
前記キャッシュラインが前記特定の第２キャッシュにより値でログに記録されていると前記第３キャッシュに通知することと、
を含む、請求項１に記載のマイクロプロセッサ。
【請求項５】
前記第１キャッシュ層はＬ１キャッシュ層を備え、前記第２キャッシュ層はＬ２キャッシュ層又はＬ３キャッシュ層を備える、請求項１に記載のマイクロプロセッサ。
【請求項６】
前記制御論理は、
前記メモリアドレスにも対応する前記第１キャッシュの中の別のキャッシュラインが前記第１キャッシュの中でログに記録されていないという印を付けられていることを示すメッセージを前記第１キャッシュから受信することと、
前記メッセージに基づいて、前記特定の第２キャッシュの中で前記キャッシュラインにログに記録されていないという印を付けることと、
も行うように少なくとも前記特定の第２キャッシュを構成する、請求項１に記載のマイクロプロセッサ。
【請求項７】
前記第１キャッシュに対応する処理ユニットにより、前記処理ユニットに対するログ記録が無効化されている間に前記他のキャッシュラインに書き込みが行われることに基づいて、前記他のキャッシュラインが前記第１キャッシュの中でログに記録されていないという印を付けられる、請求項６に記載のマイクロプロセッサ。
【請求項８】
前記制御論理は、
書き込みを行うために前記キャッシュラインを要求するメッセージを前記第１キャッシュから受信することと、
少なくとも前記第１キャッシュに対してログ記録が無効化されていることに基づいてログに記録されていないという印を付けられている前記キャッシュラインを前記第１キャッシュへ送信することと、
も行うように少なくとも前記特定の第２キャッシュを構成する、請求項１に記載のマイクロプロセッサ。
【請求項９】
下位キャッシュ層によるログ記録要求に基づいて、前記下位キャッシュ層がインフラックスをどのようにログに記録するべきかを上位キャッシュ層が判定する方法であって、前記方法は、（ｉ）複数の処理ユニットと、（ｉｉ）複数のキャッシュ層に配列された複数のキャッシュであって、第１キャッシュ層の中に複数の第１キャッシュ、及び第２キャッシュ層の中に１つ又は複数の第２キャッシュを含み、前記第２キャッシュ層の中の特定の第２キャッシュが少なくとも前記第１キャッシュ層の中の特定の第１キャッシュに対するバッキングストアとして機能する複数のキャッシュ、とを含むコンピュータデバイスで実装され、
前記特定の第１キャッシュから特定のメモリアドレスを参照するログ記録要求を受信することと、
前記要求に基づいて、前記メモリアドレスに対応するキャッシュラインが前記特定の第２キャッシュに存在するかどうかを判定することと、
前記特定の第２キャッシュに前記キャッシュラインが存在しない場合に、
ログ記録に関与し、少なくとも前記特定の第２キャッシュに対するバッキングストアとして機能する第３キャッシュが存在しない場合は前記キャッシュラインをログに記録する、若しくは
前記第３キャッシュが存在する場合は前記第３キャッシュへ前記要求を転送する、
のうちの一つを実行する、又は
前記特定の第２キャッシュに前記キャッシュラインが存在する場合に、
前記キャッシュラインが（ｉ）ログに記録されるべきではないと前記特定の第２キャッシュが判定している場合、若しくは（ｉｉ）ログに記録されるべきであると前記特定の第２キャッシュにより判定されているが前記特定の第２キャッシュのキャッシュラインに記憶された現在の値を前記特定の第１キャッシュが認識していないと前記特定の第２キャッシュが判定した場合に、前記キャッシュラインをログに記録する、若しくは
（ｉ）前記キャッシュラインがログに記録されるべきであると前記特定の第２キャッシュにより判定されていて、（ｉｉ）前記特定の第２キャッシュの前記キャッシュラインに記憶された現在の値を前記第１キャッシュが認識していると判定される場合に、前記キャッシュラインをログに記録する必要はないと判定する、
のうちの少なくとも一つを実行することと、
を含む、方法。
【請求項１０】
前記キャッシュラインをログに記録することは、
トレースバッファ内で前記キャッシュラインをログに記録することと、
前記特定の第２キャッシュの中で前記キャッシュラインにログに記録されているという印を付けることと、
を含む、請求項９に記載の方法。
【請求項１１】
前記キャッシュラインをログに記録することは、
前記第１キャッシュへ前記特定のメモリアドレスの値を直接ログに記録するよう指示すること、又は
前記第１キャッシュへ前記特定のメモリアドレスに対する以前のログエントリへの参照をログに記録するよう指示すること、
のうちの一つを含む、請求項９に記載の方法。
【請求項１２】
前記キャッシュラインがログに記録されるべきではないと前記特定の第２キャッシュが判定している場合に前記キャッシュラインをログに記録することは、
前記第３キャッシュが存在すると判定することと、
前記第３キャッシュの知識に基づき、前記キャッシュラインを参照によりログに記録することと、
を含む、請求項９に記載の方法。
【請求項１３】
前記キャッシュラインがログに記録されるべきではないと前記特定の第２キャッシュが判定している場合に前記キャッシュラインをログに記録することは、
前記第３キャッシュ層が存在すると判定することと、
前記キャッシュラインが前記特定の第２キャッシュにより値でログに記録されていると前記第３キャッシュに通知することと、
を含む、請求項９に記載の方法。
【請求項１４】
前記第１キャッシュ層はＬ１キャッシュ層を備え、前記第２キャッシュ層はＬ２キャッシュ層又はＬ３キャッシュ層を備える、請求項９に記載の方法。
【請求項１５】
前記制御論理は、
前記メモリアドレスにも対応する前記第１キャッシュの中の別のキャッシュラインが前記第１キャッシュの中でログに記録されていないという印を付けられていることを示すメッセージを前記第１キャッシュから受信することと、
前記メッセージに基づいて、前記特定の第２キャッシュの中で前記キャッシュラインにログに記録されていないという印を付けることと、
も行うように少なくとも前記特定の第２キャッシュを構成する、請求項９に記載の方法。
【発明の詳細な説明】
【背景技術】
【０００１】
ソフトウェアアプリケーションの開発中にコードを書く際に、開発者はコードを「デバッグ」してランタイムエラー及び他のソースコードエラーを見つけるのに通常かなりの量の時間を費やす。その際に、開発者はソースコードのバグを再現して特定するためにいくつかの取り組み、例えば、異なる入力に基づいたプログラムの挙動を観察する、（変数値を表示するため、実行の分岐を追跡するため、などで）デバッグ用のコードを挿入する、一時的にコードの一部を除去する、などを行うことがある。ランタイムエラーを見つけ出してコードのバグを特定することは、アプリケーションの開発時間のかなりの部分を占めることがある。
【０００２】
多くの種類のデバッグ用アプリケーション（「デバッガ」）がコードのデバッグプロセスで開発者を支援するために開発されてきた。これらのツールは開発者にコンピュータコードの実行をトレースし、視覚化し、変更する能力を提供する。デバッガは、数ある中でも例えば、コード命令の実行を視覚化すること、コード実行中の様々な時間におけるコードの変数値を提示すること、開発者がコード実行経路を変更できるようにすること、並びに／又は、開発者が着目するコード要素に対して（実行中にリードを行うとコードの実行を停止させる）「ブレークポイント」及び／若しくは「ウォッチポイント」を設定できるようにすることができる。
【０００３】
新しく出現した形態のデバッグ用アプリケーションでは、「タイムトラベル」デバッグ、「リバース」デバッグ、又はデバッグ「履歴」が可能となる。「タイムトラベル」デバッグにより、プログラム（例えばスレッドなどの実行可能なエンティティ）の実行が、トレースアプリケーションにより１つ又は複数のトレースファイルへと記録／トレースされる。そして、こうしたトレースファイルを使って、順方向分析及び逆方向分析のためにプログラムの実行を後で再生できる。例えば、「タイムトラベル」デバッガにより、開発者は（従来のデバッガのように）順方向のブレークポイント／ウォッチポイント、及び逆方向のブレークポイント／ウォッチポイントを設定できる。
【０００４】
トレースファイルの記録時には、いくつかの検討事項が考慮されうる。最も顕著なものでは、記録されるトレースデータのロバストネスとプログラムをトレースすることにより発生するオーバーヘッドの間にトレードオフが内在することである。このトレードオフは、主にトレースファイルのファイルサイズ及びトレースされたプログラムの実行時の性能への影響として現れる。さらに、トレースはハードウェアによる支援を受けて（又は完全にソフトウェアで）遂行されうるため、ハードウェア設計及び他のハードウェアコストの検討事項が存在することもある。
【発明の概要】
【０００５】
本明細書に記載の実施形態は、プロセッサによるハードウェア的支援を使って、ビットアキュレートな「タイムトラベル」トレース記録を作成する仕組みを対象としている。この仕組みは、複数の処理ユニットでの実行結果を２つ以上の階層又は層のプロセッサキャッシュを使ってトレースすることに基づいている。一つの仕組みでは、トレースされた処理ユニットによる活動に基づいて内側又は「下位層（ｌｏｗｅｒ  ｌａｙｅｒ）」のプロセッサキャッシュへのインフラックス（ｉｎｆｌｕｘ）が検出された場合（すなわちキャッシュミス）に、１つ又は複数の外側又は「上位層（ｕｐｐｅｒ  ｌａｙｅｒ）」の共有プロセッサキャッシュを確認してそのインフラックスのデータが別のトレースされた処理ユニットの為に既にログに記録されているかを判定するように、プロセッサのハードウェア及び／又はマイクロコードを変更する。別の仕組みでは、１つ又は複数のキャッシュ層が、下位キャッシュ層からログ記録要求を受信し、ログに記録されたキャッシュラインについての知識を使って下位キャッシュ層へのインフラックスが（仮にあったとして）どのようにログに記録されるべきかを判断するように構成されるように、プロセッサのハードウェア及び／又はマイクロコードを変更する。どちらか一方の仕組みによって、以前のログエントリを参照してインフラックスをログ記録できるようになる可能性があり、それぞれの仕組みはレベルＮのキャッシュまで拡張することもできる。どちらか一方の仕組みを使ってトレースファイルを記録することにはわずかなプロセッサ変更が必要となることがあり、従来のトレース記録手法と比べた場合に、トレース記録の性能への影響及びトレースファイルのファイルサイズの両方について数桁分を低減させることができる。
【０００６】
第１実施形態は、複数の処理ユニット、複数のレベルＮキャッシュ、及びレベル（Ｎ＋ｉ）キャッシュを備えるコンピュータデバイスを対象としている。レベル（Ｎ＋ｉ）キャッシュは複数のレベルＮキャッシュのうちの２つ以上と関連付けられており、複数のレベルＮキャッシュに対するバッキングストアとして構成される。この実施形態では、コンピュータデバイスは、複数のレベルＮキャッシュのうちの第１レベルＮキャッシュへのインフラックスを検出するようにコンピュータデバイスを構成する制御論理を含み、この実施形態ではインフラックスはあるメモリロケーションに記憶されるデータを含む。また、制御論理は、レベル（Ｎ＋ｉ）キャッシュを確認してこのメモリロケーションのデータが第２処理ユニットの為に以前ログに記録されているかを判定するようにコンピュータデバイスを構成する。また、制御論理は、この確認に基づいて（ｉ）第２処理ユニットの為に以前ログに記録されたログデータを参照して（すなわち、そのメモリロケーションのデータが第２処理ユニットの為に以前ログに記録されている場合）、そのメモリロケーションのデータを第１処理ユニットの為にログに記録する、又は（ｉｉ）そのメモリロケーションのデータを第１処理ユニットの為に値でログに記録する（すなわち、そのメモリロケーションのデータが第２処理ユニットの為に以前ログに記録されていない場合）、の一方を実行するようにコンピュータデバイスを構成する。
【０００７】
第２実施形態は、複数の処理ユニット及び複数のキャッシュ層に配列された複数のキャッシュを備えるコンピュータデバイスを対象としている。複数のキャッシュは、第１キャッシュ層の中に複数の第１キャッシュ、及び第２キャッシュ層の中に１つ又は複数の第２キャッシュを含む。第２キャッシュ層の中の特定の第２キャッシュは、少なくとも第１キャッシュ層の中の特定の第１キャッシュに対するバッキングストアとして機能する。この実施形態では、コンピュータデバイスは、特定の第１キャッシュから特定のメモリアドレスを参照するログ記録要求を受信するように少なくとも特定の第２キャッシュを構成する制御論理を含む。要求に基づいて、この特定の第２キャッシュは、メモリアドレスに対応するキャッシュラインがこの特定の第２キャッシュに存在するかどうかを判定する。特定の第２キャッシュにそのキャッシュラインが存在しない場合、第２キャッシュは、（ｉ）ログ記録に関与し、少なくとも特定の第２キャッシュに対するバッキングストアとして機能する第３キャッシュが存在しない場合はそのキャッシュラインをログに記録する、又は（ｉｉ）第３キャッシュが存在する場合は要求を第３キャッシュへ転送する、のどちらかを行う。
【０００８】
キャッシュラインが特定の第２キャッシュに存在する場合、第２キャッシュは、（ｉ）キャッシュラインがログに記録されるべきではないとこの特定の第２キャッシュが判定している場合、若しくはログに記録されるべきであるとこの特定の第２キャッシュにより判定されているが特定の第２キャッシュのキャッシュラインに記憶された現在の値を第１キャッシュが認識していないと特定の第２キャッシュが判定した場合に、キャッシュラインをログに記録する、又は（ｉｉ）キャッシュラインがログに記録されるべきであるとこの特定の第２キャッシュにより判定されていて特定の第２キャッシュのキャッシュラインに記憶された現在の値を第１キャッシュが認識していると判定される場合にキャッシュラインをログに記録する必要はないと判定する、のいずれかを行う。
【０００９】
本明細書に記載の実施形態のいずれも、コンピュータデバイス（例えばマイクロプロセッサなど）により実行される方法、及び／又はハードウェア記憶装置上に記憶されて方法を実行するために実行可能であるコンピュータ実行可能命令（例えばプロセッサのマイクロコード）として実装することもできる。
【００１０】
この概要は、「発明を実施するための形態」において以下でさらに説明される概念から選択したものを簡略化した形で紹介するために設けられている。この概要は、特許請求されている主題の重要な特徴又は本質的な特徴を特定することを意図しておらず、特許請求されている主題の範囲の決定を支援するために使用されることも意図していない。
【図面の簡単な説明】
【００１１】
本発明の、上で列挙された利点及び特徴並びに他の利点及び特徴を得ることができる方法を説明するため、上記で簡潔に記載した本発明を添付の図面で示されるその特定の実施形態を参照してより詳細に説明する。これらの図面は本発明の典型的な実施形態を示しているに過ぎず、それゆえその範囲を制限していると考えられるべきではないことを理解した上で、添付の図面を使用して、本発明を更なる特異性及び詳細とともに説明する。
【００１２】
【図１】複数の処理ユニットでの実行の「ビットアキュレート」なトレースの記録を２つ以上の階層又は層のプロセッサキャッシュを使って容易にする例示のコンピューティング環境を示す。
【図２Ａ】多層キャッシュを備えるコンピューティング環境の例を示す。
【図２Ｂ】キャッシュの例を示す。
【図３】１つ又は複数の上位レベルのキャッシュの知識に基づいて以前のログデータを参照して下位レベルのキャッシュへのインフラックスを記録することに基づく、例示のトレース記録方法のフローチャートを示す。
【図４Ａ】各キャッシュラインが１つ又は複数の追加のアカウンティングビットを含む共有キャッシュの例を示す。
【図４Ｂ】従来のキャッシュラインへ適用されるアカウンティングビットを格納する、１つ又は複数の予約されたキャッシュラインを含む共有キャッシュの例を示す。
【図５】システムメモリとキャッシュの間のセットアソシアティブマッピングの例を示す。
【図６】下位キャッシュ層によるログ記録要求に基づき、下位キャッシュ層がインフラックスをどのようにログに記録すべきかを上位キャッシュ層が判断する例示の方法のフローチャートを示す。
【図７】処理ユニットがログ記録が有効化された状態からログ記録が無効化された状態へ遷移する際にキャッシュラインのログ記録状態を管理する例示の方法のフローチャートを示す。
【図８】ログ記録が無効化された処理ユニットが書き込みを行うために親キャッシュから独占的にキャッシュラインを受領する際にキャッシュラインのログ記録状態を管理する例示の方法のフローチャートを示す。
【図９】処理ユニットが「所有された」キャッシュコヒーレンシプロトコル状態で利用したキャッシュラインへ書き込む際にキャッシュラインのログ記録状態を管理する例示の方法のフローチャートを示す。
【発明を実施するための形態】
【００１３】
本明細書に記載の実施形態は、プロセッサによるハードウェア的支援を使って、ビットアキュレートな「タイムトラベル」トレース記録を作成する仕組みを対象としている。この仕組みは、複数の処理ユニットでの実行結果を２つ以上の階層又は層のプロセッサキャッシュを使ってトレースすることに基づいている。一つの仕組みでは、トレースされた処理ユニットによる活動に基づいて内側又は「下位層」のプロセッサキャッシュへのインフラックス（すなわちキャッシュミス）が検出された場合に、１つ又は複数の外側又は「上位層」の共有プロセッサキャッシュを確認してそのインフラックスのデータが別のトレースされた処理ユニットの為に既にログに記録されているかを判定するように、プロセッサのハードウェア及び／又はマイクロコードを変更する。別の仕組みでは、１つ又は複数のキャッシュ層が、下位キャッシュ層からログ記録要求を受信し、ログに記録されたキャッシュラインについての知識を使って、下位キャッシュ層へのインフラックスが（仮にあったとして）どのようにログに記録されるべきかを判断するように構成されるように、プロセッサのハードウェア及び／又はマイクロコードを変更する。どちらか一方の仕組みによって、以前のログエントリを参照してインフラックスをログ記録できるようになる可能性があり、それぞれの仕組みはレベルＮのキャッシュまで拡張することもできる。どちらか一方の仕組みを使ってトレースファイルを記録することにはわずかなプロセッサ変更が必要となることがあり、従来のトレース記録手法と比べた場合にトレース記録の性能への影響及びトレースファイルのファイルサイズの両方について数桁分を低減させることができる。
【００１４】
図１は、複数の処理ユニットでの実行の「ビットアキュレート」なトレースの記録を２つ以上の階層又は層のプロセッサキャッシュを使って容易にする例示のコンピューティング環境１００を示す。示されているように、実施形態は例えば１つ若しくは複数のプロセッサ１０２、システムメモリ１０３、１つ若しくは複数のデータストア１０４、及び／又は入力／出力ハードウェア１０５などのコンピュータハードウェアを備える専用又は汎用のコンピュータシステム１０１を含みうる、又は利用しうる。
【００１５】
本発明の範囲内の実施形態は、コンピュータ実行可能命令及び／又はデータ構造を運ぶ、又は記憶する、物理的なコンピュータ可読媒体及び他のコンピュータ可読媒体を含む。そのようなコンピュータ可読媒体は、コンピュータシステム１０１によりアクセス可能な任意の利用可能な媒体とすることができる。コンピュータ実行可能命令及び／又はデータ構造を記憶するコンピュータ可読媒体は、コンピュータ記憶装置である。コンピュータ実行可能命令及び／又はデータ構造を運ぶコンピュータ可読媒体は、伝送媒体である。したがって、制限ではなく例として、本発明の実施形態は２つ以上の明確に異なる種類のコンピュータ可読媒体、すなわち、コンピュータ記憶装置及び伝送媒体を含みうる。
【００１６】
コンピュータ記憶装置は、コンピュータ実行可能命令及び／又はデータ構造を記憶する物理的ハードウェアデバイスである。コンピュータ記憶装置には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、半導体ドライブ（「ＳＳＤ」）、フラッシュメモリ、相変化メモリ（「ＰＣＭ」）、光ディスク記憶装置、磁気ディスク記憶装置若しくは他の磁気記憶装置、又は、コンピュータ実行可能命令又はデータ構造の形態のプログラムコードを記憶するのに使用可能でコンピュータシステム１０１によりアクセス及び実行されて本発明の開示されている機能性を実現できる任意のハードウェアデバイスなどの、様々なコンピュータハードウェアが含まれる。したがって、コンピュータ記憶装置には、例えば後述されるように、示されているシステムメモリ１０３、コンピュータ実行可能命令及び／又はデータ構造を記憶可能である、示されているデータストア１０４、又はプロセッサ上の記憶装置などの他の記憶装置を含みうる。
【００１７】
伝送媒体には、コンピュータ実行可能命令又はデータ構造の形態のプログラムコードを運ぶのに使用可能でコンピュータシステム１０１によりアクセス可能なネットワーク及び／又はデータリンクを含むことができる。「ネットワーク」は、コンピュータシステム並びに／又はモジュール及び／若しくは他の電子デバイスの間の電子データの輸送を可能とする１つ又は複数のデータリンクと定義される。情報がネットワーク又は別の通信接続（有線、無線、又は有線若しくは無線の組み合わせのいずれか一つ）を介してコンピュータシステムへ転送される、又は提供される場合、コンピュータシステムはこの接続を伝送媒体とみなすことができる。上記の組み合わせもまた、コンピュータ可読媒体の範囲内に含められるべきである。例えば、入力／出力ハードウェア１０５は、コンピュータ実行可能命令又はデータ構造の形態のプログラムコードを運ぶのに使用可能なネットワーク及び／又はデータリンクを接続するハードウェア（例えばネットワークインタフェース（例えば「ＮＩＣ」））を含みうる。
【００１８】
さらに、様々なコンピュータシステムコンポーネントへ到達すると、コンピュータ実行可能命令又はデータ構造の形態のプログラムコードは、自動的に伝送媒体からコンピュータ記憶装置へ（又は逆も同様）転送することができる。例えば、ネットワーク又はデータリンクを介して受信したコンピュータ実行可能命令又はデータ構造は、ＮＩＣ（例えば入力／出力ハードウェア１０５）内のＲＡＭにバッファすることができて、最終的にはシステムメモリ１０３及び／又はコンピュータシステム１０１にあるより揮発性の低いコンピュータ記憶装置（例えばデータストア１０４）へ転送することができる。したがって、伝送媒体も同様に（あるいは主に）利用するコンピュータシステムコンポーネントには、コンピュータ記憶装置を含むことができると理解されたい。
【００１９】
コンピュータ実行可能命令は、例えばプロセッサ１０２で実行された場合にコンピュータシステム１０１に特定の機能又は機能群を実行させる命令及びデータを含む。コンピュータ実行可能命令は、例えばバイナリや、アセンブリ言語などの中間フォーマット命令、あるいはソースコードでありうる。
【００２０】
本発明は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、携帯機器、マルチプロセッサシステム、マイクロプロセッサベースの家電製品若しくはプログラム可能な家電製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、携帯電話、ＰＤＡ、タブレット、ポケットベル、ルータ、スイッチ、及び同種のものを含む多くの種類のコンピュータシステム構成を有するネットワークコンピューティング環境において実践されうることを当業者は理解するであろう。また、本発明は、ネットワークを介して（有線データリンク、無線データリンク、又は有線データリンクと無線データリンクの組み合わせのいずれか一つにより）つながっているローカルのコンピュータシステムとリモートのコンピュータシステムの両方がタスクを実行する分散システム環境でも実践されうる。それゆえ、分散システム環境において、コンピュータシステムは構成要素である複数のコンピュータシステムを含みうる。分散システム環境では、プログラムモジュールはローカルの記憶装置及びリモートの記憶装置の両方に置かれることがある。
【００２１】
本発明はクラウドコンピューティング環境においても実践されうることを当業者は理解するであろう。クラウドコンピューティング環境は分散させることができるが、これは必要ではない。クラウドコンピューティング環境は、分散される場合、一組織内で国際的に分散されている、及び／又はコンポーネントが多数の組織にわたって所有されていることがある。本明細書及び以下の請求の範囲において、「クラウドコンピューティング」は、構成可能なコンピューティングリソース（例えば、ネットワーク、サーバ、ストレージ、アプリケーション、及びサービス）の共用プールへのオンデマンドでのネットワークアクセスを可能とするためのモデルとして定義される。「クラウドコンピューティング」の定義は、適切に配置された場合にそのようなモデルから得ることができる他の数々の利点のいずれかに限定されるものではない。
【００２２】
クラウドコンピューティングモデルは、オンデマンドセルフサービス（ｏｎ−ｄｅｍａｎｄ  ｓｅｌｆ−ｓｅｒｖｉｃｅ）、幅広いネットワークアクセス（ｂｒｏａｄ  ｎｅｔｗｏｒｋ  ａｃｃｅｓｓ）、リソースの共用（ｒｅｓｏｕｒｃｅ  ｐｏｏｌｉｎｇ）、スピーディな拡張性（ｒａｐｉｄ  ｅｌａｓｔｉｃｉｔｙ）、サービスが計測可能であること（ｍｅａｓｕｒｅｄ  ｓｅｒｖｉｃｅ）、などの様々な特徴から構成されうる。また、クラウドコンピューティングモデルは、例えばソフトウェア・アズ・ア・サービス（「ＳａａＳ」）、プラットフォーム・アズ・ア・サービス（「ＰａａＳ」）、及びインフラストラクチャ・アズ・ア・サービス（「ＩａａＳ」）などの様々なサービスモデルの形態で提供されうる。クラウドコンピューティングモデルは、プライベートクラウド、コミュニティクラウド、ハイブリッドクラウドなどの異なる実装モデルを使って配置することもできる。
【００２３】
クラウドコンピューティング環境などの一部の実施形態は、それぞれが１つ又は複数の仮想マシンを実行可能な１つ又は複数のホストを含むシステムを含みうる。稼働している間、仮想マシンは使用可能なコンピューティングシステムをエミュレートして、オペレーティングシステムと、おそらく１つ又は複数の他のアプリケーションもサポートする。一部の実施形態では、各ホストは仮想マシンの視点から抽象化された物理リソースを使って仮想マシン用の仮想リソースをエミュレートするハイパーバイザを備える。また、ハイパーバイザは仮想マシン間に適切な分離を提供する。したがって、任意の所与の仮想マシンの観点では、仮想マシンは物理リソースの外観（例えば仮想リソース）だけとインタラクションを行っているにも関わらず、ハイパーバイザは仮想マシンが物理的リソースとインタラクションを行っているという錯覚をもたらす。処理能力、メモリ、ディスク空き容量、ネットワーク帯域、媒体駆動装置などを含む物理リソースの例。
【００２４】
図１は、プロセッサ１０２の内部ハードウェアコンポーネントの簡略化された表現を含む。示されるように、各プロセッサ１０２は複数の処理ユニット１０２ａを備える。各処理ユニットは、物理的（すなわち、物理プロセッサコア）、及び／又は論理的（すなわち、ハイパースレッディングをサポートする物理コアによりもたらされる、物理コアで２つ以上のアプリケーションスレッドが実行される論理コア）でありうる。したがって、例えば、一部の実施形態ではプロセッサ１０２が単一の物理処理ユニット（コア）のみを備えることがあるが、プロセッサ１０２はその単一の物理処理ユニットによりもたらされる２つ以上の論理処理ユニット１０２ａを備えることもできる。
【００２５】
各処理ユニット１０２ａは、アプリケーション（例えば、トレーサ１０４ａ、デバッガ１０４ｂ、オペレーティングカーネル１０４ｃ、アプリケーション１０４ｄなど）により規定される、予め規定されたプロセッサ命令セットアーキテクチャ（ＩＳＡ）から選択されたプロセッサ命令を実行する。各プロセッサ１０２の特定のＩＳＡは、プロセッサの製造者及びプロセッサのモデルに基づいて異なる。共通のＩＳＡとして、ＩＮＴＥＬ，  ＩＮＣ．のＩＡ−６４及びＩＡ−３２アーキテクチャ、ＡＤＶＡＮＣＥＤ  ＭＩＣＲＯ  ＤＥＶＩＣＥＳ，  ＩＮＣ．のＡＭＤ６４アーキテクチャ、及びＡＲＭ  ＨＯＬＤＩＮＧＳ，  ＰＬＣの種々のＡｄｖａｎｃｅｄ  ＲＩＳＣ  Ｍａｃｈｉｎｅ（「ＡＲＭ」）アーキテクチャが挙げられるが、数多くの他のＩＳＡが存在し、本発明で使用可能である。概して、「命令」は、外部から見える（すなわち、プロセッサの外部にある）プロセッサで実行可能なコードの最小単位である。
【００２６】
各処理ユニット１０２ａは１つ又は複数のプロセッサキャッシュ１０２ｂからプロセッサ命令を取得し、キャッシュ１０２ｂ内のデータに基づいて、及び／若しくはレジスタ１０２ｄ内のデータに基づいて、並びに／又は入力データなしで、プロセッサ命令を実行する。概して、各キャッシュ１０２ｂは、システムメモリ１０３及び／又はキャッシュ１０２ｂの中の別のキャッシュなどのバッキングストアの一部の、プロセッサ上のコピーを記憶する、小さな容量の（すなわち、典型的なシステムメモリ１０３の容量と比較して小さい）ランダムアクセスメモリである。例えば、アプリケーションコード１０３ａを実行する場合、１つ又は複数のキャッシュ１０２ｂはアプリケーションランタイムデータ１０３ｂの一部を含む。処理ユニット１０２ａが特定のキャッシュ１０２ｂにまだ記憶されていないデータを要求した場合は「キャッシュミス」が発生し、当該データがシステムメモリ１０３又は別のキャッシュからフェッチされ、キャッシュ１０２ｂからいくらかの他のデータを「追い出す」可能性がある。
【００２７】
しばしば、プロセッサキャッシュ１０２ｂは、第１層（Ｌ１）、第２層（Ｌ２）、第３層（Ｌ３）などの別々の階層、層、又はレベルに分けられる。プロセッサの実装によっては、階層はプロセッサ１０２自体の一部（例えばＬ１やＬ２）とすることができて、及び／又はプロセッサ１０２から分離する（例えばＬ３）ことができる。したがって、図１のキャッシュ１０２ｂはこれらの層のうちの１つ（Ｌ１）を含むことがあり、又はこれらの層を複数（例えばＬ１及びＬ２、そしてさらにＬ３）含むことがある。こうした概念をさらに理解するため、図２Ａは例示の環境２００を示し、多層キャッシュを明示している。図２Ａには、２つのプロセッサ２０１ａ及び２０１ｂ（例えば、それぞれが図１の異なるプロセッサ１０２に対応する）と、システムメモリ２０２（例えば、図１のシステムメモリ１０３に対応する）がある。例示の環境２００では、各プロセッサ２０１は４つの物理処理ユニット（すなわち、プロセッサ２０１ａに対するユニットＡ１〜Ａ４及びプロセッサ２１０ｂに対するユニットＢ１〜Ｂ４）を備える。
【００２８】
また、例示の環境２００は各処理ユニット２０１の中に３層のキャッシュ階層を含む。環境２００は配置例の一つに過ぎず、本明細書における実施形態が機能しうるキャッシュ階層を限定するものではない。環境２００では、最も下位の層、又は最も内側の層で、各処理ユニットが専用のＬ１キャッシュ（例えば、プロセッサ２０１ａの中のユニットＡ１に対するＬ１キャッシュ「Ｌ１−Ａ１」、プロセッサ２０１ａの中のユニットＡ２に対するＬ１キャッシュ「Ｌ１−Ａ２」、など）と関連付けられている。層を一つ上に上がると、各処理ユニット２０１は２つのＬ２キャッシュ（例えば、プロセッサ２０１ａの中のＬ１キャッシュ、Ｌ１−Ａ１及びＬ１−Ａ２に対するバッキングストアとして機能するＬ２キャッシュ「Ｌ２−Ａ１」、プロセッサ２０１ａの中のＬ１キャッシュ、Ｌ１−Ａ３及びＬ１−Ａ４に対するバッキングストアとして機能するＬ２キャッシュ「Ｌ１−Ａ２」、など）を備える。そして、最も上位の層、又は最も外側の層で、各処理ユニット２０１は単一のＬ３キャッシュ（例えば、プロセッサ２０１ａの中のＬ２キャッシュ、Ｌ２−Ａ１及びＬ２−Ａ２に対するバッキングストアとして機能するＬ３キャッシュ「Ｌ３−Ａ」、プロセッサ２０１ｂの中のＬ２キャッシュ、Ｌ２−Ｂ１及びＬ２−Ｂ２に対するバッキングストアとして機能するＬ３キャッシュ「Ｌ３−Ｂ」）を備える。示されるように、システムメモリ２０２はＬ３キャッシュ、Ｌ３−Ａ及びＬ３−Ｂに対するバッキングストアとして機能する。
【００２９】
図２Ａに明示されているように、多数のキャッシュ層が使用される場合、処理ユニット１０２ａは典型的には最下位層（Ｌ１）と直接インタラクションを行う。ほとんどの場合、データは層の間を流れる（例えば、読み出しではＬ３キャッシュはシステムメモリ１０３とインタラクションを行い、データをＬ２キャッシュへ供給し、同様にＬ２キャッシュはデータをＬ１キャッシュへ供給する）。処理ユニット１０２ａが書き込みを行う場合、キャッシュは協調して、影響されるデータを保持し、処理ユニット１０２ａの間で共有されていたキャッシュがそのデータをもはや保持しないようにする。この協調は、ＣＣＰを使って行われる。
【００３０】
したがって、環境２００におけるキャッシュは、「共有」キャッシュとみなすことができる。例えば、各Ｌ２キャッシュ及び各Ｌ３キャッシュは、所与のプロセッサ２０１の中の多数の処理ユニットのために機能し、したがって処理ユニットにより共有されている。また、所与のプロセッサ２０１の中のＬ１キャッシュも、それぞれが単一の処理ユニットに対応しているものの、個々のＬ１キャッシュは整合性を確保するため（すなわち、キャッシュされたメモリロケーションのそれぞれがすべてのＬ１キャッシュにわたって一貫しているとみなされるように）互いに（すなわちＣＣＰを介して）協調しうるので、集合的に共有されていると考えることができる。同様に、各プロセッサ２０１の中のＬ２キャッシュは、ＣＣＰを介して協調することができる。さらに、プロセッサ２０１がハイパースレッディングをサポートしていれば、個々のＬ１キャッシュはそれぞれ、２つ以上の論理処理ユニットにより共有されているとみなすことができて、したがって個々のレベルにおいても「共有」されている。
【００３１】
典型的には、各キャッシュは複数の「キャッシュライン」を含む。各キャッシュラインはそのバッキングストア（例えば、システムメモリ２０２又は上位層のキャッシュ）から一塊のメモリを格納する。例えば、図２Ｂは複数のキャッシュライン２０６を含むキャッシュ２０３の少なくとも一部の例を示し、キャッシュライン２０６のそれぞれはアドレス部２０４と値部２０５を含む。各キャッシュライン２０６のアドレス部２０４は、キャッシュラインが対応するシステムメモリ２０２内のアドレスを記憶するように構成され、値部２０５は当初はシステムメモリ２０２から受信した値を記憶する。値部２０５は処理ユニットにより変更することができて、最終的にはバッキングストアへ追い出すことができる。省略記号で示されるように、キャッシュ２０３は多数のキャッシュラインを含むことができる。例えば、現代のインテル製６４ビットプロセッサは、個々が５１２本以上のキャッシュラインを含むＬ１キャッシュを含みうる。そのようなキャッシュにおいて、各キャッシュラインは６バイト（４８ビット）から８バイト（６４ビット）のメモリアドレスを参照して６４バイト（５１２ビット）の値を記憶するのに通常使うことができる。図２Ａに視覚的に示されているように、キャッシュサイズは典型的にはそれぞれの層と共に大きくなる（すなわち、Ｌ２キャッシュは通常はＬ１キャッシュより大きく、Ｌ３キャッシュは通常はＬ２キャッシュより大きい、など）。
【００３２】
各キャッシュライン２０６のアドレス部２０４に記憶されたアドレスは、システムメモリ２０２の中の実際のメモリアドレスなどの物理アドレスでありうる。あるいは、アドレス部２０４に記憶されたアドレスは、（例えばオペレーションシステムが管理するページテーブルを使って）物理アドレスへマッピングして抽象化されたアドレスである仮想アドレスでありうる。そのような抽象化は、例えばプロセッサ１０２で実行されている異なるプロセスの間で、ユーザーモードプロセスとオペレーティングシステムカーネル１０４ｂと関連付けられたカーネルモードプロセスの間での隔離を含むメモリの隔離を容易にするのに使うことができる。仮想アドレスが使用される場合、プロセッサ１０２はトランスレーションルックアサイドバッファ（ＴＬＢ）１０２ｆ（通常はメモリ管理ユニット（ＭＭＵ）の一部）を含むことができて、ＴＬＢ１０２ｆは物理アドレスと仮想アドレスの間の最近使用されたメモリアドレスマッピングを維持する。
【００３３】
キャッシュ１０２ｂは、コードキャッシュ部及びデータキャッシュ部も含みうる。アプリケーションコード１０３ａを実行した場合、キャッシュ１０２ｂのコード部はアプリケーションコード１０３ａに格納されたプロセッサ命令の少なくとも一部を記憶することができて、キャッシュ１０２ｂのデータ部はアプリケーションランタイムデータ１０３ｂのデータ構造の少なくとも一部を記憶することができる。さらに、キャッシュは包括的又は排他的とすることができて、あるいは包括的な振る舞い及び排他的な振る舞いの両方を含みうる。例えば、包括的キャッシュでは、Ｌ３層は典型的にはその下にあるＬ２層の中のデータのスーパーセットを記憶し、Ｌ２層はその下にあるＬ１層のスーパーセットを記憶する。排他的キャッシュでは、層は別々となっていることがあり、例えばＬ１キャッシュが必要なデータがＬ３キャッシュに存在する場合に、これらのキャッシュがデータやアドレス、及び同種のものなどの情報を交換することがある。
【００３４】
図１に戻ると、各プロセッサ１０２は、プロセッサ１０２の動作を制御し、プロセッサ１０２により実行中のアプリケーションへさらされるプロセッサＩＳＡとプロセッサのハードウェアの間のインタプリタとして通常機能する制御論理（すなわち実行可能命令）を含むマイクロコード１０２ｃも含む。マイクロコード１０２は、典型的にはＲＯＭやＥＥＰＲＯＭなどのプロセッサ上の記憶装置として具現化される。
【００３５】
レジスタ１０２ｄは、プロセッサ１０２のＩＳＡに基づき規定され、プロセッサ命令により読み出し、及び／又は書き込みが行われるハードウェアベースの格納先である。例えば、レジスタ１０２ｄは通常、キャッシュ１０２ｂからフェッチされた値を命令で使用するために記憶する、命令を実行した結果を記憶する、及び／又は、命令を実行した副作用（例えば、変化する値の符号、ゼロへ達する値、桁上げの発生、など）のいくつかのような状況又は状態やプロセッサのサイクル数などを記憶するために使用される。したがって、一部のレジスタ１０２ｄは、実行中のプロセッサ命令により生じた何らかの状態変化を示唆するために使用される「フラグ」を含みうる。また、一部の実施形態ではプロセッサ１０２は制御レジスタを備えることがあり、このレジスタはプロセッサの動作の異なる側面を制御するのに使用される。図１はレジスタ１０２ｄを一つの箱として示しているが、各処理ユニット１０２ａは、典型的にはその処理ユニットに特有の１つ又は複数の対応するレジスタ１０２ｄの組を備えることが理解されるであろう。
【００３６】
一部の実施形態では、プロセッサ１０２は１つ又は複数のバッファ１０２ｅを含みうる。本明細書で後述されるように、バッファ１０２ｅはトレースデータの一時的な格納先として使うことができる。したがって、例えば、プロセッサ１０２はトレースデータの一部をバッファ１０２ｅに記憶して、このデータを適切な時期、例えば利用可能なメモリバス帯域幅及び／又は空いているプロセッササイクルがある場合などにトレースデータストア１０４ｅへ掃き出すことができる。
【００３７】
上で示唆したように、プロセッサは１つ又は複数のＣＣＰに従ってキャッシュ１０２ｂに対して作用する。概して、ＣＣＰは、様々な処理ユニット１０２ａがデータを様々なキャッシュ１０２ｂから読み出し／キャッシュ１０２ｂへ書き込みする際に様々なキャッシュ１０２ｂの間でデータ間の整合性が維持される方法、及び、様々な処理ユニット１０２ａがキャッシュ１０２ｂの中の所与のロケーションから常に有効なデータを読み出すのを保証する方法を規定する。ＣＣＰはプロセッサ１０２のＩＳＡにより規定されるメモリのモデルに関連し、メモリのモデルを有効化する。
【００３８】
共通ＣＣＰの例として、ＭＳＩプロトコル（すなわち、変更状態、共有状態、及び無効状態）、ＭＥＳＩプロトコル（すなわち、変更状態、排他状態、共有状態、及び無効状態）、及びＭＯＥＳＩプロトコル（すなわち、変更状態、所有状態、排他状態、共有状態、及び無効状態）が挙げられる。これらのプロトコルのそれぞれは、キャッシュ１０２ｂの中の個々のロケーション（例えばライン）の状態を規定する。「変更」状態のキャッシュのロケーションにはキャッシュ１０２ｂの中で変更されたデータが含まれ、それゆえバッキングストア（例えばシステムメモリ１０３又は別のキャッシュ）の中の対応するデータとの整合性がない可能性がある。「変更」状態を有するロケーションがキャッシュ１０２ｂから追い出される場合、共通ＣＣＰはキャッシュにそのデータがバッキングストアへ書き戻されること、又は別のキャッシュがその責任を引き継ぐことを保証するように要求する。「共有」状態のキャッシュのロケーションは、バッキングストアの中のデータから変更されていない、リードオンリーの状態で存在する、処理ユニット１０２ａにより共有されるデータを含む。キャッシュ１０２ｂは、このデータをバッキングストアへ書き込むことなく、追い出すことができる。「無効」状態のキャッシュのロケーションには有効なデータはなんら含まれず、空の状態であるとみなすことができて、キャッシュミスのデータを記憶するのに使うことができる。「排他」状態のキャッシュのロケーションはバッキングストアと一致するデータを含み、単一の処理ユニット１０２ａのみによって使用される。このキャッシュのロケーションは、いつでも（すなわち、読み出し要求に応じて）「共有」状態へと変更しうる、又は書き込みの際に「変更」状態へと変更しうる。「所有」状態のキャッシュのロケーションは２つ以上の処理ユニット１０２ａによって共有されているが、処理ユニットのうちの一つが変更を行う排他的権利を有する。その処理が変更を行う場合、他の処理ユニットはＣＣＰの実装に基づいて自分のキャッシュを無効化する、又は更新する必要がある可能性があるため、他の処理ユニットに通知することがある。
【００３９】
データストア１０４は、アプリケーションプログラムを表すコンピュータ実行可能命令、例えばトレーサ１０４ａ、デバッガ１０４ｂ、オペレーティングシステムカーネル１０４ｃ、アプリケーション１０４ｄ（例えばトレーサ１０４ａによってトレースされる対象であるアプリケーション）を記憶することができる。これらのプログラムが（例えばプロセッサ１０２を使って）実行される場合、システムメモリ１０３はランタイムデータ構造、コンピュータ実行可能命令などの対応するランタイムデータを記憶することができる。したがって、図１はシステムメモリ１０３を（例えば、それぞれがアプリケーション１０４ｇに対応する）アプリケーションコード１０３ａ及びアプリケーションランタイムデータ１０３ｂを含んでいるものとして示している。データストア１０４はさらに、１つ又は複数のトレースデータストア１０４ｅの中に記憶されるトレースデータなどのデータ構造を記憶することができる。省略記号１０４ｆで示されるように、データストア１０４は他のコンピュータ実行可能命令及び／又はデータ構造も記憶することができる。
【００４０】
トレーサ１０４ａは、１つ又は複数のエンティティ、例えばアプリケーション１０４ｄ又はカーネル１０４ｃの１つ又は複数のスレッドの実行のビットアキュレートなトレースの記録、及びトレースデータのトレースデータストア１０４ｅへの記憶に使うことができる。一部の実施形態ではトレーサ１０４ａはスタンドアローンのアプリケーションであり、他の実施形態ではトレーサ１０４ａはカーネル１０４ｃ、ハイパーバイザ、クラウドファブリックなどの別のソフトウェアコンポーネントへ組み込まれる。トレースデータストア１０４ｅがデータストア１０４の一部であるものとして示されているが、トレースデータストア１０４ｅは少なくとも部分的にシステムメモリ１０３の中、キャッシュ１０２ｂの中、バッファ１０２ｅの中、又は何らかの他の記憶装置にあるものとして具現化できる。
【００４１】
既に述べたように、トレーサ１０４ａは１つ又は複数のエンティティの実行のビットアキュレートなトレースを記録する。本明細書で使用される場合、「ビットアキュレートな」トレースは、１つ又は複数の処理ユニット１０２ａで以前実行されたコードを再生できるようにするのに充分なデータを含むトレースであり、再生時にはトレース中と実質的に同一の方法でコードが実行される。トレーサ１０４ａがビットアキュレートなトレースを記録するのに使用しうる様々な手法があるが、それぞれに（例えばトレースのオーバーヘッド、トレースファイルのファイルサイズ、必要となるプロセッサへの変更の量などの点で）様々な利益と欠点がある。そのようなデータを記録するための一部の特定の実施形態は、図３〜９に関連して後述される。
【００４２】
トレーサ１０４ａにより使用される記録の手法に関わらず、トレーサ１０４ａはトレースデータを１つ又は複数のトレースデータストア１０４ｅへ記録することができる。例として、トレースデータストア１０４ｅは、１つ若しくは複数のトレースファイル、システムメモリ１０３の１つ若しくは複数の領域、プロセッサキャッシュ１０２ｂの１つ若しくは複数の領域（例えばＬ２キャッシュ又はＬ３キャッシュ）、プロセッサ１０２の中のバッファ１０２ｄ、又はこれらの任意の組み合わせ若しくは多数を含みうる。トレースデータストア１０４ｅは１つ又は複数のトレースデータストリームを含むこともできる。一部の実施形態では、例えば多数のエンティティ（例えばプロセスやスレッドなど）をそれぞれトレースして、別々のトレースファイル又は所与のトレースファイル内のトレースデータストリームとすることもできる。あるいは、各エンティティに対応するデータパケットを、当該エンティティに対応するものとして識別されるようにタグ付けすることもできる。多数の関連するエンティティ（例えば同一プロセスの複数のスレッド）がトレースされている場合、各エンティティに対するトレースデータを別々にトレースすることもできる（これによりトレースデータを個別に再生できる）が、それらのエンティティにわたって順序付け可能な任意のイベント（例えば、共有メモリへのアクセス）を個々のトレースにわたってグローバルな連続番号（例えば単調にインクリメントされる数字）で識別することができる。トレースデータストア１０４ｅは、トレースデータストリームを柔軟に管理、変更、及び／又は作成するために構成することができる。例えば、既存のトレースデータストリームの変更には既存のトレースファイルの変更、既存のファイル内のトレースデータの一部の置き換え、及び／又は変更を含む新しトレースファイルの作成が含まれうる。
【００４３】
一部の実装では、トレーサ１０４ａは、トレースデータがトレース中に絶えず増えるように、トレースデータストリームに連続的にアペンドしていくことができる。しかし、他の実装では、トレースデータストリームを１つ又は複数のリングバッファとして実装することもできる。そのような実装では、最も古いトレースデータは、新しいトレースデータがトレースデータストア１０４ｅへ追加される際にデータストリームから取り除かれる。それゆえ、トレースデータストリームがバッファとして実装される場合、トレースデータストリームはトレースされたプロセスで一番最近に実行された連続したトレースを含む。リングバッファを使用することで、トレーサ１０４ａが生産システムにおいてもトレースを「常に行っている（ａｌｗａｙｓ  ｏｎ）」ようにすることができる。一部の実装では、トレースは事実上いつでも、１つ又は複数の制御レジスタの中で１つ又は複数のビットを設定又は消去することなどによって、有効化及び無効化できる。それゆえ、リングバッファへトレースするのか、過去のトレースデータストリームへアペンドするのかに関わらず、トレースデータは処理ユニット１０２ａのうちの１つ又は複数に対してトレースが有効化された複数の期間の間の欠落部も含みうる。
【００４４】
デバッガ１０４ｂは、ユーザがトレースデータ（又はその派生物）に対してデバッグ活動を行うのを支援するため、トレーサ１０４ａにより生成されてトレースデータストア１０４ｅへ入れられたトレースデータを消費する（例えば、再生する）のに使うことができる。例えば、デバッガ１０４ｂは１つ又は複数のデバッグ用インタフェース（例えばユーザインタフェース及び／又はアプリケーションプログラミングインタフェース）を提示し、アプリケーション１０４ｄの１つ又は複数の部分の以前の実行を再生して、逆方向ブレークポイント／ウォッチポイントを含むブレークポイント／ウォッチポイントを設定して、トレースデータに対するクエリ／検索などが行えるようにすることもできる。
【００４５】
トレーサ１０４ａに戻ると、本明細書の実施形態では、トレーサ１０４ａはプロセッサ１０２のキャッシュ１０２ｂを利用して、アプリケーション１０４ｄ及び／又はオペレーティングシステムカーネル１０４ｃの実行のビットアキュレートなトレースを効率的に記録する。こうした実施形態は、プロセッサ１０２（キャッシュ１０２ｂを含む）が準閉鎖系又は疑似閉鎖系を形成するという本発明者による観察に基づいている。例えば、あるプロセスのデータ（すなわち、コードデータ及びランタイムアプリケーションデータ）の一部がキャッシュ１０２ｂへロードされると、プロセッサ１０２は、入力がなくても準閉鎖系又は疑似閉鎖系として短期間は独力で動作することができる。具体的には、キャッシュ１０２ｂにデータがロードされると、処理ユニット１０２ａのうちの１つ又は複数が、キャッシュ１０２ｂのデータ部に記憶されたランタイムデータ及びレジスタ１０２ｄを使って、キャッシュ１０２ｂのコード部にある命令を実行する。
【００４６】
処理ユニット１０２ａが情報のインフラックスをいくらか必要とする場合（例えば、処理ユニット１０２ａが実行する命令により、キャッシュ１０２ｂにまだないコード又はランタイムデータへのアクセスが行われる、又は行われうるために）、「キャッシュミス」が発生し、当該情報がシステムメモリ１０３からキャッシュ１０２ｂへ持ち込まれる。例えば、実行される命令がアプリケーションランタイムデータ１０３ｂ内のメモリアドレスにおいてメモリ操作を行う際にデータキャッシュミスが発生すると、そのメモリアドレスからのデータがキャッシュ１０２ｂのデータ部のキャッシュラインのうちの一つへと持ち込まれる。同様に、命令によりシステムメモリ１０３に記憶されたメモリアドレスアプリケーションコード１０３ａにおいてメモリ操作が行われる際にコードキャッシュミスが発生すると、そのメモリアドレスのコードがキャッシュ１０２ｂのコード部のキャッシュラインのうちの一つへと持ち込まれる。そして処理ユニット１０２ａはキャッシュ１０２ｂの中の新しい情報を使って、（例えば、別のキャッシュミス又はキャッシュされていない読み出しのために）また新しい情報がキャッシュ１０２ｂへと持ち込まれるまで実行を継続する。
【００４７】
また、本発明者は、アプリケーションの実行のビットアキュレートな表現を記録するために、処理ユニットがアプリケーションのスレッドを実行する際にトレーサ１０４ａは充分なデータを記録してキャッシュ１０２ｂへの情報のインフラックスを再現できることに気づいた。例えば、こうしたインフラックスを記録する一手法は、処理ユニットごとに、最も内側のキャッシュ層（例えばＬ１）において機能する。この手法は、トレースされている各処理ユニットに対して、当該処理ユニットのＬ１キャッシュに関連するすべてのキャッシュミス及びキャッシュされていない読み出し（すなわち、ハードウェアコンポーネント及びキャッシュ不能メモリからの読み出し）を、（例えば、実行される命令の数又は何か他の計数器を使って）各データが処理ユニットのＬ１キャッシュへ持ち込まれる実行中の時間と共に記録することを含みうる。複数の処理ユニットにわたって順序付けできるイベント（例えば、共有メモリへのアクセス）がある場合は、これらのイベントは、（例えば、データストリームにわたって単調にインクリメントされる数（ＭＩＮ）（又はデクリメントされる数）を使って）結果として生じるデータストリームにわたってログ記録することができる。
【００４８】
しかし、Ｌ１キャッシュ層はそれぞれが（例えば、図２Ａに示されるような）異なる物理処理ユニットに関連付けられた多数の別々のＬ１キャッシュを含みうるため、このように記録することで重複データが記録されて、「完全に忠実な」トレースに厳密に必要なものより多くのデータが記録されることがある。例えば、多数の物理処理ユニットが同一のメモリロケーションから読み出しを行う場合（これはマルチスレッドのアプリケーションでは頻繁に起こりうる）、この手法では同一のメモリロケーションに対するキャッシュミスと多数の物理処理ユニットのそれぞれに対するデータをログに記録することができる。特筆すべきことに、本明細書で使用される場合、「完全に忠実な」トレースとは、トレースされたエンティティの完全な再生ができるようにするのに充分な情報を含む任意のトレースであるが、特定の「完全に忠実な」トレースは、実際には代替のトレース手法を使って記録されうるものよりも少ない、同一の情報を包含するデータを含みうる。
【００４９】
トレースファイルのファイルサイズをさらに小さくするため、本発明者は、上位層のキャッシュのうちの１つ又は複数を利用して、この重複データの少なくとも一部の記録を回避する、改良された記録手法を開発した。それどころか、この改良された手法では、以前ログに記録されたデータを参照してログに記録する、又は多くの状況でログへの記録を完全に回避することができる。
【００５０】
１つ又は複数の上位キャッシュ層の知識をプロセッサが確認することに基づく下位キャッシュ層でのキャッシュミスのログ記録
【００５１】
第１実施形態では、プロセッサは第１処理ユニットによる活動（特定のメモリアドレスからの読み出しなど）に基づいて内側の、又は「下位層」のプロセッサキャッシュ（例えばＬ１）へのインフラックス（すなわちキャッシュミス）を検出し、１つ又は複数の外側の、又は「上位層」の共有プロセッサキャッシュを確認して、同一データ（すなわち、同一のメモリアドレス及び第１処理ユニットにより読み出されたのと同じ値）のインフラックスがトレースされた第２処理ユニットの為に既にログに記録されているかを判定する。既にログに記録されている場合、可能であればプロセッサは第２処理ユニットによる以前のインフラックスを参照して、第１処理によりこの最近のインフラックスをログに記録することができる。
【００５２】
これらの実施形態を理解するため、ほとんどの環境では、上位層のキャッシュはその下にある下位層のキャッシュよりも大きく、しばしば多数の下位層のキャッシュに対するバッキングストアとなっていることに留意されたい。例えば、図２Ａの例示の環境では、各Ｌ２キャッシュは２つのＬ１キャッシュに対するバッキングストアであり、各Ｌ３キャッシュは２つのＬ２キャッシュ（そして、さらに言うと４つのＬ１キャッシュ）に対するバッキングストアである。したがって、上位層のキャッシュは、多数の下位層のキャッシュに関する知識を保持することができる（例えば図２Ａでは、Ｌ２キャッシュＬ１−Ａ１はＬ１キャッシュ、Ｌ１−Ａ１及びＬ１−Ａ２に関する知識を保持することができて、Ｌ２キャッシュＬ１−Ａ２はＬ１キャッシュ、Ｌ１−Ａ３及びＬ１−Ａ４に関する知識を保持することができて、Ｌ３キャッシュＬ３−ＡはＬ２キャッシュ、Ｌ２−Ａ１及びＬ２−Ａ１、並びにＬ１キャッシュ、Ｌ１−Ａ１、Ｌ１−Ａ２、Ｌ１−Ａ３、及びＬ１−Ａ４に関する知識を保持することができる）。１つ又は複数の上位キャッシュ層の知識を利用することで、本明細書の実施形態は、別の処理ユニットの為に既にログに記録されているインフラックスを参照して、多くの機会で一つの処理ユニットにより引き起こされたインフラックスをログに記録することができる。
【００５３】
この第１実施形態に従い、図３は、１つ又は複数の上位レベルのキャッシュの知識に基づいて以前のログデータを参照して下位レベルのキャッシュへのインフラックスを記録することに基づく、例示のトレース記録方法３００を示す。図３は、図１及び図２の文脈で説明される。
【００５４】
具体的には、図３は、複数の処理ユニット、複数のレベルＮキャッシュ、及び複数のレベルＮキャッシュのうちの２つ以上と関連付けられ、複数のレベルＮキャッシュに対するバッキングストアとして構成されるレベル（Ｎ＋ｉ）キャッシュを備えるプロセッサ１０２又は２０１ａなどの環境において機能する。方法３００（及び請求項）において、Ｎ及びｉは正の整数、すなわちＮ≧１であり、そのためＮは１、２、３などと等しく、ｉ≧１であり、そのためｉは１、２、３などと等しい。例えば、図２Ａのプロセッサ２０１ａを参照すると、プロセッサは複数の処理ユニットＡ１、Ａ２などを備える。また、プロセッサ２０１ａは複数のレベルＮキャッシュ、Ｌ１−Ａ１、Ｌ１−Ａ２など（すなわち、Ｎは１と等しい）も備える。また、プロセッサ２０１ａは、複数のレベルＮキャッシュのうちの２つ以上と関連付けられ、複数のレベルＮキャッシュに対するバッキングストアとして構成されるレベル（Ｎ＋ｉ）キャッシュを備える。例えば、プロセッサ２０１ａは、レベルＮキャッシュ、Ｌ１−Ａ１やＬ１−Ａ２などに対するバッキングストアであるレベル（Ｎ＋ｉ）キャッシュＬ２−Ａ１（すなわち、Ｎは１と等しく、ｉは１と等しい）を備える。別の例では、プロセッサ２０１ａは、レベルＮキャッシュ、Ｌ１−Ａ１やＬ１−Ａ２などに対するバッキングストアであるレベル（Ｎ＋ｉ）キャッシュＬ３−Ａ（すなわち、Ｎは１と等しく、ｉは２と等しい）を備える。プロセッサ１０２／２０１ａは、マイクロコード１０２ｃなどの制御論理及び／又は回路論理に基づいて、方法３００を動作させる。
【００５５】
示されるように、方法３００は、第１処理ユニットでの実行中にレベルＮキャッシュへのインフラックスを検出する活動３０１を含む。一部の実施形態では、活動３０１は、メモリロケーションに記憶されるデータを含む、複数のレベルＮキャッシュのうちの第１レベルＮキャッシュへのインフラックスを検出することを含む。例えば、処理ユニットＡ１による、（例えば、アプリケーション１０４ｃの第１スレッドの正常な実行又は投機的実行に起因する）システムメモリ２０２に対して要求されたメモリアクセスなどの活動に基づいてキャッシュミスがキャッシュＬ１−Ａ１（すなわち、Ｎは１と等しい）で発生することがある。それゆえ、キャッシュＬ１−Ａ１のラインは、要求されたメモリロケーションの当時の最新の値を含む、データのインフラックスを取得する。キャッシュの属性（例えば、どのような上位レベルの層が存在するか、キャッシュアーキテクチャが包括的と排他的のいずれであるか、など）及び現在のキャッシュ状態に応じて、インフラックスをシステムメモリ２０２又は上位レベルのキャッシュ（例えば、Ｌ２−Ａ１及び／又はＬ３−Ａ）から供給することができる。
【００５６】
また、方法３００は、レベル（Ｎ＋ｉ）キャッシュを確認することでインフラックスのデータが第２処理ユニットでの実行に基づいて既にログに記録されているかを判定する活動３０２も含む。一部の実施形態では、活動３０２は、第１レベルＮキャッシュへのインフラックスの検出に基づいてレベル（Ｎ＋ｉ）キャッシュを確認し、メモリロケーションのデータが第２処理ユニットの為に以前ログに記録されているかどうかを判定することを含む。例えば、レベル（Ｎ＋ｉ）キャッシュがレベル（Ｎ＋１）キャッシュを含むように、ｉが１と等しい場合、プロセッサ２０１はＬ２−Ａ１（キャッシュＬ１−Ａ２及び処理ユニットＡ２の知識を有する）などのＬ２キャッシュを確認することができる。この確認は、メモリロケーションのデータが処理ユニットＡ２の為に以前ログに記録されていたかどうかを判定するのに使うことができる。このデータは、例えばキャッシュＬ１−Ａ２においてキャッシュミスを引き起こした、処理ユニットＡ２でのアプリケーション１０４ｃの第２スレッドの以前の実行に基づいて、以前ログに記録されていることがある。別の例では、レベル（Ｎ＋ｉ）キャッシュがレベル（Ｎ＋２）キャッシュを含むように、ｉが２と等しい場合、プロセッサ２０１はキャッシュＬ３−Ａ（プロセッサ２０１の中のすべての他のキャッシュの知識を有する）などのＬ２キャッシュを確認することができる。この確認は、（例えば、キャッシュＬ１−Ａ２、Ｌ１−Ａ３、及び／又はＬ１−Ａ４においてキャッシュミスを引き起こした、処理ユニットＡ２〜Ａ４のうちの１つ又は複数でのアプリケーション１０４ｃの１つ又は複数のスレッドの以前の実行に基づいて）メモリロケーションのデータが処理ユニットＡ２〜Ａ４のいずれかの為に以前ログに記録されていたかどうかを判定するのに使うことができる。なお、２番目の例では、Ｌ２キャッシュは確認時に飛ばされることがある。
【００５７】
示されるように、活動３０２は、ｉの値をその都度インクリメントして任意の回数繰り返すこともできる。典型的にはｉは都度１だけインクリメントされるが、１より大きい正の整数だけｉをインクリメントする実施形態もありうる。ｉをインクリメントしながら活動３０２を繰り返す効果は、多数の上位レベルのキャッシュを確認するためである。例えば、ｉ＝１であれば、活動３０２が最初に行われる際にプロセッサ２０１はＬ２キャッシュ層（例えば、Ｌ２−Ａ１及び／又はＬ２−Ａ２）を確認することができる。Ｌ２キャッシュにおいて、該当するメモリロケーションに関する知識が不充分であることがわかった場合、プロセッサ２０１はｉ＝２として活動３０２を繰り返すことで、Ｌ３キャッシュ層（例えばＬ３−Ａ）を確認することができる。これは、コンピューティング環境が提供するキャッシュのレベルの数だけ繰り返すこともできる。ｉが１より大きい値だけインクリメントされる場合、１つ又は複数のキャッシュ層がその過程で飛ばされることがある。このようにすることは、排他的キャッシュを提供するアーキテクチャ、又は包括的／排他的が混合された挙動を示すキャッシュを提供するアーキテクチャにおける多数のキャッシュレベルを確認するのに有益であることが理解されるであろう。これは、こうしたアーキテクチャでは外側のキャッシュ層が内側のキャッシュ層のデータの完全なスーパーセットを含むという保証がされないことがあるからである。
【００５８】
上述したことを考慮すると、プロセッサ１０２又は２０１ａなどの、ｉが１と等しく、レベル（Ｎ＋ｉ）キャッシュがレベル（Ｎ＋１）キャッシュを含み、プロセッサがレベル（Ｎ＋１）キャッシュに対するバッキングストアとして構成されるレベル（Ｎ＋２）キャッシュも備える環境において、方法３００は機能できることが理解されるであろう。これらの環境では、レベル（Ｎ＋１）キャッシュを確認してメモリロケーションのデータが第２処理ユニットの為に以前ログに記録されているかどうかを判定すること（すなわち活動３０２）は、レベル（Ｎ＋１）キャッシュにそのメモリロケーションに対応するキャッシュラインがないと判定することを含むことができる。さらに、レベル（Ｎ＋２）キャッシュを確認してそのメモリロケーションのデータが第２処理ユニットの為に以前ログに記録されているかどうかを判定すること。
【００５９】
示されるように、活動３０２の結果に基づき、方法は、データが既にログに記録されている場合は参照によりインフラックスをログに記録する活動３０３を含み、データがまだログに記録されていない場合はインフラックスを値でログに記録する活動３０４を含む。
【００６０】
一部の実施形態では、活動３０３は、メモリロケーションのデータが第２処理ユニットの為に以前ログに記録されている場合に、第２処理ユニットの為に以前ログに記録されたログデータを参照して第１処理ユニットの為にそのメモリロケーションのデータをログに記録することを含む。上記の例に続いて、例えば、レベル（Ｎ＋１）キャッシュＬ２−Ａ１の確認、及び／又はレベル（Ｎ＋２）キャッシュＬ３−Ａの確認によって、データ／メモリロケーションが処理ユニットＡ２の為に（キャッシュＬ１−Ａ２へのインフラックスに基づいて）既にログに記録されていたと判定される場合、プロセッサ２０１ａはキャッシュＬ１−Ａ１へのインフラックスを、処理ユニットＡ２に対して作成されたログエントリを参照して処理ユニットＡ１の為にログに記録することができる。参照によるログ記録がどのように遂行されうるかの例は後述される。
【００６１】
活動３０２の別の結果を検討すると、一部の実施形態では、活動３０４は、メモリロケーションのデータが第２処理ユニットの為に以前ログに記録されていない場合にそのメモリロケーションのデータを第１処理ユニットの為に値でログに記録することを含む。例えば、レベル（Ｎ＋１）キャッシュＬ２−Ａ１の確認、及び／又はレベル（Ｎ＋２）キャッシュＬ３−Ａの確認によって、データ／メモリロケーションが別の処理ユニットの為にまだログに記録されていないと判定される場合、プロセッサ２０１ａはキャッシュＬ１−Ａ１へのインフラックスを、処理ユニットＡ１の為に値でログに記録することができる。値でログに記録することには、例えば、処理ユニットＡ１に対するデータパケットにおけるメモリアドレス及びメモリの値をログに記録することを含みうる。なお、値でログに記録することには、実際のログ記録を遂行するのに必要なビット数を減少させるために任意の数の圧縮手法を含みうる。
【００６２】
図１に関連して説明されたように、プロセッサ１０２はトレースデータを一時的に記憶するのに使用可能なバッファ１０２ｅを備えうる。したがって、方法３００において、異なる種類のデータをログに「記録する」ことには、プロセッサ１０２がそのようなデータをバッファ１０２ｅへ記憶することも含むことができる。さらに、又はあるいは、プロセッサ１０２がそのようなデータをトレーサ１０４ａへ伝えること、そのようなデータをトレースデータストア１０４ｅへ書き込むこと、及び／又はデータがバッファ１０２ｄ内で利用可能であるとトレーサ１０４ａに通知することも含むことができる。一部の実施形態では、バッファ１０２ｄはキャッシュ１０２ｂの１つ又は複数の予約部を含むこともできる。したがって、活動３０４／３０４においてバッファ１０２ｅを使ってメモリロケーションのデータを参照又は値のどちらかにより第１処理ユニットの為にログに記録することには、プロセッササイクル、メモリロケーション、バス帯域幅などのリソースの利用可能性に基づいてログ記録を遅延させることを含むこともできる。バッファ１０２ｄがキャッシュ１０２ｂの１つ又は複数の予約部を含む実施形態では、遅延ログ記録（遅延ロギング）は、（レベルＮキャッシュ及び／又はレベル（Ｎ＋ｉ）キャッシュの中の）キャッシュラインを、遅延ログ記録を目的としてメモリロケーションのデータを保持するために、追い出すのではなく無効化することを含むこともできる。
【００６３】
方法３００の説明では、下位層のキャッシュに関する「知識」を有する上位層のキャッシュについて言及した。上位層のキャッシュが下位レベルのキャッシュに関して保持する特定の形態の「知識」は異なることがあり、以下に例を続ける。
【００６４】
基本的に、この「知識」は下位レベルのキャッシュの中のキャッシュラインに対応する上位レベルのキャッシュの中のキャッシュライン（すなわち、同一のメモリロケーション及びメモリデータに対応するキャッシュライン）の存在に過ぎないことがある。上述したように、包括的キャッシュでは、上位層はその下の層にあるデータのスーパーセットを記憶する。例えば、図２Ａのキャッシュが包括的であるとする。この場合、処理ユニットＡ２の活動によってロケーションがシステムメモリ２０２からキャッシュＬ１−Ａ２へインポートされると、同一のメモリロケーションがキャッシュＬ２−Ａ１及びＬ３−Ａにもキャッシュされる。処理ユニットＡ２の活動がトレースされている場合、実施形態によってメモリロケーション及びその値が処理ユニットＡ２の為にログに記録されることがある。その後、処理ユニットＡ１の活動によって同一のロケーションがシステムメモリ２０２からキャッシュＬ１−Ａ１へインポートされ、そのロケーションがいまだに同一のデータを記憶している場合は、そのデータは、キャッシュＬ２−Ａ１が既にそのデータを保有しているため、キャッシュＬ２−Ａ１から供給される。この場合でも、先の手法により、このデータがキャッシュＬ２−Ａ１へのインフラックスであることに基づいて処理ユニットＡ１のためにログに記録することができる。しかし、本明細書の実施形態では、代わりにメモリロケーション及びその値が既にキャッシュＬ２−Ａ１に存在し、したがって既にキャッシュＬ１−Ａ２に存在すると認識することができる。処理ユニットＡ２はログに記録されているため、実施形態では、メモリロケーション及びその値が処理ユニットＡ２の為に既にログに記録されていているであろうと認識することができて、そのため処理ユニットＡ２の為に以前記録されたログデータを参照して、処理ユニットＡ１のこの新しい活動をログに記録することができる。
【００６５】
上位層のキャッシュによる、より精巧な形態の「知識」も可能である。例えば、実施形態では１つ又は複数のキャッシュ層の中のキャッシュラインを、追加の「アカウンティング」（又はログ記録）ビットであってアカウンティングビットが実装されたキャッシュラインのそれぞれに対してそのキャッシュラインが（潜在的にはキャッシュラインをログに記録した処理ユニットの素性と共に）ログに記録されているかどうかをプロセッサ１０２が識別できるようにするアカウンティングビットで拡張することができる。この概念の理解のため、図４Ａは図２Ｂの共有キャッシュ２０３と類似した共有キャッシュの例４００Ａを示し、キャッシュライン４０４のそれぞれは１つ又は複数の追加のアカウンティングビット４０１を含む。したがって、各キャッシュライン４０４は、アカウンティングビット４０１、並びに従来のアドレスビット４０２及び値ビット４０３を含む。
【００６６】
あるいは、図４Ｂは、メモリアドレス４０２及び値４０３を記憶する従来のキャッシュライン４０５と、従来のキャッシュライン４０５へ適用されるアカウンティングビットを格納するための１つ又は複数の予約されたキャッシュライン４０６とを含む共有キャッシュ４００ｂの例を示す。予約されたキャッシュライン４０６のビットは、それぞれが従来のキャッシュライン４０５のうちの異なる一つに対応する、異なるグループのアカウンティングビットへ割り当てられる。
【００６７】
図４Ｂの例の変形では、予約されたキャッシュライン４０６はセットアソシアティブキャッシュ（以降でより詳細に記述される）の各インデックスにおいて１つ（又は複数）のウェイとして予約することもできる。例えば、８ウェイ・セットアソシアティブキャッシュでは、セット内の１つのウェイはそのセット内の他の７つのウェイに適用されるアカウンティングビット用に予約することもできる。これにより、予約されたキャッシュラインの実装の複雑性を減らすことができて、所与のセット内のすべてのウェイが典型的にはほとんどのプロセッサで並列に読み出されるため、予約されたキャッシュラインへのアクセスを速くすることができる。
【００６８】
アカウンティングビットが実際にどのように格納されるかに関わらず、各キャッシュラインのアカウンティングビット４０１は、プロセッサ１０２により使用されてキャッシュライン内の現在の値が処理ユニットの為にログに記録されたかどうか（あるいは、ログ記録に関与する処理ユニットにより消費されたかどうか）を示すフラグ（すなわち、オン又はオフ）として機能する１つ又は複数のビットを含むこともできる。したがって、活動３０２における確認には、キャッシュラインがログ記録に関与する処理ユニットによりログに記録されているかを判定するのにこのフラグを使うことを含むことができる。
【００６９】
あるいは、各キャッシュラインのアカウンティングビット４０１は複数ビットを含むこともできる。複数ビットはいくつかのウェイで使用することもできる。本明細書で「ユニットビット」と呼ばれる一手法を使うことで、各キャッシュラインのアカウンティングビット４０１は、プロセッサ１０２の処理ユニット１０２ａの個数（例えば、プロセッサ１０２がハイパースレッディングをサポートする場合は論理処理ユニットの個数、又はハイパースレッディングがサポートされない場合は物理処理ユニットの個数）と等しい数のユニットビットを含むことができる。これらのユニットビットは、どの１つ又は複数の特定の処理ユニットがキャッシュライン（もしあれば）をログに記録したかをプロセッサ１０２が追跡するのに使うことができる。したがって、例えば２つの処理ユニット１０２ａによって共有されるキャッシュは、２つのユニットビットを各キャッシュラインと関連付けることができる。
【００７０】
本明細書で「インデックスビット」と呼ばれる、複数のアカウンティングビット４０１を使用する別の手法では、各キャッシュラインのアカウンティングビット４０１は、コンピュータシステム１０１のプロセッサ１０２のログ記録に関与する処理ユニット１０２ａのそれぞれに対するインデックスを表すのに充分な数のインデックスを、潜在的に「予約された」値（例えば、−１）と共に含むことができる。例えば、プロセッサ１０２が１２８個の処理ユニット１０２ａを含む場合、これらの処理ユニットは、キャッシュラインあたり７つのインデックスビットだけを使って、インデックス値（例えば、０〜１２７）で識別することができる。一部の実施形態では、一つのインデックス値はキャッシュラインをログに記録したプロセッサがないことを示す（例えば、「無効」）ために予約されている。したがって、これは、７つのインデックスビット１２７個の処理ユニット１０２ａに加えて予約された値を実際に表すことができることを意味する。例えば、二進数値０００００００〜１１１１１１０はインデックスのロケーション０〜１２６（１０進数）に対応することがあり、二進数値１１１１１１１（例えば、１０進数では解釈に応じて−１又は１２７）は、対応するキャッシュラインをログに記録したプロセッサがないことを示す「無効」に対応することがあるが、この表記法は実装によっては異なることがある。したがって、ユニットビットは、プロセッサ１０２がキャッシュラインがログに記録されているか（例えば、−１以外の値）を示すのに使うことができて、キャッシュラインをログに記録した特定の処理ユニット（例えば、一番最近にそのキャッシュラインを消費した処理ユニット）に対するインデックスとして使うことができる。複数のアカウンティングビット４０１の使用に関するこの第２の手法は、キャッシュ１０２ｂにおいてわずかなオーバーヘッドで多数の処理ユニットをサポートできるという利点があり、第１の手法よりも粒度が劣る（すなわち、一度にたった一つの処理ユニットのみが識別される）という欠点がある。
【００７１】
上述したことを考慮すると、活動３０２において、レベル（Ｎ＋ｉ）キャッシュを確認してメモリロケーションのデータが第２処理ユニットの為に以前ログに記録されているかを判定することが、そのメモリロケーションに対応するレベル（Ｎ＋ｉ）キャッシュの中のキャッシュラインが１つ又は複数のアカウンティングビットの組を有しているかを判定することも含むことができることが理解されるであろう。
【００７２】
キャッシュラインがログに記録されているかどうかを判定するのに使用可能な別の仕組みは、セットアソシアティブキャッシュ及びウェイのロックを利用することである。プロセッサのキャッシュ１０２ｂは通常、システムメモリ１０３より（しばしば数桁の差で）はるかに小さいため、システムメモリ１０３内には通常、キャッシュ１０２ｂの所与の層の中のラインよりもはるかに多くのメモリロケーションがある。それゆえ、一部のプロセッサではシステムメモリの多数のメモリロケーションを１つ又は複数のキャッシュ層の中のラインへマッピングするための仕組みを規定している。プロセッサは通常、２つの一般的手法、すなわち、ダイレクトマッピング方式とアソシアティブ（又はセットアソシアティブ）マッピング方式のうちの１つを採用する。ダイレクトマッピング方式を使うことで、システムメモリ１０３内の異なるメモリロケーションがキャッシュ層の中のただ一つのラインへマッピングされ、それぞれのメモリロケーションをその層の中の特定のラインへキャッシュすることができる。
【００７３】
一方、セットアソシアティブマッピング方式を使うことで、システムメモリ１０３内の異なるロケーションをキャッシュ層の中の多数のラインのうちの１つへキャッシュすることができる。図５は、システムメモリとキャッシュの間のセットアソシアティブマッピング方式の例５００を示す。ここで、キャッシュ層５０２のキャッシュライン５０４は、それぞれ２つのキャッシュラインの異なるセットへと論理的に分割され、２つのキャッシュライン５０４ａ及び５０４ｂ（インデックス０として識別される）の第１セットと、２つのキャッシュライン５０４ｃ及び５０４ｄ（インデックス１として識別される）の第２セットを含む。セット内の各キャッシュラインは異なる「ウェイ」として識別されて、キャッシュライン５０４ａはインデックス０、ウェイ０で識別され、キャッシュライン５０４ｂはインデックス０、ウェイ１で識別される。さらに示されているように、メモリロケーション５０３ａ、５０３ｃ、５０３ｅ、５０３ｇ（メモリインデックス０、２、４、６）はインデックス０へマッピングされる。それゆえ、システムメモリ内のこれらのロケーションのそれぞれは、インデックス０のセット内の任意のキャッシュライン（すなわち、キャッシュライン５０４ａ及び５０４ｂ）へキャッシュすることができる。示されているマッピングの特定のパターンは例証及び概念的な説明だけを目的としており、メモリインデックスをキャッシュラインへマッピングしうるただ一つの方法と解釈されるべきではない。
【００７４】
セットアソシアティブキャッシュは通常、Ｎウェイ・セットアソシアティブキャッシュと呼ばれ、Ｎは各セット内の「ウェイ」の個数である。したがって、図５のキャッシュ５００は、２ウェイ・セットアソシアティブキャッシュと呼ばれるであろう。プロセッサは通常、Ｎウェイ・キャッシュを実装しており、Ｎは２の累乗（例えば、２、４、８など）であり、４及び８のＮ値が通常選ばれる（ただし、本明細書の実施形態はいかなる特定のＮ値又はＮ値のサブセットにも限定されない）。特筆すべきことに、１ウェイ・セットアソシアティブキャッシュは、各セットがたった一つのキャッシュラインを含むため、通常ダイレクトマッピングされたキャッシュに相当する。さらに、Ｎがキャッシュの中のラインの個数に等しい場合、キャッシュの中のすべてのラインを含む単一のセットが含まれるため、フルアソシアティブキャッシュと呼ばれる。フルアソシアティブキャッシュでは、任意のメモリロケーションをキャッシュの中の任意のラインへキャッシュすることができる。
【００７５】
図５は、一般的原理を示すためにシステムメモリ及びキャッシュの略図を表していることに留意されたい。例えば、図５では個々のメモリロケーションをキャッシュラインへマッピングしているが、キャッシュの中の各ラインは、システムメモリ内の多数のアドレス可能なロケーションに関するデータを記憶しうることが理解されるであろう。したがって、図５では、システムメモリ（５０１）内のそれぞれのロケーション（５０３ａ〜５０３ｈ）は実際に複数のアドレス可能なメモリロケーションを表しうる。さらに、システムメモリ５０１内の実際の物理アドレスとキャッシュ５０２の中のラインの間でマッピングを行うことができて、又は、マッピングに仮想アドレスの中間層を使うことができる。
【００７６】
セットアソシアティブキャッシュは、キャッシュラインがウェイのロックを使ってログに記録されているかどうかを判定するのに使うことができる。ウェイのロックにより、キャッシュの中の１つ又は複数のウェイが何らかの目的でロック又は予約される。具体的には、本明細書の実施形態は、ウェイのロックを利用してトレースされている処理ユニット用に１つ又は複数のウェイを予約し、ロック／予約されたウェイがそのユニットの実行に関連するキャッシュミスを記憶するために独占的に使用される。したがって、図５を再び参照すると、「ウェイ０」がトレースされた処理ユニット用にロックされた場合、キャッシュライン５０４ａ及び５０４ｃ（すなわち、インデックス０、ウェイ０及びインデックス１、ウェイ０）はそのユニットの実行に関連するキャッシュミスのために独占的に使用され、残りのキャッシュラインはすべての他のキャッシュミスのために使用されることになる。したがって、特定のキャッシュラインがログに記録されているかどうかを判定するには、プロセッサ１０２は、「Ｎ＋１」キャッシュ層に格納されるキャッシュラインがトレースされた処理ユニット用に予約されたウェイの一部であるかどうかを判定するだけでよい。
【００７７】
上述したことを考慮すると、活動３０２において、レベル（Ｎ＋ｉ）キャッシュを確認してメモリロケーションのデータが第２処理ユニットの為に以前ログに記録されているかを判定することが、そのメモリロケーションに対応するレベル（Ｎ＋ｉ）キャッシュの中のキャッシュラインがログ記録された処理ユニットに対応するウェイに格納されているかを判定することも含むことができることが理解されるであろう。
【００７８】
既に説明されたように、キャッシュはＣＣＰに従って動作し、ＣＣＰは処理ユニットがキャッシュデータから読み出し、及びキャッシュデータへ書き込みを行う際に様々なキャッシュの間で整合性を維持する方法、及び処理ユニットがキャッシュの中の所与のロケーションから常に有効なデータを読み出すのを確実にする方法を規定する。それゆえ、キャッシュを動作させるのに関連して、プロセッサ１０２はＣＣＰ状態データを維持、記憶する。異なるプロセッサ及び／又は異なるＣＣＰがキャッシュコヒーレンシの状態を追跡し、そのキャッシュコヒーレンシのデータをトレーサ１０４ａへ提供する粒度は、異なることがある。一方で、例えば、一部のプロセッサ／ＣＣＰはキャッシュラインごとのキャッシュコヒーレンシ及び処理ユニットごとのキャッシュコヒーレンシを追跡する。それゆえ、これらのプロセッサ／ＣＣＰは各キャッシュラインの状態を、各処理ユニットに関連するため、追跡する。これは、単一のキャッシュラインはその状態に関する情報を、各処理ユニット１０２ａに関連するために有していることを意味する。他のプロセッサ／ＣＣＰは粒度で劣り、キャッシュコヒーレンシの追跡はキャッシュラインのレベルのみを行う（そして処理ユニットごとのキャッシュコヒーレンシの情報を欠いている）。反対に、プロセッサの製造者は、ただ一つのプロセッサが一度にラインを独占的に（排他的に、変更されて、など）所有できるため、キャッシュコヒーレンシの追跡を効率のためにキャッシュラインのレベルのみで行うことを選ぶことがある。中程度の粒度の例として、プロセッサ／ＣＣＰはキャッシュラインごとのキャッシュコヒーレンシ及び現在のキャッシュラインの状態を有する処理ユニットに対するインデックス（例えば、４つの処理ユニットのプロセッサに対して０、１、２、３）を追跡することがある。
【００７９】
所与のプロセッサでＣＣＰ状態データが維持される粒度に関わらず、このＣＣＰ状態データはレベル（Ｎ＋ｉ）キャッシュがキャッシュされたデータに関して持っている「知識」に含まれうる。具体的には、レベル（Ｎ＋ｉ）キャッシュの中の所与のキャッシュラインに関連付けられたＣＣＰ状態データは、そのキャッシュラインが処理ユニットのうちの１つによりログに記録されているかを判定するのに使うことができる。例えば、ＣＣＰ状態データが、特定の処理ユニットが「共有」状態で所与のキャッシュラインを利用したことを示している場合、このデータは同様に、そのキャッシュラインからの読み出しをその処理ユニットがログに記録したことを判定するのに使うことができる。したがって、活動３０２において、レベル（Ｎ＋ｉ）キャッシュを確認してメモリロケーションのデータが第２処理ユニットの為に以前ログに記録されているかを判定することが、そのメモリロケーションに対応するレベル（Ｎ＋ｉ）キャッシュの中のキャッシュラインがそのキャッシュラインがログに記録されていることを判定するのに使うことができる関連するＣＣＰ状態データを有しているかを判定することも含むことができることが理解されるであろう。
【００８０】
活動３０３において、データのインフラックスは以前ログに記録されたデータ（典型的には、現在のインフラックスを引き起こしたものとは異なる処理ユニットによりログに記録されたデータ）を参照してログに記録することができる。参照によりログに記録することは、様々な方法のうちの１つ又は複数（それらの組み合わせを含む）を使って遂行することができる。
【００８１】
第１の方法では、以前ログに記録されたメモリアドレスを参照してログに記録する。例えば、図２Ａの処理ユニットＡ２が特定のメモリアドレス（すなわち、システムメモリ２０２）を表すデータ及びそのメモリアドレスに記憶される特定のデータをログに記録したとする。その後、その特定のメモリアドレス／特定のデータが処理ユニットＡ１に対するインフラックスである場合、処理ユニットＡ１は、（ｉ）特定のメモリアドレス、及び（ｉｉ）処理ユニットＡ２を識別するログエントリを記憶することもできる。ここで、処理ユニットＡ１はそのメモリアドレスに記憶される実際のデータ（これはかなりのサイズでありうる）を再度ログに記録するのを回避した。また、第１の方法の変形の一部においては、処理ユニットＡ１及びＡ２用のデータストリームにわたってインクリメントされる系列からのＭＩＮなどの順序付けデータを記憶することもできる。このＭＩＮは、このインフラックスを処理ユニットＡ２での１つ又は複数のイベント（例えば、同一の系列からのＭＩＮに関連付けられているもの）に対して処理ユニットＡ１により後で順序付けするのに使うことができる。したがって、活動３０３において、第２処理ユニットの為に以前ログに記録されたログデータを参照してメモリロケーションのデータを第１処理ユニットの為にログに記録することは、そのメモリロケーションのアドレスをログに記録すること、又はそのメモリロケーションのアドレス及びＭＩＮなどの順序付けデータをログに記録することの１つ又は複数を含むこともできる。
【００８２】
第２の方法では、データを記憶するキャッシュラインの以前の所有者を参照してログに記録する。例えば、図２Ａの処理ユニットＡ２がデータの第１インフラックスをログに記録したとする。また、第１インフラックスによりデータがレベル（Ｎ＋ｉ）キャッシュ（例えばＬ２−Ａ１）のキャッシュラインにキャッシュされて、処理ユニットＡ２がキャッシュラインの所有者であると識別されたとする。その後に処理ユニットＡ１が同一データの第２インフラックスを引き起こした場合は、処理ユニットＡ１はレベル（Ｎ＋ｉ）キャッシュの中のこのキャッシュラインの所有者になることもできる。そして、処理ユニットＡ１はキャッシュラインの以前の所有者（すなわち、処理ユニットＡ２）を特定するログエントリを記憶することもできて、この結果、後でデータを得るためにＡ２のログエントリを使うことができる。これは、参照によりログに記録することが、キャッシュラインの以前の所有者と共にキャッシュラインの素性を記録することを含みうるということを意味する（例えば、潜在的にメモリアドレス及びメモリの値を記録するのを回避する）。したがって、活動３０３において、第２処理ユニットの為に以前ログに記録されたログデータを参照してメモリロケーションのデータを第１処理ユニットの為にログに記録することは、そのメモリロケーションに対応するキャッシュラインの以前の所有者として第２処理ユニットをログに記録することを含むこともできる。
【００８３】
第３の方法では、ＣＣＰデータを参照してログに記録する。例えば、既に述べたように、ＣＣＰは、異なる処理ユニットが読み出し及び書き込みを行うためにキャッシュラインを利用する際に、各キャッシュラインに関するキャッシュコヒーレンシ状態を記憶することができる。このデータの粒度はプロセッサの実装によって異なることがあるが、例えば、キャッシュラインが各処理ユニットに関連するため各キャッシュラインに関するキャッシュコヒーレンシ状態を追跡すること、現在のキャッシュライン状態を所有する処理ユニットに対するインデックス（例えば、０、１、２、３など）と共に各キャッシュラインのキャッシュコヒーレンシ状態を追跡すること、などもできる。第３の方法では利用可能なＣＣＰデータを利用して、どの処理ユニットがキャッシュラインのキャッシュコヒーレンシ状態を以前所有したかを追跡し、このキャッシュコヒーレンシ状態をどの処理ユニットがキャッシュラインの値をログに記録したかを特定するのに使うことができる。これは、参照によりログに記録することが、キャッシュラインに対するＣＣＰデータを記録することを含みうるということを意味する（例えば、この場合も潜在的にメモリアドレス及びメモリの値を記録するのを回避する）。したがって、活動３０３において、第２処理ユニットの為に以前ログに記録されたログデータを参照してメモリロケーションのデータを第１処理ユニットの為にログに記録することは、第２処理ユニットを参照してＣＣＰデータをログに記録することを含むこともできる。
【００８４】
第４の方法では、キャッシュのウェイを参照してログに記録する。既に述べたように、セットアソシアティブキャッシュは、キャッシュラインがウェイのロックを使ってログに記録されているかどうかを判定するのに使うことができる。例えば、ウェイのロックが処理ユニットＰ２のために１つ又は複数のウェイを予約するのに使用され、Ｐ２がデータの第１インフラックスをログに記録するとする。また、第１インフラックスによって、レベル（Ｎ＋ｉ）キャッシュ（例えば、キャッシュＬ２−Ａ１）が第１インフラックスのデータをそのウェイに関連付けられたキャッシュラインに記憶する。別の処理ユニット（例えばＰ１）が同一データの第２インフラックスを有している場合、レベル（Ｎ＋ｉ）キャッシュの中にこのキャッシュラインが存在していることが、Ｐ２がこのデータをすでにログに記録したことを示す。実施形態では、キャッシュラインが格納されているウェイの記録に基づきＰ２のログデータへの参照をログに記録することができて、この場合も潜在的にメモリアドレス及びメモリの値をログに記録するのを回避できる。また、この実施形態は、Ｐ１とＰ２の間でイベントを順序付けするために順序付け情報（例えばＭＩＮ）を記録するのに関連して使うことができる。したがって、活動３０３において、第２処理ユニットの為に以前ログに記録されたログデータを参照してメモリロケーションのデータを第１処理ユニットの為にログに記録することは、キャッシュのウェイへの参照をログに記録すること、又はキャッシュのウェイへの参照及び順序付けデータをログに記録することの１つ又は複数を含むこともできる。
【００８５】
第２処理ユニットによる以前のインフラックスに基づいて第１処理ユニットに対するインフラックスをログに記録することに加え、実施形態は、単一の処理ユニットによる同一データのインフラックスが多数ある場合にログ記録を削減する（及び、さらに削除する）ための最適化も含む。例えば、図２Ａを参照すると、処理ユニットＡ１はレベルＮキャッシュ（例えば、Ｌ１−Ａ１キャッシュ）において、あるメモリロケーションの特定のデータに対するキャッシュミスを引き起こすこともできる。これに応答して、キャッシュ階層はこのデータをＬ１−Ａ１キャッシュへ、また潜在的にレベル（Ｎ＋ｉ）キャッシュ（例えば、Ｌ２−Ａ１キャッシュ及び／又はＬ３−Ａキャッシュ）へもインポートすることができる。さらに、インフラックスは処理ユニットＡ１のために値でログに記録することができる。その後、このデータをＬ１−Ａ１キャッシュから追い出すこともできる。こうすることで、典型的なキャッシュ環境ではデータをＬ２−Ａ１キャッシュ及び／又はＬ３−Ａキャッシュからも積極的に追い出すことができる。しかし、実施形態では、Ｌ２−Ａ１キャッシュ及び／又はＬ３−Ａキャッシュで追い出しを行うのではなく、これらのレベル（Ｎ＋ｉ）キャッシュのうちの１つ又は複数の中の適切なキャッシュラインを保持することもできる。したがって、方法３００は、メモリロケーションに対応する第１レベルＮキャッシュの中の第１キャッシュラインを追い出す一方で、そのメモリロケーションに対応するレベル（Ｎ＋ｉ）キャッシュの中の第２キャッシュラインを保持することを含むことができる。
【００８６】
その後、処理ユニットＡ１がＬ１−Ａ１キャッシュにおいて同一データに対して次のキャッシュミスを引き起こした場合、レベル（Ｎ＋ｉ）キャッシュ（例えば、Ｌ２−Ａ１キャッシュ及び／又はＬ３−Ａキャッシュ）の中の保持されたキャッシュラインを、このデータが処理ユニットＡ１の為に既にログに記録されていることを判定するのに使うことができる。したがって、一部の実施形態では、この後続のキャッシュミスは処理ユニットＡ１による以前のログエントリを参照してログに記録される。他の実施形態では、処理ユニットＡ１が既にデータをそのトレース内に持っているため、この後続のキャッシュミスに対しするログエントリは完全に省略することもできる。したがって、方法３００は、第１レベルＮキャッシュへの後続のインフラックスの検出に基づいて、メモリロケーションに記憶されたデータも含む後続のインフラックスを、第２キャッシュラインの存在に基づき、参照によりログに記録することを含むことができる。さらに、又はあるいは、方法３００は、（ｉ）第１処理ユニットでの追加のコード実行に基づいて、第１レベルＮキャッシュへのメモリロケーションに記憶されたデータも含む後続のインフラックスを検出すること、及び（ｉｉ）第１レベルＮキャッシュへの後続のインフラックスの検出に基づき、また少なくとも第２キャッシュラインの存在に基づき、後続のインフラックスはログに記録する必要がないと判定することを含むことができる。
【００８７】
プロセッサによる１つ又は複数の上位キャッシュ層の確認に基づいて下位キャッシュ層でログ記録を行うというこの第１実施形態は、図３の方法３００を実現するプロセッサ制御論理（例えば、回路及び／又はマイクロコード）として実現することもできるということが理解されるであろう。それゆえ、この実施形態を実現するプロセッサ１０２は、下位層（例えばＬ１）のキャッシュへのインフラックスを検出するプロセッサ制御論理を含むこともできて、方法３００で概説したように、（潜在的に徐々に）１つ又は複数の上位層のキャッシュを確認してインフラックスを参照によりログに記録することができるか、又はさらに、そもそもインフラックスをログに記録する必要があるかを判定することもできる。
【００８８】
下位キャッシュ層が上位キャッシュ層へログ記録要求を送信することに基づく下位キャッシュ層でのキャッシュミスのログ記録
【００８９】
第２実施形態では、プロセッサは第１処理ユニットによる活動（特定のメモリアドレスからの読み出しなど）に基づいて下位層のプロセッサキャッシュ（例えばＬ１）へのインフラックス（すなわち、キャッシュミス）を検出し、この下位層のプロセッサキャッシュは、上位層のキャッシュがインフラックスをログに記録することを要求する、及び／又はインフラックスをどのようにログに記録すべきかを上位層のキャッシュが下位層に通知することを要求する。そして、上位層のキャッシュは、インフラックスをログに記録する必要があるか、及びどのように記録すべきか（例えば、値で、又は参照により）、及び／又はインフラックスをどのようにログに記録すべきか、を判断するのに不可欠な知識を欠いている場合に、さらに別の上位層のキャッシュ（存在する場合）へ要求を渡す。これがレベルＮキャッシュまで続くことがある。
【００９０】
この第２実施形態を実現するプロセッサ１０２は、すべての上位層のキャッシュ又は少なくともログ記録プロセスに関与するすべての上位層のキャッシュに共通の（又は少なくとも非常に類似した）制御論理を実装することで、潜在的にこのようにすることもできる。一部の実装では、第２実施形態を実現するのに必要な制御論理は、第１実施形態を実現するのに必要な制御論理ほど大規模ではないことがあるが、上位レベルのキャッシュの知識を活用して下位レベルのキャッシュでのインフラックスをログに記録することに由来する同じ利点の多く（又はすべて）を提供する。さらに、ほとんどのプロセッサでは、複数のキャッシュレベルが互いの間でＣＣＰメッセージを既に渡しているため、第２実施形態を実現するのに必要な制御論理は、潜在的に既存の制御論理に対する拡張として実装されうる。
【００９１】
第２実施形態に従い、図６は、下位キャッシュ層によるログ記録要求に基づき、下位キャッシュ層がどのようにインフラックスにログインするかを上位キャッシュ層が判断する例示の方法６００のフローチャートを示す。方法３００と同様に、方法６００は複数の処理ユニット（例えば、２つ以上の処理ユニットＡ１〜Ａ４）及び複数のキャッシュ層に配列される複数のキャッシュを備えるプロセッサ２０１ａを示している図２Ａの例示の環境などのマイクロプロセッサ環境で実行することができる。これらのキャッシュは、第１キャッシュ層の中に複数の第１キャッシュ（例えば、キャッシュ、Ｌ１−Ａ１〜Ｌ１−Ａ４のうちの２つ以上）、及び第２キャッシュ層の中に１つ又は複数の第２キャッシュ（例えば、キャッシュＬ２−Ａ１、Ｌ２−Ａ２のうちの１つ又は複数、又はキャッシュＬ３Ａ）を含むことができる。これらのキャッシュは、少なくとも第１キャッシュ層の中の特定の第１キャッシュ（例えばＬ１−Ａ１）に対するバッキングストアとして機能する第２キャッシュ層の中の特定の第２キャッシュ（例えば、キャッシュＬ２−Ａ１又はキャッシュＬ３−Ａ）を含むことができる。簡単にするため、方法６００では、特定の第１キャッシュを「第１キャッシュ」、特定の第２キャッシュを「第２キャッシュ」と呼ぶ。マイクロプロセッサ環境は、この方法を実行するための制御論理（例えば、マイクロコード１０２ｃ及び／又は回路）を含むことができる。一部の実施形態では、そのような制御論理は１つ又は複数の上位キャッシュ層（例えば、図２Ａのキャッシュ層Ｌ２及び／又はＬ３）に実装される。
【００９２】
方法６００は上で導入された第２キャッシュで実行され、第２キャッシュはログ記録に関与し、第２キャッシュが内側のキャッシュ層からログ記録要求を受信する活動６０１で始まる。一部の実施形態では、活動６０１は、第２キャッシュが第１キャッシュから特定のメモリアドレスを参照するログ記録要求を受信することも含みうる。例えば、Ｌ２キャッシュ層の中のキャッシュＬ２−Ａ１（又は、方法６００がＬ３キャッシュ層で実行されている場合はキャッシュＬ３−Ａ）は、Ｌ１キャッシュ層の中のキャッシュＬ１−Ａ１からのログ記録要求を受信することもありうる。このログ記録要求は、第１キャッシュＬ１−Ａ１へのデータのインフラックスを引き起こす（例えばシステムメモリ２０２内の）特定のメモリアドレスに対する読み出しといった、処理ユニットＡ１による活動に基づくこともある。図２Ａの環境では、このインフラックス内のデータはキャッシュＬ２−Ａ２、キャッシュＬ３−Ａ、又はシステムメモリ２０２から供給されうる。
【００９３】
この要求に基づいて、方法６００は活動６０２へ進み、メモリアドレスに対するキャッシュラインがこのキャッシュ層に存在するかを第２キャッシュが判定する。一部の実施形態では、活動６０２は、この要求に基づいてメモリアドレスに対応するキャッシュラインが第２キャッシュに存在するかどうかを判定することを含むこともできる。例えば、この要求を受信したことに基づき、Ｌ２キャッシュ層の中のキャッシュＬ２−Ａ１（又は、方法６００がＬ３キャッシュ層で実行されている場合はキャッシュＬ３−Ａ）は、ログ記録要求にある特定のメモリアドレスをキャッシュするキャッシュラインを含んでいるかを判定することもできる。そのようなキャッシュラインは、キャッシュ階層が包括的キャッシュを含む場合（例えば、第２キャッシュがその下のキャッシュにあるデータのスーパーセットを第１キャッシュ層に記憶する場合）は通常は存在するが、キャッシュ階層が排他的である場合、又は何らかの排他的な振る舞いを示す場合は当てはまらないことがあるということが理解されるであろう。
【００９４】
活動６０２から分岐「いいえ」（すなわち、キャッシュラインが特定の第２キャッシュに存在しない場合）を進むと、方法６００は、第２キャッシュがログ記録を行う最も外側のキャッシュ層であるかを判定することもできる活動６０３に達する。後述されるように、活動６０３の結果に基づいて、方法６００は第２キャッシュが、（ｉ）ログ記録に関与し、少なくとも第２キャッシュに対するバッキングストアとして機能する（例えば、第３キャッシュ層の中の）第３キャッシュが存在しない（すなわち、活動６０８への経路を進む）場合にキャッシュラインをログに記録する、又は（ｉｉ）第３キャッシュが存在する（すなわち、活動６０６への経路を進む）場合に第３キャッシュへ要求を転送する、のいずれかを行うことを含むこともできる。
【００９５】
例えば、第２キャッシュがキャッシュＬ２−Ａ１である場合、活動６０３において、第２キャッシュはキャッシュＬ３−Ａが存在してログ記録に関与しているか（したがってＬ２−Ａ１がログ記録を行う最も外側のキャッシュ層ではない）を判定することもできる。キャッシュＬ３−Ａが存在する場合は、一部の実装では、このキャッシュは、プロセッサの現在の構成によっては、ある瞬間にはログ記録に関与することができて、別の瞬間ではログ記録に関与できないということが理解されるであろう。別の例では、第２キャッシュがキャッシュＬ３−Ａである場合、活動６０３において、第２キャッシュは外側のキャッシュ層が存在せず、したがって第２キャッシュがログ記録を行う最も外側のキャッシュ層であると判定することもできる。なお、ログ記録を行うキャッシュ層の間にはログ記録を行わないキャッシュ層が介在しうる。例えば、活動６０３がキャッシュＬ２−Ａ１により実行されていて、何らかのＬ４キャッシュ層が存在する場合、Ｌ３キャッシュ層はログ記録を行わないものでありえて、Ｌ４キャッシュ層はログ記録を行うものでありうる。
【００９６】
活動６０３での決定が、第２キャッシュがログ記録を行う外側のキャッシュ層ではない（すなわち、活動６０３からの分岐「いいえ」）、である場合、方法６００は活動６０６へと進み、第２キャッシュはログ記録を行う次のキャッシュ層へログ記録要求を転送する。そして、方法６００はその層のキャッシュで繰り返される。例えば、第２キャッシュがキャッシュＬ２−Ａ１である場合、第２キャッシュはキャッシュＬ３−Ａへ要求を転送することができて、キャッシュＬ３−Ａは方法６００を繰り返すことができる。これは、ログ記録を行うキャッシュレベルが存在するだけ拡張することができる。一部の実装では、活動６０６に達した場合は、ログ記録を行う次のキャッシュ層へログ記録要求を転送するのではなく、第２キャッシュ層は、ログ記録を行う次のキャッシュ層へログ記録要求を直接送信するように指示する１つ又は複数の応答メッセージを第１キャッシュへ送信することがある。
【００９７】
一方で、活動６０３での決定が、第２キャッシュがログ記録を行う最も外側のキャッシュ層である（すなわち、活動６０３からの分岐「はい」）、である場合、方法６００は活動６０８へと進み、第２キャッシュはインフラックスをログに記録する。後述されるように、活動６０８でのログ記録は（特定の状況に応じて）値で、又は参照により行うこともできて、活動６０８での実際のログ記録は現在のキャッシュ層、及び／又は下位キャッシュ層で行うこともできる。
【００９８】
なお、活動６０３の決定ブロックの破線で示されるように、活動６０３は方法６００が行われるコンピューティング環境によっては自由選択の活動でありうる。例えば、キャッシュ階層がログ記録に関与する（及び方法６００を実行する）上位キャッシュ層を一つだけ含む場合、このキャッシュ層は常に、ログ記録を行う「最も外側の」キャッシュ層となる。こうした環境では活動６０３は必要ではないこともある。さらに、ログ記録を行うキャッシュ層が多数ある場合でも、ログ記録を行う最も外側のキャッシュ層は、自身が最も外側の層であるという生まれつきの知識を有していることがある。それゆえ、これらのいずれの場合でも、活動６０２における決定「いいえ」は、単純に活動６０８へと進むことがある。
【００９９】
活動６０２へ戻り、分岐「はい」を進むと（すなわち、キャッシュラインが第２キャッシュに存在する場合）、方法６００は活動６０４へ達し、キャッシュラインがログに記録されているかを第２キャッシュが判定する。この判定には、キャッシュラインが第２キャッシュによりログに記録されたかどうか、又はキャッシュラインが何らかの他のキャッシュによりログに記録されたかどうか及び第２キャッシュがこのログ記録を認識しているかどうかを判定することを含むこともできる。キャッシュラインがログに記録されていること（及び、どの処理ユニットによって記録されえたか）を第２キャッシュが判定する方法は、第１キャッシュがログ記録を行う実施形態（例えば、図４Ａ、図４Ｂ、図５に関連して説明された実施形態を含む）に関連して説明された仕組みのいずれかを頼りにすることができる。例えば、第２キャッシュは図４Ａ、図４Ｂに関連して説明されたアカウンティングビット（すなわち、フラグビット、ユニットビット、及び／又はインデックスビット）を格納することもできて、第２キャッシュは図５に関連して説明されたウェイのロックを利用することもできて、及び／又は第２キャッシュはＣＣＰデータを記憶し、ＣＣＰデータを頼りにすることもできる。
【０１００】
後述されるように、キャッシュラインがログに記録されるべきではないと第２キャッシュにより判定された場合、方法６００は、第２キャッシュがログ記録を行う次のキャッシュ層へ要求を転送する（すなわち、活動６０６への経路を進む）こと、及び／又は第２キャッシュがキャッシュラインをログに記録する（すなわち、活動６０８への経路を進む）ことを含むこともできる。一方で、キャッシュラインがログに記録されるべきであると第２キャッシュにより判定された場合、方法６００は、第１キャッシュがこのキャッシュのキャッシュラインに記憶された現在の値を認識していないと第２キャッシュが判定した場合に第２キャッシュがキャッシュラインをログに記録すること（すなわち、活動６０８への経路を進む）、又は、要求しているプロセッサが第２キャッシュのキャッシュラインに記憶された現在の値を認識していると判定された場合にキャッシュラインはログに記録される必要はないと第２キャッシュが判定すること（すなわち、活動６０９への経路を進む）、を含むこともできる。
【０１０１】
例えば、活動６０４での決定が、キャッシュラインがログに記録されるべきではないと第２キャッシュにより判定された、である場合（すなわち、活動６０４からの分岐「いいえ」）、第２キャッシュは活動６０８でインフラックスをログに記録することもできて、さらにログ記録を行う外側のキャッシュ層に、そのようなものがある場合、発生するログ記録について通知することがある（すなわち、活動６０７）。活動６０７が行われる場合、キャッシュラインがログに記録されるべきではないと特定の第２キャッシュが判定している場合に活動６０８でキャッシュラインをログに記録することには、第３キャッシュ層が存在すると判定すること、及びキャッシュラインが特定の第２キャッシュにより値でログに記録されていると第３キャッシュに通知することを含むこともできる。なお、方法６００では、活動６０７及び６０８は、並行して行われることも含み、互いに対して任意の順番で実行することができる。なお、活動６０７によって、方法６００がログ記録を行う次のキャッシュ層で行われることもありうる。
【０１０２】
あるいは、活動６０４での決定が、キャッシュラインがログに記録されるべきではないと第２キャッシュにより判定された、である場合、第２キャッシュは、活動６０３で第２キャッシュがログ記録を行う最も外側のキャッシュ層であるかを判定し、その結果に基づき、活動６０６でログ記録を行う次のキャッシュ層へ要求を転送するか、活動６０８でインフラックスをログに記録するか、のいずれかを行うことができることを図６は示している。本質的には、これらの代替の経路は、活動６０４での決定「いいえ」である場合に第２キャッシュが（ｉ）インフラックスをログに記録して、ログ記録を行う次のキャッシュ層がある場合はそのキャッシュ層に通知する（すなわち、次の層は後で使用するためにログ記録イベントを認識している）、及び／又は（ｉｉ）インフラックスが参照によりログに記録されている、又はインフラックスはそもそもログに記録されていない、ということにつながりうる知識をログ記録を行う次の層（又はさらに上位の層）が含む可能性があるため、ログ記録を行う次の層へ要求を転送する、ことができるということを伝えている。
【０１０３】
活動６０４へ戻ると、キャッシュラインがログに記録されている（すなわち、活動６０４からの分岐「はい」）ことを第２キャッシュが認識している場合、活動６０５で第２キャッシュは、ログ記録要求の原因となった処理ユニットがキャッシュラインに現在の値を保持しているかを判定する。第２キャッシュが、第１キャッシュが現在保有するものよりも新しい、要求されたメモリアドレスに対する値を持っていることがあるということが理解されるであろう。例えば、第１キャッシュがキャッシュＬ１−Ａ１で、第２キャッシュがＬ２−Ａ１である場合、処理ユニットＡ１が（例えば処理ユニットＡ２による活動のために）活動６０１でのログ記録要求につながった読み出しを実行した時点でＬ１−Ａ１が保持していたものよりも新しい、特定のメモリアドレスに対する値をキャッシュＬ２−Ａ２が持っていることもありうる。第１キャッシュが第２キャッシュのキャッシュラインにおける現在の値を保持していることが確実にわかっている場合（すなわち、活動６０５からの分岐「はい」）、第２キャッシュは活動６０９で何もログに記録しないことを選択することもできる（すなわち、現在の値が既にログに記録されているため）。一方で、第１キャッシュが第２キャッシュのキャッシュラインにおける現在の値を保持しているか確実にはわかっていない場合（すなわち、活動６０５からの分岐「いいえ」）、第２キャッシュは活動６０８でインフラックスをログに記録することもできて、さらにログ記録を行う外側のキャッシュ層に、そのようなものがある場合、発生するログ記録について通知することがある（すなわち、活動６０７）。この場合も、活動６０７及び６０８は、並行して行われることも含み、互いに対して任意の順番で実行することができる。
【０１０４】
既に述べたように、活動６０８でインフラックスをログに記録することは、特定の状況に応じて、値で、又は参照により行うことができる。概して、インフラックスは、インフラックスの値がトレースに基づいて特定できない場合に（例えば、再生中のプロセッサの活動、又は以前ログに記録されたキャッシュラインのいずれかによって）値でログに記録される。インフラックスは、インフラックスの値がログに記録されたプロセッサの活動を再生することで得られる場合、又はインフラックスの値が以前ログに記録されたキャッシュラインに記憶されている場合に、参照によりログに記録することもできる。特筆すべきことに、インフラックスを参照によりログに記録することが規則に則っている可能性がある状況においても、そのインフラックスを値でログに記録することはなお規則に則っている。値でログに記録することを、例えばトレース中の処理時間を節約する、より簡単に再生されるトレースを作成する、などのために決定してもよい。したがって、活動６０８は、特定のメモリアドレスの値を直接ログに記録すること、及び／又は特定のメモリアドレスに対する以前のログエントリへの参照をログに記録することに基づいてキャッシュラインをログに記録することを含むこともできるということが理解されるであろう。
【０１０５】
方法６００においてログ記録を参照により行いうる一つの状況は、活動６０５を経由して活動６０８へ至った場合である（すなわち、第２キャッシュは値がログに記録されることを知っているが、要求しているプロセッサが現在の値を保持していることは確実にはわかっていない）。活動６０８でのログ記録は、第２キャッシュにより既にログに記録されたことがわかっている値を参照して、第１キャッシュに対して実行することもできる。例えば、キャッシュＬ１−Ａ２が現在の値をログに記録しているかもしれず、キャッシュＬ２−Ａ１はこのことを認識しているので、Ｌ１−Ａ２によるログ記録を参照して、キャッシュＬ１−Ａ１に対するインフラックスをログに記録することができる。
【０１０６】
こうした場合に、他の手段を使ってコードを再生することで値を復旧できる場合に何もログに記録しないことも理解できる。例えば、処理ユニットＡ１による現在のインフラックスが処理ユニットＡ２による以前の活動に関連して既にログに記録されていることがあるので、活動６０８において、Ａ２のログを参照して現在のインフラックスをログに記録することも可能である。しかし、方法６００がこの時点ではＡ１に対して何かをログに記録することを控えている場合は、トレースはなおも正しい可能性がある。これにより、他の処理ユニットのトレースにおいて以前ログに記録された値を再生中に特定する必要があるというトレードオフとともに、トレースのサイズが削減される。
【０１０７】
以前ログに記録された値を再生中に特定するというタスクは、ログに記録された異なる処理ユニットの間で少なくとも部分的にイベントの順序を再現できるということに依存している。以前のログに記録された値を特定するのを支援するためにトレースに含まれうるいくつかのものがある。例えば、キャッシュの追い出しをログに記録することは、Ａ１による読み出しを遂行するのに必要な値がキャッシュＡ１−Ｌ１で入手できない（すなわち、追い出されたため）と再生時に判定することを助ける。したがって、この値は他の処理ユニットに対するトレースの中で検索することができる。別の例では、ＣＣＰデータをログに記録することも、Ａ１による読み出しを遂行するのに必要な値がキャッシュＡ１−Ｌ１で入手できない、又はキャッシュＡ１−Ｌ１に存在しない、のいずれかであると再生時に判定することを助ける。したがって、この値は他の処理ユニットに対するトレースの中で検索することができる。なお、ＣＣＰデータは、現在の値をどこで探すべきかを潜在的に示しうる。別の例では、キャッシュの配置の知識は、必要なログエントリを特定するのを助けることができる。例えば、処理ユニットＡ１及びＡ２が同一のＬ２キャッシュ（すなわち、Ｌ２−Ａ１）を共有していることは既知であることがある。それゆえ、まず必要なログエントリを求めてＡ２のトレースを探索するのは、例えばＡ３及びＡ４を求めてトレースを探索するのと対照的に、理解できるであろう。
【０１０８】
ログ記録を参照により行いうる別の状況は、方法６００が現在のキャッシュ層で実行されている場合に下位キャッシュ層が活動６０７で現在のキャッシュ層へ通知を送信することに基づいて活動６０８へ至った場合である。下位キャッシュ層はインフラックスを（値で、又は参照により）ログに記録しているであろうから、現在のキャッシュ層は下位キャッシュ層のログを参照してログ記録を行うことができる。
【０１０９】
既に述べたように、活動６０８でのログ記録は現在のキャッシュ層又は下位キャッシュ層で行うこともできる。例えば、一部の実装では、第２キャッシュ層は、活動６０８に達した際に自らログ記録を実行するのではなく、インフラックスがログに記録されるべきであることと、どのように記録されるべきかを（すなわち、値で、又は参照により、そして参照による場合は基準ログエントリの場所を参照することで）第１キャッシュへ指示する１つ又は複数の応答メッセージを第１キャッシュへ返送することもできる。また、応答メッセージは第１キャッシュにアカウンティングビットの設定方法やＣＣＰデータの保存方法などを指示することもできる。同様に、活動６０９で、第２キャッシュ層は、ログ記録が必要ないことを通知する応答メッセージを第１キャッシュへ送信することもできる。元のログ記録要求がログ記録を行う２つ以上のキャッシュ層へと伝搬していた場合、その応答メッセージがそれらの層へ逆に伝搬される、又は元の要求者へ直接返信されることがある。上述したことを考慮すると、活動６０８は、第１キャッシュへ特定のメモリアドレスの値を直接ログに記録するよう指示すること、又は第１キャッシュへ特定のメモリアドレスに対する以前のログエントリへの参照をログに記録するよう指示することに基づいてキャッシュラインをログに記録することを含むこともできるということが理解されるであろう。
【０１１０】
ログ記録がどのように行われるかに関わらず、活動６０８は、第２キャッシュ層がログ記録を行う適切なアカウンティングビット（例えば、フラグビット、ユニットビット、又はインデックスビット）を設定すること、又はインフラックスがログに記録されたという事実を記録するために任意の適切なＣＣＰメッセージを保存すること、を含むことができる。それゆえ、活動６０８でキャッシュラインをログに記録することは、特定の第２キャッシュの中でキャッシュラインに（例えば、キャッシュラインに関連付けられたアカウンティングビットを必要に応じて設定することで）ログに記録されているという印を付けることを含むことができるということが理解されるであろう。
【０１１１】
一部の実施形態では、活動６０８でのログ記録には、第２キャッシュがキャッシュラインをログに記録したこと、そして場合によってはどのようにキャッシュラインをログに記録したかを１つ又は複数の下位キャッシュ層へ積極的に通知することを含むこともできる。例えば、キャッシュＬ２−Ａ１が活動６０８でログ記録を行った場合、キャッシュＬ２−Ａ１はキャッシュＬ１−Ａ２からＬ１−Ａ４（すなわち、ログ記録要求を出したもの以外のＬ１キャッシュ）のうちの１つ又は複数へ１つ又は複数のメッセージを送信してキャッシュＬ２−Ａ１がキャッシュラインをログに記録したことをそれらのキャッシュに通知することもできる。この情報は、キャッシュＬ２−Ａ１がキャッシュラインを値でログに記録したか、又は参照によりログに記録したかを含むことがある。キャッシュラインが参照によりログに記録される場合、キャッシュＬ２−Ａ１は、元のログデータがどこに存在するかに関する情報を送信することすらできる。これに応じて、キャッシュ（例えば、Ｌ１−Ａ２からＬ１−Ａ４のうちの１つ又は複数）は、キャッシュＬ２−Ａ１がどのようにキャッシュラインをログに記録したかを潜在的に含む、キャッシュＬ２−Ａ１がキャッシュラインをログに記録したという事実を記録した情報を記憶することができる。この情報は、例えばこれらのＬ１キャッシュの中の追加のアカウンティングビットに記憶することもできる。こうして、これらのＬ１キャッシュのうちの一つがキャッシュラインをログに記録する必要があると後で判定を行う場合に、これらのＬ１キャッシュはキャッシュラインが既にログに記録されていることを前もって知ることができて、ログ記録要求を上位層のキャッシュへ送信すること、又はどのようにログ記録を行うかという質問を上位層のキャッシュへ送信することを回避できる。
【０１１２】
特筆すべきことに、第１実施形態に関連して上述した、バッファ１０２（ｅ）、及び／又は遅延ログ記録を遂行するためのキャッシュ１０２ｂの特化部分を使用するための手法のいずれもこの第２実施形態に適用可能である。それゆえ、活動６０８でキャッシュラインをログに記録することは、バッファ１０２ｅ及び／又はキャッシュ１０２ｂの一部などのトレースバッファ内でキャッシュラインをログに記録することを含むこともできるということが理解されるであろう。
【０１１３】
方法６００ではログ記録を行う上位キャッシュ層で行われる活動に焦点を合わせてきたが、図７〜９は、下位キャッシュ層（例えば、元のログ記録要求を出したＬ１キャッシュ層）で行いうるいくつかの例示の方法論を示す。具体的には、方法６００では、キャッシュラインのログ記録状態を設定してキャッシュラインの値がログに記録されていることを示すことを含む、ログ記録を行うこと（例えば、キャッシュラインに関連付けられたアカウンティングビットを設定すること、ＣＣＰデータを記憶すること、など）に焦点を合わせていたが、これらの方法論は、このキャッシュラインの値がもはやログに記録されていない場合に、ログ記録状態を後で消去することに関する。
【０１１４】
キャッシュは、処理ユニットに対してログ記録が有効化されている間にその処理ユニットがそのキャッシュを使ってメモリの読み出しを行ったために、ログ記録状態が設定されたキャッシュラインを含むことがある。また、キャッシュは、ログ記録状態がキャッシュラインに既に設定されているキャッシュラインを上位レベルのキャッシュから受領することがある。上述したように、キャッシュラインがログに記録されていることを上位レベルのキャッシュが積極的にキャッシュラインに通知したためにキャッシュラインのログ記録状態が設定されていることもある。キャッシュラインのログ記録状態は、処理ユニットに対してログ記録が無効化されている間にその処理ユニットがそのキャッシュラインへの書き込みを行う場合に、通常消去される。
【０１１５】
まず、図７は、処理ユニットがログ記録が有効化された状態からログ記録が無効化された状態へ遷移する際にキャッシュラインのログ記録状態を管理する例示の方法７００のフローチャートを示す。方法６００のように、方法７００は図２Ａの例示の環境のようなマイクロプロセッサ環境で実行することができる。概して、方法７００は処理ユニット（例えばＡ１）がログ記録を有効化されて動作した後に機能し、ログに記録された１つ又は複数のキャッシュラインを今では含むキャッシュ（例えばＬ１−Ａ１）を使用する。ログに記録されたこれらのキャッシュラインのうちの一つに処理ユニットが書き込みを行う場合、方法７００はこの処理ユニットに対するログ記録が現在有効化されているか、無効化されているかに応じて、このログ記録状態を保持又は消去する。
【０１１６】
方法７００は活動７０１で始まり、ログに記録されたという印を付けられたキャッシュラインへの書き込みを検出する。一部の実施形態では、活動７０１は設定されたログ記録状態を有する第１キャッシュの中のキャッシュラインへの書き込みを検出することも含むことができる。例えば、第１キャッシュはキャッシュＬ１−Ａ１でありうる。このキャッシュは、処理ユニットＡ１によるメモリの読み出しに基づいて、（例えば必要に応じてキャッシュラインのアカウンティングビットが設定されることで）ログに記録されたという印を以前付けられたキャッシュラインを有することがある。例えば、このキャッシュラインは、方法６００に関連して上述した特定のメモリアドレスに対応することもある。
【０１１７】
次に、方法７００は活動７０２を含み、ログ記録が有効化されているかが判定される。この文脈では、活動７０２は、第１キャッシュに関連付けられた処理ユニットでログ記録が有効化されている場合は、地雷を除去する。一部の実施形態では、活動７０２は、書き込みの検出に基づいて、特定の処理ユニットに対してログ記録が有効化されているかどうかを判定することを含むこともできる。例えば、キャッシュＬ１−Ａ１に対する制御論理は、処理ユニットＡ１でログ記録が有効化されているかを判定できる。ログ記録が有効化されている場合（すなわち、活動７０２からの分岐「はい」）、キャッシュラインのログ記録状態を活動７０３で保持することができる。したがって、一部の実施形態では、活動７０３は、少なくとも特定の処理ユニットに対するログ記録が有効化されていることに基づいて、キャッシュラインのログ記録状態を保持することも含むことができる。
【０１１８】
あるいは、ログ記録が無効効化されている場合（すなわち、活動７０２からの分岐「いいえ」）、キャッシュラインのログ記録状態を活動７０４で消去することができる。したがって、一部の実施形態では、活動は、少なくとも特定の処理ユニットに対するログ記録が無効化されていることに基づいて、キャッシュラインのログ記録状態を消去することも含むことができる。例えば、キャッシュＬ１−Ａ１は、必要に応じてキャッシュラインのアカウンティングビットを消去することもできる。
【０１１９】
示されるように、ログ記録状態を消去することに加えて、方法７００はログ記録を行う次のキャッシュ層に通知することを含む。一部の実施形態では、活動７０５は、少なくとも特定の処理ユニットに対するログ記録が無効化されていることに基づいて、キャッシュラインのログ記録状態が消去されるべきであると１つ又は複数の第２キャッシュのうちの少なくとも一つに通知することも含むことができる。例えば、第２キャッシュのうちの一つはキャッシュＬ２−Ａ１でありえて、それゆえ、キャッシュＬ１−Ａ１はキャッシュＬ２−Ａ１に、キャッシュラインのコピーのログ記録状態を消去するように通知することもできる。活動７０４及び７０５は、並行して行われることも含み、互いに対して任意の順番で実行することができることに留意されたい。
【０１２０】
図６には示されていないが、これに応じて方法６００は、特定の第２キャッシュがメモリアドレスにも対応する第１キャッシュの中の別のキャッシュラインが第１キャッシュの中でログに記録されていないという印を付けられていることを示すメッセージを第１キャッシュから受信することを含むこともできる。また、方法６００は、このメッセージに基づいて、特定の第２キャッシュの中でキャッシュラインにログに記録されていないという印を付けることを含むこともできる。
【０１２１】
図８は、ログ記録が無効化された処理ユニットが書き込みを行うために親キャッシュから独占的にキャッシュラインを受領する際にキャッシュラインのログ記録状態を管理する例示の方法８００のフローチャートを示す。方法６００及び７００のように、方法８００は図２Ａの例示の環境のようなマイクロプロセッサ環境で実行することができる。概して、方法８００は、処理ユニット（例えばＡ１）がログ記録を有効化されて動作している際に機能し、その親キャッシュ（例えばＬ２−Ａ１及び／又はＬ３−Ａ）がログ記録状態が設定されているキャッシュラインを含むキャッシュ（例えばＬ１−Ａ１）を使用し、キャッシュは親キャッシュのキャッシュラインを書き込みに利用する。
【０１２２】
方法８００は活動８０１で始まり、ログ記録が無効化された状態で、書き込みを行うためにキャッシュは上位キャッシュにキャッシュラインを要求する。例えば、処理ユニットＡ１からの特定のメモリアドレスへの書き込み要求に基づいて、キャッシュミスがキャッシュＬ１−Ａ１で起こりうる。その結果、キャッシュＬ１−Ａ１はキャッシュＬ２−Ａ１又はキャッシュＬ３−Ａに適切なキャッシュラインのコピーを要求することができる。
【０１２３】
一部の状況では、キャッシュＬ１−Ａ１はログ記録状態が消去されたキャッシュラインを受領することがある。それゆえ、方法８００は、このキャッシュが上位キャッシュからログ記録状態が消去されたキャッシュラインを独占的に受領する、活動８０２を含むことができる。ログ記録状態は受領したキャッシュラインで消去されていることがあり、例えばこれは、（ｉ）上位キャッシュで設定されなかった、又は（ｉｉ）処理ユニットＡ１でログ記録が無効化されたことを上位キャッシュが認識して、キャッシュＬ１−Ａ１にキャッシュラインを供給する際に上位キャッシュがログ記録状態を消去した、ためである。例えば、方法６００は、書き込みを行うためにキャッシュラインを要求するメッセージを第１キャッシュから受信することと、少なくとも第１キャッシュに対してログ記録が無効化されていることに基づいてログに記録されていないという印を付けられているキャッシュラインを第１キャッシュへ送信すること、を含むこともできる。
【０１２４】
他の状況では、キャッシュＬ１−Ａ１はログ記録状態が設定されたキャッシュラインを受領することがある。それゆえ、方法８００は、このキャッシュが上位キャッシュからログ記録状態が設定されたキャッシュラインを独占的に受領する、活動８０３を含むことができる。ログ記録状態は、例えば、上位キャッシュで設定されたために受領したキャッシュラインで設定されていることがある。
【０１２５】
次に、方法８００は、ログ記録がなおも無効化された状態でキャッシュがキャッシュラインへ書き込みを行う、活動８０４を含むことができる。例えば、キャッシュＬ１−Ａ１は、処理ユニットＡ１からの元々の書き込み要求を適切な値をキャッシュラインへ書き込むことで完了することができる。次に、方法８００は、キャッシュラインのログ記録状態が消去される活動８０５と、上位キャッシュがキャッシュラインのログ記録状態を消去するように通知される活動８０６を含むことができる。活動８０５は活動８０４と別に示されているが、キャッシュラインのログ記録状態を消去することは活動８０４で書き込みを行うことの必然的な一部でありうることに留意されたい。例えば、ログ記録が無効化された状態では、いかなる書き込みも、書き込み先のキャッシュラインに対するログ記録状態が消去されることにつながりうる。それゆえ、活動８０４と活動８０５の間の矢印は破線を使って示され、活動８０４が実際には自由選択でありうることを示している。活動８０６は、方法７００に関連して上述した活動７０５と同様に動作することができる。
【０１２６】
方法７００の活動７０５と同様に、活動８０６が行われる場合、これに応じて方法６００は、特定の第２キャッシュがメモリアドレスにも対応する第１キャッシュの中の別のキャッシュラインが第１キャッシュの中でログに記録されていないという印を付けられていることを示すメッセージを第１キャッシュから受信することを含むこともできる。また、方法６００は、このメッセージに基づいて、特定の第２キャッシュの中でキャッシュラインにログに記録されていないという印を付けることを含むこともできる。
【０１２７】
図９は、処理ユニットが「所有された」ＣＣＰ状態で利用したキャッシュラインへ書き込む際にキャッシュラインのログ記録状態を管理する例示の方法９００のフローチャートを示す。方法６００〜８００のように、方法９００は図２Ａの例示の環境のようなマイクロプロセッサ環境で実行することができる。概して、方法９００は、ある処理ユニットがキャッシュラインを書き込みに利用する期間内に他の処理ユニットがキャッシュラインの現在の値を要求することができる状態をＣＣＰが提供する際に機能する。その一例は、上で導入された、ＭＯＥＳＩ  ＣＣＰの「所有された」状態である。
【０１２８】
方法９００は活動９０１で始まり、ログ記録が無効化された状態で、キャッシュが所有された状態のキャッシュラインを変更する。例えば、処理ユニットＡ１はキャッシュＬ１−Ａ１の中の「所有された」状態のキャッシュラインを利用した可能性がある。この間に、処理ユニットＡ１はそのキャッシュラインへの書き込みを行いうる。図８に関連して述べたように、キャッシュラインのログ記録状態を消去することは、ログ記録が無効化されている場合に書き込みを行うことの必然的な一部でありうる。それゆえ、方法９００は、一部の実装では特別な活動が存在することがあるが、ログ記録状態を消去する特別な活動を表しているわけではない。
【０１２９】
活動９０１に基づいて、方法９００は、キャッシュラインのログ記録状態が他のキャッシュでも消去されるべきであると伝えるために１つ（又は複数）の活動を行うことができることを示している。活動９０２において、要求に基づき、キャッシュはキャッシュラインのログ記録状態を消去するように兄弟キャッシュに通知する。例えば、キャッシュＬ１−Ａ１の中の所有されたキャッシュラインへ書き込みが行われた後に、キャッシュＬ１−Ａ１はキャッシュＬ２−Ａ２などの兄弟キャッシュからキャッシュラインの現在の値を求める要求（例えばＣＣＰメッセージ）を受信することがある。この要求の結果、キャッシュＬ１−Ａ１はキャッシュＬ２−Ａ２に、対応するキャッシュライン内のログ記録状態を、もし設定されている場合は、消去すべきであると通知することができる。この通知は、キャッシュＬ１−Ａ１の中のキャッシュラインの現在の値を伝えるＣＣＰメッセージと共に、又は別のメッセージの一部として送信することもできる。
【０１３０】
活動９０３において、キャッシュラインを変更することに基づき、キャッシュはキャッシュラインのログ記録状態を消去するように１つ又は複数の兄弟キャッシュに通知する。例えば、キャッシュＬ１−Ａ１の中の所有されたキャッシュラインへ書き込みが行われた後に、キャッシュＬ１−Ａ１は自身の兄弟キャッシュ（例えばＬ１−Ａ２からＬ１Ａ４）へ、そのキャッシュラインのログ記録状態を（このキャッシュラインがそれらの兄弟キャッシュに存在してログ記録状態が設定されている場合に）それらの兄弟キャッシュが消去すべきであると知らせるために通知をブロードキャスト送信することができる。したがって、活動９０２がログ記録状態を消去するように兄弟キャッシュに相対的に通知するのに対して、活動９０３は兄弟キャッシュに積極的に通知する。
【０１３１】
活動９０４において、キャッシュラインを変更することに基づき、キャッシュはキャッシュラインのログ記録状態を消去するように上位キャッシュ層に通知する。例えば、キャッシュＬ１−Ａ１の中の所有されたキャッシュラインへ書き込みが行われた後に、キャッシュＬ１−Ａ１はキャッシュＬ２−Ａ１及び／又はＬ３−Ａなどの自身の親キャッシュへ、そのキャッシュラインのログ記録状態を（このキャッシュラインがそれらの親キャッシュに存在してログ記録状態が設定されている場合に）それらの親キャッシュが消去すべきであると知らせるために通知をブロードキャスト送信することができる。したがって、活動９０３と同様に、活動９０４は、ここでは兄弟キャッシュではなく親キャッシュへ積極的に通知する。
【０１３２】
特筆すべきことに、一部の実装では活動９０２〜９０４のうちの２つ以上を行うことがある。例えば、一実装では、書き込みが行われる場合に上位キャッシュに積極的に通知する（すなわち活動９０４）が、兄弟キャッシュへは受動的に通知する（すなわち活動９０２）のみのことがある。別の例では、一実装では、積極的に上位キャッシュ（すなわち活動９０４）及び兄弟キャッシュ（すなわち活動９０３）の両方に通知することがある。
【０１３３】
さらに、方法７００の活動７０５及び方法８００の活動８０６と同様に、活動９０３が行われる場合、これに応じて方法６００は、メモリアドレスにも対応する第１キャッシュの中の別のキャッシュラインが第１キャッシュの中でログに記録されていないという印を付けられていることを示すメッセージを特定の第２キャッシュが第１キャッシュから受信することを含むこともできる。また、方法６００は、このメッセージに基づいて、特定の第２キャッシュの中でキャッシュラインにログに記録されていないという印を付けることを含むこともできる。
【０１３４】
上位層（例えばＬ２、Ｌ３など）のキャッシュの知識に基づいて下位層（例えばＬ１）のキャッシュへのインフラックスをログに記録することは、場合によっては参照によりログ記録ができるようにしてログ記録を控えることを上回る、いくつかの利点を提供することができる。例えば、下位層は、キャッシュミスのデータが実際に処理ユニットにより消費された場合だけ、ログ記録プロセスを開始する。これにより、例えば、投機的実行に起因するキャッシュミスをログに記録するのを回避できる。さらに、下位層は、キャッシュの活動を引き起こした命令を取り下げるのと同時にログ記録を行うことができる。これにより、トレースでより精度の高いタイミングを捉えることができる。そして、下位層をログに記録する場合、ログ記録は、希望する場合は物理メモリアドレス指定ではなく仮想メモリアドレス指定に基づくことができる。特筆すべきことに、仮想メモリアドレス指定に基づいてログ記録を行う場合、複数の仮想アドレスが同一の物理アドレスへマップされる状況がありうる。こうした状況では、キャッシュは、異なる仮想アドレスを使った同一の物理アドレスへのアクセスがキャッシュミスではないと振る舞うことがある。このようなことが起こると、トレーサ１０４ａはＴＬＢ１０２ｆからのデータをログに記録することがある。一部の実装では、仮想アドレス又は物理アドレスは、追加の識別子（例えば、仮想プロセッサＩＤ、メモリアドレスに対するセキュリティ設定など）によりさらに区別されることがある。こうした実装のうちの少なくとも一部では、キャッシュは、異なる追加の識別子を持つ（例えば、より高い、より低い、又は異なるセキュリティレベルを有する）同一のアドレスへのアクセスがキャッシュミスであると振る舞うことがある。
【０１３５】
したがって、本明細書の実施形態は、複数の処理ユニットでの実行結果を２つ以上の階層又は層のプロセッサキャッシュを使ってトレースすることに基づいて、ビットアキュレートな「タイムトラベル」トレース記録を記録するための異なる実施形態を提供する。こうした方法でトレースファイルを記録するにはわずかなプロセッサ変更が必要となることがあり、従来のトレース記録手法と比べた場合に、トレース記録の性能への影響及びトレースファイルのファイルサイズの両方について数桁分を低減させることができる。
【０１３６】
本発明は、本発明の趣旨又はその本質的な特徴から逸脱することなく、他の特定の形態で具現化できる。記載された実施形態は、あらゆる点で例示的に過ぎず、制限的ではないと考えられるべきである。それゆえ、本発明の範囲は、明細書本文ではなく添付の請求の範囲により示される。請求項の均等物の意味及び範囲に属するすべての変更は、本発明の範囲に包含されるものとする。
【図１】
2021515287.tif 000003
【図２Ａ】
2021515287.tif 000004
【図２Ｂ】
2021515287.tif 000005
【図３】
2021515287.tif 000006
【図４Ａ】
2021515287.tif 000007
【図４Ｂ】
2021515287.tif 000008
【図５】
2021515287.tif 000009
【図６】
2021515287.tif 000010
【図７】
2021515287.tif 000011
【図８】
2021515287.tif 000012
【図９】
2021515287.tif 000013
【国際調査報告】
2021515287.tif 000014
2021515287.tif 000015
2021515287.tif 000016