(57)【要約】【課題】  データ処理システム（１００）の投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイント（１０３０）を生成するための機構を提供する。【解決手段】  機構は、データ処理システム（１００）内でコードを実行し、コードは、投機的バージョニング・キャッシュ（３１０、１２１０）内のキャッシュ・ラインにアクセスする。さらに機構は、投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイント（１０３０）を生成する必要性を示す第１の条件が発生するかどうかを決定する（１３５０）。チェックポイント（１３１０）は、投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更のロールバックを必要とする第２の条件の発生に応答して、非投機的となる、投機的キャッシュ・ラインである。機構は、第１の条件が発生した旨の決定に応答して、投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイント（１３１０）も生成する。【選択図】  図１２
2013502649.tif 000002
【特許請求の範囲】
【請求項１】
データ処理システム（１００）において、前記データ処理システム（１００）の投機的バージョニング・キャッシュ（３１０）内にチェックポイントを生成するための方法であって、
前記データ処理システム（１００）の少なくとも１つのプロセッサ（１０６、３７０〜３７６、１２７０〜１２７６）によって、前記データ処理システム（１００）内でコードを実行することであって、前記コードは前記投機的バージョニング・キャッシュ（３１０、１２１０）内のキャッシュ・ラインにアクセスする、実行すること、
前記データ処理システム（１００）によって、前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイント（１０３０）を生成する必要性を示す第１の条件が発生するかどうかを決定することであって、前記チェックポイント（１０３０）は、第２の条件の発生に応答して１つまたは複数の投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更を無効化するためのロールバック動作を実行するための状態情報を格納する、１つまたは複数の投機的キャッシュ・ラインである、決定すること（１３５０）、および
前記第１の条件が発生した旨の決定に応答して、前記投機的バージョニング・キャッシュ（３１０、１２１０）内に前記チェックポイント（１０３０）を生成すること（１３７０）、
を含む、方法。
【請求項２】
前記データ処理システム（１００）内に、前記投機的バージョニング・キャッシュ（３１０、１２１０）に関連付けられた１つまたは複数のバージョン・プレッシャしきい値を格納することをさらに含み、前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイント（１０３０）を生成する必要性を示す第１の条件が発生するかどうかを決定することが、前記コードの実行中に、前記投機的バージョニング・キャッシュ（３１０、１２１０）のバージョン・プレッシャが前記１つまたは複数のバージョン・プレッシャしきい値（１３４０）に一致するかまたはこれを超えるか否かを決定することを含む、請求項１に記載の方法。
【請求項３】
前記１つまたは複数のバージョン・プレッシャしきい値（１３４０）が、投機的バージョニング・キャッシュ・レベル、関連付けられたキャッシュ・ライン・セット・レベル、および個々のスレッド・レベルのうちの１つでの、１つまたは複数のしきい値を含む、請求項２に記載の方法。
【請求項４】
前記投機的バージョニング・キャッシュ（３１０、１２１０）が、読み取り／ロード動作に関連付けられた非投機的キャッシュ・ラインを格納するための第１の部分と、書き込み／ストア動作に関連付けられた投機的キャッシュ・ラインを格納するための第２の部分とを含む、請求項１に記載の方法。
【請求項５】
前記第２の部分が、前記投機的バージョニング・キャッシュ（３１０、１２１０）の総容量に基づく最大サイズ制限を有し、前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイントを生成する（１３５０）必要性を示す第１の条件が発生するかどうかを決定することが、前記投機的バージョニング・キャッシュ（３１０、１２１０）の前記第２の部分内のキャッシュ・ラインの数が、前記最大サイズ制限に基づくバージョン・プレッシャしきい値に一致するかまたはこれを超えるか否かを決定することを含む、請求項４に記載の方法。
【請求項６】
前記第２の条件が、前記投機的バージョニング・キャッシュ（３１０、１２１０）内のキャッシュに入れられたデータ内でのソフト・エラーの検出である、請求項１に記載の方法。
【請求項７】
前記投機的バージョニング・キャッシュ（３１０、１２１０）のバージョン・プレッシャが前記１つまたは複数のバージョン・プレッシャしきい値に一致するかまたはこれを超えるか否かを決定することが、前記投機的バージョニング・キャッシュ（３１０、１２１０）に関連付けられた１つまたはグローバル・バージョン・プレッシャ・モジュール（３２０、４０５、１２２０）またはスレッド・バージョン・プレッシャ・モジュール（３３０〜３３６、４６０〜４６２、１２３０〜１２３６）によって実行される、請求項２に記載の方法。
【請求項８】
前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイントを生成すること（１３７０）が、
前記第１の条件が発生した旨の決定に応答して、前記オペレーティング・システムに対する割り込みを生成すること（１３６０）、および
前記オペレーティング・システムによって、前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインを非投機的状態に進行させるため（１４２０）に割り込みハンドラを開始すること、および前記投機的バージョニング・キャッシュ内での前記チェックポイントの作成（１３７０、１４３０）を開始すること、
を含む、請求項１に記載の方法。
【請求項９】
前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインを進行させることが、前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインに関連付けられたバージョン識別子を非投機的としてラベル付けすること、および、対応するキャッシュ・ラインの以前の非投機的バージョンを無効化することを含む、請求項８に記載の方法。
【請求項１０】
前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイントを生成する必要性を示す第１の条件が発生するかどうかを決定すること（１３５０）が、コードの実行が前記コードの再生不可部分（１０２０）を入力するかどうかを決定することを含み、前記コードの実行が前記コードの再生不可部分（１０２０）を入力する旨の決定に応答して、前記チェックポイントを生成すること（１０３０、１３７０）を含む、請求項１に記載の方法。
【請求項１１】
前記再生不可コード（１０２０）が、入力または出力動作、ファイルへの読み取りまたは書き込み、ネットワークを介したメッセージの送信または受信、他のスレッドとのデータの共有、またはリソース上のロックへのアクセスのうちの、１つを実行するコードである、請求項１０に記載の方法。
【請求項１２】
前記第１の条件が発生した旨の決定に応答して、前記投機的バージョニング・キャッシュ内に前記チェックポイントを生成すること（１３７０）が、
１つまたは複数の第１のコンパイラが、前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインを非投機的状態に進行させるために第１の割り込み（１１１０）を生成させる命令の挿入を、前記再生不可コードに先立って実行すること、および
１つまたは複数の第２のコンパイラが、前記再生不可コードの実行後に（１０３０）前記チェックポイント（１０３０）を生成するために、第２の割り込み（１１２０）を生成させる命令の挿入を、前記再生不可コードの後に実行すること、
を含む、請求項１０に記載の方法。
【請求項１３】
前記チェックポイントを生成することが、
新しいバージョン識別子（ＶＩＤ）を生成すること、
前記新しいＶＩＤを、前記コードを実行する部分として実行している現行のスレッドと関連付けること、および
前記投機的バージョニング・キャッシュへの後続のストア時に、前記現行のスレッドによって前記新しいＶＩＤを使用すること、
を含む、請求項１に記載の方法。
【請求項１４】
前記投機的バージョニング・キャッシュへの後続のストア時に前記新しいＶＩＤを使用することが、
前記現行スレッドのストア動作が、結果として前記投機的バージョニング・キャッシュ内のキャッシュ・ヒットを生じさせるかどうかを決定すること、
キャッシュ・ヒットに応答して、前記ストア動作による前記キャッシュ・ライン・ヒットが前記新しいＶＩＤに関連付けられるかどうかをチェックすること、および、
前記ストア動作による前記キャッシュ・ライン・ヒットが前記新しいＶＩＤに関連付けられていないことに応答して、前記ストア動作による前記キャッシュ・ライン・ヒットを新しい投機的キャッシュ・ラインにコピーすること、前記新しいＶＩＤを前記新しい投機的キャッシュ・ラインに関連付けること、および、前記新しい投機的キャッシュ・ラインに対して前記ストア動作を実行すること、
を含む、請求項１３に記載の方法。
【請求項１５】
前記チェックポイント（１０３０）を生成することが、第１の状態情報を前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインに格納すること、および、第２の状態情報を前記データ処理システム（１００）の１つまたは複数のバッファに格納すること（１４４０）を含む、請求項１に記載の方法。
【請求項１６】
前記第１の状態情報が、前記投機的キャッシュ・ラインに対応する非投機的キャッシュ・ラインの非投機的状態情報であり、前記第２の状態情報が、プログラム・カウンタの状態、プログラム・レジスタの状態、またはシステム・レジスタの状態のうちの、１つまたは複数を含む、請求項１５に記載の方法。
【請求項１７】
前記第２の条件が前記コードの実行中に発生するかどうかを決定すること（１５１０）、
前記第２の条件が前記コードの再生不可部分の実行中に発生したかどうかを決定すること（１５２０）、および
前記第２の条件が前記コードの前記再生不可部分の実行中に発生しないことに応答して前記投機的キャッシュ・ラインに対応する前記キャッシュ・ラインへの変更を、前記チェックポイントに対応する状態にロールバックすること（１５６０）、
をさらに含む、請求項１に記載の方法。
【請求項１８】
前記第２の条件が前記コードの前記再生不可部分の実行中に発生した旨の決定に応答して、回復不能エラーを示す通知または割り込みを生成すること（１５３０）、
をさらに含む、請求項１７に記載の方法。
【請求項１９】
コンピュータ読み取り可能プログラムがその上に記録されたコンピュータ記録可能媒体を備えるコンピュータ・プログラムであって、前記コンピュータ読み取り可能プログラムは、データ処理システム上で実行された場合、
前記データ処理システム内でコードを実行することであって、前記コードが前記データ処理システムの投機的バージョニング・キャッシュ内のキャッシュ・ラインにアクセスする、実行すること、
前記投機的バージョニング・キャッシュ内にチェックポイントを生成する必要性を示す第１の条件が発生するかどうかを決定することであって、前記チェックポイントは、第２の条件の発生に応答して１つまたは複数の投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更を無効化するためのロールバック動作を実行するための状態情報を格納する、１つまたは複数の投機的キャッシュ・ラインである、決定すること、および
前記第１の条件が発生した旨の決定に応答して、前記投機的バージョニング・キャッシュ内に前記チェックポイントを生成すること、
を前記データ処理システムに実行させる、コンピュータ・プログラム。
【請求項２０】
１つまたは複数のプロセッサであって、各プロセッサは、前記プロセッサのハードウェア内に実装された、少なくとも１つのスレッド・レベル・バージョニング・キャッシュ・モジュールを有する、１つまたは複数のプロセッサと、
前記１つまたは複数のプロセッサに結合された投機的バージョニング・キャッシュ・ストレージ・デバイスと、
前記投機的バージョニング・キャッシュ・ストレージ・デバイスに結合されたハードウェア実装グローバル・バージョニング・キャッシュ・モジュールと、
を備え、
前記１つまたは複数のプロセッサは、前記投機的バージョニング・キャッシュ・ストレージ・デバイス内のキャッシュ・ラインにアクセスするコードを実行するように構成され、
前記ハードウェア実装グローバル・バージョニング・キャッシュ・モジュール、または前記少なくとも１つのスレッド・レベル・バージョニング・キャッシュ・モジュールのうちの少なくとも１つは、前記投機的バージョニング・キャッシュ内にチェックポイントを生成する必要性を示す第１の条件が発生するかどうかを決定するように構成され、前記チェックポイントは、第２の条件の発生に応答して１つまたは複数の投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更を無効化するためのロールバック動作を実行するための状態情報を格納する、１つまたは複数の投機的キャッシュ・ラインであり、
前記投機的バージョニング・キャッシュ・ストレージ・デバイスは、前記第１の条件が発生した旨の決定に応答して前記チェックポイントを格納するように構成された、
データ処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、米国エネルギー省によって認定された契約第Ｂ５５４３３１号の下で米国政府の支援により作成された。米国政府は本発明における一定の権利を有する。
【０００２】
本発明は、一般に改良型データ処理装置および方法に関し、より具体的に言えば、投機的バージョニング・キャッシュ（speculative versioning cache）におけるチェックポインティング（checkpointing）の実行に関し、いくつかの実施形態では、こうした投機的バージョニング・キャッシュのためのバージョン・プレッシャ・フィードバック（version pressure feedback）機構に基づくこうしたチェックポインティングの実行に関する。
【背景技術】
【０００３】
投機的バージョニング・キャッシュとは、マルチスレッディング・データ処理環境においてスレッドの投機的実行を可能にするために、キャッシュ・ラインの複数のバージョンを格納することが可能なキャッシュ・メモリ構造である。スレッドの投機的実行とは、その結果が後に必要であるかまたは必要でない可能性のある、スレッドの初期の実行が行われる際に、コードの実行中にスレッドの結果が必要な場合、すなわち、投機的状態から結果が使用される非投機的状態へとスレッドが移行される場合に、より優れた性能を達成するように使用される、最適化技法である。投機的バージョニング・キャッシュとは、典型的なキャッシュの拡張であり、投機的バージョニング・キャッシュは、それを作成したハードウェア・スレッドのみがアクセス可能なデータを保持することが可能である。修正されたすべての注釈付きキャッシュ・ラインは、特別なコマンド（Abort）を使用してアトミックに廃棄すること、または他のコマンド（Commit）を使用して他のスレッドに対してアーキテクチャ的に可視とすることができる。
【０００４】
ハードウェア・スレッドによって作成されたデータは、モードに応じて、投機的タスクを実行しながら、論理的後続タスクに対応するタスクを実行している他のスレッドによってもアクセス可能である。したがって投機的バージョニングは、ある逐次プログラム・セマンティクスを保証するために、メモリ位置の複数のバッファリングされたバージョンの中でプログラム順を追跡する必要がある。第１に、ロードは、同じメモリ位置への最も新しいストアによって作成された値を最終的に読み取らなければならない。これには、ストア以前に実行し、前のバージョンを不正に読み取った場合、そのロードがスカッシュ（squash）され、再実行される必要がある。さらにこれには、ロードにプログラム順に追従する同じメモリ位置へのすべてのストアを、ロードが実行されるまでバッファリングする必要がある。第２にメモリ位置は、バージョンの作成順に関係なく、最終的にデータの正しいバージョンを有するものでなければならない。したがって、ある位置の投機的バージョンを、プログラム順にアーキテクチャ・ストレージにコミットしなければならない。
【０００５】
投機的バージョニング・キャッシュは、投機的スレッドに関連してキャッシュ・ラインの投機的バージョンを格納するための機能を提供することによって、投機的マルチスレッディングをサポートする。投機的バージョニング・キャッシュの一例は、Ｇｏｐａｌ等の１９９８年１月３１日から２月４日の「Speculative Versioning Cache」、Proceedings of the 4th InternationalSymposium on High-Performance Computer Architecture、１９５ページに記載されている。投機的バージョニング・キャッシュのこの例では、システムがスヌーピング（snooping）・バス・ベースのキャッシュ・コヒーレント対称型マルチプロセッサ（ＳＭＰ）と同様に編成された、各プロセッサにプライベート・キャッシュが提供される。プライベート・キャッシュ内でヒットするメモリ参照は、ＳＭＰ内のようにバスを使用しない。タスク・コミットは、投機的バージョンをひとまとめに書き戻ししない。各キャッシュ・ラインは、次回アクセスされた場合、個別に処理される。
【０００６】
Ｇｏｐａｌ等に記載された投機的バージョニング・キャッシュでは、プログラムは、動的命令ストリーム内でそれらの順序に対応するシーケンスを形成するタスクと呼ばれる断片に区分される。より高レベルな制御ユニットは、シーケンス内の次のタスクを予測し、これを実行のために空きプロセッサに割り当てる。各プロセッサは割り当てられたタスク内の命令を実行し、タスクによって作成された投機的状態をそのプライベート・キャッシュ内にバッファリングする。タスクの誤予測が検出された場合、不正に予測されたタスクを含むそれ以降のシーケンス内のすべてのタスクの投機的状態は無効化され、対応するプロセッサが解放される。これがタスク・スカッシュと呼ばれる。その後、シーケンス内の正しいタスクは実行のために割り当てられる。タスク予測は有効化されている場合、投機的バッファリング状態をアーキテクチャ・ストレージ、たとえばデータ・キャッシュにコピーすることによってコミットする。タスクはプログラム順に１つずつコミットする。タスクがコミットすると、そのプロセッサは新しいタスクを実行するために解放される。タスクはプログラム順にコミットするため、タスクはプログラム順にプロセッサに割り当てられる。
【０００７】
タスクはアドレスが使用可能となるとすぐに、シーケンス内の前のタスクからのストアが同じ位置に書き込まないものと推測して、ロードを実行する。その位置の直前のバージョンがロードに供給される。前のタスクからのバージョンが供給されたロードは、潜在的定義以前の使用を示すために記録される。たとえば前のタスクからの同じ位置へのストアなどの定義が発生した場合、ロードには不正なバージョンが供給され、メモリ依存は侵害されている。
【０００８】
タスクがメモリ位置へのストアを実行した場合、シーケンス内のその後のすべてのアクティブ・タスクに送られる。タスクが前のタスクから位置の新しいバージョンを受け取った場合、その位置に関する定義以前の使用が記録される、すなわちメモリ依存の侵害が検出されると、スカッシュする。スカッシュされたタスク後のすべてのタスクも、タスクの誤予測と同様にスカッシュされる。
【０００９】
最も古いアクティブ・タスクは非投機的であり、その投機的メモリ状態、すなわちこのタスクからのストアによって作成されたバージョンをアーキテクチャ・ストレージにコミットすることができる。バージョンのコミットには、投機的バッファからのバージョンをアーキテクチャ・ストレージ、たとえばデータ・キャッシュに論理的にコピーすることが含まれる。タスクがスカッシュされた場合、タスクに関連付けられた投機的状態は無効化され、アーキテクチャ・ストレージにコミットされない。
【００１０】
様々なプロセッサのプライベート・キャッシュがまとまって、投機的バージョニング・キャッシュを構成する。プライベート・キャッシュの各キャッシュ・ラインは、キャッシュに入れられるデータを識別するアドレス・タグ（Tag）と、キャッシュ・ラインが有効か否かを識別する有効ビット（Ｖ）と、キャッシュ・ラインへのストアが発生したか否かを識別する汚染ビット（dirty bit）（Ｓ）と、データそれ自体と、キャッシュ・ラインへのストアが発生する前にタスクがキャッシュ・ラインからロードするかどうかを識別するロード・ビット（Ｌ）と、キャッシュ・ラインに関するバージョン順序付けリスト（ＶＯＬ）があればその中に次のコピー／バージョンを有するプロセッサ（またはＬ１キャッシュ）を識別するポインタ（Pointer）と、データそれ自体（Data）とを、格納する。
【００１１】
投機的バージョニング・キャッシュは、ＶＯＬを使用して投機的バージョニングにサポートを提供する、バージョン制御論理（ＶＣＬ）と呼ばれる組み合わせ論理を使用する。プロセッサのプライベート・キャッシュ内でヒットするプロセッサ要求は、ＶＯＬを参考にする必要がない。キャッシュ・ミスは、プライベート・キャッシュによってスヌーピングされるバス要求を発行する。各プライベート・キャッシュおよびＶＯＬ内で要求されたキャッシュ・ラインの状態がＶＣＬに供給される。ＶＣＬはバス要求、タスク内のプログラム順、およびＶＯＬを使用して、各キャッシュについて適切な応答を計算する。各キャッシュ・ラインは、その初期状態、バス要求、およびＶＣＬ応答に基づいて更新される。
【００１２】
マルチスレッディング・データ処理環境におけるスレッドの投機的実行により、スレッドは、たとえば、第１のスレッドがメモリ位置の読み取りを実行し、続いて、第１のスレッドよりも若い第２のスレッドが同じメモリ位置の書き込みを実行するか、あるいは、２つまたはそれ以上のスレッドがキャッシュまたはメモリ内のデータの同じ部分の状態を修正するよう試みる競合に遭遇するなど、２つまたはそれ以上のスレッド間に依存侵害が存在するまで実行可能である。典型的には、この時点で、スレッドのうちの１つがその状態を持続可能であり、他のスレッドはスカッシュされなければならず、すなわち、持続されていないスレッドによって実行されたすべての作業はロールバックまたはアボートされる。
【先行技術文献】
【非特許文献】
【００１３】
【非特許文献１】Ｇｏｐａｌ等の１９９８年１月３１日から２月４日の「Speculative Versioning Cache」、Proceedings of the 4th InternationalSymposium on High-Performance Computer Architecture、１９５ページ
【発明の概要】
【発明が解決しようとする課題】
【００１４】
こうしたスレッドのスカッシュは、結果的に所与の投機的スレッドによって実行されたすべての作業、および、おそらくは任意の後続の投機的スレッドによって実行されたすべての作業も同様に、取り消すことになるため、典型的なキャッシュ・ミスよりも大幅に費用がかかる。
【課題を解決するための手段】
【００１５】
例示的一実施形態では、データ処理システムにおいて、データ処理システムの投機的バージョニング・キャッシュ内にチェックポイントを生成するための方法が提供される。この方法は、データ処理システムの少なくとも１つのプロセッサによって、データ処理システム内でコードを実行することを含み、このコードは投機的バージョニング・キャッシュ内のキャッシュ・ラインにアクセスする。この方法は、データ処理システムによって、投機的バージョニング・キャッシュ内にチェックポイントを生成する必要性を示す第１の条件が発生するかどうかを決定することをさらに含む。チェックポイントは、投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更のロールバックを必要とする第２の条件の発生に応答して非投機的となる、投機的キャッシュ・ラインである。この方法は、第１の条件が発生した旨の決定に応答して、投機的バージョニング・キャッシュ内にチェックポイントを生成することもさらに含む。
【００１６】
他の例示的諸実施形態では、コンピュータ読み取り可能プログラムが記録されたコンピュータ記録可能媒体を備える、コンピュータ・プログラム製品が提供される。コンピュータ読み取り可能プログラムは、データ処理システム上で実行された場合、方法実施形態に関して上記で概説した様々な諸動作、およびそれらの組み合わせを、データ処理システムに実行させる。
【００１７】
さらに他の例示的実施形態では、１つまたは複数のプロセッサと、１つまたは複数のプロセッサに結合された投機的バージョニング・キャッシュ・ストレージ・デバイスと、投機的バージョニング・キャッシュ・ストレージ・デバイスに結合されたハードウェア実装グローバル・バージョニング・キャッシュ・モジュールとを備える、データ処理システム／装置が提供される。各プロセッサは、プロセッサのハードウェア内に実装された、少なくとも１つのスレッド・レベル・バージョニング・キャッシュ・モジュールを有する。１つまたは複数のプロセッサは、投機的バージョニング・キャッシュ・ストレージ・デバイス内のキャッシュ・ラインにアクセスするコードを実行する。ハードウェア実装グローバル・バージョニング・キャッシュ・モジュールまたは少なくとも１つのスレッド・レベル・バージョニング・キャッシュ・モジュールのうちの少なくとも１つは、投機的バージョニング・キャッシュ内にチェックポイントを生成する必要性を示す第１の条件が発生するかどうかを決定する。チェックポイントは、投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更のロールバックを必要とする第２の条件の発生に応答して非投機的となる、投機的キャッシュ・ラインである。１つまたは複数のプロセッサのうちの１つでコードを実行することで、第１の条件が発生した旨の決定に応答して、投機的バージョニング・キャッシュ・ストレージ・デバイス内にチェックポイントを生成する。
【００１８】
本発明のこれらおよび他の特徴および利点は、本発明の例示的諸実施形態についての以下の詳細な説明で説明されるか、またはそれらの説明に鑑みて当業者にとって明らかとなろう。
【００１９】
本発明、ならびにそれらの好ましい使用方法および他の目的および利点は、例示的諸実施形態の以下の詳細な説明を参照することにより、添付の図面と併せて読んだ場合に、最もよく理解されよう。
【図面の簡単な説明】
【００２０】
【図１】例示的諸実施形態が内部に実装可能なデータ処理システムを示す例示的ブロック図である。
【図２】例示的諸実施形態の諸態様が内部に実装可能な、機能ユニットおよびレジスタを示す従来の２重スレッド型プロセッサ設計を示す例示的ブロック図である。
【図３】例示的一実施形態の１次演算要素を示す例示的ブロック図である。
【図４】例示的一実施形態に従った、ロー・バージョン・プレッシャ・データに基づく有意なバージョン・プレッシャ統計の生成を示す例示的図である。
【図５】例示的一実施形態に従った、バージョン・プレッシャに対処するためのスレッド・スロットリング動作を示す、コードの例示的部分を示す図である。
【図６】例示的一実施形態に従った、バージョン・プレッシャに対処するための作業負荷スロットリング動作を示す、コードの例示的部分を示す図である。
【図７】例示的一実施形態に従った、バージョン・プレッシャに対処するためのアイドリング・スレッド動作を示す、コードの例示的部分を示す図である。
【図８】例示的一実施形態に従った、バージョン・プレッシャに対処するためのトランザクション集約動作を示す、例示的図である。
【図９】例示的一実施形態に従った、データ処理システムの動作を調整するためにバージョン・プレッシャ・フィードバックを使用するための例示的動作の概略を示す流れ図である。
【図１０】例示的一実施形態に従った、投機的バージョニング・キャッシュ・チェックポイント機構の動作を示す例示的図である。
【図１１】例示的一実施形態に従った、ソフト・エラーの発生に関して、投機的バージョン・キャッシュ・チェックポインティング機構を示す例示的図である。
【図１２】１つまたは複数のバージョン・プレッシャしきい値に一致するかまたはこれを超えたことに応答して割り込みが生成される、例示的一実施形態に従ったバージョン・プレッシャ・モジュールを示す例示的図である。
【図１３】例示的一実施形態に従った、１つまたは複数のバージョン・プレッシャしきい値に一致するかまたはこれを超えたことに応答して割り込みを生成するための例示的動作を示す概略的流れ図である。
【図１４】例示的一実施形態に従った、チェックポイントを生成するための例示的動作を示す概略的流れ図である。
【図１５】例示的一実施形態に従った、ロールバック動作を実行するための例示的動作を示す概略的流れ図である。
【発明を実施するための形態】
【００２１】
例示的諸実施形態は、投機的バージョニング・キャッシュ（ＳＶＣ）内のバージョン・プレッシャを決定するための機構、および、投機的バージョニング・キャッシュの最適な性能を達成するためにバージョン・プレッシャを増加／減少するように、コードが実行される方法で変更に影響を与えるためにそのバージョン・プレッシャ情報を使用するための機構を提供する。加えて、さらに例示的諸実施形態は、必要な場合に修正をロールバックする目的で、チェックポインティング情報を格納するために投機的バージョニング・キャッシュを使用するための機構を提供する。さらに例示的諸実施形態は、投機的状態を非投機的状態へと進行させて新しいチェックポイントを生成する時点を決定するためのチェックポインティング情報のために、バージョン・プレッシャ情報および最大容量情報を使用するための機構を提供する。
【００２２】
前述のように、投機的バージョニング・キャッシュ（ＳＶＣ）では、複数バージョンのキャッシュ・ラインがＳＶＣ内に保持される。ＳＶＣキャッシュは、所与の数のキャッシュ・ライン・セットで編成され、各キャッシュ・ライン・セットは所与の数のキャッシュ・ラインを有する（結合数（associativity number））。メモリ要求を処理する場合、アドレスを使用して、このアドレスがどのキャッシュ・ラインに属するかが決定される。キャッシュ・ライン・セットが決定されると、キャッシュは、決定されたキャッシュ・ライン・セット内に所与のアドレスに関連付けられたキャッシュ・ラインが存在するか否かを決定する。これを実行するために、キャッシュは、タグ（すなわち、現在キャッシュ・ライン・セットに対応するアドレスおよびバージョンを示すメタ情報）にアクセスし、キャッシュ・ヒット（正しいアドレスおよびバージョンが存在している）またはキャッシュ・ミス（このキャッシュ・ライン・セット内には要求されたアドレス／バージョンに対応するキャッシュ・ラインが存在しない）が発生するかどうかを決定する。
【００２３】
投機的バージョニング・キャッシュ（ＳＶＣ）では、たとえば依存性侵害などのアクセス侵害が存在する場合、スレッドまたはトランザクションがスカッシュされ、結果として大幅なオーバヘッド・コストが生じる可能性がある。加えて、競合ミスによってスレッドがスカッシュされる可能性もある。競合ミスは、現行バージョンのキャッシュ・ラインすべてに対してＳＶＣ内に十分なストレージがない場合に発生する。ＳＶＣの場合、通常のキャッシュ構造とは異なり、投機的状態を伴うキャッシュ・ラインが、通常、たとえばデータ・キャッシュまたはメイン・メモリなどのアーキテクチャ・ストレージ内に戻されないため、ＳＶＣから排除できないという事実によって、競合ミスの可能性は増加する。したがって、他の投機的スレッドに追加のストレージ・スペースを提供するためなどのように、投機的状態を伴うキャッシュ・ラインを排除しなければならない場合、排除される投機的状態のキャッシュ・ラインに関連付けられた投機的スレッドをスカッシュしなければならない。さらに、スレッドがスカッシュされる場合、典型的にはすべての子スレッドもスカッシュされる。子スレッドは、オリジナルのプログラム順で論理的に現行スレッドのタスクの後にあるタスクを実行しているスレッドに対応する。スレッドおよび子スレッドのスカッシュでは、競合ミスが存在する場合、有益な結果がまったく発生しないリソースの利用、およびスカッシュされたスレッドの再開の必要性によって、大幅なオーバヘッド・コストが発生する可能性がある。
【００２４】
競合ミス発生の可能性は、データ処理システム内で実行されているスレッドの数と共に増加する。さらに、「ホット・スポット」特性、すなわちしばしば実行されるアプリケーションの部分、を有するアプリケーションは、こうしたホット・スポットが、ＳＶＣ内で維持する必要があるこれらのホット・スポットのためのキャッシュ・ラインのバージョン数を増加させることから、競合ミスの可能性が大幅に上昇する可能性がある。多数のキャッシュ・ライン・セットが存在する場合、ホット・スポットが存在しなければ、均一分散を利用するメモリ・アクセスは多数のキャッシュ・セット内で分散されることになり、キャッシュの各キャッシュ・ライン・セット内の所与の数のキャッシュ・ラインに対して競合する投機的メモリ要求の数が減少するため、競合ミスの可能性は低下する場合がある。加えて、キャッシュがより高度な結合性で編成される場合、高結合性キャッシュは各キャッシュ・ライン・セット内により多くのキャッシュ・ラインを提供するため、競合ミスの可能性は低下することになる。したがって、各キャッシュ・ライン・セットはより多くの投機的バージョンに対処できることになる。
【００２５】
ソフトウェアは投機のレベルを制御することができる一方で、同時に、競合ミス状況がどの程度発生する可能性があるかを知るためのソフトウェアにとって効果的な機構は存在しない。言い換えれば、コンパイラ、オペレーティング・システム、またはランタイム環境などのソフトウェア機構は、投機的バージョニング・キャッシュによって経験する「バージョン・プレッシャ」を評価することはできない。この説明との関連において、「バージョン・プレッシャ」という用語は、投機的バージョニング・キャッシュが、データ処理システム内のスレッドの投機的実行をサポートするために必要な様々なバージョンのキャッシュ・ラインすべてを格納するために、十分なストレージ・スペースを有することのない可能性を言い表すものである。
【００２６】
たとえば、１６のセット結合性を伴う投機的バージョニング・キャッシュ内の所与のキャッシュ・ライン・セットＸの場合、キャッシュ・ライン・セットＸ内に存在する１６のキャッシュ・ライン内に投機的キャッシュ・ラインが存在しなければ、バージョン・プレッシャはｎｕｌｌということになる。しかしながら、キャッシュ・ライン・セットＸ内の１６のキャッシュ・ライン内に１５の投機的ラインが存在する場合、バージョン・プレッシャが非常に高いということになる。したがって、「バージョン・プレッシャ」という用語は、所与のキャッシュ・ライン・セット、または拡大解釈すれば投機的バージョニング・キャッシュ全体における、投機的キャッシュ・ラインの割合に対する計量的比例に対応する。
【００２７】
例示的諸実施形態は、投機的バージョニング・キャッシュに対してバージョン・プレッシャ・フィードバックを与えるための機構を提供する。例示的一実施形態では、スレッドごと、またはキャッシュ・バージョン・プレッシャ・モジュールごとに、プレッシャ・フィードバック情報を生成するため、および、ソフトウェア機構が適宜反応できるように、こうしたプレッシャ・フィードバック情報を、コンパイラ、オペレーティング・システム、ランタイム環境などのソフトウェア機構に対して提供するための、ハードウェア機構が提供される。ソフトウェア機構は、いくつかの異なる方法のいずれかで反応することができる。たとえばソフトウェア機構は、プレッシャ・フィードバック情報に基づいて、アクティブ・スレッドの数を制御すること、全体にまたがるスレッド内の作業量を制御すること、またはトランザクションの持続時間を制御することが可能である。トランザクションとは、変更がアトミックに発生しなければならない、すなわち、すべての変更が発生するかまたは変更がまったく発生しないかのいずれかである、タスクのことである。トランザクション・モデルでは、変更が発生可能であるかどうかの決定は、他のタスクあるいはトランザクションまたはその両方が、このタスクによってアクセスされる同じデータのうちのいずれかに接触（touch）したかどうかに依存する。他のタスクあるいはトランザクションまたはその両方が、所与のトランザクションに関連付けられたデータに接触しなかった場合、トランザクションの変更は非投機的状態で反映されることが可能である。データの一部に接触した他のタスクあるいはトランザクションまたはその両方の一部が、所与のトランザクションにも接触した場合、所与のトランザクションは失敗する可能性があるか、または同じデータの一部に接触した他のトランザクションは失敗することになる。トランザクションの失敗によって実行された変更は、非投機的状態でコミットすることを許可してはならない。
【００２８】
例示的諸実施形態の基本的な機構では、データ処理システムの各スレッドは関連付けられたスレッド・バージョン・プレッシャ・モジュールを有する。さらに投機的バージョニング・キャッシュは、関連付けられたグローバル・バージョン・プレッシャ・モジュールを有する。グローバル・バージョン・プレッシャ・モジュールは、キャッシュ・ラインのセット、すなわち、投機的バージョン・キャッシュ内に存在する同じキャッシュ・ラインの異なるバージョンのセットに関して、バージョン・プレッシャ情報を維持し、これを更新する。こうしたバージョン・プレッシャ情報は、キャッシュ・ライン・ミスまたはキャッシュ・ライン置換動作に応答して更新される。その後、キャッシュ・ライン・セットに関する情報は、スレッドの要求に応答してあるバージョンのキャッシュ・ラインから戻されたデータと共に、グローバル・バージョン・プレッシャ・モジュールから、個々のスレッドの個々のスレッド・プレッシャ・バージョン・モジュールへと伝搬される。したがって、個々のスレッドの関連付けられたバージョン・プレッシャ・モジュールは、特定のスレッドによってアクセスされる特定のキャッシュ・ライン・セットに関するバージョン・プレッシャ情報を受け取る。ソフトウェア機構は、個々のスレッド・バージョン・プレッシャ・モジュール内で維持されるバージョン・プレッシャ情報に基づき、個々のスレッドそれぞれについて、前述のスレッドの実行に対する様々な修正のうちの１つまたは複数を実行することができる。
【００２９】
当業者であれば理解されるように、本発明は、システム、方法、またはコンピュータ・プログラム製品として具体化することができる。したがって、本発明の様々な態様および特徴は、完全なハードウェア実施形態、完全なソフトウェア実施形態（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）、あるいは、本明細書ではすべてが全体として「回路」、「モジュール」、または「システム」と呼ばれることのあるソフトウェア態様およびハードウェア態様を組み合わせた実施形態の、形を取ることができる。さらに本発明の様々な態様および特徴は、媒体内で具体化されるコンピュータ使用可能プログラム・コードを有する表現の任意の有形媒体内で具体化される、コンピュータ・プログラム製品の形を取ることができる。
【００３０】
１つまたは複数のコンピュータ使用可能媒体またはコンピュータ読み取り可能媒体の、任意の組み合わせが使用可能である。コンピュータ使用可能媒体またはコンピュータ読み取り可能媒体は、たとえば電子、磁気、光、電磁、赤外線、または半導体のシステム、装置、デバイス、または伝搬媒体とすることが可能であるが、これらに限定されるものではない。コンピュータ読み取り可能媒体のより具体的な例（非網羅的リスト）には、１本または複数本の線を有する電気的接続、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、読み取り専用メモリ（ＲＯＭ）、消去可能プログラマブル読み取り専用メモリ（ＥＰＲＯＭまたはＦｌａｓｈ（Ｒ）メモリ）、光ファイバ、ポータブル・コンパクト・ディスク読み取り専用メモリ（ＣＤＲＯＭ）、光ストレージ・デバイス、インターネットまたはイントラネットをサポートするような伝送媒体、あるいは磁気ストレージ・デバイスが含まれる。コンピュータ使用可能媒体またはコンピュータ読み取り可能媒体は、プログラムが、たとえば紙または他の媒体の光学スキャンを介して電子的に取り込まれ、その後コンパイル、解釈、または必要であれば好適なその他の方法で処理され、その後コンピュータ・メモリに格納されることが可能である場合、プログラムがその上に印刷される紙または他の好適な媒体とすることさえも可能であることに留意されたい。本明細書との関連において、コンピュータ使用可能媒体またはコンピュータ読み取り可能媒体は、命令実行のシステム、装置、またはデバイスによって、またはこれらに関連して使用するためのプログラムを、包含、格納、通信、伝搬、または移送することが可能な、任意の媒体とすることができる。コンピュータ使用可能媒体は、ベースバンド内に、または搬送波の一部として、具体化されたコンピュータ使用可能プログラム・コードを備える、伝搬データ信号を含むことができる。コンピュータ使用可能プログラム・コードは、無線、有線、光ファイバ・ケーブル、無線周波数（ＲＦ）などを含むがこれらに限定されない、任意の適切な媒体を使用して伝送することができる。
【００３１】
本発明の諸動作を実行するためのコンピュータ・プログラム・コードは、Ｊａｖａ（ＴＭ）、Ｓｍａｌｌｔａｌｋ（ＴＭ）、Ｃ＋＋などのオブジェクト指向プログラミング言語、および、「Ｃ」プログラミング言語または同様のプログラミング言語などの従来の手続き型プログラミング言語を含む、任意の組み合わせの１つまたは複数のプログラミング言語で作成することができる。プログラム・コードは、全体的にユーザのコンピュータ上で、部分的にユーザのコンピュータ上で、スタンドアロン型ソフトウェア・パッケージとして、部分的にユーザのコンピュータ上および部分的にリモート・コンピュータ上で、あるいは、全体的にリモート・コンピュータまたはサーバ上で、実行することができる。後者のシナリオでは、リモート・コンピュータを、ローカル・エリア・ネットワーク（ＬＡＮ）またはワイド・エリア・ネットワーク（ＷＡＮ）を含む任意のタイプのネットワークを介してユーザのコンピュータに接続することができるか、あるいは、外部コンピュータとの接続を（たとえば、インターネット・サービス・プロバイダを使用してインターネットを介して）実行することができる。加えて、プログラム・コードは、サーバまたはリモート・コンピュータ上のコンピュータ読み取り可能ストレージ媒体上で具体化すること、および、ストレージあるいは実行またはその両方のために、ネットワークを介してリモート・コンピュータまたはユーザのコンピュータのコンピュータ読み取り可能ストレージ媒体へダウンロードすることができる。さらに、コンピューティング・システムまたはデータ処理システムのうちのいずれかが、リモートのコンピューティング・システムまたはデータ処理システムからネットワークを介してプログラム・コードをダウンロードした後、プログラム・コードをコンピュータ読み取り可能ストレージ媒体内に格納することができる。
【００３２】
以下で、本発明の例示的諸実施形態に従った方法、装置（システム）、およびコンピュータ・プログラム製品の流れ図あるいはブロック図またはその両方を参照しながら、例示的諸実施形態について説明する。流れ図あるいはブロック図またはその両方の各ブロック、ならびに流れ図あるいはブロック図またはその両方のブロックの組み合わせは、コンピュータ・プログラム命令によって実装可能であることを理解されよう。これらのコンピュータ・プログラム命令は、コンピュータまたは他のプログラム可能データ処理装置のプロセッサを介して実行する命令が、流れ図あるいはブロック図またはその両方のブロック内に指定された機能／動作を実装するための手段を作成するように、マシンを製造するために、汎用コンピュータ、特定用途向けコンピュータ、または他のプログラム可能データ処理装置のプロセッサへ提供することができる。
【００３３】
コンピュータ読み取り可能媒体内に格納された命令が、流れ図あるいはブロック図またはその両方のブロック内に指定された機能／動作を実装する命令手段を含む製品を製造するように、コンピュータまたは他のプログラム可能データ処理装置に特定の様式で機能するよう命令することができる、これらのコンピュータ・プログラム命令は、コンピュータ読み取り可能媒体内に格納することもできる。
【００３４】
コンピュータ・プログラム命令は、一連の動作ステップをコンピュータまたは他のプログラム可能装置上で実行させるために、コンピュータまたは他のプログラム可能データ処理装置上にロードし、コンピュータまたは他のプログラム可能装置上で実行する命令が、流れ図あるいはブロック図またはその両方のブロック内に指定された機能／動作を実装するためのプロセスを提供するように、コンピュータ実装プロセスを生成することもできる。
【００３５】
図面内の流れ図およびブロック図は、本発明の様々な実施形態に従ったシステム、方法、およびコンピュータ・プログラム製品の可能な諸実施のアーキテクチャ、機能、および動作を示す。この点で、流れ図またはブロック図内の各ブロックは、指定された論理機能を実装するための１つまたは複数の実行可能命令を備える、モジュール、セグメント、またはコード部分を表すことができる。いくつかの代替実施では、ブロック内に示された機能は、図面内に示された順序以外で実行可能であることにも留意されたい。たとえば、連続して示された２つのブロックは、実際にはほぼ同時に実行可能であるか、またはブロックは関連する機能に応じて時には逆の順序で実行可能である。ブロック図あるいは流れ図またはその両方の各ブロック、および、ブロック図あるいは流れ図またはその両方のブロックの組み合わせは、指定された機能または動作を実行する特定用途向けハードウェア・ベース・システム、あるいは特定用途向けハードウェアおよびコンピュータ命令の組み合わせによって、実装可能であることにも留意されよう。
【００３６】
例示的諸実施形態は、分散データ処理環境、単一データ処理デバイスなどを含む、多くの異なるタイプのデータ処理環境で使用することができる。例示的諸実施形態の特定の要素および機能の説明に関するコンテキストを提供するために、以下に、例示的諸環境の諸態様が実装可能な例示的環境として図１および図２が提供される。図１および図２に従った説明では、主に、他の反復と並行して事前に独立した反復をスケジューリングおよび実行する、ランタイム依存性意識スケジューリング機構の単一データ処理デバイスの実施に焦点を当てるが、これは単なる例であり、本発明の機能に関するいかなる制限をも示すかまたは示唆することは意図されていない。これとは反対に、例示的諸実施形態は、独立した反復がランタイム時にスケジューリングされ、他の反復と並行して事前に実行される、分散データ処理環境および実施形態を含むことが意図される。
【００３７】
次に図面、特に図１〜図２を参照すると、本発明の例示的諸実施形態が内部に実装可能な、データ処理環境の例示的図が提供されている。図１〜図２は単なる例であり、本発明の諸態様または諸実施形態が内部に実装可能な諸環境に関するいかなる制限も、アサートまたは示唆することが意図されていないことを理解されたい。本発明の趣旨および範囲を逸脱することなく、示された諸環境に対する多くの修正が実行可能である。
【００３８】
次に図面を参照すると、図１は、本発明の諸実施形態が内部に実装可能なデータ処理システムを示す例示的図である。図１は単なる例であり、本発明の諸態様または諸実施形態が内部に実装可能な諸環境に関するいかなる制限も、アサートまたは示唆することが意図されていないことを理解されたい。本発明の趣旨および範囲を逸脱することなく、示された諸環境に対する多くの修正が実行可能である。
【００３９】
次に図１を参照すると、例示的諸実施形態が内部に実装可能なデータ処理システムのブロック図が示されている。データ処理システム１００は、プロセスを実装するコンピュータ使用可能コードまたは命令が例示的諸実施形態のために内部に配置可能な、コンピュータの例である。
【００４０】
示された例では、データ処理システム１００は、ノース・ブリッジおよびメモリ・コントローラ・ハブ（ＭＣＨ）１０２ならびにサウス・ブリッジおよび入出力（Ｉ／Ｏ）コントローラ・ハブ（ＩＣＨ）１０４を含む、ハブ・アーキテクチャを採用する。処理ユニット１０６、メイン・メモリ１０８、およびグラフィクス・プロセッサ１１０が、ノース・ブリッジおよびメモリ・コントローラ・ハブ１０２に結合される。処理ユニット１０６は１つまたは複数のプロセッサを含むことが可能であり、１つまたは複数の異機種プロセッサ・システムを使用しても実装可能である。グラフィクス・プロセッサ１１０は、たとえばアクセラレイテッド・グラフィクス・ポート（ＡＧＰ）を介してＭＣＨに結合可能である。
【００４１】
示された例では、ローカル・エリア・ネットワーク（ＬＡＮ）アダプタ１１２がサウス・ブリッジおよびＩ／Ｏコントローラ・ハブ１０４に結合され、オーディオ・アダプタ１１６、キーボードおよびマウス・アダプタ１２０、モデム１２２、読み取り専用メモリ（ＲＯＭ）１２４、ユニバーサル・シリアル・バス（ＵＳＢ）ポートおよび他の通信ポート１３２、ならびにＰＣＩ／ＰＣＩｅデバイス１３４がバス１３８を介してサウス・ブリッジおよびＩ／Ｏコントローラ・ハブ１０４に結合され、ハード・ディスク・ドライブ（ＨＤＤ）１２６およびＣＤ−ＲＯＭドライブ１３０がバス１４０を介してサウス・ブリッジおよびＩ／Ｏコントローラ・ハブ１０４に結合される。ＰＣＩ／ＰＣＩｅデバイスは、たとえばEthernetアダプタ、アドイン・カード、およびノートブック・コンピュータ用のＰＣカードを含むことができる。ＰＣＩはカード・バス・コントローラを使用するが、ＰＣＩｅは使用しない。ＲＯＭ１２４は、たとえばフラッシュ・バイナリ入力／出力システム（ＢＩＯＳ）とすることができる。ハード・ディスク・ドライブ１２６およびＣＤ−ＲＯＭドライブ１３０は、たとえばIntegrated Drive Electronics (IDE)またはSerial Advanced Technology Attachment (SATA)インターフェースを使用することができる。スーパーＩ／Ｏ（ＳＩＯ）デバイス１３６は、サウス・ブリッジおよびＩ／Ｏコントローラ・ハブ１０４に結合することができる。
【００４２】
オペレーティング・システムは処理ユニット１０６上で実行し、図１のデータ処理システム１００内の様々なコンポーネントの制御を調整および提供する。オペレーティング・システムは、Microsoft（Ｒ）のWindows（Ｒ）XP（MicrosoftおよびWindowsは、米国または諸外国あるいはその両方におけるMicrosoft Corporationの商標である）などの市販のオペレーティング・システムとすることができる。Ｊａｖａ（ＴＭ）プログラミング・システムなどのオブジェクト指向プログラミング・システムは、オペレーティング・システムと共に実行可能であり、データ処理システム１００上で実行中のＪａｖａ（ＴＭ）プログラムまたはアプリケーションからオペレーティング・システムへと呼び出しを提供する。ＪａｖａおよびすべてのＪａｖａベースの商標は、米国、諸外国、またはその両方におけるSun Microsystems, Incの商標である。
【００４３】
オペレーティング・システム、オブジェクト指向プログラミング・システム、およびアプリケーションまたはプログラム向けの命令は、ハード・ディスク・ドライブ１２６などのストレージ・デバイス上に配置され、処理ユニット１０６による実行のためにメイン・メモリ１０８へとロードすることができる。例示的諸実施形態のプロセスは、たとえばメイン・メモリ１０８、読み取り専用メモリ１２４、あるいは１つまたは複数の周辺デバイスなどの、メモリ内に配置可能なコンピュータ実装命令を使用して、処理ユニット１０６によって実行可能である。
【００４４】
バス・システムは、システム・バス、Ｉ／Ｏバス、およびＰＣＩバスなどの、１つまたは複数のバスで構成することができる。もちろん、バス・システムは、ファブリックまたはアーキテクチャに接続された異なるコンポーネントまたはデバイス間でのデータの転送を提供する、任意の種類の通信ファブリックまたはアーキテクチャを使用して実装可能である。通信ユニットは、モデムまたはネットワーク・アダプタなどの、データの送受信に使用される１つまたは複数のデバイスを含むことができる。メモリは、たとえばメイン・メモリ１０８、またはノース・ブリッジおよびメモリ・コントローラ・ハブ１０２内に見られるようなキャッシュとすることができる。処理ユニットは、１つまたは複数のプロセッサまたはＣＰＵを含むことができる。図１に示された例および前述の例は、アーキテクチャ上の制限を示唆することを意味するものではない。たとえばデータ処理システム１００は、ＰＤＡの形を取ることに加えて、タブレット・コンピュータ、ラップトップ・コンピュータ、または電話デバイスとすることもできる。
【００４５】
図２を参照すると、例示的諸実施形態の諸態様が内部に実装可能な、機能ユニットおよびレジスタを示す従来の２重スレッド型プロセッサ設計の例示的ブロック図が示されている。プロセッサ２００は、これらの例では図１の処理ユニット１０６として実装可能である。プロセッサ２００は、２重スレッド同時マルチスレッディング（ＳＭＴ）を備えた、単一集積回路スーパスカラ（superscalar）・マイクロプロセッサを備える。したがって、以下でより詳細に論じるように、プロセッサ２００は様々なユニット、レジスタ、バッファ、メモリ、および他のセクションを含み、それらすべては集積回路によって形成される。加えて例示的実施形態では、プロセッサ２００は、縮小命令セット・コンピュータ（ＲＩＳＣ）技法に従って動作する。
【００４６】
図２に示されるように、命令フェッチ・ユニット（ＩＦＵ）２０２は命令キャッシュ２０４に接続している。命令キャッシュ２０４は、レベル２（Ｌ２）キャッシュ／メモリ２０６へのインターフェースも有する。ＩＦＵ２０２は、命令アドレスに従って命令キャッシュ２０４に命令を要求し、命令復号ユニット２０８に命令を渡す。例示的実施形態では、ＩＦＵ２０２は、同時に２つまでのスレッドについて命令キャッシュ２０４に複数の命令を要求することができる。命令復号ユニット２０８は、同時に２つまでのスレッドについて複数の命令を復号し、復号された命令を命令ディスパッチ・ユニット（ＩＤＵ）２１０へと渡す。ＩＤＵ２１０は、各スレッドについて命令復号ユニット２０８からの復号された命令を選択的にグループ化し、プロセッサの実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８に対して、各スレッドについての命令グループを出力または発行する。
【００４７】
例示的実施形態では、プロセッサの実行ユニットは、分岐ユニット２１２、ロード／ストア・ユニット（ＬＳＵＡ）２１４および（ＬＳＵＢ）２１６、固定小数点実行ユニット（ＦＸＵＡ）２１８および（ＦＸＵＢ）２２０、浮動小数点実行ユニット（ＦＰＵＡ）２２２および（ＦＰＵＢ）２２４、ならびにベクトル・マルチメディア拡張ユニット（ＶＭＸＡ）２２６および（ＶＭＸＢ）２２８を含むことができる。実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８は、両方のスレッドにまたがって完全に共有されており、すなわち実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８は、いずれかまたは両方のスレッドから命令を受け取ることができる。プロセッサは、アーキテクチャ・レジスタ・ファイル（ＡＲＦ）とも呼ばれることのある、複数のレジスタ・セット２３０、２３２、２３４、２３６、２３８、２４０、２４２、２４４、および２４６を含む。
【００４８】
ＡＲＦは、命令が実行を完了すると完了データが格納されるファイルである。ＡＲＦ２３０、２３２、２３４、２３６、２３８、２４０、２４２、２４４、および２４６は、２つのスレッドそれぞれについて別々に、および命令のタイプごとに、すなわち、汎用レジスタ（ＧＰＲ）２３０および２３２、浮動小数点レジスタ（ＦＰＲ）２３４および２３６、特定用途向けレジスタ（ＳＰＲ）２３８および２４０、ならびにベクトル・レジスタ（ＶＲ）２４４および２４６ごとに、データを格納することが可能である。タイプごとおよびスレッドごとに完了データを別々に格納することは、命令を処理している間のプロセッサの競合削減に役立つ。
【００４９】
加えてプロセッサは、いずれかまたは両方のスレッドからの命令で使用可能な、命令ポインタ、スタック・ポインタ、またはプロセッサ状況語などの、プログラム状態を保持するための共用特定用途向けレジスタ（ＳＰＲ）２４２のセットを含む。実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８は、簡略化された内部バス構造２４８を通じて、ＡＲＦ２３０、２３２、２３４、２３６、２３８、２４０、２４２、２４４、および２４６に接続される。
【００５０】
浮動小数点命令を実行するために、ＦＰＵＡ２２２およびＦＰＵＢ２２４は、命令を実行するために必要な命令データが完了した場合、またはデータがパイプライン内のフラッシング・ポイントを通過した場合、命令を実行するために必要な入力データであるレジスタ・ソース・オペランド情報をＦＰＲ２３４および２３６から取り出す。完了データは、命令が実行を完了し、ＡＲＦ２３０、２３２、２３４、２３６、２３８、２４０、２４２、２４４、および２４６などのＡＲＦ内に格納されると、実行ユニットによって生成されているデータである。未完了データは、命令が実行を完了していない場合に、命令実行中に生成されているデータである。ＦＰＵＡ２２２およびＦＰＵＢ２２４は、各実行命令がどのスレッドに属するかに従って、それらのデータを入力する。たとえば、ＦＰＵＡ２２２、ＦＰＵＢ２２４、ならびにＦＰＲ２３４および２３６はスレッド特有であるため、ＦＰＵＡ２２２は完了データをＦＰＲ２３４へ入力し、ＦＰＵＢ２２４は完了データをＦＰＲ２３６へ入力する。
【００５１】
命令の実行中、ＦＰＵＡ２２２およびＦＰＵＢ２２４は、命令がパイプライン内のフラッシング・ポイントを通過した場合、それらの宛先レジスタ・オペランド・データ、または命令の実行中に生成された命令データを、ＦＰＲ２３４および２３６へ出力する。命令の実行中、ＦＸＵＡ２１８、ＦＸＵＢ２２０、ＬＳＵＡ２１４、およびＬＳＵＢ２１６は、命令がパイプライン内のフラッシング・ポイントを通過した場合、それらの宛先レジスタ・オペランド・データ、または命令の実行中に生成された命令データを、ＧＰＲ２３０および２３２へ出力する。命令の実行中、ＦＸＵＡ２１８、ＦＸＵＢ２２０、および分岐ユニット２１２は、命令がパイプライン内のフラッシング・ポイントを通過した場合、それらの宛先レジスタ・オペランド・データを、ＳＰＲ２３８、２４０、および２４２へ出力する。命令の実行中、ＶＭＸＡ２２６およびＶＭＸＢ２２８は、命令がパイプライン内のフラッシング・ポイントを通過した場合、それらの宛先レジスタ・オペランド・データを、ＶＲ２４４および２４６へ出力する。
【００５２】
データ・キャッシュ２５６は、プロセッサからデータを受け入れてこれを直接レベル２キャッシュ／メモリ２０６へ書き込むため、キャッシュへのストレージに必要なコヒーレンス・プロトコルを迂回する、キャッシュ不能ユニット（図示せず）にも関連付けることができる。
【００５３】
命令が命令キャッシュ２０４から入力され、命令復号ユニット２０８によって復号されることに応答して、ＩＤＵ２１０は、命令のタイプおよびスレッドに関して、実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８へと選択的に命令をディスパッチする。次に実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８は、特定のクラスまたはタイプの命令のうち、１つまたは複数の命令を実行する。たとえばＦＸＵＡ２１８およびＦＸＵＢ２２０は、加算、減算、ＡＮＤ、ＯＲ、およびＸＯＲなどの固定小数点数学演算を、レジスタ・ソース・オペランドで実行する。ＦＰＵＡ２２２およびＦＰＵＢ２２４は、浮動小数点乗算および除算などの浮動小数点数学演算を、レジスタ・ソース・オペランドで実行する。ＬＳＵＡ２１４およびＬＳＵＢ２１６は、データ・キャッシュ２５６とＡＲＦ２３０、２３２、２３４、および２３６との間でオペランド・データを移動させる、ロードおよび格納命令を実行する。ＶＭＸＡ２２６およびＶＭＸＢ２２８は、複数データを含む単一命令動作を実行する。分岐ユニット２１２は、命令キャッシュ２０４に命令を要求するために、ＩＦＵ２０２によって使用される命令アドレスを修正することによって、プログラムを通じた実行の流れを条件付きで変更する分岐命令を実行する。
【００５４】
ＩＤＵ２１０は、各命令に対して必要な動作を実行するための、復号命令および使用可能な実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８の混合に応じて、同時に実行されることになる命令復号ユニット２０８によって復号される命令をまとめてグループ化する。たとえば、２つのロード／ストア・ユニット２１４および２１６のみが存在するため、最大限の２つのロード／ストア・タイプ命令をまとめてグループ化することができる。例示的実施形態では、７つまでの命令（２つの固定小数点演算、２つのロード／ストア、２つの浮動小数点演算（ＦＰＵ）または２つのベクトル・マルチメディア拡張（ＶＭＸ）、および１つの分岐）をまとめてグループ化することが可能であり、５つまでの命令が同じスレッドに属することができる。ＩＤＵ２１０は、優先度の低いスレッドからの命令を含める前に、優先度の高いスレッドから５つまでのできる限り多くの命令をグループに含める。スレッドの優先度は、スレッドの優先度値およびそのプロセスの優先度クラスによって決定される。処理システムは、すべての実行可能スレッドの基本の優先度レベルを使用して、どのスレッドがプロセッサ時間の次のスライスを獲得するかを決定する。スレッドは、各優先度レベルで、ラウンドロビン方式でスケジューリングされ、高位レベルに実行可能スレッドがない場合のみ、低レベルでのスレッドのスケジューリングが実行される。
【００５５】
しかしながら、ＩＤＵ２１０は、同じグループ内のＦＰＵ命令２２２および２２４またはＶＭＸ命令２２６および２２８のいずれかを、ＦＸＵ命令２１８および２２０と共にディスパッチする。すなわち、ＩＤＵ２１０は、同じグループ内のＦＰＵ命令２２２および２２４ならびにＶＭＸ命令２２６および２２８はディスパッチしない。命令ポインタ、スタック・ポインタ、またはプロセッサ状況語などの、ＳＰＲ２３８および２４０に格納されたプログラム状態は、ＩＤＵ２１０に対してスレッド優先度２６０を示す。
【００５６】
命令完了ユニット２６２は、実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８内で実行中の命令が、バッファ２５０、２５２、２５４、または２５８を名前変更するために、それらのオペランド結果の書き込みをいつ完了するかを決定するために、内部バス構造２４８を監視する。分岐ユニット２１２、ＦＸＵＡ２１８、ＦＸＵＢ２２０、ＬＳＵＡ２１４、およびＬＳＵＢ２１６によって実行される命令は、同じサイクル数を実行する必要があるが、ＦＰＵＡ２２２、ＦＰＵＢ２２４、ＶＭＸＡ２２６、およびＶＭＸＢ２２８によって実行される命令は、可変の多くのサイクル数を実行する必要がある。したがって、まとめてグループ化され、同時に実行を開始する命令が、必ずしも同時に実行を完了するとは限らない。実行の「完了」とは、実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、または２２８のうちの１つで実行が完了され、命令が順番に完了しなければならないため、すべての古い命令がアーキテクチャ状態ですでに更新されていることを意味する。したがって、これで命令はアーキテクチャ状態の完了および更新の準備が整い、命令が完了した際にデータの最終状態を更新することを意味する。アーキテクチャ状態は順番に更新することしかできず、すなわち、命令は順番に完了しなければならず、完了データは各命令が完了した際に更新しなければならない。
【００５７】
命令完了ユニット２６２は命令の完了を監視し、制御情報２６４をＩＤＵ２１０に送信して、さらに多くの命令グループを実行ユニット２１２、２１４、２１６、２１８、２２０、２２２、２２４、２２６、および２２８にディスパッチできる旨をＩＤＵ２１０に通知する。ＩＤＵ２１０は、より多くの命令をディスパッチ・ユニットへのパイプラインの下方に伝えるためのスロットルとして動作するディスパッチ信号２６６を、ＩＦＵ２０２および命令復号ユニット２０８へ送信し、より多くの復号命令を受信する準備が整った旨を示す。
【００５８】
当業者であれば、図１〜図２のハードウェアは、実装に応じて変更可能であることを理解されよう。Flashメモリ、等価の不揮発性メモリ、または光ディスク・ドライブなどの、他の内部ハードウェアまたは周辺デバイスを、図１〜図２に示されたハードウェアに加えて、またはこれらの代わりに使用することができる。加えて、例示的諸実施形態の諸プロセスは、本発明の趣旨および範囲を逸脱することなく、前述のＳＭＰシステム以外のマルチプロセッサ・データ処理システムに適用することができる。
【００５９】
さらにデータ処理システム１００は、クライアント・コンピューティング・デバイス、サーバ・コンピューティング・デバイス、タブレット・コンピュータ、ラップトップ・コンピュータ、電話または他の通信デバイス、携帯情報端末（ＰＤＡ）などを含む、いくつかの異なるデータ処理システムのうちのいずれかの形を取ることができる。いくつかの例では、データ処理システム１００は、たとえばオペレーティング・システム・ファイルあるいはユーザ生成データまたはその両方を格納するための不揮発性メモリを提供するために、Flashメモリを用いて構成されたポータブル・コンピューティング・デバイスとすることができる。本来、データ処理システム１００は、アーキテクチャ上の制限なしに、任意の知られた、または後に開発される、データ処理システムとすることができる。
【００６０】
例示的諸実施形態の機構では、図１のデータ処理システム１００などのデータ処理システムは、処理ユニット１０６が複数のスレッドを投機的に同時に実行可能な、投機的マルチスレッディング（ＳＭＴ）環境を提供する。データ処理システム１００は、複数の同時スレッドの投機的実行をサポートする、投機的バージョニング・キャッシュ（ＳＶＣ）を使用する。ＳＶＣは、たとえば、共有Ｌ１またはＬ２キャッシュの一部に提供可能である、複数の異なる処理ユニットに関連付けられた複数のＬ１またはＬ２キャッシュ全体に分散可能である、あるいは、処理ユニット１０６およびそれらの処理コアによってアクセス可能な別々のキャッシュ構造として提供可能である。ＳＶＣは、複数のスレッドが同じキャッシュ・ラインに同時にアクセスしている場合、複数バージョンのキャッシュ・ラインを格納することができる。キャッシュ・ラインのバージョンは、キャッシュ・ラインに関連付けられたバージョン識別子（ＶＩＤ）を利用して、ＳＶＣ内で分化することができる。したがって、たとえば複数のキャッシュ・ラインは同じアドレス・タグを有するが、
異なるＶＩＤを有し、それによって同じキャッシュ・ラインの異なるバージョンまたは同じキャッシュ・ライン・セットの複数のキャッシュ・ライン・バージョンであるキャッシュ・ラインを識別する場合がある。
【００６１】
例示的諸実施形態の諸機構は、ＳＶＣ内で使用される様々なバージョンのキャッシュ・ラインに関するロー・バージョン・プレッシャ・データを集め、このロー・バージョン・プレッシャ・データから統計的バージョン・プレッシャ情報を生成する。ソフトウェア制御機構によってこの統計的バージョン・プレッシャ情報を使用し、様々なスレッドに関してバージョン・プレッシャを制御するように、データ処理システム内のスレッドの実行を制御することができる。ロー・バージョン・プレッシャ・データは、好ましくは、投機的バージョニング・キャッシュおよび様々なプロセッサのスレッド実行ハードウェアに関連付けて提供された、ハードウェア機構によって集められる。統計的バージョン・プレッシャ情報は、ハードウェア機構によって生成するか、または、ロー・バージョン・プレッシャ・データに基づいて、コンパイラ、オペレーティング・システムなどの一部として提供されるような、ソフトウェア・プロセスによって生成することができる。
【００６２】
図３は、例示的一実施形態の１次演算要素を示す例示的ブロック図である。前述のように、図３に示されるバージョン・プレッシャ・モジュールおよび投機的バージョニング・キャッシュ機構は、好ましくはハードウェア内に実装されるが、ソフトウェア制御ユニット３５０などの他の要素は、１つまたは複数の処理デバイス上で実行するソフトウェアとして実装可能である。
【００６３】
さらに話を簡潔にするために、図３は、単一の投機的バージョニング・キャッシュに関連付けて提供される単一のグローバル・バージョン・プレッシャ・モジュールに関して説明される。しかしながら、例示的諸実施形態の機構は、複数の投機的バージョニング・キャッシュ、およびこれらの投機的バージョニング・キャッシュに関連付けられた複数のグローバル・バージョン・プレッシャ・モジュールにまたがって、分散可能であることを理解されたい。さらに他の例示的実施形態では、図３の単一のグローバル・バージョン・プレッシャ・モジュールを複数の投機的バージョニング・キャッシュと共に使用するため、結果として単一のグローバル・バージョン・プレッシャ・モジュールはこれら複数の投機的バージョニング・キャッシュからロー・バージョン・プレッシャ・データを取得することができる。
【００６４】
図３に示されるように、例示的諸実施形態の諸機構は、関連付けられたグローバル・バージョン・プレッシャ・モジュール３２０を有する投機的バージョニング・キャッシュ３１０を含む。グローバル・バージョン・プレッシャ・モジュール３２０はロー・バージョン・プレッシャ・データを維持し、このロー・バージョン・プレッシャ・データに基づいてバージョン・プレッシャ統計情報を生成することが可能な、ハードウェアあるいはソフトウェアまたはその両方を備えることができる。加えて、スレッド３４０〜３４６を実行するプロセッサ・コア３７０〜３７６は、それぞれ、そのそれぞれ関連付けられたスレッド３４０〜３４６に関する、ロー・バージョン・プレッシャ・データあるいはバージョン・プレッシャ統計情報を取得するための、関連付けられたスレッド・バージョン・プレッシャ・モジュール３３０〜３３６を有する。コンパイラ、オペレーティング・システムなどとすることが可能なソフトウェア制御ユニット３５０を、スレッド・バージョン・プレッシャ・モジュール３３０〜３３６あるいはグローバル・バージョン・プレッシャ・モジュール３２０またはその両方と共に使用して、ロー・バージョン・プレッシャ・データあるいはバージョン・プレッシャ統計情報またはその両方に基づいて、投機的バージョニング・キャッシュ３１０内のバージョン・プレッシャ問題に対処するために行う、適切な動作を決定することができる。
【００６５】
図３に示された例示的実施形態では、１つのスレッド３４０〜３４６が、各コア３７０〜３７６およびスレッド・バージョン・プレッシャ・モジュール３３０〜３３６に、それぞれ関連付けられる。他の例示的諸実施形態では、各コア３７０〜３７６に２つまたはそれ以上のスレッドを関連付けることが可能であり、この場合、１つのコア当たり２つまたはそれ以上のスレッドは、１つの共通の共有スレッド・バージョン・プレッシャ・モジュールと論理的に対話する。さらに他の例示的諸実施形態では、１つのコア当たり２つまたはそれ以上のスレッドは、それぞれ、それら専用のプライベート・スレッド・バージョン・プレッシャ・モジュールと対話する。さらに他の例示的諸実施形態では、２つまたはそれ以上のスレッドが共通のスレッド・バージョン・プレッシャ・モジュールを共有することができるが、共通のスレッド・バージョン・プレッシャ・モジュールは、
コアに関連付けられた各スレッドに対してプライベートであるように複製されたすべてのスレッドならびに他の論理および状態によって共有される、何らかの論理および状態を有することができる。
【００６６】
動作時、典型的には競合ミスが発生した場合、キャッシュ・ハンドラは、たとえば使用パターン（一番最近使用されたパターン）、汚染ビット（汚染キャッシュ・ラインはアーキテクチャ・ストレージへの書き戻しを必要とするがクリーンなキャッシュ・ラインは必要としない）、投機的状態ビット（投機的キャッシュ・ラインはスレッドのスカッシュを必要とする）などの、投機的バージョニング・キャッシュ３１０によって使用されている任意の置換ポリシーを考慮して、投機的バージョニング・キャッシュ３１０から排除するために好適なキャッシュ・ライン候補を決定する。加えて、例示的諸実施形態の諸機構では、競合ミスおよび置換動作が発生した場合、グローバル・バージョン・プレッシャ・モジュール３２０は、置換される排除されたキャッシュ・ラインに関して、投機的バージョニング・キャッシュ３１０内で維持されるキャッシュ・ラインのバージョン数のカウントを取得する。
【００６７】
この排除されたキャッシュ・ラインのバージョン数のカウントは、多くの異なる方法で取得可能である。たとえば、バージョン数のカウントは、キャッシュ・ラインの結合範囲内のビット数をカウントすることなどによって、排除されたキャッシュ・ラインに関連付けられたキャッシュ・ライン・バージョン数をカウントする、グローバル・バージョン・プレッシャ・モジュール３２０によって取得することができる。別の方法として、いくつかの投機的バージョニング・キャッシュ３１０では、投機的バージョニング・キャッシュ３１０内の同じキャッシュ・ラインの次のバージョンをポイントするポインタを、キャッシュ・ライン内に提供することが可能であり、これらのポインタは、排除されたキャッシュ・ラインのバージョン数のカウントを増分させるキャッシュ・ラインの新しい各バージョンを用いてトラバースすることができる。さらに、キャッシュ・ラインが投機的バージョニング・キャッシュ３１０内にロードされた場合、キャッシュ・ラインのセットに関連して、グローバル・バージョン・プレッシャ・モジュール３２０内にカウンタを提供することができる。このカウンタは、スレッドがキャッシュ・ラインの修正を試行した場合、投機的バージョニング・キャッシュ３１０内に生成されるキャッシュ・ラインの新しい各バージョンを用いて、動的に更新することができる。
【００６８】
グローバル・バージョン・プレッシャ・モジュール３２０によって取得されたカウントは、グローバル・バージョン・プレッシャ・モジュール３２０のハードウェア、またはデータ処理システムの１つまたは複数のプロセッサ上で実行するソフトウェア制御ユニット３５０によって使用され、カウンタに関連付けられたキャッシュ・ラインのセットに関するバージョン・プレッシャ統計情報を生成することができる。バージョン・プレッシャ統計情報は、特定のキャッシュ・ライン・セットについてのみ生成可能であるか、または投機的バージョニング・キャッシュ３１０によって維持される他のキャッシュ・ライン・セットに関する他のバージョン・プレッシャ統計情報と集約することができる。例示的一実施形態では、特定キャッシュ・ライン・セットに関連付けられたスレッドのバージョン・プレッシャを使用してある動作を実行できるように、バージョン・プレッシャ統計情報をキャッシュ・ライン・セットごとに生成することができる。他の例示的実施形態では、そのスレッドによってアクセスされるすべてのキャッシュ・ライン・セットに関連付けられたスレッドのバージョン・プレッシャを使用してある動作を実行できるように、バージョン・プレッシャ統計情報をスレッドごとに生成することができる。さらに他の例示的実施形態では、キャッシュ全体のバージョン・プレッシャをある動作を実行するための基本として使用できるように、バージョン・プレッシャ統計情報をキャッシュごとに生成することができる。さらに、複数のキャッシュ全体のバージョン・プレッシャをある動作を実行するための基本として使用できるように、複数の投機的バージョニング・キャッシュ全体にわたって、バージョン・プレッシャ統計情報を集約することができる。要するに、任意の個々のまたは集約されたロー・バージョン・プレッシャ・データを、バージョン・プレッシャ統計情報を生成するために使用することが可能であり、任意の個々のまたは集約されたバージョン・プレッシャ統計情報使用して、１つまたは複数の投機的バージョニング・キャッシュ上のバージョン・プレッシャに関した問題に対処するための適切な動作を決定することができる。
【００６９】
ロー・バージョン・プレッシャ・データ、バージョン・プレッシャ統計情報、またはその両方のいずれかが、投機的バージョニング・キャッシュ３１０内のそれぞれのキャッシュ・ライン・セット内のキャッシュ・ラインのデータにアクセスするためのスレッド３４０〜３４６からの要求に応答して、スレッド・バージョン・プレッシャ・モジュール３３０〜３３６に提供される。すなわち、スレッド３４０などのスレッドが、通常のデータ要求、たとえばロード／ストア要求を、投機的バージョニング・キャッシュ３１０に送信する場合、要求されたデータは投機的バージョニング・キャッシュ３１０からスレッド３４０に戻され、このデータと共に、バージョン・プレッシャ・データ／情報は、グローバル・バージョン・プレッシャ・モジュール３２０から、要求側スレッド３４０に対応したスレッド・バージョン・プレッシャ・モジュール３３０に提供される。要求に応答して提供されるバージョン・プレッシャ・データ／情報は、要求によってアクセスされるキャッシュ・ライン・セットに対応するバージョン・プレッシャ・データ／情報とすることができる。前述のように、このデータ／情報は、キャッシュ・ライン・セット、スレッド３４０、投機的バージョニング・キャッシュ３１０全体、データ処理システム内のすべての投機的バージョニング・キャッシュなどに関する、バージョン・プレッシャ統計を、さらに含むことができる。すなわち、バージョン・プレッシャ統計情報は、特定のスレッドあるいはキャッシュ・ライン・セットまたはその両方に対応する集約された統計情報とすることができる。別の方法として、バージョン・プレッシャ統計情報を送信するのではなく、ロー・バージョン・プレッシャ・データのみを、スレッド・バージョン・プレッシャ・モジュールによって生成された統計情報と共に、スレッド・バージョン・プレッシャ・モジュールに、または、現在所有しているロー・バージョン・プレッシャ・データ上で別個にスレッド・バージョン・プレッシャ・モジュールと共に作業するソフトウェア制御ユニット３５０に、伝送することができる。
【００７０】
ロー・バージョン・プレッシャ・データ／バージョン・プレッシャ統計情報の伝搬には、追加のワイヤまたは追加のデータ転送サイクルが必要な可能性がある。しかしながら、ロー・バージョン・プレッシャ・データ／バージョン・プレッシャ統計情報の転送は、システムの動作に必須ではないことに留意されたい。したがって例示的一実施形態では、ロー・バージョン・プレッシャ・データ／バージョン・プレッシャ統計情報は、図３のデータ・バス３９０ではなくバージョン・プレッシャ・バス３８０と言及されている、より低速でより狭いバスを介して、グローバル・バージョン・プレッシャ・モジュール３２０からスレッド・バージョン・プレッシャ・モジュール３３０〜３３６へと伝搬することができる。より低速でより狭いバージョン・プレッシャ・バス３８０を使用するデータ処理システムの性能の向上を支援するために、例示的一実施形態では、ロー・バージョン・プレッシャ・データ／バージョン・プレッシャ統計情報は、バージョン・プレッシャ・バス３８０を横切って伝送する前に、グローバル・バージョン・プレッシャ・モジュール３２０によって事前に集約し、それによって通信帯域幅要件を減少させることができる。
【００７１】
例示的一実施形態では、さらにバス・オーバヘッドを減少させるために、バージョン・プレッシャ・バス３８０を、システム上に既に存在している他のバスとマージさせること、または、システム上に既に存在している他のバスの機能を拡張することができる。たとえばデータ処理環境１００は、キャッシュ・ヒット率カウンタ、キャッシュ・ミス待ち時間カウンタ、あるいは分岐ヒット率カウンタなど、またはそれらすべてなどの、様々な性能カウンタを監視するために使用される、１つまたは複数の性能監視バスを有することができる。他のバスは、データ処理環境１００内に存在可能であり、バージョン・プレッシャ・バス３８０とマージさせるのに好適な可能性がある。他の例示的実施形態では、バージョン・プレッシャ・バス３８０を、データ・バス３９０またはその関連アドレス・バスとマージさせることができる。
【００７２】
こうした例示的実施形態では、データ・バス３８０またはその関連アドレス・バスがアイドル状態の場合、バージョン・プレッシャ・モジュール３２０および３３０〜３３６は通信可能である。図３は、バスを使用したキャッシュ３１０とコア３７０〜３７６との間の通信を示すことにも留意されたい。当業者であれば本説明に鑑みて理解されるように、例示的諸実施形態は、バスを使用した通信に限定されるものではなく、任意の２対の通信エージェント（コアおよびキャッシュなど）間の専用リンクのネットワーク、あるいは、バスおよび専用リンクの任意の組み合わせなどの、他の通信構造を使用するシステムで容易に使用することができる。図３に示されたアーキテクチャは、例示的一実施形態の単なる例であり、本発明または本明細書で説明された例示的諸実施形態で形成可能な様々な実装に関して制限されることを意図するものではない。
【００７３】
前述のように、ロー・バージョン・プレッシャ・データを使用して、バージョン・プレッシャ統計情報を生成し、その後これを使用して、投機的バージョニング・キャッシュ３１０上のバージョン・プレッシャを制御するための適切な動作を決定することができる。様々なタイプのバージョン・プレッシャ統計情報は、たとえば、グローバル・バージョン・プレッシャ・モジュール３２０、個々のスレッド・バージョン・プレッシャ・モジュール３３０〜３３６、またはソフトウェア制御ユニット３５０内の、例示的諸実施形態の諸機構によって生成可能である。このバージョン・プレッシャ統計情報は、スレッドごと、キャッシュごと、データ・システムごとなどで生成可能である。
【００７４】
たとえば、スレッドごとの場合、バージョン・プレッシャ統計の生成は、ロー・バージョン・プレッシャ・データ、すなわち、その特定のスレッドによって接触された様々なキャッシュ・ライン・セットに関するカウント値を取得し、その後、１つまたは複数の有意のバージョン・プレッシャ統計を生成するためにロー・バージョン・プレッシャ・データを統合することを、含むことができる。こうした有意なバージョン・プレッシャ統計は、スレッドによって接触されたすべてのキャッシュ・ライン・セット上でスレッドによって及ぼされる最大のバージョン・プレッシャ、スレッドによって接触された様々なキャッシュ・ライン・セットにわたってスレッドによって及ぼされる平均バージョン・プレッシャ、キャッシュ全体にわたってスレッドによって及ぼされる平均バージョン・プレッシャ、キャッシュ全体上でスレッドによって及ぼされる最大のバージョン・プレッシャ、スレッドによって接触されたすべてのキャッシュ・ライン・セット上でスレッドによって及ぼされる合計バージョン・プレッシャなどを含む。すなわち、スレッドによって及ぼされるバージョン・プレッシャは、特定のキャッシュ・ライン・セットまたはキャッシュ全体におけるキャッシュ・ラインのバージョン数の特定のスレッドの相対部分を表す。したがって、特定のスレッドがキャッシュ・ライン・セット内に最大の１５バージョンのキャッシュ・ラインのロー・バージョン・プレッシャ・カウントを有する場合、同じキャッシュ・ライン・セットまたはキャッシュ全体にアクセスしている他のスレッドに比べて、この最大数は非常に大きく、特定スレッドによって投機的バージョニング・キャッシュ３１０に及ぼされる高いバージョン・プレッシャを表す。
【００７５】
他の例として、キャッシュごとの場合、バージョン・プレッシャ・データの同様の集約を使用して、すべてのスレッド３４０〜３４６あるいは投機的バージョニング・キャッシュ３１０内のキャッシュ・ライン・セットまたはその両方以外に関して、有意なバージョン・プレッシャ統計を生成することができる。したがって、たとえば、すべてのスレッドおよび投機的バージョニング・キャッシュ３１０内のすべてのキャッシュ・ライン・セットにわたって、あるいは特定のキャッシュ・ライン・セットまたはキャッシュ・ライン・セットのみを除くすべてのスレッドなどにわたって、最大値および平均値を生成することができる。バージョン・プレッシャ統計は、各ロールバックまたはスレッドのスカッシュ後にバージョン・プレッシャ統計値を再計算することによって、徐々に減少していく可能性があり、より高いバージョン・プレッシャ統計値に遭遇するごとに徐々に増加していく可能性がある。
【００７６】
ロー・バージョン・プレッシャ・データ、すなわち様々なキャッシュ・ライン・セットに関するカウント値は、定期的に、または検出されたイベントに応答して、リセットまたは再初期化することができる。たとえばキャッシュ・ラインが排除された、スレッドがスカッシュされた、などの場合、対応するロー・バージョン・プレッシャ・データは、グローバル・バージョン・プレッシャ・モジュール３２０あるいはスレッド・バージョン・プレッシャ・モジュール３３０〜３３６またはその両方で、リセットすることができる。加えて、バージョン・プレッシャ統計情報は、定期的に、または前述のようなあるイベントに応答して、同様にリセットまたは再初期化することができる。さらに個々のスレッド３４０〜３４６は、スレッド・バージョン・プレッシャ・モジュール３３０〜３３６内に維持されている、ロー・バージョン・プレッシャ・データ／バージョン・プレッシャ統計情報のそれら独自のバージョンを、他のスレッド・バージョン・プレッシャ・モジュール３３０〜３３６またはグローバル・バージョン・プレッシャ・モジュール３２０内のこのデータ／情報のリセット／再初期化に関係なく、リセット／再初期化することができる。
【００７７】
ロー・バージョン・プレッシャ・データおよび有意なバージョン・プレッシャ統計は、多くの異なる形で提供可能であることに留意されたい。たとえばデータ／情報は、投機的バージョニング・キャッシュ３１０内のキャッシュ・ライン・セットに関するキャッシュ・ラインの絶対数のバージョンを単位として提供可能である。別の方法として、データ／情報は、たとえば投機的バージョニング・キャッシュ３１０の全容量の何分の１かなど、正規化された値を単位として提供可能である。例示的諸実施形態の趣旨および範囲を逸脱することなく、他の形式のロー・データ／統計情報を使用することができる。
【００７８】
図４は、例示的一実施形態に従った、ロー・バージョン・プレッシャ・データに基づく有意なバージョン・プレッシャ統計の生成を示す例示的図である。図４に示されるように、グローバル・バージョン・プレッシャ・モジュール４０５は、投機的バージョニング・キャッシュの様々なキャッシュ・ライン・セットに関するカウント４１０〜４３２を生成することができる。このロー・バージョン・プレッシャ・データ４１０〜４３２から、グローバル・バージョン・プレッシャ・モジュール４０５は、投機的バージョニング・キャッシュ全体に関するバージョン・プレッシャ統計情報４４０〜４４２を、およびオプションとして、個々のスレッド４５０〜４５６に関するバージョン・プレッシャ統計情報を、生成することが可能である。さらにグローバル・バージョン・プレッシャ・モジュール４０５は、スレッド４７０〜４７２からの要求に応答して、個々のスレッド・バージョン・プレッシャ・モジュール４６０〜４６２に対してロー・バージョン・プレッシャ・データ４１０〜４３２を提供することができる。加えて、または別の方法として、グローバル・バージョン・プレッシャ・モジュール４０５は、スレッドから投機的バージョニング・キャッシュ内のデータにアクセスするための要求に応答して、投機的バージョニング・キャッシュ全体に関するバージョン・プレッシャ統計情報４４０〜４４２あるいはバージョン・プレッシャ統計情報４５０〜４５２またはその両方を、個々のスレッド・バージョン・プレッシャ・モジュール４６０〜４６２に提供することができる。
【００７９】
たとえば図４に示されるように、スレッド０（ラベル付け４７０）は、カウント値４１０、４１２、４１４、４１８、４２２、および４２８に対応するキャッシュ・ライン・セットにアクセスまたは「接触」したように示されている。これらのキャッシュ・ライン・セットにおけるキャッシュ・ライン・バージョンの合計数は３０であり、カウント値４１４に対応するキャッシュ・ライン・セットについてのキャッシュ・ライン・バージョンの最大数は１５である。スレッド０によって接触されたすべてのセットにわたるキャッシュ・ライン・バージョンの平均数は５である。同様に、図４に示されるように、スレッド１（ラベル付け４７２）は、カウント値４１２、４２０、４２２、および４３２に対応するキャッシュ・ライン・セットにアクセスまたは接触した。これらのキャッシュ・ライン・セットにおけるキャッシュ・ライン・バージョンの合計数は１０であり、カウント値４２２に対応するキャッシュ・ライン・セットについてのキャッシュ・ライン・バージョンの最大数は５である。スレッド１によって接触されたすべてのセットにわたるキャッシュ・ライン・バージョンの平均数は２．５である。
【００８０】
これらの値から、スレッド０（ラベル付け４７０）は、スレッド１（ラベル付け４７２）に比べて投機的バージョニング・キャッシュ上に高いバージョン・プレッシャを及ぼしていることが決定される。したがって、以下でより詳細に考察するように、スレッド０によって投機的バージョニング・キャッシュ上に及ぼされるバージョン・プレッシャのバランスを取るために、スレッド０に関して、たとえば投機的実行のスロットリングなどの適切な動作を実行することが必要な場合がある。同様に、スレッド１は投機的バージョニング・キャッシュ上に比較的低いバージョン・プレッシャを及ぼしており、投機的実行を増加させる場合がある。
【００８１】
さらに図４に示されるように、投機的バージョニング・キャッシュ全体に関する最大および平均のバージョン・プレッシャ統計を生成することができる。投機的バージョニング・キャッシュ内のすべてのキャッシュ・ライン・セットにおけるキャッシュ・ライン・バージョンの合計数は７１であり、カウント値４１４に対応するキャッシュ・ライン・セットについてのキャッシュ・ライン・バージョンの最大数は１５である。投機的バージョニング・キャッシュ内のすべてのセットにわたるキャッシュ・ライン・バージョンの平均数は５．９である（７１／１２＝５．９）。
【００８２】
例示的一実施形態では、投機的バージョニング・キャッシュ全体に関するこれらの最大値および平均値は、特定のスレッドが投機的バージョニング・キャッシュ上に比較的高い、平均、または低いバージョン・プレッシャを及ぼしているかどうかを決定するために、個々のスレッドに関する最大および平均のバージョン・プレッシャ統計を比較するための基準としての役割を果たすことができる。たとえば、スレッド０の場合、スレッドに関する最大バージョン・プレッシャは投機的バージョニング・キャッシュに関する最大バージョン・プレッシャと同じであり、平均のバージョン・プレッシャは投機的バージョニング・キャッシュ全体に関する平均に近いため、スレッド１は投機的バージョニング・キャッシュ上に比較的高いバージョン・プレッシャを及ぼしていることが推測できる。スレッド１の場合、最大値および平均値は投機的バージョニング・キャッシュ全体に関する最大値および平均値よりも小さく、投機的バージョニング・キャッシュ上に比較的低いバージョン・プレッシャを及ぼしているものとみなすことができる。スレッドが、高いバージョン・プレッシャ、平均のバージョン・プレッシャ、または低いバージョン・プレッシャのいずれを有するかを決定するために、最大値または平均値が投機的バージョニング・キャッシュ全体の最大値および平均値に十分近いか、またはかなり遠いかを決定するための、様々な許容値を確定することができる。
【００８３】
前述のように、グローバル・バージョン・プレッシャ・モジュールおよびスレッド・バージョン・プレッシャ・モジュールによって収集あるいは生成またはその両方が行われたバージョン・プレッシャ統計情報に基づいて、図３のソフトウェア制御ユニット３５０は、データ処理システム内で実行中のスレッド数、データ処理システム内で実行中のスレッドによって実行される作業量、トランザクション・メモリ・システム内で実行されるトランザクションの持続時間などに関して、データ処理システムの動作を修正するように機能することができる。スレッド間のバージョン・プレッシャのバランスを取るために、データ処理システムの動作をいつどのように修正するかの決定は、たとえば、対応するスレッドによる計算時、コンピュータ・プログラムの実行時の様々なチェックポイント時間、スレッドの実行の完了／失敗時などに、ソフトウェア制御ユニット３５０によって実行することができる。
【００８４】
たとえば、アクティブ・スレッドの数を制御するためにデータ処理システムの動作を修正することに関して、ソフトウェア制御ユニット３５０は、バージョン・プレッシャに応答して、バージョン・プレッシャが比較的低い場所で並列処理を増加させるために追加のスレッドを作成すること、ならびに、バージョン・プレッシャが比較的高いものと決定される場所でバージョン・プレッシャおよび並列処理を減少させるために既存のスレッドを廃棄することを、データ処理システムに実行させることによって、反応することができる。スレッドによって実行される作業量を制御することに関して、ソフトウェア制御ユニット３５０は、バージョン・プレッシャに応答して、バージョン・プレッシャが比較的低い場所で効果的な並列処理を増加させるために既存のスレッドに多くの作業ユニットを割り当てることによって、ならびに、バージョン・プレッシャが比較的高い場所でバージョン・プレッシャおよび並列処理を減少させるために、既存のスレッドにより少ない作業ユニットを割り当てるか、またはスレッドをアイドル状態にすることによって、反応することができる。トランザクションの持続時間を制御することに関して、ソフトウェア制御ユニット３５０は、バージョン・プレッシャに応答して、バージョン・プレッシャが比較的低いものと決定される場所で、トランザクション・メモリの開始／コミット・オーバヘッドを低下させるために複数の投機ユニットを集約することによって、ならびに、バージョン・プレッシャが比較的高いものと決定される場所で、バージョン・プレッシャを低下させるために複数の投機ユニットを集約解除することによって、反応することができる。
【００８５】
図５は、例示的一実施形態に従った、バージョン・プレッシャに対処するためのスレッド・スロットリング動作を示す、コードの例示的部分を示す図である。スロットリング動作に関して、スレッド・スポーニング（spawning）条件、他の採算性メトリクス、およびバージョン・プレッシャが、所定のしきい値より低い場合、作業を実行するために追加の投機的スレッドがスポーニングされる。本来、この動作は、バージョン・プレッシャがしきい値を下回り、投機的スレッドのスポーニングが実行可能であることを他の条件およびメトリクスが示す場合、より多くの投機的スレッドを生成する。しかしながら、しきい値に合致するかまたはこれを上回る場合、追加の投機的スレッドはスポーニングされない。
【００８６】
バージョン・プレッシャを測定する際に照らされる特定のしきい値は、動的に変更可能である。たとえばしきい値は、データ処理システム内で現在アクティブな投機的スレッドの数に応じて変更可能である。たとえば例示的一実施形態では、バージョン・プレッシャが、たとえば５０％などの統計的に決定されたしきい値よりも小さい場合、すなわち非投機的スレッドが投機的バージョニング・キャッシュ上に５０％未満のバージョン・プレッシャを及ぼす場合、非投機的スレッドは投機的スレッドをスポーニングすることができる。他の例示的実施形態では、バージョン・プレッシャが３０％未満の場合、第１の投機的スレッドをスポーニングすることが可能であり、バージョン・プレッシャが２０％未満の場合、第２の投機的スレッドをスポーニングすることが可能である、という具合である。したがって、実行中の投機的スレッドの数が増加するにつれて、しきい値は厳しくなる。
【００８７】
スレッド・バージョン・プレッシャごとに、追加の投機的スレッドをスポーニングするか否かを決定する以前に、有意なバージョン・プレッシャ・データを収集するために何らかの作業を実行することが、非投機的スレッドにとって有益である。グローバル・バージョン・プレッシャごとに、すなわち投機的バージョニング・キャッシュ全体に関してバージョン・プレッシャ情報を使用することで、所定数のスレッドが実行を完了した場合に、グローバル・バージョン・プレッシャ統計情報をリセットすることができる。
【００８８】
バージョン・プレッシャが高すぎるものと決定されると、ソフトウェア制御ユニット３５０は、投機的バージョニング・キャッシュ上のバージョン・プレッシャを低下させるために投機的スレッドをスカッシュすることができる。スカッシュ可能な特定の投機的スレッドは、それらをスポーニングした非投機的スレッドからどれだけ離れているかに基づいて、決定することができる。たとえば、非投機的スレッドが２つの追加の投機的スレッドをスポーニングする場合、最初に第２の投機的スレッドを、続いて第１の投機的スレッドを、スカッシュすることができる。別の方法として、スカッシュする投機的スレッドは、投機的バージョニング・キャッシュ上に最も高いバージョン・プレッシャを及ぼす投機的スレッドに基づいて、優先付けすることができる。すなわち、投機的バージョニング・キャッシュ上に最も高いバージョン・プレッシャを及ぼす投機的スレッドを第１にスカッシュし、続いて、投機的バージョニング・キャッシュ上に次に高いバージョン・プレッシャを及ぼす次の投機的スレッドをスカッシュする、という具合である。さらに他の例示的実施形態では、これらの手法を組み合わせて使用することが可能であり、非投機的スレッドから最も遠く、最も高いバージョン・プレッシャを及ぼす投機的スレッドを、第１にスカッシュするよう選択することができる。
【００８９】
図６は、例示的一実施形態に従った、バージョン・プレッシャに対処するための作業負荷スロットリング動作を示す、コードの例示的部分を示す図である。図６に示されるように、バージョン・プレッシャに応じて、投機的スレッドによって実行されている投機作業の量は増加または減少する。バージョン・プレッシャが高い場合、投機的スレッドによってより少ない作業が実行されることで、投機の粒度を低下させ、投機スレッドによって全体としてアクセスまたは接触されているキャッシュ・ラインの量が削減される。投機的スレッドに与えられる作業量は、データ処理システム内でアクティブな投機的スレッドの数に応じるなど、動的に変更可能である。いくつかの例示的実施形態では、図６に概略が示されたコードの機能と図５のコードの機能とが組み合わせ可能であることに留意されたい。
【００９０】
ここでも、スレッド・バージョン・プレッシャごとに、追加の投機的スレッドをスポーニングするか否かを決定する以前に、有意なバージョン・プレッシャ・データを収集するために何らかの作業を実行することが、非投機的スレッドにとって有益である。グローバル・バージョン・プレッシャごとに、すなわち投機的バージョニング・キャッシュ全体に関してバージョン・プレッシャ情報を使用することで、所定数のスレッドが実行を完了した場合に、グローバル・バージョン・プレッシャ統計情報をリセットすることができる。
【００９１】
図７は、例示的一実施形態に従った、バージョン・プレッシャに対処するためのアイドリング・スレッド動作を示す、コードの例示的部分を示す図である。初期に、固定数のスレッドが第１に作成され、次にそれぞれが作業を行う。初期のスレッド数は、予測されるバージョン・プレッシャに応じて調節可能であり、ここでのスキームは、いくつかのスレッドをアイドル状態に配置することによって、効果的な投機スレッド数を動的に適合することである。具体的に言えば、示されたコード内の「ｗａｉｔ（待機）」は、プレッシャしきい値が所与の量を上回る場合、現行スレッドを一時停止する。他の例示的実施形態では、示されたコード内の「ｗａｉｔ」は、バージョン・プレッシャが所与のしきい値を下回るまで、現行スレッドを一時停止する。さらに、所与の時間量の経過、または図７に具体的に示されていない他のイベントに応答して、待機状態を引き起こすことも可能である。スレッドがアイドル状態である時間量は、バージョン・プレッシャを含む様々な要素に応じて、所定の時間量または変化する時間量とすることができる。いくつかの例示的実施形態では、図７に概略が示されたコードの機能と、図５あるいは図６またはその両方のコードの機能とが組み合わせ可能であることに留意されたい。
【００９２】
図８は、例示的一実施形態に従った、バージョン・プレッシャに対処するためのトランザクション集約動作を示す、例示的図である。図８に示されるように、従来、トランザクションは、トランザクションに関連付けられた作業が完了した直後にコミットされる。しかしながら例示的諸実施形態の機構では、トランザクションの作業は、投機的バージョニング・キャッシュ上のバージョン・プレッシャがしきい値と一致するかまたはこれを超えるまで、条件付きで集約することができる。
【００９３】
言い換えれば、コードは、初期に、トランザクションによって保護された最小の可能なクリティカル領域（critical region）を用いて生成される。しかしながら、このクリティカル領域が閉じられるポイントは動的に決定される。すなわち、トランザクションのクリティカル領域は、バージョン・プレッシャが高すぎると決定されるまで、単一のトランザクションに組み込むことができる。バージョン・プレッシャが高すぎると、トランザクションを閉じて、トランザクションをコミットすることができる。もちろん、トランザクションを閉じるタイミングを決定する場合に、他のメトリクスを考慮することもできる。たとえば集約するトランザクションの最大数を設定することが可能であり、バージョン・プレッシャが高くなり過ぎた場合、または集約されるトランザクションの数がこの最大数に達した場合のいずれかに、トランザクションを閉じることができる。さらに、トランザクションを閉じるタイミングを決定する場合、たとえば同じデータ上で実行する同時スレッドの数など、並列処理の程度を考慮することができる。この同時スレッドの数は、典型的には「マスタ」スレッド、すなわちすべての他の「ワーカ（worker）」スレッドを初期化したスレッドとして知られる（すなわちワーカ・スレッドは、図８に示されるように、非保護作業ならびに保護作業を含む作業を実行するものである）。動的にトランザクションを閉じるタイミングを決定する際に支援するために、ワーカ・スレッドによって読み取られ、バージョン・プレッシャ情報と共に使用されることが可能なグローバル変数内に、マスタ・スレッドによって同時スレッドの数を設定することができる。
【００９４】
まとめて集約するための特定のトランザクションは、いくつかの異なる方法で選択することができる。たとえば、結果として高いバージョン・プレッシャが生じるタスクまたはトランザクション、および、結果として低いバージョン・プレッシャが生じるタスク／トランザクションは、それらのバージョン・プレッシャを平均化するように、同じトランザクション内にまとめて集約することができる。別の方法として、いくつかの低いバージョン・プレッシャのタスク／トランザクションをまとめて集約することができる。さらに、次のトランザクションの集約によって、予測されたトランザクションのバージョン・プレッシャが最大しきい値を上回るかどうかに関して、トランザクションを閉じる前に動的に決定することが可能であり、上回らない場合、次のトランザクションを現行トランザクションと集約することができる。次のトランザクションによって、予測されたバージョン・プレッシャが最大しきい値を超える場合、トランザクションは次のトランザクションを集約せずに閉じることができる。
【００９５】
ソフトウェア制御ユニットによって実行されるデータ処理システムの動作の修正は、いくつかの異なる方法で行うことができる。主に、たとえば投機的スレッドの数を増加／減少させること、スレッドによって実行される投機的作業の量を増加／減少させること、トランザクションを集約する／集約しないことなどによる、前述の様々な方法で、バージョン・プレッシャに応答するように、ソフトウェア制御ユニットによってコンピュータ・プログラムのコードが変換される。もちろん、決定されたバージョン・プレッシャ統計に基づくデータ処理システムの動作に対する他のタイプの修正は、例示的諸実施形態の趣旨および範囲を逸脱することなく、例示的諸実施形態の諸機構によって使用可能である。
【００９６】
図９は、例示的一実施形態に従った、データ処理システムの動作を調整するためにバージョン・プレッシャ・フィードバックを使用するための例示的動作の概略を示す流れ図である。図９に示されるように、動作は、投機的バージョニング・キャッシュ内のキャッシュ・ライン・セットに関するロー・バージョン・プレッシャ・データの収集で開始される（ステップ９１０）。ロー・バージョン・プレッシャ・データは、スレッド・バージョン・プレッシャ・モジュールに対して、それらの対応するスレッド要求に基づいて分散される（ステップ９２０）。前述のように、このロー・バージョン・プレッシャ・データは、たとえば投機的バージョニング・キャッシュのキャッシュ・ラインに関連付けられたカウンタを使用して取得することができる。
【００９７】
バージョン・プレッシャ統計は、スレッドおよびグローバル・レベルの両方で収集される（ステップ９３０）。このバージョン・プレッシャ統計に基づいて、投機的バージョニング・キャッシュ上のバージョン・プレッシャのバランスを取る／減少させるために、データ処理システムの動作について実行されることになる修正が決定される（ステップ９４０）。前述のように、これらのバージョン・プレッシャ統計は、ロー・バージョン・プレッシャ・データに基づいて生成されるバージョン・プレッシャの任意の統計尺度とすることができる。たとえば、これらのバージョン・プレッシャ統計は、特定のスレッド、投機的バージョニング・キャッシュ全体などに関する、最大および平均のバージョン・プレッシャとすることができる。好ましい例示的実施形態では、グローバルおよびスレッド特有の、両方のバージョン・プレッシャ統計が生成される。しかしながら、ハードウェア・コストを減少させるため、または他の理由のために、いくつかの例示的実施形態では、全体のキャッシュ・システムに関する、キャッシュ階層内の特定のキャッシュに関する、コア内に共存する複数のスレッドに関する、個々のスレッドそれぞれなどに関する、バージョン・プレッシャ統計のみが実装可能である。
【００９８】
その後、データ処理システムの動作は、実行されることが決定された修正に基づいて修正される（ステップ９５０）。その後、動作は終了する。前述のように、これらの修正は、投機的スレッドの数をスロットリングすることによってコードを変換すること、投機的スレッドをスカッシュすること、投機的スレッドによって実行される作業量をスロットリングすること、既存のスレッドをアイドル状態に入れること、トランザクションを集約することなどを含むことができる。この動作は、連続して、定期的に、または所定のイベントの発生に応答して、反復可能である。
【００９９】
したがって、例示的諸実施形態は、スレッドによって投機的バージョニング・キャッシュ上に及ぼされるバージョン・プレッシャを監視するための機構、ならびに、投機的バージョニング・キャッシュ上のバージョン・プレッシャを減少させること、あるいはスレッドによって及ぼされるバージョン・プレッシャのバランスを取ること、またはその両方を実行するように、データ処理システムの動作における変更を行うためにこのバージョン・プレッシャ情報を使用するための機構を提供する。例示的諸実施形態は、ロー・バージョン・プレッシャ情報を収集し、バージョン・プレッシャの統計尺度を生成し、データ処理システム内でのコードの実行にどの修正タイプを適用するかを決定するために統計尺度を使用する。このように、投機的バージョニング・キャッシュ上の過度のバージョン・プレッシャによるデータ処理システム内の投機的スレッドをスカッシュするコストを最小限にするように、投機的バージョニング・キャッシュ上に及ぼされるバージョン・プレッシャを制御することができる。
【０１００】
上記に加えて、例示的諸実施形態は、前述のように、投機的バージョニング・キャッシュ（ＳＶＣ）を使用してチェックポインティング動作を制御するために、前述のバージョン・プレッシャ監視機構を使用するための諸機構をさらに提供する。これらの追加の例示的実施形態の諸機構では、ＳＶＣの一部分が読み取り／ロード動作のために非投機的キャッシュ・ラインを格納し、ＳＶＣの他の部分が書き込み／ストア動作に関連付けられた投機的キャッシュ・ラインを格納するように、ＳＶＣを配分することができる。したがって、これらの追加の例示的諸実施形態では、すべての読み取りは非投機的動作として扱われ、すべての書き込み動作は投機的動作として扱われる。書き込み／ストア動作に対応する投機的キャッシュ・ラインを格納するために割り振られたＳＶＣの部分は、たとえばＳＶＣ容量の２０％などの最大サイズを有することができる。ＳＶＣ容量のこの最大サイズに基づいて１つまたは複数のしきい値を生成することが可能であるか、あるいは最大サイズそれ自体をしきい値として使用することができる。これらの１つまたは複数のしきい値に達した場合、ＳＶＣの非投機的部分内のキャッシュ・ラインに関して、実行コードの現行の非投機的状態のチェックポイントを生成することができる。
【０１０１】
１つまたは複数のチェックポイントは、１つまたは複数のしきい値に一致するかまたはこれを超えるなどの条件の発生に応答して、生成することが可能であり、結果として１つまたは複数のチェックポイントを生成する必要性が生じる。チェックポイントそれ自体を投機的キャッシュ・ラインとして格納し、その後、キャッシュ・ラインに対して変更のロールバックを作成することを必要とする条件が発生した場合、これを非投機的にすることができる。たとえば、こうした条件は、コードの再生不可部分の実行に先立つある時点まで変更をロールバックした場合、コードの再生不可部分、すなわち再生できないコードの部分に入力するコードの実行、あるいは、ＳＶＣのバージョン・プレッシャが前述の１つまたは複数のしきい値などの所定の基準に合致する条件を含むことができる。ロールバックを必要とする条件が発生した場合、既存のチェックポイントへのロールバックも可能である。たとえばこうした条件は、キャッシュに入れられたデータ内でのソフト・エラー、たとえば、１つまたは複数のキャッシュ・ライン内で１つまたは複数のビットのフリッピングを実行させることが可能なガンマ線または他の物理的現象によって生じるエラーの、検出を含むことができる。これらそれぞれの条件について、以下でより詳細に説明する。
【０１０２】
例示的諸実施形態のバージョン・プレッシャ・モジュールには、こうした条件を監視するため、およびこうした条件が発生した場合に割り込みを生成するための、論理が提供される。バージョン・プレッシャ・モジュールは、オペレーティング・システム内で受け取られるこうした割り込みを生成することができる。オペレーティング・システムは、投機的キャッシュ・ラインを非投機的状態に進行させ、新しいチェックポイント・キャッシュ・ラインの作成を開始するために、適切な割り込みハンドラを開始することができる。さらに、コードの実行がコードの再生不可部分に入るかどうかを決定し、入る場合は、投機的キャッシュ・ラインを非投機的状態に進行させ、コードの再生不可部分の実行が完了した後、新しい投機的チェックポイント・キャッシュ・ラインを開始するための、コンパイラ・サポートを提供することが可能である。すなわちコンパイラは、こうした進行を実行するため、および、その後新しい投機的チェックポイント・キャッシュ・ラインを開始するために、適切な割り込みハンドラ、ルーチン、方法などを呼び出すための命令を、挿入することができる。さらにオペレーティング・システムには、様々なソースを有することが可能な割り込みが、例示的諸実施形態のチェックポイント機構によるものかどうかを決定するための論理が提供され、この場合、投機的キャッシュ・ラインの進行および新しい投機的チェックポイント・キャッシュ・ラインの開始が実装される。いくつかの例示的実施形態では、複数バージョンのチェックポイント・キャッシュ・ラインを格納することが可能であり、割り込みハンドラ、オペレーティング・システムなどは、ロールバック動作が必要な場合に使用する最も適切なバージョンのチェックポイント・キャッシュ・ラインを決定することができる。
【０１０３】
図１０は、例示的一実施形態に従った、投機的バージョニング・キャッシュ・チェックポイント機構の動作を示す例示的図である。投機的バージョニング・キャッシュ（ＳＶＣ）に関連付けられたデータ処理システムのオペレーティング・システムは、コードの実行によって実行される書き込み／ストア動作によって投機的キャッシュ・ラインを格納するために使用可能な、ＳＶＣ内のキャッシュ・ラインの最大数を示す１つまたは複数のしきい値を設定する。ここでも、これらの追加の例示的諸実施形態では、すべての読み取り／ロード動作は非投機的動作とみなされ、すべての書き込み／格納動作は、本明細書に記載された例示的諸実施形態の諸機構に従ってそれらの変更が非投機的状態へと持続するまで、本質的に投機的とみなされる。読み取り／ロード動作は、キャッシュの状態が変更しないという点で非投機的であるため、新しいバージョンのキャッシュ・ラインを生成する必要がない。しかしながら、読み取り／ロード動作が投機的書き込み動作に従い、結果として新しいバージョンおよび関連付けられたバージョンのキャッシュ・ラインが生じた場合、読み取り／ロード動作は書き込み動作の結果を読み取ることになり、読み取り動作は古い値の代わりに新しいバージョンのキャッシュ・ラインを読み取ることになる。これは、システムを以前の状態にロールバックさせるソフト・エラーまたは任意の他の条件の場合、キャッシュの状態を復元するように、古い値のみが保持されるケースである。１つまたは複数のしきい値を、ＳＶＣ全体、個々のキャッシュ・ライン・セット、個々のスレッド、これらの任意の組み合わせなどに関連付けることができる。しきい値を使用して、たとえば投機的キャッシュ・ラインを非投機的状態に変換し、新しいチェックポイント動作を実行するタイミングを決定することができる。例として、１つまたは複数のしきい値は、
投機的書き込み／ストアによってＳＶＣ容量全体の１０％を投機的キャッシュ・ラインが占有しているか、または、投機的書き込み／ストアによってＳＶＣ内の所与のキャッシュ・ライン・セットの５０％までを投機的キャッシュ・ラインが占有している、第１のしきい値とすることができる。これらの条件のいずれかが存在している場合、投機的キャッシュ・ラインを進行させ、新しいチェックポイントを生成するために、割り込みをトリガすることができる。別の方法として、たとえばＳＶＣ容量の２０％を投機的キャッシュ・ラインが占有している、単一のしきい値を使用することができる。
【０１０４】
これらのしきい値は、前述のバージョン・プレッシャ・モジュールを使用して生成可能なＳＶＣ内のバージョン・プレッシャの基本的な尺度である。大きな相違点は、ここでは、投機的キャッシュ・ラインを非投機的状態に進行させ、新しいチェックポイントを開始するために、適切な割り込みハンドラを実行させるように、オペレーティング・システムに対する割り込みを生成するための論理および機能が、バージョン・プレッシャ・モジュールに提供されることである。これらの割り込みは、ＳＶＣ内の高すぎるバージョン・プレッシャに割り当てられた割り込み信号またはコードに関連付けられた特定の割り込みルーチンに関連付けられたコードを実行するために、スレッドの正規の実行に割り込むように、グローバル・バージョン・プレッシャ・モジュール３２０から、またはスレッド・バージョン・プレッシャ・モジュール３３０〜３３６から、スレッド３４０〜３４６へと送達される。グローバル・バージョン・プレッシャ・モジュール３２０から少なくとも１つのスレッド３４０〜３４６へ割り込みを送達する場合、この割り込みは、バージョン・プレッシャ・バス３８０を介して、または別の割り込みバスを介して送達することができる。
【０１０５】
図１０に示されるように、コードの実行１０１０中に、チェックポイント１０１２を開始することができる。このチェックポイント１０１２の開始は、チェックポイント１０１２がコードの実行１０１０中の初期チェックポイント１０１２であるため、または、以下で論じるように、検出された条件が発生しているため、とすることができる。チェックポイント１０１２の生成の一部として、新しいバージョン識別子（ＶＩＤ）が生成され、現行スレッドに関連付けられる。その後この新しいＶＩＤ、たとえばＶＩＤ  Ｘは、キャッシュへのすべてのストア動作にタグ付けするために使用される。後続のストアでは、スレッドに関連付けられたＶＩＤが取り出され、キャッシュにアクセスする際に使用される。キャッシュ内にヒットが存在する場合、すなわちデータが投機的バージョニング・キャッシュのキャッシュ・ライン内にある場合、書き込み／ストア動作によって「ヒット」されるこのキャッシュ・ラインが現行のＶＩＤ  Ｘにも関連付けられているかどうかに関してチェックされる。関連付けられている場合、書き込み／ストアは通常通り進めることができる。現行の「ヒット」キャッシュ・ラインが古いＶＩＤに関連付けられているか、またはＶＩＤには関連付けられていないが非投機的である場合、キャッシュはこのキャッシュ・ラインをコピーする必要がある。この新しいコピーは投機的としてラベル付けされ、ＶＩＤ  Ｘと関連付けられる。次にストアは、このコピーされたキャッシュ・ライン上を通常通り進むことができる。したがって、ＳＶＣ内のチェックポイントの場合、最後のチェックポイント以降にストアが存在した各キャッシュ・ラインについて、新しいＶＩＤに関連付けられた１つの追加の投機的キャッシュ・ラインが存在する。プログラム・カウンタ、システム・レジスタなどの状態などの、非投機的キャッシュ内に格納されていない他の状態情報を、データ処理システムの１つまたは複数のバッファに記録することができる１０１６。チェックポイント投機的キャッシュ・ライン内の情報、ならびに１つまたは複数のバッファに格納された状態情報は、コード実行中の障害、ソフト・エラーなどによるような、コードの実行のロールバックが必要な場合、後で使用することができる。チェックポイント１０１２の開始は、コード自体、オペレーティング・システム、コンパイラなどによって実行可能である。
【０１０６】
チェックポイント１０１２の生成に続いて、コードの実行は、特定コードの実行に従ってコードが読み取り／ロードおよび書き込み／ストアを実行することで続行される。前述のように、読み取り／ロードは非投機的動作として扱われるため、これらの読み取り／ロードによってＳＶＣ内で生成された任意のキャッシュ・ラインはＳＶＣの非投機的部分に格納される。コードの実行によって実行されるすべての書き込み／ストアは投機的であるとみなされるため、これらの書き込み／ストアの結果として発生するキャッシュ・ライン変更は、ＳＶＣの投機的部分内の投機的キャッシュ・ライン・バージョンに格納される。このようにして、ＳＶＣの投機的部分内の投機的キャッシュ・ラインの数は、コードが実行されるにつれて増加し、それによってＳＶＣ内のバージョン・プレッシャが増加する。投機的部分または非投機的部分のために予約されるＳＶＣの物理的部分は存在しない可能性があることに留意されたい。チェックポイントの直後、いかなるストアの前にも、典型的にはＳＶＣの１００％が非投機的データを含むことになる。ストアに遭遇すると、新しいバージョンのキャッシュ・ライン（オリジナル・バージョンがすでに存在した場合）、または単なる投機的キャッシュ・ライン（書き込みアクセス時にオリジナル・バージョンがまだ存在していなかった場合）が作成される。変更を無効化する必要のある条件が発生した場合、これらのキャッシュ・ラインに対する変更をロールバックしなければならない可能性があるという事実により、こうしたバージョン／投機的キャッシュ・ラインは本質的に投機的である。
【０１０７】
コードが実行されている間のその後の時点で、再生不可のコード部分１０２０に遭遇し、これが実行される可能性がある。再生不可コード１０２０は、入力／出力動作、ファイルの読み取りまたはファイルへの書き込みなどのファイル動作、ネットワークを介するメッセージの送信および受信などのメッセージング動作、などの動作を実行するコード、他のスレッド、ロックのアクセスとデータを共有する、再生不可コード１０２０の実行前に発生するチェックポイントに実行コードの状態がロールバックされた場合に再生することができないコードなど、とすることができる。すなわち、実行コードの状態がチェックポイントにロールバックされた場合、実行コードの状態はチェックポイントで格納された状態にリセットされ、実行されたコードはこのチェックポイント状態から再生することができる。再生不可コード１０２０は、他のスレッドの動作に影響を与えるか、そうでなければ現在実行中のスレッドの外部で実行する他のコードにデータを提供するコードである。
【０１０８】
コンパイラは、コードの実行で投機的キャッシュ・ラインを非投機的状態に進行させる割り込みハンドラに割り込みを開始させるために、再生不可コード１０２０に関連した実行可能コードに命令を挿入することが可能であるか、そうでなければ、命令自体が、再生不可コード１０２０への入力前に、投機的キャッシュ・ラインを非投機的状態に進行させることができる。したがって、実行コードおよび特定スレッドに関連付けられたすべての投機的キャッシュ・ラインは非投機的状態へと進行され、すなわち、投機的キャッシュ・ラインに提示された変更は、ＳＶＣあるいはメモリまたはその両方の非投機的部分まで持続され、再生不可コード１０２０はそのＳＶＣに対する変更を非投機的に実行しながら実行される。再生不可コード１０２０が実行を完了すると、命令を挿入したコンパイラは、新しいチェックポイント１０３０を開始するために割り込みハンドラを呼び出すオペレーティング・システムへの割り込みを生成する。別の方法として、コンパイラは、新しいチェックポイント１０３０を直接開始する命令を挿入することができる。
【０１０９】
上記では、コンパイラがコードを分析し、割り込みを生成する動作を実行するため、またはそうでなければ投機的キャッシュ・ラインを非投機的状態に進行させるために、実行可能コードに命令を挿入することを想定しているが、例示的諸実施形態はこれらに限定されないことに留意されたい。むしろ、オペレーティング・システムは、実行コードによって実行されている動作を分析し、それらの動作がコードの再生不可部分を示すかどうかを決定し、示す場合は、投機的キャッシュ・ラインを非投機的状態に変換させるために、コードの割り込みまたは実行を開始し、コードの動作の再生不可部分の実行に続いて新しいチェックポイントを開始することができる。たとえば、コンパイラまたはオペレーティング・システムは、Ｉ／Ｏデバイスへ書き込むこと、スレッド間で情報を渡すことなどに関連付けられた、コード／動作を識別することが可能であり、投機的キャッシュ・ラインの非投機的キャッシュ・ラインへの移行によって、再生不可コード・セクションに入ることあるいは新しいチェックポイントの生成またはその両方に関連付けられたコードを実行させるために、コードに命令を挿入すること（コンパイラ）、または動作を開始すること（オペレーティング・システム）の、いずれかが可能である。
【０１１０】
前述のように新しいチェックポイント１０３０を生成する際に、新しいバージョン識別子（ＶＩＤ）が生成され、現行スレッドに関連付けられる。この新しいＶＩＤ、たとえばＶＩＤ  Ｘは、キャッシュへのすべてのストア動作のタグ付けに使用される。その後のストアでは、スレッドに関連付けられたＶＩＤが取り出され、キャッシュにアクセスする際に使用される。キャッシュ内にヒットが存在する場合、キャッシュ・ラインが現行のＶＩＤ  Ｘにも関連付けられているかどうかに関するチェックが実行される。関連付けられている場合、ストアは通常通り進めることができる。現行のキャッシュ・ラインが古いＶＩＤに関連付けられているか、またはＶＩＤには関連付けられていないが非投機的である場合、キャッシュはこのキャッシュ・ラインをコピーし、キャッシュ・ラインのコピーを投機的およびＶＩＤ  Ｘに関連付けられているものとしてラベル付けする。その後、ストアは通常通りこのコピーされたキャッシュ・ライン上を進むことができる。たとえばプログラム・レジスタ、システム・レジスタ、プログラム・カウンタなどの、ＳＶＣ内に存在しない状態情報は、チェックポイント情報として１つまたは複数のバッファ内に記録される。
【０１１１】
コードの実行は、ＳＶＣの非投機的部分に対する更新を実行する読み取り／ロード動作、および、ＳＶＣの投機的部分における投機的キャッシュ・ラインの数を増加させる書き込み／ストアを続行する。ＳＶＣ内の投機的キャッシュ・ラインの数が増加するにつれて、バージョン・プレッシャは前述と同様に増加する。このバージョン・プレッシャは、ＳＶＣ全体、関連付けられたキャッシュ・ラインのセット、特定のスレッドなどに関するものとすることができる。たとえば、ＳＶＣ全体レベルでゼロまたはそれ以上のしきい値、関連付けられたキャッシュ・ライン・セットのレベルでゼロまたはそれ以上のしきい値、スレッド・レベルでゼロまたはそれ以上のしきい値など、１つまたは複数のこれらのレベルで、こうしたバージョン・プレッシャに対してゼロまたはそれ以上のしきい値を確定することができる。好ましくは、これらのレベルのうちの１つで少なくとも１つのしきい値が確定される。
【０１１２】
その後のある時点で、投機的キャッシュ・ラインに関してＳＶＣのバージョン・プレッシャは、たとえば、最大容量しきい値、ＳＶＣ全体に関するバージョン・プレッシャしきい値、ＳＶＣレベル、スレッド・レベル、あるいはキャッシュ・ライン・セット・レベルまたはそれらすべてのレベルでのバージョン・プレッシャしきい値の組み合わせなど、１つまたは複数のしきい値を超える可能性がある。１つまたは複数のしきい値に一致するかまたはこれを超える場合、対応するバージョン・プレッシャ・モジュールはオペレーティング・システムに対する割り込みを生成し１０４０、これが再度、割り込みハンドラを呼び出して、投機的キャッシュ・ラインの非投機的状態への進行および新しいチェックポイントの作成を処理する。割り込みを生成するバージョン・プレッシャ・モジュールは、グローバル・バージョン・プレッシャ・モジュールまたはスレッド・バージョン・プレッシャ・モジュールとすることができる。チェックポインティングがスレッドごとに実行されるシステムでは、全体として、スレッドが「チェックポインティングのユニット」であるシステムにおけるように、スレッド・バージョン・プレッシャ・モジュール内のバージョン・プレッシャしきい値を関連付けることがより有益である。結果としてシステム内でそれぞれのスレッドへの割り込みを（順に、または同時に）生成することになる、キャッシュごとまたはシステムごとのバージョン・プレッシャしきい値を関連付けることについても考えてみることができる。こうしたシステムでは、チェックポインティングは依然としてスレッドごとに実行されることになるが、バージョン・キャッシュの有するチェックポインティング専用のキャッシュ・ラインが多すぎるなどの、グローバル条件によって、チェックポインティングをトリガすることができる。チェックポインティングがシステムごとに実行されるシステムでは、システム内のすべてのスレッドに対して単一の共有チェックポイントを使用しながら、すべてのスレッドがほぼ同時にチェックポイントを生成する。こうしたシステムでは、全体として、ＳＶＣ全体に対して単一のしきい値を使用することがより有益である。
【０１１３】
オペレーティング・システムは、割り込みに応答して、ＳＶＣの投機的部分に格納された投機的キャッシュ・ラインを非投機的状態に進行させるための動作を実行する、割り込みハンドラを呼び出す。この進行は、単に、スレッドに関連付けられたＶＩＤを非投機的としてラベル付けすることによって実行される。この進行により、いくつかの以前の非投機的ラインを無効とさせることもできる。たとえば、ＶＩＤ  Ｘ下の投機的バージョンおよび非投機的バージョンの、２つのバージョン下に存在するキャッシュ・ラインがあるものと想定してみる。ＶＩＤ  Ｘが非投機的へと進行した場合、ＶＩＤ  Ｘに関連付けられたキャッシュ・ラインが新しい非投機的状態となる。結果として、ここで、以前のチェックポイント時点の古い状態へロールバックする目的で維持された古い非投機的ラインが無効となり、ＶＩＤ  Ｘを備えたキャッシュ・ラインのバージョンが新しい非投機的バージョンとなる。したがって、ＶＩＤ  Ｘ下のバージョンも存在する非投機的キャッシュ・ラインのみが、ＶＩＤ  Ｘの非投機的状態への進行過程で無効である。
【０１１４】
投機的キャッシュ・ラインが非投機的状態に進行すると、割り込みハンドラは新しいチェックポイント１０５０の作成を開始する。新しいチェックポイント１０５０の作成は、非投機的キャッシュ・ラインの非投機的状態を、１つまたは複数のチェックポイント・キャッシュ・ラインとしてＳＶＣの投機的部分に格納することを含むことができる１０６０。さらに、たとえばプログラム・カウンタ、システム・レジスタ、および他の状態情報などの、ＳＶＣに格納されていない状態情報を、１つまたは複数のバッファ内に維持することができる１０７０。
【０１１５】
チェックポイント間で、実行コードの障害、ソフト・エラーなどが検出可能な場合があることを理解されたい。たとえば、エラー訂正コード（ＥＣＣ）、パリティ・データなどを使用して、ＳＶＣのキャッシュ・ライン内に格納されたデータ内のエラーを識別することができる。たとえばこうしたエラーは、キャッシュ・ライン内のビットに状態をフリップさせ、それによって格納されたデータ内にエラーが導入される、ガンマ線などによって引き起こされるソフト・エラーとすることができる。こうしたソフト・エラーは、ＥＣＣ、パリティ・データなどによって検出可能である。プロセッサ、プロセッサ・メモリ、システム・メモリ、オペレーティング・システム、バージョン・プレッシャ・モジュールなどは、こうした検出を実行するため、およびこうしたエラーが検出された場合に割り込みを生成するための、関連付けられた論理を有することができる。プロセッサ、メモリ、オペレーティング・システム、バージョン・プレッシャ・モジュールなどには、プロセッサ、メモリ・コントローラ、オペレーティング・システム、バージョン・プレッシャ・モジュールなどがエラーの訂正を実行できるようにする、追加の論理が存在可能である。こうした場合、エラーが訂正できると、以前のチェックポイントにロールバックするように割り込みを生成する必要がない。
【０１１６】
チェックポイント間の非投機的キャッシュ・ラインに対して行われた任意の変更をロールバックするための１つまたは複数の動作を実行するために、適切な割り込みハンドラを呼び出すオペレーティング・システム内で、割り込みを受け取ることができる。すなわち、検出されたエラーが選択される前に発生した好適なチェックポイント、およびチェックポイント・キャッシュ・ライン内の対応する状態情報を使用して、非投機的キャッシュ・ラインの状態をチェックポイントの状態へ復元する。その後、エラーが訂正されるように、イベントの再生、コードの実行の再開などが可能である。
【０１１７】
図１１は、例示的一実施形態に従った、ソフト・エラーの発生に関して、投機的バージョン・キャッシュ・チェックポインティング機構を示す例示的図である。図１１は、ソフト・エラー１１１０、１１２０、および１１３０が投機的バージョニング・キャッシュ（ＳＶＣ）内で検出されるように示されている点を除いて、本質的に図１０と同じである。前述のように、これらのソフト・エラーは、ビットをフリップさせるガンマ線または他のソフトウェア関連エラーによるものとすることができる。こうしたエラーに応答して、プロセッサ、メモリ・コントローラ、バージョン・プレッシャ・モジュール（グローバルまたはスレッドのいずれか）などは、チェックポインティングされたコードの一部の実行中に割り込みが発生したかどうか、すなわち、実行中であったコードが再生不可コードでないことを決定する、オペレーティング・システムに対する割り込みを生成することができる。再生不可コード・セクション中にエラーが発生した場合、回復不能エラーに遭遇している。こうした場合、一般に、回復不能エラー割り込みの形で回復不能エラーが発生したことをアプリケーションに通知することができる。これが、エラーに基づくアプリケーションの終了につながる場合がある。また、アプリケーションのユーザ・レベルのチェックポイントへの回復につながる場合もある。たとえば何らかのシミュレーション・アプリケーションは、ユーザが後にシミュレーションの結果を可視化できるように、１００（または任意の他の静的または動的な数）時間ステップごとに取得した結果をハード・ディスクに格納する。こうしたシステムでは、アプリケーションは典型的には、依然に遭遇した０  ｍｏｄ  １００時間ステップで全体のシミュレーションを再開することができる、「ユーザ・レベル」のチェックポインティングを有する。こうしたユーザ・レベルのチェックポインティングを例示的諸実施形態と共に使用して、コードの再生不可部分からの回復不能エラーに応答して、ユーザ・レベルのチェックポイントへの回復を提供することができる。
【０１１８】
チェックポインティングされたコードが実行中に割り込みが発生した場合、コードの実行を以前のチェックポイントの状態にロールバックすることができる。たとえばソフト・エラー１１１０は、エラーが再生不可コード部分１０２０で発生していないため、チェックポインティングされたコード内でエラーが発生したことを決定する、オペレーティング・システムに対する割り込みを実行することが可能である。したがって、オペレーティング・システムまたはオペレーティング・システムに関連付けられた割り込みハンドラは、実行コードおよびＳＶＣの状態に対する変更をチェックポイント１０１０にロールバックするための動作を実行する。すなわち、１つまたは複数のバッファに格納された状態およびＳＶＣのチェックポイント・キャッシュ・ラインに格納されたキャッシュ・ラインの状態を使用して、対応するプログラム・カウンタ、システム・レジスタなどの状態、およびＳＶＣの非投機的キャッシュ・ラインが回復される。したがって、実行コードの状態は、以前のチェックポイントの時点の状態に戻される。同様に、ソフト・エラー１１２０は、結果としてコード実行の状態をチェックポイント１０３０の時点の状態に戻すことになる割り込みを実行することが可能であり、ソフト・エラー１１３０は、結果としてコード実行の状態をチェックポイント１０５０の時点の状態に戻すことになる割り込みを実行することが可能である。
【０１１９】
したがって、例示的諸実施形態は、実行コードの状態およびＳＶＣのチェックポイントを生成するタイミングを決定するために、ＳＶＣ内のバージョン・プレッシャに関してしきい値を設定するための機構を提供する。例示的諸実施形態のバージョン・プレッシャ・モジュールには、こうしたバージョン・プレッシャしきい値に一致するかまたはこれを超える場合に割り込みを生成するための論理が提供される。こうした割り込みに応答して、投機的キャッシュ・ラインを非投機的状態に進行させ、その後新しいチェックポイントを生成するための動作が実行される。チェックポイントを使用して、検出されたソフト・エラーまたは実行コードの他の障害の際に、ＳＶＣおよびシステムの状態情報への変更をロールバックすることができる。
【０１２０】
図３と同様である図１２に示されるように、バージョン・プレッシャ・モジュール１２２０および１２３０〜１２３６は、ＳＶＣ１２１０に関連付けられた１つまたは複数のしきい値に一致するかまたはこれを超える場合に割り込みを生成するための論理１２８０〜１２８８を有する。しきい値は、オペレーティング・システム１２９２からバージョン・プレッシャ・モジュール１２２０および１２３０〜１２３６へ送り、割り込みを生成するタイミングを決定する際に使用するための論理１２８０〜１２８８に関連して格納することができる。これらのしきい値はユーザ指定とすることが可能であり、オペレーティング・システムに関連付けられたシステム・レジスタまたはオペレーティング・システムによってアクセス可能な他のメモリ位置に格納することができる。しきい値は、特定のスレッド、ＳＶＣ全体に関連付けるか、または、それぞれの個別のスレッド、キャッシュ・ライン・セットなどに適用可能な一般のしきい値とすることができる。単一のしきい値またはしきい値の組み合わせを、スレッド、ＳＶＣ、またはキャッシュ・ライン・セットに適用することができる。
【０１２１】
図３に関して前述したように、グローバル・バージョン・プレッシャ・モジュール１２２０は、ＳＶＣ１２１０全体に関して、それぞれ個々のスレッドに関して、キャッシュ・ライン・セットなどに関して、バージョン・プレッシャ情報を収集することができる。この情報は、スレッド・バージョン・プレッシャ・モジュール１２３０〜１２３６に送ることが可能であり、その後、これが個々のスレッドに関するバージョン・プレッシャ統計を生成することができる。別の方法として、グローバル・バージョン・プレッシャ・モジュール１２２０はバージョン・プレッシャ統計を生成し、これらをスレッド・バージョン・プレッシャ・モジュール１２３０〜１２３６に送ることができる。グローバルまたはスレッドのいずれかのバージョン・プレッシャ・モジュール１２２０および１２３０〜１２３６で生成される統計は、個々のスレッド、ＳＶＣ全体、個々のキャッシュ・ライン・セットなどに関するものとすることができる。
【０１２２】
割り込み論理１２８０〜１２８８は、ロー・バージョン・プレッシャ情報、または他の例示的諸実施形態ではバージョン・プレッシャ統計が、１つまたは複数のバージョン・プレッシャしきい値に一致するかどうかを決定する。たとえば、キャッシュ・ワイド・レベルでは、投機的キャッシュ・ラインについてＳＶＣ内にキャッシュ・ラインの最大ｎ％が存在する可能性がある。さらにキャッシュ・ライン・セット・レベルでは、例示的しきい値は、所与のキャッシュ・ライン・セット内の投機的キャッシュ・ラインについてキャッシュ・ラインの最大ｍ％が存在するものとすることができる。さらにスレッド・レベルでは、例示的しきい値は、所与のスレッドに関する投機的キャッシュ・ラインについてキャッシュ・ラインの最大ｋ％が存在するものとすることができる。さらにこれらのタイプのしきい値の組み合わせを使用することが可能であり、たとえば、個々のキャッシュ・ライン・セットにおいて、キャッシュ・ラインの全体で１０％より上、または５０％までを投機的キャッシュ・ライン・データが占有している場合、割り込みが生成される。
【０１２３】
こうした割り込みしきい値の使用は、オペレーティング・システム内の適切な設定によって使用可能／使用不可とすることができる。たとえば、コンパイラ、オペレーティング・システム、またはバージョン・プレッシャ・モジュールがしきい値チェックの実行に時間がかかり過ぎる場合、しきい値のうちの１つまたは複数を使用可能／使用不可として、システムの性能を改善させることができる。他の例として、すでに実行されているコードの内部に何らかのチェックポインティング・コードが組み込まれている場合、バージョン・プレッシャ・モジュールによって実行されるチェックポインティングを修正するために、様々なしきい値を使用可能／使用不可とすることができる。
【０１２４】
オペレーティング・システム１２９２、およびおそらくはコンパイラ（図示せず）は、プロセスを再開するために必要な状態情報、すなわち、たとえば特別なシステム・レジスタ、プログラム・カウンタなどのメモリまたはユーザ・アクセス可能アドレス・スペース内にない情報を記録するためにシステム・メモリ・バッファ１２９５を割り振るための論理を備える。さらに、オペレーティング・システム１２９２あるいはコンパイラまたはその両方は、再生不可コードの入力前にＳＶＣ投機的キャッシュ・ラインを非投機的状態へと進行させるための論理を有する。こうした論理は、オペレーティング・システムに関連付けられた割り込みハンドラの形で、または、再生不可コードを備える実行コードがルーチン、モジュール、方法などを入力するのに先立って、こうした動作を実行するために、実行コードに命令を挿入するためのコンパイラ内の論理の形で、提供することができる。さらにこの論理は、新しいチェックポイントとして状態を記録し、再生不可コードが実行を完了した後に、投機的バージョン・キャッシュ状態を再開することができる。
【０１２５】
加えて、オペレーティング・システム１２９２あるいはコンパイラまたはその両方は、割り込みがチェックポインティングされたコードに関連付けられていること、すなわち再生不可コードではないことを検証するための論理を備える。オペレーティング・システム１２９０あるいはコンパイラまたはその両方は、割り込みが受け取られ、チェックポインティングされたコードに関連付けられた場合に、新しいチェックポイントが作成され、続いて投機的キャッシュ・ラインが非投機的状態へと進行されるように、割り込みハンドラに対する実行のバランスを取るための論理を有する。
【０１２６】
オペレーティング・システム１２９２、あるいはバージョン・プレッシャ・モジュール１２２０または１２３０〜１２３６は、障害、ソフト・エラーなどを示す条件を検出した場合、変更を前のチェックポイントにロールバックすることによって、こうしたエラーから回復するための諸動作を実行することができる。こうしたエラーが検出された場合、オペレーティング・システム１２９２は、コードの実行が再生不可コード部分にある間に、エラーが検出されたかどうかを決定することができる。コードの実行が再生不可コード部分にないものと想定すると、チェックポイントがエラー発生に先立って作成されたという確信のある最新のチェックポイントが選択される。別の方法として、チェックポイントがエラーに先行する可能性が高い最新のチェックポイントを選択することができる。さらに別の方法として、オペレーティング・システムの動的決定に基づいて、最も古い（最もセキュア）／最も新しい（再実行オーバヘッドが最も少ない）チェックポイントを選択することができる。割り込みが再生不可コード部分にある場合、知られた有効チェックポイントへのロールバックを使用してソフト・エラーを回復することができないため、エラーはアプリケーションに伝搬されることになる。この場合アプリケーションは、回復不能エラーを経験していることをユーザに示しながら、中止または終了することができる。他のケースでは、アプリケーションは、回復不能エラーから回復できる追加の論理を有することができる。たとえば物理現象（気候、分子力学など）をシミュレートするいくつかのアプリケーションは、ユーザがシミュレートされている物理現象の状態を見えるようにするために、時折、途中結果をハード・ディスクのファイルに保存する。こうした場合、こうした回復不能エラーを経験したアプリケーションは、ファイルに保存された最新の状態にバックトラックし、そこからすべての計算を再開するための機会を有する。こうした再開には、ユーザの手動介入を必要とする場合がある。
【０１２７】
システムが単一の以前のチェックポイントを維持している場合、チェックポイント間でのこうした選択は不要である。しかしながら、前述の諸実施形態は単一の以前のチェックポイントに関して説明しているが、実際には、所望であればＳＶＣ内に複数の以前のチェックポイントを維持することが可能であることに留意されたい。たとえば、以前の２つのチェックポイントを維持することができる。このような場合、様々な維持されているチェックポイントから、知られた状態にロールバックするために使用するのに最適なものを選択するために、こうした選択を実行することができる。
【０１２８】
オペレーティング・システム１２９２によってチェックポイントが選択されると、第１に、バージョン識別子を無効とマーク付けすることなどにより、選択されたチェックポイントよりも新しいすべてのチェックポイントを無効化することによって、ロールバック動作が実行される。チェックポイントからの状態は、１つまたは複数のバッファおよびＳＶＣ内のチェックポイント・キャッシュ・ラインに格納された状態情報を使用して、適切なレジスタ、カウンタ、キャッシュ・ラインなどに再インストールされる。その後、ＳＶＣが再開され、コードの実行が再開される。
【０１２９】
したがって例示的諸実施形態は、ＳＶＣおよびＳＶＣ内のバージョン・プレッシャに関連付けられた１つまたは複数のしきい値を使用して、チェックポイントを開始するための諸機構をさらに提供する。さらにこれらの諸機構は、コードの再生不可部分に入るコードの実行を考慮する。さらに、エラーまたは障害を検出するため、および、こうしたエラーまたは障害の検出に応答して、例示的諸実施形態の諸機構によって作成された以前のチェックポイントへ変更をロールバックするために適切な動作が実行できるように、バージョン・プレッシャ・モジュールから割り込みを生成するための諸機構が提供される。
【０１３０】
図１３は、例示的一実施形態に従った、１つまたは複数のバージョン・プレッシャしきい値に一致するかまたはこれを超えたことに応答して割り込みを生成するための例示的動作を示す概略的流れ図である。特に示されていない限り、図１３に概略が示された動作および個々のステップは、たとえば例示的諸実施形態のバージョン・プレッシャ・モジュールのうちの１つまたは複数で実行可能である。
【０１３１】
図１３に示されるように、動作は、チェックポインティングを実行するための１つまたは複数のバージョン・プレッシャしきい値を受け取ることによって開始される（ステップ１３１０）。前述のように、これらのしきい値は、たとえばオペレーティング・システムから受け取ることが可能であり、エラーおよび障害に対する所望のセキュリティ・レベルを達成するようにユーザ定義とすることができる。
【０１３２】
その後、キャッシュ・ライン・セットについてロー・バージョン・プレッシャ・データが収集されるかまたは受け取られる（ステップ１３２０）。たとえば、ロー・バージョン・プレッシャ・データは、グローバル・バージョン・プレッシャ・モジュールによって収集され、このデータをグローバル・バージョン・プレッシャ・モジュールから受け取るように、スレッド・バージョン・プレッシャ・モジュールへと分散されることが可能である。このロー・バージョン・プレッシャ・データは、バージョン・プレッシャ統計が、たとえばＳＶＣレベル、スレッド・レベル、キャッシュ・ライン・セット・レベルなどで計算される際の基準である（ステップ１３３０）。こうした計算は、様々な例示的実施形態に関して上記で説明している。これらのバージョン・プレッシャ統計は１つまたは複数のバージョン・プレッシャしきい値と比較され（ステップ１３４０）、チェックポイントを生成すべきかどうかが決定される（ステップ１３５０）。たとえばこの決定では、チェックポイントを生成すべきであることを示す、１つまたは複数のバージョン・プレッシャしきい値のうちの１つまたは複数に一致するかまたはこれを超えるかを決定することができる。前述のように、いくつかの例示的実施形態では、複数のバージョン・プレッシャしきい値を組み合わせて、新しいチェックポイントを生成する前に一致するかまたは超える必要のあるより複雑な条件を生成することができる。
【０１３３】
チェックポイントが生成されることになる場合、新しいチェックポイントを生成する必要性を示す割り込みが、オペレーティング・システムに対して生成される（ステップ１３６０）。次にオペレーティング・システムは、ＳＶＣおよびシステム・バッファ内にチェックポイントを生成するために適切な割り込みハンドラを呼び出す（ステップ１３７０）。すなわち、このチェックポイントは、チェックポイント・キャッシュ・ラインをＳＶＣの投機的部分に格納すること、および、ＳＶＣ内に維持されていない状態情報を、後でロールバック動作が必要な場合に使用するためにシステム・メモリ・バッファ内に格納することを含む。その後、動作は終了する。
【０１３４】
図１４は、例示的一実施形態に従った、チェックポイントを生成するための例示的動作を示す概略的流れ図である。特に示されていない限り、図１３に概略が示された動作および個々のステップは、たとえば、例示的諸実施形態の割り込みハンドラ、オペレーティング・システムなどで実行可能である。
【０１３５】
図１４に示されるように、コードの実行を中断することによって動作が開始される（ステップ１４１０）。ＳＶＣ内の投機的キャッシュ・ラインは非投機的状態へと進行される（ステップ１４２０）。チェックポイントは、チェックポイント・キャッシュ・ラインをＳＶＣ内で投機的キャッシュ・ラインとして生成すること（ステップ１４３０）、およびチェックポイント情報をシステム・メモリ・バッファ内に格納すること（ステップ１４４０）によって、生成される。その後、コードの実行が再開され（ステップ１４５０）、動作は終了する。前述のように、ステップ１４３０は、スレッドに関連付けられた新しい投機的バージョンＩＤ（ＶＩＤ）を生成することにあるため、結果としてスレッドによって生成されるいずれの今後のストア／書き込み動作も、その新しいＶＩＤの下で投機的としてマーク付けされることになる。
【０１３６】
図１５は、例示的一実施形態に従った、ロールバック動作を実行するための例示的動作を示す概略的流れ図である。図１５に概略が示された動作は、オペレーティング・システムによって、またはオペレーティング・システムに関連して実行することができる。たとえば、動作１５１０および１５２０はバージョン・プレッシャ・モジュールによって実行可能であり、他の動作はオペレーティング・システムによって実行可能である。別の方法として、すべての動作はオペレーティング・システムによって実行可能である。
【０１３７】
図１５に示されるように、動作は、ＳＶＣに格納されたデータ内のエラーまたは実行コードの障害の検出で開始される（ステップ１５１０）。前述のように、このエラーは、たとえばＳＶＣ内のビットをフリップさせる、ガンマ線または他のエラー・ソースによるソフト・エラーとすることができる。エラーまたは障害の検出に応答して、エラーが、コードの再生不可部分にあるコードの実行によるものであるかどうかが決定される（ステップ１５２０）。コードの再生不可部分にあるコードの実行によるものである場合、エラーが回復不能エラーであることを示す通知あるいは割り込みまたはその両方が生成され（ステップ１５３０）、その後、たとえばアプリケーションの終了、ユーザ・レベル・チェックポイントへの回復のための回復論理の呼び出しなど（図示せず）、回復不能エラーのための通常の割り込み処理が実行される。エラー／障害が、コードの再生不可部分にあるコードの実行によるものでない場合、オペレーティング・システムに対して割り込みが生成される（ステップ１５４０）。ロールバック動作を実行する際に使用するために、以前のチェックポイントが選択される（ステップ１５５０）。前述のように、システムによって以前のチェックポイントが１つだけ維持されている場合、こうした選択を避けることができる。しかしながら、以前のチェックポイントが複数維持されている場合、最も確実にエラー／障害が発生する前のものであり、必要な再実行の量を最小限にする、チェックポイントが選択される。
【０１３８】
チェックポイントが選択されると、ＳＶＣ内のチェックポイント・キャッシュ・ラインに格納された状態情報、および選択されたチェックポイントに関するシステム・メモリ・バッファ内の状態情報を使用して、ロールバック動作が実行される（ステップ１５６０）。状態をチェックポイントの時点に復元すると、コードの実行が再開され（ステップ１５７０）、動作は終了する。
【０１３９】
前述のように、例示的諸実施形態は、全体的にハードウェア実施形態、全体的にソフトウェア実施形態、またはハードウェア要素およびソフトウェア要素の両方を含む実施形態の形を取ることができることを理解されたい。一実施形態例では、例示的諸実施形態の諸機構が、ファームウェア、常駐ソフトウェア、マイクロコードなどを含むがこれらに限定されない、ソフトウェアまたはプログラム・コード内に実装される。
【０１４０】
プログラム・コードの格納あるいは実行またはその両方に好適なデータ処理システムは、システム・バスを通じてメモリ要素に直接または間接的に結合された、少なくとも１つのプロセッサを含むことになる。メモリ要素は、プログラム・コードの実際の実行中に使用されるローカル・メモリ、大容量ストレージ、および、実行時に大容量ストレージからコードを取り出さなければならない回数を減らすために少なくとも一部のプログラム・コードの一時ストレージを提供するキャッシュ・メモリを、含むことができる。
【０１４１】
入力／出力またはＩ／Ｏデバイス（キーボード、ディスプレイ、ポインティング・デバイスなどを含むがこれらに限定されない）は、直接、または介在するＩ／Ｏコントローラを通じて、システムに結合することができる。他のデータ処理システムあるいはリモートのプリンタまたはストレージ・デバイスに、介在する専用または公衆のネットワークを通じて、データ処理システムを結合できるようにするために、ネットワーク・アダプタをシステムに結合することもできる。モデム、ケーブル・モデム、およびEthernetカードは、現在使用可能なネットワーク・アダプタのタイプの一部に過ぎない。
【０１４２】
本発明の説明は、例示および説明のために提示されたものであり、網羅的であること、または本発明の開示された形に限定されることは意図されていない。当業者であれば、多くの修正および変形が明らかとなろう。実施形態は、本発明の原理、実際の適用例を最も良く説明するため、ならびに、企図された特定の用途に好適なように様々に修された様々な実施形態について、当業者が本発明を理解できるようにするために、選択および説明された。
【図１】
2013502649.tif 000003
【図２】
2013502649.tif 000004
【図３】
2013502649.tif 000005
【図４】
2013502649.tif 000006
【図５】
2013502649.tif 000007
【図６】
2013502649.tif 000008
【図７】
2013502649.tif 000009
【図８】
2013502649.tif 000010
【図９】
2013502649.tif 000011
【図１０】
2013502649.tif 000012
【図１１】
2013502649.tif 000013
【図１２】
2013502649.tif 000014
【図１３】
2013502649.tif 000015
【図１４】
2013502649.tif 000016
【図１５】
2013502649.tif 000017
【手続補正書】
【提出日】平成24年2月21日(2012.2.21)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
データ処理システム（１００）において、前記データ処理システム（１００）の投機的バージョニング・キャッシュ（３１０）内にチェックポイントを生成するための方法であって、
前記データ処理システム（１００）の少なくとも１つのプロセッサ（１０６、３７０〜３７６、１２７０〜１２７６）によって、前記データ処理システム（１００）内で、前記投機的バージョニング・キャッシュ（３１０、１２１０）内のキャッシュ・ラインにアクセスするコードを実行すること、
前記データ処理システム（１００）によって、前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイント（１０３０）を生成する必要性を示す第１の条件が発生するかどうかを決定することであって、前記チェックポイント（１０３０）は、第２の条件の発生に応答して１つまたは複数の投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更を無効化するためのロールバック動作を実行するための状態情報を格納する、１つまたは複数の投機的キャッシュ・ラインである、前記決定すること（１３５０）、および
前記第１の条件が発生した旨の決定に応答して、前記投機的バージョニング・キャッシュ（３１０、１２１０）内に前記チェックポイント（１０３０）を生成すること（１３７０）、
を含む、方法。
【請求項２】
前記データ処理システム（１００）内に、前記投機的バージョニング・キャッシュ（３１０、１２１０）に関連付けられた１つまたは複数のバージョン・プレッシャしきい値を格納することをさらに含み、前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイント（１０３０）を生成する必要性を示す第１の条件が発生するかどうかを決定することが、前記コードの実行中に、前記投機的バージョニング・キャッシュ（３１０、１２１０）のバージョン・プレッシャが前記１つまたは複数のバージョン・プレッシャしきい値（１３４０）に一致するかまたはこれを超えるか否かを決定することを含む、請求項１に記載の方法。
【請求項３】
前記１つまたは複数のバージョン・プレッシャしきい値（１３４０）が、投機的バージョニング・キャッシュ・レベル、関連付けられたキャッシュ・ライン・セット・レベル、および個々のスレッド・レベルのうちの１つでの、１つまたは複数のしきい値を含む、請求項２に記載の方法。
【請求項４】
前記投機的バージョニング・キャッシュ（３１０、１２１０）が、読み取り／ロード動作に関連付けられた非投機的キャッシュ・ラインを格納するための第１の部分と、書き込み／ストア動作に関連付けられた投機的キャッシュ・ラインを格納するための第２の部分とを含む、請求項１に記載の方法。
【請求項５】
前記第２の部分が、前記投機的バージョニング・キャッシュ（３１０、１２１０）の総容量に基づく最大サイズ制限を有し、前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイントを生成する（１３５０）必要性を示す第１の条件が発生するかどうかを決定することが、前記投機的バージョニング・キャッシュ（３１０、１２１０）の前記第２の部分内のキャッシュ・ラインの数が、前記最大サイズ制限に基づくバージョン・プレッシャしきい値に一致するかまたはこれを超えるか否かを決定することを含む、請求項４に記載の方法。
【請求項６】
前記第２の条件が、前記投機的バージョニング・キャッシュ（３１０、１２１０）内のキャッシュに入れられたデータ内でのソフト・エラーの検出である、請求項１に記載の方法。
【請求項７】
前記投機的バージョニング・キャッシュ（３１０、１２１０）のバージョン・プレッシャが前記１つまたは複数のバージョン・プレッシャしきい値に一致するかまたはこれを超えるか否かを決定することが、前記投機的バージョニング・キャッシュ（３１０、１２１０）に関連付けられた１つまたはグローバル・バージョン・プレッシャ・モジュール（３２０、４０５、１２２０）またはスレッド・バージョン・プレッシャ・モジュール（３３０〜３３６、４６０〜４６２、１２３０〜１２３６）によって実行される、請求項２に記載の方法。
【請求項８】
前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイントを生成すること（１３７０）が、
前記第１の条件が発生した旨の決定に応答して、オペレーティング・システムに対する割り込みを生成すること（１３６０）、および
前記オペレーティング・システムによって、前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインを非投機的状態に進行させるため（１４２０）に割り込みハンドラを開始すること、および前記投機的バージョニング・キャッシュ内での前記チェックポイントの作成（１３７０、１４３０）を開始すること、
を含む、請求項１に記載の方法。
【請求項９】
前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインを進行させることが、前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインに関連付けられたバージョン識別子を非投機的としてラベル付けすること、および、対応するキャッシュ・ラインの以前の非投機的バージョンを無効化することを含む、請求項８に記載の方法。
【請求項１０】
前記投機的バージョニング・キャッシュ（３１０、１２１０）内にチェックポイントを生成する必要性を示す第１の条件が発生するかどうかを決定すること（１３５０）が、コードの実行が前記コードの再生不可部分（１０２０）を入力するかどうかを決定することを含み、前記コードの実行が前記コードの再生不可部分（１０２０）を入力する旨の決定に応答して、前記チェックポイントを生成すること（１０３０、１３７０）を含む、請求項１に記載の方法。
【請求項１１】
前記再生不可コード（１０２０）が、入力または出力動作、ファイルへの読み取りまたは書き込み、ネットワークを介したメッセージの送信または受信、他のスレッドとのデータの共有、またはリソース上のロックへのアクセスのうちの、１つを実行するコードである、請求項１０に記載の方法。
【請求項１２】
前記第１の条件が発生した旨の決定に応答して、前記投機的バージョニング・キャッシュ内に前記チェックポイントを生成すること（１３７０）が、
１つまたは複数の第１のコンパイラが、前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインを非投機的状態に進行させるために第１の割り込み（１１１０）を生成させる命令の挿入を、前記再生不可コードに先立って実行すること、および
１つまたは複数の第２のコンパイラが、前記再生不可コードの実行後に（１０３０）前記チェックポイント（１０３０）を生成するために、第２の割り込み（１１２０）を生成させる命令の挿入を、前記再生不可コードの後に実行すること、
を含む、請求項１０に記載の方法。
【請求項１３】
前記チェックポイントを生成することが、
新しいバージョン識別子（ＶＩＤ）を生成すること、
前記新しいＶＩＤを、前記コードを実行する部分として実行している現行のスレッドと関連付けること、および
前記投機的バージョニング・キャッシュへの後続のストア時に、前記現行のスレッドによって前記新しいＶＩＤを使用すること、
を含む、請求項１に記載の方法。
【請求項１４】
前記投機的バージョニング・キャッシュへの後続のストア時に前記新しいＶＩＤを使用することが、
前記現行スレッドのストア動作が、結果として前記投機的バージョニング・キャッシュ内のキャッシュ・ヒットを生じさせるかどうかを決定すること、
キャッシュ・ヒットに応答して、前記ストア動作によるキャッシュ・ライン・ヒットが前記新しいＶＩＤに関連付けられるかどうかをチェックすること、および、
前記ストア動作による前記キャッシュ・ライン・ヒットが前記新しいＶＩＤに関連付けられていないことに応答して、前記ストア動作による前記キャッシュ・ライン・ヒットを新しい投機的キャッシュ・ラインにコピーすること、前記新しいＶＩＤを前記新しい投機的キャッシュ・ラインに関連付けること、および、前記新しい投機的キャッシュ・ラインに対して前記ストア動作を実行すること、
を含む、請求項１３に記載の方法。
【請求項１５】
前記チェックポイント（１０３０）を生成することが、第１の状態情報を前記投機的バージョニング・キャッシュ（３１０、１２１０）内の投機的キャッシュ・ラインに格納すること、および、第２の状態情報を前記データ処理システム（１００）の１つまたは複数のバッファに格納すること（１４４０）を含む、請求項１に記載の方法。
【請求項１６】
前記第１の状態情報が、前記投機的キャッシュ・ラインに対応する非投機的キャッシュ・ラインの非投機的状態情報であり、前記第２の状態情報が、プログラム・カウンタの状態、プログラム・レジスタの状態、またはシステム・レジスタの状態のうちの、１つまたは複数を含む、請求項１５に記載の方法。
【請求項１７】
前記第２の条件が前記コードの実行中に発生するかどうかを決定すること（１５１０）、
前記第２の条件が前記コードの再生不可部分の実行中に発生したかどうかを決定すること（１５２０）、および
前記第２の条件が前記コードの前記再生不可部分の実行中に発生しないことに応答して前記投機的キャッシュ・ラインに対応する前記キャッシュ・ラインへの変更を、前記チェックポイントに対応する状態にロールバックすること（１５６０）、
をさらに含む、請求項１に記載の方法。
【請求項１８】
前記第２の条件が前記コードの前記再生不可部分の実行中に発生した旨の決定に応答して、回復不能エラーを示す通知または割り込みを生成すること（１５３０）、
をさらに含む、請求項１７に記載の方法。
【請求項１９】
チェックポイントを生成するためのコンピュータ・プログラムであって、前記コンピュータ・プログラムが、データ処理システムに、
前記データ処理システムの投機的バージョニング・キャッシュ内のキャッシュ・ラインにアクセスする機能と、
前記投機的バージョニング・キャッシュ内にチェックポイントを生成する必要性を示す第１の条件が発生するかどうかを決定する機能であって、前記チェックポイントは、第２の条件の発生に応答して１つまたは複数の投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更を無効化するためのロールバック動作を実行するための状態情報を格納する、１つまたは複数の投機的キャッシュ・ラインである、前記決定する機能と、および
前記第１の条件が発生した旨の決定に応答して、前記投機的バージョニング・キャッシュ内に前記チェックポイントを生成する機能、
を実行させる、コンピュータ・プログラム。
【請求項２０】
１つまたは複数のプロセッサであって、各プロセッサは、前記プロセッサのハードウェア内に実装された、少なくとも１つのスレッド・レベル・バージョニング・キャッシュ・モジュールを有する、１つまたは複数のプロセッサと、
前記１つまたは複数のプロセッサに結合された投機的バージョニング・キャッシュ・ストレージ・デバイスと、
前記投機的バージョニング・キャッシュ・ストレージ・デバイスに結合されたハードウェア実装グローバル・バージョニング・キャッシュ・モジュールと、
を備え、
前記１つまたは複数のプロセッサは、前記投機的バージョニング・キャッシュ・ストレージ・デバイス内のキャッシュ・ラインにアクセスするコードを実行するように構成され、
前記ハードウェア実装グローバル・バージョニング・キャッシュ・モジュール、または前記少なくとも１つのスレッド・レベル・バージョニング・キャッシュ・モジュールのうちの少なくとも１つは、前記投機的バージョニング・キャッシュ内にチェックポイントを生成する必要性を示す第１の条件が発生するかどうかを決定するように構成され、前記チェックポイントは、第２の条件の発生に応答して１つまたは複数の投機的キャッシュ・ラインに対応するキャッシュ・ラインへの変更を無効化するためのロールバック動作を実行するための状態情報を格納する、１つまたは複数の投機的キャッシュ・ラインであり、
前記投機的バージョニング・キャッシュ・ストレージ・デバイスは、前記第１の条件が発生した旨の決定に応答して前記チェックポイントを格納するように構成された、
データ処理システム。
【国際調査報告】
2013502649.tif 000018