(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-02-06
(45)【発行日】2023-02-14
(54)【発明の名称】上位層キャッシュ内のエントリに基づいて下位層キャッシュへの流入をログすることによるトレース記録
(51)【国際特許分類】
G06F 11/30 20060101AFI20230207BHJP
G06F 11/34 20060101ALI20230207BHJP
G06F 12/0808 20160101ALI20230207BHJP
G06F 12/0811 20160101ALI20230207BHJP
G06F 12/0815 20160101ALI20230207BHJP
G06F 12/0897 20160101ALI20230207BHJP
【FI】
G06F11/30 140H
G06F11/34 176
G06F11/34 171
G06F12/0808
G06F12/0811
G06F12/0815
G06F12/0897
(21)【出願番号】P 2020544520
(86)(22)【出願日】2019-02-13
(86)【国際出願番号】 US2019017737
(87)【国際公開番号】W WO2019164710
(87)【国際公開日】2019-08-29
【審査請求日】2022-02-08
(32)【優先日】2018-02-23
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】314015767
【氏名又は名称】マイクロソフト テクノロジー ライセンシング,エルエルシー
(74)【代理人】
【識別番号】100118902
【氏名又は名称】山本 修
(74)【代理人】
【識別番号】100106208
【氏名又は名称】宮前 徹
(74)【代理人】
【識別番号】100120112
【氏名又は名称】中西 基晴
(74)【代理人】
【識別番号】100153028
【氏名又は名称】上田 忠
(72)【発明者】
【氏名】モーラ,ジョルディ
【審査官】加藤 優一
(56)【参考文献】
【文献】特開2002-207613(JP,A)
【文献】特開2008-293472(JP,A)
【文献】米国特許出願公開第2017/0052876(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 11/07
G06F 11/28 -11/36
G06F 12/08 -12/128
(57)【特許請求の範囲】
【請求項1】
コンピューティングデバイスであって、
複数の処理ユニットと、
複数のNレベルキャッシュと、
前記複数のNレベルキャッシュのうちの2つ以上に関連付けられ、前記複数のNレベルキャッシュのバッキングストアとして構成された(N+i)レベルキャッシュと、
制御論理であって、少なくとも、
複数のNレベルキャッシュのうちの第1のNレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出することと、
前記第1のNレベルキャッシュへの前記流入を検出したことに基づいて、前記(N+i)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に第2の処理ユニットのためにログされているかどうかを判定し、
前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているときに、以前に前記第2の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを第1の処理ユニットのためにログさせることと、
前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされていないときに、前記メモリ位置の前記データを前記第1の処理ユニットのために値によってログさせることと
のうちの一方を実行することと
を実行するように前記コンピューティングデバイスを構成する制御論理と
を備えたコンピューティングデバイス。
【請求項2】
請求項1に記載のコンピューティングデバイスであって、前記(N+i)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているかどうかを判定することは、
前記メモリ位置に対応する前記(N+i)レベルキャッシュ内のキャッシュラインに、1つまたは複数のアカウンティングビットが設定されているかどうかを判定することと、
前記メモリ位置に対応する前記(N+i)レベルキャッシュ内のキャッシュラインが、ログされた処理ユニットに対応するウェイに格納されているかどうかを判定することと、
前記メモリ位置に対応する前記(N+i)レベルキャッシュ内のキャッシュラインが、前記キャッシュラインがログされていると判定するために利用可能な関連するキャッシュコヒーレンスプロトコル(CCP)状態データを有するかどうかを判定することと
のうちの1つまたは複数を含む、コンピューティングデバイス。
【請求項3】
請求項1に記載のコンピューティングデバイスであって、前記(N+i)レベルキャッシュが(N+1)レベルキャッシュを含むように、iは1である、コンピューティングデバイス。
【請求項4】
請求項1に記載のコンピューティングデバイスであって、前記(N+i)レベルキャッシュが(N+2)レベルキャッシュを含むように、iは2である、コンピューティングデバイス。
【請求項5】
請求項1に記載のコンピューティングデバイスであって、
前記(N+i)レベルキャッシュが(N+1)レベルキャッシュを含むように、iは1であり、
前記コンピューティングデバイスは、前記(N+1)レベルキャッシュのバッキングストアとして構成される(N+2)レベルキャッシュも含み、
前記(N+i)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているかどうかを判定することは、
前記(N+1)レベルキャッシュ内のどのキャッシュラインも前記メモリ位置に対応していないと判定することと、
前記(N+2)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているかどうかを判定することと
を含む、コンピューティングデバイス。
【請求項6】
請求項1に記載のコンピューティングデバイスであって、以前に前記第2の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを前記第1の処理ユニットのためにログさせることは、
前記メモリ位置のアドレスをログすることと、
前記メモリ位置のアドレスおよび順序付けデータをログすることと、
キャッシュウェイへの参照をログすることと、
キャッシュウェイへの参照および順序付けデータをログすることと、
前記第2の処理ユニットを前記メモリ位置に対応するキャッシュラインの前の所有者としてログすることと、
前記第2の処理ユニットを参照するキャッシュコヒーレンスプロトコル(CCP)データをログすることと
のうちの1つまたは複数を含む、コンピューティングデバイス。
【請求項7】
請求項1に記載のコンピューティングデバイスであって、前記メモリ位置の前記データを前記第1の処理ユニットのためにログさせることは、プロセッサとメモリリソースとのうちの一方または両方の可用性に基づいて前記ログさせることを遅延させることを含む、コンピューティングデバイス。
【請求項8】
請求項7に記載のコンピューティングデバイスであって、前記ログさせることを遅延させることは、遅延された前記ログさせること用に前記メモリ位置の前記データを保持するためにキャッシュラインを無効にすることを含む、コンピューティングデバイス。
【請求項9】
請求項1に記載のコンピューティングデバイスであって、前記制御論理は、少なくとも、
前記メモリ位置に対応する前記(N+i)レベルキャッシュ内の第2のキャッシュラインを保持しながら、前記メモリ位置に対応する前記第1のNレベルキャッシュ内の第1のキャッシュラインを追い出すことと、
前記第1のNレベルキャッシュへの、前記メモリ位置に格納された前記データも含む後続の流入を検出したことに基づいて、前記後続の流入を、前記第2のキャッシュラインの存在に基づいて参照によってログさせることと
を実行するように前記コンピューティングデバイスをさらに構成する、コンピューティングデバイス。
【請求項10】
請求項1に記載のコンピューティングデバイスであって、前記制御論理は、少なくとも、
前記メモリ位置にも対応する前記(N+i)レベルキャッシュ内の第2のキャッシュラインを保持しながら、前記メモリ位置に対応する前記第1のNレベルキャッシュ内の第1のキャッシュラインを追い出すことと、
前記第1の処理ユニットでの追加のコード実行に基づいて、前記第1のNレベルキャッシュへの、前記メモリ位置に格納された前記データも含む後続の流入を検出することと、
前記第1のNレベルキャッシュへの前記後続の流入を検出したことに少なくとも基づいて、かつ、前記第2のキャッシュラインの存在に少なくとも基づいて、前記後続の流入をログする必要がないと判定することと
を実行するように前記コンピューティングデバイスをさらに構成する、コンピューティングデバイス。
【請求項11】
1つまたは複数の上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録のための方法であって、前記方法は、(i)複数の処理ユニットと、(ii)複数のNレベルキャッシュと、(iii)前記複数のNレベルキャッシュのうちの2つ以上に関連付けられ、前記複数のNレベルキャッシュのバッキングストアとして構成される(N+i)レベルキャッシュとを含むコンピューティングデバイスで実装され、前記方法は、
複数のNレベルキャッシュのうちの第1のNレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出するステップと、
前記第1のNレベルキャッシュへの前記流入を検出したことに基づいて、前記(N+i)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に第2の処理ユニットのためにログされているかどうかを判定し、
前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているときに、以前に前記第2の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを第1の処理ユニットのためにログさせることと、
前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされていないときに、前記メモリ位置の前記データを前記第1の処理ユニットのために値によってログさせることと
のうちの一方を実行するステップと
を含む、方法。
【請求項12】
請求項11に記載の方法であって、前記(N+i)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているかどうかを判定することは、
前記メモリ位置に対応する前記(N+i)レベルキャッシュ内のキャッシュラインに、1つまたは複数のアカウンティングビットが設定されているかどうかを判定することと、
前記メモリ位置に対応する前記(N+i)レベルキャッシュ内のキャッシュラインが、ログされた処理ユニットに対応するウェイに格納されているかどうかを判定することと、
前記メモリ位置に対応する前記(N+i)レベルキャッシュ内のキャッシュラインが、前記キャッシュラインがログされていると判定するために利用可能な関連するキャッシュコヒーレンスプロトコル(CCP)状態データを有するかどうかを判定することと
のうちの1つまたは複数を含む、方法。
【請求項13】
請求項11に記載の方法であって、前記(N+i)レベルキャッシュが(N+1)レベルキャッシュを含むように、iは1である、方法。
【請求項14】
請求項11に記載の方法であって、前記(N+i)レベルキャッシュが(N+2)レベルキャッシュを含むように、iは2である、方法。
【請求項15】
請求項11に記載の方法であって、
前記(N+i)レベルキャッシュが(N+1)レベルキャッシュを含むように、iは1であり、
前記コンピューティングデバイスは、前記(N+1)レベルキャッシュのバッキングストアとして構成される(N+2)レベルキャッシュも含み、
前記(N+i)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているかどうかを判定することは、
前記(N+1)レベルキャッシュ内のどのキャッシュラインも前記メモリ位置に対応していないと判定することと、
前記(N+2)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているかどうかを判定することと
を含む、方法。
【請求項16】
請求項11に記載の方法であって、以前に前記第2の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを前記第1の処理ユニットのためにログさせることは、
前記メモリ位置のアドレスをログすることと、
前記メモリ位置のアドレスおよび順序付けデータをログすることと、
キャッシュウェイへの参照をログすることと、
キャッシュウェイへの参照および順序付けデータをログすることと、
前記第2の処理ユニットを前記メモリ位置に対応するキャッシュラインの前の所有者としてログすることと、
前記第2の処理ユニットを参照するキャッシュコヒーレンスプロトコル(CCP)データをログすることと
のうちの1つまたは複数を含む、方法。
【請求項17】
請求項11に記載の方法であって、前記メモリ位置の前記データを前記第1の処理ユニットのためにログさせることは、前記ログさせることを遅延させることを含み、前記ログさせることを遅延させることは、遅延された前記ログさせること用に前記メモリ位置の前記データを保持するためにキャッシュラインを無効にすることを含む、方法。
【請求項18】
請求項11に記載の方法であって、
前記メモリ位置に対応する前記(N+i)レベルキャッシュ内の第2のキャッシュラインを保持しながら、前記メモリ位置に対応する前記第1のNレベルキャッシュ内の第1のキャッシュラインを追い出すステップと、
前記第1のNレベルキャッシュへの、前記メモリ位置に格納された前記データも含む後続の流入を検出したことに基づいて、前記後続の流入を、前記第2のキャッシュラインの存在に基づいて参照によってログさせるステップと
をさらに含む方法。
【請求項19】
請求項11に記載の方法であって、
前記メモリ位置にも対応する前記(N+i)レベルキャッシュ内の第2のキャッシュラインを保持しながら、前記メモリ位置に対応する前記第1のNレベルキャッシュ内の第1のキャッシュラインを追い出すステップと、
前記第1の処理ユニットでの追加のコード実行に基づいて、前記第1のNレベルキャッシュへの、前記メモリ位置に格納された前記データも含む後続の流入を検出するステップと、
前記第1のNレベルキャッシュへの前記後続の流入を検出したことに少なくとも基づいて、かつ、前記第2のキャッシュラインの存在に少なくとも基づいて、前記後続の流入をログする必要がないと判定するステップと
をさらに含む方法。
【請求項20】
(i)複数の処理ユニットと、(ii)複数のNレベルキャッシュと、(iii)前記複数のNレベルキャッシュのうちの2つ以上に関連付けられ、前記複数のNレベルキャッシュのバッキングストアとして構成される(N+i)レベルキャッシュとを含むコンピューティングデバイスに、少なくとも、
複数のNレベルキャッシュのうちの第1のNレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出することと、
前記第1のNレベルキャッシュへの前記流入を検出したことに基づいて、前記(N+i)レベルキャッシュをチェックして、前記メモリ位置の前記データが以前に第2の処理ユニットのためにログされているかどうかを判定し、
前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされているときに、以前に前記第2の処理ユニットのためにログされたログデータを参照して、前記メモリ位置の前記データを第1の処理ユニットのためにログさせることと、
前記メモリ位置の前記データが以前に前記第2の処理ユニットのためにログされていないときに、前記メモリ位置の前記データを前記第1の処理ユニットのために値によってログさせることと
のうちの一方を実行することと
を実行させるコンピュータプログラム。
【発明の詳細な説明】
【背景技術】
【0001】
[0001]ソフトウェアアプリケーションの開発中にコードを記述するとき、開発者は通常、ランタイムエラーおよび他のソースコードエラーを見つけるために、コードの「デバッグ」にかなりの時間を費やす。その際、開発者は、様々な入力に基づいてプログラムの挙動を観察する、(たとえば、変数値を出力するため、実行の分岐を追跡するためなどの)デバッグコードを挿入する、コード部分を一時的に削除するなど、ソースコードのバグを再現および位置特定するためにいくつかの手法をとることがある。ランタイムエラーを追跡してコードのバグを特定することは、アプリケーションの開発時間のかなりの部分を占める可能性がある。
【0002】
[0002]開発者によるコードのデバッグプロセスを支援するために、多くのタイプのデバッグアプリケーション(「デバッガ」)が開発されている。これらのツールは、コンピュータコードの実行をトレース、視覚化、および変更する能力を開発者に提供する。たとえば、デバッガは、とりわけ、コード命令の実行を視覚化することができ、コード実行中の様々な時点でコード変数値を提示することができ、開発者がコード実行パスを変更することを可能にすることができ、および/または開発者が対象となるコード要素に、(実行中に到達すると、コードの実行を中断させる)「ブレークポイント」および/もしくは「ウォッチポイント」を設定することを可能にすることができる。
【0003】
[0003]新たな形式のデバッグアプリケーションは、「タイムトラベル」、「リバース」、または「履歴」デバッグを可能にする。「タイムトラベル」デバッグでは、プログラム(スレッドなどの実行可能エンティティ)の実行が、トレースアプリケーションによって1つまたは複数のトレースファイルに記録/トレースされる。その後、これらのトレースファイルは、前方解析と後方解析の両方のため、プログラムを後に再実行するために使用され得る。たとえば、「タイムトラベル」デバッガにより、開発者は、前方ブレークポイント/ウォッチポイント(従来のデバッガと同様)、および後方ブレークポイント/ウォッチポイントを設定することができる。
【0004】
[0004]トレースファイルを記録するとき、いくつかの事項が考慮され得る。最も顕著なものとして、記録されたトレースデータの頑健性とプログラムをトレースすることによって発生するオーバヘッドとの間の固有のトレードオフがある。これらのトレードオフは、主にトレースファイルサイズ、およびトレースされるプログラムの実行に対する性能への影響として現れる。さらに、トレースは、ハードウェア支援を受けて(または、完全にソフトウェアにおいて)実行され得るので、ハードウェア設計および他のハードウェアコストの考慮事項もある場合がある。
【発明の概要】
【0005】
[0005]本明細書に記載の実施形態は、プロセッサによるハードウェア支援を使用したビットアキュレートな「タイムトラベル」トレース記録を作成するためのメカニズムを対象とする。これらのメカニズムは、プロセッサキャッシュの少なくとも2つの階層または層を使用して複数の処理ユニットにわたる実行の影響をトレースすることに基づく。具体的には、これらのメカニズムは、プロセッサのハードウェアおよび/またはマイクロコードを変更することができ、それにより、(i)トレースされた処理ユニットによるアクティビティに基づいて、内側または「下位層」のプロセッサキャッシュへの流入(すなわち、キャッシュミス)を検出すること、および(ii)外側または「上位層」の共有プロセッサキャッシュを使用して、その流入のデータが別のトレースされた処理ユニットのためにすでにログされているかどうかを判定することを支援する。そのデータがすでにログされている場合、前のログエントリを参照して流入がログされ得る。これらの技法は、「N」レベルキャッシュに拡張され得る。このような方式でトレースファイルを記録するには、プロセッサを少し変更するだけでよい場合があり、従来のトレース記録の手法と比較すると、トレース記録の性能への影響とトレースファイルサイズの両方を桁違いで低減することができる。
【0006】
[0006]実施形態は、複数の処理ユニットと、複数のNレベルキャッシュと、(N+i)レベルキャッシュとを含むコンピューティングデバイスを対象とする。(N+i)レベルキャッシュは、複数のNレベルキャッシュのうちの2つ以上に関連付けられ、複数のNレベルキャッシュのためのバッキングストアとして構成される。これらの実施形態において、コンピューティングデバイスは、複数のNレベルキャッシュのうちの第1のNレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出するようにコンピューティングデバイスを構成する制御論理を含む。制御論理は、(N+i)レベルキャッシュをチェックして、メモリ位置のデータが以前に第2の処理ユニットのためにログされているかどうかを判定するようにコンピューティングデバイスをさらに構成する。制御論理は、このチェックに基づいて、(i)以前に第2の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第1の処理ユニットのためにログさせること(すなわち、メモリ位置のデータが以前に第2の処理ユニットのためにログされているとき)、または(ii)メモリ位置のデータを第1の処理ユニットのために値によってログさせること(すなわち、メモリ位置のデータが以前に第2の処理ユニットのためにログされていないとき)のうちの一方を実行するようにコンピューティングデバイスをさらに構成する。
【0007】
[0007]実施形態は、1つまたは複数の上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録のための方法も対象とする。これらの方法は、(i)複数の処理ユニットと、(ii)複数のNレベルキャッシュと、(iii)複数のNレベルキャッシュのうちの2つ以上に関連付けられ、複数のNレベルキャッシュのバッキングストアとして構成される(N+i)レベルキャッシュとを含むコンピューティングデバイスで実装される(implemented;実施される)。方法は、複数のNレベルキャッシュのうちの第1のNレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出するステップを含む。方法は、第1のNレベルキャッシュへの流入を検出したことに基づいて、(N+i)レベルキャッシュをチェックして、メモリ位置のデータが以前に第2の処理ユニットのためにログされているかどうかを判定するステップも含む。方法は、このチェックに基づいて、(i)メモリ位置のデータが以前に第2の処理ユニットのためにログされているとき、以前に第2の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第1の処理ユニットのためにログさせるステップ、または(ii)メモリ位置のデータが以前に第2の処理ユニットのためにログされていないとき、メモリ位置のデータを第1の処理ユニットのために値によってログさせるステップのうちの一方を実行するステップも含む。
【0008】
[0008]実施形態は、ハードウェア記憶デバイスに記憶され、前述の方法を実行するために実行可能なコンピュータ実行可能命令(たとえば、プロセッサマイクロコード)として具現化されてもよい。
【0009】
[0009]この概要は、以下の発明を実施するための形態でさらに説明される概念の選択を簡略化した形式で紹介するために提供される。この概要は、特許請求された主題の主要な特徴または本質的な特徴を特定することを意図しておらず、特許請求された主題の範囲を決定する際の補助として使用されることも意図していない。
【0010】
[0010]本発明の上記および他の利点および特徴を得ることができる方式を説明するために、上で簡単に説明した本発明について、添付図面に示されるその特定の実施形態を参照して、より具体的に説明する。これらの図面が本発明の典型的な実施形態のみを示し、したがってその範囲を限定するものと見なされるべきではないという理解の下、添付図面を使用して本発明をさらに具体的かつ詳細に記載および説明する。
【図面の簡単な説明】
【0011】
【
図1】[0011]
図1は、内側または「下位層」のプロセッサキャッシュへの流入を検出すること、および外側または「上位層」の共有プロセッサキャッシュを使用して、以前にログされた値を参照して、その流入がログされ得るかどうかを判定することを含む、プロセッサキャッシュの少なくとも2つの階層または層を使用して複数の処理ユニットにわたる実行の「ビットアキュレートな」トレースを記録することを容易にする、例示的なコンピューティング環境を示す図である。
【
図2A】[0012]
図2Aは、多層キャッシュを含む例示的なコンピューティング環境を示す図である。
【
図2B】[0013]
図2Bは、キャッシュの一例を示す図である。
【
図3】[0014]
図3は、1つまたは複数の上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録のための例示的な方法のフローチャートを示す図である。
【
図4A】[0015]
図4Aは、そのキャッシュラインのそれぞれを1つまたは複数の追加のアカウンティングビットで拡張する共有キャッシュの例を示す図である。
【
図4B】[0016]
図4Bは、従来のキャッシュラインに適用されるアカウンティングビットを格納するための1つまたは複数の予約済みのキャッシュラインを含む共有キャッシュの例を示す図である。
【
図5】[0017]
図5は、システムメモリとキャッシュとの間のセットアソシアティブ方式のマッピングの例を示す図である。
【発明を実施するための形態】
【0012】
[0018]本明細書に記載の実施形態は、プロセッサによるハードウェア支援を使用したビットアキュレートな「タイムトラベル」トレース記録を作成するためのメカニズムを対象とする。これらのメカニズムは、プロセッサキャッシュの少なくとも2つの階層または層を使用して、複数の処理ユニットにわたる実行の影響をトレースすることに基づく。具体的には、これらのメカニズムは、プロセッサのハードウェアおよび/またはマイクロコードを変更することができ、それにより、(i)トレースされた処理ユニットによるアクティビティに基づいて、内側または「下位層」のプロセッサキャッシュへの流入(すなわち、キャッシュミス)を検出すること、および(ii)外側または「上位層」の共有プロセッサキャッシュを使用して、その流入のデータが別のトレースされた処理ユニットのためにすでにログされているかどうかを判定することを支援する。そのデータがすでにログされている場合、前のログエントリを参照して流入がログされ得る。これらの技法は、「N」レベルキャッシュに拡張され得る。このような方式でトレースファイルを記録するには、プロセッサを少し変更するだけでよい場合があり、従来のトレース記録の手法と比較すると、トレース記録の性能への影響とトレースファイルサイズの両方を桁違いで低減することができる。
【0013】
[0019]
図1は、内側または「下位層」のプロセッサキャッシュへの流入を検出すること、および外側または「上位層」の共有プロセッサキャッシュを使用して、以前にログされた値を参照してその流入がログされ得るかどうかを判定することを含む、プロセッサキャッシュの少なくとも2つの階層または層を使用して複数の処理ユニットにわたる実行の「ビットアキュレートな」トレースを記録することを容易にする、例示的なコンピューティング環境100を示す。図示のように、実施形態は、たとえば、1つまたは複数のプロセッサ102、システムメモリ103、1つまたは複数のデータストア104、および/または入力/出力ハードウェア105などのコンピュータハードウェアを含む専用または汎用コンピュータシステム101を含むかまたは利用してよい。
【0014】
[0020]本発明の範囲内の実施形態は、コンピュータ実行可能命令および/またはデータ構造を搬送または格納するための物理的媒体および他のコンピュータ可読媒体を含む。このようなコンピュータ可読媒体は、コンピュータシステム101によってアクセスされ得る任意の利用可能な媒体であり得る。コンピュータ実行可能命令および/またはデータ構造を格納するコンピュータ可読媒体は、コンピュータ記憶デバイスである。コンピュータ実行可能命令および/またはデータ構造を搬送するコンピュータ可読媒体は、伝送媒体である。したがって、限定ではなく例として、本発明の実施形態は、少なくとも2つの明確に異なる種類のコンピュータ可読媒体、すなわちコンピュータ記憶デバイスおよび伝送媒体を含む可能性がある。
【0015】
[0021]コンピュータ記憶デバイスは、コンピュータ実行可能命令および/またはデータ構造を格納する物理ハードウェアデバイスである。コンピュータ記憶デバイスには、RAM、ROM、EEPROM、ソリッドステートドライブ(「SSD」)、フラッシュメモリ、相変化メモリ(「PCM」)、光ディスクストレージ、磁気ディスクストレージ、もしくは他の磁気記憶デバイス、またはコンピュータ実行可能命令もしくはデータ構造の形式でプログラムコードを格納するために使用され得、かつ本発明の開示された機能を実装するためにコンピュータシステム101によってアクセスおよび実行され得る任意の他のハードウェアデバイスなどの様々なコンピュータハードウェアが含まれる。したがって、たとえば、コンピュータ記憶デバイスは、後述するように、図示のシステムメモリ103、コンピュータ実行可能命令および/もしくはデータ構造を格納することができる図示のデータストア104、またはオンプロセッサストレージなどの他のストレージを含み得る。
【0016】
[0022]伝送媒体は、コンピュータ実行可能命令またはデータ構造の形式でプログラムコードを搬送するために使用され得、かつコンピュータシステム101によってアクセスされ得るネットワークおよび/またはデータリンクを含むことができる。「ネットワーク」は、コンピュータシステムおよび/またはモジュールおよび/または他の電子デバイス間の電子データの転送を可能にする1つまたは複数のデータリンクと定義される。ネットワークまたは別の通信接続(ハードワイヤード、ワイヤレス、またはハードワイヤードもしくはワイヤレスの組合せのいずれか)を介して情報がコンピュータシステムに転送または提供されるとき、コンピュータシステムは接続を伝送媒体と見なし得る。上記の組合せもコンピュータ可読媒体の範囲内に含まれるべきである。たとえば、入力/出力ハードウェア105は、プログラムコードをコンピュータ実行可能命令またはデータ構造の形式で搬送するために使用され得るネットワークおよび/またはデータリンクを接続するハードウェア(たとえば、ネットワークインターフェースモジュール(たとえば「NIC」))を含み得る。
【0017】
[0023]さらに、コンピュータ実行可能命令またはデータ構造の形式のプログラムコードは、様々なコンピュータシステムコンポーネントに到達すると、伝送媒体からコンピュータ記憶デバイスに(またはその逆に)自動的に転送され得る。たとえば、ネットワークまたはデータリンクを介して受信されたコンピュータ実行可能命令またはデータ構造は、NIC(たとえば、入力/出力ハードウェア105)内のRAMにバッファリングされ、次いで、最終的にシステムメモリ103および/またはコンピュータシステム101におけるより揮発性の低いコンピュータ記憶デバイス(たとえば、データストア104)に転送され得る。したがって、コンピュータ記憶デバイスが、伝送媒体も(または主に)利用するコンピュータシステムコンポーネントに含まれ得ることを理解されたい。
【0018】
[0024]コンピュータ実行可能命令は、たとえば、プロセッサ102で実行されたとき、コンピュータシステム101に特定の機能または機能のグループを実行させる命令およびデータを含む。コンピュータ実行可能命令は、たとえば、バイナリ、アセンブリ言語などの中間フォーマット命令、またはさらにはソースコードであってもよい。
【0019】
[0025]当業者は、本発明が、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、メッセージプロセッサ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースまたはプログラム可能な家庭用電化製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、携帯電話、PDA、タブレット、ポケットベル、ルータ、スイッチなどを含む多くのタイプのコンピュータシステム構成を有するネットワークコンピューティング環境で実施され得ることを理解するであろう。本発明は、ネットワークを介して(ハードワイヤードデータリンク、ワイヤレスデータリンク、またはハードワイヤードデータリンクとワイヤレスデータリンクの組合せのいずれかによって)リンクされたローカルとリモートの両方のコンピュータシステムがタスクを実行する、分散システム環境で実施されてもよい。したがって、分散システム環境では、コンピュータシステムは複数の構成コンピュータシステムを含むことがある。分散システム環境では、プログラムモジュールは、ローカルとリモートの両方のメモリ記憶デバイスに配置されてよい。
【0020】
[0026]当業者は、本発明がクラウドコンピューティング環境で実施され得ることも理解するであろう。クラウドコンピューティング環境は分散されてもよいが、これは必須ではない。分散される場合、クラウドコンピューティング環境は、組織内で国際的に分散されてよく、および/または複数の組織にまたがって存在するコンポーネントを有してもよい。この説明および以下の特許請求の範囲において、「クラウドコンピューティング」は、構成可能なコンピューティングリソース(たとえば、ネットワーク、サーバ、ストレージ、アプリケーション、およびサービス)の共有プールへのオンデマンドネットワークアクセスを可能にするためのモデルと定義される。「クラウドコンピューティング」の定義は、適切に展開されたときにそのようなモデルから得ることができる他の多くの利点のいずれにも限定されない。
【0021】
[0027]クラウドコンピューティングモデルは、オンデマンドセルフサービス、広範なネットワークアクセス、リソースの共有、迅速な順応性、実測サービスなどの様々な特性で構成され得る。クラウドコンピューティングモデルは、たとえば、ソフトウェア・アズ・ア・サービス(「SaaS」)、プラットフォーム・アズ・ア・サービス(「PaaS」)、インフラストラクチャ・アズ・ア・サービス(「IaaS」)などの様々なサービスモデルの形式で提供されてもよい。クラウドコンピューティングモデルは、プライベートクラウド、コミュニティクラウド、パブリッククラウド、ハイブリッドクラウドなどの様々な展開モデルを使用して展開されてもよい。
【0022】
[0028]クラウドコンピューティング環境などのいくつかの実施形態は、それぞれが1つまたは複数の仮想マシンを実行することができる1つまたは複数のホストを含むシステムを含み得る。仮想マシンは、動作中、運用コンピューティングシステムをエミュレートし、オペレーティングシステム、およびおそらく1つまたは複数の他のアプリケーションもサポートする。いくつかの実施形態において、各ホストは、仮想マシンのビューから抽象化された物理リソースを使用して仮想マシン用の仮想リソースをエミュレートするハイパーバイザを含む。ハイパーバイザは、仮想マシン間の適切な分離も提供する。したがって、任意の所与の仮想マシンの観点から見ると、ハイパーバイザは、仮想マシンが物理リソースの外観(たとえば、仮想リソース)とのみインターフェースしている場合でも、仮想マシンが物理リソースとインターフェースしているように錯覚させる。物理リソースの例には、処理能力、メモリ、ディスク容量、ネットワーク帯域幅、メディアドライブが含まれる。
【0023】
[0029]図示のように、データストア104は、たとえば、トレーサ104a、オペレーティングシステムカーネル104b、およびアプリケーション104c(たとえば、トレーサ104aによるトレースの対象となるアプリケーション、および1つまたは複数のトレースファイル104d)などのアプリケーションプログラムを表すコンピュータ実行可能命令および/またはデータ構造を格納することができる。これらのプログラムが実行しているとき(たとえば、プロセッサ102を使用して)、システムメモリ103は、ランタイムデータ構造、コンピュータ実行可能命令などの対応するランタイムデータを格納することができる。したがって、
図1は、ランタイムアプリケーションコード103aおよびアプリケーションランタイムデータ103b(たとえば、それぞれがアプリケーション104cに対応する)を含むものとして、システムメモリ103を示す。
【0024】
[0030]トレーサ104aは、アプリケーション104cなどのアプリケーションの実行のビットアキュレートなトレースを記録するため、およびトレースデータをトレースファイル104dに格納するために利用可能である。いくつかの実施形態では、トレーサ104aはスタンドアロンアプリケーションであるが、他の実施形態では、トレーサ104aは、オペレーティングシステムカーネル104b、ハイパーバイザ、クラウドファブリックなどの別のソフトウェアコンポーネントに統合される。トレースファイル104dは、データストア104に格納されているように示されているが、トレースファイル104dは、排他的または一時的にシステムメモリ103または他の何らかの記憶デバイスに記録されてもよい。後で明らかにするように、トレーサ104aは、プロセッサのキャッシュコヒーレンスプロトコル(CCP)を利用したトレースを可能にするプロセッサ102の特定の機能と相互運用してよい。
【0025】
[0031]
図1は、プロセッサ102の内部ハードウェアコンポーネントの簡略化された表現を含む。図示のように、各プロセッサ102は、複数の処理ユニット102aを含む。各処理ユニットは、物理的(すなわち、物理プロセッサコア)および/または論理的(すなわち、2つ以上のアプリケーションスレッドが物理コアで実行される、ハイパースレッディングをサポートする物理コアによって提供される論理コア)であり得る。したがって、たとえば、プロセッサ102は、いくつかの実施形態において単一の物理処理ユニット(コア)のみを含み得るが、その単一の物理処理ユニットによって提供される2つ以上の論理処理ユニット102aを含むことがある。
【0026】
[0032]各処理ユニット102aは、アプリケーション(たとえば、トレーサ104a、オペレーティングカーネル104b、アプリケーション104cなど)によって定義されたプロセッサ命令を実行し、その命令は、事前定義されたプロセッサ命令セットアーキテクチャ(ISA)の中から選択される。各プロセッサ102の特定のISAは、プロセッサ製造業者およびプロセッサモデルによって異なる。一般的なISAには、INTEL,INC.のIA-64およびIA-32アーキテクチャ、ADVANCED MICRO DEVICES,INC.のAMD64アーキテクチャ、およびARM HOLDINGS,PLCの様々なAdvanced RISC Machine(「ARM」)アーキテクチャが含まれるが、他の多数のISAが存在し、本発明によって使用され得る。一般に、「命令」は、プロセッサによって実行可能な、外部から見える(すなわち、プロセッサの外部にある)コードの最小単位である。
【0027】
[0033]各処理ユニット102aは、1つまたは複数のプロセッサキャッシュ102bからプロセッサ命令を取得し、キャッシュ102b内のデータに基づいて、レジスタ102d内のデータに基づいて、および/または入力データなしでプロセッサ命令を実行する。一般に、各キャッシュ102bは、システムメモリ103および/またはキャッシュ102b内の別のキャッシュなどのバッキングストアの一部のオンプロセッサコピーを格納する小容量の(すなわち、システムメモリ103の典型的な容量と比較して小容量の)ランダムアクセスメモリである。たとえば、アプリケーションコード103aを実行するとき、キャッシュ102bのうちの1つまたは複数は、アプリケーションランタイムデータ103bの一部を含む。処理ユニット102aが特定のキャッシュ102bにまだ格納されていないデータを要求する場合、「キャッシュミス」が発生し、そのデータがシステムメモリ103または別のキャッシュからフェッチされ、場合によっては、そのキャッシュ102bから他のいくつかのデータを「追い出す」。
【0028】
[0034]多くの場合、プロセッサキャッシュ102bは、層1(L1)、層2(L2)、層3(L3)などの個別の階層、層、またはレベルに分割される。プロセッサの実装に応じて、階層は、プロセッサ102自体の一部(たとえば、L1およびL2)であり得、および/またはプロセッサ102(たとえば、L3)から分離され得る。したがって、
図1のキャッシュ102bは、これらの層(L1)のうちの1つを含んでよく、または複数のこれらの層(たとえば、L1およびL2、さらにはL3)を含み得る。
図2Aは、多層キャッシュを説明する例示的な環境200を示す。
図2Aでは、2つのプロセッサ201aおよび201b(たとえば、それぞれが
図1の異なるプロセッサ102に対応する)、およびシステムメモリ202(たとえば、
図1のシステムメモリ103に対応する)がある。例示的な環境200において、各プロセッサ201は、4つの物理処理ユニット(すなわち、プロセッサ201a用のユニットA1~A4およびプロセッサ210b用のユニットB1~B4)を含む。
【0029】
[0035]例示的な環境200は、各処理ユニット201内に3層キャッシュも含む。環境200は単にレイアウトの一例であり、本明細書の実施形態が動作し得るキャッシュ階層に限定するものではない。環境200において、最も低いまたは最も内側の層では、各処理ユニットは、それ自体の専用L1キャッシュ(たとえば、ユニットA1用のプロセッサ201a内のL1キャッシュ「L1-A1」、ユニットA2用のプロセッサ201a内のL1キャッシュ「L1-A2」など)に関連付けられる。層を上に移動すると、各処理ユニット201は、2つのL2キャッシュ(たとえば、L1キャッシュL1-A1およびL1-A2のバッキングストアとして機能する、プロセッサ201a内のL2キャッシュ「L2-A1」、L1キャッシュL1-A3およびL1-A4のバッキングストアとして機能する、プロセッサ201a内のL2キャッシュ「L1-A2」など)を含む。最後に、最も高いまたは最も外側の層では、各処理ユニット201は、単一のL3キャッシュ(たとえば、L2キャッシュL2-A1およびL2-A2のバッキングストアとして機能する、プロセッサ201a内のL3キャッシュ「L3-A」、ならびにL2キャッシュL2-B1およびL2-B2のバッキングストアとして機能する、プロセッサ201b内のL3キャッシュ「L3-B」)を含む。図示のように、システムメモリ202は、L3キャッシュL3-AおよびL3-Bのバッキングストアとして機能する。
【0030】
[0036]
図2Aに示すように、複数のキャッシュ層が使用されるとき、処理ユニット102aは、通常、最下層(L1)と直接相互作用する。ほとんどの場合、データは層間で流れる(たとえば、読取りでは、L3キャッシュはシステムメモリ103と相互作用してデータをL2キャッシュに提供し、次にL2キャッシュはデータをL1キャッシュに提供する)。処理ユニット102aが書込みを実行すると、キャッシュは、処理ユニット102a間で共有されたデータに影響を与えたそれらのキャッシュがこれ以上データを保持しないように連携する。この連携は、CCPを使用して実行される。
【0031】
[0037]したがって、環境200内のキャッシュは、「共有」キャッシュと見なされ得る。たとえば、各L2およびL3キャッシュは、所与のプロセッサ201内の複数の処理ユニットにとって役に立ち、したがって処理ユニットによって共有される。個々のL1キャッシュが、一貫性を保証するように(すなわち、キャッシュされた各メモリ位置がすべてのL1キャッシュにわたって一貫して見られるように)相互に(すなわち、CCPを介して)連携し得るので、所与のプロセッサ201内のL1キャッシュは、それぞれが単一の処理ユニットに対応していても、集合的に共有されていると見なすこともできる。各プロセッサ201内のL2キャッシュは、同様に、CCPを介して連携することができる。さらに、プロセッサ201がハイパースレッディングをサポートする場合、個々の各L1キャッシュは、2つ以上の論理処理ユニットによって共有されていると見なすことができ、したがって、個々のレベルでさえも「共有」される。
【0032】
[0038]通常、各キャッシュは複数の「キャッシュライン」を含む。各キャッシュラインは、そのバッキングストア(たとえば、システムメモリ202または上位層キャッシュ)からのメモリのチャンクを格納する。たとえば、
図2Bは、複数のキャッシュライン206を含むキャッシュ203の少なくとも一部の例を示し、それぞれが、少なくともアドレス部204および値部205を含む。各キャッシュライン206のアドレス部204は、キャッシュラインが対応するシステムメモリ202内にアドレスを格納するように構成され、値部205は、システムメモリ202から受信した値を最初に格納する。値部205は、処理ユニットによって変更され得、最終的にバッキングストアへ追い出され得る。省略符号によって示されるように、キャッシュ203は、多数のキャッシュラインを含み得る。たとえば、現代の64ビットのINTELプロセッサは、512個以上のキャッシュラインを含む個別のL1キャッシュを含み得る。このようなキャッシュでは、各キャッシュラインは通常、6バイト(48ビット)から8バイト(64ビット)のメモリアドレスを参照して64バイト(512ビット)の値を格納するために利用可能である。
図2Aに視覚的に示されているように、キャッシュサイズは通常、層ごとに増加する(すなわち、L2キャッシュは通常L1キャッシュよりも大きく、L3キャッシュは通常L2キャッシュよりも大きいなど)。
【0033】
[0039]各キャッシュライン206のアドレス部204に格納されるアドレスは、システムメモリ202内の実際のメモリアドレスなどの物理アドレスであり得る。代替として、アドレス部204に格納されるアドレスは、仮想アドレスであり得、これは、(たとえば、オペレーションシステム管理のページテーブルを使用して)抽象化を提供するために物理アドレスにマッピングされるアドレスである。このような抽象化は、たとえば、オペレーティングシステムカーネル104bに関連付けられるユーザモードプロセスとカーネルモードプロセスとの間の分離を含む、プロセッサ102で実行される異なるプロセス間のメモリ分離を容易にするために使用され得る。仮想アドレスが使用されるとき、プロセッサ102は、最近使用されたメモリアドレスの物理アドレスと仮想アドレスとの間のマッピングを維持する変換索引バッファ(TLB)102f(通常はメモリ管理ユニット(MMU)の一部)を含み得る。
【0034】
[0040]キャッシュ102bは、コードキャッシュ部およびデータキャッシュ部を含み得る。アプリケーションコード103aを実行するとき、キャッシュ102bのコード部は、アプリケーションコード103aに格納されたプロセッサ命令の少なくとも一部を格納し得、キャッシュ102bのデータ部は、アプリケーションランタイムデータ103bのデータ構造の少なくとも一部を格納し得る。加えて、キャッシュは、包括的、排他的であるか、または包括的挙動と排他的挙動の両方を含み得る。たとえば、包括的キャッシュでは、L3層は、データのスーパーセットをL3層の下方にあるL2層に格納することになり、L2層は、L2層の下方にあるL1層のスーパーセットを格納する。排他的キャッシュでは、層は、分離されることがあり、たとえば、L1キャッシュが必要とするデータがL3キャッシュに存在する場合、それらはデータ、アドレスなどの情報を交換する。
【0035】
[0041]
図1に戻ると、各プロセッサ102は、プロセッサ102の動作を制御する制御論理(すなわち、実行可能命令)を含み、かつ一般にプロセッサのハードウェアと、プロセッサ102によって実行アプリケーションに対して公開されるプロセッサISAとの間のインタープリタとして機能する、マイクロコード102cも含む。マイクロコード102は、典型的には、ROM、EEPROMなどのオンプロセッサストレージ上で具現化される。
【0036】
[0042]レジスタ102dは、プロセッサ102のISAに基づいて定義され、かつプロセッサ命令によって読取りおよび/または書取りが行われる、ハードウェアベースの記憶場所である。たとえば、レジスタ102dは、一般に、命令によって使用するためにキャッシュからフェッチされた値を格納するため、命令の実行結果を格納するため、および/または命令実行による副作用(たとえば、値が変化するサイン、値がゼロに達するサイン、キャリーの発生など)のうちのいくつか、プロセッササイクル数などの、ステータスまたは状態を格納するために使用される。したがって、いくつかのレジスタ102dは、プロセッサ命令を実行することによって引き起こされるいくつかの状態変化を知らせるために使用される「フラグ」を備え得る。いくつかの実施形態において、プロセッサ102は、プロセッサ動作の異なる態様を制御するために使用される制御レジスタも含み得る。
図1は、レジスタ102dを単一のボックスとして示しているが、各処理ユニット102aは、通常、その処理ユニットに固有のレジスタ102dの1つまたは複数の対応するセットを含むことが理解されよう。
【0037】
[0043]いくつかの実施形態において、プロセッサ102は、1つまたは複数のバッファ102eを含み得る。本明細書で後に説明するように、バッファ102eは、トレースデータの一時的な記憶場所として使用され得る。したがって、たとえば、プロセッサ102は、トレースデータの一部をバッファ102eに格納し、利用可能なメモリバス帯域幅および/または空きプロセッササイクルがあるときなどの適切なときに、そのデータをトレースファイル104dにフラッシュし得る。
【0038】
[0044]上記で言及したように、プロセッサは1つまたは複数のCCPに従ってキャッシュ102b上で動作する。一般に、CCPは、様々な処理ユニット102aが様々なキャッシュ102b内のデータに対して読取りおよび書込みを行うときに様々なキャッシュ102bの間でデータ間の一貫性をどのように維持するか、および様々な処理ユニット102aがキャッシュ102b内の所与の場所から有効なデータを常に読み取ることをどのように保証するかを定義する。CCPは、プロセッサ102のISAによって定義されたメモリモデルに関連し、それを有効にする。
【0039】
[0045]一般的なCCPの例には、MSIプロトコル(すなわち、変更、共有、無効)、MESIプロトコル(すなわち、変更、排他、共有、および無効)、ならびにMOESIプロトコル(すなわち、変更、所有、排他、共有、および無効)が含まれる。これらのプロトコルの各々は、キャッシュ102b内の個々の位置(たとえばライン)の状態を定義する。「変更」のキャッシュ位置には、キャッシュ102b内で変更されたことによりバッキングストア(たとえば、システムメモリ103または別のキャッシュ)内の対応するデータと潜在的に矛盾するデータが含まれる。「変更」状態を有する位置がキャッシュ102bから追い出されると、共通のCCPは、そのデータがバッキングストアに書き戻されること、または別のキャッシュがこの役割を引き継ぐことを保証するようキャッシュに要求する。「共有」のキャッシュ位置には、バッキングストア内のデータから変更されておらず、読取り専用状態で存在し、処理ユニット102aによって共有されるデータが含まれる。キャッシュ102bは、このデータをバッキングストアに書き込まずに追い出すことができる。「無効」のキャッシュ位置には有効なデータが含まれておらず、空であり、キャッシュミスからのデータを格納するために利用可能であると見なすことができる。「排他」のキャッシュ位置には、バッキングストアと一致し、単一の処理ユニット102aのみによって使用されるデータが含まれる。「排他」のキャッシュ位置は、いつでも(すなわち、読取り要求に応じて)「共有」状態に変更されてよく、または「排他」のキャッシュ位置への書込み時に「変更」状態に変更されてよい。「所有」のキャッシュ位置は、2つ以上の処理ユニット102aによって共有されるが、処理ユニットのうちの1つは、それを変更する排他的権利を有する。その処理は、変更を加えるときに他の処理ユニットに通知するが、これは、通知された処理ユニットがCCP実装に基づいて無効化または更新する必要がある場合があるからである。
【0040】
[0046]言及したように、実施形態は、プロセッサ102のキャッシュ102bを利用してアプリケーション104cおよび/またはオペレーティングシステムカーネル104bの実行のビットアキュレートなトレースを効率的に記録する。これらの実施形態は、(キャッシュ102bを含む)プロセッサ102が、半閉鎖または準閉鎖システムを形成するという発明者による観察に基づいて構築されている。たとえば、プロセスのデータの一部(すなわち、コードデータおよびランタイムアプリケーションデータ)がキャッシュ102bにロードされると、プロセッサ102は、入力なしで、時間のバーストのための半閉鎖または準閉鎖システムとして単独で実行することができる。具体的には、キャッシュ102bにデータがロードされると、処理ユニット102aのうちの1つまたは複数は、キャッシュ102bのデータ部に格納されているランタイムデータを使用して、かつレジスタ102dを使用して、キャッシュ102bのコード部からの命令を実行する。
【0041】
[0047]処理ユニット102aが情報のいくらかの流入を必要とするとき(たとえば、処理ユニット102aが実行している命令が、キャッシュ102bにまだ存在しないアクセスコードまたはランタイムデータを実行することになるか、またはそれを実行する場合があるので)、「キャッシュミス」が発生し、その情報は、システムメモリ103からキャッシュ102bに取り込まれる。たとえば、実行された命令がアプリケーションランタイムデータ103b内のメモリアドレスでメモリ動作を実行するときにデータキャッシュミスが発生した場合、そのメモリアドレスからのデータは、キャッシュ102bのデータ部のキャッシュラインのうちの1つに取り込まれる。同様に、命令がシステムメモリ103に格納されているメモリアドレスアプリケーションコード103aでメモリ動作を実行するときにコードキャッシュミスが発生した場合、そのメモリアドレスからのコードは、キャッシュ102bのコード部のキャッシュラインのうちの1つに取り込まれる。次いで、処理ユニット102aは、(たとえば、別のキャッシュミスまたはキャッシュされていない読取りにより)新しい情報が再びキャッシュ102bに取り込まれるまで、キャッシュ102b内の新しい情報を使用して実行を継続する。
【0042】
[0048]発明者はまた、アプリケーションの実行のビットアキュレートな表現を記録するために、処理ユニットがそのアプリケーションのスレッドを実行するときに、トレーサ104aが、キャッシュ102bへの情報の流入を再現可能にするのに十分なデータを記録できることを観察した。たとえば、これらの流入を記録する1つの手法は、処理ユニットごとを基準として、最も内側のキャッシュ層(たとえばL1)で動作する。この手法は、トレースされている処理ユニットごとに、実行中に、(たとえば、実行された命令のカウントまたは他のカウンタを使用して)各データがその処理ユニットのL1キャッシュに取り込まれた時間に沿って、その処理ユニットのL1キャッシュに関連するすべてのキャッシュミスおよびキャッシュされていない読取り(すなわち、ハードウェアコンポーネントおよびキャッシュ不可メモリからの読取り)を記録すること含み得る。処理ユニット全体にわたって順序付けされ得るイベント(共有メモリへのアクセスなど)がある場合、これらのイベントは、(たとえば、データストリーム全体にわたって単調増分数(MIN:monotonically incrementing number)を使用することによって)結果のデータストリーム全体にわたってログされ得る。
【0043】
[0049]しかしながら、L1キャッシュ層は、(たとえば、
図2Aに示すように)それぞれが異なる物理処理ユニットに関連付けられた複数の別個のL1キャッシュを含み得るので、この方式で記録すると重複データが記録される可能性があり、したがって「完全忠実な」トレースにはより多くのデータが厳密に必要である。たとえば、複数の物理処理ユニットが同じメモリ位置から読み取る場合(これは、マルチスレッドアプリケーションにおいて頻繁に発生することがある)、この手法は、複数の物理処理ユニットのそれぞれについて、同じメモリ位置およびデータに関するキャッシュミスをログすることができる。特に、本明細書で使用される場合、「完全忠実な」トレースとは、特定の「完全忠実な」トレースに含まれる同じ情報をカプセル化したデータが、実際には代替のトレース技法を使用して記録された可能性のあるものよりも少ない場合でも、トレースされたエンティティの完全な再生を可能にするのに十分な情報を含む任意のトレースである。
【0044】
[0050]トレースファイルサイズをさらに削減するために、発明者は、上位層キャッシュのうちの1つまたは複数を利用して、この重複データの少なくとも一部を記録することを回避する改良された記録技法を開発した。代わりに、これらの改良された技法は、以前にログされたデータを参照してログすることができる。具体的には、実施形態は、1つの処理ユニットによるアクティビティに基づいて内側または「下位層」のプロセッサキャッシュ(たとえば、L1)への流入(すなわち、キャッシュミス)を検出するが、次いで、可能であれば、1つまたは複数の外側または「上位層」の共有プロセッサキャッシュを使用して、すでに別のトレースされた処理ユニットためにログされた流入を参照してその流入をログする。
【0045】
[0051]これらの技法を理解するために、ほとんどの環境において、上位層キャッシュはその下方の下位層キャッシュよりも大きく、しばしば複数の下位層キャッシュのバッキングストアであることに留意されたい。たとえば、
図2Aの例示的な環境において、各L2キャッシュは2つのL1キャッシュのバッキングストアであり、各L3キャッシュは2つのL2キャッシュ(および、拡張によって4つのL1キャッシュ)のバッキングストアである。したがって、上位層キャッシュは複数の下位層キャッシュに関する知識を保持することができる(たとえば、
図2Aにおいて、L2キャッシュL1-A1は、L1キャッシュL1-A1およびL1-A2に関する知識を保持することができ、L2キャッシュL1-A2は、L1キャッシュL1-A3およびL1-A4に関する知識を保持することができ、L3キャッシュL3-Aは、L2キャッシュL2-A1およびL2-A1、ならびにL1キャッシュL1-A1、L1-A2、L1-A3、およびL1-A4に関する知識を保持することができる)。1つまたは複数の上位キャッシュ層の知識を利用することによって、本明細書の実施形態は、すでに別の処理ユニットのためにログされた流入を参照して、1つの処理ユニットによって引き起こされた流入をログする多くの機会を可能にする。
【0046】
[0052]これらの実施形態に従って、
図3は、1つまたは複数の上位レベルキャッシュの知識に基づいて前のログデータを参照して下位レベルキャッシュへの流入を記録することに基づいたトレース記録のための方法300の例を示す。次に、
図3について、
図1および
図2のコンテキストで説明する。
【0047】
[0053]具体的には、
図3は、複数の処理ユニットと、複数のNレベルキャッシュと、複数のNレベルキャッシュのうちの2つ以上に関連付けられ、複数のNレベルキャッシュのバッキングストアとして構成される(N+i)レベルキャッシュとを含む、プロセッサ102または201aなどの環境において動作する。方法300において(および、特許請求の範囲において)、Nおよびiは正の整数であり、すなわち、Nが1、2、3などであるようにN≧1であり、iが1、2、3などであるようにi≧1である。たとえば、
図2Aのプロセッサ201aを参照すると、プロセッサは、複数の処理ユニットA1、A2などを含む。プロセッサ201aは、複数のNレベルキャッシュL1-A1、L1-A2なども含む(すなわち、ここでNは1である)。プロセッサ201aは、複数のNレベルキャッシュのうちの2つ以上に関連付けられ、複数のNレベルキャッシュのバッキングストアとして構成される(N+i)レベルキャッシュも含む。たとえば、プロセッサ201aは、NレベルキャッシュL1-A1およびL1-A2のバッキングストアである(N+i)レベルキャッシュL2-A1を含む(すなわち、ここでNは1であり、iは1である)。別の例において、プロセッサ201aは、NレベルキャッシュL1-A1、L1-A2などのバッキングストアである(N+i)レベルキャッシュL3-Aを含む(すなわち、ここでNは1であり、iは2である)。プロセッサ102/201aは、マイクロコード102cおよび/または回路論理などの制御論理に基づいて方法300を動作させる。
【0048】
[0054]図示のように、方法300は、第1の処理ユニットでの実行中にNレベルキャッシュへの流入を検出する動作301を含む。いくつかの実施形態において、動作301は、複数のNレベルキャッシュのうちの第1のNレベルキャッシュへの、メモリ位置に格納されたデータを含む流入を検出することを含む。たとえば、(たとえばアプリケーション104cの第1のスレッドの正常実行または投機的実行の結果として生じる)システムメモリ202への要求されたメモリアクセスなどの処理ユニットA1によるアクティビティに基づいて、キャッシュミスがキャッシュL1-A1(すなわち、Nが1であるとき)において発生し得る。このように、キャッシュのラインL1-A1は、要求されたメモリ位置のその時点での現在の値を含むデータの流入を取得する。キャッシュ属性(たとえば、どの上位レベル層が存在するか、キャッシュアーキテクチャが包括的であるか排他的であるかなど)および現在のキャッシュ状態に応じて、流入は、システムメモリ202から、または上位レベルキャッシュ(たとえば、L2-A1および/またはL3-A)から供給され得る。
【0049】
[0055]方法300は、(N+i)レベルキャッシュをチェックして、流入のデータが第2の処理ユニットでの実行に基づいてすでにログされているかどうかを判定する動作302も含む。いくつかの実施形態において、動作302は、第1のNレベルキャッシュへの流入を検出したことに基づいて、(N+i)レベルキャッシュをチェックして、メモリ位置のデータが以前に第2の処理ユニットのためにログされているかどうかを判定することを含む。たとえば、(N+i)レベルキャッシュが(N+1)レベルキャッシュを含むように、iが1である場合、プロセッサ201は、(キャッシュL1-A2および処理ユニットA2の知識を有する)L2-A1などのL2キャッシュをチェックし得る。このチェックは、メモリ位置のデータが以前に処理ユニットA2のためにログされていたかどうかを判定するために使用され得る。このデータは、たとえば、キャッシュL1-A2でキャッシュミスを引き起こした処理ユニットA2でのアプリケーション104cの第2のスレッドの前の実行に基づいて、以前にログされた可能性がある。代替の例において、(N+i)レベルキャッシュが(N+2)レベルキャッシュを含むように、iが2である場合、プロセッサ201は、(プロセッサ201内の他のすべてのキャッシュの知識を有する)キャッシュL3-AなどのL2キャッシュをチェックし得る。このチェックは、(たとえば、キャッシュL1-A2、L1-A3、および/またはL1-A4でキャッシュミスを引き起こした処理ユニットA2~A4のうちの1つまたは複数でのアプリケーション104cの1つまたは複数の他のスレッドの前の実行に基づいて)メモリ位置のデータが以前に処理ユニットA2~A4のいずれかのためにログされていたかどうかを判定するために使用され得る。なお、この第2の例では、L2キャッシュは、チェックにおいてスキップされる場合がある。
【0050】
[0056]図示のように、動作302は、毎回iの値をインクリメントしながら、何回でも繰り返され得る。通常、iは毎回1だけインクリメントされるが、1より大きい正の整数だけiをインクリメントする実施形態もあり得る。動作302を繰り返す効果は、iをインクリメントしながら、複数の上位レベルキャッシュをチェックすることである。たとえば、i=1の場合、動作302が最初に実行されるとき、プロセッサ201は、L2キャッシュ層(たとえば、L2-A1および/またはL2-A2)をチェックすることができる。該当するメモリ位置に関する知識がL2キャッシュ内では不十分であると判明した場合、プロセッサ201は、i=2で動作302を繰り返し、それによりL3キャッシュ層(たとえば、L3-A)をチェックすることができる。コンピューティング環境が提供するのと同じ数のレベルキャッシュに対して、これが継続され得る。さらにiが1より大きい値でインクリメントされた場合、1つまたは複数のキャッシュ層が途中でスキップされ得る。排他的キャッシュを提供する、または包括的/排他的挙動のハイブリッドを示すキャッシュを提供するアーキテクチャにおいて複数のキャッシュレベルをチェックすることが有益であり得ることが理解されよう。その理由は、これらのアーキテクチャでは、外側のキャッシュ層が内側のキャッシュ層内のデータの完全なスーパーセットを含むという保証がない可能性があるからである。
【0051】
[0057]上記を考慮して、方法300は、(N+i)レベルキャッシュが(N+1)レベルキャッシュを含むようにiが1に等しく、プロセッサが(N+1)レベルキャッシュのバッキングストアとして構成された(N+2)レベルキャッシュも含む、プロセッサ102または201aなどの環境で動作することができることが理解されよう。これらの環境において、(N+1)レベルキャッシュをチェックして、メモリ位置のデータが以前に第2の処理ユニットのためにログされているかどうかを判定すること(すなわち、動作302)は、(N+1)レベルキャッシュ内のどのキャッシュラインもメモリ位置に対応していないと判定することを含み得る。さらに、(N+2)レベルキャッシュをチェックして、メモリ位置のデータが以前に第2の処理ユニットのためにログされているかどうかを判定する。
【0052】
[0058]図示のように、動作302の結果に基づいて、方法は、データがすでにログされているときに参照によって流入をログする動作303、またはデータがまだログされていないときに値によって流入をログする動作304を含む。
【0053】
[0059]いくつかの実施形態において、動作303は、メモリ位置のデータが以前に第2の処理ユニットのためにログされているとき、以前に第2の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第1の処理ユニットのためにログさせることを含む。上記の例を続けると、たとえば、(N+1)レベルキャッシュL2-A1のチェックおよび/または(N+2)レベルキャッシュL3-Aのチェックの結果、データ/メモリ位置が(キャッシュL1-A2への流入に基づいて)処理ユニットA2のためにすでにログされていると判定された場合、プロセッサ201aは、処理ユニットA2用に作成されたログエントリを参照して、キャッシュL1-A1への流入を処理ユニットA1のためにログさせることができる。参照によるロギングがどのように達成されるかの例については後述する。
【0054】
[0060]動作302の代替の結果を見てみると、いくつかの実施形態において、動作304は、メモリ位置のデータが以前に第2の処理ユニットのためにログされていないとき、メモリ位置のデータを第1の処理ユニットのために値によってログさせることを含む。たとえば、(N+1)レベルキャッシュL2-A1のチェックおよび/または(N+2)レベルキャッシュL3-Aのチェックの結果、データ/メモリ位置が別の処理ユニットのためにまだログされていないと判定された場合、プロセッサ201aは、キャッシュL1-A1への流入を、処理ユニットA1のために値によってログさせることができる。値によるロギングは、たとえば、処理ユニットA1のデータパケットにおけるメモリアドレスおよびメモリ値をログすることを含み得る。なお、値によるロギングは、実際のロギングを達成するために必要なビット数を削減するための任意の数の圧縮技法を含み得る。
【0055】
[0061]
図1に関連して説明したように、プロセッサ102は、トレースデータを一時的に格納するために使用され得るバッファ102dを含み得る。したがって、方法300において、異なるタイプのデータをログ「させること」は、プロセッサ102がこのようなデータをバッファ102dに格納することを含み得る。追加として、または代替として、異なるタイプのデータをログ「させること」は、プロセッサ102が、このようなデータをトレーサ104aに通信すること、このようなデータをトレースファイル104dに書き込むこと、および/またはデータがバッファ102dで利用可能であることをトレーサ104aに通知することを含み得る。いくつかの実施形態において、バッファ102dは、キャッシュ102bの1つまたは複数の予約済みの部分を含み得る。したがって、動作304/304において、バッファ102dを使用して、メモリ位置のデータを第1の処理ユニットのために、参照または値のいずれかによって、ログさせることは、プロセッササイクル、メモリ位置、バス帯域幅などのリソースの可用性に基づいてログさせることを遅延させることを含み得る。バッファ102dがキャッシュ102bの1つまたは複数の予約済みの部分を含む実施形態において、遅延されたログさせることは、遅延されたログさせることに用いるメモリ位置のデータを保持するために、(Nレベルキャッシュおよび/または(N+i)レベルキャッシュ内の)キャッシュラインを追い出すのではなく無効にすることを含み得る。
【0056】
[0062]方法300の説明は、下位層キャッシュに関する「知識」を有する上位層キャッシュについて言及している。上位層キャッシュが保持する下位レベルキャッシュに関する「知識」の特定の形式は様々である場合があり、次に例を示す。
【0057】
[0063]基本的な形式では、この「知識」は、下位レベルキャッシュのキャッシュライン(すなわち、同じメモリ位置およびメモリデータに対応するキャッシュライン)に対応する上位レベルキャッシュのキャッシュラインの単なる存在であり得る。上述のように、包括的キャッシュでは、上位層は、それらの下方の層にデータのスーパーセットを格納する。たとえば、
図2Aのキャッシュが包括的であると仮定する。この場合、処理ユニットA2によるアクティビティにより、システムメモリ202からの位置がキャッシュL1-A2にインポートされると、その同じメモリ位置もキャッシュL2-A1およびL3-Aにキャッシュされる。処理ユニットA2のアクティビティがトレースされている場合、実施形態は、処理ユニットA2のためにメモリ位置およびその値をログさせることができる。その後、処理ユニットA1によるアクティビティにより、システムメモリ202からのその同じ位置がキャッシュL1-A1にインポートされ、その位置が同じデータをまだ格納している場合、キャッシュL2-A1がすでにデータを有するので、キャッシュL2-A1からデータが提供される。従来の技法では、このデータがキャッシュL2-A1への流入であることに基づいて、処理ユニットA1のこのデータを再びログする場合がある。しかしながら、本明細書の実施形態は、代わりに、メモリ位置およびその値がキャッシュL2-A1にすでに存在し、したがってキャッシュL1-A2にすでに存在すると認識し得る。処理ユニットA2がログされているので、実施形態は、メモリ位置およびその値が処理ユニットA2のためにすでにログされていることを認識し、したがって、処理ユニットA1のこの新しいアクティビティを、以前に処理ユニットA2のために記録されたログデータを参照してログさせる。
【0058】
[0064]上位層キャッシュによる、より複雑な形式の「知識」も可能である。たとえば、実施形態は、プロセッサ102が、アカウンティングビットを実装するキャッシュラインごとに、(場合によっては、キャッシュラインをログした処理ユニットのアイデンティティと共に)そのキャッシュラインがログされているかどうかを識別できるようにする追加の「アカウンティング」(またはロギング)ビットを用いて、1つまたは複数のキャッシュ層内のキャッシュラインを拡張することができる。これらの概念を理解するために、
図4Aは、
図2Bの共有キャッシュ203と同様に、そのキャッシュライン404のそれぞれを1つまたは複数の追加のアカウンティングビット401を用いて拡張する例示的な共有キャッシュ400aを示す。したがって、各キャッシュライン404は、アカウンティングビット401、従来のアドレスビット402、および値ビット403を含む。
【0059】
[0065]代替として、
図4Bは、メモリアドレス402および値403を格納する従来のキャッシュライン405、ならびに従来のキャッシュライン405に適用するアカウンティングビットを格納するための1つまたは複数の予約済みのキャッシュライン406を含む共有キャッシュ400bの例を示す。予約済みのキャッシュライン406のビットは、それぞれが従来のキャッシュライン405の異なる1つに対応するアカウンティングビットの異なるグループに割り当てられる。
【0060】
[0066]
図4Bの変形例では、予約済みのキャッシュライン406は、(後でより詳細に述べる)セットアソシアティブ方式のキャッシュの各インデックスにおいて1つ(または複数)のウェイとして予約され得る。たとえば、8ウェイセットアソシアティブ方式のキャッシュでは、セット内の1個のウェイが、セット内の他の7個のウェイに適用するアカウンティングビット用に予約され得る。これにより、予約済みのキャッシュラインの実装の複雑さを軽減することができ、また所与のセット内のすべてのウェイは通常、ほとんどのプロセッサによって並行して読み取られるので、予約済みのキャッシュラインへのアクセスを高速化することができる。
【0061】
[0067]アカウンティングビットが実際どのように格納されるかに関係なく、各キャッシュラインのアカウンティングビット401は、キャッシュラインの現在の値が処理ユニットのためにログされたか(または代替として、ロギングに参加する処理ユニットによって消費されたか)どうかを示すためにプロセッサ102によって使用されるフラグ(すなわち、オンまたはオフ)として機能する1つまたは複数のビットを含み得る。したがって、動作302におけるチェックは、このフラグを使用して、ロギングに参加する処理ユニットによってキャッシュラインがログされているかどうかを判定することを含み得る。
【0062】
[0068]代替として、各キャッシュラインのアカウンティングビット401は、複数のビットを含み得る。複数のビットは、いくつかのウェイで使用され得る。本明細書では「ユニットビット」と呼ばれる1つの手法を使用する場合、各キャッシュラインのアカウンティングビット401は、プロセッサ102の処理ユニット102aの数(たとえば、プロセッサ102がハイパースレッディングをサポートする場合は論理処理ユニットの数、またはハイパースレッディングがサポートされていない場合は物理処理ユニットの数)と同等の数のユニットビットを含み得る。これらのユニットビットは、(もしあれば)1つまたは複数の特定の処理ユニットのどれがキャッシュラインをログしたかを追跡するためにプロセッサ102によって使用され得る。したがって、たとえば、2個の処理ユニット102aによって共有されるキャッシュは、2個のユニットビットを各キャッシュラインに関連付けることができる。
【0063】
[0069]本明細書では「インデックスビット」と呼ばれる、複数のアカウンティングビット401を使用した別の手法では、各キャッシュラインのアカウンティングビット401は、場合によっては「予約済み」の値(たとえば、-1)と共に、ロギングに参加するコンピュータシステム101のプロセッサ102の処理ユニット102aの各々に対するインデックスを表すのに十分な数のインデックスビットを含み得る。たとえば、プロセッサ102が128個の処理ユニット102aを含む場合、これらの処理ユニットは、キャッシュラインごとに7個のインデックスビットのみを使用して、インデックス値(たとえば、0~127)によって識別され得る。いくつかの実施形態において、キャッシュラインをログしたプロセッサがないことを示すために、1個のインデックス値が予約される(たとえば、「無効」)。したがって、これは、7個のインデックスビットが実際に、予約済みの値に加えて127個の処理ユニット102aを表すことが可能であることを意味する。たとえば、2進値0000000~1111110はインデックスの場所0~126(10進数)に対応し得、2進値1111111(たとえば、解釈に応じて-1または127の10進数)は、対応するキャッシュラインをログしたプロセッサがないことを示すための「無効」に対応し得るが、この表記は実装によって異なる場合がある。したがって、ユニットビットは、キャッシュラインがログされているかどうかを示すために(たとえば、-1以外の値)、キャッシュラインをログした特定の処理ユニット(たとえば、それを最後に消費した処理ユニット)に対するインデックスとして、プロセッサ102によって使用され得る。複数のアカウンティングビット401を使用するこの第2の手法には、第1の手法よりも粒度が低い(すなわち、一度に識別される処理ユニットは1つのみである)という欠点があるが、キャッシュ102bのオーバヘッドをほとんど伴わずに多数の処理ユニットをサポートするという利点がある。
【0064】
[0070]上記を考慮して、動作302において、(N+i)レベルキャッシュをチェックして、メモリ位置のデータが以前に第2の処理ユニットのためにログされているかどうかを判定することは、メモリ位置に対応する(N+i)レベルキャッシュ内のキャッシュラインに、1つまたは複数のアカウンティングビットが設定されているかどうかを判定することを含み得る。
【0065】
[0071]キャッシュラインがログされているかどうかを判定するために使用し得る別のメカニズムは、セットアソシアティブ方式のキャッシュおよびウェイロックを利用することである。プロセッサのキャッシュ102bは一般にシステムメモリ103よりもはるかに小さいので(しばしば桁違いで)、したがって通常システムメモリ103には、キャッシュ102bの任意の所与の層内のラインよりもはるかに多くのメモリ位置がある。したがって、いくつかのプロセッサは、システムメモリの複数のメモリ位置を1つまたは複数のキャッシュ層のラインにマッピングするためのメカニズムを定義する。プロセッサは一般に、ダイレクトマッピングおよびアソシアティブ(またはセットアソシアティブ)マッピングという2つの一般的な技法のうちの一方を使用する。ダイレクトマッピングを使用する場合、システムメモリ103内の異なるメモリ位置は、各メモリ位置がその層内の特定のラインにのみキャッシュされ得るように、キャッシュ層内の1つラインのみにマッピングされる。
【0066】
[0072]一方、セットアソシアティブ方式のマッピングを使用する場合、システムメモリ103内の異なる位置は、キャッシュ層内の複数のラインのうちの1つにキャッシュされ得る。
図5は、システムメモリとキャッシュとの間のセットアソシアティブ方式のマッピングの例500を示す。ここで、キャッシュ層502のキャッシュライン504はそれぞれ、2つのキャッシュライン504aおよび504bの第1のセット(インデックス0として識別される)ならびに2つのキャッシュライン504cおよび504dの第2のセット(インデックス1として識別される)を含む、2つのキャッシュラインの異なるセットに論理的に分割される。セット内の各キャッシュラインは異なる「ウェイ」として識別され、それにより、キャッシュライン504aはインデックス0、ウェイ0として識別され、キャッシュライン504bはインデックス0、ウェイ1として識別され、以下同様である。さらに図示するように、メモリ位置503a、503c、503e、および503g(メモリインデックス0、2、4、および6)は、インデックス0にマッピングされる。したがって、システムメモリ内のこれらの位置の各々は、インデックス0のセット内の任意のキャッシュライン(すなわち、キャッシュライン504aおよび504b)にキャッシュされ得る。図示したマッピングの特定のパターンは、例示および概念のみを目的としており、メモリインデックスがキャッシュラインにマッピングされ得る唯一の方法として解釈されるべきではない。
【0067】
[0073]セットアソシアティブ方式のキャッシュは、一般にNウェイセットアソシアティブ方式のキャッシュと呼ばれ、Nは各セット内の「ウェイ」の数である。したがって、
図5のキャッシュ500は、2ウェイセットアソシアティブ方式のキャッシュと呼ばれることになる。プロセッサは通常、Nウェイキャッシュを実装し、Nは2の累乗(たとえば、2、4、8など)であり、一般的に4と8のN値が選択される(ただし、本明細書の実施形態は、任意の特定のN値またはN値のサブセットに限定されない)。特に、1ウェイセットアソシアティブ方式のキャッシュは一般に、各セットが1つのみのキャッシュラインを含むので、ダイレクトマップ方式のキャッシュと同等である。さらに、Nがキャッシュ内のライン数と等しい場合、キャッシュ内のすべてのラインを含む単一のセットを含むので、フルアソシアティブ方式のキャッシュと呼ばれる。フルアソシアティブ方式のキャッシュでは、任意のメモリ位置が、キャッシュ内の任意のラインにキャッシュされ得る。
【0068】
[0074]
図5は、一般的な原理を説明するために、システムメモリおよびキャッシュの簡略図を表すことに留意されたい。たとえば、
図5は個々のメモリ位置をキャッシュラインにマッピングしているが、キャッシュ内の各ラインは、システムメモリ内の複数のアドレス指定可能な位置に関連するデータを格納し得ることが理解されよう。したがって、
図5では、システムメモリ(501)内の各位置(503a~503h)は、実際には、複数のアドレス指定可能なメモリ位置を表し得る。さらに、マッピングは、システムメモリ501内の実際の物理アドレスとキャッシュ502内のラインとの間であり得、または仮想アドレスの中間層を使用し得る。
【0069】
[0075]セットアソシアティブ方式のキャッシュは、ウェイロックを使用してキャッシュラインがログされているかどうかを判定するために使用され得る。ウェイロックは、何らかの目的でキャッシュ内の1つまたは複数のウェイをロックまたは予約する。具体的には、本明細書の実施形態は、ウェイロックを利用して、トレースされている処理ユニットのために1つまたは複数のウェイを予約し、それにより、ロック/予約されたウェイは、そのユニットの実行に関するキャッシュミスを格納するために排他的に使用される。したがって、
図5を再び参照すると、トレースされる処理ユニットのために「ウェイ0」がロックされた場合、キャッシュライン504aおよび504c(すなわち、インデックス0、ウェイ0、およびインデックス1、ウェイ0)は、そのユニットの実行に関連するキャッシュミスのために排他的に使用され、残りのキャッシュラインは、他のすべてのキャッシュミスのために使用される。したがって、特定のキャッシュラインがログされているかどうかを判定するために、プロセッサ102は、「N+1」キャッシュ層に格納されたキャッシュラインが、トレースされる処理ユニットのために予約されたウェイの一部であるかどうかを判定するだけでよい。
【0070】
[0076]上記を考慮して、動作302において、(N+i)レベルキャッシュをチェックして、メモリ位置のデータが以前に第2の処理ユニットのためにログされているかどうかを判定することは、メモリ位置に対応する(N+i)レベルキャッシュ内のキャッシュラインが、ログされた処理ユニットに対応するウェイに格納されているかどうかを判定することを含み得る。
【0071】
[0077]前に説明したように、キャッシュはCCPに従って動作し、CCPは、処理ユニットがキャッシュデータに対して読取りおよび書込みを行うときに様々なキャッシュの間で一貫性をどのように維持するか、および処理ユニットがキャッシュ内の所与の場所から有効なデータを常に読み取ることをどのように保証するかを定義する。したがって、キャッシュを動作させることに関連して、プロセッサ102は、CCP状態データを維持および格納する。異なるプロセッサおよび/または異なるCCPがキャッシュコヒーレンス状態を追跡して、そのキャッシュコヒーレンスデータをトレーサ104aで利用可能にする際の粒度は様々であり得る。たとえば、スペクトルの一端では、いくつかのプロセッサ/CCPは、キャッシュラインごとに、および処理ユニットごとにキャッシュコヒーレンスを追跡する。したがって、これらのプロセッサ/CCPは、それが各処理ユニットに関連するので、各キャッシュラインの状態を追跡し得る。これは、単一のキャッシュラインが、各処理ユニット102aに関連するので、その状態に関する情報を有し得ることを意味する。他のプロセッサ/CCPは粒度が低く、キャッシュラインのレベルでのみキャッシュコヒーレンスを追跡する(および処理ユニットごとの情報を有していない)。スペクトルの他端では、一度に1つのプロセッサしかラインを排他的に(排他、変更など)所有することができないので、プロセッサ製造業者は、効率のために、キャッシュラインのレベルでのみキャッシュコヒーレンスを追跡することを選択し得る。中程度の粒度の例として、プロセッサ/CCPは、キャッシュライン、および現在のキャッシュライン状態を有する処理ユニットに対するインデックス(たとえば、4つの処理ユニットプロセッサの場合は0、1、2、3)ごとのキャッシュコヒーレンスを追跡し得る。
【0072】
[0078]所与のプロセッサでCCP状態データが維持される粒度に関係なく、このCCP状態データは、(N+i)レベルキャッシュが有する、キャッシュされたデータに関する「知識」に含まれ得る。具体的には、(N+i)レベルキャッシュ内の所与のキャッシュラインに関連付けられたCCP状態データは、そのキャッシュラインが処理ユニットのうちの1つによってログされているかどうかを判定するために使用され得る。たとえば、CCP状態データが、特定の処理ユニットが所与のキャッシュラインを「共有」と見なしていることを示す場合、このデータは、ひいては、処理ユニットがキャッシュラインからの読取りをログしたことを判定するために使用され得る。したがって、動作302において、(N+i)レベルキャッシュをチェックして、メモリ位置のデータが以前に第2の処理ユニットのためにログされているかどうかを判定することは、メモリ位置に対応する(N+i)レベルキャッシュ内のキャッシュラインが、キャッシュラインがログされていると判定するために利用可能な関連するCCP状態データを有するかどうかを判定することを含み得る。
【0073】
[0079]動作303において、以前にログされたデータ(通常、現在の流入を引き起こしたものとは異なる処理ユニットによってログされたデータ)を参照して、データの流入がログされ得る。参照によるロギングは、様々な方法(それらの組合せを含む)のうちの1つまたは複数を使用して達成することができ、そのいくつかを次に説明する。
【0074】
[0080]第1の方法は、以前にログされたメモリアドレスを参照してログする。たとえば、
図2Aの処理ユニットA2が、特定のメモリアドレス(すなわち、システムメモリ202内)を表すデータ、およびそのメモリアドレスに格納された特定のデータをログしたと仮定する。その後、その特定のメモリアドレス/特定のデータが処理ユニットA1への流入である場合、処理ユニットA1は、(i)特定のメモリアドレス、および(ii)処理ユニットA2を識別するログエントリを格納することができる。ここで、処理ユニットA1は、(かなりのサイズになる可能性がある)メモリアドレスに格納された実際のデータを再びログすることを回避した。この第1の方法のいくつかの変形例は、処理ユニットA1およびA2のデータストリーム全体にわたってインクリメントするシリーズからのMINなどの順序付けデータも格納することができる。このMINは、後に、処理ユニットA2における1つまたは複数のイベント(たとえば、同じシリーズからのMINに関連するイベント)と突き合わせて、処理ユニットA1によってこの流入を順序付けるために使用され得る。したがって、動作303において、以前に第2の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第1の処理ユニットのためにログさせることは、メモリ位置のアドレスをログすること、またはメモリ位置のアドレスおよびMINなどの順序付けデータをログすることのうちの1つまたは複数を含み得る。
【0075】
[0081]第2の方法は、データを格納するキャッシュラインの前の所有者を参照してログする。たとえば、
図2Aの処理ユニットA2がデータの第1の流入をログしたと仮定する。また、第1の流入により、データが(N+i)レベルキャッシュ(たとえば、キャッシュL2-A1)のキャッシュラインにキャッシュされ、処理ユニットA2がキャッシュラインの所有者として識別されたと仮定する。その後、処理ユニットA1が同じデータの第2の流入を引き起こす場合、処理ユニットA1は、(N+i)レベルキャッシュ内のこのキャッシュラインの所有者になり得る。次いで、処理ユニットA1は、キャッシュラインの前の所有者(すなわち、処理ユニットA2)を識別するログエントリを格納することができ、それにより、後でデータを取得するためにA2のログエントリを使用できるようにする。これは、参照によるロギングが、キャッシュラインの前の所有者と共にキャッシュラインのアイデンティティを記録すること(たとえば、潜在的に、メモリアドレスおよびメモリ値を記録することを回避すること)を含み得ることを意味する。したがって、動作303において、以前に第2の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第1の処理ユニットのためにログさせることは、第2の処理ユニットをメモリ位置に対応するキャッシュラインの前の所有者としてログすることを含み得る。
【0076】
[0082]第3の方法は、CCPデータを参照してログする。たとえば、前述のように、CCPは、様々な処理ユニットが読取りおよび書込みを行うとき、各キャッシュラインに関するキャッシュコヒーレンス状態を格納することができる。このデータの粒度はプロセッサの実装によって異なる場合があるが、たとえば、各処理ユニットに関連するので、各キャッシュラインのキャッシュコヒーレンス状態を追跡し、各キャッシュラインのキャッシュコヒーレンス状態を、現在のキャッシュラインの状態を所有する処理ユニットに対するインデックス(たとえば、0、1、2、3など)と共に追跡するなどが可能である。第3の方法は、利用可能なCCPデータを利用して、どの処理ユニットが以前にキャッシュラインのキャッシュコヒーレンス状態を所有したかを追跡し、次いで、そのキャッシュコヒーレンス状態を使用して、どの処理ユニットがキャッシュラインの値をログしたかを識別することができる。これは、参照によるロギングが、キャッシュラインのCCPデータを記録すること(たとえば、潜在的に、メモリアドレスおよびメモリ値を記録することを再び回避すること)を含み得ることを意味する。したがって、動作303において、以前に第2の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第1の処理ユニットのためにログさせることは、第2の処理ユニットを参照するCCPデータをログすることを含み得る。
【0077】
[0083]第4の方法は、キャッシュウェイを参照してログする。前述のように、セットアソシアティブ方式のキャッシュは、ウェイロックを用いてキャッシュラインがログされたかどうかを判定するために使用され得る。たとえば、処理ユニットP2のための1つまたは複数のウェイを予約するためにウェイロックが使用され、P2がデータの第1の流入をログすると仮定する。第1の流入は、第1の流入のデータをそのウェイに関連付けられたキャッシュラインに格納する(N+i)レベルキャッシュ(たとえば、キャッシュL2-A1)ももたらす。別の処理ユニット(たとえばP1)に同じデータの第2の流入がある場合、(N+i)レベルキャッシュ内にこのキャッシュラインが存在することは、P2がすでにデータをログしていることを示す。実施形態は、キャッシュラインが格納されるウェイに注意することに基づいて、P2のログデータへの参照をログすることができ、潜在的に、メモリアドレスおよびメモリ値をログすることを再び回避することができる。この実施形態はまた、P1とP2との間でイベントを順序付けるために順序付け情報(たとえば、MIN)を記録することに関連して使用され得る。したがって、動作303において、以前に第2の処理ユニットのためにログされたログデータを参照して、メモリ位置のデータを第1の処理ユニットのためにログさせることは、キャッシュウェイへの参照をログすること、またはキャッシュウェイへの参照および順序付けデータをログすることのうちの1つまたは複数を含み得る。
【0078】
[0084]第2の処理ユニットによる前の流入に基づいて第1の処理ユニットのへ流入をログすることに加えて、実施形態は、単一の処理ユニットによる同じデータの複数の流入があるときにログすることを低減(さらには排除)するための最適化も含む。たとえば、
図2Aを参照すると、処理ユニットA1は、メモリ位置における特定のデータについて、Nレベルキャッシュ(たとえば、L1-A1キャッシュ)においてキャッシュミスを引き起こす可能性がある。それに応じて、キャッシュ階層はそのデータをL1-A1キャッシュに、場合によっては(N+i)レベルキャッシュ(たとえば、L2-A1キャッシュおよび/またはL3-Aキャッシュ)にもインポートすることができる。加えて、流入は処理ユニットA1の値によってログされ得る。その後、このデータはL1-A1キャッシュから追い出され得る。典型的なキャッシュ環境では、これにより、L2-A1キャッシュおよび/またはL3-Aキャッシュからもデータが積極的に追い出され得る。しかしながら、実施形態は、L2-A1および/またはL3-Aキャッシュにおいて追出しを引き起こすのではなく、代わりに、これらの(N+i)レベルキャッシュのうちの1つまたは複数において適切なキャッシュラインを保持し得る。したがって、方法300は、メモリ位置に対応する(N+i)レベルキャッシュ内の第2のキャッシュラインを保持しながら、メモリ位置に対応する第1のNレベルキャッシュ内の第1のキャッシュラインを追い出すことを含み得る。
【0079】
[0085]その後、処理ユニットA1が同じデータに対してL1-A1キャッシュで後続のキャッシュミスを引き起こした場合、(N+i)レベルキャッシュ(たとえば、L2-A1キャッシュおよび/またはL3-Aキャッシュ)に保持されているキャッシュラインが、このデータが処理ユニットA1のためにすでにログされているかどうかを判定するために使用され得る。したがって、いくつかの実施形態において、この後続のキャッシュミスは、処理ユニットA1によって前のログエントリを参照してログされる。他の実施形態において、処理ユニットA1がすでにそのトレースにデータを有するので、この後続のキャッシュミスについては、ログエントリは完全に省略され得る。したがって、方法300は、第1のNレベルキャッシュへの、メモリ位置に格納されたデータも含む後続の流入を検出したことに基づいて、後続の流入を、第2のキャッシュラインの存在に基づいて参照によってログさせることを含み得る。追加として、または代替として、方法300は、(i)第1の処理ユニットでの追加のコード実行に基づいて、第1のNレベルキャッシュへの、メモリ位置に格納されたデータも含む後続の流入を検出すること、および(ii)第1のNレベルキャッシュへの後続の流入を検出したことに少なくとも基づいて、かつ第2のキャッシュラインの存在に少なくとも基づいて、後続の流入をログする必要がないと判定することを含み得る。
【0080】
[0086]したがって、本明細書の実施形態は、プロセッサキャッシュの少なくとも2つの階層または層を使用して、複数の処理ユニットにわたる実行の影響をトレースすることに基づいて、ビットアキュレートな「タイムトラベル」トレース記録を作成する。これには、(i)トレースされた処理ユニットによるアクティビティに基づいて、内側または「下位層」のプロセッサキャッシュへの流入(すなわち、キャッシュミス)を検出すること、および(ii)外側または「上位層」の共有プロセッサキャッシュを使用して、所与の流入のデータが別のトレースされた処理ユニットのためにすでにログされているかどうかを判定することを支援する、プロセッサハードウェアおよび/またはマイクロコードに対する変更を含み得る。そのデータがすでにログされている場合、前のログエントリを参照して流入がログされ得る。これらの技法は、「N」レベルキャッシュに拡張され得る。この方式でトレースファイルを記録するには、プロセッサを少し変更するだけでよい場合があり、従来のトレース記録の手法と比較すると、トレース記録の性能への影響とトレースファイルサイズの両方を桁違いで低減することができる。
【0081】
[0087]本発明は、その趣旨または主要な特徴から逸脱することなく、他の特定の形態で実施することができる。前述の実施形態は、あらゆる点で単なる例示にすぎず、限定的に解釈されるべきではない。したがって、本発明の範囲は、前述の明細書によってではなく添付の特許請求の範囲によって示される。特許請求の範囲の意味および均等性の範囲内にあるすべての変更は、その範囲内に含まれる。