(57)【要約】  トランザクショナル・メモリ、及び、所与のアドレスに対する排他アクセスを追跡する排他モニター標示を使用してロード／ストア排他命令サポートする装置が説明される。所与のトランザクション内において実行されるロード対象アドレスを指定した所定のタイプのロード命令に応答して、ロード対象アドレスに対して以前にセットされた任意の排他モニター標示がクリアされる。ロード排他命令に応答して、所与のアドレスがそのワーキング・アドレス・セットのうちの１つとして指定された対象のトランザクションに対して停止がトリガーされる。これは、非トランザクショナル・スレッドにおけるロード投機が存在する場合でもトランザクショナル・スレッドと非トランザクショナル・スレッドとの間の相互排他を維持することに役立つ。
2021529372.tif 000002
【特許請求の範囲】
【請求項１】
データ処理のスレッドを処理する処理回路と、
前記処理回路により処理される前記スレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ・サポート回路であって、前記トランザクションが、トランザクション開始命令とトランザクション終了命令との間に投機的に実行される前記スレッドの命令を含み、前記命令に対して、前記処理回路が、前記トランザクション終了命令への到達が発生するまで、投機的に実行された前記命令の結果のコミットメントを防止するように構成され、前記トランザクション・メモリ・サポート回路が、前記トランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つに対する別のスレッドからのコンフリクトするアクセスを検出したことに応答して、前記トランザクションの停止をトリガーするコンフリクト検出回路を備える、トランザクショナル・メモリ・サポート回路と、
を備え、
所与のアドレスを指定したロード排他命令に応答して、前記処理回路が、前記所与のアドレスに対して排他モニター標示をセットするように構成され、
前記所与のアドレスを指定したストア排他命令に応答して、前記処理回路が、前記所与のアドレスが前記排他モニター標示をもはやセットさせないとき、ストア排他失敗標示を返信するように構成され、
所与のトランザクション内において実行されるロード対象アドレスを指定した所定のタイプのロード命令に応答して、前記処理回路が、前記ロード対象アドレスに対して以前にセットされた任意の前記排他モニター標示をクリアすることをトリガーするように構成され、
前記ロード排他命令に応答して、前記処理回路と前記トランザクショナル・メモリ・サポート回路とのうちの少なくとも１つが、前記ワーキング・アドレス・セットのうちの１つとして前記所与のアドレスが指定された対象であるトランザクションの停止をトリガーするように構成される、
装置。
【請求項２】
前記処理回路が、処理の複数の前記スレッドの並列な実行が可能な複数の処理要素を備える、
請求項１に記載の装置。
【請求項３】
前記ロード排他命令が複数の前記処理要素のうちの所与の処理要素において実行されたことに応答して、前記所与の処理要素が、少なくとも１つの他の前記処理要素へのメッセージの送信をトリガーするように構成され、前記メッセージが、前記排他モニター標示が前記所与のアドレスに対してセットされたことを示す、
請求項２に記載の装置。
【請求項４】
前記所定のタイプの前記ロード命令が複数の前記処理要素のうちの所与の処理要素において実行されたことに応答して、前記所与の処理要素が、複数の前記処理要素のうちの少なくとも１つの他の前記処理要素へのメッセージの送信をトリガーするように構成され、前記メッセージが、前記ロード対象アドレスに対して少なくとも１つの他の前記処理要素により以前にセットされた任意の前記排他モニター標示がクリアされなければならないことを示す、
請求項２及び請求項３のいずれか一項に記載の装置。
【請求項５】
前記所与のトランザクション内において実行された前記所定のタイプの前記ロード命令に応答して、前記処理回路が、前記所与のトランザクションのための前記ワーキング・アドレス・セットに前記ロード対象アドレスを追加するように構成される、
請求項１から請求項４のいずれか一項に記載の装置。
【請求項６】
前記所与のトランザクション内において実行されたロード対象アドレスを指定した第２のタイプの前記ロード命令に応答して、前記処理回路が、前記ロード対象アドレスに対して任意の以前にセットされた前記排他モニター標示を保有するように構成される、
請求項１から請求項５のいずれか一項に記載の装置。
【請求項７】
対象アドレスへの排他アクセスを制御するためのロック変数が所与のスレッドにより成功のうちにクレームされたか否かを前記処理回路が解決する前に、前記処理回路が、前記対象アドレスからデータ値をロードするためにロード命令を投機的に実行する前記所与のスレッドをサポートするように構成される、
請求項１から請求項６のいずれか一項に記載の装置。
【請求項８】
前記処理回路が、前記所与のアドレス又は別のアドレスを指定したロード排他命令を実行したことと、
前記処理回路が、前記ロード対象アドレスとして前記所与のアドレスを指定した前記所定のタイプの前記ロード命令を実行したことと、
ストア演算が、前記所与のアドレスに対応したメモリ位置にデータを記憶したことと、
のうちの１つを検出したことに応答して、前記所与のアドレスに対してセットされた前記排他モニター標示のクリアをトリガーする排他モニター回路を備える、
請求項１から請求項７のいずれか一項に記載の装置。
【請求項９】
前記トランザクション・メモリ・サポート回路が、
少なくとも１つの前記トランザクションに対する投機的に実行された前記命令の前記結果を記憶する投機的結果記憶回路と、
前記トランザクションを前記停止したときにリストアされる、前記トランザクション開始命令に応答してキャプチャされた状態を記憶するリストア状態記憶回路と、
のうちの少なくとも１つをさらに備える、
請求項１から請求項８のいずれか一項に記載の装置。
【請求項１０】
所与のアドレスを指定したロード排他命令に応答して、前記所与のアドレスに対して排他モニター標示をセットすることと、
前記所与のアドレスを指定したストア排他命令に応答して、前記所与のアドレスが前記排他モニター標示をもはやセットさせないとき、ストア排他失敗標示を返信することと、
トランザクション内において実行される、ロード対象アドレスを指定した所定のタイプのロード命令に応答して、前記ロード対象アドレスに対して以前にセットされた任意の前記排他モニター標示をクリアすることであって、前記トランザクションが、トランザクション開始命令とトランザクション終了命令との間に投機的に実行される所与のスレッドの命令を含み、前記命令に対して、前記トランザクション終了命令への到達が発生するまで、投機的に実行された前記命令の結果のコミットメントが防止され、前記トランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つに対する別のスレッドからのコンフリクトするアクセスを検出したことに応答して、前記トランザクションが停止される、クリアすることと、
前記ロード排他命令に応答して、前記ワーキング・アドレス・セットのうちの１つとして前記所与のアドレスが指定された対象であるトランザクションの停止をトリガーすることと、
を含む、データ処理方法。
【請求項１１】
データ処理のスレッドの実行のための命令実行環境を提供するようにホスト・データ処理装置を制御するためのコンピュータ・プログラムであって、前記コンピュータ・プログラムが、
前記データ処理の前記スレッドを処理する処理プログラム論理部と、
前記処理プログラム論理部により処理される前記スレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ・プログラム論理部であって、前記トランザクションが、トランザクション開始命令とトランザクション終了命令との間に投機的に実行される前記スレッドの命令を含み、前記命令に対して、前記処理プログラム論理部が、前記トランザクション終了命令への到達が発生するまで、投機的に実行された前記命令の結果のコミットメントを防止するように構成され、トランザクション・メモリ・プログラム論理部が、前記トランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つに対する別のスレッドからのコンフリクトするアクセスを検出したことに応答して前記トランザクションの停止をトリガーするコンフリクト検出プログラム論理部を備える、トランザクショナル・メモリ・プログラム論理部と、
を備え、
所与のアドレスを指定したロード排他命令に応答して、前記処理プログラム論理部が、前記所与のアドレスに対して排他モニター標示をセットするように構成され、
前記所与のアドレスを指定したストア排他命令に応答して、前記処理プログラム論理部が、前記所与のアドレスが前記排他モニター標示をもはやセットさせないとき、ストア排他失敗標示を返信するように構成され、
所与のトランザクション内において実行されるロード対象アドレスを指定した所定のタイプのロード命令に応答して、前記処理プログラム論理部が、前記ロード対象アドレスに対して以前にセットされた任意の前記排他モニター標示をクリアすることをトリガーするように構成され、
前記ロード排他命令に応答して、前記処理プログラム論理部と前記トランザクショナル・メモリ・プログラム論理部とのうちの少なくとも１つが、前記ワーキング・アドレス・セットのうちの１つとして前記所与のアドレスが指定された対象である前記トランザクションの停止をトリガーするように構成される、
コンピュータ・プログラム。
【請求項１２】
複数の処理要素とメッセージを交換する複数のインターフェースと、
複数の前記処理要素間のコヒーレンシーを管理するように構成された制御回路と、
を備え、
所与のアドレスに対する排他アクセスを追跡するための前記所与のアドレスに関連した排他モニター標示のセッティングを示す所与の処理要素からの排他モニター・セッティング・メッセージに応答して、少なくとも１つの他の前記処理要素に前記排他モニター・セッティング・メッセージを前記インターフェースが送信することを、前記制御回路がトリガーするように構成され、
第１のタイプの読み出し要求により指定された対象アドレスに関連した読み出しデータ値の返信を要求する第１の処理要素から受信された所定のタイプの読み出し要求に応答して、前記対象アドレスに関連した任意の前記排他モニター標示のキャンセルをトリガーするように、少なくとも１つの他の前記処理要素に排他モニター・キャンセル・メッセージを前記インターフェースが送信することを、前記制御回路がトリガーするように構成される、
相互接続体。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、データ処理の分野に関する。より具体的には、トランザクショナル・メモリに対するサポートを備えるデータ処理装置に関する。
【背景技術】
【０００２】
データ処理システムは、データ処理の多くのスレッドを実行し得る。場合によっては、スレッドはシェアされたリソースにアクセスすることを必要とし得、データ処理演算の本質は、スレッドがシェアされたリソースと相互作用し始めた後、同時に別のスレッドがそのリソースにアクセスすることなく、そのリソースを使用する演算のセットがアトミックに履行されることが必要であり得る、というものであり得る。
【０００３】
第１のスレッドにおけるコードのクリティカル・セクションが第２のスレッドにおけるコードのクリティカル・セクションに対してアトミックに実施されるという性質は、「相互排他」と呼ばれ得る。クリティカル・セクションは、それぞれのスレッドにおける命令の同一のシーケンスを含み得、又は、シェアされたリソースを両方が更新するコードの異なるセクションを含み得る。両方のクリティカル・セクションが実施された結果が次のいずれかの場合、すなわち、第１のスレッドがクリティカル・セクションを実施した後、第１のスレッドにおけるクリティカル・セクションの結果を使用して第２のスレッドが第２のスレッドのクリティカル・セクションを実施することに結果が等しいか、又はその逆に、第１のスレッドが第１のスレッドにおけるシェアされたリソースの処理のために第２のスレッドにおけるクリティカル・セクションの結果を使用するような結果を伴う場合に、相互排他が満たされ得る。第１のスレッド及び第２のスレッドの両方のクリティカル・セクションが並列に処理されるが、１つのスレッドにおけるクリティカル・セクションが他のスレッドにおけるクリティカル・セクションにより結果的にもたらされるシェアされたリソースの更新された値を考慮しない場合の帰結は、相互排他に違反し得る。
【０００４】
スレッド間の相互排他を維持するための１つの技術は、少なくとも１つの対象リソースに対する排他アクセスを制御するためにロックを使用することであり得る。例えば、あるスレッドが特定のアドレス領域におけるデータにアクセスし始めたとき、そのスレッドが、ロックのオーナーシップをクレームするためにロック変数をセットし得、次に、ロック所有スレッドがロックのオーナーシップをもっている間に、ロック変数を確認する他のスレッドが、ロックが既にクレームされていることを特定し得、その結果、そのアドレス領域と相互作用するコードのセクションに入らない場合があり得る。コンフリクトが起こり得ないことを保証するロックのオーナーシップを各スレッドがもっていない限り、別のスレッドとのコンフリクトが発生し得るので、シェアされたリソースにアクセスするコードのセクションに各スレッドが入ることができないということを、各スレッドがデフォルト設定により仮定するという点で、このようなロック・ベースのアプローチは悲観的という見方がされ得る。しかし、多くの場合、ロック識別子は多くのリソース（例えばある範囲のアドレス）に対する排他アクセスを制御し得、したがって、あるスレッドがロック変数により保護されたリソースのセット内の特定のリソースにアクセスしている場合、別のスレッドが同じリソースに無条件にアクセスすることが保証されない。したがって、スレッドは、シェアされたリソースを使用するコードのクリティカル・セクションに入る前に、ロックが解放されることを不必要に待ち得るので、ロック・ベースのアプローチは、スレッド間のコンフリクトがまれである場合にパフォーマンスの低下につながり得る。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】「Ｓｏｍｅ  Ｅｆｆｉｃｉｅｎｔ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｉｍｕｌａｔｉｏｎ  Ｔｅｃｈｎｉｑｕｅｓ」、Ｒｏｂｅｒｔ  Ｂｅｄｉｃｈｅｋ、Ｗｉｎｔｅｒ  １９９０  ＵＳＥＮＩＸ  Ｃｏｎｆｅｒｅｎｃｅ、５３〜６３頁
【発明の概要】
【発明が解決しようとする課題】
【０００６】
シェアされたリソースにアクセスするスレッド間のコンフリクトを取り扱うための、より楽観的なアプローチはトランザクショナル・メモリ・サポートを使用することであり得る。データ処理システムは、処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートする回路を含み得る。本トランザクションは、トランザクションの開始をマーキングするトランザクション開始命令とトランザクションの終了をマーキングするトランザクション終了命令との間に実行されるスレッドの命令であり得る。トランザクション開始命令とトランザクション終了命令との間に、処理回路が介入的な命令を投機的に実行し、トランザクション終了命令への到達が発生するまで、それらの投機的に実行された命令の結果のコミットメントを防止し得る。トランザクション開始命令の実行の後の（しかしトランザクション終了命令への到達が発生する前の）停止イベントの発生は、トランザクションが停止されること、及び、投機的な結果が破棄されることを結果的にもたらし得る。トランザクションを停止する多くの理由が存在し得るが、１つの理由は、別のスレッドにより行われたメモリ・アクセスとの間で検出されたコンフリクトであり得る。したがって、このアプローチによると、各スレッドは、他のスレッドとのコンフリクトが発生しないと仮定して、コードのクリティカル・セクションを処理することを楽観的に開始し得、次に、コンフリクトが一切検出されずに、クリティカル・セクションの終了への到達が発生した場合、トランザクションの結果がコミットされ得る。コンフリクトがまれである場合、トランザクショナル・メモリ・サポートを使用することは、より多くのスレッドがそれらのコードのクリティカル・セクションを同時に処理することを可能にすることにより、（ロック・ベースのアプローチに比べて）パフォーマンスを改善し得る。
【課題を解決するための手段】
【０００７】
少なくともいくつかの実例は、
データ処理のスレッドを処理する処理回路と、
処理回路により処理されるスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ・サポート回路であって、トランザクションが、トランザクション開始命令とトランザクション終了命令との間に投機的に実行されるスレッドの命令を含み、命令に対して、処理回路が、トランザクション終了命令への到達が発生するまで投機的に実行された命令の結果のコミットメントを防止するように構成され、トランザクション・メモリ・サポート回路が、トランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つに対する別のスレッドからのコンフリクトするアクセスを検出したことに応答して、トランザクションの停止をトリガーするコンフリクト検出回路を備える、トランザクショナル・メモリ・サポート回路と、
を備え、ここで、
所与のアドレスを指定したロード排他命令に応答して、処理回路が、所与のアドレスに対して排他モニター標示をセットするように構成され、
所与のアドレスを指定したストア排他命令に応答して、処理回路が、所与のアドレスが排他モニター標示をもはやセットさせないとき、ストア排他失敗標示を返信するように構成され、
所与のトランザクション内において実行される、ロード対象アドレスを指定した所定のタイプのロード命令に応答して、処理回路が、ロード対象アドレスに対して以前にセットされた任意の排他モニター標示をクリアすることをトリガーするように構成され、
ロード排他命令に応答して、処理回路とトランザクショナル・メモリ・サポート回路とのうちの少なくとも１つが、ワーキング・アドレス・セットのうちの１つとして所与のアドレスが指定された対象であるトランザクションの停止をトリガーするように構成される、
装置を提供する。
【０００８】
少なくともいくつかの実例が、
所与のアドレスを指定したロード排他命令に応答して、所与のアドレスに対して排他モニター標示をセットすることと、
所与のアドレスを指定したストア排他命令に応答して、所与のアドレスが排他モニター標示をもはやセットさせないとき、ストア排他失敗標示を返信することと、
トランザクション内において実行されるロード対象アドレスを指定した所定のタイプのロード命令に応答して、ロード対象アドレスに対して以前にセットされた任意の排他モニター標示をクリアすることであって、トランザクションが、トランザクション開始命令とトランザクション終了命令との間に投機的に実行される所与のスレッドの命令を含み、命令に対して、トランザクション終了命令への到達が発生するまで、投機的に実行された命令の結果のコミットメントが防止され、トランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つに対する別のスレッドからのコンフリクトするアクセスを検出したことに応答して、トランザクションが停止される、クリアすることと、
ロード排他命令に応答して、ワーキング・アドレス・セットのうちの１つとして所与のアドレスが指定された対象であるトランザクションの停止をトリガーすることと、
を含む、データ処理方法を提供する。
【０００９】
少なくともいくつかの実例が、データ処理のスレッドの実行のための命令実行環境を提供するようにホスト・データ処理装置を制御するためのコンピュータ・プログラムであって、コンピュータ・プログラムが、
データ処理のスレッドを処理する処理プログラム論理部と、
処理プログラム論理部により処理されるスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ・プログラム論理部であって、トランザクションが、トランザクション開始命令とトランザクション終了命令との間に投機的に実行されるスレッドの命令を含み、命令に対して、処理プログラム論理部が、トランザクション終了命令への到達が発生するまで、投機的に実行された命令の結果のコミットメントを防止するように構成され、トランザクション・メモリ・プログラム論理部が、トランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つに対する別のスレッドからのコンフリクトするアクセスを検出したことに応答して、トランザクションの停止をトリガーするコンフリクト検出プログラム論理部を備える、トランザクショナル・メモリ・プログラム論理部と、
を備え、ここで、
所与のアドレスを指定したロード排他命令に応答して、処理プログラム論理部が、所与のアドレスに対して排他モニター標示をセットするように構成され、
所与のアドレスを指定したストア排他命令に応答して、処理プログラム論理部が、所与のアドレスが排他モニター標示をもはやセットさせないとき、ストア排他失敗標示を返信するように構成され、
所与のトランザクション内において実行されるロード対象アドレスを指定した所定のタイプのロード命令に応答して、処理プログラム論理部が、ロード対象アドレスに対して以前にセットされた任意の排他モニター標示をクリアすることをトリガーするように構成され、
ロード排他命令に応答して、処理プログラム論理部とトランザクショナル・メモリ・プログラム論理部とのうちの少なくとも１つが、ワーキング・アドレス・セットのうちの１つとして所与のアドレスが指定された対象であるトランザクションの停止をトリガーするように構成される、
コンピュータ・プログラムを提供する。
【００１０】
少なくともいくつかの実例が、
複数の処理要素とメッセージを交換する複数のインターフェースと、
複数の処理要素間のコヒーレンシーを管理するように構成された制御回路と、
を備え、ここで、
所与のアドレスに対する排他アクセスを追跡するための所与のアドレスに関連した排他モニター標示のセッティングを示す所与の処理要素からの排他モニター・セッティング・メッセージに応答して、制御回路が、少なくとも１つの他の処理要素に排他モニター・セッティング・メッセージをインターフェースが送信することをトリガーするように構成され、
第１のタイプの読み出し要求により指定された対象アドレスに関連した読み出しデータ値の返信を要求する、第１の処理要素から受信された所定のタイプの読み出し要求に応答して、制御回路が、対象アドレスに関連した任意の排他モニター標示のキャンセルをトリガーするように、少なくとも１つの他の処理要素に排他モニター・キャンセル・メッセージをインターフェースが送信することをトリガーするように構成された、
相互接続体を提供する。
【００１１】
本技術のさらなる態様、特徴、及び利点が、添付図面とともに読まれる以下の実例の説明から明らかとなる。
【図面の簡単な説明】
【００１２】
【図１】複数の処理要素と相互接続体とを含むデータ処理システムの実例を概略的に示す図である。
【図２】トランザクショナル・メモリ・サポート回路を備える処理要素の実例を示す図である。
【図３】トランザクショナル・メモリ・サポートを含むシステムにおいてトランザクションを処理する実例を示す図である。
【図４】ロックを使用した非トランザクショナル手法により図３のトランザクションに同等な演算を実行するための代替的なコード・シーケンスを示す図である。
【図５】ロード投機の存在下におけるロード／ストア排他命令とトランザクションとの間の相互作用がどのように相互排他のロスをもたらし得るかを示すコードの実例を示す図である。
【図６】ロード投機の存在下におけるロード／ストア排他命令とトランザクションとの間の相互作用がどのように相互排他のロスをもたらし得るかを示すコードの実例を示す図である。
【図７】ロード投機の存在下におけるロード／ストア排他命令とトランザクションとの間の相互作用がどのように相互排他のロスをもたらし得るかを示すコードの実例を示す図である。
【図８】ロード投機の存在下におけるロード／ストア排他命令とトランザクションとの間の相互作用がどのように相互排他のロスをもたらし得るかを示すコードの実例を示す図である。
【図９】ロード排他命令を取り扱う方法を示すフロー図である。
【図１０】ストア排他命令を取り扱う方法を示すフロー図である。
【図１１】ストア命令を取り扱う方法を示すフロー図である。
【図１２】トランザクション内において実行されるロード命令を取り扱う方法を示すフロー図である。
【図１３】相互接続体によりサポートされたコヒーレンシー・メッセージの実例を示す図である。
【図１４】相互接続体によりサポートされたコヒーレンシー・メッセージの実例を示す図である。
【図１５】相互接続体によりサポートされたコヒーレンシー・メッセージの実例を示す図である。
【図１６】使用され得るシミュレーターの実施態様を示す図である。
【発明を実施するための形態】
【００１３】
いくつかの特定の実例が以下で開示される。特許請求の範囲がこれらの特定の実例に限定されないことが理解される。
【００１４】
処理回路は、処理回路により処理されるスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ・サポート回路を含み得る。トランザクションは、トランザクション開始命令とトランザクション終了命令との間に投機的に実行されるスレッドの命令を含む。処理回路は、トランザクション終了命令への到達が発生するまで、投機的に実行された命令の結果のコミットメントを防止し得る。トランザクション・メモリ・サポート回路は、トランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つに対する別のスレッドからのコンフリクトするアクセスを検出したことに応答してトランザクションの停止をトリガーするコンフリクト検出回路を含み得る。
【００１５】
トランザクショナル・メモリ・サポート回路は、トランザクションが停止される必要がある場合に投機的な結果がアンワインドされ得るように、トランザクション内における命令の投機的な実行を提供するので、トランザクションを実行する２つのスレッド間のコンフリクトを避けるためにロック変数を使用する必要がない。しかし、非トランザクション・ベースのアプローチにおいて実行されるいくつかのスレッドも存在し得る。例えばこのような非トランザクショナル・スレッドは、（トランザクション開始／終了命令を全く含まない）トランザクションの使用を伴わずに元々記述又はコンパイルされているコードのセクションを実行するスレッドであり得る。代替的に、非トランザクショナル・スレッドは、以前はトランザクション・ベース・モードにより命令を処理していたが、これに対して、トランザクションが（例えば他のスレッドとのコンフリクトに起因して）高頻度の停止イベントに直面し、そのように処理することが、現在は非トランザクション・ベース・モードにスイッチングされているスレッドを含み得る。簡潔にするために、「非トランザクショナル・スレッド」という用語は、トランザクションを全く使用しないスレッド、又は、トランザクションを使用して実行しようとする特定の数の試行が失敗した場合に選択されたフォールバック・パスを現在実行しているトランザクショナル・スレッドを表すように以下で使用される。
【００１６】
このような非トランザクショナル・スレッドが少なくとも１つの対象リソースに対する排他アクセスを必要とする場合、多くの場合、ロック変数が、少なくとも１つの対象リソースに対する排他アクセスを制御するために使用され得る。直感に反して、任意の非トランザクショナル・スレッドに対する正しい結果を確実なものとするために、トランザクショナル・スレッドは、非トランザクショナル・スレッドがロックを保持している間におけるシェアされたリソースに対する書き込みを伴うトランザクションをコミットすることを防止されなければならないので、トランザクショナル・スレッドは、（フォールバック・コード・パスにおいてだけでなく）トランザクション・ベースのコード・パス内において依然としてロック変数を確認する必要があり得る。したがって、多くの場合、トランザクショナル・モードにおいて実行されるスレッドのトランザクション内においてさえ、トランザクションは、任意の他のスレッドがリソースに対する排他アクセスを保持か否かを判定するためにロック変数を確認するための、及び、ロックが別のスレッドにより現在保持されている場合、後続の演算を保留するための、トランザクションのコミットメントを防止するための、又は、トランザクションを停止するための命令を依然として含み得る。
【００１７】
ロックを確認及び獲得する非トランザクショナル・スレッドのための一手法は、ロード排他及びストア排他命令を使用することであり得る。ロード排他命令が所与のアドレスを指定して実行されたとき、処理回路は、所与のアドレスに対して排他モニター標示をセットし得る。ロード排他命令は、所与のアドレスに対応した記憶位置から読み出された値をさらに返信し得る。所与のアドレスを指定したストア排他命令が実行された場合、処理回路は、所与のアドレスが排他モニター標示をもはやセットさせないとき、ストア排他失敗標示を返信し得る。その一方で、ストア排他命令を実行する時点において排他モニター標示が依然としてセットされる場合、ストア演算が所与のアドレスに更新された値を書き込むように実施され得、ストア排他成功標示が返信され得る。例えば別のスレッドがストア演算を実行して所与のアドレスに関連したデータ値を更新すること、又は、別のスレッドが所与のアドレスを指定した別のロード排他命令を実行することといった、様々なイベントが、以前にセットされた排他モニター標示がクリアされることをトリガーし得る。以前にセットされた排他モニター標示のクリアを必要とするイベントの追跡は、これらのイベントを確認するためのプログラム・コードにおいて実行される明示的な命令を必要とせずにデータ処理システムのマイクロ・アーキテクチャにより実行され得る。したがって、非トランザクショナル・スレッドは、ロック変数を読み出すように、及び排他モニターをセットするようにロード排他命令を使用し得、次に、後続のストア排他命令がロック変数に更新された値を書き込むことによりロックをクレームしようと試行し得るが、この場合、排他モニターがもはやセットされないものであり得るので、別のスレッドがその間に既にロックをクレームしていた場合、失敗し得る。排他モニター標示を使用したロード及びストア排他命令に対するサポートは、スレッド間の相互排他を遂行することを簡略化し得る。
【００１８】
したがって、いくつかのスレッドは、何らかのリソースの相互排他を遂行して、そのリソースが別のスレッドからの干渉を伴わずにアトミックに使用され得るように現在のスレッドのためにそのリソースを確保するために、ロード／ストア排他命令により使用される排他モニター標示を使用し得る。他のスレッドは、スレッド間のこのような相互排他を遂行するためにトランザクショナル・メモリを使用し得る。トランザクショナル・スレッドと非トランザクショナル・スレッドとの間の正しい相互作用を確実なものとするために、トランザクショナル・スレッドは、非トランザクショナル・スレッドにおけるロード／ストア排他命令によりアクセスされたロック変数を確認するための命令を含み得る。
【００１９】
しかし、本発明者らは、いくつかのシナリオにおいて、ロック変数を確認し、別のスレッドが既にロックを保持している場合に、シェアされたリソースに対する書き込みがコミットされることを防止するようにトランザクションがアレンジされている場合でも、これは、場合によっては、相互排他を遂行するためにロード及びストア排他命令を使用するスレッドに対して相互排他のロスを結果的にもたらし得ることを認識した。これは、いくつかのマイクロ・アーキテクチャが、そのロードが実際に要求されたか否かが知られる前に、ロード命令の投機的な実行をサポートし得ることが理由である。したがって、いくつかの場合において、処理回路のマイクロ・アーキテクチャは、より以前のストア排他命令が成功のうちに履行されたか否かを確認する命令より早く、非トランザクショナル・スレッドの後続のロード命令をプルし得る。すべてのスレッドが相互排他を遂行するためにロード／ストア排他命令を使用する非トランザクショナル・スレッドである場合、これは問題にならず、その理由は、最終的にストア排他命令が失敗したと判定された場合、既に投機的に実行された後続のロード命令が不正確に実行されたと判定され、そのロードの任意の結果が破棄され得るからである。
【００２０】
しかし、相互排他を遂行するためにトランザクションを使用して実行される他のスレッドも存在する場合、順番によらずに投機的に実行されるより若いロードと、ロックをセットする、より古いストア排他命令との間の期間内に、トランザクションが開始及び終了し得ることが起こり得る。このイベントでは、トランザクションが実行されたとき、ロックが非トランザクショナル・スレッドによりまだクレームされていないので、トランザクションが非トランザクショナル・スレッドのアクションを検出せず、さらに、トランザクショナル・スレッドがロック・ベースのフォールバック・コード・パスに頼らない限り、トランザクショナル・スレッド自体は典型的にはロックをクレームしないので、非トランザクショナル・スレッドはトランザクショナル・スレッドを検出しないという理由から、相互排他が失われ得ることが起こり得る。したがって、より若いロードの投機的な実行がコミットされることが可能とされ、トランザクションにより提供される更新された値ではなく、トランザクションが実行される前に存在していた、シェアされたリソースの古くなった値を非トランザクショナル・スレッドが使用することをもたらし得る。したがって、トランザクションの効果が事実上、失われ得、相互排他の違反が存在し得る。
【００２１】
この問題を軽減する１つの考えられる手法は、非トランザクショナル・スレッドに関連したコード内に投機バリア命令を含めることであり得る。投機バリア命令は、バリアより前の、より以前の命令のすべてが履行されるまで、処理回路のマイクロ・アーキテクチャがバリア命令の後のどの命令も実行することを可能にされないことを要求し得る。ロックをクレームするためのストア排他命令の後に、及び、コードのクリティカル・セクションに関連したシェアされたデータをロードする後続のロード命令の前にバリアを含むことにより、これがストア排他命令より早い後続のロードの投機的なホイスティングを防止し、したがって、コードのクリティカル・セクションに関連した任意の値が読み出される前にストア排他命令の結果が知られる。これは、トランザクショナル・スレッドが同じシェアされたリソースを使用するトランザクションを開始し、ストア排他命令が解決される前にトランザクションが履行される場合でも、非トランザクショナル・スレッドの後続のロードが、トランザクションが実行される前に存在していた値ではなくトランザクションの履行により結果的にもたらされる値をロードして、相互排他を維持することを意味する。
【００２２】
しかし、このようなバリアを含むことに付随する問題は、トランザクショナル・スレッドとのコンフリクトが存在しない場合、後のロードがより早いタイミングにおいて投機的に実行されることが防止され得、これが不必要にメモリへのアクセスを遅延させることによりパフォーマンスを下げ得るという理由により、このようなバリアを含むことが非トランザクショナル・スレッドのパフォーマンスを下げ得ることである。さらに、このような追加的なバリア命令を含むようにコードを書き換えることは、比較的大きなソフトウェアの開発及び配布のオーバーヘッドを結果的にもたらし得る。例えば、相互排他を遂行するためにロード及びストア排他命令を使用して記述された、トランザクショナル・メモリをサポートしていないシステムのために記述された従来のコードは、トランザクショナル・メモリをサポートするシステムにおいてもはや安全に実行し得ず、したがって、このようなコードはバリアを含むように書き換えられる対象となることが必要であり、これは望ましくないものであり得る。
【００２３】
投機バリアを必要とすることを避ける手法は、ロード対象アドレスを指定した所与のトランザクションにおいて実行されたときに、ロード排他命令に応答してロード対象アドレスに対して以前にセットされた任意の排他モニター標示をクリアすることをトリガーするように処理回路をトリガーする所定のタイプのロード命令を提供することである。ロード／ストア排他を実装した比較されるシステムでは、ロードが排他モニタリング標示に関連したアドレスにおけるデータの値を変えることは想定されないので、排他モニター標示がセットされた対象であるアドレスに対するロードは典型的には排他モニターのクリアをもたらさず、したがって、排他モニターにより追跡されるアドレスへのアクセスの排他性を乱すリスクを抱えるとは考えられない。しかし、所定のタイプのロードがトランザクション内において実行されたとき、排他モニター標示をクリアすることにより、これは、非トランザクショナル・スレッドにおいてロックをクレームするためにストア排他命令が実行される前に、トランザクションが実行される場合でも、非トランザクショナル・スレッドがトランザクションの介入的なアクションを検出し、（クリティカル・セクションからのロードが既に投機的に実行されている場合でも、シェアされたリソースの古くなった値を使用して非トランザクショナル・スレッドがクリティカル・セクションを進めることを、ストア排他命令の結果として得られる失敗が防止するので）相互排他のロスを防止し得ることを意味する。
【００２４】
さらに、ロード排他命令に応答して、処理回路及び／又はトランザクショナル・メモリ・サポート回路は、ロード排他命令により指定された所与のアドレスがトランザクションに関連したワーキング・アドレス・セットのうちの１つとして指定される対象のトランザクションの停止をトリガーし得る。これは、ロード排他命令が非トランザクショナル・スレッドにおいて実行される前にトランザクションが開始するように、及び、トランザクショナル・スレッドがシェアされた変数を更新する前にシェアされた変数のロードが投機的に実施されることを結果的にもたらし得る非トランザクショナル・スレッドにおいてロード投機が実施されるように、トランザクショナル・スレッドと非トランザクショナル・スレッドとの間の相対的なタイミングがなされている場合でも、トランザクションを停止することにより、トランザクショナル・スレッドに対するシェアされた変数の更新が行われることが防止されて相互排他を確実なものとすることを意味する。非トランザクショナル・スレッドにおいてクリティカル・セクションにより行われた更新が既に行われた後、トランザクションが後で再試行され得る。
【００２５】
したがって、非トランザクショナル・スレッドにおけるロード／ストア排他命令の実行とトランザクショナル・スレッドにおけるトランザクションとの間の相対的なタイミングにかかわらず、いくつかのロード命令が順番によらずに投機的に実行された場合でも、相互排他が遂行され得る。これは、追加的なバリアを含むように非トランザクショナル・コードが書き換えられる対象となることを必要とせずに、トランザクションを使用した排他モニター標示及びスレッドに依存したスレッド間の安全な連係動作を可能にする。
【００２６】
本出願において説明される技術は、１つの処理要素を含む装置において使用され得る。例えば、１つの処理要素は、タイム・シェア・リング手法によりデータ処理の複数のスレッドを処理し得、又は、同時に複数のスレッドに対するアーキテクチャ状態を追跡するパーティションに区切られたレジスタ・セットを使用して、複数のスレッドからの命令が処理パイプラインに同時に存在する同時マルチ・スレッド（ＳＭＴ：ｓｉｍｕｌｔａｎｅｏｕｓ  ｍｕｌｔｉ−ｔｈｒｅａｄｉｎｇ）を使用し得る。
【００２７】
しかし、この技術は、処理回路が処理の複数のスレッドを並列に実行し得る複数の処理要素（例えばプロセッサ・コア、ＣＰＵ、又はＧＰＵ）を含むシステムにおいて特に有用である。複数の処理要素を含むシステムにおいて、１つの処理要素が、非トランザクショナル・スレッドを実行する別の処理要素と並列にトランザクショナル・スレッドを実行し得ることが起こり得る。この場合、非トランザクショナル・スレッド内における投機によりもたらされる上述のタイプのコンフリクト、及び、相互排他のロスとなり得るものは可能性が高いものであり得、上述の技術により軽減され得る。
【００２８】
したがって、処理回路が２つ以上の処理要素を含むシステムでは、ロード排他命令が所与の処理要素において実行されている場合、所与の処理要素が、少なくとも１つの他の処理要素へのメッセージの送信をトリガーし得、メッセージが、排他モニター標示がロード排他命令により指定された所与のアドレスに対してセットされたことを示す。典型的には排他モニターをサポートするシステムでは、排他モニター標示のクリアを要求するイベントが、マルチ・プロセッサ・システム内における他の処理要素にブロードキャストされ得る一方で、他の処理要素に排他モニター標示のセッティングをブロードキャストすることは普通でない。しかし、少なくとも１つの他の処理要素に、排他モニター標示がセットされたことを示すメッセージを送信することにより、これは、そのワーキング・アドレス・セットに所与のアドレスを含む別の処理要素において実行されているトランザクションが上述のように停止されることを可能にする。
【００２９】
いくつかの実施態様において、排他モニタリング標示がセットされたことを示すメッセージが、ロード排他命令を実行した所与の処理要素以外のすべての他の処理要素にブロードキャストされ得る。しかし、他の場合において他の処理要素のすべてにメッセージを送信することは不要であり得る。例えばいくつかの処理要素は、トランザクショナル・メモリ・サポート回路をもたないことがあり得、したがって、トランザクションを実行することができず、この場合、このような処理要素にメッセージを送る必要がない。さらに、いくつかの場合において、様々な処理要素を接続する相互接続体は、スヌープ・フィルタ、又は、どの処理要素がトランザクションを実行しているか、又は、どのアドレスが処理要素によりキャッシュ／アクセスされたかを追跡する他の論理部を含み得、したがって、所与のアドレスが、所与の処理要素におけるトランザクションに対して追跡されるワーキング・アドレス・セット内にあり得るか否かを、相互接続体内に保持されたデータから特定することが可能であり得、この場合、現在どのトランザクションも処理していない処理要素、又は、所与のアドレスを含まないワーキング・アドレス・セットを含むことが相互接続体における論理部から特定され得る処理要素に対して、排他モニター・キャンセル・メッセージが省略され得る。
【００３０】
同様に、所定のタイプのロード・トランザクションが所与の処理要素において実行されているとき、所与の処理要素は、非トランザクショナル・スレッドのために実施されるロード投機の存在下であっても、相互排他が処理要素にわたって維持されることを確実なものとするために、ロード対象アドレスに対して少なくとも１つの他の処理要素により以前にセットされた任意の排他モニター標示がクリアされなければならないことを示すように、少なくとも１つの他の処理要素へのメッセージの送信をトリガーし得る。
【００３１】
所与のトランザクション内において実行される所定のタイプのロード命令に応答して、処理回路は、所与のトランザクションのためのワーキング・アドレス・セットにロード対象アドレスを追加し得る。これは、非トランザクショナル・スレッドが後から同じアドレスに対する排他モニターをセットするようにロード排他命令を実行しようと試みた場合、トランザクションが相互排他を維持するために停止されることを意味する。
【００３２】
いくつかの実例において、ワーキング・アドレス・セットの追跡は、（トランザクションにより読み出されるアドレスを表す）読み出しアドレス・セット、及び、（トランザクションにより書き込まれる対象のアドレスを表す）書き込みアドレス・セットの独立した追跡を含み得る。例えば、読み出し／書き込みアドレス・セットは、関連するキャッシュ・ラインがそれぞれ所与のトランザクションに対する読み出しセット又は書き込みセットの一部であるか否かを示すキャッシュにフラグをセットすることにより追跡され得る。読み出し及び書き込みセットの独立した追跡を伴う実施態様では、所定のタイプのロードが、読み出しアドレス・セットにロード対象アドレスを追加することをトリガーし得、ロード排他命令の実行は、トランザクションであって、そのトランザクションに対するロード排他命令により指定された所与のアドレスが、そのトランザクションに対して追跡される読み出しセット内にある、そのトランザクションを停止することをトリガーし得る。
【００３３】
所定のタイプのロード命令の実行は、その書き込みセット内において指定されたロード対象アドレスを含む他のトランザクションの停止をさらにもたらし得る。その読み出しセットにおいて指定されたロード対象アドレスを含む他のトランザクションは、所定のタイプのロード命令の実行の後、停止していない状態を継続し得る。実際には、所定のタイプのロード命令に対する想定される使用ケースは、非トランザクショナル・スレッドにより使用されるロック変数を読み出すことであり得、したがって、トランザクショナル・スレッドが（非トランザクショナル・フォールバック・パスにフォールバックしない限り）ロック変数に書き込む必要がある可能性は低く、したがって、所定のタイプのロード命令のアドレスがトランザクションに対して追跡される書き込みセット内にある可能性は低い。したがって、複数のトランザクションの各々が同じロック変数を読み出す場合、ロック変数の読み出しが別のトランザクションの停止をもたらすことなく、複数のトランザクションが並列に処理され得ることにより、ロック変数の確認の結果としてトランザクションの不必要なシリアライゼーションが導入されることなく、トランザクションの並列処理を可能にする。
【００３４】
所定のタイプのロード命令に加えて、処理回路は、所与のトランザクション内において実行されたときに、ロード対象アドレスに対して以前にセットされた任意の排他モニター標示を処理回路が保有することをトリガーする第２のタイプのロード命令をさらにサポートし得る。異なるタイプのロード命令を区別することにより、以前にセットされた排他モニターがクリアされることをトランザクションにおける各ロードがもたらすことをこれが防止し、このことがストア排他命令のより高頻度の失敗をもたらすので、このことがパフォーマンスの低下をもたらし得る。上述のようにトランザクショナル・スレッドと非トランザクショナル・スレッドとを連係動作させるとき、ロード投機によりもたらされる排他のロスとなり得るものをガードするために、ロードに応答して排他モニターをクリアすることがロック変数のロードに対して有用であり得る一方で、（読み出しは排他モニターに関連したアドレスにおける記憶されたデータ値を変えないので）値に対する読み出し自体は排他モニターにより示されるアクセスの排他性を妨害するには十分ではないので、他のロード演算に対して排他モニターを保有することが好ましい場合があり得る。例えば、所定のタイプのロード命令が、シェアされたリソースへのアクセスを支配するために他の非トランザクショナル・スレッドにより使用されるロック変数にアクセスするトランザクション内におけるコードの一部のために使用され得る一方で、第２のタイプのロード命令は、シェアされたリソースから関心のあるデータを実際にロードするトランザクション内におけるロードのために、アトミックに実行される必要があるコードのクリティカル・セクションにおいて使用され得る。
【００３５】
ロード及びストア排他トランザクションを実行する処理回路は、対象アドレスへの排他アクセスを制御するためのロック変数が所与のスレッドにより成功のうちにクレームされたか否かを処理回路が解決する前に、対象アドレスからデータ値をロードするためにロード命令を投機的に実行する所与のスレッドをサポートし得る。言い換えると、ロード投機は、ストア排他命令が成功のうちに実行をしたか否かを査定する条件命令の解決前にロード命令が実行されることを結果的にもたらし得る。このようなロード投機は、パフォーマンスを改善し得る。上述のアプローチは、このような投機が実施された場合でも、非トランザクショナル・スレッド及びトランザクショナル・スレッドが、相互排他を依然として達成し得ることを確実にし得る。
【００３６】
トランザクショナル・メモリ・サポート回路は、多くの形態を含み得る。様々な停止イベントは、そのトランザクション終了命令への到達が発生する前に、コンフリクト検出回路がトランザクションの停止をトリガーすることをもたらし得る。１つの実例は、別のスレッドから、第１のスレッドのトランザクションが停止されることをトリガーし得る第１のスレッドのトランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つへのコンフリクトするアクセスを、コンフリクト検出回路が検出したときであり得る。トランザクションが停止されることをもたらし得る他のイベントは、トランザクション内において実行されることが可能にされないあるタイプの命令の実行、例外イベント若しくは妨害の発生、又は、上述のようにワーキング・アドレス・セット内におけるアドレスを指定したロード排他命令の実行を含み得る。
【００３７】
トランザクショナル・メモリ・サポート回路は、コンフリクト検出回路に加えて、他の要素も含み得る。例えば、トランザクショナル・メモリ・サポート回路は、少なくとも１つのトランザクションに対する投機的に実行された命令の結果を記憶する投機的結果記憶回路、及び／又は、トランザクションが停止された場合にリストアされ得る、トランザクションのトランザクション開始命令に応答してキャプチャされたアーキテクチャ状態を記憶するリストア状態記憶回路を含み得る。例えば、投機的結果記憶回路は、トランザクション終了命令に応答してトランザクションがコミットされるまで、ストア命令の結果をバッファリングし得るので、トランザクションがコミットされ得ることが知られるまで、トランザクション内における投機的に実行されたストア命令がメモリ・システムを汚染しない。リストア状態記憶回路は、例えば、トランザクションが停止されたとき、状態が実行のそのより以前のポイントに巻き戻される必要がある場合に備えて、トランザクションの開始時に存在する状態のチェック・ポイントを保有するためにレジスタ・バンク内にレジスタを含み得る。代替的に、リストア状態は、現在のアーキテクチャ状態を記憶するレジスタと同じレジスタ・ファイル内における古いチェック・ポイント処理されたアーキテクチャ状態を追跡するために、レジスタ・リネーミングを使用して維持され得る。
【００３８】
トランザクションを停止する別の可能性のある理由は、トランザクショナル・メモリ・サポート回路がリソースの不足状態にある結果、もはやトランザクションがコンフリクトを伴わずに正しく進むことを保証することができない場合であり得る。例えば、投機的結果記憶回路に記憶される投機的な結果の数が、提供された記憶装置内において利用可能な容量を上回った場合、トランザクションが停止され得る。
【００３９】
トランザクションを停止したとき、トランザクションを再度実行すること、又は、（例えばロック及びロード／ストア排他命令を使用して）代替的に非トランザクショナル・フォールバック・パスを使用することを試みるか否かを判定することはソフトウェア次第であり得る。しかし、処理回路のマイクロ・アーキテクチャは、トランザクションの停止の可能性のある理由を示すための手がかりを提供し得、この手がかりは（例えば、停止の原因が、任意の将来の試みが失敗する可能性があるものである場合）トランザクションを再度実行すること、又は、フォールバック・パスを使用することを試みる価値があるか否かを判定するためにソフトウェアにより使用され得る。
【００４０】
対応するコンピュータ・プログラムが、データ処理のスレッドの実行のための命令実行環境を提供するようにホスト・データ処理装置を制御するために提供され得、コンピュータ・プログラムは、データ処理のスレッドを処理する処理プログラム論理部、及び、（ハードウェアの実施例に対する上述のトランザクションに対するサポートと同様の手法により）処理プログラム論理部により処理されるスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ・プログラム論理部を備える。トランザクショナル・メモリ・プログラム論理部は、トランザクションに対して追跡されるワーキング・アドレス・セットのうちの１つに対する別のスレッドからのコンフリクトするアクセスが検出されたとき、トランザクションが停止されることをトリガーするためのコンフリクト検出プログラム論理部を備え得る。コンピュータ・プログラムのプログラム論理部は、上述の対応する処理回路及びトランザクショナル・メモリ・サポート回路と同様の手法により、ロード／ストア排他命令の実行に、及び、所定のロード命令に応答し得る。
【００４１】
したがって、コンピュータ・プログラムを実行するホスト・コンピュータにおいてこれらの特徴を提供するどのような実際のハードウェアも存在しない場合があり得るとしても、上述の特徴をもつ実際のハードウェア装置により提供されるものと同様の命令環境を上述のコンピュータ・プログラムを実行するソフトウェアに提示するコンピュータ・プログラムが提供され得る。代替的に、例えばシミュレーター又は仮想マシンであり得るコンピュータ・プログラムは、トランザクショナル・メモリ・サポートを含む装置において達成される結果に適合する手法により、トランザクショナル・メモリ・サポートを含む装置における実行を対象としたコードを一般的なホスト・データ処理装置が実行することを可能にするプログラム論理部（例えば命令セット又はデータ構造体）を提供することにより、ハードウェア・アーキテクチャの機能をエミュレートし得る。
【００４２】
それぞれの処理要素とメッセージを交換する多くのインターフェース、及び、処理要素間のコヒーレンシーを管理する制御回路を含む相互接続体がさらに提供され得る。所与のアドレスに対する排他アクセスを追跡するための所与のアドレスに関連した排他モニター標示のセッティングを示す所与の処理要素からの排他モニター・セッティング・メッセージに応答して、制御回路は、少なくとも１つの他の処理要素に排他モニター・セッティング・メッセージをインターフェースが送信することをトリガーし得る。第１のタイプの読み出し要求により指定された対象アドレスに関連した読み出しデータ値の返信を要求する第１の処理要素から受信された所定のタイプの読み出し要求に応答して、制御回路は、対象アドレスに関連した任意の排他モニター標示のキャンセルをトリガーするように、少なくとも１つの他の処理要素に排他モニター・キャンセル・メッセージをインターフェースが送信することをトリガーし得る。
【００４３】
したがって、従来の相互接続体は通常は他の処理要素に排他モニター標示のセッティングをブロードキャストしないとともに、そうすることにより、排他モニター標示をセットする非トランザクショナル・スレッドが順番によらずにシェアされたリソースに対するロードを実行するロード投機を使用する場合でも、その読み出しセットにおいて所与のアドレスを使用してトランザクションを実行する他の処理要素がトランザクションを停止して相互排他を確実なものとすることを、これが可能にする。さらに、所与の処理要素において実行される所定のロード命令は、所与の処理要素が第１のタイプの読み出し要求を発行することをトリガーし得、このことが、相互接続体が他の処理要素に排他モニター・キャンセル・メッセージを転送することをもたらし、同様に、非トランザクショナル・スレッドとトランザクショナル・スレッドとの間の相互排他を維持することに役立つ。
【００４４】
図１は、データ処理の多くのスレッドの実行をサポートする処理回路４を含むデータ処理システム２の実例を概略的に示す。この実例において、処理回路４は、互いに並列な処理のそれぞれのスレッドの実行を各々が実施し得る多くの別々の処理要素６を含む。個々の処理要素６の各々は、例えば、中央処理ユニット（ＣＰＵ：ｃｅｎｔｒａｌ  ｐｒｏｃｅｓｓｉｎｇ  ｕｎｉｔ）、グラフィックス処理ユニット（ＧＰＵ：ｇｒａｐｈｉｃｓ  ｐｒｏｃｅｓｓｉｎｇ  ｕｎｉｔ）、又は、命令を実行可能な任意の他のプログラム可能ユニットであってよい。各処理要素は、メモリ・システム２０、１６からのデータをキャッシュするための少なくとも１つのキャッシュ８を含み得、キャッシュ８におけるデータにアクセスすることは、メモリ・システムからデータにアクセスするより小さいレイテンシしか必要としない。
【００４５】
処理要素６間の通信を管理するように、及び、処理要素６のそれぞれのキャッシュ８におけるデータ間のコヒーレンシーを管理するように、相互接続体１０が提供される。相互接続体１０は、個々の処理要素６と通信するための多くのインターフェース１２、並びにメモリ・デバイス１６、例えばＤＲＡＭ又は不揮発性メモリと通信するためのメモリ・デバイス・インターフェース１４を含む。相互接続体１０は、処理要素６によるデータに対する読み出し又は書き込み要求を追跡するための、及び、コヒーレンシーを維持するための要求を伴って応答するためのコヒーレンシー制御ユニット１８を含み、例えば、コヒーレンシー制御回路１８は、他の処理要素のローカル・キャッシュ８にキャッシュされたデータの状態についてクエリを出す、及び／又は、対応するアドレスに対するキャッシュされたデータの返信及び／又は無効化を要求する、他の処理要素に対するスヌープ・メッセージを送ることにより、読み出し又は書き込み要求に応答するように相互接続体１０を制御し得る。例えば、ある処理要素が相互接続体に対するさらなる要求を発行することを伴わずに読み出されたデータが書き込まれ得るユニークな状態において、そのキャッシュにデータを読み込もうと試みるとき、コヒーレンシー制御装置１８は、他の処理要素がそのデータを保持するか否か、及び、必要な場合に他の処理要素８からそれを無効化するか否かを確認し得る。いくつかの場合において、スヌープ・フィルタ及び／又はシステム・キャッシュ２０は、相互接続体内に提供され得る。システム・キャッシュが提供される場合、わざわざメモリからフェッチされる必要がある（が、データが処理要素８のローカル・キャッシュにある場合より長いレイテンシを伴う）場合より高速なアクセスのために、システム・キャッシュがメモリ１６からのデータをキャッシュし得る。スヌープ・フィルタは、各処理要素のキャッシュ８にどのデータがキャッシュされるかを部分的に、又は完全に追跡し得るので、送る必要のあるコヒーレンシー・メッセージの数は少なくされ得る（例えば、要求されたデータを処理要素が保持しないことが知られている場合、所与の処理要素に対してスヌープ要求が省略され得る）。いくつかの場合において、システム・キャッシュ及びスヌープ・フィルタは、共通記憶構造物を使用して（例えば、データが各処理要素のキャッシュ８にもキャッシュされているか否かを示すシステム・キャッシュ２０の各キャッシュ・ラインに関連した追跡ビットにより表されたスヌープ・フィルタを使用して）実装され得る。任意の知られたコヒーレンシー・プロトコルが、処理要素間のコヒーレンシーを管理するために相互接続体１０により使用され得る。例えば、Ｃａｍｂｒｉｄｇｅ、ＵＫのＡｒｍ（登録商標）Ｌｉｍｉｔｅｄにより提供されるＡＭＢＡ（登録商標）ＡＣＥ又はＣＨＩプロトコルが使用され得る。
【００４６】
図２は、処理要素６のうちの１つの一部の実例をより詳細に示す。処理要素６は、データ処理演算を行う命令を実行するための処理論理部１０４を含む。例えば、処理論理部１０４は、例えば、算術又は理論演算、例えば加算、乗算、ＡＮＤ、ＯＲなどを行うための算術／論理ユニット（ＡＬＵ：ａｒｉｔｈｍｅｔｉｃ／ｌｏｇｉｃ  ｕｎｉｔ）、浮動小数点オペランドに対して演算を実施するための浮動小数点ユニット、又は、複数のデータ要素を含むベクトル・オペランドに対するベクトル処理を行うためのベクトル処理ユニットといった、様々なタイプの処理演算を実行するための実行ユニットを含み得る。アーキテクチャ・レジスタ１０６のセットが、処理論理部１０４により実行される命令に対するオペランドを記憶するために、及び、実行される命令の結果を記憶するために提供される。命令デコーダ１０８は、命令キャッシュ１１０からフェッチされた命令をデコードして、関連する演算を実施するように処理論理部１０４、又はデータ処理装置１０２の他の要素を制御するための制御信号を生成する。レベル１キャッシュ１１４若しくはレベル２キャッシュ１１６又は主メモリ１６からのデータ値をアーキテクチャ・レジスタ１０６にロードする（命令デコーダ１０８によりデコードされたロード命令に応答した）ロード演算、及びアーキテクチャ・レジスタ１０６からのデータ値をキャッシュ１１４、１１６又は主メモリ１６に記憶させる（命令デコーダ１０８によりデコードされたストア命令に応答した）ストア演算を実施するための、ロード／ストア・ユニット１１２がさらに提供される。図１に示されるローカル・キャッシュ８は、図２のレベル１命令及びデータ・キャッシュ１１０、１１４又はレベル２キャッシュ１１６のうちの任意のものに対応し得ることに留意されたい。
【００４７】
本装置１０２はハードウェア・トランザクショナル・メモリ（ＨＴＭ：ｈａｒｄｗａｒｅ  ｔｒａｎｓａｃｔｉｏｎａｌ  ｍｅｍｏｒｙ）をサポートするための様々なリソース提供するトランザクショナル・メモリ・サポート回路１２０をさらに含む。トランザクショナル・メモリ・サポート回路１２０におけるＨＴＭリソースは、例えば、トランザクションの投機的な結果を記憶するための投機的結果記憶装置１２２、トランザクションによりアクセスされたアドレスを追跡するためのアドレス追跡回路１２４、コンフリクトが検出された場合にトランザクションが停止され得るように、トランザクションにより行われたデータ・アクセスと他のスレッドにより行われたデータ・アクセスとの間のコンフリクトを検出するためのコンフリクト検出回路１２６、及び、トランザクションの開始時にアーキテクチャ・レジスタ１０６からのアーキテクチャ状態データのスナップショットを記憶することにより、トランザクションが停止された場合に、この状態がトランザクションの投機的な結果を上書きしてリストアされ得るようにするためのリストア状態記憶回路１２８を含み得る。アドレス追跡回路１２４は、図２において独立したコンポーネントとして示されるが、いくつかの場合において、アドレス追跡回路１２４は、トランザクションにおいて所与のアドレスが読み出されたか又は書き込まれる対象となったかを追跡するレベル１キャッシュ１１４又はレベル２キャッシュ１１６の各キャッシュ・ラインにおけるメタデータを使用して実装され得る。いくつかの場合において、独立した読み出し及び書き込みアドレス・セットが、アドレス追跡回路１２４により所与のトランザクションに対して区別され得る。
【００４８】
さらに本リソースは、トランザクションのネスティングのレベルを追跡するネスティング深さ値を記憶するためのネスティング深さレジスタ１３２を含み得る。（第１のトランザクション開始命令の後だが第１のトランザクション開始命令に対応したトランザクション終了命令の前に、第２のトランザクション開始命令が行き着かれた場合）ネスト化されたトランザクションを規定することができることはプログラマー又はコンパイラにとって有用であり得る。これは、コードのクリティカル・セクションが、第１のトランザクション開始命令を越えてコードの一部内への分岐が存在する場合でもアトミックに処置されることを確実なものとするために有用であり得る。しかし、投機的結果記憶装置にアーキテクチャ状態の複数のチェック・ポイントをキャプチャする必要性をなくすために、いくつかのマイクロ・アーキテクチャは、ネスト化されたトランザクション・セットの「内側」トランザクションを効果的に無視し、まさに最初のトランザクション開始命令に応答してアーキテクチャ状態のチェック・ポイントのみをキャプチャし得る。いくつのトランザクション開始命令が行き着かれたかを追跡するためにネスティング深さレジスタ１３２がインクリメントされ得ることを除いて、トランザクション終了命令の前に発生した任意の後続のトランザクション開始命令が効果的に無視され得るので、トランザクション終了命令に行き着いたとき、どのトランザクション終了命令がネスト化されたトランザクション・セットの外側のトランザクションに関連しているかをマイクロ・アーキテクチャが追跡し得る。したがって、トランザクション終了命令に行き着いた場合、ネスティング深さが１つ又は複数であるとき、トランザクション終了命令が無視され、ネスティング深さが（トランザクションがネスト化されたセットの外側のトランザクションであることを示す）ゼロであるとき、トランザクションがコミットされ得る。
【００４９】
図２は、トランザクショナル・メモリ・サポート回路１２０を含む処理要素の実例を示す。いくつかの場合において、図１に示されるシステム２のいくつかの処理要素６が、このようなトランザクショナル・メモリ・サポート回路１２０を含み得る。しかし、すべての処理要素６がトランザクショナル・メモリ・サポート回路を含むことが必須というわけではない−トランザクションを実行することができないいくつかの処理要素が存在してよい。さらに、図２は、個々の処理要素６のマイクロ・アーキテクチャ内におけるトランザクショナル・メモリ・サポート回路１２０を示すが、これが必須というわけではない。いくつかの場合において、いくつかのトランザクショナル・メモリ・リソースは、処理要素間においてシェアされ得る。−例えば、複数の処理要素間における使用のためにシェアされ得る、リストア状態１２８をキャプチャするための又はアドレスを追跡１２４するための何らかの共通記憶装置が提供され得る。
【００５０】
図３は、トランザクショナル・メモリ・サポート回路１２０及び処理論理部１０４を使用して所与のスレッド内におけるトランザクションを実行することの実例を示す。トランザクションは、トランザクション開始命令（ｔｓｔａｒｔ）とトランザクション終了命令（ｔｃｏｍｍｉｔ）とにより囲まれたプログラム・コードのセクションである。図３に示されるように、トランザクション開始命令に応答して、アーキテクチャ・レジスタ１０６における現在のアーキテクチャ状態がリストア状態記憶回路１２８にキャプチャ及び記憶される（ネスト化されたトランザクションに対しては、ネスト化されたトランザクション・セットの外側のトランザクションのみが、アーキテクチャ状態のキャプチャをトリガーし得る）。処理論理部１０４は、ｔｓｔａｒｔ命令の後に後続の命令の投機的な実行を実施し始め、これらの命令が実行されるとき、それらの命令によりアクセスされたアドレスがアドレス追跡回路１２４により追跡され、コンフリクト検出回路１２６が、追跡されるアドレスと他のスレッドに応答してロード／ストア・ユニット１１２を使用して行われたアクセスのアドレスとの間におけるコンフリクトを検出する。トランザクション内における命令の少なくともいくつかの投機的な結果が、投機的結果記憶回路１２２内に記憶される。例えばキャッシュ又はメモリに記憶された値は、ストア命令ＳＴＲに応答して、トランザクションがペンディング状態に留まっている間、投機的結果記憶装置１２２に保持され得る。停止イベントがその間に発生することなくトランザクション終了命令（ｔｃｏｍｍｉｔ）への到達が発生した場合、トランザクション終了命令に応答して投機的な結果がコミットされる。トランザクションをコミットしたとき、そのスレッドに対して投機的結果記憶装置１２２に記憶された任意の結果が、データ・キャッシュ１１４又はメモリ１１６に書き込まれ得、トランザクション開始命令が行き着かれる前のポイントにアーキテクチャ状態を巻き戻すことがもはや必要とされないので、リストア状態１２８が破棄され、又は、上書きされることを許可され得る。
【００５１】
その一方で、停止イベントが発生した場合、例えば、別のスレッドがトランザクションにより既にアクセスされたアドレスにアクセスした場合、コンフリクト検出回路１２６によりコンフリクトが検出されたとき、トランザクションの停止がトリガーされ、及びリストア状態記憶装置１２８からのリストア状態が、アーキテクチャ・レジスタ１０６にリストアされる。停止イベントの他の原因として、例えば、トランザクション内において実行されることが可能にされない命令の実行、投機的な結果又は所与のトランザクションにより要求されたアドレスを取り扱うための投機的結果記憶装置１２２又はアドレス追跡回路１２４内における不十分なリソース、又は、トランザクション中に受ける妨害が挙げられ得る。
【００５２】
図３は、処理演算の特定のセットがトランザクション開始命令及びトランザクション終了命令を使用してトランザクショナル・モードにおいてどのように実施され得るかを示す。非トランザクショナル・スレッドに対するロックを管理する別の手法は、排他モニターを使用することであり得る。処理回路４は、ロード排他命令の実行とストア排他命令の実行との間にどの他の処理も所与のアドレスと相互作用していない限り、処理がコードの後続のセクションに進まないことを確実なものとするために使用され得るロード排他及びストア排他命令の使用をサポートし得る。ロード排他命令の実行に応答して、ロード排他命令を実行した処理要素６がロード排他命令の対象アドレスに関連した排他モニター標示のセッティングをトリガーする。図１に示されるように、この排他モニター標示は、処理要素自体内において提供されるローカル排他モニター３０内に、又は、相互接続体内に提供されるグローバル排他モニター３２内に保持され得る。例えば、ロード排他命令により指定されたアドレスが他の処理要素によりアクセスされないことを保証される非シェア可能アドレスである場合に、ローカル排他モニター３０が使用され得るのに対し、グローバル排他モニター３２は、複数の処理要素６によりアクセスされ得るシェア可能アドレスに対して使用され得る。いくつかの実施態様において、ローカル排他モニター３０とグローバル排他モニター３２との両方を提供することが必要とは限らない場合があり得、これらの機能は組み合わされ得る。
【００５３】
ロード排他命令の対象アドレスに対してセットされた排他モニター標示は、例えば、他のスレッド若しくは他の処理要素によりトリガーされた同じアドレスに対するストア演算、又は、別のスレッド若しくは別の処理要素による同じアドレスに対するさらなるロード排他命令の実行といった、その特定のアドレスに対する排他アクセスがもはや保証されることができないことを示し得るイベントを、ローカル排他モニター３０／グローバル排他モニター３２がモニターしなければならないことをローカル排他モニター３０／グローバル排他モニター３２が検出することを可能にする任意の標示であり得る。いくつかの実例において、アドレスのブロックごとにインデックス処理された記憶装置構造物が、そのブロックに対して排他モニターがセットされているか否かを示す、各ブロックに対してセットされたフラグを含み得る。しかし、実際には、排他モニターがセットされることを必要とし得る対象のアドレスの数は、比較的少ないものであり得、したがって、より効率的な実施態様は、排他モニター標示がセットされている対象の位置のアドレスを記憶する単に１つ又は複数のレジスタを提供するものであり得る。
【００５４】
相互接続体１０は、所与のアドレスに対する排他アクセスの保証がもはやないことを示し得るイベントを検出したとき、任意の排他モニターが関連するアドレスに対してセットされている場合、排他モニターがクリアされ得るように、各処理要素にこのようなイベントが発生したことを示すメッセージを送信し得る。排他標示がどのように管理されるかの正確な詳細は、特定のプロセッサの実施態様に対して選択された特定のマイクロ・アーキテクチャの一態様であり得る。したがって、概して、本アーキテクチャは、多くのイベントが排他モニターのクリアをトリガーしなければならないことを指定し得るが、これが相互接続体１０により通知される、又は、排他モニター論理部３０、３２内において追跡される正確な手法は様々であってよい。
【００５５】
ストア排他命令が所与の処理要素６により実行される場合、処理要素６は、ストア排他命令の要求されたアドレスに対して以前にセットされた排他モニター標示が依然としてセットされているか否かを確認し得、セットされている場合、ストア命令は、所与のメモリ・アドレスにデータを記憶することを成功のうちに実行し得、処理要素は、例えば記憶が正しく履行されたことを確かめるためにレジスタにフラグをセットするストア排他成功標示をさらに返信し得る。後続の条件命令は、次に、排他アクセスが要求される対象のリソースを使用する後続のコードを進めるか否かを判定するためにストア排他成功標示を確認し得る。したがって、ロック変数を提供するために使用されるアドレスを指定したロード及びストア排他ペアを実行することにより、これは、非トランザクショナル・スレッドにおけるコードの何らかの後続のセクションに対するアトミックなアクセスを保証する手法を提供し得る。排他モニター標示が既にクリアされている場合にストア排他命令が実行されるとき、ストア排他失敗標示が返信され、このことが、後続の条件命令がその条件コードに失敗することをもたらし得、より以前のリソースに対する排他アクセスが保証されることができない場合にコードのクリティカル・セクションが立ち入られないように、プログラム・フローがその条件命令を越えて進むことを防止する。
【００５６】
いくつかの場合において排他モニター論理部３０、３２は、排他モニター標示をセットさせるものとして同時に限られた数のアドレスを追跡するためのリソースを含むのみであり得る。例えば、いくつかの実施態様において、排他モニター標示は、排他モニター標示がセットされるとみなされる対象の１つのアドレスの標示を含むだけであり得、異なるアドレスを指定した別のロード排他命令が実行された場合、これは、より以前のロード排他命令により指定されたアドレスに対する任意の以前にセットされた標示をクリアし得る。
【００５７】
したがって、処理回路４により実行される処理のいくつかのスレッドが、何らかの範囲のアドレスに対して相互排他を遂行するために図３に示されるようにトランザクショナル・モードを使用し得る一方で、他のスレッドが、トランザクションを使用せずにアトミックなアクセスを遂行するためにロード及びストア排他命令を使用するロック・ベースのモードを使用し得る。例えば、図４は、コードのクリティカル・セクションの開始時にロックをセットし、次に、クリティカル・セクションが履行されたときにロックを解放するアプローチを示す（ロード／ストア排他命令は、図４のステップ１４０においてロックの読み出し及びクレームを取り扱うために使用され得る）。例えばハードウェア・トランザクショナル・メモリ・リソース１２０を含まないのでロック・ベースのアプローチを使用することに制限されたいくつかの処理要素６が存在し得る一方で、他の処理要素６がハードウェア・トランザクショナル・メモリ・リソース１２０を含み得る。さらに、トランザクショナル・モードを使用することを最初に試みられたスレッドが、それらのトランザクションに対して高頻度の停止が発生した場合、ロックを使用した非トランザクショナル・モードを使用することに切り替わり得る。例えばコンフリクトに直面し続けるスレッド・セットが存在し得るので、それらのスレッドのすべてに対してトランザクションを使用することを継続することは効果的ではない。したがって、図３に示されるものと同様に１つのスレッドがトランザクショナル・モードを使用している間であっても、ロック・ベースのメカニズムを使用する必要がある他のスレッドが依然として存在し得る。さらに、トランザクショナル・モードにおいて動作するスレッドが、非トランザクショナル・スレッドによってもアクセスされるシェアされたリソースにアクセスすることを依然として必要とし得る。いくつかの場合において、非トランザクショナル・スレッドは、トランザクショナル・スレッドと同じコードを実際に実行している場合があり得るが、コードは、トランザクションが以前の場合に効果的であることが見出されているか否かに応じて選択され得る、コード内におけるトランザクショナル・パスと非トランザクショナル・パスとの両方を含み得る（例えばトランザクショナル・パスが停止し続ける場合ソフトウェアが非トランザクショナル・パスに切り替わり得る）。
【００５８】
ロックによりガードされるリソースに対するアクセスをシェアする必要があるトランザクショナル・スレッドと非トランザクショナル・スレッドとの両方が存在し得るので、場合によっては、トランザクショナル・スレッドは、ロック・アドレスを読み出す、及び、ロックが現在クレーム又はセットされている場合に、トランザクションを停止する、又はある期間待ついくつかの命令を含むことを依然として必要とし得る。このようなロック確認命令は、トランザクショナル・スレッド自体の正しい処理を確実なものとするためには必要とされない一方で、コンフリクト確認回路１２６は、別のスレッドがトランザクションとコンフリクトしたか否かを検出し、検出した場合に不正確な結果を防止するためにトランザクションを停止することができるので、ロック確認は、非トランザクショナル・スレッドの演算を損ないかねない、別のスレッドがロックを保持しているときのトランザクションの結果のコミットを防止するために必要とされる。
【００５９】
処理回路４は、命令がそもそも実際に実行されなければならないか否か、又は、命令に対する入力が正しいか否かが知られる前にいくつかの命令が実行される、命令の投機的な実行をさらにサポートし得る。例えば所与の処理要素は、条件分岐命令の帰結（分岐の帰結はメモリ・システムからロードされた値、又は、まだ利用可能ではない、より以前の命令の結果に依存し得る）が実際に特定される前に条件分岐命令の帰結を予測する分岐プレディクタを含み得、後の命令は予測された結果に基づいて実行され得る。分岐が正しく予測された場合、これはパフォーマンスを改善し得るが、予測ミスが存在する場合、次に任意の投機的に実行された命令の結果が破棄され得、レジスタ１０６におけるアーキテクチャ状態は、分岐のポイントまで巻き戻され得、正しい分岐の帰結に関連した後続の命令が次に実行され得る。予測ミスを解決することに関連したレイテンシ・ペナルティーよりも、予測が正しい場合において命令がより早くフェッチ、デコード、及び実行されることを可能にすることにおけるパフォーマンスの利益の方が上回り得る。場合によっては、このような投機的な処理は、ロードが実際に実行されなければならないかを支配する、より以前の条件分岐が解決される前に、メモリ・システム８、２０、１６からデータをロードするためのロード命令が実行されることを結果的にもたらし得る。この分岐が予測ミスされた場合、これは、トランザクショナル・スレッドとロード／ストア排他命令を使用する非トランザクショナル・スレッドとの間における相互作用の問題を引起し、相互排他のロスをもたらす可能性があり得る。この問題を示すために次の実例が与えられる。
【００６０】
相互排他が要求される対象となる特定の変数ｘに対する演算を各々が実施する２つの処理要素（Ｐ０及びＰ１）を検討する。
Ｐ０                  Ｐ１
ｌｏｃｋ（）          ｌｏｃｋ（）
ｘ：＝ｘ＋２          ｘ：＝１
ｕｎｌｏｃｋ（）      ｕｎｌｏｃｋ（）
ｘが最初に０の値をもっていた場合、ｘに対する最終結果は次のいずれかであると想定される。すなわち、
・まずＰ０の更新が実施された後、Ｐ１がＰ０により結果的にもたらされるｘの値に作用する場合は１である。又は、
・まずＰ１の更新が実施された後、Ｐ０がＰ１により結果的にもたらされるｘの値に作用する場合は３である。
２という最終結果は、Ｐ１がｘを処理し始めた後だが、Ｐ１がメモリにｘの新しい値を書き戻す前にＰ０がｘの現在の値を読み出したことを意味するので、２という最終結果は相互排他の違反である。この実例は、考え出されたものであり、実際には、シェアされたデータ・リソースに対する処理の各スレッドにより実施される処理演算は、より複雑であり得ることが理解される。しかし、この簡略化された実例は、問題を説明するために有用である。
【００６１】
図５は、処理要素Ｐ０において実施されるスレッドに対する可能な実施態様を示す「ｓｐｉｎｌｏｃｋ」コードの実例を示し、ここで、ロード／ストア排他命令ＬＤＡＸＲ、ＳＴＸＲは、ロックが現在クレームされているか否かを確認するために、及び、どの他のスレッドもロックをクレームしていない場合にロックをクレームするために使用され（排他モニター論理部３０がロード排他とストア排他命令との間の期間に別のスレッドがロックをクレームした場合にインスタンスを検出する）、したがって、シェアされた「ｘ」という変数を使用して処理を進めることが安全であるか否かを確認するために使用される。
【００６２】
図６及び図７は、トランザクションがロックを抹消することを試みるために使用される代替的な実施態様を示すコードの実例を示す。図７は、図６に示される関数ＣＨＥＣＫ、ＷＡＩＴ＿ＡＣＱ、ＬＯＣＫ、ＣＨＥＣＫ＿ＡＣＱ、及びＵＮＬＯＣＫをより詳細に示す。図６に示されるコードが、トランザクションを開始するためのコードとトランザクションをコミットするためのコードとの両方だけでなく、トランザクションを実施する時点において別のスレッドがロックを保持している場合にトランザクションを再試行するための（「ｆａｌｌｂａｃｋ：」とラベル付けされた）フォールバック・コード・パス、及び、抹消が失敗した場合（トランザクションが既に特定の回数、成功せずに再試行をしている場合）実行される（「ｌｏｃｋ：」とラベル付けされた）ロック・パスを含むことに留意されたい。図７に示されるように、関数ＬＯＣＫ（Ｘｘ）におけるロック・パスは、図５に示される実例と同様の手法によりロード／ストア排他命令を使用する。図６において、トランザクションの使用が成功した（どの他の処理もロックを保持していない）場合、図６に示されるコードは、それ自体がロックをクレームしたことがない状態で「ｅｎｔｅｒ：」とラベル付けされたクリティカル・セクションに入る（ロック・アドレスが、ＣＨＥＣＫ（Ｘ１）においてトランザクションのワーキング読み出しセットに追加される一方で、トランザクションが失敗した場合にロック・パスが実行されない限り、ロックは書き込まれる対象とならない）ことにさらに留意されたい。
【００６３】
図８に示されるように、図５のｓｐｉｎｌｏｃｋコードを実行する処理要素Ｐ０は、ロードが実際に実行されなければならないか否かが知られる前にいくつかのロード命令を実行するロード投機を実施し得る。これは、ストア排他命令が成功したか否かをテストする条件分岐の解決の前に、（ロックが獲得されていない場合に実行してはならない）シェアされた変数ｘをロードするロード命令が実行されることを結果的にもたらし得る（すなわち場合によっては、ロックが実際に獲得される前に、シェアされた変数「ｘ」のロードが実施され得る）。相互排他を確実なものとするために、すべての処理要素が同じメカニズム（ロード／ストア排他命令）を使用するのであれば、これは許容可能であり、その理由は、ストア排他命令が、失敗したと後から特定された場合、すなわち、図８の条件分岐命令ＣＢＮＺが行われるべきであった場合、不正確な投機を解決するために提供されたメカニズムが、変数「ｘ」のロードが実施されていないかのように、シェアされた変数「ｘ」のロード、及び任意の後続の命令の効果をキャンセルし、正しい分岐の帰結に基づいて処理をリセットするからである。これは、ループが再度試みられることを確実なものとするので、任意の他のスレッドがその間に変数「ｘ」を更新していた場合、図８に示される現在のスレッドが「ｘ」に対する最新の値を読み出し、ストア排他命令ＳＴＸＲが成功した場合、すなわち、ＳＴＸＲ命令がロックをクレームするために実行される前に、ＬＤＡＸＲ命令に応答してセットされた排他モニターがクリアされることをどの他のスレッドももたらさない場合にのみ、現在のスレッドの結果がアーキテクチャ状態にコミットされる。
【００６４】
しかし、処理要素Ｐ０がロード／ストア排他命令を使用してクリティカル・セクションを処理する一方で、処理要素Ｐ１がロックを抹消するようにトランザクションを使用してクリティカル・セクションを処理する場合、処理要素Ｐ０による順番によらない変数「ｘ」のロードの投機的な実行は、相互排他の違反をもたらし得、例えば、Ｐ０及びＰ１により実行される命令の相対的なタイミングは、次のとおりである。
・Ｐ０がロック変数のＬＤＡＸＲを実行し（０＝フリーとみなす）、且つ、ロック変数アドレスに対して排他モニター標示をセットする。
・Ｐ０が変数ｘ（０とみなす）のＬＤＲを実行する。
…
・Ｐ１がロック変数（０＝フリーとみなす）のＴＳＴＡＲＴ及びＬＤＲを実行する。
・Ｐ１が変数ｘのＳＴＲを実行する（変数ｘを１にセットする）。
・Ｐ１がＴＣＯＭＭＩＴを実行して成功する。
…
・Ｐ０がロック変数のＳＴＸＲを実行（ロック変数を１にセット）し、ロック変数に対するどの介入的な書き込みも、ロック変数アドレス保有のためにセットされた排他モニター標示をクリアしていないので、ストア排他が成功する。
・Ｐ０が変数ｘのＳＴＲを実行する（変数ｘを２にセットする）。
・Ｐ０がロック変数のＳＴＬＲを実行する（ロック変数を０にセットする）。
【００６５】
最終的なｘの値が２であるので、このシーケンスは相互排他に違反する。抹消（トランザクショナル）パスがロック変数に書き込まないので相互排他違反が起こり得、したがって、ｓｐｉｎｌｏｃｋコードによりセットされた排他モニターが無傷に留まる。ロード投機は、Ｐ０によるロック・ストアより早くクリティカル・セクション・ロードをホイスティングし得、したがって、ロックがＰ０により記憶される対象となる前に、Ｐ１におけるトランザクションが開始することと終了することとの両方を行った場合、Ｐ０によりロードされた「ｘ」に対する値はクリティカル・セクションにおいて古くなっている（古い）。
【００６６】
この問題を解決する１つの手法が、ロードがより以前の条件分岐より上方においてホイスティングされることを防止するように、非トランザクショナル・スピンロック・コードに投機バリアを導入することであり得る。しかし、これは、トランザクショナル・メモリをサポートしていないシステムに対して既に記述された多くのプログラムが書き換えられることを必要とし得、このことが、ソフトウェア開発者に対する不当な負担となる。
【００６７】
トランザクショナル・メモリをサポートしていないシステムに対して記述された従来のコードとの後方互換を確実なものとすることができるアプローチは、トランザクショナル・スレッドと非トランザクショナル・スレッドとの間の互換性を確実なものとするために、アーキテクチャに２つの追加的な手段を導入することであり得る。第１に、ロード排他命令がある処理要素６において実行されたとき、そのワーキング・アドレス・セット（読み出しアドレス・セット）において同じアドレスを指定した任意のトランザクションが停止されるように、命令により指定されたアドレスに対する排他標示のセッティングが他の処理要素（少なくとも、ＨＴＭリソース１２０を含む処理要素）にブロードキャストされる。第２に、トランザクション内において実行されたとき、トランザクションのワーキング・アドレスの読み出しセットにロード命令により指定されたアドレスをロードする、且つ、同じアドレスに対する任意の以前にセットされた排他モニター標示がクリアされることを要求する信号を相互接続体１０に送る。以下で所定のタイプのロード命令と呼ばれるトランザクショナル・ロード命令の新しいクラスが導入される。図７の「ＣＨＥＣＫ（Ｘｘ）」関数内のロード命令ＬＤＲが、所定のタイプのロードと置換され得る。
【００６８】
上記の実例において、処理要素Ｐ１におけるトランザクションがロック変数において所定のタイプのロードを実行したとき、これが処理要素Ｐ０によりロック変数に対してセットされた排他モニター標示をクリアし、したがって、後続のストア排他命令ＳＴＸＲが処理要素Ｐ０において実行されたとき、排他モニターがもはやセットされないのでこの命令が失敗するという理由から、これらの手段は相互排他を確実なものとする。これは、変数ｘのロードが処理要素Ｐ１におけるトランザクションの実行より上方においてホイスティングされることを、投機的な実行が結果的にもたらす場合でも、スピンロック・コードが処理要素Ｐ０において失敗されるので、スピンロック・コードが変数ｘを使用してコードのクリティカル・セクションを実行しようとするその現在の試みを停止し、次に、別の時点においてロックをクレームしようと試みることにループ・バックし、この時にロック・クレームが成功した場合、変数ｘのロードは、トランザクションが実行される前に読み出された古くなった値ではなく、処理要素Ｐ１におけるトランザクションにより提供されるコミットされた更新により結果的にもたらされる値を読むことを意味する。
【００６９】
同様に、処理要素Ｐ０におけるロード排他命令の前に、処理要素Ｐ１におけるトランザクション内におけるロック変数のロードが発生するように、処理要素Ｐ０及びＰ１における演算間のタイミングが異なっていた場合、アドレス追跡回路１２４により追跡されるその読み出しアドレス・セットに同じアドレスを含むトランザクションを他の処理要素が停止することを可能にするように、排他標示のセッティングが他の処理要素にブロードキャストされる。これが相互排他が失われることを防止し、その理由は、この時、トランザクションが失敗し、及び、ロック変数が処理要素Ｐ０においてスピンロック・コードにより解放された後にトランザクションを実行しようとする後続の試みにおいて、トランザクションが、この時点で、他の処理要素Ｐ０におけるコードのクリティカル・セクションの成功した履行により結果的にもたらされる変数ｘの値を読むからである。
【００７０】
図９は、所与のアドレスＸを指定したロード排他命令に応答する方法を示す。ロード排他命令は、ステップ２００において所与の処理要素６により実行される。それに応答して、ステップ２０２において、処理要素６がアドレスＸに対する排他モニター標示のセッティングをトリガーする。排他モニター標示が同時にセットされ得る対象となるアドレスの最大数への到達が既に発生している場合、ステップ２０２は、以前にセットされたアドレスに関連した排他モニター標示のクリアをさらにトリガーし得る。
【００７１】
ステップ２０４において、アドレスＸに対する排他モニターのセットは、他の処理要素６又はスレッドがアドレスＸに対して既にセットされた任意の排他モニターをクリアすることをトリガーし、且つ／又は、グローバル排他モニター３２がアドレスＸに対して他の処理要素又はスレッドによりセットされた任意の排他モニターをクリアすることをトリガーする。さらに、ステップ２０６において、ある処理要素におけるアドレスＸに対する排他モニターのセットは、そのワーキング・アドレス・セット（読み出しアドレス・セット）におけるアドレスＸを使用した任意のトランザクションが停止されることをトリガーする。いくつかの場合において、ステップ２０４及びステップ２０６に示されるアクションは、相互接続体１０によりルーティングされた独立したメッセージによりトリガーされ得、又は代替的に、両方のアクションが同じメッセージによりトリガーされ得る。
【００７２】
ステップ２０８において、ロード排他命令に応答して、アドレスＸからのデータが、ロード排他命令を実行した処理要素６のレジスタにロードされる。例えばこのデータは、その処理要素のキャッシュ８から、又は、他の処理要素における、若しくは、相互接続体１０におけるキャッシュから、又は主メモリ１６から取得され得る。
【００７３】
図１０は、所与の処理要素６により処理されるストア排他命令を処理する方法を示す。ステップ２１０において、所与のアドレスＸを指定したストア排他命令が所与の処理要素６により実行される。それに応答して、ステップ２１２において、処理要素６が、アドレスＸに対して所与の処理要素により排他モニターがセットされているか否かを判定する。セットされていない場合、ステップ２１４において、ストア排他失敗標示が返信される（例えばレジスタにセットされた所定の値）、及び、ストア演算が行われない（ストア排他命令により指定されたレジスタにおけるデータ値が、キャッシュ又はメモリに書き込まれない）。所与の処理要素に対する排他モニターがアドレスＸに対して依然としてセットされている場合、ステップ２１６において、ストア排他命令により指定されたレジスタからのデータがアドレスＸに関連したキャッシュ又はメモリにおける位置に記憶され、ステップ２１８において、処理要素が、ストア排他成功標示、例えば、ステップ２１４において失敗ケースにおいて返信される値と異なる、レジスタに記憶された値を返信する。この値は、例えば、相互排他が遂行される必要がある対象のリソースにアクセスするコードのセクションに進むか否かを判定するために、後続の条件分岐命令により確認され得る。
【００７４】
図１１は、ストア排他命令ではないストア命令の取扱いを示す。ステップ２２０において、アドレスＸを指定したストア命令が所与の処理要素により実行され、それに応答して、ステップ２２２において、アドレスＸに対して他のスレッド又は処理要素によりセットされた任意の排他モニター標示がクリアされる。ステップ２２４において、ストア命令により指定されたレジスタからのデータが、アドレスＸに関連した位置においてキャッシュ又はメモリに記憶される。ストア命令は、アドレス追跡回路１２４により追跡されるそれらの読み出し又は書き込みアドレス・セット内におけるアドレスＸを指定した任意のトランザクションに対するコンフリクトするアクセスとしても検出され得る。
【００７５】
図１２は、トランザクション内において処理要素６により実行されるロード命令を取り扱う方法を示す。ステップ２４０において、ロード命令がトランザクション内において実行され、ロード命令は、所与のロード対象アドレスＸを指定する。それに応答して、ステップ２４２において、アドレス追跡回路は、そのワーキング・アドレス・セット（読み出しアドレス・セット）にアドレスＸを追加する。ステップ２４４において、それらの書き込みアドレス・セットにアドレスＸを含む任意の他のトランザクションが停止される（それらの読み出しセットにアドレスＸを含むトランザクションを停止する必要はない）。
【００７６】
ステップ２４６において、ロード命令のタイプが特定される。ロード命令が所定のタイプのもの（排他モニター・クリア・タイプ）である場合、ステップ２４８において、ロード命令を実行した処理要素６が、アドレスＸに対して他の処理要素又はスレッドによりセットされた任意の排他モニター標示をクリアすることをトリガーするタイプの読み出し要求を、相互接続体１０に発行する。その一方で、ロードのタイプが第２のタイプ（非排他モニター・クリア・タイプ）のロード命令である場合、ステップ２５０において、他のスレッド又は処理要素によりアドレスＸに対して既にセットされた排他モニターが保有されることを可能にするタイプの読み出し要求を処理要素６が発行する。ロード命令のタイプにかかわらず、ステップ２５２において、（別の処理要素のキャッシュ８又は主メモリ１６からデータをフェッチした後、処理要素６のローカル・キャッシュ８から、又は相互接続体１０から）読み出し要求に応答してデータが返信されたとき、データがロード命令により指定されたレジスタ１０６に書き戻され、処理要素６のローカル・キャッシュ８にまだない場合、ローカル・キャッシュ８にさらに割り当てられ得る。
【００７７】
したがって、（第２のタイプのロードと異なり）排他モニターのクリアをトリガーする特別なタイプのロード命令を提供することにより、これは、トランザクション内におけるロック変数を確認するためのロードが、非トランザクショナル・スレッドによりセットされたロック・アドレスに対する任意の以前にセットされた排他モニターをクリアすることを可能にし、したがって、ロード投機が存在する場合でも相互排他が維持され得る。
【００７８】
図１３から図１５は、２つの処理要素ＲＥ０、ＰＥ１（６）及び相互接続体１０の間におけるメッセージングの実例を示す。これらの実例において、処理要素ＰＥ１は、ロック変数としてアドレスＸを確認するトランザクショナル・スレッドを実行し、及び、ＲＥ０は（上記の実例と同様の）ロック変数アドレスＸに対する排他モニター標示をセットする非トランザクショナル・スレッドを実行すると仮定される。
【００７９】
図１３は、図１２に示される第２のタイプのロード命令の取扱いを示す。第２のタイプのロード命令に応答して、ＰＥ１は、ロード命令の対象アドレスＸを指定する相互接続体１０にＲｅａｄＳｈａｒｅｄ要求を発行する。相互接続体１０は、アドレスＸに対するデータのまさに最新の値を識別するために必要とされる任意のスヌープ・メッセージを送り、別の処理要素６のローカル・キャッシュ８に、又は、システム・キャッシュ２０若しくはメモリ１６内にあり得るデータを取得する。相互接続体１０は、処理要素６にデータを返信し、処理要素６は、（他の位置に保持されたデータは、そのローカルにキャッシュされたコピーに対するＰＥ１による書き込みが発生した場合に無効化されることを必要とし得るので）データに対する任意の将来の書き込みが相互接続体を使用した確認を要求することを示す「シェアされた」状態において、データをキャッシュする。第２のタイプのロード命令を使用すると、アドレスＸに対する任意の以前にセットされた排他モニター標示をクリアする必要がない。したがって、ＲＥ０は、非トランザクショナル・スレッドにより以前にセットされている場合、アドレスＸに対する任意の排他モニターを保有し得る。
【００８０】
図１４は、所定のタイプのロード命令の取扱いを示し、このロード命令に応答して、データに対するさらなる書き込みが相互接続体１０に確認することなく実施され得る状態でＰＥ１にデータが戻されることを要求する「ＲｅａｄＵｎｉｑｕｅ」要求を、ＰＥ１が相互接続体１０に送る。ＲｅａｄＵｎｉｑｕｅメッセージは、相互接続体１０が他の処理要素に排他モニター・キャンセル・メッセージ２６０を送信することをもたらし、このことが、この実例において、ＰＥ０がアドレスＸに対して既にセットされたその排他モニターをキャンセルすることをトリガーする。データを取得した場合、相互接続体１０に再度確認することなく、ローカルにキャッシュされたデータに対して書き込みが許可にされる「ユニークな」状態で、データがＰＥ１に戻される。ＲｅａｄＵｎｉｑｕｅメッセージは、システムの他のキャッシュ８、２０に保持されたアドレスＸに対するデータのキャッシュされたコピーを相互接続体が無効化することをさらにトリガーし得る。
【００８１】
他の実例において、「ユニークな」状態でデータを返信する「ＲｅａｄＵｎｉｑｕｅ」要求を使用するのではなく、ユニークな状態においてデータを返信しない（例えば、代替的に、キャッシュされたデータに対する書き込みが容認されるように、相互接続体１０に対するさらなるメッセージが要求される「シェアされた」状態においてデータが返信され得、したがって、必要な場合に他のキャッシュされたコピーが無効化され得る）が、アドレスＸに対して以前にセットされた排他モニター標示がキャンセルされることを排他モニター・キャンセル・メッセージ２６０が確実なものとすることを依然としてトリガーする所定の形態のロード命令に応答した、異なる形態のコヒーレンシー・メッセージがＰＥ１により相互接続体１０に発行され得る。実際には、所定のタイプのロードに対する想定される使用ケースは、書き込みがトランザクション内において想定されていない対象のロック変数を確認するためのものであり、したがって、「ユニークな」状態でデータを返信することが必須というわけではない。それにもかかわらず、ロード命令に応答して排他モニターのキャンセルをトリガーするようにコヒーレンシー・メッセージの形態を規定することにより、これは、上述のトランザクショナル・スレッドと非トランザクショナル・スレッドとの間の連係動作を改善することに役立ち得る。
【００８２】
図１５は、ＲＥ０がその対象アドレスとしてアドレスＸを指定したロード排他命令を実行するときのメッセージングを示す。それに応答して、排他モニター・セッティング・メッセージ２７０が相互接続体１０に送られ、排他モニター・セッティング・メッセージ２７０は、トランザクショナル・メモリをサポートする任意の他の処理要素６に伝達される。排他モニター・セッティング・メッセージ２７０に応答して、ＰＥ１は読み出しセットにアドレスＸを含むトランザクションを停止する。ＰＥ０から相互接続体１０に送信される排他モニター・セッティング・メッセージ２７０の形態は、相互接続体１０から他の処理要素６、例えばＰＥ１に送られる排他モニター・セッティング・メッセージの形態と同じであり、又は異なり得る。
【００８３】
図１６は、使用され得るシミュレーターの実施態様を示す。ここまでに説明される実施例は、関心のある技術をサポートする特定の処理ハードウェアを動作させるための装置及び方法の観点から本技術を実装しているが、コンピュータ・プログラムの使用を通して実装される本明細書において説明される実施例による命令実行環境を提供することも可能である。このようなコンピュータ・プログラムは、多くの場合、このようなコンピュータ・プログラムがハードウェア・アーキテクチャのソフトウェア・ベースの実施態様を提供する限り、シミュレーターと呼ばれる。様々なシミュレーター・コンピュータ・プログラムとして、エミュレーター、仮想マシン、モデル、及び動的バイナリ変換部を含むバイナリ変換部が挙げられる。典型的には、シミュレーターの実施態様は、シミュレーター・プログラム３１０をサポートした、ホスト・オペレーティング・システム３２０を任意選択的に動作させるホスト・プロセッサ３３０において動作してよい。いくつかのアレンジにおいて、ハードウェアと、提供される命令実行環境、及び／又は、同じホスト・プロセッサにおいて提供される複数の別個の命令実行環境との間に複数のシミュレーション・レイヤーが存在してよい。歴史的には、相応の速度において実行するシミュレーターの実施態様を提供するために強力なプロセッサが必要とされてきたが、このようなアプローチは、例えば、互換性又は再使用を理由として別のプロセッサに対してネイティブなコードを走らせたいという要望が存在するときといった特定の状況において妥当であり得る。例えば、シミュレーターの実施態様は、ホスト・プロセッサ・ハードウェアによりサポートされていない追加的な機能を含む命令実行環境を提供してよく、又は、異なるハードウェア・アーキテクチャに典型的には関連した命令実行環境を提供してよい。シミュレーションの概観が、「Ｓｏｍｅ  Ｅｆｆｉｃｉｅｎｔ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｉｍｕｌａｔｉｏｎ  Ｔｅｃｈｎｉｑｕｅｓ」、Ｒｏｂｅｒｔ  Ｂｅｄｉｃｈｅｋ、Ｗｉｎｔｅｒ  １９９０  ＵＳＥＮＩＸ  Ｃｏｎｆｅｒｅｎｃｅ、５３〜６３頁に記載されている。
【００８４】
実施例が特定のハードウェア構築部又は機能部を参照しながらここまでに説明されている範囲において、シミュレーションによる実施例では、同等な機能が適切なソフトウェア構築部又は機能部により提供されてよい。例えば、特定の回路が、シミュレーションによる実施例においてコンピュータ・プログラム論理部として実装されてよい。同様に、メモリ・ハードウェア、例えばレジスタ又はキャッシュは、シミュレーションによる実施例においてソフトウェア・データ構造体として実装されてよい。前述の実施例において参照されているハードウェア要素のうちの１つ又は複数がホスト・ハードウェア（例えば、ホスト・プロセッサ３３０）に存在するアレンジにおいて、適切な場合には、いくつかのシミュレーションによる実施例がホスト・ハードウェアを使用してよい。
【００８５】
シミュレーター・プログラム３１０は、（非一時的媒体であってよい）コンピュータ可読記憶媒体に格納されてよく、シミュレーター・プログラム３１０によりモデル化されたハードウェア・アーキテクチャのアプリケーション・プログラム・インターフェースと同じである（アプリケーション、オペレーティング・システム、及びハイパーバイザーを含んでよい）ターゲット・コード３００に対するプログラム・インターフェース（命令実行環境）を提供してよい。したがって、所定のタイプのロード命令及び上述のロード／ストア排他命令を含むターゲット・コード３００のプログラム命令が、シミュレーター・プログラム３１０を使用して命令実行環境内から実行されてよく、したがって、上述の装置２のハードウェア機能部を実際には含まないホスト・コンピュータ３３０がこれらの特徴をエミュレートし得る。シミュレーター・プログラム３１０は、処理論理部１０４、ハードウェア・トランザクショナル・メモリ・リソース１２０、及び排他モニター３０、３２にそれぞれ対応した機能を提供する、処理プログラム論理部３１２、トランザクショナル・メモリ・プログラム論理部３１４、及び排他モニター・プログラム論理部３１６を含んでよい。
【００８６】
本出願において、「するように構成された〜」という表現は、装置の要素が規定の動作を行うことができる構成をもつことを意味するように使用される。この文脈において、「構成」はハードウェア又はソフトウェアの相互接続のアレンジ又は手法を意味する。例えば、装置は、規定の動作を提供する専用ハードウェアを含んでよく、又は、プロセッサ又は他の処理デバイスが機能を実施するようにプログラムされてよい。「するように構成された」とは、規定の動作を提供するために装置要素が何らかの手法により変えられる必要があることを意味するわけではない。
【００８７】
本発明の例示的な実施例が添付図面を参照しながら本明細書において詳細に説明されているが、本発明はそれらの実施例そのものに限定されないこと、及び、添付の請求項により規定されている本発明の範囲及び趣旨から逸脱することなく、当業者によりその中において様々な変形及び変更が行われ得ることが理解される。
【図１】
2021529372.tif 000003
【図２】
2021529372.tif 000004
【図３】
2021529372.tif 000005
【図４】
2021529372.tif 000006
【図５】
2021529372.tif 000007
【図６】
2021529372.tif 000008
【図７】
2021529372.tif 000009
【図８】
2021529372.tif 000010
【図９】
2021529372.tif 000011
【図１０】
2021529372.tif 000012
【図１１】
2021529372.tif 000013
【図１２】
2021529372.tif 000014
【図１３】
2021529372.tif 000015
【図１４】
2021529372.tif 000016
【図１５】
2021529372.tif 000017
【図１６】
2021529372.tif 000018
【国際調査報告】
2021529372.tif 000019
2021529372.tif 000020