(57)【要約】  上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録。コンピューティングデバイスは、複数の処理ユニットと、複数のＮレベルキャッシュと、Ｎレベルキャッシュのバッキングストアである（Ｎ＋ｉ）レベルキャッシュとを含む。第１の処理ユニットのアクティビティに基づいて、コンピューティングデバイスは、第１のＮレベルキャッシュへのデータの流入を検出する。コンピューティングデバイスは、（Ｎ＋ｉ）レベルキャッシュをチェックして、データが第２の処理ユニットのためにすでにログされているかどうかを判定する。チェックに基づいて、コンピューティングデバイスは、（ｉ）ログデータを参照して、データを第１の処理ユニットのためにログさせるか（すなわち、データがすでにログされていたとき）、またはデータを第１の処理ユニットのために値によってログさせる（すなわち、データがまだログされていなかったとき）。
2021515312.tif 000002
【特許請求の範囲】
【請求項１】
コンピューティングデバイスであって、
複数の処理ユニットと、
複数のＮレベルキャッシュと、
前記複数のＮレベルキャッシュのうちの２つ以上に関連付けられ、前記複数のＮレベルキャッシュのバッキングストアとして構成された（Ｎ＋ｉ）レベルキャッシュと、
制御論理であって、少なくとも、
複数のＮレベルキャッシュのうちの第１のＮレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出することと、
前記第１のＮレベルキャッシュへの前記流入を検出したことに基づいて、前記（Ｎ＋ｉ）レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に第２の処理ユニットのためにログされているかどうかを判定し、
前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされているときに、以前に前記第２の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを前記第１の処理ユニットのためにログさせることと、
前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされていないときに、前記メモリ位置の前記データを前記第１の処理ユニットのために値によってログさせることと
のうちの一方を実行することと
を実行するように前記コンピューティングデバイスを構成する制御論理と
を備えたコンピューティングデバイス。
【請求項２】
請求項１に記載のコンピューティングデバイスであって、前記（Ｎ＋ｉ）レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされているかどうかを判定することは、
前記メモリ位置に対応する前記（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインに、１つまたは複数のアカウンティングビットが設定されているかどうかを判定することと、
前記メモリ位置に対応する前記（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインが、ログされた処理ユニットに対応するウェイに格納されているかどうかを判定することと、
前記メモリ位置に対応する前記（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインが、前記キャッシュラインがログされていると判定するために利用可能な関連するキャッシュコヒーレンスプロトコル（ＣＣＰ）状態データを有するかどうかを判定することと
のうちの１つまたは複数を含む、コンピューティングデバイス。
【請求項３】
請求項１に記載のコンピューティングデバイスであって、前記（Ｎ＋ｉ）レベルキャッシュが（Ｎ＋１）レベルキャッシュを含むように、ｉは１である、コンピューティングデバイス。
【請求項４】
請求項１に記載のコンピューティングデバイスであって、前記（Ｎ＋ｉ）レベルキャッシュが（Ｎ＋２）レベルキャッシュを含むように、ｉは２である、コンピューティングデバイス。
【請求項５】
請求項１に記載のコンピューティングデバイスであって、
前記（Ｎ＋ｉ）レベルキャッシュが（Ｎ＋１）レベルキャッシュを含むように、ｉは１であり、
前記コンピューティングデバイスは、前記（Ｎ＋１）レベルキャッシュのバッキングストアとして構成される（Ｎ＋２）レベルキャッシュも含み、
前記（Ｎ＋ｉ）レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされているかどうかを判定することは、
前記（Ｎ＋１）レベルキャッシュ内のどのキャッシュラインも前記メモリ位置に対応していないと判定することと、
前記（Ｎ＋２）レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされているかどうかを判定することと
を含む、コンピューティングデバイス。
【請求項６】
請求項１に記載のコンピューティングデバイスであって、以前に前記第２の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを前記第１の処理ユニットのためにログさせることは、
前記メモリ位置のアドレスをログすることと、
前記メモリ位置のアドレスおよび順序付けデータをログすることと、
キャッシュウェイへの参照をログすることと、
キャッシュウェイへの参照および順序付けデータをログすることと、
前記第２の処理ユニットを前記メモリ位置に対応するキャッシュラインの前の所有者としてログすることと、
前記第２の処理ユニットを参照するキャッシュコヒーレンスプロトコル（ＣＣＰ）データをログすることと
のうちの１つまたは複数を含む、コンピューティングデバイス。
【請求項７】
請求項１に記載のコンピューティングデバイスであって、前記メモリ位置の前記データを前記第１の処理ユニットのためにログさせることは、プロセッサとメモリリソースとのうちの一方または両方の可用性に基づいて前記ログさせることを遅延させることを含む、コンピューティングデバイス。
【請求項８】
請求項１に記載のコンピューティングデバイスであって、前記ログさせることを遅延させることは、遅延された前記ログさせること用に前記メモリ位置の前記データを保持するためにキャッシュラインを無効にすることを含む、コンピューティングデバイス。
【請求項９】
請求項１に記載のコンピューティングデバイスであって、前記制御論理は、少なくとも、
前記メモリ位置に対応する前記（Ｎ＋ｉ）レベルキャッシュ内の第２のキャッシュラインを保持しながら、前記メモリ位置に対応する前記第１のＮレベルキャッシュ内の第１のキャッシュラインを追い出すことと、
前記第１のＮレベルキャッシュへの、前記メモリ位置に格納された前記データも含む後続の流入を検出したことに基づいて、前記後続の流入を、前記第２のキャッシュラインの存在に基づいて参照によってログさせることと
を実行するように前記コンピューティングデバイスをさらに構成する、コンピューティングデバイス。
【請求項１０】
請求項１に記載のコンピューティングデバイスであって、前記制御論理は、少なくとも、
前記メモリ位置にも対応する前記（Ｎ＋ｉ）レベルキャッシュ内の第２のキャッシュラインを保持しながら、前記メモリ位置に対応する前記第１のＮレベルキャッシュ内の第１のキャッシュラインを追い出すことと、
前記第１の処理ユニットでの追加のコード実行に基づいて、前記第１のＮレベルキャッシュへの、前記メモリ位置に格納された前記データも含む後続の流入を検出することと、
前記第１のＮレベルキャッシュへの前記後続の流入を検出したことに少なくとも基づいて、かつ、前記第２のキャッシュラインの存在に少なくとも基づいて、前記後続の流入をログする必要がないと判定することと
を実行するように前記コンピューティングデバイスをさらに構成する、コンピューティングデバイス。
【請求項１１】
１つまたは複数の上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録のための方法であって、前記方法は、（ｉ）複数の処理ユニットと、（ｉｉ）複数のＮレベルキャッシュと、（ｉｉｉ）前記複数のＮレベルキャッシュのうちの２つ以上に関連付けられ、前記複数のＮレベルキャッシュのバッキングストアとして構成される（Ｎ＋ｉ）レベルキャッシュとを含むコンピューティングデバイスで実装され、前記方法は、
複数のＮレベルキャッシュのうちの第１のＮレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出するステップと、
前記第１のＮレベルキャッシュへの前記流入を検出したことに基づいて、前記（Ｎ＋ｉ）レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に第２の処理ユニットのためにログされているかどうかを判定し、
前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされているときに、以前に前記第２の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを前記第１の処理ユニットのためにログさせることと、
前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされていないときに、前記メモリ位置の前記データを前記第１の処理ユニットのために値によってログさせることと
のうちの一方を実行するステップと
を含む、方法。
【請求項１２】
請求項１１に記載の方法であって、前記（Ｎ＋ｉ）レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされているかどうかを判定することは、
前記メモリ位置に対応する前記（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインに、１つまたは複数のアカウンティングビットが設定されているかどうかを判定することと、
前記メモリ位置に対応する前記（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインが、ログされた処理ユニットに対応するウェイに格納されているかどうかを判定することと、
前記メモリ位置に対応する前記（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインが、前記キャッシュラインがログされていると判定するために利用可能な関連するキャッシュコヒーレンスプロトコル（ＣＣＰ）状態データを有するかどうかを判定することと
のうちの１つまたは複数を含む、方法。
【請求項１３】
請求項１１に記載の方法であって、前記（Ｎ＋ｉ）レベルキャッシュが（Ｎ＋１）レベルキャッシュを含むように、ｉは１である、方法。
【請求項１４】
請求項１１に記載の方法であって、前記（Ｎ＋ｉ）レベルキャッシュが（Ｎ＋２）レベルキャッシュを含むように、ｉは２である、方法。
【請求項１５】
コンピュータ実行可能命令が格納された１つまたは複数のコンピュータ可読媒体を含むコンピュータプログラム製品であって、前記コンピュータ実行可能命令は、（ｉ）複数の処理ユニットと、（ｉｉ）複数のＮレベルキャッシュと、（ｉｉｉ）前記複数のＮレベルキャッシュのうちの２つ以上に関連付けられ、前記複数のＮレベルキャッシュのバッキングストアとして構成される（Ｎ＋ｉ）レベルキャッシュとを含むコンピューティングデバイスを、少なくとも、
複数のＮレベルキャッシュのうちの第１のＮレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出することと、
前記第１のＮレベルキャッシュへの前記流入を検出したことに基づいて、前記（Ｎ＋ｉ）レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に第２の処理ユニットのためにログされているかどうかを判定し、
前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされているときに、以前に前記第２の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを前記第１の処理ユニットのためにログさせることと、
前記メモリ位置の前記データが以前に前記第２の処理ユニットのためにログされていないときに、前記メモリ位置の前記データを前記第１の処理ユニットのために値によってログさせることと
のうちの一方を実行することと
を実行するように構成する、コンピュータプログラム製品。
【発明の詳細な説明】
【背景技術】
【０００１】
[0001]ソフトウェアアプリケーションの開発中にコードを記述するとき、開発者は通常、ランタイムエラーおよび他のソースコードエラーを見つけるために、コードの「デバッグ」にかなりの時間を費やす。その際、開発者は、様々な入力に基づいてプログラムの挙動を観察する、（たとえば、変数値を出力するため、実行の分岐を追跡するためなどの）デバッグコードを挿入する、コード部分を一時的に削除するなど、ソースコードのバグを再現および位置特定するためにいくつかの手法をとることがある。ランタイムエラーを追跡してコードのバグを特定することは、アプリケーションの開発時間のかなりの部分を占める可能性がある。
【０００２】
[0002]開発者によるコードのデバッグプロセスを支援するために、多くのタイプのデバッグアプリケーション（「デバッガ」）が開発されている。これらのツールは、コンピュータコードの実行をトレース、視覚化、および変更する能力を開発者に提供する。たとえば、デバッガは、とりわけ、コード命令の実行を視覚化することができ、コード実行中の様々な時点でコード変数値を提示することができ、開発者がコード実行パスを変更することを可能にすることができ、および／または開発者が対象となるコード要素に、（実行中に到達すると、コードの実行を中断させる）「ブレークポイント」および／もしくは「ウォッチポイント」を設定することを可能にすることができる。
【０００３】
[0003]新たな形式のデバッグアプリケーションは、「タイムトラベル」、「リバース」、または「履歴」デバッグを可能にする。「タイムトラベル」デバッグでは、プログラム（スレッドなどの実行可能エンティティ）の実行が、トレースアプリケーションによって１つまたは複数のトレースファイルに記録／トレースされる。その後、これらのトレースファイルは、前方解析と後方解析の両方のため、プログラムを後に再実行するために使用され得る。たとえば、「タイムトラベル」デバッガにより、開発者は、前方ブレークポイント／ウォッチポイント（従来のデバッガと同様）、および後方ブレークポイント／ウォッチポイントを設定することができる。
【０００４】
[0004]トレースファイルを記録するとき、いくつかの事項が考慮され得る。最も顕著なものとして、記録されたトレースデータの頑健性とプログラムをトレースすることによって発生するオーバヘッドとの間の固有のトレードオフがある。これらのトレードオフは、主にトレースファイルサイズ、およびトレースされるプログラムの実行に対する性能への影響として現れる。さらに、トレースは、ハードウェア支援を受けて（または、完全にソフトウェアにおいて）実行され得るので、ハードウェア設計および他のハードウェアコストの考慮事項もある場合がある。
【発明の概要】
【０００５】
[0005]本明細書に記載の実施形態は、プロセッサによるハードウェア支援を使用したビットアキュレートな「タイムトラベル」トレース記録を作成するためのメカニズムを対象とする。これらのメカニズムは、プロセッサキャッシュの少なくとも２つの階層または層を使用して複数の処理ユニットにわたる実行の影響をトレースすることに基づく。具体的には、これらのメカニズムは、プロセッサのハードウェアおよび／またはマイクロコードを変更することができ、それにより、（ｉ）トレースされた処理ユニットによるアクティビティに基づいて、内側または「下位層」のプロセッサキャッシュへの流入（すなわち、キャッシュミス）を検出すること、および（ｉｉ）外側または「上位層」の共有プロセッサキャッシュを使用して、その流入のデータが別のトレースされた処理ユニットのためにすでにログされているかどうかを判定することを支援する。そのデータがすでにログされている場合、前のログエントリを参照して流入がログされ得る。これらの技法は、「Ｎ」レベルキャッシュに拡張され得る。このような方式でトレースファイルを記録するには、プロセッサを少し変更するだけでよい場合があり、従来のトレース記録の手法と比較すると、トレース記録の性能への影響とトレースファイルサイズの両方を桁違いで低減することができる。
【０００６】
[0006]実施形態は、複数の処理ユニットと、複数のＮレベルキャッシュと、（Ｎ＋ｉ）レベルキャッシュとを含むコンピューティングデバイスを対象とする。（Ｎ＋ｉ）レベルキャッシュは、複数のＮレベルキャッシュのうちの２つ以上に関連付けられ、複数のＮレベルキャッシュのためのバッキングストアとして構成される。これらの実施形態において、コンピューティングデバイスは、複数のＮレベルキャッシュのうちの第１のＮレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出するようにコンピューティングデバイスを構成する制御論理を含む。制御論理は、（Ｎ＋ｉ）レベルキャッシュをチェックして、メモリ位置のデータが以前に第２の処理ユニットのためにログされているかどうかを判定するようにコンピューティングデバイスをさらに構成する。制御論理は、このチェックに基づいて、（ｉ）以前に第２の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第１の処理ユニットのためにログさせること（すなわち、メモリ位置のデータが以前に第２の処理ユニットのためにログされているとき）、または（ｉｉ）メモリ位置のデータを第１の処理ユニットのために値によってログさせること（すなわち、メモリ位置のデータが以前に第２の処理ユニットのためにログされていないとき）のうちの一方を実行するようにコンピューティングデバイスをさらに構成する。
【０００７】
[0007]実施形態は、１つまたは複数の上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録のための方法も対象とする。これらの方法は、（ｉ）複数の処理ユニットと、（ｉｉ）複数のＮレベルキャッシュと、（ｉｉｉ）複数のＮレベルキャッシュのうちの２つ以上に関連付けられ、複数のＮレベルキャッシュのバッキングストアとして構成される（Ｎ＋ｉ）レベルキャッシュとを含むコンピューティングデバイスで実装される（ｉｍｐｌｅｍｅｎｔｅｄ；実施される）。方法は、複数のＮレベルキャッシュのうちの第１のＮレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出するステップを含む。方法は、第１のＮレベルキャッシュへの流入を検出したことに基づいて、（Ｎ＋ｉ）レベルキャッシュをチェックして、メモリ位置のデータが以前に第２の処理ユニットのためにログされているかどうかを判定するステップも含む。方法は、このチェックに基づいて、（ｉ）メモリ位置のデータが以前に第２の処理ユニットのためにログされているとき、以前に第２の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第１の処理ユニットのためにログさせるステップ、または（ｉｉ）メモリ位置のデータが以前に第２の処理ユニットのためにログされていないとき、メモリ位置のデータを第１の処理ユニットのために値によってログさせるステップのうちの一方を実行するステップも含む。
【０００８】
[0008]実施形態は、ハードウェア記憶デバイスに記憶され、前述の方法を実行するために実行可能なコンピュータ実行可能命令（たとえば、プロセッサマイクロコード）として具現化されてもよい。
【０００９】
[0009]この概要は、以下の発明を実施するための形態でさらに説明される概念の選択を簡略化した形式で紹介するために提供される。この概要は、特許請求された主題の主要な特徴または本質的な特徴を特定することを意図しておらず、特許請求された主題の範囲を決定する際の補助として使用されることも意図していない。
【００１０】
[0010]本発明の上記および他の利点および特徴を得ることができる方式を説明するために、上で簡単に説明した本発明について、添付図面に示されるその特定の実施形態を参照して、より具体的に説明する。これらの図面が本発明の典型的な実施形態のみを示し、したがってその範囲を限定するものと見なされるべきではないという理解の下、添付図面を使用して本発明をさらに具体的かつ詳細に記載および説明する。
【図面の簡単な説明】
【００１１】
【図１】[0011]図１は、内側または「下位層」のプロセッサキャッシュへの流入を検出すること、および外側または「上位層」の共有プロセッサキャッシュを使用して、以前にログされた値を参照して、その流入がログされ得るかどうかを判定することを含む、プロセッサキャッシュの少なくとも２つの階層または層を使用して複数の処理ユニットにわたる実行の「ビットアキュレートな」トレースを記録することを容易にする、例示的なコンピューティング環境を示す図である。
【図２Ａ】[0012]図２Ａは、多層キャッシュを含む例示的なコンピューティング環境を示す図である。
【図２Ｂ】[0013]図２Ｂは、キャッシュの一例を示す図である。
【図３】[0014]図３は、１つまたは複数の上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録のための例示的な方法のフローチャートを示す図である。
【図４Ａ】[0015]図４Ａは、そのキャッシュラインのそれぞれを１つまたは複数の追加のアカウンティングビットで拡張する共有キャッシュの例を示す図である。
【図４Ｂ】[0016]図４Ｂは、従来のキャッシュラインに適用されるアカウンティングビットを格納するための１つまたは複数の予約済みのキャッシュラインを含む共有キャッシュの例を示す図である。
【図５】[0017]図５は、システムメモリとキャッシュとの間のセットアソシアティブ方式のマッピングの例を示す図である。
【発明を実施するための形態】
【００１２】
[0018]本明細書に記載の実施形態は、プロセッサによるハードウェア支援を使用したビットアキュレートな「タイムトラベル」トレース記録を作成するためのメカニズムを対象とする。これらのメカニズムは、プロセッサキャッシュの少なくとも２つの階層または層を使用して、複数の処理ユニットにわたる実行の影響をトレースすることに基づく。具体的には、これらのメカニズムは、プロセッサのハードウェアおよび／またはマイクロコードを変更することができ、それにより、（ｉ）トレースされた処理ユニットによるアクティビティに基づいて、内側または「下位層」のプロセッサキャッシュへの流入（すなわち、キャッシュミス）を検出すること、および（ｉｉ）外側または「上位層」の共有プロセッサキャッシュを使用して、その流入のデータが別のトレースされた処理ユニットのためにすでにログされているかどうかを判定することを支援する。そのデータがすでにログされている場合、前のログエントリを参照して流入がログされ得る。これらの技法は、「Ｎ」レベルキャッシュに拡張され得る。このような方式でトレースファイルを記録するには、プロセッサを少し変更するだけでよい場合があり、従来のトレース記録の手法と比較すると、トレース記録の性能への影響とトレースファイルサイズの両方を桁違いで低減することができる。
【００１３】
[0019]図１は、内側または「下位層」のプロセッサキャッシュへの流入を検出すること、および外側または「上位層」の共有プロセッサキャッシュを使用して、以前にログされた値を参照してその流入がログされ得るかどうかを判定することを含む、プロセッサキャッシュの少なくとも２つの階層または層を使用して複数の処理ユニットにわたる実行の「ビットアキュレートな」トレースを記録することを容易にする、例示的なコンピューティング環境１００を示す。図示のように、実施形態は、たとえば、１つまたは複数のプロセッサ１０２、システムメモリ１０３、１つまたは複数のデータストア１０４、および／または入力／出力ハードウェア１０５などのコンピュータハードウェアを含む専用または汎用コンピュータシステム１０１を含むかまたは利用してよい。
【００１４】
[0020]本発明の範囲内の実施形態は、コンピュータ実行可能命令および／またはデータ構造を搬送または格納するための物理的媒体および他のコンピュータ可読媒体を含む。このようなコンピュータ可読媒体は、コンピュータシステム１０１によってアクセスされ得る任意の利用可能な媒体であり得る。コンピュータ実行可能命令および／またはデータ構造を格納するコンピュータ可読媒体は、コンピュータ記憶デバイスである。コンピュータ実行可能命令および／またはデータ構造を搬送するコンピュータ可読媒体は、伝送媒体である。したがって、限定ではなく例として、本発明の実施形態は、少なくとも２つの明確に異なる種類のコンピュータ可読媒体、すなわちコンピュータ記憶デバイスおよび伝送媒体を含む可能性がある。
【００１５】
[0021]コンピュータ記憶デバイスは、コンピュータ実行可能命令および／またはデータ構造を格納する物理ハードウェアデバイスである。コンピュータ記憶デバイスには、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ソリッドステートドライブ（「ＳＳＤ」）、フラッシュメモリ、相変化メモリ（「ＰＣＭ」）、光ディスクストレージ、磁気ディスクストレージ、もしくは他の磁気記憶デバイス、またはコンピュータ実行可能命令もしくはデータ構造の形式でプログラムコードを格納するために使用され得、かつ本発明の開示された機能を実装するためにコンピュータシステム１０１によってアクセスおよび実行され得る任意の他のハードウェアデバイスなどの様々なコンピュータハードウェアが含まれる。したがって、たとえば、コンピュータ記憶デバイスは、後述するように、図示のシステムメモリ１０３、コンピュータ実行可能命令および／もしくはデータ構造を格納することができる図示のデータストア１０４、またはオンプロセッサストレージなどの他のストレージを含み得る。
【００１６】
[0022]伝送媒体は、コンピュータ実行可能命令またはデータ構造の形式でプログラムコードを搬送するために使用され得、かつコンピュータシステム１０１によってアクセスされ得るネットワークおよび／またはデータリンクを含むことができる。「ネットワーク」は、コンピュータシステムおよび／またはモジュールおよび／または他の電子デバイス間の電子データの転送を可能にする１つまたは複数のデータリンクと定義される。ネットワークまたは別の通信接続（ハードワイヤード、ワイヤレス、またはハードワイヤードもしくはワイヤレスの組合せのいずれか）を介して情報がコンピュータシステムに転送または提供されるとき、コンピュータシステムは接続を伝送媒体と見なし得る。上記の組合せもコンピュータ可読媒体の範囲内に含まれるべきである。たとえば、入力／出力ハードウェア１０５は、プログラムコードをコンピュータ実行可能命令またはデータ構造の形式で搬送するために使用され得るネットワークおよび／またはデータリンクを接続するハードウェア（たとえば、ネットワークインターフェースモジュール（たとえば「ＮＩＣ」））を含み得る。
【００１７】
[0023]さらに、コンピュータ実行可能命令またはデータ構造の形式のプログラムコードは、様々なコンピュータシステムコンポーネントに到達すると、伝送媒体からコンピュータ記憶デバイスに（またはその逆に）自動的に転送され得る。たとえば、ネットワークまたはデータリンクを介して受信されたコンピュータ実行可能命令またはデータ構造は、ＮＩＣ（たとえば、入力／出力ハードウェア１０５）内のＲＡＭにバッファリングされ、次いで、最終的にシステムメモリ１０３および／またはコンピュータシステム１０１におけるより揮発性の低いコンピュータ記憶デバイス（たとえば、データストア１０４）に転送され得る。したがって、コンピュータ記憶デバイスが、伝送媒体も（または主に）利用するコンピュータシステムコンポーネントに含まれ得ることを理解されたい。
【００１８】
[0024]コンピュータ実行可能命令は、たとえば、プロセッサ１０２で実行されたとき、コンピュータシステム１０１に特定の機能または機能のグループを実行させる命令およびデータを含む。コンピュータ実行可能命令は、たとえば、バイナリ、アセンブリ言語などの中間フォーマット命令、またはさらにはソースコードであってもよい。
【００１９】
[0025]当業者は、本発明が、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースまたはプログラム可能な家庭用電化製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、携帯電話、ＰＤＡ、タブレット、ポケットベル、ルータ、スイッチなどを含む多くのタイプのコンピュータシステム構成を有するネットワークコンピューティング環境で実施され得ることを理解するであろう。本発明は、ネットワークを介して（ハードワイヤードデータリンク、ワイヤレスデータリンク、またはハードワイヤードデータリンクとワイヤレスデータリンクの組合せのいずれかによって）リンクされたローカルとリモートの両方のコンピュータシステムがタスクを実行する、分散システム環境で実施されてもよい。したがって、分散システム環境では、コンピュータシステムは複数の構成コンピュータシステムを含むことがある。分散システム環境では、プログラムモジュールは、ローカルとリモートの両方のメモリ記憶デバイスに配置されてよい。
【００２０】
[0026]当業者は、本発明がクラウドコンピューティング環境で実施され得ることも理解するであろう。クラウドコンピューティング環境は分散されてもよいが、これは必須ではない。分散される場合、クラウドコンピューティング環境は、組織内で国際的に分散されてよく、および／または複数の組織にまたがって存在するコンポーネントを有してもよい。この説明および以下の特許請求の範囲において、「クラウドコンピューティング」は、構成可能なコンピューティングリソース（たとえば、ネットワーク、サーバ、ストレージ、アプリケーション、およびサービス）の共有プールへのオンデマンドネットワークアクセスを可能にするためのモデルと定義される。「クラウドコンピューティング」の定義は、適切に展開されたときにそのようなモデルから得ることができる他の多くの利点のいずれにも限定されない。
【００２１】
[0027]クラウドコンピューティングモデルは、オンデマンドセルフサービス、広範なネットワークアクセス、リソースの共有、迅速な順応性、実測サービスなどの様々な特性で構成され得る。クラウドコンピューティングモデルは、たとえば、ソフトウェア・アズ・ア・サービス（「ＳａａＳ」）、プラットフォーム・アズ・ア・サービス（「ＰａａＳ」）、インフラストラクチャ・アズ・ア・サービス（「ＩａａＳ」）などの様々なサービスモデルの形式で提供されてもよい。クラウドコンピューティングモデルは、プライベートクラウド、コミュニティクラウド、パブリッククラウド、ハイブリッドクラウドなどの様々な展開モデルを使用して展開されてもよい。
【００２２】
[0028]クラウドコンピューティング環境などのいくつかの実施形態は、それぞれが１つまたは複数の仮想マシンを実行することができる１つまたは複数のホストを含むシステムを含み得る。仮想マシンは、動作中、運用コンピューティングシステムをエミュレートし、オペレーティングシステム、およびおそらく１つまたは複数の他のアプリケーションもサポートする。いくつかの実施形態において、各ホストは、仮想マシンのビューから抽象化された物理リソースを使用して仮想マシン用の仮想リソースをエミュレートするハイパーバイザを含む。ハイパーバイザは、仮想マシン間の適切な分離も提供する。したがって、任意の所与の仮想マシンの観点から見ると、ハイパーバイザは、仮想マシンが物理リソースの外観（たとえば、仮想リソース）とのみインターフェースしている場合でも、仮想マシンが物理リソースとインターフェースしているように錯覚させる。物理リソースの例には、処理能力、メモリ、ディスク容量、ネットワーク帯域幅、メディアドライブが含まれる。
【００２３】
[0029]図示のように、データストア１０４は、たとえば、トレーサ１０４ａ、オペレーティングシステムカーネル１０４ｂ、およびアプリケーション１０４ｃ（たとえば、トレーサ１０４ａによるトレースの対象となるアプリケーション、および１つまたは複数のトレースファイル１０４ｄ）などのアプリケーションプログラムを表すコンピュータ実行可能命令および／またはデータ構造を格納することができる。これらのプログラムが実行しているとき（たとえば、プロセッサ１０２を使用して）、システムメモリ１０３は、ランタイムデータ構造、コンピュータ実行可能命令などの対応するランタイムデータを格納することができる。したがって、図１は、ランタイムアプリケーションコード１０３ａおよびアプリケーションランタイムデータ１０３ｂ（たとえば、それぞれがアプリケーション１０４ｃに対応する）を含むものとして、システムメモリ１０３を示す。
【００２４】
[0030]トレーサ１０４ａは、アプリケーション１０４ｃなどのアプリケーションの実行のビットアキュレートなトレースを記録するため、およびトレースデータをトレースファイル１０４ｄに格納するために利用可能である。いくつかの実施形態では、トレーサ１０４ａはスタンドアロンアプリケーションであるが、他の実施形態では、トレーサ１０４ａは、オペレーティングシステムカーネル１０４ｂ、ハイパーバイザ、クラウドファブリックなどの別のソフトウェアコンポーネントに統合される。トレースファイル１０４ｄは、データストア１０４に格納されているように示されているが、トレースファイル１０４ｄは、排他的または一時的にシステムメモリ１０３または他の何らかの記憶デバイスに記録されてもよい。後で明らかにするように、トレーサ１０４ａは、プロセッサのキャッシュコヒーレンスプロトコル（ＣＣＰ）を利用したトレースを可能にするプロセッサ１０２の特定の機能と相互運用してよい。
【００２５】
[0031]図１は、プロセッサ１０２の内部ハードウェアコンポーネントの簡略化された表現を含む。図示のように、各プロセッサ１０２は、複数の処理ユニット１０２ａを含む。各処理ユニットは、物理的（すなわち、物理プロセッサコア）および／または論理的（すなわち、２つ以上のアプリケーションスレッドが物理コアで実行される、ハイパースレッディングをサポートする物理コアによって提供される論理コア）であり得る。したがって、たとえば、プロセッサ１０２は、いくつかの実施形態において単一の物理処理ユニット（コア）のみを含み得るが、その単一の物理処理ユニットによって提供される２つ以上の論理処理ユニット１０２ａを含むことがある。
【００２６】
[0032]各処理ユニット１０２ａは、アプリケーション（たとえば、トレーサ１０４ａ、オペレーティングカーネル１０４ｂ、アプリケーション１０４ｃなど）によって定義されたプロセッサ命令を実行し、その命令は、事前定義されたプロセッサ命令セットアーキテクチャ（ＩＳＡ）の中から選択される。各プロセッサ１０２の特定のＩＳＡは、プロセッサ製造業者およびプロセッサモデルによって異なる。一般的なＩＳＡには、ＩＮＴＥＬ，ＩＮＣ．のＩＡ−６４およびＩＡ−３２アーキテクチャ、ＡＤＶＡＮＣＥＤ  ＭＩＣＲＯ  ＤＥＶＩＣＥＳ，ＩＮＣ．のＡＭＤ６４アーキテクチャ、およびＡＲＭ  ＨＯＬＤＩＮＧＳ，ＰＬＣの様々なＡｄｖａｎｃｅｄ  ＲＩＳＣ  Ｍａｃｈｉｎｅ（「ＡＲＭ」）アーキテクチャが含まれるが、他の多数のＩＳＡが存在し、本発明によって使用され得る。一般に、「命令」は、プロセッサによって実行可能な、外部から見える（すなわち、プロセッサの外部にある）コードの最小単位である。
【００２７】
[0033]各処理ユニット１０２ａは、１つまたは複数のプロセッサキャッシュ１０２ｂからプロセッサ命令を取得し、キャッシュ１０２ｂ内のデータに基づいて、レジスタ１０２ｄ内のデータに基づいて、および／または入力データなしでプロセッサ命令を実行する。一般に、各キャッシュ１０２ｂは、システムメモリ１０３および／またはキャッシュ１０２ｂ内の別のキャッシュなどのバッキングストアの一部のオンプロセッサコピーを格納する小容量の（すなわち、システムメモリ１０３の典型的な容量と比較して小容量の）ランダムアクセスメモリである。たとえば、アプリケーションコード１０３ａを実行するとき、キャッシュ１０２ｂのうちの１つまたは複数は、アプリケーションランタイムデータ１０３ｂの一部を含む。処理ユニット１０２ａが特定のキャッシュ１０２ｂにまだ格納されていないデータを要求する場合、「キャッシュミス」が発生し、そのデータがシステムメモリ１０３または別のキャッシュからフェッチされ、場合によっては、そのキャッシュ１０２ｂから他のいくつかのデータを「追い出す」。
【００２８】
[0034]多くの場合、プロセッサキャッシュ１０２ｂは、層１（Ｌ１）、層２（Ｌ２）、層３（Ｌ３）などの個別の階層、層、またはレベルに分割される。プロセッサの実装に応じて、階層は、プロセッサ１０２自体の一部（たとえば、Ｌ１およびＬ２）であり得、および／またはプロセッサ１０２（たとえば、Ｌ３）から分離され得る。したがって、図１のキャッシュ１０２ｂは、これらの層（Ｌ１）のうちの１つを含んでよく、または複数のこれらの層（たとえば、Ｌ１およびＬ２、さらにはＬ３）を含み得る。図２Ａは、多層キャッシュを説明する例示的な環境２００を示す。図２Ａでは、２つのプロセッサ２０１ａおよび２０１ｂ（たとえば、それぞれが図１の異なるプロセッサ１０２に対応する）、およびシステムメモリ２０２（たとえば、図１のシステムメモリ１０３に対応する）がある。例示的な環境２００において、各プロセッサ２０１は、４つの物理処理ユニット（すなわち、プロセッサ２０１ａ用のユニットＡ１〜Ａ４およびプロセッサ２１０ｂ用のユニットＢ１〜Ｂ４）を含む。
【００２９】
[0035]例示的な環境２００は、各処理ユニット２０１内に３層キャッシュも含む。環境２００は単にレイアウトの一例であり、本明細書の実施形態が動作し得るキャッシュ階層に限定するものではない。環境２００において、最も低いまたは最も内側の層では、各処理ユニットは、それ自体の専用Ｌ１キャッシュ（たとえば、ユニットＡ１用のプロセッサ２０１ａ内のＬ１キャッシュ「Ｌ１−Ａ１」、ユニットＡ２用のプロセッサ２０１ａ内のＬ１キャッシュ「Ｌ１−Ａ２」など）に関連付けられる。層を上に移動すると、各処理ユニット２０１は、２つのＬ２キャッシュ（たとえば、Ｌ１キャッシュＬ１−Ａ１およびＬ１−Ａ２のバッキングストアとして機能する、プロセッサ２０１ａ内のＬ２キャッシュ「Ｌ２−Ａ１」、Ｌ１キャッシュＬ１−Ａ３およびＬ１−Ａ４のバッキングストアとして機能する、プロセッサ２０１ａ内のＬ２キャッシュ「Ｌ１−Ａ２」など）を含む。最後に、最も高いまたは最も外側の層では、各処理ユニット２０１は、単一のＬ３キャッシュ（たとえば、Ｌ２キャッシュＬ２−Ａ１およびＬ２−Ａ２のバッキングストアとして機能する、プロセッサ２０１ａ内のＬ３キャッシュ「Ｌ３−Ａ」、ならびにＬ２キャッシュＬ２−Ｂ１およびＬ２−Ｂ２のバッキングストアとして機能する、プロセッサ２０１ｂ内のＬ３キャッシュ「Ｌ３−Ｂ」）を含む。図示のように、システムメモリ２０２は、Ｌ３キャッシュＬ３−ＡおよびＬ３−Ｂのバッキングストアとして機能する。
【００３０】
[0036]図２Ａに示すように、複数のキャッシュ層が使用されるとき、処理ユニット１０２ａは、通常、最下層（Ｌ１）と直接相互作用する。ほとんどの場合、データは層間で流れる（たとえば、読取りでは、Ｌ３キャッシュはシステムメモリ１０３と相互作用してデータをＬ２キャッシュに提供し、次にＬ２キャッシュはデータをＬ１キャッシュに提供する）。処理ユニット１０２ａが書込みを実行すると、キャッシュは、処理ユニット１０２ａ間で共有されたデータに影響を与えたそれらのキャッシュがこれ以上データを保持しないように連携する。この連携は、ＣＣＰを使用して実行される。
【００３１】
[0037]したがって、環境２００内のキャッシュは、「共有」キャッシュと見なされ得る。たとえば、各Ｌ２およびＬ３キャッシュは、所与のプロセッサ２０１内の複数の処理ユニットにとって役に立ち、したがって処理ユニットによって共有される。個々のＬ１キャッシュが、一貫性を保証するように（すなわち、キャッシュされた各メモリ位置がすべてのＬ１キャッシュにわたって一貫して見られるように）相互に（すなわち、ＣＣＰを介して）連携し得るので、所与のプロセッサ２０１内のＬ１キャッシュは、それぞれが単一の処理ユニットに対応していても、集合的に共有されていると見なすこともできる。各プロセッサ２０１内のＬ２キャッシュは、同様に、ＣＣＰを介して連携することができる。さらに、プロセッサ２０１がハイパースレッディングをサポートする場合、個々の各Ｌ１キャッシュは、２つ以上の論理処理ユニットによって共有されていると見なすことができ、したがって、個々のレベルでさえも「共有」される。
【００３２】
[0038]通常、各キャッシュは複数の「キャッシュライン」を含む。各キャッシュラインは、そのバッキングストア（たとえば、システムメモリ２０２または上位層キャッシュ）からのメモリのチャンクを格納する。たとえば、図２Ｂは、複数のキャッシュライン２０６を含むキャッシュ２０３の少なくとも一部の例を示し、それぞれが、少なくともアドレス部２０４および値部２０５を含む。各キャッシュライン２０６のアドレス部２０４は、キャッシュラインが対応するシステムメモリ２０２内にアドレスを格納するように構成され、値部２０５は、システムメモリ２０２から受信した値を最初に格納する。値部２０５は、処理ユニットによって変更され得、最終的にバッキングストアへ追い出され得る。省略符号によって示されるように、キャッシュ２０３は、多数のキャッシュラインを含み得る。たとえば、現代の６４ビットのＩＮＴＥＬプロセッサは、５１２個以上のキャッシュラインを含む個別のＬ１キャッシュを含み得る。このようなキャッシュでは、各キャッシュラインは通常、６バイト（４８ビット）から８バイト（６４ビット）のメモリアドレスを参照して６４バイト（５１２ビット）の値を格納するために利用可能である。図２Ａに視覚的に示されているように、キャッシュサイズは通常、層ごとに増加する（すなわち、Ｌ２キャッシュは通常Ｌ１キャッシュよりも大きく、Ｌ３キャッシュは通常Ｌ２キャッシュよりも大きいなど）。
【００３３】
[0039]各キャッシュライン２０６のアドレス部２０４に格納されるアドレスは、システムメモリ２０２内の実際のメモリアドレスなどの物理アドレスであり得る。代替として、アドレス部２０４に格納されるアドレスは、仮想アドレスであり得、これは、（たとえば、オペレーションシステム管理のページテーブルを使用して）抽象化を提供するために物理アドレスにマッピングされるアドレスである。このような抽象化は、たとえば、オペレーティングシステムカーネル１０４ｂに関連付けられるユーザモードプロセスとカーネルモードプロセスとの間の分離を含む、プロセッサ１０２で実行される異なるプロセス間のメモリ分離を容易にするために使用され得る。仮想アドレスが使用されるとき、プロセッサ１０２は、最近使用されたメモリアドレスの物理アドレスと仮想アドレスとの間のマッピングを維持する変換索引バッファ（ＴＬＢ）１０２ｆ（通常はメモリ管理ユニット（ＭＭＵ）の一部）を含み得る。
【００３４】
[0040]キャッシュ１０２ｂは、コードキャッシュ部およびデータキャッシュ部を含み得る。アプリケーションコード１０３ａを実行するとき、キャッシュ１０２ｂのコード部は、アプリケーションコード１０３ａに格納されたプロセッサ命令の少なくとも一部を格納し得、キャッシュ１０２ｂのデータ部は、アプリケーションランタイムデータ１０３ｂのデータ構造の少なくとも一部を格納し得る。加えて、キャッシュは、包括的、排他的であるか、または包括的挙動と排他的挙動の両方を含み得る。たとえば、包括的キャッシュでは、Ｌ３層は、データのスーパーセットをＬ３層の下方にあるＬ２層に格納することになり、Ｌ２層は、Ｌ２層の下方にあるＬ１層のスーパーセットを格納する。排他的キャッシュでは、層は、分離されることがあり、たとえば、Ｌ１キャッシュが必要とするデータがＬ３キャッシュに存在する場合、それらはデータ、アドレスなどの情報を交換する。
【００３５】
[0041]図１に戻ると、各プロセッサ１０２は、プロセッサ１０２の動作を制御する制御論理（すなわち、実行可能命令）を含み、かつ一般にプロセッサのハードウェアと、プロセッサ１０２によって実行アプリケーションに対して公開されるプロセッサＩＳＡとの間のインタープリタとして機能する、マイクロコード１０２ｃも含む。マイクロコード１０２は、典型的には、ＲＯＭ、ＥＥＰＲＯＭなどのオンプロセッサストレージ上で具現化される。
【００３６】
[0042]レジスタ１０２ｄは、プロセッサ１０２のＩＳＡに基づいて定義され、かつプロセッサ命令によって読取りおよび／または書取りが行われる、ハードウェアベースの記憶場所である。たとえば、レジスタ１０２ｄは、一般に、命令によって使用するためにキャッシュからフェッチされた値を格納するため、命令の実行結果を格納するため、および／または命令実行による副作用（たとえば、値が変化するサイン、値がゼロに達するサイン、キャリーの発生など）のうちのいくつか、プロセッササイクル数などの、ステータスまたは状態を格納するために使用される。したがって、いくつかのレジスタ１０２ｄは、プロセッサ命令を実行することによって引き起こされるいくつかの状態変化を知らせるために使用される「フラグ」を備え得る。いくつかの実施形態において、プロセッサ１０２は、プロセッサ動作の異なる態様を制御するために使用される制御レジスタも含み得る。図１は、レジスタ１０２ｄを単一のボックスとして示しているが、各処理ユニット１０２ａは、通常、その処理ユニットに固有のレジスタ１０２ｄの１つまたは複数の対応するセットを含むことが理解されよう。
【００３７】
[0043]いくつかの実施形態において、プロセッサ１０２は、１つまたは複数のバッファ１０２ｅを含み得る。本明細書で後に説明するように、バッファ１０２ｅは、トレースデータの一時的な記憶場所として使用され得る。したがって、たとえば、プロセッサ１０２は、トレースデータの一部をバッファ１０２ｅに格納し、利用可能なメモリバス帯域幅および／または空きプロセッササイクルがあるときなどの適切なときに、そのデータをトレースファイル１０４ｄにフラッシュし得る。
【００３８】
[0044]上記で言及したように、プロセッサは１つまたは複数のＣＣＰに従ってキャッシュ１０２ｂ上で動作する。一般に、ＣＣＰは、様々な処理ユニット１０２ａが様々なキャッシュ１０２ｂ内のデータに対して読取りおよび書込みを行うときに様々なキャッシュ１０２ｂの間でデータ間の一貫性をどのように維持するか、および様々な処理ユニット１０２ａがキャッシュ１０２ｂ内の所与の場所から有効なデータを常に読み取ることをどのように保証するかを定義する。ＣＣＰは、プロセッサ１０２のＩＳＡによって定義されたメモリモデルに関連し、それを有効にする。
【００３９】
[0045]一般的なＣＣＰの例には、ＭＳＩプロトコル（すなわち、変更、共有、無効）、ＭＥＳＩプロトコル（すなわち、変更、排他、共有、および無効）、ならびにＭＯＥＳＩプロトコル（すなわち、変更、所有、排他、共有、および無効）が含まれる。これらのプロトコルの各々は、キャッシュ１０２ｂ内の個々の位置（たとえばライン）の状態を定義する。「変更」のキャッシュ位置には、キャッシュ１０２ｂ内で変更されたことによりバッキングストア（たとえば、システムメモリ１０３または別のキャッシュ）内の対応するデータと潜在的に矛盾するデータが含まれる。「変更」状態を有する位置がキャッシュ１０２ｂから追い出されると、共通のＣＣＰは、そのデータがバッキングストアに書き戻されること、または別のキャッシュがこの役割を引き継ぐことを保証するようキャッシュに要求する。「共有」のキャッシュ位置には、バッキングストア内のデータから変更されておらず、読取り専用状態で存在し、処理ユニット１０２ａによって共有されるデータが含まれる。キャッシュ１０２ｂは、このデータをバッキングストアに書き込まずに追い出すことができる。「無効」のキャッシュ位置には有効なデータが含まれておらず、空であり、キャッシュミスからのデータを格納するために利用可能であると見なすことができる。「排他」のキャッシュ位置には、バッキングストアと一致し、単一の処理ユニット１０２ａのみによって使用されるデータが含まれる。「排他」のキャッシュ位置は、いつでも（すなわち、読取り要求に応じて）「共有」状態に変更されてよく、または「排他」のキャッシュ位置への書込み時に「変更」状態に変更されてよい。「所有」のキャッシュ位置は、２つ以上の処理ユニット１０２ａによって共有されるが、処理ユニットのうちの１つは、それを変更する排他的権利を有する。その処理は、変更を加えるときに他の処理ユニットに通知するが、これは、通知された処理ユニットがＣＣＰ実装に基づいて無効化または更新する必要がある場合があるからである。
【００４０】
[0046]言及したように、実施形態は、プロセッサ１０２のキャッシュ１０２ｂを利用してアプリケーション１０４ｃおよび／またはオペレーティングシステムカーネル１０４ｂの実行のビットアキュレートなトレースを効率的に記録する。これらの実施形態は、（キャッシュ１０２ｂを含む）プロセッサ１０２が、半閉鎖または準閉鎖システムを形成するという発明者による観察に基づいて構築されている。たとえば、プロセスのデータの一部（すなわち、コードデータおよびランタイムアプリケーションデータ）がキャッシュ１０２ｂにロードされると、プロセッサ１０２は、入力なしで、時間のバーストのための半閉鎖または準閉鎖システムとして単独で実行することができる。具体的には、キャッシュ１０２ｂにデータがロードされると、処理ユニット１０２ａのうちの１つまたは複数は、キャッシュ１０２ｂのデータ部に格納されているランタイムデータを使用して、かつレジスタ１０２ｄを使用して、キャッシュ１０２ｂのコード部からの命令を実行する。
【００４１】
[0047]処理ユニット１０２ａが情報のいくらかの流入を必要とするとき（たとえば、処理ユニット１０２ａが実行している命令が、キャッシュ１０２ｂにまだ存在しないアクセスコードまたはランタイムデータを実行することになるか、またはそれを実行する場合があるので）、「キャッシュミス」が発生し、その情報は、システムメモリ１０３からキャッシュ１０２ｂに取り込まれる。たとえば、実行された命令がアプリケーションランタイムデータ１０３ｂ内のメモリアドレスでメモリ動作を実行するときにデータキャッシュミスが発生した場合、そのメモリアドレスからのデータは、キャッシュ１０２ｂのデータ部のキャッシュラインのうちの１つに取り込まれる。同様に、命令がシステムメモリ１０３に格納されているメモリアドレスアプリケーションコード１０３ａでメモリ動作を実行するときにコードキャッシュミスが発生した場合、そのメモリアドレスからのコードは、キャッシュ１０２ｂのコード部のキャッシュラインのうちの１つに取り込まれる。次いで、処理ユニット１０２ａは、（たとえば、別のキャッシュミスまたはキャッシュされていない読取りにより）新しい情報が再びキャッシュ１０２ｂに取り込まれるまで、キャッシュ１０２ｂ内の新しい情報を使用して実行を継続する。
【００４２】
[0048]発明者はまた、アプリケーションの実行のビットアキュレートな表現を記録するために、処理ユニットがそのアプリケーションのスレッドを実行するときに、トレーサ１０４ａが、キャッシュ１０２ｂへの情報の流入を再現可能にするのに十分なデータを記録できることを観察した。たとえば、これらの流入を記録する１つの手法は、処理ユニットごとを基準として、最も内側のキャッシュ層（たとえばＬ１）で動作する。この手法は、トレースされている処理ユニットごとに、実行中に、（たとえば、実行された命令のカウントまたは他のカウンタを使用して）各データがその処理ユニットのＬ１キャッシュに取り込まれた時間に沿って、その処理ユニットのＬ１キャッシュに関連するすべてのキャッシュミスおよびキャッシュされていない読取り（すなわち、ハードウェアコンポーネントおよびキャッシュ不可メモリからの読取り）を記録すること含み得る。処理ユニット全体にわたって順序付けされ得るイベント（共有メモリへのアクセスなど）がある場合、これらのイベントは、（たとえば、データストリーム全体にわたって単調増分数（ＭＩＮ：monotonically incrementing number）を使用することによって）結果のデータストリーム全体にわたってログされ得る。
【００４３】
[0049]しかしながら、Ｌ１キャッシュ層は、（たとえば、図２Ａに示すように）それぞれが異なる物理処理ユニットに関連付けられた複数の別個のＬ１キャッシュを含み得るので、この方式で記録すると重複データが記録される可能性があり、したがって「完全忠実な」トレースにはより多くのデータが厳密に必要である。たとえば、複数の物理処理ユニットが同じメモリ位置から読み取る場合（これは、マルチスレッドアプリケーションにおいて頻繁に発生することがある）、この手法は、複数の物理処理ユニットのそれぞれについて、同じメモリ位置およびデータに関するキャッシュミスをログすることができる。特に、本明細書で使用される場合、「完全忠実な」トレースとは、特定の「完全忠実な」トレースに含まれる同じ情報をカプセル化したデータが、実際には代替のトレース技法を使用して記録された可能性のあるものよりも少ない場合でも、トレースされたエンティティの完全な再生を可能にするのに十分な情報を含む任意のトレースである。
【００４４】
[0050]トレースファイルサイズをさらに削減するために、発明者は、上位層キャッシュのうちの１つまたは複数を利用して、この重複データの少なくとも一部を記録することを回避する改良された記録技法を開発した。代わりに、これらの改良された技法は、以前にログされたデータを参照してログすることができる。具体的には、実施形態は、１つの処理ユニットによるアクティビティに基づいて内側または「下位層」のプロセッサキャッシュ（たとえば、Ｌ１）への流入（すなわち、キャッシュミス）を検出するが、次いで、可能であれば、１つまたは複数の外側または「上位層」の共有プロセッサキャッシュを使用して、すでに別のトレースされた処理ユニットためにログされた流入を参照してその流入をログする。
【００４５】
[0051]これらの技法を理解するために、ほとんどの環境において、上位層キャッシュはその下方の下位層キャッシュよりも大きく、しばしば複数の下位層キャッシュのバッキングストアであることに留意されたい。たとえば、図２Ａの例示的な環境において、各Ｌ２キャッシュは２つのＬ１キャッシュのバッキングストアであり、各Ｌ３キャッシュは２つのＬ２キャッシュ（および、拡張によって４つのＬ１キャッシュ）のバッキングストアである。したがって、上位層キャッシュは複数の下位層キャッシュに関する知識を保持することができる（たとえば、図２Ａにおいて、Ｌ２キャッシュＬ１−Ａ１は、Ｌ１キャッシュＬ１−Ａ１およびＬ１−Ａ２に関する知識を保持することができ、Ｌ２キャッシュＬ１−Ａ２は、Ｌ１キャッシュＬ１−Ａ３およびＬ１−Ａ４に関する知識を保持することができ、Ｌ３キャッシュＬ３−Ａは、Ｌ２キャッシュＬ２−Ａ１およびＬ２−Ａ１、ならびにＬ１キャッシュＬ１−Ａ１、Ｌ１−Ａ２、Ｌ１−Ａ３、およびＬ１−Ａ４に関する知識を保持することができる）。１つまたは複数の上位キャッシュ層の知識を利用することによって、本明細書の実施形態は、すでに別の処理ユニットのためにログされた流入を参照して、１つの処理ユニットによって引き起こされた流入をログする多くの機会を可能にする。
【００４６】
[0052]これらの実施形態に従って、図３は、１つまたは複数の上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録のための方法３００の例を示す。次に、図３について、図１および図２のコンテキストで説明する。
【００４７】
[0053]具体的には、図３は、複数の処理ユニットと、複数のＮレベルキャッシュと、複数のＮレベルキャッシュのうちの２つ以上に関連付けられ、複数のＮレベルキャッシュのバッキングストアとして構成される（Ｎ＋ｉ）レベルキャッシュとを含む、プロセッサ１０２または２０１ａなどの環境において動作する。方法３００において（および、特許請求の範囲において）、Ｎおよびｉは正の整数であり、すなわち、Ｎが１、２、３などであるようにＮ≧１であり、ｉが１、２、３などであるようにｉ≧１である。たとえば、図２Ａのプロセッサ２０１ａを参照すると、プロセッサは、複数の処理ユニットＡ１、Ａ２などを含む。プロセッサ２０１ａは、複数のＮレベルキャッシュＬ１−Ａ１、Ｌ１−Ａ２なども含む（すなわち、ここでＮは１である）。プロセッサ２０１ａは、複数のＮレベルキャッシュのうちの２つ以上に関連付けられ、複数のＮレベルキャッシュのバッキングストアとして構成される（Ｎ＋ｉ）レベルキャッシュも含む。たとえば、プロセッサ２０１ａは、ＮレベルキャッシュＬ１−Ａ１およびＬ１−Ａ２のバッキングストアである（Ｎ＋ｉ）レベルキャッシュＬ２−Ａ１を含む（すなわち、ここでＮは１であり、ｉは１である）。別の例において、プロセッサ２０１ａは、ＮレベルキャッシュＬ１−Ａ１、Ｌ１−Ａ２などのバッキングストアである（Ｎ＋ｉ）レベルキャッシュＬ３−Ａを含む（すなわち、ここでＮは１であり、ｉは２である）。プロセッサ１０２／２０１ａは、マイクロコード１０２ｃおよび／または回路論理などの制御論理に基づいて方法３００を動作させる。
【００４８】
[0054]図示のように、方法３００は、第１の処理ユニットでの実行中にＮレベルキャッシュへの流入を検出する動作３０１を含む。いくつかの実施形態において、動作３０１は、複数のＮレベルキャッシュのうちの第１のＮレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出することを含む。たとえば、（たとえばアプリケーション１０４ｃの第１のスレッドの正常実行または投機的実行の結果として生じる）システムメモリ２０２への要求されたメモリアクセスなどの処理ユニットＡ１によるアクティビティに基づいて、キャッシュミスがキャッシュＬ１−Ａ１（すなわち、Ｎが１であるとき）において発生し得る。このように、キャッシュのラインＬ１−Ａ１は、要求されたメモリ位置のその時点での現在の値を含むデータの流入を取得する。キャッシュ属性（たとえば、どの上位レベル層が存在するか、キャッシュアーキテクチャが包括的であるか排他的であるかなど）および現在のキャッシュ状態に応じて、流入は、システムメモリ２０２から、または上位レベルキャッシュ（たとえば、Ｌ２−Ａ１および／またはＬ３−Ａ）から供給され得る。
【００４９】
[0055]方法３００は、（Ｎ＋ｉ）レベルキャッシュをチェックして、流入のデータが第２の処理ユニットでの実行に基づいてすでにログされているかどうかを判定する動作３０２も含む。いくつかの実施形態において、動作３０２は、第１のＮレベルキャッシュへの流入を検出したことに基づいて、（Ｎ＋ｉ）レベルキャッシュをチェックして、メモリ位置のデータが以前に第２の処理ユニットのためにログされているかどうかを判定することを含む。たとえば、（Ｎ＋ｉ）レベルキャッシュが（Ｎ＋１）レベルキャッシュを含むように、ｉが１である場合、プロセッサ２０１は、（キャッシュＬ１−Ａ２および処理ユニットＡ２の知識を有する）Ｌ２−Ａ１などのＬ２キャッシュをチェックし得る。このチェックは、メモリ位置のデータが以前に処理ユニットＡ２のためにログされていたかどうかを判定するために使用され得る。このデータは、たとえば、キャッシュＬ１−Ａ２でキャッシュミスを引き起こした処理ユニットＡ２でのアプリケーション１０４ｃの第２のスレッドの前の実行に基づいて、以前にログされた可能性がある。代替の例において、（Ｎ＋ｉ）レベルキャッシュが（Ｎ＋２）レベルキャッシュを含むように、ｉが２である場合、プロセッサ２０１は、（プロセッサ２０１内の他のすべてのキャッシュの知識を有する）キャッシュＬ３−ＡなどのＬ２キャッシュをチェックし得る。このチェックは、（たとえば、キャッシュＬ１−Ａ２、Ｌ１−Ａ３、および／またはＬ１−Ａ４でキャッシュミスを引き起こした処理ユニットＡ２〜Ａ４のうちの１つまたは複数でのアプリケーション１０４ｃの１つまたは複数の他のスレッドの前の実行に基づいて）メモリ位置のデータが以前に処理ユニットＡ２〜Ａ４のいずれかのためにログされていたかどうかを判定するために使用され得る。なお、この第２の例では、Ｌ２キャッシュは、チェックにおいてスキップされる場合がある。
【００５０】
[0056]図示のように、動作３０２は、毎回ｉの値をインクリメントしながら、何回でも繰り返され得る。通常、ｉは毎回１だけインクリメントされるが、１より大きい正の整数だけｉをインクリメントする実施形態もあり得る。動作３０２を繰り返す効果は、ｉをインクリメントしながら、複数の上位レベルキャッシュをチェックすることである。たとえば、ｉ＝１の場合、動作３０２が最初に実行されるとき、プロセッサ２０１は、Ｌ２キャッシュ層（たとえば、Ｌ２−Ａ１および／またはＬ２−Ａ２）をチェックすることができる。該当するメモリ位置に関する知識がＬ２キャッシュ内では不十分であると判明した場合、プロセッサ２０１は、ｉ＝２で動作３０２を繰り返し、それによりＬ３キャッシュ層（たとえば、Ｌ３−Ａ）をチェックすることができる。コンピューティング環境が提供するのと同じ数のレベルキャッシュに対して、これが継続され得る。さらにｉが１より大きい値でインクリメントされた場合、１つまたは複数のキャッシュ層が途中でスキップされ得る。排他的キャッシュを提供する、または包括的／排他的挙動のハイブリッドを示すキャッシュを提供するアーキテクチャにおいて複数のキャッシュレベルをチェックすることが有益であり得ることが理解されよう。その理由は、これらのアーキテクチャでは、外側のキャッシュ層が内側のキャッシュ層内のデータの完全なスーパーセットを含むという保証がない可能性があるからである。
【００５１】
[0057]上記を考慮して、方法３００は、（Ｎ＋ｉ）レベルキャッシュが（Ｎ＋１）レベルキャッシュを含むようにｉが１に等しく、プロセッサが（Ｎ＋１）レベルキャッシュのバッキングストアとして構成された（Ｎ＋２）レベルキャッシュも含む、プロセッサ１０２または２０１ａなどの環境で動作することができることが理解されよう。これらの環境において、（Ｎ＋１）レベルキャッシュをチェックして、メモリ位置のデータが以前に第２の処理ユニットのためにログされているかどうかを判定すること（すなわち、動作３０２）は、（Ｎ＋１）レベルキャッシュ内のどのキャッシュラインもメモリ位置に対応していないと判定することを含み得る。さらに、（Ｎ＋２）レベルキャッシュをチェックして、メモリ位置のデータが以前に第２の処理ユニットのためにログされているかどうかを判定する。
【００５２】
[0058]図示のように、動作３０２の結果に基づいて、方法は、データがすでにログされているときに参照によって流入をログする動作３０３、またはデータがまだログされていないときに値によって流入をログする動作３０４を含む。
【００５３】
[0059]いくつかの実施形態において、動作３０３は、メモリ位置のデータが以前に第２の処理ユニットのためにログされているとき、以前に第２の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第１の処理ユニットのためにログさせることを含む。上記の例を続けると、たとえば、（Ｎ＋１）レベルキャッシュＬ２−Ａ１のチェックおよび／または（Ｎ＋２）レベルキャッシュＬ３−Ａのチェックの結果、データ／メモリ位置が（キャッシュＬ１−Ａ２への流入に基づいて）処理ユニットＡ２のためにすでにログされていると判定された場合、プロセッサ２０１ａは、処理ユニットＡ２用に作成されたログエントリを参照して、キャッシュＬ１−Ａ１への流入を処理ユニットＡ１のためにログさせることができる。参照によるロギングがどのように達成されるかの例については後述する。
【００５４】
[0060]動作３０２の代替の結果を見てみると、いくつかの実施形態において、動作３０４は、メモリ位置のデータが以前に第２の処理ユニットのためにログされていないとき、メモリ位置のデータを第１の処理ユニットのために値によってログさせることを含む。たとえば、（Ｎ＋１）レベルキャッシュＬ２−Ａ１のチェックおよび／または（Ｎ＋２）レベルキャッシュＬ３−Ａのチェックの結果、データ／メモリ位置が別の処理ユニットのためにまだログされていないと判定された場合、プロセッサ２０１ａは、キャッシュＬ１−Ａ１への流入を、処理ユニットＡ１のために値によってログさせることができる。値によるロギングは、たとえば、処理ユニットＡ１のデータパケットにおけるメモリアドレスおよびメモリ値をログすることを含み得る。なお、値によるロギングは、実際のロギングを達成するために必要なビット数を削減するための任意の数の圧縮技法を含み得る。
【００５５】
[0061]図１に関連して説明したように、プロセッサ１０２は、トレースデータを一時的に格納するために使用され得るバッファ１０２ｄを含み得る。したがって、方法３００において、異なるタイプのデータをログ「させること」は、プロセッサ１０２がこのようなデータをバッファ１０２ｄに格納することを含み得る。追加として、または代替として、異なるタイプのデータをログ「させること」は、プロセッサ１０２が、このようなデータをトレーサ１０４ａに通信すること、このようなデータをトレースファイル１０４ｄに書き込むこと、および／またはデータがバッファ１０２ｄで利用可能であることをトレーサ１０４ａに通知することを含み得る。いくつかの実施形態において、バッファ１０２ｄは、キャッシュ１０２ｂの１つまたは複数の予約済みの部分を含み得る。したがって、動作３０４／３０４において、バッファ１０２ｄを使用して、メモリ位置のデータを第１の処理ユニットのために、参照または値のいずれかによって、ログさせることは、プロセッササイクル、メモリ位置、バス帯域幅などのリソースの可用性に基づいてログさせることを遅延させることを含み得る。バッファ１０２ｄがキャッシュ１０２ｂの１つまたは複数の予約済みの部分を含む実施形態において、遅延されたログさせることは、遅延されたログさせることに用いるメモリ位置のデータを保持するために、（Ｎレベルキャッシュおよび／または（Ｎ＋ｉ）レベルキャッシュ内の）キャッシュラインを追い出すのではなく無効にすることを含み得る。
【００５６】
[0062]方法３００の説明は、下位層キャッシュに関する「知識」を有する上位層キャッシュについて言及している。上位層キャッシュが保持する下位レベルキャッシュに関する「知識」の特定の形式は様々である場合があり、次に例を示す。
【００５７】
[0063]基本的な形式では、この「知識」は、下位レベルキャッシュのキャッシュライン（すなわち、同じメモリ位置およびメモリデータに対応するキャッシュライン）に対応する上位レベルキャッシュのキャッシュラインの単なる存在であり得る。上述のように、包括的キャッシュでは、上位層は、それらの下方の層にデータのスーパーセットを格納する。たとえば、図２Ａのキャッシュが包括的であると仮定する。この場合、処理ユニットＡ２によるアクティビティにより、システムメモリ２０２からの位置がキャッシュＬ１−Ａ２にインポートされると、その同じメモリ位置もキャッシュＬ２−Ａ１およびＬ３−Ａにキャッシュされる。処理ユニットＡ２のアクティビティがトレースされている場合、実施形態は、処理ユニットＡ２のためにメモリ位置およびその値をログさせることができる。その後、処理ユニットＡ１によるアクティビティにより、システムメモリ２０２からのその同じ位置がキャッシュＬ１−Ａ１にインポートされ、その位置が同じデータをまだ格納している場合、キャッシュＬ２−Ａ１がすでにデータを有するので、キャッシュＬ２−Ａ１からデータが提供される。従来の技法では、このデータがキャッシュＬ２−Ａ１への流入であることに基づいて、処理ユニットＡ１のこのデータを再びログする場合がある。しかしながら、本明細書の実施形態は、代わりに、メモリ位置およびその値がキャッシュＬ２−Ａ１にすでに存在し、したがってキャッシュＬ１−Ａ２にすでに存在すると認識し得る。処理ユニットＡ２がログされているので、実施形態は、メモリ位置およびその値が処理ユニットＡ２のためにすでにログされていることを認識し、したがって、処理ユニットＡ１のこの新しいアクティビティを、以前に処理ユニットＡ２のために記録されたログデータを参照してログさせる。
【００５８】
[0064]上位層キャッシュによる、より複雑な形式の「知識」も可能である。たとえば、実施形態は、プロセッサ１０２が、アカウンティングビットを実装するキャッシュラインごとに、（場合によっては、キャッシュラインをログした処理ユニットのアイデンティティと共に）そのキャッシュラインがログされているかどうかを識別できるようにする追加の「アカウンティング」（またはロギング）ビットを用いて、１つまたは複数のキャッシュ層内のキャッシュラインを拡張することができる。これらの概念を理解するために、図４Ａは、図２Ｂの共有キャッシュ２０３と同様に、そのキャッシュライン４０４のそれぞれを１つまたは複数の追加のアカウンティングビット４０１を用いて拡張する例示的な共有キャッシュ４００ａを示す。したがって、各キャッシュライン４０４は、アカウンティングビット４０１、従来のアドレスビット４０２、および値ビット４０３を含む。
【００５９】
[0065]代替として、図４Ｂは、メモリアドレス４０２および値４０３を格納する従来のキャッシュライン４０５、ならびに従来のキャッシュライン４０５に適用するアカウンティングビットを格納するための１つまたは複数の予約済みのキャッシュライン４０６を含む共有キャッシュ４００ｂの例を示す。予約済みのキャッシュライン４０６のビットは、それぞれが従来のキャッシュライン４０５の異なる１つに対応するアカウンティングビットの異なるグループに割り当てられる。
【００６０】
[0066]図４Ｂの変形例では、予約済みのキャッシュライン４０６は、（後でより詳細に述べる）セットアソシアティブ方式のキャッシュの各インデックスにおいて１つ（または複数）のウェイとして予約され得る。たとえば、８ウェイセットアソシアティブ方式のキャッシュでは、セット内の１個のウェイが、セット内の他の７個のウェイに適用するアカウンティングビット用に予約され得る。これにより、予約済みのキャッシュラインの実装の複雑さを軽減することができ、また所与のセット内のすべてのウェイは通常、ほとんどのプロセッサによって並行して読み取られるので、予約済みのキャッシュラインへのアクセスを高速化することができる。
【００６１】
[0067]アカウンティングビットが実際どのように格納されるかに関係なく、各キャッシュラインのアカウンティングビット４０１は、キャッシュラインの現在の値が処理ユニットのためにログされたか（または代替として、ロギングに参加する処理ユニットによって消費されたか）どうかを示すためにプロセッサ１０２によって使用されるフラグ（すなわち、オンまたはオフ）として機能する１つまたは複数のビットを含み得る。したがって、動作３０２におけるチェックは、このフラグを使用して、ロギングに参加する処理ユニットによってキャッシュラインがログされているかどうかを判定することを含み得る。
【００６２】
[0068]代替として、各キャッシュラインのアカウンティングビット４０１は、複数のビットを含み得る。複数のビットは、いくつかのウェイで使用され得る。本明細書では「ユニットビット」と呼ばれる１つの手法を使用する場合、各キャッシュラインのアカウンティングビット４０１は、プロセッサ１０２の処理ユニット１０２ａの数（たとえば、プロセッサ１０２がハイパースレッディングをサポートする場合は論理処理ユニットの数、またはハイパースレッディングがサポートされていない場合は物理処理ユニットの数）と同等の数のユニットビットを含み得る。これらのユニットビットは、（もしあれば）１つまたは複数の特定の処理ユニットのどれがキャッシュラインをログしたかを追跡するためにプロセッサ１０２によって使用され得る。したがって、たとえば、２個の処理ユニット１０２ａによって共有されるキャッシュは、２個のユニットビットを各キャッシュラインに関連付けることができる。
【００６３】
[0069]本明細書では「インデックスビット」と呼ばれる、複数のアカウンティングビット４０１を使用した別の手法では、各キャッシュラインのアカウンティングビット４０１は、場合によっては「予約済み」の値（たとえば、−１）と共に、ロギングに参加するコンピュータシステム１０１のプロセッサ１０２の処理ユニット１０２ａの各々に対するインデックスを表すのに十分な数のインデックスビットを含み得る。たとえば、プロセッサ１０２が１２８個の処理ユニット１０２ａを含む場合、これらの処理ユニットは、キャッシュラインごとに７個のインデックスビットのみを使用して、インデックス値（たとえば、０〜１２７）によって識別され得る。いくつかの実施形態において、キャッシュラインをログしたプロセッサがないことを示すために、１個のインデックス値が予約される（たとえば、「無効」）。したがって、これは、７個のインデックスビットが実際に、予約済みの値に加えて１２７個の処理ユニット１０２ａを表すことが可能であることを意味する。たとえば、２進値０００００００〜１１１１１１０はインデックスの場所０〜１２６（１０進数）に対応し得、２進値１１１１１１１（たとえば、解釈に応じて−１または１２７の１０進数）は、対応するキャッシュラインをログしたプロセッサがないことを示すための「無効」に対応し得るが、この表記は実装によって異なる場合がある。したがって、ユニットビットは、キャッシュラインがログされているかどうかを示すために（たとえば、−１以外の値）、キャッシュラインをログした特定の処理ユニット（たとえば、それを最後に消費した処理ユニット）に対するインデックスとして、プロセッサ１０２によって使用され得る。複数のアカウンティングビット４０１を使用するこの第２の手法には、第１の手法よりも粒度が低い（すなわち、一度に識別される処理ユニットは１つのみである）という欠点があるが、キャッシュ１０２ｂのオーバヘッドをほとんど伴わずに多数の処理ユニットをサポートするという利点がある。
【００６４】
[0070]上記を考慮して、動作３０２において、（Ｎ＋ｉ）レベルキャッシュをチェックして、メモリ位置のデータが以前に第２の処理ユニットのためにログされているかどうかを判定することは、メモリ位置に対応する（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインに、１つまたは複数のアカウンティングビットが設定されているかどうかを判定することを含み得る。
【００６５】
[0071]キャッシュラインがログされているかどうかを判定するために使用し得る別のメカニズムは、セットアソシアティブ方式のキャッシュおよびウェイロックを利用することである。プロセッサのキャッシュ１０２ｂは一般にシステムメモリ１０３よりもはるかに小さいので（しばしば桁違いで）、したがって通常システムメモリ１０３には、キャッシュ１０２ｂの任意の所与の層内のラインよりもはるかに多くのメモリ位置がある。したがって、いくつかのプロセッサは、システムメモリの複数のメモリ位置を１つまたは複数のキャッシュ層のラインにマッピングするためのメカニズムを定義する。プロセッサは一般に、ダイレクトマッピングおよびアソシアティブ（またはセットアソシアティブ）マッピングという２つの一般的な技法のうちの一方を使用する。ダイレクトマッピングを使用する場合、システムメモリ１０３内の異なるメモリ位置は、各メモリ位置がその層内の特定のラインにのみキャッシュされ得るように、キャッシュ層内の１つラインのみにマッピングされる。
【００６６】
[0072]一方、セットアソシアティブ方式のマッピングを使用する場合、システムメモリ１０３内の異なる位置は、キャッシュ層内の複数のラインのうちの１つにキャッシュされ得る。図５は、システムメモリとキャッシュとの間のセットアソシアティブ方式のマッピングの例５００を示す。ここで、キャッシュ層５０２のキャッシュライン５０４はそれぞれ、２つのキャッシュライン５０４ａおよび５０４ｂの第１のセット（インデックス０として識別される）ならびに２つのキャッシュライン５０４ｃおよび５０４ｄの第２のセット（インデックス１として識別される）を含む、２つのキャッシュラインの異なるセットに論理的に分割される。セット内の各キャッシュラインは異なる「ウェイ」として識別され、それにより、キャッシュライン５０４ａはインデックス０、ウェイ０として識別され、キャッシュライン５０４ｂはインデックス０、ウェイ１として識別され、以下同様である。さらに図示するように、メモリ位置５０３ａ、５０３ｃ、５０３ｅ、および５０３ｇ（メモリインデックス０、２、４、および６）は、インデックス０にマッピングされる。したがって、システムメモリ内のこれらの位置の各々は、インデックス０のセット内の任意のキャッシュライン（すなわち、キャッシュライン５０４ａおよび５０４ｂ）にキャッシュされ得る。図示したマッピングの特定のパターンは、例示および概念のみを目的としており、メモリインデックスがキャッシュラインにマッピングされ得る唯一の方法として解釈されるべきではない。
【００６７】
[0073]セットアソシアティブ方式のキャッシュは、一般にＮウェイセットアソシアティブ方式のキャッシュと呼ばれ、Ｎは各セット内の「ウェイ」の数である。したがって、図５のキャッシュ５００は、２ウェイセットアソシアティブ方式のキャッシュと呼ばれることになる。プロセッサは通常、Ｎウェイキャッシュを実装し、Ｎは２の累乗（たとえば、２、４、８など）であり、一般的に４と８のＮ値が選択される（ただし、本明細書の実施形態は、任意の特定のＮ値またはＮ値のサブセットに限定されない）。特に、１ウェイセットアソシアティブ方式のキャッシュは一般に、各セットが１つのみのキャッシュラインを含むので、ダイレクトマップ方式のキャッシュと同等である。さらに、Ｎがキャッシュ内のライン数と等しい場合、キャッシュ内のすべてのラインを含む単一のセットを含むので、フルアソシアティブ方式のキャッシュと呼ばれる。フルアソシアティブ方式のキャッシュでは、任意のメモリ位置が、キャッシュ内の任意のラインにキャッシュされ得る。
【００６８】
[0074]図５は、一般的な原理を説明するために、システムメモリおよびキャッシュの簡略図を表すことに留意されたい。たとえば、図５は個々のメモリ位置をキャッシュラインにマッピングしているが、キャッシュ内の各ラインは、システムメモリ内の複数のアドレス指定可能な位置に関連するデータを格納し得ることが理解されよう。したがって、図５では、システムメモリ（５０１）内の各位置（５０３ａ〜５０３ｈ）は、実際には、複数のアドレス指定可能なメモリ位置を表し得る。さらに、マッピングは、システムメモリ５０１内の実際の物理アドレスとキャッシュ５０２内のラインとの間であり得、または仮想アドレスの中間層を使用し得る。
【００６９】
[0075]セットアソシアティブ方式のキャッシュは、ウェイロックを使用してキャッシュラインがログされているかどうかを判定するために使用され得る。ウェイロックは、何らかの目的でキャッシュ内の１つまたは複数のウェイをロックまたは予約する。具体的には、本明細書の実施形態は、ウェイロックを利用して、トレースされている処理ユニットのために１つまたは複数のウェイを予約し、それにより、ロック／予約されたウェイは、そのユニットの実行に関するキャッシュミスを格納するために排他的に使用される。したがって、図５を再び参照すると、トレースされる処理ユニットのために「ウェイ０」がロックされた場合、キャッシュライン５０４ａおよび５０４ｃ（すなわち、インデックス０、ウェイ０、およびインデックス１、ウェイ０）は、そのユニットの実行に関連するキャッシュミスのために排他的に使用され、残りのキャッシュラインは、他のすべてのキャッシュミスのために使用される。したがって、特定のキャッシュラインがログされているかどうかを判定するために、プロセッサ１０２は、「Ｎ＋１」キャッシュ層に格納されたキャッシュラインが、トレースされる処理ユニットのために予約されたウェイの一部であるかどうかを判定するだけでよい。
【００７０】
[0076]上記を考慮して、動作３０２において、（Ｎ＋ｉ）レベルキャッシュをチェックして、メモリ位置のデータが以前に第２の処理ユニットのためにログされているかどうかを判定することは、メモリ位置に対応する（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインが、ログされた処理ユニットに対応するウェイに格納されているかどうかを判定することを含み得る。
【００７１】
[0077]前に説明したように、キャッシュはＣＣＰに従って動作し、ＣＣＰは、処理ユニットがキャッシュデータに対して読取りおよび書込みを行うときに様々なキャッシュの間で一貫性をどのように維持するか、および処理ユニットがキャッシュ内の所与の場所から有効なデータを常に読み取ることをどのように保証するかを定義する。したがって、キャッシュを動作させることに関連して、プロセッサ１０２は、ＣＣＰ状態データを維持および格納する。異なるプロセッサおよび／または異なるＣＣＰがキャッシュコヒーレンス状態を追跡して、そのキャッシュコヒーレンスデータをトレーサ１０４ａで利用可能にする際の粒度は様々であり得る。たとえば、スペクトルの一端では、いくつかのプロセッサ／ＣＣＰは、キャッシュラインごとに、および処理ユニットごとにキャッシュコヒーレンスを追跡する。したがって、これらのプロセッサ／ＣＣＰは、それが各処理ユニットに関連するので、各キャッシュラインの状態を追跡し得る。これは、単一のキャッシュラインが、各処理ユニット１０２ａに関連するので、その状態に関する情報を有し得ることを意味する。他のプロセッサ／ＣＣＰは粒度が低く、キャッシュラインのレベルでのみキャッシュコヒーレンスを追跡する（および処理ユニットごとの情報を有していない）。スペクトルの他端では、一度に１つのプロセッサしかラインを排他的に（排他、変更など）所有することができないので、プロセッサ製造業者は、効率のために、キャッシュラインのレベルでのみキャッシュコヒーレンスを追跡することを選択し得る。中程度の粒度の例として、プロセッサ／ＣＣＰは、キャッシュライン、および現在のキャッシュライン状態を有する処理ユニットに対するインデックス（たとえば、４つの処理ユニットプロセッサの場合は０、１、２、３）ごとのキャッシュコヒーレンスを追跡し得る。
【００７２】
[0078]所与のプロセッサでＣＣＰ状態データが維持される粒度に関係なく、このＣＣＰ状態データは、（Ｎ＋ｉ）レベルキャッシュが有する、キャッシュされたデータに関する「知識」に含まれ得る。具体的には、（Ｎ＋ｉ）レベルキャッシュ内の所与のキャッシュラインに関連付けられたＣＣＰ状態データは、そのキャッシュラインが処理ユニットのうちの１つによってログされているかどうかを判定するために使用され得る。たとえば、ＣＣＰ状態データが、特定の処理ユニットが所与のキャッシュラインを「共有」と見なしていることを示す場合、このデータは、ひいては、処理ユニットがキャッシュラインからの読取りをログしたことを判定するために使用され得る。したがって、動作３０２において、（Ｎ＋ｉ）レベルキャッシュをチェックして、メモリ位置のデータが以前に第２の処理ユニットのためにログされているかどうかを判定することは、メモリ位置に対応する（Ｎ＋ｉ）レベルキャッシュ内のキャッシュラインが、キャッシュラインがログされていると判定するために利用可能な関連するＣＣＰ状態データを有するかどうかを判定することを含み得る。
【００７３】
[0079]動作３０３において、以前にログされたデータ（通常、現在の流入を引き起こしたものとは異なる処理ユニットによってログされたデータ）を参照して、データの流入がログされ得る。参照によるロギングは、様々な方法（それらの組合せを含む）のうちの１つまたは複数を使用して達成することができ、そのいくつかを次に説明する。
【００７４】
[0080]第１の方法は、以前にログされたメモリアドレスを参照してログする。たとえば、図２Ａの処理ユニットＡ２が、特定のメモリアドレス（すなわち、システムメモリ２０２内）を表すデータ、およびそのメモリアドレスに格納された特定のデータをログしたと仮定する。その後、その特定のメモリアドレス／特定のデータが処理ユニットＡ１への流入である場合、処理ユニットＡ１は、（ｉ）特定のメモリアドレス、および（ｉｉ）処理ユニットＡ２を識別するログエントリを格納することができる。ここで、処理ユニットＡ１は、（かなりのサイズになる可能性がある）メモリアドレスに格納された実際のデータを再びログすることを回避した。この第１の方法のいくつかの変形例は、処理ユニットＡ１およびＡ２のデータストリーム全体にわたってインクリメントするシリーズからのＭＩＮなどの順序付けデータも格納することができる。このＭＩＮは、後に、処理ユニットＡ２における１つまたは複数のイベント（たとえば、同じシリーズからのＭＩＮに関連するイベント）と突き合わせて、処理ユニットＡ１によってこの流入を順序付けるために使用され得る。したがって、動作３０３において、以前に第２の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第１の処理ユニットのためにログさせることは、メモリ位置のアドレスをログすること、またはメモリ位置のアドレスおよびＭＩＮなどの順序付けデータをログすることのうちの１つまたは複数を含み得る。
【００７５】
[0081]第２の方法は、データを格納するキャッシュラインの前の所有者を参照してログする。たとえば、図２Ａの処理ユニットＡ２がデータの第１の流入をログしたと仮定する。また、第１の流入により、データが（Ｎ＋ｉ）レベルキャッシュ（たとえば、キャッシュＬ２−Ａ１）のキャッシュラインにキャッシュされ、処理ユニットＡ２がキャッシュラインの所有者として識別されたと仮定する。その後、処理ユニットＡ１が同じデータの第２の流入を引き起こす場合、処理ユニットＡ１は、（Ｎ＋ｉ）レベルキャッシュ内のこのキャッシュラインの所有者になり得る。次いで、処理ユニットＡ１は、キャッシュラインの前の所有者（すなわち、処理ユニットＡ２）を識別するログエントリを格納することができ、それにより、後でデータを取得するためにＡ２のログエントリを使用できるようにする。これは、参照によるロギングが、キャッシュラインの前の所有者と共にキャッシュラインのアイデンティティを記録すること（たとえば、潜在的に、メモリアドレスおよびメモリ値を記録することを回避すること）を含み得ることを意味する。したがって、動作３０３において、以前に第２の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第１の処理ユニットのためにログさせることは、第２の処理ユニットをメモリ位置に対応するキャッシュラインの前の所有者としてログすることを含み得る。
【００７６】
[0082]第３の方法は、ＣＣＰデータを参照してログする。たとえば、前述のように、ＣＣＰは、様々な処理ユニットが読取りおよび書込みを行うとき、各キャッシュラインに関するキャッシュコヒーレンス状態を格納することができる。このデータの粒度はプロセッサの実装によって異なる場合があるが、たとえば、各処理ユニットに関連するので、各キャッシュラインのキャッシュコヒーレンス状態を追跡し、各キャッシュラインのキャッシュコヒーレンス状態を、現在のキャッシュラインの状態を所有する処理ユニットに対するインデックス（たとえば、０、１、２、３など）と共に追跡するなどが可能である。第３の方法は、利用可能なＣＣＰデータを利用して、どの処理ユニットが以前にキャッシュラインのキャッシュコヒーレンス状態を所有したかを追跡し、次いで、そのキャッシュコヒーレンス状態を使用して、どの処理ユニットがキャッシュラインの値をログしたかを識別することができる。これは、参照によるロギングが、キャッシュラインのＣＣＰデータを記録すること（たとえば、潜在的に、メモリアドレスおよびメモリ値を記録することを再び回避すること）を含み得ることを意味する。したがって、動作３０３において、以前に第２の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第１の処理ユニットのためにログさせることは、第２の処理ユニットを参照するＣＣＰデータをログすることを含み得る。
【００７７】
[0083]第４の方法は、キャッシュウェイを参照してログする。前述のように、セットアソシアティブ方式のキャッシュは、ウェイロックを用いてキャッシュラインがログされたかどうかを判定するために使用され得る。たとえば、処理ユニットＰ２のための１つまたは複数のウェイを予約するためにウェイロックが使用され、Ｐ２がデータの第１の流入をログすると仮定する。第１の流入は、第１の流入のデータをそのウェイに関連付けられたキャッシュラインに格納する（Ｎ＋ｉ）レベルキャッシュ（たとえば、キャッシュＬ２−Ａ１）ももたらす。別の処理ユニット（たとえばＰ１）に同じデータの第２の流入がある場合、（Ｎ＋ｉ）レベルキャッシュ内にこのキャッシュラインが存在することは、Ｐ２がすでにデータをログしていることを示す。実施形態は、キャッシュラインが格納されるウェイに注意することに基づいて、Ｐ２のログデータへの参照をログすることができ、潜在的に、メモリアドレスおよびメモリ値をログすることを再び回避することができる。この実施形態はまた、Ｐ１とＰ２との間でイベントを順序付けるために順序付け情報（たとえば、ＭＩＮ）を記録することに関連して使用され得る。したがって、動作３０３において、以前に第２の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第１の処理ユニットのためにログさせることは、キャッシュウェイへの参照をログすること、またはキャッシュウェイへの参照および順序付けデータをログすることのうちの１つまたは複数を含み得る。
【００７８】
[0084]第２の処理ユニットによる前の流入に基づいて第１の処理ユニットのへ流入をログすることに加えて、実施形態は、単一の処理ユニットによる同じデータの複数の流入があるときにログすることを低減（さらには排除）するための最適化も含む。たとえば、図２Ａを参照すると、処理ユニットＡ１は、メモリ位置における特定のデータについて、Ｎレベルキャッシュ（たとえば、Ｌ１−Ａ１キャッシュ）においてキャッシュミスを引き起こす可能性がある。それに応じて、キャッシュ階層はそのデータをＬ１−Ａ１キャッシュに、場合によっては（Ｎ＋ｉ）レベルキャッシュ（たとえば、Ｌ２−Ａ１キャッシュおよび／またはＬ３−Ａキャッシュ）にもインポートすることができる。加えて、流入は処理ユニットＡ１の値によってログされ得る。その後、このデータはＬ１−Ａ１キャッシュから追い出され得る。典型的なキャッシュ環境では、これにより、Ｌ２−Ａ１キャッシュおよび／またはＬ３−Ａキャッシュからもデータが積極的に追い出され得る。しかしながら、実施形態は、Ｌ２−Ａ１および／またはＬ３−Ａキャッシュにおいて追出しを引き起こすのではなく、代わりに、これらの（Ｎ＋ｉ）レベルキャッシュのうちの１つまたは複数において適切なキャッシュラインを保持し得る。したがって、方法３００は、メモリ位置に対応する（Ｎ＋ｉ）レベルキャッシュ内の第２のキャッシュラインを保持しながら、メモリ位置に対応する第１のＮレベルキャッシュ内の第１のキャッシュラインを追い出すことを含み得る。
【００７９】
[0085]その後、処理ユニットＡ１が同じデータに対してＬ１−Ａ１キャッシュで後続のキャッシュミスを引き起こした場合、（Ｎ＋ｉ）レベルキャッシュ（たとえば、Ｌ２−Ａ１キャッシュおよび／またはＬ３−Ａキャッシュ）に保持されているキャッシュラインが、このデータが処理ユニットＡ１のためにすでにログされているかどうかを判定するために使用され得る。したがって、いくつかの実施形態において、この後続のキャッシュミスは、処理ユニットＡ１によって前のログエントリを参照してログされる。他の実施形態において、処理ユニットＡ１がすでにそのトレースにデータを有するので、この後続のキャッシュミスについては、ログエントリは完全に省略され得る。したがって、方法３００は、第１のＮレベルキャッシュへの、メモリ位置に格納されたデータも含む後続の流入を検出したことに基づいて、後続の流入を、第２のキャッシュラインの存在に基づいて参照によってログさせることを含み得る。追加として、または代替として、方法３００は、（ｉ）第１の処理ユニットでの追加のコード実行に基づいて、第１のＮレベルキャッシュへの、メモリ位置に格納されたデータも含む後続の流入を検出すること、および（ｉｉ）第１のＮレベルキャッシュへの後続の流入を検出したことに少なくとも基づいて、かつ第２のキャッシュラインの存在に少なくとも基づいて、後続の流入をログする必要がないと判定することを含み得る。
【００８０】
[0086]したがって、本明細書の実施形態は、プロセッサキャッシュの少なくとも２つの階層または層を使用して、複数の処理ユニットにわたる実行の影響をトレースすることに基づいて、ビットアキュレートな「タイムトラベル」トレース記録を作成する。これには、（ｉ）トレースされた処理ユニットによるアクティビティに基づいて、内側または「下位層」のプロセッサキャッシュへの流入（すなわち、キャッシュミス）を検出すること、および（ｉｉ）外側または「上位層」の共有プロセッサキャッシュを使用して、所与の流入のデータが別のトレースされた処理ユニットのためにすでにログされているかどうかを判定することを支援する、プロセッサハードウェアおよび／またはマイクロコードに対する変更を含み得る。そのデータがすでにログされている場合、前のログエントリを参照して流入がログされ得る。これらの技法は、「Ｎ」レベルキャッシュに拡張され得る。この方式でトレースファイルを記録するには、プロセッサを少し変更するだけでよい場合があり、従来のトレース記録の手法と比較すると、トレース記録の性能への影響とトレースファイルサイズの両方を桁違いで低減することができる。
【００８１】
[0087]本発明は、その趣旨または主要な特徴から逸脱することなく、他の特定の形態で実施することができる。前述の実施形態は、あらゆる点で単なる例示にすぎず、限定的に解釈されるべきではない。したがって、本発明の範囲は、前述の明細書によってではなく添付の特許請求の範囲によって示される。特許請求の範囲の意味および均等性の範囲内にあるすべての変更は、その範囲内に含まれる。
【図１】
2021515312.tif 000003
【図２Ａ】
2021515312.tif 000004
【図２Ｂ】
2021515312.tif 000005
【図３】
2021515312.tif 000006
【図４Ａ】
2021515312.tif 000007
【図４Ｂ】
2021515312.tif 000008
【図５】
2021515312.tif 000009
【国際調査報告】
2021515312.tif 000010
2021515312.tif 000011