(57)【要約】  トランザクショナル・メモリ用サポートを備えた装置２では、所定のタイプのトランザクション開始命令又は所定のタイプのトランザクション開始命令の後に続く命令が、少なくとも１つのリソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子の取込みをトリガする。所定のタイプのトランザクション開始命令に続く所定のタイプのトランザクション終了命令に応答して、ロック変数が確認され、トランザクションの投機的に実行された命令の結果のコミットは、ロック変数が、別のスレッドがターゲット・リソースへの排他的アクセスを保持していることを示す場合、防止又は延期される。この手法により、トランザクショナル・メモリ・ベースのシステムでトランザクションを実行するときの性能を向上させることができる。
2020537222.tif 000002
【特許請求の範囲】
【請求項１】
命令をデコードする命令デコーダと、
前記命令デコーダによってデコードされた前記命令に応答してデータ処理を実行する処理回路と
を備え、前記処理回路は、前記処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ用サポート回路を具備し、前記トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行される前記スレッドの命令を含み、そのため前記処理回路は、前記トランザクション終了命令に至るまで、前記投機的に実行された命令の結果がコミットされるのを防止するよう構成され、
所与のスレッドの所定のタイプのトランザクション開始命令、又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令に応答して、前記命令デコーダは、前記処理回路を制御して、少なくとも１つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むよう構成され、
前記所定のタイプのトランザクション開始命令に続いて実行される、前記所与のスレッドの所定のタイプのトランザクション終了命令に応答して、前記命令デコーダは、前記処理回路を制御して、前記取り込まれたロック識別子によって識別された前記ロック変数を確認し、前記ロック変数が、別のスレッドが前記少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを防止又は延期するよう構成される、装置。
【請求項２】
前記ロック識別子は、前記ロック変数を格納する記憶場所のアドレスを含む、請求項１に記載の装置。
【請求項３】
前記命令デコーダは、前記処理回路を制御し、前記所定のタイプのトランザクション開始命令に応答して、前記ロック識別子を取り込むよう構成される、請求項１から２までのいずれか一項に記載の装置。
【請求項４】
前記所定のタイプのトランザクション開始命令は、前記ロック識別子を指定するか又は前記ロック識別子を格納するレジスタを指定するエンコードを有する、請求項３に記載の装置。
【請求項５】
前記所定のタイプのトランザクション開始命令に応答して、前記命令デコーダは、前記処理回路を制御し、所定のレジスタから前記ロック識別子を読み取るよう構成される、請求項３に記載の装置。
【請求項６】
前記命令デコーダは、前記処理回路を制御し、前記所与のスレッドの前記所定のタイプのトランザクション開始命令に続く選択されたタイプの最初の命令に応答して、前記ロック識別子を取り込むよう構成される、請求項１及び２のいずれか一項に記載の装置。
【請求項７】
前記選択されたタイプの前記命令は、記憶場所からレジスタにデータ値をロードする、ロード命令を含む、請求項６に記載の装置。
【請求項８】
前記ロード命令は、前記データ値がそこからロードされるべき前記記憶場所を特定するターゲット・アドレスを指定し、
前記ロック識別子は、前記所定のタイプのトランザクション開始命令に続く、前記所与のスレッドの前記最初のロード命令の前記ターゲット・アドレスを含む、請求項７に記載の装置。
【請求項９】
前記所定のタイプのトランザクション終了命令のデコードに応答して、前記処理回路は、前記ロック変数が、別のスレッドが前記少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、前記所与のスレッドの前記トランザクションを打ち切るよう構成される、請求項１から８までのいずれか一項に記載の装置。
【請求項１０】
前記所定のタイプのトランザクション終了命令のデコードに応答して、前記処理回路は、前記ロック変数が、他のスレッドが前記少なくとも１つのターゲット・リソースへの排他的アクセスを放棄したことを示すまで、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを延期するよう構成される、請求項１から８までのいずれか一項に記載の装置。
【請求項１１】
前記所定のタイプのトランザクション終了命令のデコードに応答して、前記処理回路は、前記ロック変数を確認する試行回数、又は他のスレッドによって前記少なくとも１つのターゲット・リソースへの排他的アクセスが放棄されるのを待つことに伴う待機レイテンシが、所定の閾値を超える場合に、前記所与のスレッドの前記トランザクションを打ち切るよう構成される、請求項１０に記載の装置。
【請求項１２】
前記所定のタイプのトランザクション開始命令の後で、且つ前記所定のタイプのトランザクション終了命令の前に、前記所与のスレッドで実行される、前記所定のタイプの別のトランザクション開始命令に応答して、又は前記別のトランザクション開始命令の後に続く命令に応答して、前記命令デコーダは、前記処理回路を制御し、別のロック変数を識別する別のロック識別子を取り込んで、少なくとも１つの別のターゲット・リソースへのアクセスを制御するよう構成される、請求項１から１１までのいずれか一項に記載の装置。
【請求項１３】
前記所与のスレッドについて複数のロック識別子が取り込まれたときの、前記所定のタイプのトランザクション終了命令のデコードに応答して、前記処理回路は、複数のロック変数のいずれかが、別のスレッドが少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示している場合、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを防止又は延期するよう構成される、請求項１から１２までのいずれか一項に記載の装置。
【請求項１４】
前記処理回路は、対応するトランザクションが打ち切られず、またコミットされないままである所与のスレッドの、実行されたトランザクション開始命令の数を示す、トランザクションのネスト深さを表す、トランザクションのネスト深さの値を維持するよう構成され、
前記所定のタイプのトランザクション終了命令には、前記トランザクションのネスト深さの値が、前記トランザクションのネスト深さが１に等しいことを示す場合に実行されるトランザクション終了命令が含まれる、請求項１から１３までのいずれか一項に記載の装置。
【請求項１５】
第２のタイプのトランザクション開始命令に応答して、前記命令デコーダは、前記処理回路を制御して、後続の命令の投機的実行を果たし、前記ロック識別子の取込みを省略するよう構成される、請求項１から１４までのいずれか一項に記載の装置。
【請求項１６】
前記所与のスレッドの１つ又は複数のトランザクション開始命令に応答して取り込まれた、１つ又は複数のロック識別子を格納する、ロック取込記憶領域を備える、請求項１から１５までのいずれか一項に記載の装置。
【請求項１７】
前記所定のタイプのトランザクション終了命令のデコードに応答して、前記所与のスレッドについてゼロ・ロック識別子が前記ロック取込記憶領域に格納されると、前記処理回路は、ロック変数が、別のスレッドが少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示すかどうかとは無関係に、前記所与のスレッドの前記投機的に実行された命令の前記結果をコミットするかどうかを判断するよう構成される、請求項１６に記載の装置。
【請求項１８】
前記トランザクショナル・メモリ用サポート回路は、少なくとも１つのスレッドの少なくとも１つのトランザクションの前記投機的に実行された命令の前記結果を格納する投機結果記憶回路を備える、請求項１から１７までのいずれか一項に記載の装置。
【請求項１９】
前記トランザクショナル・メモリ用サポート回路は、前記トランザクションを打ち切ると復元されるように、前記トランザクション開始命令に応答して取り込まれた状態を格納する、復元状態記憶回路を備える、請求項１から１８までのいずれか一項に記載の装置。
【請求項２０】
前記トランザクショナル・メモリ用サポート回路は、最初のスレッドのトランザクション内で行われた所与のアドレスへのデータ・アクセスと、別のスレッドによって行われた同じアドレスへのデータ・アクセスとの間の競合を検出する、競合検出回路を備える、請求項１から１９までのいずれか一項に記載の装置。
【請求項２１】
前記競合検出回路は、前記競合の検出に応答して、前記最初のスレッドの前記トランザクションの打切りをトリガするよう構成される、請求項２０に記載の装置。
【請求項２２】
前記トランザクショナル・メモリ用サポート回路は、トランザクション内の命令によってアクセスされるアドレスを追跡するアドレス追跡回路を備える、請求項１から２１までのいずれか一項に記載の装置。
【請求項２３】
処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートする、トランザクショナル・メモリ用サポート回路を備える前記処理回路を使用して、デコードされた命令に応答してデータ処理を実行するステップであって、前記トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行される前記スレッドの命令を含み、そのため前記処理回路は、前記トランザクション終了命令に至るまで、前記投機的に実行された命令の結果がコミットされるのを防止するよう構成される、ステップと、
所与のスレッドの所定のタイプのトランザクション開始命令、又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令のデコードに応答して、少なくとも１つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むステップと、
前記所定のタイプのトランザクション開始命令に続いて実行される、前記所与のスレッドの所定のタイプのトランザクション終了命令のデコードに応答して、前記取り込まれたロック識別子によって識別された前記ロック変数を確認し、前記ロック変数が、別のスレッドが前記少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを防止又は延期するステップと
を含む、データ処理方法。
【請求項２４】
ホスト・データ処理装置を制御して、命令を実行するための命令実行環境を提供するコンピュータ・プログラムであって、
データ処理のスレッド内のトランザクションの実行をサポートする処理プログラム・ロジック
を含み、前記トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行される前記スレッドの命令を含み、そのため前記処理プログラム・ロジックは、前記トランザクション終了命令に至るまで、前記投機的に実行された命令の結果がコミットされるのを防止するよう構成され、
所与のスレッドの所定のタイプのトランザクション開始命令、又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令に応答して、前記処理プログラム・ロジックは、少なくとも１つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むよう構成され、
前記所定のタイプのトランザクション開始命令に続いて実行される、前記所与のスレッドの所定のタイプのトランザクション終了命令に応答して、前記処理プログラム・ロジックは、前記取り込まれたロック識別子によって識別された前記ロック変数を確認し、前記ロック変数が、別のスレッドが前記少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを防止又は延期するよう構成される、コンピュータ・プログラム。
【請求項２５】
請求項２４に記載の前記コンピュータ・プログラムを格納する記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本技法は、データ処理の分野に関する。より詳細には、本技法は、トランザクショナル・メモリに関する。
【背景技術】
【０００２】
データ処理システムは、データ処理の複数のスレッドを実行できる。スレッドは、共有リソースにアクセスしなければならない場合があり、データ処理操作の性質上、スレッドが共有リソースとの相互作用を開始すると、その間にリソースにアクセスする別のスレッドがなくても、操作のセットが不可分なものとしてリソースを使用し、完了する必要があり得る可能性がある。
【０００３】
スレッド間のこの競合を処置する１つの技法は、ロックを使用して、少なくとも１つのターゲット・リソースへの排他的アクセスを制御することであり得る。たとえば、あるスレッドが特定のアドレス領域のデータへのアクセスを開始するとき、スレッドはロックの所有権を要求するためにロック変数をセットすることができ、次いでロックを所有するスレッドがロックの所有権を有している間、ロック変数を確認する他のスレッドは、ロックがすでに要求されていることを判断でき、そのため、そのアドレス領域と相互作用するコードのセクションに入ってはならない。かかるロック・ベースの手法は、競合が生じ得ないことを保証するロックの所有権がない限り、別のスレッドとの競合が発生する可能性があるので、各スレッドは、デフォルトで、共有リソースにアクセスするコードのセクションに入ることができないと推定する、悲観的なものであると理解することができる。しかし、ロック識別子はしばしば、複数のリソース（たとえば、アドレスの範囲）への排他的アクセスを制御する場合があり、そのため、あるスレッドがロック変数で保護されたリソースのセット内の特定のリソースにアクセスしている場合、別のスレッドが確実に同じリソースにアクセスすることになるとは限らない。したがって、スレッド間の競合がまれな場合、共有リソースを使用するコードの重要なセクションに入る前に、スレッドは、ロックが解放されるのを不必要に待っている可能性があるので、ロック・ベースの手法は、性能を損なう可能性がある。
【０００４】
共有リソースにアクセスするスレッド間の競合を処置するより楽観的な手法は、トランザクショナル・メモリ用サポートを使用することであり得る。データ処理システムは、処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートする回路を備えることができる。トランザクションは、トランザクションの開始を示すトランザクション開始命令と、トランザクションの終了を示すトランザクション終了命令との間に実行される、スレッドのそうした命令であり得る。トランザクション開始命令とトランザクション終了命令との間に、処理回路は、介在する命令を投機的に実行し、トランザクション終了命令に至るまで投機的に実行されるそうした命令の、結果のコミットを防ぐことができる。トランザクション開始命令の実行後（ただし、トランザクション終了命令に至る前に）にアボート・イベントが発生すると、トランザクションが打ち切られ、投機結果が破棄されるという結果になり得る。トランザクションを打ち切る理由はいくつかあり得るが、１つの理由は、別のスレッドが行うメモリ・アクセスとの競合が検出されることであり得る。したがって、この手法では、各スレッドは他のスレッドとの競合が発生しないであろうと推定して、コードの重要なセクションの処理を楽観的に開始することができ、次いでどんな競合も検出されることなく重要なセクションの終わりに達した場合、トランザクションの結果はコミットされ得る。競合がまれな場合、トランザクショナル・メモリ用サポートを使用することで、より多くのスレッドがコードの重要なセクションを同時に処理できるようにして、性能を向上させることができる。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】Ｒｏｂｅｒｔ  Ｂｅｄｉｃｈｅｋ、「Ｓｏｍｅ  Ｅｆｆｉｃｉｅｎｔ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｉｍｕｌａｔｉｏｎ  Ｔｅｃｈｎｉｑｕｅｓ」、１９９０年冬、ＵＳＥＮＩＸカンファレンス、５３〜６３頁
【発明の概要】
【課題を解決するための手段】
【０００６】
少なくともいくつかの実例により、命令をデコードする命令デコーダと、命令デコーダによってデコードされた命令に応答してデータ処理を実行する処理回路とを備える装置を提供し、処理回路は、処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ用サポート回路を具備し、トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行されるスレッドの命令を含み、そのため処理回路は、トランザクション終了命令に至るまで、投機的に実行された命令の結果がコミットされるのを防止するよう構成され、所与のスレッドの所定のタイプのトランザクション開始命令又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令に応答して、命令デコーダは、処理回路を制御して、少なくとも１つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むよう構成され、前記所定のタイプのトランザクション開始命令に続いて実行される、所与のスレッドの所定のタイプのトランザクション終了命令に応答して、命令デコーダは、処理回路を制御して、取り込まれたロック識別子によって識別されたロック変数を確認し、ロック変数が、別のスレッドが前記少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期するよう構成される。
【０００７】
少なくともいくつかの実例により、以下を含むデータ処理方法を提供し、方法は、
デコードされた命令に応答して、処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ用サポート回路を備える処理回路を使用して、データ処理を実行するステップであって、トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行されるスレッドの命令を含み、そのため処理回路は、トランザクション終了命令に至るまで、投機的に実行された命令の結果がコミットされるのを防止するよう構成される、ステップと、所与のスレッドの所定のタイプのトランザクション開始命令又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令のデコードに応答して、少なくとも１つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別する、ロック識別子を取り込むステップと、前記所定のタイプのトランザクション開始命令に続いて実行される、所与のスレッドの所定のタイプのトランザクション終了命令のデコードに応答して、取り込まれたロック識別子によって識別されたロック変数を確認するステップと、ロック変数が、別のスレッドが前記少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期するステップとを含む。
【０００８】
少なくともいくつかの実例により、ホスト・データ処理装置を制御して、命令を実行するための命令実行環境を提供する、コンピュータ・プログラムを提供し、コンピュータ・プログラムは、データ処理のスレッド内のトランザクションの実行をサポートする処理プログラム・ロジックを含み、トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行されるスレッドの命令を含み、そのため処理プログラム・ロジックは、トランザクション終了命令に至るまで、投機的に実行された命令の結果がコミットされるのを防止するよう構成され、所与のスレッドの所定のタイプのトランザクション開始命令、又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令に応答して、処理プログラム・ロジックは、少なくとも１つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別する、ロック識別子を取り込むよう構成され、前記所定のタイプのトランザクション開始命令に続いて実行される、所与のスレッドの所定のタイプのトランザクション終了命令に応答して、処理プログラム・ロジックは、取り込まれたロック識別子によって識別されたロック変数を確認し、ロック変数が、別のスレッドが前記少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期するよう構成される。
【０００９】
コンピュータ・プログラムは、記憶媒体に格納され得る。記憶媒体は、非一時的な記憶媒体であり得る。
【００１０】
本技法のさらなる態様、特徴、及び利点は、以下の添付図面と併せて読まれるべき実例の以下の説明から明らかとなろう。
【図面の簡単な説明】
【００１１】
【図１】トランザクショナル・メモリ用サポート回路を備えた、データ処理装置の実例を模式的に示す図である。
【図２】トランザクショナル・メモリ用サポートを備えるシステムにおける、トランザクションの処理の実例を示す図である。
【図３】ロック・ベースのモードでの、図２のトランザクションと同等の動作を実行する、代替のコード・シーケンスを示す図である。
【図４】ロック変数を確認して、トランザクショナル・スレッドによる妨害から非トランザクショナル・スレッドを保護する命令を有する、トランザクションの実例を示す図である。
【図５】非トランザクショナル・スレッドがロックされたリソースへの排他的アクセスを保持している場合、トランザクショナル・スレッドの処理が遅延する可能性があるという問題を示す図である。
【図６】所定のタイプのトランザクション開始命令に応答して、ロック識別子を取り込み、トランザクション終了命令に応答して、ロック識別子によって識別されたロック変数を確認することにより、この遅延を回避する手法を示す図である。
【図７】所定のタイプのトランザクション開始命令の後の、最初のロード命令に応答してロック変数が取り込まれる代替形態を示す図である。
【図８】トランザクショナル・スレッドのトランザクション終了時にロックが要求されていない場合の、トランザクショナル・スレッド及び非トランザクショナル・スレッドの処理の実例を示す図である。
【図９】トランザクショナル・スレッドのトランザクション終了時に、非トランザクショナル・スレッドによってロックが保持されている場合の実例を示す図である。
【図１０】トランザクショナル・スレッドと非トランザクショナル・スレッドとの間の競合が、どのようにトランザクションを打ち切ることができるかを示す実例の図である。
【図１１】ネストされたトランザクションを処置する実例を示す図である。
【図１２】トランザクション開始命令の処理を示す流れ図である。
【図１３】トランザクション終了命令の処理を示す流れ図である。
【図１４】使用することができるシミュレータの実施例を示す図である。
【発明を実施するための形態】
【００１２】
トランザクショナル・メモリ用サポート回路は、トランザクション内の命令の投機的実行を可能にし、それにより、トランザクションを打ち切る必要がある場合に投機結果を戻すことができるので、トランザクションを実行する２つのスレッド間の競合を回避するためにロック変数を使用する必要はない。ただし、非トランザクション・ベースの手法で実行されているいくつかのスレッドも、存在する可能性がある。かかる非トランザクショナル・スレッドは、たとえば、トランザクションを使用せずに、元々書かれた又はコンパイルされたコードのセクションを実行するスレッドであり得る（どんなトランザクション開始及び終了命令も含まない）。或いは、非トランザクショナル・スレッドには、以前にトランザクション・ベースのモードで命令を処理していたが、トランザクションが頻繁にアボート・イベントを発生したため（たとえば、他のスレッドとの競合のため）、処理がその時点で非トランザクション・ベースのモードに切り替えられたスレッドが含まれ得る。かかる非トランザクショナル・スレッドが少なくとも１つのターゲット・リソースへの排他的アクセスを必要とする場合、少なくとも１つのターゲット・リソースへの排他的アクセスを制御するために、依然としてロック変数を使用することが多い。直感に反して、どの非トランザクショナル・スレッドの結果をも確実に正しくするために、非トランザクショナル・スレッドがロックを保持している間は、トランザクショナル・スレッドが共有リソースへの書込みをコミットしないようにする必要があるので、トランザクショナル・スレッドは依然として、ロック変数を確認する必要があり得る。したがって、トランザクショナル・モードで実行されるスレッドのトランザクション内でさえも、トランザクションには依然として、ロック変数を確認して、他のどのスレッドも少なくとも１つのターゲット・リソースへの排他的アクセスを保持していないかを判断し、現在ロックが別のスレッドによって保持されている場合は、後に続く操作を延期する命令が含まれることが多い。これにより、トランザクション内の命令の処理が遅延する可能性がある。
【００１３】
しかし発明者らは、トランザクション内の命令が投機的に実行されるとき、トランザクション内で確認されるべきロック変数が、別のスレッドが少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示している場合でも、トランザクショナル・スレッドがトランザクション内の投機的に実行される命令を実行し続けることができるようにすることは、実際には問題ではないことを認識した。トランザクショナル・メモリ用サポート回路が提供する他の仕組みが、別のスレッドとの競合が検出された場合にトランザクションを打ち切ることができるので、かかるロック変数の確認操作は、実際には、トランザクショナル・スレッド自体を保護するためのものではない。そうではなくて、ロック変数の確認は通常、トランザクショナル・スレッドによる妨害から非トランザクショナル・スレッドを保護するために、トランザクションに含まれている。トランザクショナル・スレッドの効果は、投機的に実行された命令の結果がコミットされるまで見られないであろうことから、これは、ロック変数が、別のスレッドがロックされたリソースへの排他的アクセスを保持していることを示しているかどうかに関係なく、トランザクションの投機的実行をトランザクション終了命令まで続行しても安全であることを意味する。その代わりに、トランザクション終了命令に応答して、ロック変数の確認を実行できる。この手法では、別のスレッドがロックを保持しているときに投機的に実行される命令の処理の開始に不要な遅延がなく、トランザクションがトランザクション終了命令に達するときまでに、他のスレッドがすでにロックを解放している可能性がある。したがって、この手法により、トランザクションの処理をより高速化できる。これにより、他のトランザクションの性能も向上する。というのは、１つのスレッドのトランザクションが遅延している間、該トランザクションは、他のトランザクションが使用できないリソースをトランザクショナル・メモリ用サポート回路内に保持しているからである。したがって、１つのスレッドのトランザクションをより速く完了できるようにすると、他のスレッドも、トランザクショナル・メモリのリソースをより早く利用できるようになり、全体的な性能が向上する。
【００１４】
したがって、所与のスレッドの所定のタイプのトランザクション開始命令、又は所与のスレッドのその所定のタイプのトランザクション開始命令の後に続く命令に応答して、命令デコーダは、処理回路を制御して、少なくとも１つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むことができる。その所定のタイプのトランザクション開始命令に続いて実行される所与のスレッドの所定のタイプのトランザクション終了命令に応答して、命令デコーダは、処理回路を制御して、取り込まれたロック識別子によって識別されたロック変数を確認し、ロック変数が、別のスレッドが少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期することができる。したがって、ロック変数を確認して、ロックがセットされている場合は後続の命令の実行を延期するのに、トランザクション内で明示的な命令を必要とするのではなく、トランザクション終了命令のデコードに応答して処理回路が確認を実行する。ロック確認をトランザクションの終わりに移すことにより、ロックが保持されているかどうかに関係なく、トランザクション内の操作を投機的に実行でき、トランザクションの終了時に至るまでにロックがすでに解放されている可能性が高くなり、トランザクション開始時の遅延が回避される。
【００１５】
ロック識別子は、確認されるべき特定のロック変数を識別する任意の値にすることができる。しかしいくつかの実例では、ロック識別子は、ロック変数を格納する記憶場所のアドレスを含み得る。
【００１６】
いくつかの実例では、命令デコーダは、処理回路を制御し、所定のタイプのトランザクション開始命令自体に応答して、ロック識別子を取り込むことができる。場合によっては、所定のタイプのトランザクション開始命令のエンコードが、実際に、ロック識別子を指定することができる（即値として直接、又はロック識別子を格納するレジスタを指定することによって）。したがって、プログラマ又はコンパイラが作るコードは、トランザクション開始命令のエンコード内にその変数のロック識別子を含めることにより、確認されるべきロック変数を特定できる。或いは、ロック識別子は、トランザクション開始命令の特定のエンコードとは無関係に読み取られる、所定のレジスタから読み取ることができる。たとえば、特定のデフォルトのレジスタを使用して、ロック識別子（たとえば、ロック変数のアドレス）を保持することができ、ロック識別子は、所定のタイプのトランザクション開始命令に応答して読み取ることができる。したがって、所定のタイプのトランザクション開始命令のエンコードが、ロック識別子を指定することは必須ではない。
【００１７】
或いは、所定のタイプのトランザクション開始命令自体に応答するのではなく、所与のスレッドの所定のタイプのトランザクション開始命令に続く選択されたタイプの最初の命令に応答して、ロック識別子の取込みを実行できる。場合によっては、選択されたタイプの命令は、専用のエンコードをもつ特殊なタイプのロック変数識別命令であり得る。しかし、選択されたタイプの命令は、ロック識別子を識別することに加えて他の機能性を提供するタイプの命令であってもよい。たとえば、選択されたタイプの命令は、記憶場所からレジスタにデータ値をロードする、ロード命令であり得る。場合によっては、ロック識別子は、データ値がそこからロードされるべき記憶場所を特定する、ロード命令のターゲット・アドレスであると判断され得る。したがってこの手法では、所定のタイプのトランザクション開始命令に続く最初のロード命令が検出されたときに、命令デコーダは、処理回路を制御して、最初のロード命令のターゲット・アドレスをロック識別子として取り込むことができる。既存のコードは、ロック変数を、トランザクション開始命令に続く一番初めの命令として確認できることが多く、これは、ロード命令を使用してロック変数をレジスタにロードし、次いで比較命令を使用してレジスタにロードされたロック変数の値を確認することにより行われることが多いので、この手法は有用であり得る。したがって、トランザクション開始命令に続く最初のロードに応答してロック識別子を取り込むことにより、既存のコードの修正が少なくて済む可能性がある。
【００１８】
所定のタイプのトランザクション終了命令のデコードに応答してロック変数が確認され、ロック変数が、別のスレッドが少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、処理回路は、トランザクションの投機的に実行された命令の結果のコミットを防止又は延期するために、様々なやり方で応答できる。一実例では、トランザクションの終了時にロックが別のスレッドによって保持されている場合、処理回路は、単にトランザクションを打ち切ることができる。これにより、後でロック変数の確認を再試行する発見的手法を実現するにあたって、複雑さが軽減される。
【００１９】
或いは、所定のタイプのトランザクション終了命令のデコードに応答して、トランザクションの投機的に実行された命令の結果のコミットは、ロックされた変数が、他のスレッドが少なくとも１つのターゲット・リソースへの排他的アクセスを放棄したことを示すまで延期され得る。この手法により、場合によっては他のスレッドがロックを放棄するのを待つ間に遅延があるが、依然として投機結果をコミットできる可能性があるので、より良好な前進が得られ得る。ただし、トランザクションが長く待たされてしまう場合は、単にトランザクションを打ち切る方がよいかもしれない。したがって、別のスレッドがロックを保持しているときに、結果のコミットが最初に延期された場合、処理回路は、ロック変数を確認する試行回数、又は他のスレッドによって少なくとも１つのターゲット・リソースへの排他的アクセスが放棄されるのを待つことに伴う待機レイテンシが、所定の閾値を超える場合には、トランザクションを打ち切ることができる。
【００２０】
いくつかの実例では、所定のタイプのトランザクション終了命令のデコードに応答したロック変数の定期的な確認は、命令を実行するために使用される通常の処理経路とは別の、ロック確認エンジンによって制御され得る。したがって、ロック変数の確認は、処理ロジックによって実行されている他の処理の裏で行われ得る。ロック確認エンジンは、所定のタイプのトランザクション終了命令のデコードに応答して呼び出すことができ、次いでロック変数の定期的な確認、及びロック変数を確認する十分な試行又はトランザクションを打ち切ることが望まれるだけの十分な時間がいつ経過したかの判断の処置を行うことができる。
【００２１】
実行されるべきスレッドには、ネストされたトランザクションが含まれる場合があり、ここで、最初のトランザクションのトランザクション開始命令を実行した後、最初のトランザクションのトランザクション終了命令が検出される前に、最初のトランザクション内でネストされた２番目のトランザクションの開始を表す別のトランザクション開始命令が実行される。たとえば、これは、処理がそこに分岐し得るコード内で、複数の関数エントリ又は分岐ターゲット場所を許容し、コードを作成する人又はコンパイラは、処理が一番初めのトランザクション開始命令の前の箇所に分岐したか、又は後の箇所に分岐したかに関係なく、コードの特定のブロックがトランザクション内で確実に処置されることを望むプログラムに使用され得る。いくつかのハードウェア実施態様では、ネストされた各トランザクションを個別のトランザクションとして扱うことができ、ネストされたトランザクションごとに個別の復元状態を維持し、内側のネストされたトランザクションのトランザクション開始命令へ部分的に戻すことを可能にするが、これには、正当化され（ｊｕｓｔｉｆｉｅｄ）得ない、比較的複雑なハードウェア・リソースが必要となり得る。したがって、他の実施態様では、内側のトランザクションを効果的に無視でき、その結果内側のネストされたランザクション内で打切りが発生しても、状態は、トランザクションのネストされたセットの外側のトランザクションに関連するトランザクション開始命令の時点での、保留されていた状態に戻される。これは、ネストされたトランザクションのセット全体に対して、ただ１つの復元状態のセットしか維持する必要がないであろうことを意味する。
【００２２】
したがって、所定のタイプのトランザクション開始命令の後に、所与のスレッドの、所定のタイプの別のトランザクション開始命令が実行され、別のトランザクション開始命令は、所定のタイプのトランザクション終了命令の前に実行されることが可能である。この場合、別のトランザクション開始命令に応答して、又は別のトランザクション開始命令の後に続く命令に応答して、命令デコーダは、処理回路を制御して、少なくとも１つの別のターゲット・リソースへのアクセスを制御するための別のロック変数を識別する、別のロック識別子を取り込むようにすることができる。場合によっては、別のトランザクション開始命令又は後続の命令によって識別されるロック変数は、すでに取り込まれたロック変数と同じである可能性がある（この場合、別のロック識別子の個別の取込みが不要な場合がある）が、他の場合には、別のトランザクション開始命令又は後続の命令が異なるロック変数を指定する可能性があるため、取り込まれるロックのコード化されたスレッドのセットに別のロック識別子が追加され得る。したがって、所与のスレッドについて複数のロック識別子が取り込まれたときの、所定のタイプのトランザクション終了命令のデコードに応答して、処理回路は、取り込まれたロック変数のいずれかが、別のスレッドが少なくとも１つのターゲット・リソースの対応するセットへの排他的アクセスを保持していることを示している場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期できる。したがって、ハードウェアが各ネストされたトランザクションを個別に追跡しない実施例において、トランザクションのネストがある場合でも、ネストされたトランザクションのセットの各トランザクション開始命令に関連するロック識別子の確認は、所定のタイプのトランザクション終了命令（たとえば、トランザクションのネストされたセットの外側のトランザクションに対応するトランザクション終了命令）に応答して実行され得る。
【００２３】
いくつかの実例では、所定のタイプのトランザクション終了命令は、単に任意のトランザクション終了命令であり得る。ただし、前述のように、ネストされたトランザクションの場合、ネストされたセットの内側のトランザクションのトランザクション終了命令は、事実上無視することができ、トランザクションの終了に関連する操作は、ネストされたセットの外側のトランザクションに関連するトランザクション終了命令に応答して実行され得る。したがって処理回路は、対応するトランザクションが打ち切られず、またコミットされないままである所与のスレッドの、実行されたトランザクション開始命令の数を示す、トランザクションのネスト深さを表す、トランザクションのネスト深さの値を維持することができる。たとえば、トランザクションのネスト深さは、あらゆるトランザクションの外側で命令を実行している場合（どのトランザクションも保留されたまま残っていない場合）はゼロであり得る。外側のトランザクション内である場合、深さは１であり得る。また、ネストされたセットの内側のトランザクションの内側である場合、深さは１より大きくなり得る。所定のタイプのトランザクション終了命令には、トランザクションのネスト深さの値が、トランザクションのネスト深さが１に等しいことを示すときに実行されるトランザクション終了命令が含まれ得る。これにより、セットの外側のトランザクションに関連するトランザクション終了命令によって、ロック変数の確認が確実にトリガされる。処理回路によって（たとえば、レジスタ内に）維持されるトランザクションのネスト深さの値は、トランザクションのネスト深さを明示的に表す必要がないことが理解されよう。場合によっては、格納された値は、単に、トランザクションのネスト深さに関連する数値に対応することがあるが、他の実例では、格納された値は、それからネスト深さを判断できる何らかの値を使用して、ネスト深さをエンコードすることができる。
【００２４】
いくつかの実例では、すべてのトランザクション開始命令が、所定のタイプのトランザクション開始命令と見なすことができる。しかし、他の実例では、所定のトランザクション開始命令は、（それ自体又は後続の命令で）ロック識別子の取込みをトリガする、特別なタイプのトランザクション開始命令であり得る。それに応答してデコーダが処理回路を制御し、ロック識別子の取込みを省略しながらも後続の命令の投機的実行を果たす、第２のタイプのトランザクション開始命令も提供することができる。２つの形式のトランザクション開始命令を提供することにより、ロック変数に依存しないトランザクションを、ロック変数に依存するトランザクションと区別でき、そうしたロックに依存しないトランザクションは、トランザクションが終了に至り、別のスレッドがロックを保持している場合に、コミットを延期する必要がないので、より高速に処理できる。２つのタイプのトランザクション開始命令は、それらのオペコードによって、又は命令のエンコード内で指定された開始タイプのパラメータによって、又は同じようにエンコードされたトランザクション開始命令が、所定のタイプとして機能するか若しくは第２のタイプとして機能するかを制御する、構成レジスタに格納されたモード値によって区別できる。
【００２５】
装置は、所与のスレッドの１つ又は複数のトランザクション開始命令に応答して取り込まれた、１つ又は複数のロック識別子を格納する、ロック取込記憶領域を備えることができる。たとえば、ロック取込記憶領域は、トランザクション・メモリ用サポート回路内に内部レジスタのセットを備えることができる。そうした内部レジスタは、ソフトウェアから直接アクセスできる必要はないが、ハードウェアだけで使用される、隠しレジスタであり得る。所定のタイプのトランザクション終了命令のデコードに応答して、所与のスレッドについてゼロ・ロック識別子がロック取込記憶領域内に格納されると、処理回路は、ロック変数が、別のスレッドが少なくとも１つのターゲット・リソースへの排他的アクセスを保持していることを示すかどうかとは無関係に、トランザクションの投機的に実行された命令の結果をコミットするかどうかを判断することができる。したがって、ロック取込記憶領域は、トランザクションの終了時に、いずれかのロックを確認する必要があるかどうか、そして確認する必要がある場合はどのロック変数かを示す。複数のスレッドがトランザクションを同時に実行している場合、ロック取込記憶領域は、スレッドごとに１つ又は複数のロック識別子の対応するセットを個別に記録できる。
【００２６】
トランザクショナル・メモリ用サポート回路は、様々な形態をとることができ、トランザクションの処理の助けとなるいくつかのリソースを備えることができる。たとえば、トランザクショナル・メモリ用サポート回路は、少なくとも１つのスレッドの少なくとも１つのトランザクションの投機的に実行された命令の結果を格納するための、投機結果記憶回路を備えることができる。場合によっては、投機的に実行された結果の複数のセットが、相異なるスレッドで実行されているトランザクション用に格納される場合がある。すべての投機結果が投機結果記憶回路に格納されることは、必須ではない。たとえば、トランザクショナル・メモリ用サポート回路は、トランザクションを打ち切るときに復元される、トランザクション開始命令に応答して取り込まれた状態を格納するための、復元状態記憶回路を備えることもできる。したがって、プロセッサのアーキテクチャ・レジスタ内の現在の値が、そうした投機結果（トランザクションの打切り時に、復元状態で上書きされることになる）を事実上示すことができるので、トランザクションを打ち切るときに復元されるレジスタの状態又は他のアーキテクチャ上の状態の値を、投機結果記憶回路に格納する必要はない。投機結果記憶回路は、たとえば、値をメモリに格納するためのストア命令の結果を格納することができる。トランザクションがコミットされるまで、ストア命令の投機結果を投機結果記憶回路に保持することにより、メモリが、その後で不正確になる可能性があるか又は他のスレッドを正しく機能させない可能性があるデータ値で汚染（ｐｏｌｌｕｔｉｎｇ）されることを回避する。
【００２７】
別の実例では、トランザクショナル・メモリ用サポート回路は、最初のスレッドのトランザクション内で行われた所与のアドレスへのデータ・アクセスと、（トランザクション内又は非トランザクショナル・スレッドの中の）別のスレッドによって行われた同じアドレスへのデータ・アクセスとの間の競合を検出するための、競合検出回路を備えることもできる。たとえば、トランザクション内の命令によってアクセスされるアドレスを追跡するための、アドレス追跡回路が設けられ得る。競合検出回路は、別のスレッドがアドレス追跡回路に記録されたアドレスの１つにアクセスするときに競合を検出できる。競合検出回路は、競合が検出されると、アドレスが追跡されている最初のスレッドのトランザクションの打切りをトリガすることができる。
【００２８】
トランザクショナル・メモリ用サポート回路は、トランザクションを打ち切らせる可能性のある他のイベントを検出する回路も備えることができる。たとえば、割込受信時に打ち切られ得る。また、トランザクショナル・メモリ用サポート回路がリソースを使い果たし（たとえば、投機結果記憶回路に格納されるべき投機結果の数又はアドレス追跡回路によって追跡されるアドレスの数が、設けられた記憶部内で利用可能な容量を超える場合）、それにより、トランザクションが競合なしに正しく続行されるのを保証することがもはや不可能な場合、トランザクションは打ち切られ得る。また、特定のタイプの命令は、トランザクション内で処理されるには不適切である可能性があり、トランザクション内で許可されていないタイプの命令が発生すると、トランザクションが打ち切られる場合がある。トランザクションが打ち切られると、トランザクションの実行を再び試みるか、又はロックを使用するなど、非トランザクション・ベースの仕組みを使用して代替のコード経路を実行するかの判断は、ソフトウェア次第であり得る。
【００２９】
対応するコンピュータ・プログラムは、ホスト・データ処理装置を制御して、命令を実行するための命令実行環境を提供することができ、該環境で処理プログラム・ロジックは、所定のタイプのトランザクション開始命令及び所定のタイプのトランザクション終了命令に応答して、上記で論じたロック識別子の取込み及びロック変数の確認を行う。かかるコンピュータ・プログラムにより、トランザクショナル・メモリ用サポート回路又は所定のタイプのトランザクション開始／終了命令用命令デコーダ・サポートを、それ自体が備えていない汎用のホスト・データ処理装置が、こうした特徴を提供する実際のハードウェアがない場合でも、トランザクショナル・メモリの機能性、及びトランザクションがロック変数を確認する必要がある場合の改善された処置の恩恵を受けることができるようになり得る。コンピュータ・プログラムは、その代わりに、この機能性をエミュレーションする命令又はデータ構造体のセットなどのプログラム・ロジックを提供し、汎用のホスト・データ処理装置が、かかるハードウェアの特徴を備える装置上で実行することを意図されたコードを、実行できるようにする。
【００３０】
図１は、ハードウェアのトランザクショナル・メモリ（ＨＴＭ：ｈａｒｄｗａｒｅ  ｔｒａｎｓａｃｔｉｏｎａｌ  ｍｅｍｏｒｙ）用サポートを備えた、データ処理装置２の実例を示す。本装置は、命令を実行してデータ処理演算を行う処理ロジック４を備える。たとえば、処理ロジック４は、加算、乗算、ＡＮＤ、ＯＲなどの算術又は論理演算を行うための算術／論理ユニット（ＡＬＵ：ａｒｉｔｈｍｅｔｉｃ／ｌｏｇｉｃ  ｕｎｉｔ）、浮動小数点被演算子の演算を実行する浮動小数点ユニット、又は複数のデータ要素を含むベクトル被演算子のベクトル処理を行うベクトル処理ユニットなど、様々なタイプの処理演算を実行する実行ユニットを備えることができる。処理ロジック４で実行される命令の被演算子を格納し、実行された命令の結果を格納する、アーキテクチャ・レジスタ６のセットが提供される。命令デコーダ８は、命令キャッシュ１０から取得された命令をデコードして、処理ロジック４又はデータ処理装置２の他の要素を制御して関連する操作を実行するための制御信号を生成する。ロード／ストア・ユニット１２も提供され、（命令デコーダ８によってデコードされたロード命令に応答して）ロード操作を実行して、データ・キャッシュ１４又は主メモリ１６からアーキテクチャ・レジスタ６にデータ値をロードし、（命令デコーダ８によってデコードされたストア命令に応答して）ストア操作を実行して、アーキテクチャ・レジスタ６からのデータ値をデータ・キャッシュ１４又はメモリ１６に格納する。
【００３１】
装置２は、ハードウェアのトランザクショナル・メモリ（ＨＴＭ）をサポートするための様々なリソースを提供する、トランザクショナル・メモリ用サポート回路２０も備える。トランザクショナル・メモリ用サポート回路２０内のＨＴＭリソースは、たとえば、トランザクションの投機結果を格納する投機結果記憶部２２、トランザクションがアクセスしたアドレスを追跡するアドレス追跡回路２４、トランザクションが行ったデータ・アクセスと他のスレッドが行ったデータ・アクセスとの間の競合を検出し、それにより競合が検出されたときにトランザクションを打ち切ることができる競合検出回路２６、及びトランザクション開始時にアーキテクチャ・レジスタ６からのアーキテクチャ状態データのスナップショットを格納し、それによりトランザクションが打ち切られたときに、トランザクションの投機結果に上書きするように、この状態を復元できる復元状態記憶回路２８を備え得る。また、リソースには、強いロック識別子のためのロック記憶構造体３０、及びトランザクションのネストのレベルを追跡する、ネスト深さの値を格納するためのネスト深さレジスタ３２を備えることができ、これらについては後でより詳細に説明することにする。
【００３２】
図２は、トランザクショナル・メモリ用サポート回路２０及び処理ロジック４を使用して、所与のスレッド内のトランザクションを実行する実例を示す。トランザクションは、トランザクション開始命令（ｔｓｔａｒｔ）及びトランザクション終了命令（ｔｃｏｍｍｉｔ）で区切られたプログラム・コードのセクションである。図２に示すように、トランザクション開始命令に応答して、アーキテクチャ・レジスタ６内の現在のアーキテクチャ状態が取り込まれ、復元状態記憶回路２８に格納される。処理ロジック４は、ｔｓｔａｒｔ命令の後に続く命令の投機的な実行を開始し、こうした命令が実行されると、その命令によってアクセスされるアドレスがアドレス追跡回路２４によって追跡され、競合検出回路２６が、追跡されたアドレスと、他のスレッドに応答してロード／ストア・ユニット１２を使用してアクセスされたアドレスとの間の競合を検出する。トランザクション内の命令の少なくともいくつかの投機結果は、投機結果記憶回路２２内に格納される。たとえば、ストア命令ＳＴＲに応答してキャッシュ又はメモリに格納された値は、トランザクションが保留状態にある間、投機結果記憶部２２に保持することができる。その間にアボート・イベントが発生せずにトランザクション終了命令（ｔｃｏｍｍｉｔ）に至る場合、トランザクション終了命令に応答して投機結果はコミットされる。トランザクションをコミットすると、そのスレッドについての投機結果記憶部２２に格納されたどの結果も、データ・キャッシュ１４又はメモリ１６に書き込むことができ、もはやトランザクション開始命令が検出される前のポイントにアーキテクチャの状態を戻す必要がなくなったので、復元状態２８は破棄されるか、又は上書きが許可され得る。
【００３３】
一方、アボート・イベントが発生する場合、たとえば、すでにトランザクションによってアクセスされているアドレスに別のスレッドがアクセスするときに、競合検出回路２６によって競合が検出される場合、トランザクションの打切りがトリガされ、復元状態記憶部２８からの復元状態が、アーキテクチャ・レジスタ６に復元される。アボート・イベントが発生する他の原因には、たとえば、トランザクション内での実行が許可されていない命令の実行、所与のトランザクションが必要とする投機結果又はアドレスを扱う投機結果記憶部２２又はアドレス追跡回路２４内のリソース不足、或いはトランザクション中に受信されている割込みが含まれ得る。
【００３４】
図２は、トランザクションの開始及び終了命令を使用して、実行されるべき特定の処理操作のセットが、トランザクショナル・モードでどのように実行され得るかを示す。図３に示すように、ロック・ベースの仕組みを使用して、非トランザクショナル・モードで同じ処理操作のセットを実行することもできる。この場合、コードのセクションを開始する前に、少なくとも１つのロック確認命令４０が、ロックのアドレス＃ａｄｄＬｏｃｋで特定されるロック変数を確認し、ロック変数が、別のスレッドがすでにロックを保持していることを示すかどうかを確認する。別のスレッドがロックを保持している場合、ロックが解放されるまで、処理は、ロック確認命令４０より先に進まない。ロックが使用可能であると判断されると、ロックのアドレス＃ａｄｄＬｏｃｋに所与の値（たとえば、バイナリの１）を書き込むことでロックが要求される。たとえば、ロック確認命令４０は、指定されたアドレスに格納されている現在の値を比較してロックが保持されているかどうかを判断し、ロックが要求されていない場合は、ロック変数を更新してロックを要求する、不可分な比較及びスワップ命令を使用して実施され得る。或いは、ロックの確認は、ロックを読み取りロックの値をテストする一連の複数の命令を使用して実施してもよく、どちらでも、ロックがすでに要求されている場合は処理を延期させ、又はロックが現在要求されていない場合はロック変数を更新することによりロックを要求させる。ロックによって保護されたコードのセクションを完了して、ロックによって保護されたリソースへの排他的アクセスがもはや不要になると、別の命令４２がロックを解放できる。たとえば、ロックによって保護されるリソースは、介在するコードのセクション間にアクセスされる、様々なアドレスによって特定されるデータの場所である。
【００３５】
したがって、処理ロジック４によって実行されている処理のいくつかのスレッドは、図２に示すように、トランザクション・モードを使用でき、一方他のスレッドは、トランザクションを使用しないロック・ベースのモードを使用できる。また、トランザクショナル・モードを使用して最初に試行されたスレッドは、そのトランザクションで頻繁な打切りが生じる場合、ロックを使用する非トランザクショナル・モードの使用に切り替えることができる。たとえば、競合が発生し続けるスレッドのセットが存在する可能性があるため、そうしたスレッドすべてに対してトランザクションを継続して使用することは効率的ではない。したがって、１つのスレッドが図２に示すものと同様のトランザクショナル・モードを使用している間でも、依然としてロック・ベースの仕組みを使用する必要がある他のスレッドが存在し得る。また、トランザクショナル・モードで操作するスレッドは、依然として、非トランザクショナル・スレッドからもアクセスされる共有リソースへのアクセスが必要な場合がある。場合によっては、非トランザクショナル・スレッドが実際にトランザクショナル・スレッドと同じコードを実行していることがあるが、コードは、そのコード内にトランザクショナル経路と非トランザクショナル経路との両方を有している場合があり、経路は、トランザクションが以前のときに効率的であると判明したかどうかに応じて選択され得る（たとえば、トランザクショナル経路が打切りを続ける場合、ソフトウェアが、非トランザクショナル経路に切り替えることができる）。
【００３６】
ロックによって保護されたリソースへのアクセスを共有する必要がある、トランザクショナル・スレッドと非トランザクショナル・スレッドとの両方が存在する可能性があるので、この場合図４に示すように、ときどきトランザクショナル・スレッドは、依然としてロックのアドレスを読み取り、ロックがクリアされている場合は、ロックを要求し、ロックが現在要求されているか又はセットされている場合は、トランザクションを打ち切るか又はしばらく待機する、いくつかの命令を有する必要があり得る。競合確認回路２６は、別のスレッド操作がトランザクションと競合するかどうかを検出し、競合する場合、トランザクションを打ち切って誤った結果を防ぐことができるので、かかるロック確認命令が、トランザクショナル・スレッド自体の正しい処理を保証する必要はないが、非トランザクショナル・スレッドの操作を含み得る、別のスレッドがロックを保持しているときのトランザクションの結果のコミットを防ぐために、ロックの確認は必要になるであろう。
【００３７】
したがって、図５に示すように、トランザクショナル・スレッドと非トランザクショナル・スレッドとが共存する場合、一般的に、非トランザクショナル・スレッドＴ１がトランザクショナル・スレッドＴ０でトランザクションを開始する前にロックを要求するような状況が発生する。トランザクションに入ると、トランザクショナル・スレッドＴ０は、図４に示すようにいくつかの命令を実行して、ロックのアドレス＃ａｄｄＬｏｃｋで特定されるロックが保持されているかどうかを確認することができ、トランザクショナル・スレッドＴ０がロックを要求できるまで、トランザクションの機能命令の後の処理を遅らせることができる。これには時間がかかる場合があり、非トランザクショナル・スレッドＴ１はいくつかのサイクルでロックを解除できないので、図５に示すように遅延が発生する。
【００３８】
図６は、かかる遅延を回避するのに役立ち得る、トランザクションでロック確認を行う代替のやり方を示す。所定のタイプのトランザクション開始命令、ｔｓｔａｒｔＬが提供され、これは、たとえば即値又はレジスタ参照を使用して、ロックのアドレスを指定する。所定のタイプのトランザクション開始命令に応答して、ロックのアドレスは、図１に示すロック記憶構造体３０内に取り込まれる。たとえば、ロック記憶構造体３０は、ロック変数のアドレスを書き込むことができる１つ又は複数のレジスタを備えることができる。ロックのアドレスを取り込んで、従来のトランザクション開始命令に関連する他のどんな操作をも実行すると、トランザクションの機能命令を実行でき、ロック変数を確認して、ロックが現在保持されている場合、トランザクションの処理を延期するためのどんな命令も含める必要がない。したがってこれにより、図５に示す遅延が解消される。その代わりに、ロック変数の確認が、トランザクション終了命令ｔｃｏｍｍｉｔに至るまで延期される。トランザクション終了命令に応答して、処理ロジック４は命令デコーダ８により制御され、ロック記憶構造体３０内に取り込まれた任意のロックのアドレスで示されるロック変数を確認する。場合によっては、この確認を、図１に示すロック確認エンジン３４に任せることができ、ロック確認エンジン３４は、該エンジン３４を制御する、関連するタイマ３６を備えることができ、トランザクション終了命令ｔｃｏｍｍｉｔによって起動されると、ロック記憶構造体３０に格納されたロックのアドレスによって特定されるロック変数を読み取るロード操作を定期的に発行して、ロック変数が現在、ロックが別のスレッドによって保持されていることを示しているかどうかを確認し、そのロックがもはや別のスレッドによって保持されなくなるまで確認を続行する。したがって、現在ロックされている場合、トランザクションの投機的に実行された命令によって生成された結果のコミットは、延期又は防止される。一方、ロックが要求されていないことが判明した場合は、トランザクションの結果はコミットされ得る。ロック確認回路３４は必須ではなく、代わりに、かかるロックの確認は、処理ロジック４又はロード・ストア・ユニット１２によって行われ得る。
【００３９】
図７は、所定のタイプのトランザクション開始命令ｔｓｔａｒｔＬを実現する代替のやり方を示す。この場合、ｔｓｔａｒｔＬ命令自体はロック識別子のアドレスを指定しないが、代わりにロック識別子のアドレスは、所定のタイプのトランザクション開始命令に続く最初のロード命令５０によって取得され、次いで図６と同じように、ロードのアドレスが取り込まれる。図７のトランザクション終了命令の操作は、図６のそれと同じである。
【００４０】
図６及び図７に示す所定のタイプのトランザクション開始命令ｔｓｔａｒｔＬは、図４に示す従来のタイプのトランザクション開始命令ｔｓｔａｒｔと様々なやり方で区別することができる。場合によっては、相異なるタイプのトランザクション開始命令は、相異なる命令のオペコードを有することができる。或いは、それらのトランザクション開始命令は、同じオペコードを共有できるが、ロックのアドレスの取込みをトリガしない通常のトランザクション開始命令を、図６及び図７に示す、ロックの取込みをトリガする、特殊なタイプのトランザクション開始と区別する、命令エンコードの別のフィールド内に指定されたパラメータが存在し得る。或いは、アーキテクチャ・レジスタ６の状態レジスタ内のモード・ビットは、トランザクション開始命令がロックのアドレスの取込みをトリガすべきかどうかを決定することができる。トランザクション開始命令自体がロックのアドレスの取込みをトリガしない図７などの実施態様では、レジスタ６の１つの中のフラグは、所定のタイプのトランザクション開始命令ｔｓｔａｒｔＬに応答して、第１の値にセットすることができ、それによりロード命令５０が検出されると、状態フラグが第１の値を有する場合にはロックのアドレスが取り込まれ、状態フラグが第２の値を有する場合には取り込まれない。ロックのアドレスが取り込まれると、フラグは、第２の値にセットすることができ、それにより後に続くロードで、次のアドレスの取込みがトリガされなくなる。この手法では、コンパイラ又はプログラマは、所定のトランザクション開始命令の後に実行される最初のロード命令を、確実にロック変数のアドレスを提供するものにする必要がある（実際には、トランザクション開始命令は通常、ロックを必要とするコードの重要なセクションの先頭に含まれているはずなので、いずれにしても、ロックの確認が、トランザクションで最初に実行される操作である可能性は高い）。
【００４１】
図８に示すように、図６及び図７に示す手法を用いて、ロックを保持する非トランザクショナル・スレッドが存在する場合でも、図５の遅延を解消できる。ロックのアドレスは、トランザクショナル・スレッドＴ０の所定のタイプのトランザクション開始命令に続いて取り込まれ、トランザクションの終了に達したときにロック変数の確認が必要になることを示す。この時点では、ロックが別のスレッドによって実際に保持されているかどうかは関係なく、トランザクションの機能命令を投機的に実行し続けることができる。トランザクションの終わりに、ｔｃｏｍｍｉｔ命令がロック変数の確認をトリガし、図８に示す状況では、非トランザクショナル・スレッドＴ１がロック変数をすでにロック解除しているので、ロックは現在要求されていないことが判明している。したがって、トランザクショナル・スレッドＴ０のトランザクションの結果をコミットできる。対照的に、以前に論じた手法では、トランザクショナル・スレッドＴ０のトランザクションの開始時に非トランザクショナル・スレッドによってロックが保持されていた場合、遅延が発生していたであろう。トランザクションの最初ではなく最後にロック変数を確認することにより、トランザクションが終了する前に非トランザクショナル・スレッドがロック変数をロック解除している可能性がより高くなる。
【００４２】
図９に示すように、トランザクション終了命令ｔｃｏｍｍｉｔに達した時点で依然として他のスレッドＴ１によってロックが保持されている場合でも、ロックが放棄されるのを待つことに伴う遅延５２は、図５に示す手法が使用され、トランザクションの開始時にロックが確認された場合に発生していたはずである遅延よりも短い可能性がある。というのは、ロックが解放されるのを待つのに費やされた時間の一部が、トランザクションの機能命令を実行するために使用されているからである。したがって、これにより、図５に示す場合と比較して、さらに性能が向上する可能性がある。
【００４３】
図１０に示すように、それぞれのトランザクショナル及び非トランザクショナル・スレッドＴ０、Ｔ１によってアクセスされるアドレス間に競合がある場合、これは競合検出回路２６によって検出されることになり、トランザクションは打ち切られ、後で再試行されるか、又は代わりに非トランザクショナル・モードで実行され得る。したがって、非トランザクショナル・スレッドＴ１がロックを保持していても、トランザクションの命令を進めることができることに問題は生じない。確実にトランザクショナル・スレッドＴ０の正しい処理を行うために、ロックの確認は不要である。また、トランザクションがすでに開始された後に非トランザクショナル・スレッドＴ１がロックを要求しようとする（そして、ロックのアドレスがロック記憶構造体３０に取り込まれている場合でも、スレッドＴ０のトランザクションがロックを要求しようとしないので、スレッドＴ１はロックを首尾良く要求できる）場合でも、アドレスの競合により依然としてトランザクションの打切りがトリガされることになり、打切りが起こらずにＴ０がトランザクションの終了に達したときに、スレッドＴ１が依然としてロックを保持している場合は、トランザクションのコミットは延期／防止される。
【００４４】
ロックのアドレスがロック記憶部３０に割り当てられると、そのロックのアドレスは、アドレス追跡回路２４によって追跡される必要がないので、他のスレッドによるそのアドレスへのアクセスが競合の検出をトリガすることはない。これにより、トランザクションの終了時にロックが確認されることになるので、打切りが不要になるため、トランザクションを中断することなく、他のスレッドによるロック変数への書込みが可能になる。
【００４５】
図１１に示すように、トランザクションがネストされ、その結果以前のトランザクション開始命令に対応するトランザクション終了命令が検出される前、且つ以前のトランザクションが依然として保留されており、打ち切られていないときに、別のトランザクション開始命令を受信することが可能である。ネスト深さレジスタ３２は、トランザクションの現在のネスト深さを追跡して、トランザクションが開始されていない場合か、ただ１つのトランザクションだけが開始された場合か、又は前のトランザクション内でさらにネストされたトランザクションが開始された場合かを、区別することができる。図１１に示すように、トランザクションがまだ開始されていない場合、ネスト深さは０となり得る。最初のトランザクション開始命令に応答して、ネスト深さを１に増加させることができる。さらにネストされたトランザクションが開始されると、ネスト深さを２に、さらに増加させることができる、などである。トランザクションをコミットすると、ネスト深さを減少させることができる。したがって、それぞれのネストされたトランザクションがコミットされると、すべてのトランザクションがコミットされてネスト深さが再び０に戻るまで、ネスト深さは徐々に戻される。
【００４６】
実際には、ネストされたトランザクションごとに個別の復元状態のセットを維持する価値はないかもしれない。その代わりに、ハードウェアは、ネストされたどのトランザクションをも事実上無視し、単にネストされたセットのより大きな外側のトランザクションの一部としてネストされたトランザクションを扱うことができる。それにもかかわらず、コードが外側のトランザクション開始命令の後にプログラム・コードの一部に分岐する場合でも、分岐点に続くコードのセクションが、依然として確実にトランザクションとして扱われるようにするために、コードがネストされたトランザクションを定義している場合がある。したがって、場合によっては、ＨＴＭリソース２０は、セットの内側のトランザクション（すなわち、ネスト深さがすでに１以上であるときにトランザクション開始命令が実行されるトランザクション）のトランザクション開始及び終了命令を事実上無視することができる。したがって、（ネスト深さが１のときに実行される）外側のトランザクションのトランザクション終了命令ｔｃｏｍｍｉｔは、状態のコミット及び復元状態の破棄をトリガし、一方内側のトランザクションのトランザクション終了命令ｔｃｏｍｍｉｔは、無視されることになる（ネスト深さが２以上のとき）。ネスト深さは、ネスト深さレジスタ３２内で明示的に表す必要はなく、実際のネスト深さの数を示すバイナリ値以外の、ネスト深さを表す他のやり方があり得ることに留意されたい（たとえば、状態コードは、ネスト深さを表す可能性がある）。
【００４７】
したがって、上記で論じたロック取込機能を備える場合、ネストされたセットの各トランザクション開始命令は、個別のロック変数の取込みをもたらすことができる。場合によっては、第２のトランザクション開始命令に関連するロック識別子は、すでに取り込まれたロック識別子と同じである可能性があり、この場合、ロック記憶構造体３０は、同じロック識別子に対して別個のエントリを割り当てる必要がない。しかし、ロック識別子がすでに取り込まれたロック識別子と異なる場合、第２のロック識別子がロック記憶構造体３０に割り当てられる。ネストされたセットの内側のトランザクションであるトランザクションに関連するトランザクション終了命令ｔｃｏｍｍｉｔでは、動作は実行されない。ただし、外側のトランザクション終了命令では（ネストの深さが１のとき）、ロック記憶構造体に格納されている１つ、２つ、又はそれ以上のロック識別子が確認され、対応するロック変数のいずれかが、別のスレッドがロックを保持していることを示すかどうかを調べ、現在のスレッドについてのロック記憶構造体３０で示されるすべてのロックが現在解放されている場合、トランザクション（どの内側のトランザクションをも含む）の結果がコミットされる。やはり、この仕組みにより、ネストされたトランザクションのセットの終了までロックの確認を延期することにより、性能向上が可能となり、トランザクションの初めにロックが保持されている場合でも、トランザクションを前に進めることができる。
【００４８】
図１２は、トランザクション開始命令の処理を示す流れ図である。ステップ１００で、トランザクション開始命令が命令デコーダ８によってデコードされる。ステップ１０２で、デコーダは、トランザクション開始命令が所定のタイプのトランザクション開始命令であるかどうかを判断する。そうである場合、ステップ１０４で、命令デコーダ８は、処理ロジック４をトリガして、ロック記憶構造体３０内のロック識別子を取り込むか、又は選択されたタイプの次の命令（たとえば次のロード命令）に応答して、ロック識別子の取込みをトリガするために状態をセットする、制御信号を生成する。トランザクション開始命令が所定のタイプではなかった場合、ステップ１０４は省略される。
【００４９】
トランザクション開始命令のタイプに関係なく、ステップ１０６で、命令デコーダ８によって生成された制御信号はまた、処理ロジック４を制御して、アーキテクチャ・レジスタ６内に格納されている現在の値を復元状態記憶部に書き込むことによって、トランザクションの復元状態のセットを取り込む。場合によっては、復元状態記憶部２８には、複数のスレッドに対応する２つ以上の相異なる復元状態のセットが含まれてもよく、それにより、取り込まれた復元状態は、異なるスレッドの復元状態の処置にまだ割り当てられていない領域に、割り当てられ得る。ステップ１０８で、トランザクション開始命令の後に続く命令に応答して、命令デコーダ８は、そうした命令の投機的実行を開始するように処理ロジック４を制御する、制御信号を生成する。アドレス追跡回路２４は、後続の投機的に実行される命令によってアクセスされるアドレスの追跡を開始し、競合検出回路２６は、アドレス追跡回路２４で追跡されるアドレスと他のスレッドによってアクセスされるアドレスとの間の競合の確認を開始する。
【００５０】
図１３は、トランザクション終了命令の処理を示す流れ図である。ステップ１２０で、トランザクション終了命令が命令デコーダ８によってデコードされ、図１３の後続のステップを実行するように処理ロジック４を制御するための制御信号が生成される。ステップ１２２で、ネスト深さレジスタ３２が確認され、ネスト深さが１に等しいかどうかが判断される。１でない場合、現在のトランザクションはネストされたセットの内側のトランザクションであり、ステップ１２３で、トランザクション終了命令は無視される。ネスト深さが１の場合、トランザクション終了命令が実行され、ステップ１２４で、処理ロジック４は、現在のスレッドについて、取り込まれた任意のロック識別子がロック記憶構造体３０に格納されているかどうかを判断する。格納されていない場合、ロックを確認する必要はなく（たとえば、元のトランザクション開始命令が、所定のタイプのトランザクション開始命令でなかった可能性がある）、それによりステップ１２６で、トランザクションで投機的に生成された結果がコミットされる。したがって、投機結果記憶回路２２に格納されたいかなる結果も、データ・キャッシュ１４又はメモリ１６に書き込むことができる。また、アーキテクチャ・レジスタ６に格納されているどんな投機的な値も、非投機的になる（これを確実にするための変更は不要であり、そうではなくて、結果はもはや復元状態によって上書きされないので、結果は非投機的になる）。復元状態記憶部２８内の現在のトランザクションに関連するどんな復元状態も、破棄されるか、又は後のトランザクションに関連する復元状態によって上書きできるよう利用可能にされ得る。
【００５１】
ステップ１２４で、取り込まれた任意のロック識別子が、ロック記憶構造体３０内に存在していた場合、ステップ１２７で、処理ロジック４又はロック確認エンジン３４は、取り込まれたロックのいずれかが現在ロックされているかどうかを確認する。ロックされていない場合、やはりステップ１２６で、トランザクションの結果をコミットすることができる。ステップ１２７で、現在のスレッドの取り込まれたロック識別子のいずれかが、対応するリソースが別のスレッドによってロックされていることを示すロック変数を参照していると判断された場合、ステップ１２８で、処理ロジック４又はロック確認エンジン３４は、トランザクションの結果のコミットを延期するため、ある期間待機する。ある期間待機した後、ステップ１３０で、再試行の数又は待機に費やされた期間が、閾値未満かどうかが判断され、閾値未満であれば、ステップ１２７で、取り込まれたロックのいずれかが現在ロックされているかどうかを確認する試みがもう一度行われ、すべてのロックが解除されている場合、ここでトランザクションの結果をコミットできる１２６。そうでない場合、システムは待機し続ける。ステップ１３０で、再試行の数又は待機期間が閾値に達した場合、ステップ１３２で、トランザクションを打ち切ることができる。或いは、待機の仕組みを実施するのではなく、取り込まれたロックのいずれかがステップ１２７でロックされていると判断される場合は、直接ステップ１３２に進むことにより、トランザクションを単に打ち切る方がより簡単であり得る。トランザクションが打ち切られた場合、ソフトウェアは、後でトランザクションを再スケジュールするか、又はロック・ベースの非トランザクショナル・モードを使用してトランザクションの実行を試みるかを判断することができる。
【００５２】
図１４は、使用することができるシミュレータの実施態様を示す。前述の実施例は、当該の技法をサポートする特定の処理ハードウェアを操作する装置及び方法の点から本発明を実現する一方で、本明細書に記載の実施例にしたがって、コンピュータ・プログラムの使用によって実現される、命令実行環境を提供することも可能である。かかるコンピュータ・プログラムは、ハードウェア・アーキテクチャのソフトウェア・ベースでの実施態様を提供する限り、シミュレータと呼ばれることが多い。シミュレータのコンピュータ・プログラムの種類には、エミュレータ、仮想マシン、モデル、及び動的バイナリ・トランスレータを含むバイナリ・トランスレータが含まれる。通常、シミュレータの実施態様は、ホスト・プロセッサ２３０上で実行することができ、任意選択で、ホスト・オペレーティング・システム２２０を実行し、シミュレータ・プログラム２１０をサポートする。いくつかの配置構成では、ハードウェア及び提供された命令実行環境、並びに／又は同じホスト・プロセッサ上に設けられた複数の別個の命令実行環境の間に、複数のシミュレーションの層があり得る。歴史的に、合理的な速度で実行するシミュレータの実施態様を提供するには強力なプロセッサが必要であったが、かかる手法は、互換性又は再利用性のために別のプロセッサでネイティブなコードを実行することが望まれる場合など、特定の状況で正当化され得る。たとえば、シミュレータの実施態様は、ホスト・プロセッサのハードウェアでサポートされていない追加の機能性を有する命令実行環境を提供するか、又は異なるハードウェア・アーキテクチャに通常関連する命令実行環境を提供することができる。シミュレーションの概要は、Ｒｏｂｅｒｔ  Ｂｅｄｉｃｈｅｋ、「Ｓｏｍｅ  Ｅｆｆｉｃｉｅｎｔ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｉｍｕｌａｔｉｏｎ  Ｔｅｃｈｎｉｑｕｅｓ」、１９９０年冬、ＵＳＥＮＩＸカンファレンス、５３〜６３頁に提示されている。
【００５３】
前に実施例を説明してきた限りにおいて、特定のハードウェア構成又は特徴を参照して、シミュレーションされた実施例で、好適なソフトウェア構成又は特徴により同等の機能性を提供することができる。たとえば、特定の回路は、シミュレーションされた実施例では、コンピュータ・プログラム・ロジックとして実現することができる。同様に、レジスタ又はキャッシュなどのメモリ・ハードウェアは、ソフトウェア・データ構造としてシミュレーションされた実施例で実現することができる。前に説明した実施例で参照された１つ又は複数のハードウェア要素がホスト・ハードウェア（たとえば、ホスト・プロセッサ２３０）上に存在する配置構成では、いくつかのシミュレーションされた実施例は、好適な場合、ホスト・ハードウェアを使用することができる。
【００５４】
シミュレータ・プログラム２１０は、コンピュータ可読の記憶媒体（非一時的媒体であり得る）に格納することができ、シミュレータ・プログラム２１０によってモデル化されているハードウェア・アーキテクチャのアプリケーション・プログラム・インターフェースと同じ、プログラム・インターフェース（命令実行環境）を、ターゲット・コード２００（アプリケーション、オペレーティング・システム及びハイパーバイザが含まれ得る）に提供する。したがって、上記の所定のタイプのトランザクション開始／終了命令を含むターゲット・コード２００のプログラム命令は、シミュレータ・プログラム２１０を使用して命令実行環境内から実行されてもよく、その結果、上記で論じた装置２のハードウェアの特徴を実際には備えていないホスト・コンピュータ２３０が、こうした特徴をエミュレーションできる。
【００５５】
本出願では、「．．．するよう構成される」という用語は、装置の要素が、定義された操作を実行できる構成を備えることを意味するように使用される。これに関連して、「構成」とは、ハードウェア又はソフトウェアの相互接続の配置構成又は態様を意味する。たとえば、装置は、定義された操作を提供する専用のハードウェアを備えてもよく、又はプロセッサ若しくは他の処理デバイスを、機能を実行するようにプログラムしてもよい。「するよう構成される」は、定義された操作を提供するために、装置要素をいかなる形であれ変更する必要があることを示唆するものではない。
【００５６】
本発明の例示的な実施例を、添付図面を参照して本明細書で詳細に説明してきたが、本発明はそれらの正確な実施例に限定されるものではなく、当業者によってその中に、添付の特許請求の範囲によって定義される本発明の範囲及び精神から逸脱することなく、様々な変更及び修正を行うことができることを理解されたい。
【図１】
2020537222.tif 000003
【図２】
2020537222.tif 000004
【図３】
2020537222.tif 000005
【図４】
2020537222.tif 000006
【図５】
2020537222.tif 000007
【図６】
2020537222.tif 000008
【図７】
2020537222.tif 000009
【図８】
2020537222.tif 000010
【図９】
2020537222.tif 000011
【図１０】
2020537222.tif 000012
【図１１】
2020537222.tif 000013
【図１２】
2020537222.tif 000014
【図１３】
2020537222.tif 000015
【図１４】
2020537222.tif 000016
【国際調査報告】
2020537222.tif 000017
2020537222.tif 000018