(57)【要約】  キャッシュコヒーレンスプロトコル（ＣＣＰ）データを用いたキャッシュベーストレース記録を実行すること。実施形態は、キャッシュラインと補助記憶との間の相互作用を引き起こす操作が生じたこと、その操作を引き起こした処理ユニットについてロギングが有効にされていること、キャッシュラインがロギングのパーティシパントであること、及びトレースにログすべきデータがあることをＣＣＰが示すことを検出する。次いで実施形態はそのデータをトレースにログさせ、そのデータは操作を再実行するために使用可能である。
2020534589.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]  クラウドコンピューティングモデルは、オンデマンドセルフサービス、ブロードネットワークアクセス、資源プーリング、急速な弾性、度数制等の様々な特性で構成され得る。クラウドコンピューティングモデルは、例えばSoftware as a Service（「ＳａａＳ」）、Platform as a Service（「ＰａａＳ」）、及びInfrastructure as a Service（「ＩａａＳ」）等の様々なサービスモデルの形でももたらされ得る。クラウドコンピューティングモデルは、プライベートクラウド、コミュニティクラウド、パブリッククラウド、ハイブリッドクラウド等の様々な展開モデルを使用して展開することもできる。
【００２０】
[0038]  クラウドコンピューティング環境等の一部の実施形態は、それぞれ１つ又は複数の仮想マシンを実行することができる１つ又は複数のホストを含むシステムを含み得る。動作中、仮想マシンは動作中の計算システムをエミュレートし、オペレーティングシステム及びことによると１つ又は複数の他のアプリケーションもサポートする。一部の実施形態では、各ホストは、仮想マシンの点から抽象化される物理資源を使用して仮想マシンのための仮想資源をエミュレートするハイパーバイザを含む。ハイパーバイザは、仮想マシン間の適切な分離も提供する。従って、任意の所与の仮想マシンの観点から、ハイパーバイザは仮想マシンが物理資源の外観（例えば仮想資源）としかインタフェースしていなくても物理資源とインタフェースしている錯覚をもたらす。物理資源の例は、処理容量、メモリ、ディスク空き容量、ネットワーク帯域幅、メディアドライブ等を含む。
【００２１】
[0039]  図示のように、データストア１０４は、例えばトレーサ１０４ａ、オペレーティングシステムカーネル１０４ｂ、及びアプリケーション１０４ｃ（例えばトレーサ１０４ａ及び１つ又は複数のトレースファイル１０４ｄによるトレースの対象であるアプリケーション）等のアプリケーションプログラムを表すコンピュータ実行可能命令及び／又はデータ構造を記憶することができる。これらのプログラムが（例えばプロセッサ１０２を使用して）実行されている間、システムメモリ１０３はランタイムデータ構造、コンピュータ実行可能命令等の対応するランタイムデータを記憶することができる。従って図１は、（例えばアプリケーション１０４ｃにそれぞれ対応する）ランタイムアプリケーションコード１０３ａ及びアプリケーションランタイムデータ１０３ｂを含むものとしてシステムメモリ１０３を示す。
【００２２】
[0040]  トレーサ１０４ａは、アプリケーション１０４ｃ等のアプリケーションの実行のビット精度トレースを記録し、トレースファイル１０４ｄ内にトレースデータを記憶するために使用可能である。一部の実施形態では、トレーサ１０４ａが独立型アプリケーションであるのに対し、他の実施形態ではトレーサ１０４ａが、オペレーティングシステムカーネル１０４ｂ、ハイパーバイザ、クラウドファブリック等の別のソフトウェアコンポーネントに統合される。トレースファイル１０４ｄはデータストア１０４内に記憶されているものとして図示するが、トレースファイル１０４ｄはシステムメモリ１０３内に又は他の何らかの記憶装置において排他的に又は一時的に記録されてもよい。
【００２３】
[0041]  図１は、プロセッサ１０２の内部ハードウェアコンポーネントの簡略化した表現を含む。図示のように、各プロセッサ１０２は複数の処理ユニット１０２ａを含む。各処理ユニットは、物理的（即ち物理的なプロセッサコア）及び／又は論理的（即ち物理コアにおいて複数のアプリケーションスレッドが実行されるハイパースレッディングをサポートする物理コアによって示される論理コア）であり得る。従って、例えばプロセッサ１０２が一部の実施形態で単一の物理処理ユニット（コア）のみを含み得る場合でも、その単一の物理処理ユニットによって示される２つ以上の論理処理ユニット１０２ａを含むことができる。
【００２４】
[0042]  各処理ユニット１０２ａは、アプリケーション（例えばトレーサ１０４ａ、オペレーティングカーネル１０４ｂ、アプリケーション１０４ｃ等）によって定められるプロセッサ命令を実行し、それらの命令は既定のプロセッサ命令セットアーキテクチャ（ＩＳＡ）の中から選択される。各プロセッサ１０２の特定のＩＳＡは、プロセッサの製造業者及びモデルに基づいて異なる。一般的なＩＳＡは、INTEL, INC.のIA-64アーキテクチャ及びIA-32アーキテクチャ、ADVANCED MICRO DEVICES, INC.のAMD64アーキテクチャ、及びARM HOLDINGS, PLCの様々なAdvanced RISC Machine（「ＡＲＭ」）アーキテクチャを含むが、他の多数のＩＳＡが存在し本発明によって使用され得る。概して「命令」は、プロセッサによって実行可能なコードの最小の外部可視（即ちプロセッサにとって外部の）ユニットである。
【００２５】
[0043]  各処理ユニット１０２ａは、共有キャッシュ１０２ｂからプロセッサ命令を取得し、共有キャッシュ１０２ｂ内のデータに基づいて、レジスタ１０２ｄ内のデータに基づいて、及び／又は入力データなしにプロセッサ命令を実行する。概して、共有キャッシュ１０２ｂは、システムメモリ１０３及び／又は別のキャッシュ等の補助記憶の一部のオンプロセッサコピーを記憶する少量の（即ちシステムメモリ１０３の典型的な量に対して少ない）ランダムアクセスメモリである。例えばアプリケーションコード１０３ａを実行するとき、共有キャッシュ１０２ｂはアプリケーションランタイムデータ１０３ｂの一部を含む。処理ユニット１０２ａが共有キャッシュ１０２ｂ内にまだ記憶されていないデータを必要とする場合は「キャッシュミス」が発生し、そのデータがシステムメモリ１０３からフェッチされる（ことによると共有キャッシュ１０２ｂから他の一部のデータを「追い出す」）。
【００２６】
[0044]  典型的には、共有キャッシュ１０２ｂは複数の「キャッシュライン」を含み、「キャッシュライン」のそれぞれは補助記憶からのメモリのチャンクを記憶する。例えば図２は、複数のキャッシュライン２０３を含む共有キャッシュ２００の少なくとも一部の一例を示し、複数のキャッシュライン２０３のそれぞれはアドレス部分２０１及び値部分２０２を含む。各キャッシュライン２０３のアドレス部分２０１は、ラインが対応する補助記憶（例えばシステムメモリ１０３）内のアドレスを記憶することができ、値部分２０２は補助記憶から受信される値を最初に記憶することができる。値部分２０２は処理ユニット１０２ａによって修正され、最終的に補助記憶に追い出され得る。楕円によって示すように、共有キャッシュ２００は多数のキャッシュラインを含むことができる。例えば現代のINTELプロセッサは、５１２以上のキャッシュラインを含むレイヤ１キャッシュを含み得る。このキャッシュでは、各キャッシュラインが典型的には８バイト（６４ビット）のメモリアドレスを参照して６４バイト（５１２ビット）の値を記憶するために使用可能である。
【００２７】
[0045]  各キャッシュライン２０３のアドレス部分２０１内に記憶されるアドレスは、システムメモリ１０３内の実際のメモリアドレス等の物理アドレスであり得る。或いは各キャッシュライン２０３のアドレス部分２０１内に記憶されるアドレスは、抽象化を行うために物理アドレスに割り当てられるアドレスである仮想アドレスであり得る。かかる抽象化は、例えばプロセッサ１０２において実行される異なるプロセス間のメモリ分離を助けるために使用され得る。仮想アドレスが使用される場合、プロセッサ１０２は、物理メモリアドレスと仮想メモリアドレスとの間のマッピングを保つ変換索引バッファ（ＴＬＢ）１０２ｆ（通常はメモリ管理ユニット（ＭＭＵ）の一部である）を含むことができる。
【００２８】
[0046]  共有キャッシュ１０２ｂは、コードキャッシュ部分及びデータキャッシュ部分を含むことができる。例えばアプリケーションコード１０３ａを実行するとき、共有キャッシュ１０２ｂのコード部分はアプリケーションコード１０３ａ内に記憶されるプロセッサ命令の少なくとも一部を記憶し、共有キャッシュ１０２ｂのデータ部分はアプリケーションランタイムデータ１０３ｂのデータ構造の少なくとも一部を記憶する。多くの場合、プロセッサキャッシュは別個のティア／層（例えば層１（Ｌ１）、層２（Ｌ２）、及び層３（Ｌ３））に分割され、一部のティア（例えばＬ３）はことによるとプロセッサ１０２から離れて存在する。従って、共有キャッシュ１０２ｂはこれらの層の１つ（Ｌ１）を含むことができ、又はこれらの層の複数を含むことができる。
【００２９】
[0047]  複数のキャッシュ層が使用される場合、処理ユニット１０２ａは最下位層（Ｌ１）と直接相互作用する。大抵の場合、データは層間を流れる（例えば読み出し時にＬ３キャッシュがシステムメモリ１０３と相互作用しＬ２キャッシュにデータを供給し、それを受けてＬ２キャッシュがＬ１キャッシュにデータを供給する）。処理ユニット１０２ａが書き込みを行う必要がある場合、処理ユニット１０２ａ間で共有されていたデータに影響を与えたキャッシュがそのデータをもう有さないことを確実にするためにキャッシュが連携する。この連携は（後で論じる）キャッシュコヒーレンスプロトコルを使用して行われる。
【００３０】
[0048]  キャッシュは、包含的、排他的とすることができ、又は包含的挙動及び排他的挙動の両方を含むことができる。例えば包含的キャッシュでは、Ｌ３層はその下のＬ２層内のデータの超集合を記憶し、Ｌ２層はその下のＬ１層の超集合を記憶する。排他的キャッシュでは層をばらばらにすることができ、例えばＬ１キャッシュが必要とするデータがＬ３キャッシュ内にある場合、それらのキャッシュはデータ、アドレス等の情報をスワップすることができる。
【００３１】
[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]  最初に説明を容易にするために、この例は、上記で論じたＣＣＰ（即ちＭＳＩ、ＭＥＳＩ、及びＭＯＥＳＩ）で使用されるキャッシュライン状態（即ち修正、所有、排他的、共有、及び無効）から導出される単純化したキャッシュライン状態を使用する。この単純化において、これらの状態は「読み出し」状態（即ちキャッシュラインが読み出されている）又は「書き込み」状態（即ちキャッシュラインが書き込まれている）の何れかにマップする。以下の表１はこれらのマッピングの一例を示す。これらのマッピングは一例として使用するに過ぎず、非限定的であることに留意されたい。例えば本明細書で論じる以外のＣＣＰ及び状態が存在することができ、当業者は本明細書の開示に鑑みて多くの異なるＣＣＰを用いて同様のマッピングを行えることを理解されよう。
【００６７】
【表１】
2020534589.tif 000003
【００６８】
[0085]  とりわけ実施形態は、どのデータがプロセッサ１０２から入手できるのかに応じて及び／又は実装の選択に基づいて、様々なレベルでＣＣＰデータをログすることができる。例えばＣＣＰデータは、（表１に示すような）「マップされた」ＣＣＰ状態に基づいて、プロセッサ１０２によって可視化された実際のＣＣＰ状態（例えば修正、所有、排他的、共有、及び／又は無効）に基づいて、及び／又は典型的にはプロセッサ１０２によって可視化できない低レベル「生」ＣＣＰデータに基づいてさえログすることができる。
【００６９】
[0086]  図６Ａ〜図６Ｄに移り、表６００ａは、操作間のグローバル順序を指定するために使用される識別子（ＩＤ）を示す第１の列６０１を含む。表６００ａは、処理ユニットの１つにそれぞれ対応する４つの追加の列６０２ａ〜６０２ｄも含む。簡潔にするためにこの例はグローバルＩＤを使用するが、実際には各処理ユニットは通常自らの独立した識別子の組を使用して操作を順序付けることが理解されよう。それらのＩＤは命令カウント（ＩＣ）、又は「ジャンプカウント」＋プログラムカウンタ等、操作間の順序付けを指定するための他の任意の適切なメカニズムを含み得る。この例はＭＳＩ、ＭＥＳＩ、及びＭＯＥＳＩ  ＣＣＰと整合するやり方でメモリを使用するが、簡潔にするために「修正」状態、「共有」状態、及び「無効」状態だけを使用することに留意されたい。但し一部のＣＣＰは、トレースエントリを強く順序付けるためにトレース内に（例えば全てのパケット内に又は不定期のパケット内に）記録することもできる独自の固有の及び／又は単調増分するＩＤを提供できることを指摘しておく。ＣＣＰがかかるＩＤを提供しなくても、ソケットタイマの値（例えばＴＳＣ）又は順序付け可能な別のＩＤをことによると使用することができる。
【００７０】
[0087]  表６００ａに示すように、識別子ＩＤ［０］において処理ユニットＰ０が読み出しを行い、その読み出しはデータＤＡＴＡ［１］をキャッシュライン内に運ぶキャッシュミスを引き起こす。これに対応し、表６００ｂはキャッシュラインがＰ０によって現在「共有」されていることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、ユニットビット６０３が使用される場合、処理ユニットＰ０がキャッシュラインを消費した（即ち読み出した）こと（及び処理ユニットＰ１〜Ｐ３が消費していないこと）をユニットビット６０３が示すこと、インデックスビット６０４が使用される場合、Ｐ０がキャッシュラインを消費したことをインデックスビット６０４が示すこと、及びフラグビット６０５が使用される場合、何らかの処理ユニットがキャッシュラインを消費したことをフラグビット６０５が示すことを示す。この状態を所与とし、動作３０３で、プロセッサ１０２がＰ０についてロギングが有効にされていると判定し、動作３０４で、（即ちユニットビット６０３、インデックスビット６０４、フラグビット６０５、又はウェイロックを使用し）キャッシュラインがロギングに関与すると判定する。従って動作３０６で、プロセッサ１０２はＣＣＰを利用して必要に応じてトレースファイルに適切なデータをログする。ここでは、キャッシュラインが無効（空）状態から読み出し（表６００ａ）／共有（表６００ｂ）状態に移行しているのでデータをログすべきである。表６００ｄのログデータ６０６に示すように、プロセッサ１０２は、必要に応じて（即ちデータパケットが処理ユニットごとに別個のデータストリームにログされているか、又は単一のデータストリームにログされているかに応じて）処理ユニット（Ｐ０）、キャッシュラインアドレス（＠）、命令カウント又は他の何らかのカウント、及びキャッシュラインに入れられたデータ（ＤＡＴＡ［１］）を示すことができる。上記で論じたように、命令カウントは典型的には処理ユニットに固有の値だが、簡単にするために表６００ｄは対応するグローバルＩＤ（即ちこの例ではＩＣ［０］）に関して命令カウントを参照する。
【００７１】
[0088]  一部の実施形態では、キャッシュラインアドレス（＠）及びデータ（例えばＤＡＴＡ［１］）は、トレースファイル１０４ｄ内で圧縮され得ることを指摘しておく。例えばメモリアドレスは、前に記録されたメモリアドレス内の「高」ビットを（明示的に又は暗黙的に）参照することにより、メモリアドレスの「高」ビットを記録するのを控えることによって圧縮することができる。データは、複数のビットをそれぞれ含む複数のグループにデータ値のビットをグループ化し、各グループを対応する「フラグ」ビットに関連付けることによって圧縮することができる。グループが特定のパターン（例えば全て０、全て１等）に等しい場合、フラグビットを設定することができ、そのビットのグループはトレース内に記憶する必要がない。
【００７２】
[0089]  次に表６００ａは、ＩＤ［１］において処理ユニットＰ１がキャッシュライン上の読み出しを行い、データＤＡＴＡ［１］を読み出すことを示している。表６００ｂはキャッシュラインがＰ０及びＰ１によって現在「共有」されていることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットＰ０及びＰ１がキャッシュラインを消費したこと（ユニットビット６０３）、Ｐ１がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。インデックスビット６０４がＰ１の代わりにＰ０を引き続き参照することも正しいことに留意されたい。表６００ｄは、ＣＣＰを使用し、操作の記録をログすべきだとプロセッサ１０２が判定することを示す。図示のようにプロセッサ１０２は、処理ユニット（Ｐ１）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［１］）、キャッシュラインが読み出し（共有）状態から読み出し（共有）状態に移行したこと、及びＰ０が前のキャッシュラインへの前のアクセスを有していたが、現在はＰ０及びＰ１がアクセスを有することを示すことができる。
【００７３】
[0090]  次に表６００ａは、ＩＤ［２］において処理ユニットＰ０がキャッシュラインへの書き込みを行い、データＤＡＴＡ［２］を書き込むことを示している。表６００ｂはキャッシュラインがＰ０によって現在「修正」され、Ｐ１について「無効」であることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットＰ０だけがキャッシュラインを消費した（即ちその値を更新した）こと（ユニットビット６０３）、Ｐ０がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。キャッシュラインが書き込まれている／修正されているので、表６００ｄは、ＣＣＰを使用し、操作の記録をログする必要があるとプロセッサ１０２が判定することを示す。図示のようにプロセッサ１０２は、処理ユニット（Ｐ０）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［２］）、キャッシュラインが読み出し（共有）状態から書き込み（修正）状態に移行したこと、並びにＰ０及びＰ１が前のキャッシュラインへの前のアクセスを有していたが、現在はＰ０だけがアクセスを有することを示すことができる。
【００７４】
[0091]  表６００ｂに示すＣＣＰ状態を使用し、どの処理ユニットがキャッシュラインへの前のアクセスを有していたかに関する情報を知ることができることに留意されたい。しかし、一部のＣＣＰはそれを行うのに十分な情報を保たない場合があることを指摘しておく（例えばキャッシュラインレベルでのみコヒーレンス状態を追跡するＣＣＰ）。或いはユニットビット６０３が使用される場合、この情報はユニットビットから導出することができる。従って図６Ｄに示すログデータ６０６は、この情報を保つロバストなＣＣＰ又はユニットビット６０３の使用を仮定する。
【００７５】
[0092]  これらの何れかが使用されない場合（例えばＣＣＰがさほどロバストではない場合、及びユニットビット６０３の代わりにインデックスビット６０４、フラグビット６０５、又はウェイロックが使用される場合）、ログデータ６０６はより徹底的でなく又はより大きい可能性がある。第１の例として、ＣＣＰがキャッシュラインレベルでのみコヒーレンス状態を追跡し、インデックスビット６０４が使用される場合、その２つを使用して、キャッシュライン状態が（全ての処理ユニットについて）無効であること、（修正した処理ユニットのインデックスと共に）修正されていること、（排他的にした処理ユニットのインデックスと共に）排他的であること、又は共有されている（及び全ての処理ユニットがアクセスを有することができる）ことを識別することができる。このことはより単純なハードウェア実装をもたらすことができ、キャッシュラインを共有から修正又は排他的に変更するとき、キャッシュラインを共有するためにより粒度の細かいＣＣＰによって知られるものだけでなく全ての処理ユニットに知らせる必要があるという不利点が伴う。第２の例として、インデックスビット６０４を使用してキャッシュラインにアクセスした最後の処理ユニットを識別することができる。キャッシュが包含的である場合（即ちそのためＬ２又はＬ１キャッシュレベルにおけるアクセスの背後に多くの読み出しが隠されている場合）、処理ユニットが同じキャッシュラインを読み出していても、Ｌ３キャッシュは同じ処理ユニットから相対的に少ない繰り返し要求を認める可能性がある。読み出し−＞読み出しに関する全てのインデックス変化をログし、次いで読み出し−＞書き込み、書き込み−＞書き込み、及び書き込み−＞読み出しのログを有し、ことによると僅かに大きいトレースの代償を払ってインデックスもユニットビット６０３の使用と同じデータを与える。第３の例として、各キャッシュラインは単一のフラグビットを含み得るが、ＣＣＰはキャッシュラインのコヒーレンス状態を所有する処理ユニットへのインデックスに関連してキャッシュラインごとのコヒーレンス状態を追跡することができる。ここでトレースは、ユニットビットが使用される場合又はＣＣＰが個々の処理ユニットを追跡する場合よりも多くのキャッシュラインの動きを記録し得るが、トレースは依然として完全に決定論的であり得る。各処理ユニットに関する情報を有する場合と、プロセッサインデックスに関する情報だけを有する場合とのトレースファイルサイズの大まかな比較を図９Ａ及び図９Ｂに関して以下に示す。
【００７６】
[0093]  図６Ａに戻り、表６００ａはＩＤ［３］において処理ユニットＰ１がキャッシュラインからの読み出しを行い、データＤＡＴＡ［２］を読み出すことを示している。表６００ｂはキャッシュラインがＰ０及びＰ１によって現在「共有」されていることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットＰ０及びＰ１がキャッシュラインを消費したこと（ユニットビット６０３）、Ｐ１がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。インデックスビット６０４がＰ１の代わりにＰ０を引き続き参照することも正しいことに留意されたい。キャッシュラインが書き込み（修正）状態から読み出し（共有）状態に移行しているので、表６００ｄは、ＣＣＰを使用し、操作の記録をログする必要があるとプロセッサ１０２が判定することを示す。図示のようにプロセッサ１０２は、処理ユニット（Ｐ１）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［３］）、キャッシュラインが書き込み（修正）状態から読み出し（共有）状態に移行したこと、及びＰ０が前のキャッシュラインへの前のアクセスを有していたが、現在はＰ０及びＰ１がアクセスを有することを示すことができる。
【００７７】
[0094]  次に表６００ａはＩＤ［４］において処理ユニットＰ０が再びキャッシュラインへの書き込みを行い、今回はデータＤＡＴＡ［３］を書き込むことを示している。表６００ｂはキャッシュラインが再びＰ０によって「修正」され、Ｐ１について「無効」であることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットＰ０だけがキャッシュラインを消費したこと（ユニットビット６０３）、Ｐ０がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。キャッシュラインが書き込まれている／修正されているので、表６００ｄはＣＣＰを使用し、操作の記録をログする必要があるとプロセッサ１０２が判定することを示す。図示のようにプロセッサ１０２は、処理ユニット（Ｐ０）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［４］）、キャッシュラインが読み出し（共有）状態から書き込み（修正）状態に移行したこと、並びにＰ０及びＰ１が前のキャッシュラインへの前のアクセスを有していたが、現在はＰ０だけがアクセスを有することを示すことができる。
【００７８】
[0095]  次に表６００ａは、ＩＤ［５］において処理ユニットＰ２がキャッシュラインからの読み出しを行い、データＤＡＴＡ［３］を読み出すことを示している。表６００ｂはキャッシュラインがＰ０及びＰ２によって現在「共有」されていることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットＰ０及びＰ２がキャッシュラインを消費したこと（ユニットビット６０３）、Ｐ２がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。インデックスビット６０４がＰ２の代わりにＰ０を引き続き参照することも正しいことに留意されたい。キャッシュラインが書き込み（修正）状態から読み出し（共有）状態に移行しているので、表６００ｄはＣＣＰを使用し、操作の記録をログする必要があるとプロセッサ１０２が判定することを示す。図示のようにプロセッサ１０２は、処理ユニット（Ｐ２）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［５］）、キャッシュラインが書き込み（修正）状態から読み出し（共有）状態に移行したこと、及びＰ０が前のキャッシュラインへの前のアクセスを有していたが、現在はＰ０及びＰ２がアクセスを有することを示すことができる。
【００７９】
[0096]  次に表６００ａはＩＤ［６］において処理ユニットＰ１がキャッシュラインからの読み出しを行い、同じくデータＤＡＴＡ［３］を読み出すことを示している。表６００ｂはキャッシュラインがＰ０、Ｐ１、及びＰ２によって現在「共有」されていることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットＰ０、Ｐ１、及びＰ２がキャッシュラインを消費したこと（ユニットビット６０３）、Ｐ１がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。インデックスビット６０４がＰ１の代わりにＰ０又はＰ２を引き続き参照することも正しいことに留意されたい。表６００ｄは、ＣＣＰを使用し、操作の記録をログすべきだとプロセッサ１０２が判定することを示す。図示のようにプロセッサ１０２は、処理ユニット（Ｐ１）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［６］）、キャッシュラインが読み出し（共有）状態から読み出し（共有）状態に移行したこと、並びにＰ０及びＰ２が前のキャッシュラインへの前のアクセスを有していたが、現在はＰ０、Ｐ１、及びＰ２がアクセスを有することを示すことができる。
【００８０】
[0097]  次に表６００ａはＩＤ［７］において処理ユニットＰ３がキャッシュラインからの読み出しを行い、同じくデータＤＡＴＡ［３］を読み出すことを示している。表６００ｂはキャッシュラインがＰ０、Ｐ１、Ｐ２、及びＰ３によって現在「共有」されていることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、ユニットビット６０３、インデックスビット６０４、又はフラグビット６０５のどれも更新されていないことを示す。これはロギングがＰ３について無効にされており、トレーシングのために、Ｐ３が読み出しを行うことによってキャッシュラインを「消費」していないからである。表６００ｄは、データがログされていないことを示す。これは動作３０３において、Ｐ３についてロギングを有効にしないとプロセッサ１０２が判定するからである。
【００８１】
[0098]  次に表６００ａはＩＤ［８］において処理ユニットＰ３が書き込みを行う、キャッシュライン、データＤＡＴＡ［４］を書き込むことを示している。表６００ｂはキャッシュラインがＰ０、Ｐ１、及びＰ２について現在「無効」であり、Ｐ３によって「修正」されることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、任意の処理ユニットによって消費されないものとして、ユニットビット６０３、インデックスビット６０４、及びフラグビット６０５が全てキャッシュラインを反映することを示す。これはロギングがＰ３について無効にされており、そのためトレーシングのために、Ｐ３が書き込みを行ったときＰ３はキャッシュラインを「消費」せず、更に書き込みが他の処理ユニットのキャッシュライン内の値を無効にしたからである。表６００ｄは、データがログされていないことを示す。この場合も、これは動作３０３においてＰ３についてロギングが有効にされないとプロセッサ１０２が判定するからである。
【００８２】
[0099]  次に表６００ａはＩＤ［９］において処理ユニットＰ０がキャッシュラインへの書き込みを行い、データＤＡＴＡ［５］を書き込むことを示している。表６００ｂはキャッシュラインがＰ０によって現在「修正」され、Ｐ３について「無効」であることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットのどれもキャッシュラインを消費していないことを示す。それは表６００ｄ内に反映されているようにこの操作に関してログエントリが作成されなかったからである。書き込まれたデータは、Ｐ０のスレッドの命令の通常実行によって再現されるので、ログエントリを作成する必要がない。しかしこの状況では、トレースにエントリを任意選択的に書き込んで（即ちロギングが有効にされた処理ユニットによってログされていないキャッシュラインへの書き込み）トレースの消費側に追加のデータを提供することができる。この状況ではログエントリは、キャッシュライン値の読み出し＋ＤＡＴＡ［５］の書き込みとして扱うことができる。
【００８３】
[00100]  次に表６００ａはＩＤ［１０］において処理ユニットＰ２がキャッシュラインからの読み出しを行い、データＤＡＴＡ［５］を読み出すことを示している。表６００ｂはキャッシュラインがＰ０及びＰ２によって現在「共有」されていることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットＰ２がキャッシュラインを消費したこと（ユニットビット６０３）、Ｐ２がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。値キャッシュラインが前にログされていない（即ちＩＤ［９］においてログされなかった）ので、表６００ｄはＣＣＰを使用し、操作の記録をログする必要があるとプロセッサ１０２が判定することを示す。図示のようにプロセッサ１０２は、処理ユニット（Ｐ２）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［１０］）、キャッシュラインに入れられたデータ（ＤＡＴＡ［５］）、及びＰ２がキャッシュラインへのアクセスを有することを示すことができる。特定のＣＣＰ及びアカウンティングビットがどの情報を提供するのかにもよるが、Ｐ０もキャッシュラインへのアクセスを有することをログすることも可能であり得る。
【００８４】
[00101]  次に表６００ａはＩＤ［１１］において処理ユニットＰ１がキャッシュラインからの読み出しを行い、同じくデータＤＡＴＡ［５］を読み出すことを示している。表６００ｂはキャッシュラインがＰ０、Ｐ１、及びＰ２によって現在「共有」されていることをプロセッサのＣＣＰが示していることを示す。表６００ｃは、処理ユニットＰ１及びＰ２がキャッシュラインを消費したこと（ユニットビット６０３）、Ｐ１がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。インデックスビット６０４がＰ１の代わりにＰ２を引き続き参照することも正しいことに留意されたい。表６００ｄは、ＣＣＰを使用し、操作の記録をログすべきだとプロセッサ１０２が判定することを示す。図示のようにプロセッサ１０２は、処理ユニット（Ｐ１）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［１１］）、キャッシュラインが読み出し（共有）状態から読み出し（共有）状態に移行したこと、及びＰ２が前のキャッシュラインへの前のアクセスを有していたが、現在はＰ１及びＰ２がアクセスを有することを示すことができる。ＩＤ［１０］においてＰ２によってログされたので、値（ＤＡＴＡ［５］）はログする必要がないことに留意されたい。
【００８５】
[00102]  次に表６００ａはＩＤ［１２］において処理ユニットＰ０がキャッシュラインからの読み出しを行い、同じくデータＤＡＴＡ［５］を読み出すことを示している。表６００ｂはキャッシュラインがＰ０、Ｐ１、及びＰ２によって現在「共有」されていることをプロセッサのＣＣＰが引き続き示していることを示す。表６００ｃは、処理ユニットＰ０、Ｐ１、及びＰ２がキャッシュラインを消費したこと（ユニットビット６０３）、Ｐ０がキャッシュラインを消費したこと（インデックスビット６０４）、又は何らかの処理ユニットがキャッシュラインを消費したこと（フラグビット６０５）を示す。インデックスビット６０４がＰ０の代わりにＰ１又はＰ２を引き続き参照することも正しいことに留意されたい。表６００ｄは、ＣＣＰを使用し、操作の記録をログすべきだとプロセッサ１０２が判定し得ることを示す。この場合プロセッサ１０２は、処理ユニット（Ｐ０）、キャッシュラインアドレス（＠）、命令カウント（ＩＣ［１２］）、キャッシュラインが読み出し（共有）状態から読み出し（共有）状態に移行したこと、並びにＰ１及びＰ２が前のキャッシュラインへの前のアクセスを有していたが、現在はＰ０、Ｐ１、及びＰ２がアクセスを有することを示すことができる。Ｐ２から入手できるので、値（ＤＡＴＡ［５］）はログされない。
【００８６】
[00103]  或いは、Ｐ０はキャッシュラインの値を既に有するので（即ちＩＤ［９］においてその値を書き込んだので）、プロセッサ１０２がＩＤ［１２］でのみＰ０を参照することが可能であり得る。ＩＤ［１２］での如何なるロギングも控えることさえ可能な場合があり、なぜならば再実行時にヒューリスティックを使用して、Ｐ０を参照する情報がトレース内になくても値（即ちＤＡＴＡ［５］）を回復できるからである。しかし、それらの技法は計算的に高価であり、再実行が「脱線」したときを検出するシステムの能力を低減し得る。ヒューリスティックの一例は、処理ユニット間のメモリアクセスが概して（ＣＣＰデータに基づいて）強く順序付けられていると認識することであり、そのため再実行は所与の記憶域についてそれらのユニット間の最後の値を使用することができる。
【００８７】
[00104]  次に表６００ａは、ＩＤ［１３］においてキャッシュラインが追い出されることを示している。その結果、表６００ｂはＣＣＰエントリが空であることを示し、表６００ｃはキャッシュラインを消費したものとしてアカウンティングビットがどの処理ユニットも反映していないことを示し、表６００ｄはデータがログされていないことを示す。
【００８８】
[00105]  完全性のために、ログデータ６０６は全ての終了アクセス状態（即ちどの処理ユニットがキャッシュラインへのアクセスを現在有するのか）を列挙するが、この情報は潜在的に暗黙的であり、これを省略することによってトレースファイルのサイズを低減できることに留意されたい。例えば書き込み−＞読み出しの遷移において、読み出し後にアクセスを有する処理ユニットのリストは常に、前にアクセスを有した処理ユニットと読み出しを行った処理ユニットとである。読み出し−＞書き込みの遷移又は書き込み−＞書き込みの遷移では、書き込み後に書き込みアクセスを有する処理ユニットのリストは常に書き込みを行った処理ユニットである。読み出し−＞読み出しの遷移では、読み出し後にアクセスを有する処理ユニットのリストは常に、遷移前にアクセスを有した処理ユニットと読み出しを行った処理ユニットとである。
【００８９】
[00106]  概して、完全に決定論的なトレースファイルを生成するために、ＣＣＰは処理ユニット間の（例えばＰ０からＰ１への）全ての遷移（即ち書き込み−＞読み出し、書き込み−＞書き込み、読み出し−＞書き込み、及び読み出し−＞読み出し）がログされることを指示する。但し、同じ処理ユニット内の（例えばＰ０からＰ０への）遷移はログする必要がない。かかる遷移をログする必要がないのは、その処理ユニットにおいて実行されたスレッドの通常実行によってかかる遷移が再現されるからである。
【００９０】
[00107]  上記の例でログされるようなデータを使用し、及び記録が行われたプロセッサ１０２によって使用されるＣＣＰについての更なる知識を用いて、各スレッドにおいて発生した操作の完全な順序付けを再構築することができ、異なる処理ユニット間の操作の少なくとも部分的な順序付けを再構築できることが理解されよう。従って、インデクシングプロセス及び／又はトレースファイルの再実行により、トレースファイル１０４ｄ内に全て明示的に記録されていなくても、上記の操作のそれぞれを再構築することができる。
【００９１】
[00108]  一部の実施形態では、処理ユニット間の操作の順序付けのロギングを向上させるために、トレーサ１０４ａがトレースファイル１０４ｄ内に追加のデータパケットを記録することができる。例えばトレーサ１０４ａは、スレッドにわたる単調増分数（ＭＩＮ）（又は他のカウンタ／タイマ）を有するイベントの完全な順序付けを提供するために、ＭＩＮ（又は他の何らかのカウンタ／タイマ）等の何らかのイベント順序付け情報と共に記録することができる。これらのＭＩＮは、スレッド間で「順序付け可能」だと定められるイベントに対応するデータパケットを識別するために使用され得る。これらのイベントは、スレッドが共有メモリによってどのように相互作用し得るのか、及びメモリ内のデータの共有使用を定める「トレースメモリモデル」に基づいて定められ得る。別の例としてトレーサ１０４ａは、定義済みの決定論的アルゴリズム及び定義済みの１組のレジスタ（例えばプログラムカウンタ、スタック、汎用レジスタ等）に基づき、プロセッサ状態のハッシュを（周期的に又は無作為に）記録することができる。更に別の例として、トレーサ１０４ａはキャッシュラインデータを（周期的に又は無作為に）強制的にログすることができる。更に別の例として、トレーサ１０４ａは、ハッシュをログする「遷移」パケットをトレース内に含めることができる、それらが暗黙的に運ぶデータの全て又は一部（例えば数ビット）。従ってこの暗黙データが再実行時に再構築されると、暗黙データの適切な部分をハッシュし、これらの遷移パケットにマッチしてその順序付けを識別するのを助けることができる。これは例えばキャッシュラインが共有状態にある場合、ＣＣＰがキャッシュラインに関連するプロセッサインデックスを追跡できない場合に有用であり得る。
【００９２】
[00109]  順序付けを向上させるためにトレーサ１０４ａがトレースファイル１０４ｄ内に追加のデータパケットを記録する場合、処理ユニット間の遷移の一部の記録を省略することが可能であり得る。例えば、スレッド間の一部の読み出し−＞読み出し遷移の記録を省略することが可能であり得る。一部の読み出しの順序付けをトレース及びＣＣＰに基づいて完全には再構築できない場合があるので、これは一部の状況では「脆弱化された」非決定論的トレースをもたらす可能性があるが、トレースの再実行を「脱線」させない読み出しの有効な順序付けを見つけるために、追加の順序付け情報（例えばＭＩＮ、プロセッサ状態のハッシュ、追加のキャッシュラインデータ）が再実行中の探索空間を減らすのを助けることができる。スレッド間の読み出し−＞読み出し遷移の一部を省略することの利点は、トレーシングを容易にするためのトレースサイズ及びプロセッサ１０１に対する潜在的に単純化された修正を含む。
【００９３】
[00110]  図７Ａは、プロセッサがどのように追跡されるのかにもよるが、トレースから一部の読み出し−＞読み出し遷移を省略することができる一例を示す。図６Ａと同様に、図７Ａは、グローバルＩＤ７０１及び３つの処理ユニット（Ｐ０〜Ｐ２）に対応する３つの列（７０２ａ〜７０２ｃ）を有する表７００ａを含む。一部の読み出し−＞読み出し遷移を省略することは２つの考えの上に成り立つ。第１に、書き込みは順序付ける必要があるが、連続する２つの書き込み間の読み出しの全て（例えばＩＤ［３］〜ＩＤ［７］の読み出し）は同じ値を読み出し、そのためそれらの読み出し間の順序は問題にならない（従ってそれらの読み出し−＞読み出し遷移を省略するトレースは決定論的であり得る）。第２に、再実行時に読み出しを書き込みに「クロス」させること（即ち同じキャッシュラインに対する読み出し及び書き込みが間違った順序で再実行されること）は再実行に正しいデータが使用されていないことを意味するが、この間違いを犯すのを回避するためのデータ（例えばＭＩＮ等）を有することは有効な順序付けを識別するのに役立つ。
【００９４】
[00111]  表７００ａに示す例では、処理ユニットＰ２は共有データへの読み出しのみを行い、（例えばＩＤ［９］がキャッシュラインを共有されたままにしておくと仮定し）それらの共有された読み出しは他の読み出しから「スチール」するだけである。読み出し−＞読み出し遷移（即ちＩＤ［４］〜ＩＤ［７］及びＩＤ［１０］）の何れについてもログエントリが作成されない場合、Ｐ２の読み出しを適切に配置するための情報がトレース内にない。書き込みに基づいて、（即ちＩＤ［２］における書き込みがＰ２からスチールしなかったので）Ｐ２は値ＤＡＴＡ［１］を決して読み出さなかったと結論付けることができ、Ｐ２の読み出し−＞読み出し遷移（即ちＩＤ［４］、ＩＤ［７］、及びＩＤ［１０］）についてのログエントリがなく、Ｐ２について結論付けることができる全てはＩＤ［２］とＩＤ［８］との間でＰ２による少なくとも１回の読み出しがあったことである。しかしＩＤ［４］及びＩＤ［１０］のログエントリがあった場合、ログする必要がない可能性がある残りの読み出し（即ち図７Ｂに示すＩＤ［５］〜ＩＤ［７］）を突き止めることができる。これらの読み出しのそれぞれは、最後に（即ちＩＤ［４］において）ログされた読み出しと同じ書込間セクション（inter-write section）に属する。従って、これらの読み出しは、書き込みが何処からスチールするのかに基づいて突き止めることができる（どの操作も読み出しからスチールしない場合、次にログされるパケットまでその後の書き込みはない）。
【００９５】
[00112]  表７００ａに照らして、図７Ｂは「ユニットビット」を使用する場合に記録され得る、図７Ａで強調した読み出し−＞読み出し遷移を省略したロギングデータを示す表７００ｂを示す。図７Ｃは、「インデックスビット」が使用され、インデックスが読み出し時に更新される場合に記録され得るロギングデータを示す表７００ｃを示す。
【００９６】
[00113]  上記で簡潔に述べたように、一部のキャッシュは包含的な層及び排他的な層の両方（即ち不完全に包含的なキャッシュ）を含む。本明細書に記載のロギング技法は、これらのキャッシュ並びに純粋に包含的な又は排他的なキャッシュに適用可能である。一例として図８Ａは、２つのプロセッサ８０１ａ／８０１ｂ（例えば対応するソケット内の２つのプロセッサ）を含む計算環境８００ａを示す。各プロセッサ８０１は、４つの処理ユニット８０２ａ／８０２ｂ（例えば物理的な又は論理的な処理ユニット）を含む。各プロセッサ８０１は、Ｌ１層８０３ａ／８０３ｂ、Ｌ２層８０４ａ／８０４ｂ、及びＬ３層８０５ａ／８０５ｂを含む３層キャッシュも含む。図示のように、各キャッシュは処理ユニット８０２の１つにそれぞれ対応する４つのＬ１キャッシュ８０３を含む。加えて各キャッシュは、処理ユニット８０２の２つにそれぞれ対応する２つのＬ２キャッシュ８０４を含む。加えて各キャッシュは、プロセッサ８０１内の処理ユニット８０２の全てのための１つのＬ３キャッシュ８０５を含む。処理ユニット及びキャッシュの一部は、個々に識別され、例えば処理ユニット８０２ａのプロセッサ８０１ａは、Ａ０〜Ａ３として識別され、Ｌ２キャッシュは、Ａ４及びＡ５として識別され、Ｌ３キャッシュは、Ａ６として識別される。プロセッサ８０１ｂ内の対応するコンポーネントに同様の識別子を使用する。処理ユニットＡ０、Ａ１、Ａ２、Ｂ０、及びＢ１に関連付けられたアスタリスク（＊）は、これらの処理ユニットについてロギングが有効にされていることを示す。
【００９７】
[00114]  計算環境８００ａでは、キャッシュが包含的挙動及び排他的挙動の混合を示すことができる。例えば処理ユニットＡ０だけが或るキャッシュラインを使用している場合、プロセッサ８０１ａのＡ６  Ｌ３キャッシュがそのキャッシュラインを記憶するのは非効率であり得る。代わりにこの場合、キャッシュラインは、Ａ０のＬ１キャッシュ及びＡ４  Ｌ２キャッシュ内に記憶され得るが、Ａ１のＬ１キャッシュ又はＡ５  Ｌ２キャッシュ若しくはそれよりも下位のキャッシュ上には記憶されない。空間を解放するために、この状況では一部のキャッシュはＡ６  Ｌ３キャッシュがそのキャッシュラインを追い出すことを可能にし得る。この追い出しが行われると、Ａ１は包含的キャッシュでは正常であるようにＡ４  Ｌ２キャッシュからキャッシュラインを取得することができる。しかし、キャッシュラインがＡ６  Ｌ３キャッシュ又はＡ５  Ｌ２キャッシュ内に存在しないので、一部のキャッシュ実装はＡ０のＬ１キャッシュからＡ２又はＡ３のＬ１キャッシュ等へのキャッシュラインの横方向の移動も可能にし得る。この横方向の移動はＣＣＰを用いたトレーシングに幾らかの課題を提示し得る。以下の例は、かかる状況においてＣＣＰを用いたトレーシングをどのように実現できるのかを示す。
【００９８】
[00115]  図８Ｂは、処理ユニット８０２の一部によって実行される読み出し及び書き込み操作の一例を示す表８００ｂを示す含む。表８００ｂの形式は表６００ａの形式と同様である。計算環境８００ａ及び表８００ｂに照らして、それぞれ異なるキャッシュ挙動を使用する３つの異なるロギングの例を示す。これらの例は、ＣＣＰを用いたロギングのための以下の原理に関連して説明する：
（１）概して、アドレス（キャッシュライン）が「未ログ」から「ログ済み」になる（即ち動作３０４においてキャッシュラインがロギングに関与していると判定することに基づいて）場合はデータをログする。
（２）概して、キャッシュラインが「ログ済み」から「未ログ」又は「追出し済み」になる場合はロギングを控える（このデータがログされる場合はログが依然として有効である）。しかし、追い出しをログすることは有効である。そうすることによりトレースサイズが大きくなるが、トレースデータストリーム間の順序付けを識別するのを助けることができ、トレースの再実行が何時「脱線」したのかを識別するのを助けることができ、更なるトレース分析を提供することができる追加情報を与える。トレース分析に関して、追い出しをログすることはキャッシュがどのように使用されたのかに関するより多くの情報を提供することができ、実行されるコードの性能特性を識別するために使用することができ、所与のキャッシュラインが特定の値を記憶した時間窓を突き止めるのを助けることができる。追い出しをロギングするための実施形態は、図１０Ａ及び図１０Ｂに関連して後述する。
（３）新たな情報を提供するやり方でキャッシュラインがコア又はキャッシュコヒーレンシ状態を横断する場合は動きをログする。
（４）処理ユニットが書き込みを行う場合、他の全ての処理ユニットについてキャッシュラインを無効化する。キャッシュラインが処理ユニットについてまだログされていない場合、システムはそのキャッシュラインをログしないことができ、又はキャッシュライン内のメモリが処理ユニットにとって読み出し可能だと仮定し、書き込みを（ｉ）読み出し（即ちキャッシュラインをログし、ロギング追跡をオンにする）として（ｉｉ）書き込みと共に扱うことができる。プロセッサがロギングをオフにして書き込みをログしないことは正当だが効率性で劣り得る。しかし、そのようにすることは再実行時に再構築される必要がある情報を失い、データのフルキャッシュラインを後でログするよりも参照をログした方が安価なので平均ではトレースサイズが非効率であり得る。
（５）トレースを後で再構築するのを助けるために、（例えば上記の原理２にあるように）オーバログすることは有効である。このことはトレースサイズを増大させるが、正確さには影響を与えない。例えば（図７Ａ〜図７Ｃに関連して上記で説明したように）一部の読み出し−＞読み出し遷移を省略することができるが、書き込みで始まる又は終わる任意のコア間遷移は明示的に又は暗黙的にログすべきである。別の例では、実施形態は（例えば追加の順序付け情報及び／又はハッシュを提供する）追加のデータパケットをトレースに何時でも追加することができる。更に別の例では、実施形態は、書き込み状態へのそのＣＣＰ遷移後にキャッシュラインに書き込みが最初に完遂されたときにログすることができる（即ち投機的実行はキャッシュラインを書き込み状態に遷移させ得るが、キャッシュラインへの如何なる書き込みも実際に完遂しない場合があるからである）。これらの書き込みをログすることは、コアごとのトレースストリームの分離を後で容易にすることができる。更に別の例では、実施形態は間接ジャンプ又はトレースデータストリームを分離する際に探索空間を素早く減らすのを助ける他の情報をログし得る。
（６）非フルログ（即ち遷移の全てはログしないもの）を引き続き使用してトレースを再実行することができる。このことは、欠落部分を計算するための余分な計算コストを再実行時に引き起こし得る。
【００９９】
[00116]  図８Ｃに示す第１の例では、ＣＣＰが処理ユニットごとにキャッシュライン状態を追跡する（即ち各コアは独自の読み出し状態及び書き込み状態を有する）。この例では、ロギング時に利用できないキャッシュ間又はソケット間を移動するデータがあり得ることを除き、キャッシュが包含的キャッシュのように挙動する。簡潔にするために、これらの例では処理ユニット８０２を「コア」と呼び、プロセッサ８０１ａ及び８０１ｂをプロセッサＡ及びプロセッサＢ又はソケットＡ及びソケットＢと呼ぶ。加えて、「ＩＤ：Ｃｏｒｅ：Ｆｒｏｍ：Ｔｒａｎｓｉｔｉｏｎ（即ちｆｒｏｍ−＞ｔｏ）」の簡略化したロギング表記を使用してロギング可能なデータの種類を表す。この表記についてはインラインでより詳細に説明する。第１の例ではロギングが以下を含み得る：
【０１００】
[00117]  ＩＤ［０］において、「０：Ａ０：Ｒ［ＤＡＴＡ］−＞［１］」、即ちＩＤ［０］においてコアＡ０がＤＡＴＡ［１］を読み出すことを上記の原理１に従ってログする。
【０１０１】
[00118]  ＩＤ［１］において、「１：Ｂ０：Ｒ［ＤＡＴＡ］−＞［１］」、即ちＩＤ［１］においてコアＢ０がＤＡＴＡ［１］を読み出すことを同じく上記の原理１に従ってログする。Ａ０がデータを既にログしていることをプロセッサＢ内のキャッシュが認識していない場合、プロセッサＢがそのデータを自らログする。或いは、Ａ０がＤＡＴＡ［１］をログしたことをプロセッサＢ内のキャッシュが認識している場合、ログエントリは「１：Ｂ０：Ｒ［Ａ０］−＞Ｒ」を含むことができる。
【０１０２】
[00119]  ＩＤ［２］において、「２：Ａ１：Ｒ［Ａ０］−＞Ｒ」、即ちＩＤ［２］においてコアＡ１が読み出し−＞読み出し遷移を行ったこと、及びＡ０がアクセスを有していたことをログする。キャッシュライン状態はプロセッサＢと共有されるので、エントリは「２：Ａ１：Ｒ：［Ａ０，Ｂ０］−＞Ｒ」とすることができ、即ちＩＤ［２］においてＡ１が読み出し−＞読み出し遷移を行ったこと、並びにＡ０及びＢ０がアクセスを有していたことをログする。ソケットを横断することは典型的にはソケット内のロギングよりも高価なので、読み出し−＞読み出し遷移について第１のログエントリが好ましい場合がある。しかし、ソケットを横断する書き込みとの間でロギングする場合、ロギングもソケットを横断する。
【０１０３】
[00120]  ＩＤ［３］において、一部の実施形態は何もログしない。或いはＡ２コアはまだ何もログしておらず、最初に行うことが書き込みなので、これは読み出し−＞書き込みとしてログすることができる。何れにしても、書き込みが発生したので他のコアは自らのキャッシュライン状態が無効化される。ＩＤ［３］において読み出し−＞書き込みをログする（例えばトレースデータに関する）コストは、典型的にはＩＤ［４］において実際のデータをログするよりも少なく、そのためここでログするのが有益であり得る。この場合、ログエントリは「３：Ａ２：Ｒ［Ａ０，Ｂ１，Ｂ０］−＞Ｗ」を含むことができ、即ちコアＡ２は読み出し−＞書き込み遷移を行い、コアＡ０、Ｂ１、及びＢ０がアクセスを有していた。
【０１０４】
[00121]  ＩＤ［４］において何が発生するのかは、ＩＤ［３］で何がログされたのかによって決まる。ＩＤ［３］において何もログされなかった場合はデータをログする（即ち「４：Ａ２：Ｒ［ＤＡＴＡ］−＞［２］」）。他方でＩＤ［３］においてパケットがログされている場合はログするものは何もない。
【０１０５】
[00122]  ＩＤ［５］において、コアを横断する読み出しがある。しかし、Ａ２コアが依然として修正された（又は同等の）キャッシュラインを有する場合、キャッシュラインが要求を供給する（メモリから供給することはできない）。その場合、ソケットＢはそれがソケットＡから来たことを知り、データを再ロギングするのを回避することができ、「５：Ｂ０：Ｗ［Ａ２］−＞Ｒ」としてログすることができる。キャッシュがメインメモリからデータを得た場合（これはソケットＡがメインメモリを更新し、ラインに関する自らのキャッシュコヒーレンシ状態を共有できる場合に該当し得る）、エントリは「５：Ｂ０：Ｒ［ＤＡＴＡ］−＞２」とすることができる。
【０１０６】
[00123]  ＩＤ［６］において、操作は通常の読み出しである。ＩＤ［２］における読み出しと同様に、ソケットＢはソケットＡのデータを知っている又は知らない可能性がある。知っている場合、ログエントリは「６：Ｂ１：Ｒ［Ｂ０，Ａ２］−＞Ｒ」を含むことができ、さもなければ「６：Ｂ１：Ｒ［Ｂ０］−＞Ｒ」を含むことができる。
【０１０７】
[00124]  ＩＤ［７］において、Ｂ０のキャッシュラインが追い出されていない場合、ログするものは何もない。Ｂ０のキャッシュラインが追い出されている場合、プロセッサＢは別のコアから来るものとしてデータをログし、又はキャッシュラインデータをログする。ソケット内の他のコアではなくこの１つのコアの追い出しは、概して完全に包含的なキャッシュでは発生しない。完全に包含的なキャッシュでは、ソケット内の任意のコアがそのＬ１キャッシュ内にキャッシュラインを有する場合、Ｌ３がキャッシュラインを有し、そのためキャッシュラインは別のコアではなく１つのコアについて追い出すことはできない。
【０１０８】
[00125]  ＩＤ［８］において、Ａ０コアは何もログしておらず、ログする最初の操作は書き込みなので、ここでの操作はＩＤ［３］における操作と同様である。プロセッサＡはこれを読み出し−＞書き込みとしてログすることができるが、代わりに、但しことによると好ましくないが、プロセッサＡは何もログしなくてもよい。パケットがログされる場合、その内容はソケットＡがソケットＢを認めることができるのかどうかによって異なる。認めることができない場合、パケットは「８：Ａ０：Ｒ［Ａ２］−＞Ｗ」を含むことができるが、認めることができる場合、パケットは「８：Ａ０：Ｒ［Ｂ０，Ｂ１，Ａ２］−＞Ｗ」を含むことができる。
【０１０９】
[00126]  ＩＤ［９］において、ＩＤ［８］においてパケットがログされている場合は（既にログされているキャッシュに対する書き込みなので）ログするものは何もないが、まだ無効化されていない場合は他のコアのキャッシュライン状態が典型的には無効化される。
【０１１０】
[00127]  ＩＤ［１０］において、ロギングはＩＤ［８］において何がログされたのかによって決まる。ＩＤ［８］においてデータがログされなかった場合はここで行う必要があり、そのためパケットは「１０：Ａ１：Ｒ［ＤＡＴＡ］−＞［４］」を含むことができる。ＩＤ［８］においてパケットがログされた場合、これは通常の書き込み−＞読み出しパケット（例えば「１０：Ａ１：Ｗ［Ａ０］−＞Ｒ」）である。
【０１１１】
[00128]  ＩＤ［１１］において、読み出し−＞読み出し遷移がログされる。ＩＤ［８］においてパケットがログされた場合、Ａ０はコアのソースリスト上にあり（例えば「１１：Ａ２：Ｒ［Ａ０，Ａ１］−＞Ｒ）、さもなければリスト内にない（例えば「１１：Ａ２：Ｒ［Ａ１］−＞Ｒ」）。
【０１１２】
[00129]  ＩＤ［１２］において、ソケットＢがソケットＡを認めることができる場合、これは読み出し−＞読み出しパケット（例えば「１２：Ｂ０：Ｒ［Ａ０，Ａ１，Ａ２］−＞Ｒ」）である。認めることができない場合、それは完全なデータログ（例えば「１２：Ｂ０：Ｒ［ＤＡＴＡ］−＞［４］」）である。
【０１１３】
[00130]  ＩＤ［１３］において、データはＢ０から、加えてソケットＡが可視であればソケットＡから来る（例えば「１３：Ｂ１：Ｒ［Ａ０，Ａ１，Ａ２，Ｂ０］−＞Ｒ」）。ＩＤ［８］において書き込みがログされなかった場合、リストはコアＡ０を省略することができる。
【０１１４】
[00131]  ＩＤ［１４］において、パケットがＩＤ［８］においてログされている、既にログしている場合、何もログする必要がない。さもなければ、Ａ０はＡ１及びＡ１から、加えてソケットＢが可視であればことによるとソケットＢからデータを得る。従って、パケットは「１４：Ａ０：Ｒ［Ａ１，Ａ２，Ｂ０，Ｂ１］−＞Ｒ」を含むことができる。
【０１１５】
[00132]  この例はソケットを一緒にログしたが、スレッドを分離してログできるやり方と同様に、各ソケットを分離してログすることは正しいことに留意されたい。分離してログすることはより大きなトレースの原因となる可能性があるが、プロセッサ内のどのソケット間通信メカニズムも変更する必要がないという利点を有する。
【０１１６】
[00133]  更に、任意の瞬間においてキャッシュラインを追い出すことができ、これはデータを別のコアから集める必要があること又は再びログする必要があることを意味する。例えばＩＤ［１１］の前にＡ０のキャッシュラインが追い出された場合、Ａ２はＡ１から値を得る。Ａ１及びＡ０の両方が追い出された場合、プロセッサＡはキャッシュライン値をＡ２のトレース内にログする必要があり得る。
【０１１７】
[00134]  最後に、一部のプロセッサはデータが別のソケットから来ることを知っているが、そのソケット内のどのコアかは知らない可能性がある。これらの場合、プロセッサはソケットＩＤとして先行（ソース）をログし、データ自体をログし、又はソケットＩＤ及びデータのハッシュをログする（即ちトレースに全データをログする必要なしにソケット間アクセスの順序付けを助けるために）ことができる。
【０１１８】
[00135]  図８Ｄに示す第２の例では、ＣＣＰは、各コアのキャッシュコヒーレンシを別々に追跡する代わりにインデックスを使用する。この環境では、インデックスはソケット間で又はソケット内で追跡することができる。ソケット間通信対ソケット内通信の性能のために、後者の事例（ソケット内）の方が実用的であり得る。インデックスがソケット内で追跡される場合、トレースはデータがソケット間を移動するとき何かをログする必要があり得る。これは、他のソケットからのインデックスをログすること（しかしこれは必ずしも決定論的トレースにとって十分に一意でない可能性がある）、キャッシュライン値の１つ又は複数の部分のハッシュをログすること、又はデータが送信されたことを示すために送信側のソケットのトレース上のパケットをログすることを含み得る。
【０１１９】
[00136]  不完全に包含的なキャッシュを使用する場合にコアインデックスを追跡するとき、Ｌ１キャッシュがＬ３キャッシュ内にないデータを有し得る場合に困難な状況が生じる。そのため例えば以下の一連のイベントを想定されたい：（ｉ）Ａ０が自らのＬ１キャッシュ内にラインを取得し（従ってインデックスビットはＡ０を参照する）、（ｉｉ）Ａ１が自らのＬ１キャッシュ内にラインを取得し（従ってインデックスビットはＡ１を参照する）、（ｉｉｉ）Ｌ３キャッシュがラインを追い出し、（ｉｖ）Ａ１がＬ１キャッシュであるからラインを追い出し、（ｖ）Ａ２が自らのＬ１キャッシュ内にＡ０からキャッシュラインを取得する。ここでＡ２はＡ０からキャッシュラインを取得するが、インデックスはＡ０を参照しない。このことはトレース内へのマッピングのログを複雑にする。一部の解決策は（上記で説明したように）キャッシュラインデータの１つ又は複数の部分のハッシュ等の追加情報を追加すること、汎用レジスタのハッシュ等の冗長情報を周期的に追加すること等を含み得る。追い出しをログすることも役立ち得るが、かかるログはトレースファイルのサイズを大幅に増大させ、ロギングを複雑にし得る（例えばＬ２キャッシュ又はＬ３キャッシュ内にないＬ１キャッシュの追い出しはログするが、Ｌ２キャッシュ又はＬ３キャッシュ内にあるＬ１キャッシュの追い出しはログしない）。
【０１２０】
[00137]  一部の実施形態では、データがＬ３キャッシュから子のＬ２キャッシュ又はＬ１キャッシュに移動するとき、インデックスが変わる場合にのみログエントリが作成される。例えばＡ０が自らのＬ１キャッシュ内にラインを有する（従ってインデックスビットはＡ０を参照する）と仮定すると、Ａ１は自らのＬ１キャッシュ内のラインを取得し（Ａ１のインデックス）、その後どちらもキャッシュラインを追い出すが、共通のＬ２（又はＬ３）はそのキャッシュラインを依然として有する。Ｌ２キャッシュがＡ１に供給する場合、ログするものは何もない。Ｌ２キャッシュがＡ０に供給する場合、Ａ０が既にそのデータを有していることが分かっている場合はログエントリを作成する必要はないが、Ａ０が既にそのデータを有しているかどうか分からない（又は判定できない）場合、プロセッサは読み出し−＞読み出しをログする必要があり得る。
【０１２１】
[00138]  表８００ｄは表８００ｂの操作のログを示し、ソケットが独立にログし、追跡がインデックスによって行われ、追加の隠れた追い出しがなく、ＣＣＰに影響を与え且つロギングがオンにされるとき発生する全ての書き込みがログされる（例えば同じコアによる連続した書き込みがあり、別のコア又は他の外部エンティティによるアクセスがそれらの書き込みの間にない場合１つの書き込みをログする必要がある）と仮定する。第２の例ではロギングが以下を含み得る：
【０１２２】
[00139]  ＩＤ［０］では、「０：Ａ０：Ｒ［ＤＡＴＡ］−＞［１］」。
【０１２３】
[00140]  ＩＤ［１］では、「１：Ｂ０：Ｒ［ＤＡＴＡ］−＞［１］」、即ち各ソケットが別々にログされることを思い出されたい。
【０１２４】
[00141]  ＩＤ［２］では、「２：Ａ１：Ｒ［Ａ０］−＞Ｒ」。
【０１２５】
[00142]  ＩＤ［３］では、「３：Ａ２：Ｒ［Ａ１］−＞Ｗ」。
【０１２６】
[00143]  ＩＤ［４］では、何もなし。
【０１２７】
[00144]  ＩＤ［５］では、「５：Ｂ０：Ｒ［ＤＡＴＡ］−＞［２］」。これはＩＤ［３］における書き込みが全てのソケットにわたりラインを無効にし、ソケットが（上記のように）独立にトレースされているからである。
【０１２８】
[00145]  ＩＤ［６］では、「６：Ｂ１：Ｒ［Ｂ０］−＞Ｒ」。
【０１２９】
[00146]  ＩＤ［７］では、Ｂ０のキャッシュラインが追い出されていない場合ログするものは何もない。
【０１３０】
[00147]  ＩＤ［８］では：「８：Ａ０：Ｒ［Ａ２］−＞Ｗ」であり、それはロギングビットがオンだから（且つそれにもかかわらずこのコアが前にデータをログしていないから）である。このエントリは、どのようにソケット内の最後のオーナの知識しかないことをインデックスで示す。
【０１３１】
[00148]  ＩＤ［９］では、ログするものは何もない。
【０１３２】
[00149]  ＩＤ［１０］では、「１０：Ａ１：Ｗ［Ａ０］−＞Ｒ」。
【０１３３】
[00150]  ＩＤ［１１］では、「１１：Ａ２：Ｒ［Ａ１］−＞Ｒ」。
【０１３４】
[00151]  ＩＤ［１２］では、「１２：Ｂ０：Ｒ［ｄａｔａ］−＞［４］」。これはＩＤ［８］において全てのソケットにわたりキャッシュラインが無効化されたからである。
【０１３５】
[00152]  ＩＤ［１３］では、「１３：Ｂ１：Ｒ［Ｂ０］−＞Ｒ」。
【０１３６】
[00153]  ＩＤ［１４］では、「１４：Ａ０：Ｒ［Ａ２］−＞Ｒ」。ＩＤ［１１］において、インデックスがＡ２であるように更新されたことに留意されたい。このコアが既にデータを有していたかは分からず（即ちＩＤ［９］）、それはインデックスがその情報を運ばないからだが、以前はプロセッサごとの状態（ユニットビット）がその情報を運ぶことができたことにも留意されたい。
【０１３７】
[00154]  第３の例では、環境８００ａ内のキャッシュは、どのコアがキャッシュラインへの最後の共有（読み出し）アクセスを有するのかを追跡することができない。従ってこの例では、最後のリーダのインデックスを追跡することができず、それはそのように追跡するためのビットがないからである。ここでＣＣＰは、（例えばＭＳＩプロトコルを使用し）共有ラインを知らせるために（どのコアにもマップしない）或るインデックス値を使用し、無効なラインを知らせるために別のインデックス値を使用し、「修正」状態のためにプロセッサインデックスを使用することができる。この第３の例では、ロギングはコアのインデックスの代わりにパケット内のキャッシュのインデックスをログすることを含み得る。親から子への動きはログする必要がないが、追加データとしてログしてもよい。親から子への動きをログしない場合、ログを解釈するために親から子へのキャッシュ階層を提供する必要があり得る。
【０１３８】
[00155]  上記で述べたように、一部の環境ではキャッシュの各キャッシュラインが単一のフラグビットを含み得るが、プロセッサのＣＣＰは、キャッシュラインのコヒーレンス状態を所有する処理ユニットへのインデックスを参照して各キャッシュラインのコヒーレンス状態を追跡することができる。上記のように、これは完全に決定論的なトレースをもたらすが、処理ユニットごとの情報を有する事例よりも大きいトレースの原因になり得る（例えばキャッシュラインごとのフラグビットと組み合わせて処理ユニットごとに追跡するＣＣＰ）。図９Ａ及び図９Ｂは、これらの２つの状況（即ちＣＣＰユニット情報＋キャッシュラインフラグビット対ＣＣＰインデックス＋キャッシュラインフラグビット）においてロギングがどのように異なり得るのかを示す。図９Ａは２つの処理ユニット（Ｐ０及びＰ１）による読み出し及び書き込みを示す表９００ａを示し、図９Ｂはこれらの２つの環境内でログエントリが作成され得るときを比較する表９００ｂを示す。これらの例では、フラグビットがクリアされて始まり、キャッシュラインへのアクセスをどの処理ユニットも有さないことをユニット／インデックスビットが示すと仮定されたい。
【０１３９】
[00156]  最初に、ＣＣＰがユニット情報を追跡し、キャッシュラインがフラグビットを使用する場合、ロギングは以下のように進めることができる。表９００ｂに示すように、ログされていないキャッシュラインに対する書き込みなので、ＩＤ［０］において何もログする必要はない（或いは書き込み前の値をログすることができ、フラグビットをオンにすることができる）。この時点で、ＣＣＰはＰ０もＰ１もキャッシュラインにアクセスしないことを示し得る。ＩＤ［１］において、Ｐ１についてキャッシュラインデータをログすることができる。フラグビットをオンにすることができ、ＣＣＰはＰ１がキャッシュラインへのアクセスを有することを示し得る。ＩＤ［２］において、読み出し−＞読み出しパケットをログすることができ、Ｐ０はＰ１からキャッシュラインを取る（フラグビットがオンだったのでこれはログされ、Ｐ０がアクセスを有さなかったと判定するためにＣＣＰが使用される）。フラグビットは既にオンであり、ＣＣＰは今ではＰ０もキャッシュラインの状態にアクセスできることを示す。ＩＤ［３］において、何もログする必要はない（キャッシュラインはこのコアについて既にログ内にある）。フラグビットがオンであり、Ｐ１がキャッシュラインへのアクセスを既に有していたことをＣＣＰが示すのでこれ判定される。ＩＤ［４］において、Ｐ０について読み出し−＞書き込みパケットをログすることができる。これは、フラグビットがオンであり、Ｐ０がキャッシュラインへのアクセスを既に有していたからである。これは書き込みだったので、ＣＣＰは他の全てのプロセッサについてキャッシュラインを無効化することができる（即ちＰ０はアクセスを有し、Ｐ１はアクセスを有さない）。ＩＤ［５］において、Ｐ１について書き込み−＞読み出しパケットをログすることができる。これは、フラグビットはオンだがＰ１が（ＣＣＰによって示されるように）トレース内のデータを有さないからである。ＩＤ［４］及びＩＤ［５］における２つの参照パケットは、ＩＤ［４］において何もログせずＩＤ［５］においてデータをログしなければならないよりも小さいことに留意されたい。ＣＣＰは、Ｐ０に加えてＰ１がキャッシュラインへのアクセスを現在有することを示す。
【０１４０】
[00157]  今度はＣＣＰがインデックス情報だけを追跡し、キャッシュラインがフラグビットを使用する場合、ロギングは以下のように進めることができる。表９００ｂに示すように、ＩＤ［０］においてフラグビットがオフであり、これが書き込みなので何もログする必要はない。前述のように、メモリがＰ０によって読み出し可能である場合、これは代わりに読み出し＋書き込みとしてログすることができる。ＩＤ［１］において、Ｐ１についてキャッシュラインデータをログすることができる。フラグビットをオンにすることができ、ＣＣＰ及びＰ１を指すようにインデックスを更新する。ＩＤ［２］において、Ｐ０について読み出し−＞読み出しパケットをログすることができる。これはフラグビットが既にオンであり、インデックスがＰ１上にあるからである。ＣＣＰはインデックスをＰ０に更新することができる。それＩＤ［３］、Ｐ１について読み出し−＞読み出しパケットをログすることができる。この事例は今のところＩＤ［２］と区別できず、それはどちらの場合も他のプロセッサ上のインデックス、フラグビットがオンであり、キャッシュラインが共有状態にあるからである。ＣＣＰはインデックスをＰ１に更新することができる。ＩＤ［４］において、Ｐ０について読み出し−＞書き込みパケットをログすることができる。フラグビットはオンであり、そのためパケットは参照によってログ可能である。これによりＣＣＰのインデックスがＰ０に更新される。ＩＤ［５］、Ｐ１について書き込み−＞読み出しパケットをログすることができる。フラグビットはオンであり、パケットは参照によってログする。キャッシュラインは共有状態に移行し、そのためＣＣＰはインデックスをＰ１に更新する。表９００ｂに示すように、インデックスの事例はユニットの事例よりも大きなトレースファイルの原因となるが、依然として完全に決定論的なトレースをもたらす。
【０１４１】
[00158]  本明細書の実施形態の一部は、キャッシュラインデータを後で記録するよりも、（可能な場合は）別の処理ユニットが保持するデータを参照するデータパケットを記録する方がトレースファイルのサイズに関して有益であり得ることを示した（例えば前の例のそれぞれにおけるＩＤ［４］）。参照による記録の他の利点も生じ得る。例えば再実行時に参照による一連のログエントリがある場合、キャッシュラインデータ内で外部介入が発生していないと推論することができる。なぜならフルキャッシュラインデータが再びログされる場合、それはキャッシュラインが追い出された又は無効化されたことを意味するからである。従って、ログエントリが厳密に必要でない可能性がある状況でさえ参照によるログエントリを含めることは、再実行時に又はデバッグに有用な情報であり得る、外部介入がないことに関する暗黙的な情報を提供することができる。
【０１４２】
[00159]  一部の実装形態では、トレースエントリ内に記録されるアドレス（例えば上記の「＠」エントリ）が物理メモリアドレスを含む。これらの実装形態では、プロセッサ１０２がＴＬＢ１０２ｆの１つ又は複数のエントリをトレースファイル１０４ｄ内に記録することができる。かかる記録は異なる処理ユニットのためのトレースデータストリームの一部として、又はもう１つの追加のトレースデータストリームの一部としてであり得る。かかる記録は、再実行ソフトウェアがこれらの物理アドレスを後で仮想アドレスにマップできるようにする。
【０１４３】
[00160]  加えて、物理アドレスは時として（例えばユーザモードのレベルで記録するとき）「秘密」情報と見なされ得るので、一部の実施形態は物理アドレス自体ではなく実際の物理アドレスの何らかの表現を記録する。この表現は、物理アドレスを明かすことなしにその識別子を物理アドレスに一意にマップする任意の表現とすることができる。一例は各物理アドレスのハッシュであり得る。これらの表現が使用され、ＴＬＢ１０２ｆのエントリがトレースファイル１０４ｄ内に記録される場合、プロセッサ１０２は仮想アドレスに対する物理アドレスではなく、これらの表現と仮想アドレスとの間のマッピングを記録する。
【０１４４】
[00161]  先に述べたように、プロセッサ１０２は１つ又は複数のバッファ１０２ｅを含むことができる。これらのバッファは、トレースファイル１０２ｆにトレースファイルエントリを実際に書き込む前の、かかるエントリ用の一時的な記憶場所として使用することができる。従って、動作３０５がデータをトレースにログさせる場合、動作３０５はバッファ１０２ｅにデータを書き込むことを含み得る。一部の実施形態では、プロセッサ１０２及びメモリバスに対する、トレースデータを書き込む影響を減らすために、プロセッサ１０２がデファードロギング技法を使用する。これらの実施形態では、プロセッサ１０２はトレースデータをバッファ１０２ｅ内に記憶し、メモリバス上に利用可能な帯域幅があるまで又はバッファ１０２ｅが満杯であるまでトレースファイル１０２ｆへの書き込みを先延ばしすることができる。
【０１４５】
[00162]  同じく先に述べたように、一部の実施形態はキャッシュの追い出しをログすることができる。図１０Ａ及び図１０Ｂは、アソシアティブキャッシュの特性を活用する効率的な方法（即ちトレースファイルのサイズに関して）でキャッシュの追い出しをログできるやり方の一部の実施形態を示す。最初に図１０Ａは、メモリアドレスの異なる部分、及びアソシアティブキャッシュに対するそれらの部分の関係の一例１０００を示す。図示のようにメモリアドレスは、アドレスの下位ビットであり、典型的にはゼロである第１の複数のビット１００１を含む。メモリアドレスは典型的にはメモリアドレスのサイズ（例えば３２ビット、６４ビット等）に調整されるので、第１の複数のビット１００１はゼロである。従って、第１の複数のビット１００１の数はメモリアドレスのサイズに依存する。例えばメモリアドレスが３２ビット（即ち２＾５ビット）である場合、（メモリアドレスが３２の倍数であるように）第１の複数のビット１００１が５ビット含み、メモリアドレスが６４ビット（即ち２＾６）である場合、（メモリアドレスが６４の倍数であるように）第１の複数のビット１００１が６ビット含む等である。メモリアドレスは、メモリアドレスのデータを記憶すべきアソシアティブキャッシュ内の特定のアドレスグループを決定するためにプロセッサ１０２によって使用され得る第２の複数のビット１００２も含む。図１０Ａの例１０００では、例えば第２の複数のビット１００２は、８つのアドレスグループを有するアソシアティブキャッシュに対応する３ビットを含む。従って、第２の複数のビット１００２の数はアソシアティブキャッシュの特定のジオメトリに依存する。メモリアドレスは、メモリアドレスの残りの上位ビットを含む第３の複数のビット１００３も含む。
【０１４６】
[00163]  図１０Ａの脈絡において、図１０Ｂはアソシアティブキャッシュにおけるキャッシュミス及びキャッシュ追い出しをログする一例１００４を示す。最初に、例１００４は３つのメモリアドレス１００５（即ちアドレス１０２４）、１００６（即ちアドレス＠２１１２）、及び１００７（即ちアドレス＠２０４８）を示す。図１０Ｂは、４つのウェイをそれぞれ含む８つのグループを有するアソシアティブキャッシュ１０１０も示す。これらのグループ及びウェイの２進数識別は、括弧内の対応する１０進表現と共に列１００８（グループ）及び１００９（ウェイ）内に示す。従って、例えばキャッシュ１０１０内のキャッシュライン（０，０）、即ちグループ０、ウェイ０は、グループ「０００」（列１００８）及びウェイ「００」（列１００９）として２進数で示され、キャッシュ１０１０内のキャッシュライン（０，１）（グループ０、ウェイ１）は、グループ「０００」（列１００８）及びウェイ「０１」（列１００９）として２進数で示され、キャッシュ１０１０内のキャッシュライン（８，３）、即ちグループ８、ウェイ３がグループ「１１１」（列１００８）及びウェイ「１１」（列１００９）として２進数で示されるまで同様に続く。
【０１４７】
[00164]  ここで、アドレス１００５（即ち＠１０２４）上で第１のキャッシュミスがあると仮定する。ここでは、その第２の複数のビット１００２が「０００」なので、プロセッサ１０２はアドレス１００５に対応するデータをキャッシュ１０１０のグループ０内に記憶すべきだと判定することができる。グループ０内の特定のウェイは、典型的にはプロセッサ固有のロジックによって選択される。しかし例１００４では、（矢印によって示すように）１０１１ａデータがウェイ０内に記憶されると仮定する。このキャッシュミスに関連して、トレーサ１０４ａによって記録されるログデータは、メモリアドレス（即ち＠１０２４）及びデータが記憶されたウェイ（即ちウェイ０）を含むことができる。トレース内にメモリアドレスを記憶するのに必要なビット数を減らすために、任意の数の圧縮技法を使用できることに留意されたい。グループ（即ちグループ０）は、メモリアドレスの第２の複数のビット１００２から得ることができるのでログする必要はない。
【０１４８】
[00165]  次に、アドレス１００６（即ち＠２１１２）上で第２のキャッシュミスがあると仮定する。今度は第２の複数のビット１００２が「０１０」なので、プロセッサ１０２は、アドレス１００６に対応するデータをキャッシュ１０１０のグループ２内に記憶すべきだと判定することができる。ここでもグループ２内の特定のウェイは、典型的にはプロセッサ固有のロジックによって選択される。しかし例１００４では、（矢印によって示すように）１０１１ｂデータがウェイ０内に記憶されると仮定する。このキャッシュミスに関連して、トレーサ１０４ａによって記録されるログデータは、メモリアドレス（即ち＠２１１２）及びデータが記憶されたウェイ（即ちウェイ０）を含むことができる。この場合もやはり、グループ（即ちグループ２）は、メモリアドレスの第２の複数のビット１００２から得ることができるのでログする必要はない。
【０１４９】
[00166]  今度はアドレス１００７（即ち＠２０４８）上で第３のキャッシュミスがあると仮定する。第２の複数のビット１００２はここでも「０００」なので、プロセッサ１０２は、アドレス１００７に対応するデータをキャッシュ１０１０のグループ０内に記憶すべきだと判定することができる。ここでも特定のウェイはプロセッサ固有のロジックによって選択されるが、（矢印１０１１ｃによって示すように）プロセッサがウェイ０を選択すると仮定する。このキャッシュミスに関連して、トレーサ１０４ａによって記録されるログデータは、メモリアドレス（即ち＠２０４８）及びデータが記憶されたウェイ（即ちウェイ０）を含むことができる。この場合もやはり、グループ（即ちグループ０）は、メモリアドレスの第２の複数のビット１００２から得ることができるのでログする必要はない。
【０１５０】
[00167]  このキャッシュライン（０，０）はアドレス１００５に現在対応しているので、アドレス１００７上のこの第３のキャッシュミスはアドレス１００５をキャッシュ１０１０から追い出させる。しかし実施形態は、この追い出しを記録する如何なるトレースデータの記録も控えることができる。これは追い出しがトレース内に既にあるデータ、即ちウェイ０内へのアドレス１００７上の第２のキャッシュミスと共にウェイ０内へのアドレス１００５上の第１のキャッシュミスから推論できるからである。グループ（即ちグループ０）はトレース内で明示的にログされない場合があっても、これらのアドレスから推論することができる。そのため、このトレースデータの再実行は追い出しを再現することができる。
【０１５１】
[00168]  一部の追い出しはキャッシュミス以外のイベントから生じる。例えばＣＣＰは、異なるキャッシュ間の整合性を保つために追い出しを発生させる場合がある。例えばＣＣＰイベントによってアドレス１００６がキャッシュ１０１０のキャッシュライン（２，０）から追い出されると仮定する。ここでは、追い出しのグループ（即ち「０１０」）及びウェイ（即ち「００」）を記録することにより、追い出しを明示的にログすることができる。とりわけ追い出されたアドレスは、キャッシュライン（２，０）内にアドレス１００６を運んだ第２のキャッシュミスをログする際に既に捕捉されているのでログする必要はない。従ってこの例では、追い出しは単なる５ビットのログデータ（任意の形式の圧縮前）でトレースファイル１０４ｄ内に完全に捕捉することができる。
【０１５２】
[00169]  一部の実施形態は、処理ユニットにおいて実行されているスレッドが安全なエンクレーブと相互作用する場合でも、その処理ユニットのアクティビティを安全にトレースすることもできる。当業者によって理解されるように、エンクレーブは、ことによるとプロセッサ１０２において実行される最低レベルのソフトウェアからさえも機密情報（例えば暗号鍵、資格情報、バイオメトリクデータ等）を保護することができるハードウェアベースのセキュリティ機能である。従ってユーザモードプロセスから機密情報を保護することに加え、エンクレーブはカーネル及び／又はハイパーバイザから機密情報を保護することさえできる。多くの実装形態では、エンクレーブは、実行プロセスにはプロセスのアドレス空間にマップされたメモリの暗号化部分として映る。これは例えば、実行プロセス及びエンクレーブのための異なるメモリページテーブルを使用することによって実装され得る。プロセスがエンクレーブと相互作用するとき、プロセスは自らのマップされたメモリとの間で読み書きすることができ、エンクレーブは自らのマップされたメモリ及び／又はプロセスのマップされたメモリとの間で読み書きすることができる。
【０１５３】
[00170]  第１のエンクレーブアウェアなトレーシングの実施形態は、プロセスが相互作用するエンクレーブのトレーシングを控えながら実行プロセスをトレースすると同時に、トレース対象プロセスを完全に再実行することを依然として可能にする。これらの実施形態では、そのアドレス空間への実行プロセスによるメモリ読み出しは、本明細書に既に記載した１つ又はメカニズムを使用してトレース／ログされる。しかし、エンクレーブへのコンテキストスイッチがある場合、実施形態はトレース対象プロセスによって前に読み出され、その実行中にエンクレーブによって書き込まれる任意の記憶域を追跡することができる。トレース対象プロセスがエンクレーブへの切り替え後に再び実行される場合、これらの記憶域はトレース対象プロセスによってログされていないものとして扱われる。このようにして、トレース対象プロセスがこれらの記憶域から再び読み出す（ことによるとエンクレーブによってそれらの位置に配置されたデータを読み出す）場合、それらの読み出しはトレースにログされる。事実上、これはトレース対象プロセスにとって可視のエンクレーブの実行の任意の副次的作用が、エンクレーブの実行をトレースする必要なしにトレース内に捕捉されることを意味する。このようにして、エンクレーブの実行を実際に再実行する（或いはできる）必要なしに、トレース対象プロセスはこれらの副次的作用を利用して後で再実行することができる。アカウンティングビット（例えばフラグビット、ユニットビット、インデックスビット）、ウェイロック、ＣＣＰデータの使用等、トレース対象プロセスによって前に読み出され、その実行中にエンクレーブによって書き込まれる記憶域を追跡するために使用可能な（前述した）幾つかのメカニズムがある。
【０１５４】
[00171]  第２のエンクレーブアウェアなトレーシングの実施形態は、（例えば自らのアドレス空間へのアクセス及び／又はトレース対象プロセスのアドレス空間へのアクセスに基づいて）エンクレーブもトレースしながら（例えば自らのアドレス空間への読み出し等のアクセスに基づいて）実行プロセスをトレースする。これらの実施形態は、カーネル／ハイパーバイザとエンクレーブとの間に必要な信頼レベルがある場合に実装することができる。これらの実施形態では、エンクレーブの実行に関係するトレースデータを別個のトレースデータストリーム内にログする及び／又は暗号化することができ、そのため再実行を行う任意のエンティティは、エンクレーブの別個のトレースデータストリーム及び／又はエンクレーブの実行に関係するトレースデータを復号するために使用可能な暗号鍵へのアクセスなしにエンクレーブを再実行することができない。
【０１５５】
[00172]  第３のエンクレーブアウェアなトレーシングの実施形態は、第１の実施形態と第２の実施形態とを組み合わせる。従ってこれらの第３の実施形態は、エンクレーブ自体のトレース（即ち第２の実施形態）と共に、そのプロセスのエンクレーブ使用の副次的作用を含む実行プロセスのトレース（即ち第１の実施形態）を記録することができる。このことは、必要な特権レベル及び／又は暗号鍵を有するユーザもエンクレーブ自体の実行を再実行できるようにしながら、必要な特権レベル及び／又は暗号鍵を欠くユーザがトレース対象プロセスの実行を再実行することを可能にする。
【０１５６】
[00173]  これらのエンクレーブトレーシングの実施形態のそれぞれはエンクレーブを超えて、及びトレース中にその実行を保護する必要がある別のエンティティ（ここでは保護エンティティと呼ぶ）とトレース対象エンティティが相互作用する任意の状況に適用することができる。例えばカーネルモードプロセスと相互作用するユーザモードプロセスをトレースするとき、これらの実施形態の何れも使用することができる（ここではカーネルモードプロセスはエンクレーブと大差なく扱うことができる）。別の例では、ハイパーバイザと相互作用するカーネルモードプロセスをトレースするとき、これらの実施形態の何れも使用することができる（ここではハイパーバイザはエンクレーブと大差なく扱うことができる）。
【０１５７】
[00174]  トレース対象プロセスによって前に読み出されたどの記憶域が、その実行中に保護エンティティによって書き込まれるのかを追跡することが（例えば性能又はセキュリティの考察により）実際的でない、（例えばハードウェアサポートがないことにより）不可能である、又は望ましくない環境があり得る。かかる環境は上記のエンクレーブトレーシングの実施形態の使用を妨げ得る。しかし、これらの状況におけるトレーシングのための技法もある。
【０１５８】
[00175]  第１の技法は、保護エンティティからのコンテキストスイッチ後に無効化されているようにプロセッサキャッシュを扱うことである。無効化されているものとしてプロセッサキャッシュを扱うことは、保護エンティティからのリターン後のトレース対象エンティティによる読み出しに（ログされ得る）キャッシュミスを生じさせる。これらのキャッシュミスは、保護エンティティによってトレース対象エンティティのアドレス空間内で修正され、トレース対象エンティティによって後で読み出された任意の値を含む。この技法は上記で説明した３つの実施形態よりも多くのトレースデータを生成し得るが、トレース対象エンティティによって依拠された保護エンティティの実行の効果を捕捉する。一部の実施形態では、この第１の技法は、保護エンティティからトレース対象エンティティへのリターン時に、（例えばプロセッサレジスタのスナップショットを含む）１つ又は複数のキーフレームを記録することもできる。キーフレームは、トレースデータの連続性が（即ち保護エンティティの実行中に）欠如していても、保護エンティティからのリターン後にトレース対象エンティティの再実行を開始できるようにする。
【０１５９】
[00176]  第２の技法は、トレース対象エンティティのアドレス空間からの保護エンティティによる読み出し、並びにトレース対象エンティティのアドレス空間内に保護エンティティによって行われる書き込みに関係するキャッシュミスをログすることである。このことは、保護エンティティの書き込みを生成した保護エンティティの命令にアクセスする必要なしに、トレースの再実行が保護エンティティの書き込みを再現することを可能にする。このことは、保護エンティティが読み出し、トレース対象エンティティが後でアクセスした（トレース対象エンティティのアドレス空間内の）データへの再実行アクセスも与える。保護エンティティの書き込みを（トレース対象エンティティのアドレス空間内に）ログし得るが、その読み出しは（無効化されたものとしてキャッシュを扱うことによりそれらの読み出しが後でログされる場合）ログしないハイブリッド手法が（ＣＣＰデータ等の十分なブックキーピング情報が利用可能な場合は）可能である。
【０１６０】
[00177]  本発明は、その趣旨又は本質的特性から逸脱することなく他の特定の形式で実施することができる。記載した実施形態はあらゆる点で例示に過ぎず、限定的ではないと解釈すべきである。従って、本発明の範囲は上記の説明ではなく添付の特許請求の範囲によって示す。特許請求の範囲の等価の意味及び範囲に含まれる全ての変更は、特許請求の範囲に包含されるべきである。
【図１】
2020534589.tif 000004
【図２】
2020534589.tif 000005
【図３】
2020534589.tif 000006
【図４Ａ】
2020534589.tif 000007
【図４Ｂ】
2020534589.tif 000008
【図５】
2020534589.tif 000009
【図６Ａ】
2020534589.tif 000010
【図６Ｂ】
2020534589.tif 000011
【図６Ｃ】
2020534589.tif 000012
【図６Ｄ】
2020534589.tif 000013
【図７Ａ】
2020534589.tif 000014
【図７Ｂ】
2020534589.tif 000015
【図７Ｃ】
2020534589.tif 000016
【図８Ａ】
2020534589.tif 000017
【図８Ｂ】
2020534589.tif 000018
【図９Ａ】
2020534589.tif 000019
【図９Ｂ】
2020534589.tif 000020
【図１０Ａ】
2020534589.tif 000021
【図１０Ｂ】
2020534589.tif 000022
【国際調査報告】
2020534589.tif 000023
2020534589.tif 000024
2020534589.tif 000025