IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ アーム・リミテッドの特許一覧

特許7165725トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認
<>
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図1
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図2
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図3
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図4
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図5
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図6
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図7
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図8
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図9
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図10
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図11
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図12
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図13
  • 特許-トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認 図14
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-10-26
(45)【発行日】2022-11-04
(54)【発明の名称】トランザクショナル・メモリ用サポートを備えるシステムでの、トランザクションに関するロック変数の確認
(51)【国際特許分類】
   G06F 9/46 20060101AFI20221027BHJP
   G06F 9/30 20180101ALI20221027BHJP
   G06F 9/34 20060101ALI20221027BHJP
   G06F 9/52 20060101ALI20221027BHJP
【FI】
G06F9/46 430
G06F9/30 350A
G06F9/34 350A
G06F9/52 120B
【請求項の数】 25
(21)【出願番号】P 2020517825
(86)(22)【出願日】2018-08-30
(65)【公表番号】
(43)【公表日】2020-12-17
(86)【国際出願番号】 GB2018052452
(87)【国際公開番号】W WO2019073192
(87)【国際公開日】2019-04-18
【審査請求日】2021-08-23
(31)【優先権主張番号】1716568.9
(32)【優先日】2017-10-10
(33)【優先権主張国・地域又は機関】GB
(73)【特許権者】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】ホースネル、マシュー ジェイムズ
(72)【発明者】
【氏名】ディーステルホルスト、シュテファン
【審査官】坂東 博司
(56)【参考文献】
【文献】特開2014-194754(JP,A)
【文献】米国特許出願公開第2014/0281236(US,A1)
【文献】特表2017-509970(JP,A)
【文献】国際公開第2016/139446(WO,A1)
【文献】特表2018-511119(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 9/46
G06F 9/30
G06F 9/34
G06F 9/52
(57)【特許請求の範囲】
【請求項1】
命令をデコードする命令デコーダと、
前記命令デコーダによってデコードされた前記命令に応答してデータ処理を実行する処理回路と
を備え、前記処理回路は、前記処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ用サポート回路を具備し、前記トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行される前記スレッドの命令を含み、そのため前記処理回路は、前記トランザクション終了命令に至るまで、前記投機的に実行された命令の結果がコミットされるのを防止するよう構成され、
所与のスレッドの所定のタイプのトランザクション開始命令、又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令に応答して、前記命令デコーダは、前記処理回路を制御して、少なくとも1つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むよう構成され、
前記所定のタイプのトランザクション開始命令に続いて実行される、前記所与のスレッドの所定のタイプのトランザクション終了命令に応答して、前記命令デコーダは、前記処理回路を制御して、前記取り込まれたロック識別子によって識別された前記ロック変数を確認し、前記ロック変数が、別のスレッドが前記少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを防止又は延期するよう構成される、装置。
【請求項2】
前記ロック識別子は、前記ロック変数を格納する記憶場所のアドレスを含む、請求項1に記載の装置。
【請求項3】
前記命令デコーダは、前記処理回路を制御し、前記所定のタイプのトランザクション開始命令に応答して、前記ロック識別子を取り込むよう構成される、請求項1から2までのいずれか一項に記載の装置。
【請求項4】
前記所定のタイプのトランザクション開始命令は、前記ロック識別子を指定するか又は前記ロック識別子を格納するレジスタを指定するエンコードを有する、請求項3に記載の装置。
【請求項5】
前記所定のタイプのトランザクション開始命令に応答して、前記命令デコーダは、前記処理回路を制御し、所定のレジスタから前記ロック識別子を読み取るよう構成される、請求項3に記載の装置。
【請求項6】
前記命令デコーダは、前記処理回路を制御し、前記所与のスレッドの前記所定のタイプのトランザクション開始命令に続く選択されたタイプの最初の命令に応答して、前記ロック識別子を取り込むよう構成される、請求項1及び2のいずれか一項に記載の装置。
【請求項7】
前記選択されたタイプの前記命令は、記憶場所からレジスタにデータ値をロードする、ロード命令を含む、請求項6に記載の装置。
【請求項8】
前記ロード命令は、前記データ値がそこからロードされるべき前記記憶場所を特定するターゲット・アドレスを指定し、
前記ロック識別子は、前記所定のタイプのトランザクション開始命令に続く、前記所与のスレッドの前記最初のロード命令の前記ターゲット・アドレスを含む、請求項7に記載の装置。
【請求項9】
前記所定のタイプのトランザクション終了命令のデコードに応答して、前記処理回路は、前記ロック変数が、別のスレッドが前記少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、前記所与のスレッドの前記トランザクションを打ち切るよう構成される、請求項1から8までのいずれか一項に記載の装置。
【請求項10】
前記所定のタイプのトランザクション終了命令のデコードに応答して、前記処理回路は、前記ロック変数が、他のスレッドが前記少なくとも1つのターゲット・リソースへの排他的アクセスを放棄したことを示すまで、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを延期するよう構成される、請求項1から8までのいずれか一項に記載の装置。
【請求項11】
前記所定のタイプのトランザクション終了命令のデコードに応答して、前記処理回路は、前記ロック変数を確認する試行回数、又は他のスレッドによって前記少なくとも1つのターゲット・リソースへの排他的アクセスが放棄されるのを待つことに伴う待機レイテンシが、所定の閾値を超える場合に、前記所与のスレッドの前記トランザクションを打ち切るよう構成される、請求項10に記載の装置。
【請求項12】
前記所定のタイプのトランザクション開始命令の後で、且つ前記所定のタイプのトランザクション終了命令の前に、前記所与のスレッドで実行される、前記所定のタイプの別のトランザクション開始命令に応答して、又は前記別のトランザクション開始命令の後に続く命令に応答して、前記命令デコーダは、前記処理回路を制御し、別のロック変数を識別する別のロック識別子を取り込んで、少なくとも1つの別のターゲット・リソースへのアクセスを制御するよう構成される、請求項1から11までのいずれか一項に記載の装置。
【請求項13】
前記所与のスレッドについて複数のロック識別子が取り込まれたときの、前記所定のタイプのトランザクション終了命令のデコードに応答して、前記処理回路は、複数のロック変数のいずれかが、別のスレッドが少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示している場合、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを防止又は延期するよう構成される、請求項1から12までのいずれか一項に記載の装置。
【請求項14】
前記処理回路は、対応するトランザクションが打ち切られず、またコミットされないままである所与のスレッドの、実行されたトランザクション開始命令の数を示す、トランザクションのネスト深さを表す、トランザクションのネスト深さの値を維持するよう構成され、
前記所定のタイプのトランザクション終了命令には、前記トランザクションのネスト深さの値が、前記トランザクションのネスト深さが1に等しいことを示す場合に実行されるトランザクション終了命令が含まれる、請求項1から13までのいずれか一項に記載の装置。
【請求項15】
第2のタイプのトランザクション開始命令に応答して、前記命令デコーダは、前記処理回路を制御して、後続の命令の投機的実行を果たし、前記ロック識別子の取込みを省略するよう構成される、請求項1から14までのいずれか一項に記載の装置。
【請求項16】
前記所与のスレッドの1つ又は複数のトランザクション開始命令に応答して取り込まれた、1つ又は複数のロック識別子を格納する、ロック取込記憶領域を備える、請求項1から15までのいずれか一項に記載の装置。
【請求項17】
前記所定のタイプのトランザクション終了命令のデコードに応答して、前記所与のスレッドについてゼロ・ロック識別子が前記ロック取込記憶領域に格納されると、前記処理回路は、ロック変数が、別のスレッドが少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示すかどうかとは無関係に、前記所与のスレッドの前記投機的に実行された命令の前記結果をコミットするかどうかを判断するよう構成される、請求項16に記載の装置。
【請求項18】
前記トランザクショナル・メモリ用サポート回路は、少なくとも1つのスレッドの少なくとも1つのトランザクションの前記投機的に実行された命令の前記結果を格納する投機結果記憶回路を備える、請求項1から17までのいずれか一項に記載の装置。
【請求項19】
前記トランザクショナル・メモリ用サポート回路は、前記トランザクションを打ち切ると復元されるように、前記トランザクション開始命令に応答して取り込まれた状態を格納する、復元状態記憶回路を備える、請求項1から18までのいずれか一項に記載の装置。
【請求項20】
前記トランザクショナル・メモリ用サポート回路は、最初のスレッドのトランザクション内で行われた所与のアドレスへのデータ・アクセスと、別のスレッドによって行われた同じアドレスへのデータ・アクセスとの間の競合を検出する、競合検出回路を備える、請求項1から19までのいずれか一項に記載の装置。
【請求項21】
前記競合検出回路は、前記競合の検出に応答して、前記最初のスレッドの前記トランザクションの打切りをトリガするよう構成される、請求項20に記載の装置。
【請求項22】
前記トランザクショナル・メモリ用サポート回路は、トランザクション内の命令によってアクセスされるアドレスを追跡するアドレス追跡回路を備える、請求項1から21までのいずれか一項に記載の装置。
【請求項23】
処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートする、トランザクショナル・メモリ用サポート回路を備える前記処理回路を使用して、デコードされた命令に応答してデータ処理を実行するステップであって、前記トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行される前記スレッドの命令を含み、そのため前記処理回路は、前記トランザクション終了命令に至るまで、前記投機的に実行された命令の結果がコミットされるのを防止するよう構成される、ステップと、
所与のスレッドの所定のタイプのトランザクション開始命令、又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令のデコードに応答して、少なくとも1つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むステップと、
前記所定のタイプのトランザクション開始命令に続いて実行される、前記所与のスレッドの所定のタイプのトランザクション終了命令のデコードに応答して、前記取り込まれたロック識別子によって識別された前記ロック変数を確認し、前記ロック変数が、別のスレッドが前記少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを防止又は延期するステップと
を含む、データ処理方法。
【請求項24】
ホスト・データ処理装置を制御して、命令を実行するための命令実行環境を提供するコンピュータ・プログラムであって、
データ処理のスレッド内のトランザクションの実行をサポートする処理プログラム・ロジック
を含み、前記トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行される前記スレッドの命令を含み、そのため前記処理プログラム・ロジックは、前記トランザクション終了命令に至るまで、前記投機的に実行された命令の結果がコミットされるのを防止するよう構成され、
所与のスレッドの所定のタイプのトランザクション開始命令、又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令に応答して、前記処理プログラム・ロジックは、少なくとも1つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むよう構成され、
前記所定のタイプのトランザクション開始命令に続いて実行される、前記所与のスレッドの所定のタイプのトランザクション終了命令に応答して、前記処理プログラム・ロジックは、前記取り込まれたロック識別子によって識別された前記ロック変数を確認し、前記ロック変数が、別のスレッドが前記少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、前記所与のスレッドの前記投機的に実行された命令の前記結果のコミットを防止又は延期するよう構成される、コンピュータ・プログラム。
【請求項25】
請求項24に記載の前記コンピュータ・プログラムを格納する記憶媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本技法は、データ処理の分野に関する。より詳細には、本技法は、トランザクショナル・メモリに関する。
【背景技術】
【0002】
データ処理システムは、データ処理の複数のスレッドを実行できる。スレッドは、共有リソースにアクセスしなければならない場合があり、データ処理操作の性質上、スレッドが共有リソースとの相互作用を開始すると、その間にリソースにアクセスする別のスレッドがなくても、操作のセットが不可分なものとしてリソースを使用し、完了する必要があり得る可能性がある。
【0003】
スレッド間のこの競合を処置する1つの技法は、ロックを使用して、少なくとも1つのターゲット・リソースへの排他的アクセスを制御することであり得る。たとえば、あるスレッドが特定のアドレス領域のデータへのアクセスを開始するとき、スレッドはロックの所有権を要求するためにロック変数をセットすることができ、次いでロックを所有するスレッドがロックの所有権を有している間、ロック変数を確認する他のスレッドは、ロックがすでに要求されていることを判断でき、そのため、そのアドレス領域と相互作用するコードのセクションに入ってはならない。かかるロック・ベースの手法は、競合が生じ得ないことを保証するロックの所有権がない限り、別のスレッドとの競合が発生する可能性があるので、各スレッドは、デフォルトで、共有リソースにアクセスするコードのセクションに入ることができないと推定する、悲観的なものであると理解することができる。しかし、ロック識別子はしばしば、複数のリソース(たとえば、アドレスの範囲)への排他的アクセスを制御する場合があり、そのため、あるスレッドがロック変数で保護されたリソースのセット内の特定のリソースにアクセスしている場合、別のスレッドが確実に同じリソースにアクセスすることになるとは限らない。したがって、スレッド間の競合がまれな場合、共有リソースを使用するコードの重要なセクションに入る前に、スレッドは、ロックが解放されるのを不必要に待っている可能性があるので、ロック・ベースの手法は、性能を損なう可能性がある。
【0004】
共有リソースにアクセスするスレッド間の競合を処置するより楽観的な手法は、トランザクショナル・メモリ用サポートを使用することであり得る。データ処理システムは、処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートする回路を備えることができる。トランザクションは、トランザクションの開始を示すトランザクション開始命令と、トランザクションの終了を示すトランザクション終了命令との間に実行される、スレッドのそうした命令であり得る。トランザクション開始命令とトランザクション終了命令との間に、処理回路は、介在する命令を投機的に実行し、トランザクション終了命令に至るまで投機的に実行されるそうした命令の、結果のコミットを防ぐことができる。トランザクション開始命令の実行後(ただし、トランザクション終了命令に至る前に)にアボート・イベントが発生すると、トランザクションが打ち切られ、投機結果が破棄されるという結果になり得る。トランザクションを打ち切る理由はいくつかあり得るが、1つの理由は、別のスレッドが行うメモリ・アクセスとの競合が検出されることであり得る。したがって、この手法では、各スレッドは他のスレッドとの競合が発生しないであろうと推定して、コードの重要なセクションの処理を楽観的に開始することができ、次いでどんな競合も検出されることなく重要なセクションの終わりに達した場合、トランザクションの結果はコミットされ得る。競合がまれな場合、トランザクショナル・メモリ用サポートを使用することで、より多くのスレッドがコードの重要なセクションを同時に処理できるようにして、性能を向上させることができる。
【先行技術文献】
【非特許文献】
【0005】
【文献】Robert Bedichek、「Some Efficient Architecture Simulation Techniques」、1990年冬、USENIXカンファレンス、53~63頁
【発明の概要】
【課題を解決するための手段】
【0006】
少なくともいくつかの実例により、命令をデコードする命令デコーダと、命令デコーダによってデコードされた命令に応答してデータ処理を実行する処理回路とを備える装置を提供し、処理回路は、処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ用サポート回路を具備し、トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行されるスレッドの命令を含み、そのため処理回路は、トランザクション終了命令に至るまで、投機的に実行された命令の結果がコミットされるのを防止するよう構成され、所与のスレッドの所定のタイプのトランザクション開始命令又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令に応答して、命令デコーダは、処理回路を制御して、少なくとも1つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むよう構成され、前記所定のタイプのトランザクション開始命令に続いて実行される、所与のスレッドの所定のタイプのトランザクション終了命令に応答して、命令デコーダは、処理回路を制御して、取り込まれたロック識別子によって識別されたロック変数を確認し、ロック変数が、別のスレッドが前記少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期するよう構成される。
【0007】
少なくともいくつかの実例により、以下を含むデータ処理方法を提供し、方法は、
デコードされた命令に応答して、処理回路によるデータ処理のスレッド内のトランザクションの実行をサポートするトランザクショナル・メモリ用サポート回路を備える処理回路を使用して、データ処理を実行するステップであって、トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行されるスレッドの命令を含み、そのため処理回路は、トランザクション終了命令に至るまで、投機的に実行された命令の結果がコミットされるのを防止するよう構成される、ステップと、所与のスレッドの所定のタイプのトランザクション開始命令又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令のデコードに応答して、少なくとも1つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別する、ロック識別子を取り込むステップと、前記所定のタイプのトランザクション開始命令に続いて実行される、所与のスレッドの所定のタイプのトランザクション終了命令のデコードに応答して、取り込まれたロック識別子によって識別されたロック変数を確認するステップと、ロック変数が、別のスレッドが前記少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期するステップとを含む。
【0008】
少なくともいくつかの実例により、ホスト・データ処理装置を制御して、命令を実行するための命令実行環境を提供する、コンピュータ・プログラムを提供し、コンピュータ・プログラムは、データ処理のスレッド内のトランザクションの実行をサポートする処理プログラム・ロジックを含み、トランザクションは、トランザクション開始命令とトランザクション終了命令との間で投機的に実行されるスレッドの命令を含み、そのため処理プログラム・ロジックは、トランザクション終了命令に至るまで、投機的に実行された命令の結果がコミットされるのを防止するよう構成され、所与のスレッドの所定のタイプのトランザクション開始命令、又は前記所与のスレッドの前記所定のタイプのトランザクション開始命令の後に続く命令に応答して、処理プログラム・ロジックは、少なくとも1つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別する、ロック識別子を取り込むよう構成され、前記所定のタイプのトランザクション開始命令に続いて実行される、所与のスレッドの所定のタイプのトランザクション終了命令に応答して、処理プログラム・ロジックは、取り込まれたロック識別子によって識別されたロック変数を確認し、ロック変数が、別のスレッドが前記少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期するよう構成される。
【0009】
コンピュータ・プログラムは、記憶媒体に格納され得る。記憶媒体は、非一時的な記憶媒体であり得る。
【0010】
本技法のさらなる態様、特徴、及び利点は、以下の添付図面と併せて読まれるべき実例の以下の説明から明らかとなろう。
【図面の簡単な説明】
【0011】
図1】トランザクショナル・メモリ用サポート回路を備えた、データ処理装置の実例を模式的に示す図である。
図2】トランザクショナル・メモリ用サポートを備えるシステムにおける、トランザクションの処理の実例を示す図である。
図3】ロック・ベースのモードでの、図2のトランザクションと同等の動作を実行する、代替のコード・シーケンスを示す図である。
図4】ロック変数を確認して、トランザクショナル・スレッドによる妨害から非トランザクショナル・スレッドを保護する命令を有する、トランザクションの実例を示す図である。
図5】非トランザクショナル・スレッドがロックされたリソースへの排他的アクセスを保持している場合、トランザクショナル・スレッドの処理が遅延する可能性があるという問題を示す図である。
図6】所定のタイプのトランザクション開始命令に応答して、ロック識別子を取り込み、トランザクション終了命令に応答して、ロック識別子によって識別されたロック変数を確認することにより、この遅延を回避する手法を示す図である。
図7】所定のタイプのトランザクション開始命令の後の、最初のロード命令に応答してロック変数が取り込まれる代替形態を示す図である。
図8】トランザクショナル・スレッドのトランザクション終了時にロックが要求されていない場合の、トランザクショナル・スレッド及び非トランザクショナル・スレッドの処理の実例を示す図である。
図9】トランザクショナル・スレッドのトランザクション終了時に、非トランザクショナル・スレッドによってロックが保持されている場合の実例を示す図である。
図10】トランザクショナル・スレッドと非トランザクショナル・スレッドとの間の競合が、どのようにトランザクションを打ち切ることができるかを示す実例の図である。
図11】ネストされたトランザクションを処置する実例を示す図である。
図12】トランザクション開始命令の処理を示す流れ図である。
図13】トランザクション終了命令の処理を示す流れ図である。
図14】使用することができるシミュレータの実施例を示す図である。
【発明を実施するための形態】
【0012】
トランザクショナル・メモリ用サポート回路は、トランザクション内の命令の投機的実行を可能にし、それにより、トランザクションを打ち切る必要がある場合に投機結果を戻すことができるので、トランザクションを実行する2つのスレッド間の競合を回避するためにロック変数を使用する必要はない。ただし、非トランザクション・ベースの手法で実行されているいくつかのスレッドも、存在する可能性がある。かかる非トランザクショナル・スレッドは、たとえば、トランザクションを使用せずに、元々書かれた又はコンパイルされたコードのセクションを実行するスレッドであり得る(どんなトランザクション開始及び終了命令も含まない)。或いは、非トランザクショナル・スレッドには、以前にトランザクション・ベースのモードで命令を処理していたが、トランザクションが頻繁にアボート・イベントを発生したため(たとえば、他のスレッドとの競合のため)、処理がその時点で非トランザクション・ベースのモードに切り替えられたスレッドが含まれ得る。かかる非トランザクショナル・スレッドが少なくとも1つのターゲット・リソースへの排他的アクセスを必要とする場合、少なくとも1つのターゲット・リソースへの排他的アクセスを制御するために、依然としてロック変数を使用することが多い。直感に反して、どの非トランザクショナル・スレッドの結果をも確実に正しくするために、非トランザクショナル・スレッドがロックを保持している間は、トランザクショナル・スレッドが共有リソースへの書込みをコミットしないようにする必要があるので、トランザクショナル・スレッドは依然として、ロック変数を確認する必要があり得る。したがって、トランザクショナル・モードで実行されるスレッドのトランザクション内でさえも、トランザクションには依然として、ロック変数を確認して、他のどのスレッドも少なくとも1つのターゲット・リソースへの排他的アクセスを保持していないかを判断し、現在ロックが別のスレッドによって保持されている場合は、後に続く操作を延期する命令が含まれることが多い。これにより、トランザクション内の命令の処理が遅延する可能性がある。
【0013】
しかし発明者らは、トランザクション内の命令が投機的に実行されるとき、トランザクション内で確認されるべきロック変数が、別のスレッドが少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示している場合でも、トランザクショナル・スレッドがトランザクション内の投機的に実行される命令を実行し続けることができるようにすることは、実際には問題ではないことを認識した。トランザクショナル・メモリ用サポート回路が提供する他の仕組みが、別のスレッドとの競合が検出された場合にトランザクションを打ち切ることができるので、かかるロック変数の確認操作は、実際には、トランザクショナル・スレッド自体を保護するためのものではない。そうではなくて、ロック変数の確認は通常、トランザクショナル・スレッドによる妨害から非トランザクショナル・スレッドを保護するために、トランザクションに含まれている。トランザクショナル・スレッドの効果は、投機的に実行された命令の結果がコミットされるまで見られないであろうことから、これは、ロック変数が、別のスレッドがロックされたリソースへの排他的アクセスを保持していることを示しているかどうかに関係なく、トランザクションの投機的実行をトランザクション終了命令まで続行しても安全であることを意味する。その代わりに、トランザクション終了命令に応答して、ロック変数の確認を実行できる。この手法では、別のスレッドがロックを保持しているときに投機的に実行される命令の処理の開始に不要な遅延がなく、トランザクションがトランザクション終了命令に達するときまでに、他のスレッドがすでにロックを解放している可能性がある。したがって、この手法により、トランザクションの処理をより高速化できる。これにより、他のトランザクションの性能も向上する。というのは、1つのスレッドのトランザクションが遅延している間、該トランザクションは、他のトランザクションが使用できないリソースをトランザクショナル・メモリ用サポート回路内に保持しているからである。したがって、1つのスレッドのトランザクションをより速く完了できるようにすると、他のスレッドも、トランザクショナル・メモリのリソースをより早く利用できるようになり、全体的な性能が向上する。
【0014】
したがって、所与のスレッドの所定のタイプのトランザクション開始命令、又は所与のスレッドのその所定のタイプのトランザクション開始命令の後に続く命令に応答して、命令デコーダは、処理回路を制御して、少なくとも1つのターゲット・リソースへの排他的アクセスを制御するためのロック変数を識別するロック識別子を取り込むことができる。その所定のタイプのトランザクション開始命令に続いて実行される所与のスレッドの所定のタイプのトランザクション終了命令に応答して、命令デコーダは、処理回路を制御して、取り込まれたロック識別子によって識別されたロック変数を確認し、ロック変数が、別のスレッドが少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期することができる。したがって、ロック変数を確認して、ロックがセットされている場合は後続の命令の実行を延期するのに、トランザクション内で明示的な命令を必要とするのではなく、トランザクション終了命令のデコードに応答して処理回路が確認を実行する。ロック確認をトランザクションの終わりに移すことにより、ロックが保持されているかどうかに関係なく、トランザクション内の操作を投機的に実行でき、トランザクションの終了時に至るまでにロックがすでに解放されている可能性が高くなり、トランザクション開始時の遅延が回避される。
【0015】
ロック識別子は、確認されるべき特定のロック変数を識別する任意の値にすることができる。しかしいくつかの実例では、ロック識別子は、ロック変数を格納する記憶場所のアドレスを含み得る。
【0016】
いくつかの実例では、命令デコーダは、処理回路を制御し、所定のタイプのトランザクション開始命令自体に応答して、ロック識別子を取り込むことができる。場合によっては、所定のタイプのトランザクション開始命令のエンコードが、実際に、ロック識別子を指定することができる(即値として直接、又はロック識別子を格納するレジスタを指定することによって)。したがって、プログラマ又はコンパイラが作るコードは、トランザクション開始命令のエンコード内にその変数のロック識別子を含めることにより、確認されるべきロック変数を特定できる。或いは、ロック識別子は、トランザクション開始命令の特定のエンコードとは無関係に読み取られる、所定のレジスタから読み取ることができる。たとえば、特定のデフォルトのレジスタを使用して、ロック識別子(たとえば、ロック変数のアドレス)を保持することができ、ロック識別子は、所定のタイプのトランザクション開始命令に応答して読み取ることができる。したがって、所定のタイプのトランザクション開始命令のエンコードが、ロック識別子を指定することは必須ではない。
【0017】
或いは、所定のタイプのトランザクション開始命令自体に応答するのではなく、所与のスレッドの所定のタイプのトランザクション開始命令に続く選択されたタイプの最初の命令に応答して、ロック識別子の取込みを実行できる。場合によっては、選択されたタイプの命令は、専用のエンコードをもつ特殊なタイプのロック変数識別命令であり得る。しかし、選択されたタイプの命令は、ロック識別子を識別することに加えて他の機能性を提供するタイプの命令であってもよい。たとえば、選択されたタイプの命令は、記憶場所からレジスタにデータ値をロードする、ロード命令であり得る。場合によっては、ロック識別子は、データ値がそこからロードされるべき記憶場所を特定する、ロード命令のターゲット・アドレスであると判断され得る。したがってこの手法では、所定のタイプのトランザクション開始命令に続く最初のロード命令が検出されたときに、命令デコーダは、処理回路を制御して、最初のロード命令のターゲット・アドレスをロック識別子として取り込むことができる。既存のコードは、ロック変数を、トランザクション開始命令に続く一番初めの命令として確認できることが多く、これは、ロード命令を使用してロック変数をレジスタにロードし、次いで比較命令を使用してレジスタにロードされたロック変数の値を確認することにより行われることが多いので、この手法は有用であり得る。したがって、トランザクション開始命令に続く最初のロードに応答してロック識別子を取り込むことにより、既存のコードの修正が少なくて済む可能性がある。
【0018】
所定のタイプのトランザクション終了命令のデコードに応答してロック変数が確認され、ロック変数が、別のスレッドが少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示す場合、処理回路は、トランザクションの投機的に実行された命令の結果のコミットを防止又は延期するために、様々なやり方で応答できる。一実例では、トランザクションの終了時にロックが別のスレッドによって保持されている場合、処理回路は、単にトランザクションを打ち切ることができる。これにより、後でロック変数の確認を再試行する発見的手法を実現するにあたって、複雑さが軽減される。
【0019】
或いは、所定のタイプのトランザクション終了命令のデコードに応答して、トランザクションの投機的に実行された命令の結果のコミットは、ロックされた変数が、他のスレッドが少なくとも1つのターゲット・リソースへの排他的アクセスを放棄したことを示すまで延期され得る。この手法により、場合によっては他のスレッドがロックを放棄するのを待つ間に遅延があるが、依然として投機結果をコミットできる可能性があるので、より良好な前進が得られ得る。ただし、トランザクションが長く待たされてしまう場合は、単にトランザクションを打ち切る方がよいかもしれない。したがって、別のスレッドがロックを保持しているときに、結果のコミットが最初に延期された場合、処理回路は、ロック変数を確認する試行回数、又は他のスレッドによって少なくとも1つのターゲット・リソースへの排他的アクセスが放棄されるのを待つことに伴う待機レイテンシが、所定の閾値を超える場合には、トランザクションを打ち切ることができる。
【0020】
いくつかの実例では、所定のタイプのトランザクション終了命令のデコードに応答したロック変数の定期的な確認は、命令を実行するために使用される通常の処理経路とは別の、ロック確認エンジンによって制御され得る。したがって、ロック変数の確認は、処理ロジックによって実行されている他の処理の裏で行われ得る。ロック確認エンジンは、所定のタイプのトランザクション終了命令のデコードに応答して呼び出すことができ、次いでロック変数の定期的な確認、及びロック変数を確認する十分な試行又はトランザクションを打ち切ることが望まれるだけの十分な時間がいつ経過したかの判断の処置を行うことができる。
【0021】
実行されるべきスレッドには、ネストされたトランザクションが含まれる場合があり、ここで、最初のトランザクションのトランザクション開始命令を実行した後、最初のトランザクションのトランザクション終了命令が検出される前に、最初のトランザクション内でネストされた2番目のトランザクションの開始を表す別のトランザクション開始命令が実行される。たとえば、これは、処理がそこに分岐し得るコード内で、複数の関数エントリ又は分岐ターゲット場所を許容し、コードを作成する人又はコンパイラは、処理が一番初めのトランザクション開始命令の前の箇所に分岐したか、又は後の箇所に分岐したかに関係なく、コードの特定のブロックがトランザクション内で確実に処置されることを望むプログラムに使用され得る。いくつかのハードウェア実施態様では、ネストされた各トランザクションを個別のトランザクションとして扱うことができ、ネストされたトランザクションごとに個別の復元状態を維持し、内側のネストされたトランザクションのトランザクション開始命令へ部分的に戻すことを可能にするが、これには、正当化され(justified)得ない、比較的複雑なハードウェア・リソースが必要となり得る。したがって、他の実施態様では、内側のトランザクションを効果的に無視でき、その結果内側のネストされたランザクション内で打切りが発生しても、状態は、トランザクションのネストされたセットの外側のトランザクションに関連するトランザクション開始命令の時点での、保留されていた状態に戻される。これは、ネストされたトランザクションのセット全体に対して、ただ1つの復元状態のセットしか維持する必要がないであろうことを意味する。
【0022】
したがって、所定のタイプのトランザクション開始命令の後に、所与のスレッドの、所定のタイプの別のトランザクション開始命令が実行され、別のトランザクション開始命令は、所定のタイプのトランザクション終了命令の前に実行されることが可能である。この場合、別のトランザクション開始命令に応答して、又は別のトランザクション開始命令の後に続く命令に応答して、命令デコーダは、処理回路を制御して、少なくとも1つの別のターゲット・リソースへのアクセスを制御するための別のロック変数を識別する、別のロック識別子を取り込むようにすることができる。場合によっては、別のトランザクション開始命令又は後続の命令によって識別されるロック変数は、すでに取り込まれたロック変数と同じである可能性がある(この場合、別のロック識別子の個別の取込みが不要な場合がある)が、他の場合には、別のトランザクション開始命令又は後続の命令が異なるロック変数を指定する可能性があるため、取り込まれるロックのコード化されたスレッドのセットに別のロック識別子が追加され得る。したがって、所与のスレッドについて複数のロック識別子が取り込まれたときの、所定のタイプのトランザクション終了命令のデコードに応答して、処理回路は、取り込まれたロック変数のいずれかが、別のスレッドが少なくとも1つのターゲット・リソースの対応するセットへの排他的アクセスを保持していることを示している場合、所与のスレッドの投機的に実行された命令の結果のコミットを防止又は延期できる。したがって、ハードウェアが各ネストされたトランザクションを個別に追跡しない実施例において、トランザクションのネストがある場合でも、ネストされたトランザクションのセットの各トランザクション開始命令に関連するロック識別子の確認は、所定のタイプのトランザクション終了命令(たとえば、トランザクションのネストされたセットの外側のトランザクションに対応するトランザクション終了命令)に応答して実行され得る。
【0023】
いくつかの実例では、所定のタイプのトランザクション終了命令は、単に任意のトランザクション終了命令であり得る。ただし、前述のように、ネストされたトランザクションの場合、ネストされたセットの内側のトランザクションのトランザクション終了命令は、事実上無視することができ、トランザクションの終了に関連する操作は、ネストされたセットの外側のトランザクションに関連するトランザクション終了命令に応答して実行され得る。したがって処理回路は、対応するトランザクションが打ち切られず、またコミットされないままである所与のスレッドの、実行されたトランザクション開始命令の数を示す、トランザクションのネスト深さを表す、トランザクションのネスト深さの値を維持することができる。たとえば、トランザクションのネスト深さは、あらゆるトランザクションの外側で命令を実行している場合(どのトランザクションも保留されたまま残っていない場合)はゼロであり得る。外側のトランザクション内である場合、深さは1であり得る。また、ネストされたセットの内側のトランザクションの内側である場合、深さは1より大きくなり得る。所定のタイプのトランザクション終了命令には、トランザクションのネスト深さの値が、トランザクションのネスト深さが1に等しいことを示すときに実行されるトランザクション終了命令が含まれ得る。これにより、セットの外側のトランザクションに関連するトランザクション終了命令によって、ロック変数の確認が確実にトリガされる。処理回路によって(たとえば、レジスタ内に)維持されるトランザクションのネスト深さの値は、トランザクションのネスト深さを明示的に表す必要がないことが理解されよう。場合によっては、格納された値は、単に、トランザクションのネスト深さに関連する数値に対応することがあるが、他の実例では、格納された値は、それからネスト深さを判断できる何らかの値を使用して、ネスト深さをエンコードすることができる。
【0024】
いくつかの実例では、すべてのトランザクション開始命令が、所定のタイプのトランザクション開始命令と見なすことができる。しかし、他の実例では、所定のトランザクション開始命令は、(それ自体又は後続の命令で)ロック識別子の取込みをトリガする、特別なタイプのトランザクション開始命令であり得る。それに応答してデコーダが処理回路を制御し、ロック識別子の取込みを省略しながらも後続の命令の投機的実行を果たす、第2のタイプのトランザクション開始命令も提供することができる。2つの形式のトランザクション開始命令を提供することにより、ロック変数に依存しないトランザクションを、ロック変数に依存するトランザクションと区別でき、そうしたロックに依存しないトランザクションは、トランザクションが終了に至り、別のスレッドがロックを保持している場合に、コミットを延期する必要がないので、より高速に処理できる。2つのタイプのトランザクション開始命令は、それらのオペコードによって、又は命令のエンコード内で指定された開始タイプのパラメータによって、又は同じようにエンコードされたトランザクション開始命令が、所定のタイプとして機能するか若しくは第2のタイプとして機能するかを制御する、構成レジスタに格納されたモード値によって区別できる。
【0025】
装置は、所与のスレッドの1つ又は複数のトランザクション開始命令に応答して取り込まれた、1つ又は複数のロック識別子を格納する、ロック取込記憶領域を備えることができる。たとえば、ロック取込記憶領域は、トランザクション・メモリ用サポート回路内に内部レジスタのセットを備えることができる。そうした内部レジスタは、ソフトウェアから直接アクセスできる必要はないが、ハードウェアだけで使用される、隠しレジスタであり得る。所定のタイプのトランザクション終了命令のデコードに応答して、所与のスレッドについてゼロ・ロック識別子がロック取込記憶領域内に格納されると、処理回路は、ロック変数が、別のスレッドが少なくとも1つのターゲット・リソースへの排他的アクセスを保持していることを示すかどうかとは無関係に、トランザクションの投機的に実行された命令の結果をコミットするかどうかを判断することができる。したがって、ロック取込記憶領域は、トランザクションの終了時に、いずれかのロックを確認する必要があるかどうか、そして確認する必要がある場合はどのロック変数かを示す。複数のスレッドがトランザクションを同時に実行している場合、ロック取込記憶領域は、スレッドごとに1つ又は複数のロック識別子の対応するセットを個別に記録できる。
【0026】
トランザクショナル・メモリ用サポート回路は、様々な形態をとることができ、トランザクションの処理の助けとなるいくつかのリソースを備えることができる。たとえば、トランザクショナル・メモリ用サポート回路は、少なくとも1つのスレッドの少なくとも1つのトランザクションの投機的に実行された命令の結果を格納するための、投機結果記憶回路を備えることができる。場合によっては、投機的に実行された結果の複数のセットが、相異なるスレッドで実行されているトランザクション用に格納される場合がある。すべての投機結果が投機結果記憶回路に格納されることは、必須ではない。たとえば、トランザクショナル・メモリ用サポート回路は、トランザクションを打ち切るときに復元される、トランザクション開始命令に応答して取り込まれた状態を格納するための、復元状態記憶回路を備えることもできる。したがって、プロセッサのアーキテクチャ・レジスタ内の現在の値が、そうした投機結果(トランザクションの打切り時に、復元状態で上書きされることになる)を事実上示すことができるので、トランザクションを打ち切るときに復元されるレジスタの状態又は他のアーキテクチャ上の状態の値を、投機結果記憶回路に格納する必要はない。投機結果記憶回路は、たとえば、値をメモリに格納するためのストア命令の結果を格納することができる。トランザクションがコミットされるまで、ストア命令の投機結果を投機結果記憶回路に保持することにより、メモリが、その後で不正確になる可能性があるか又は他のスレッドを正しく機能させない可能性があるデータ値で汚染(polluting)されることを回避する。
【0027】
別の実例では、トランザクショナル・メモリ用サポート回路は、最初のスレッドのトランザクション内で行われた所与のアドレスへのデータ・アクセスと、(トランザクション内又は非トランザクショナル・スレッドの中の)別のスレッドによって行われた同じアドレスへのデータ・アクセスとの間の競合を検出するための、競合検出回路を備えることもできる。たとえば、トランザクション内の命令によってアクセスされるアドレスを追跡するための、アドレス追跡回路が設けられ得る。競合検出回路は、別のスレッドがアドレス追跡回路に記録されたアドレスの1つにアクセスするときに競合を検出できる。競合検出回路は、競合が検出されると、アドレスが追跡されている最初のスレッドのトランザクションの打切りをトリガすることができる。
【0028】
トランザクショナル・メモリ用サポート回路は、トランザクションを打ち切らせる可能性のある他のイベントを検出する回路も備えることができる。たとえば、割込受信時に打ち切られ得る。また、トランザクショナル・メモリ用サポート回路がリソースを使い果たし(たとえば、投機結果記憶回路に格納されるべき投機結果の数又はアドレス追跡回路によって追跡されるアドレスの数が、設けられた記憶部内で利用可能な容量を超える場合)、それにより、トランザクションが競合なしに正しく続行されるのを保証することがもはや不可能な場合、トランザクションは打ち切られ得る。また、特定のタイプの命令は、トランザクション内で処理されるには不適切である可能性があり、トランザクション内で許可されていないタイプの命令が発生すると、トランザクションが打ち切られる場合がある。トランザクションが打ち切られると、トランザクションの実行を再び試みるか、又はロックを使用するなど、非トランザクション・ベースの仕組みを使用して代替のコード経路を実行するかの判断は、ソフトウェア次第であり得る。
【0029】
対応するコンピュータ・プログラムは、ホスト・データ処理装置を制御して、命令を実行するための命令実行環境を提供することができ、該環境で処理プログラム・ロジックは、所定のタイプのトランザクション開始命令及び所定のタイプのトランザクション終了命令に応答して、上記で論じたロック識別子の取込み及びロック変数の確認を行う。かかるコンピュータ・プログラムにより、トランザクショナル・メモリ用サポート回路又は所定のタイプのトランザクション開始/終了命令用命令デコーダ・サポートを、それ自体が備えていない汎用のホスト・データ処理装置が、こうした特徴を提供する実際のハードウェアがない場合でも、トランザクショナル・メモリの機能性、及びトランザクションがロック変数を確認する必要がある場合の改善された処置の恩恵を受けることができるようになり得る。コンピュータ・プログラムは、その代わりに、この機能性をエミュレーションする命令又はデータ構造体のセットなどのプログラム・ロジックを提供し、汎用のホスト・データ処理装置が、かかるハードウェアの特徴を備える装置上で実行することを意図されたコードを、実行できるようにする。
【0030】
図1は、ハードウェアのトランザクショナル・メモリ(HTM:hardware transactional memory)用サポートを備えた、データ処理装置2の実例を示す。本装置は、命令を実行してデータ処理演算を行う処理ロジック4を備える。たとえば、処理ロジック4は、加算、乗算、AND、ORなどの算術又は論理演算を行うための算術/論理ユニット(ALU:arithmetic/logic unit)、浮動小数点被演算子の演算を実行する浮動小数点ユニット、又は複数のデータ要素を含むベクトル被演算子のベクトル処理を行うベクトル処理ユニットなど、様々なタイプの処理演算を実行する実行ユニットを備えることができる。処理ロジック4で実行される命令の被演算子を格納し、実行された命令の結果を格納する、アーキテクチャ・レジスタ6のセットが提供される。命令デコーダ8は、命令キャッシュ10から取得された命令をデコードして、処理ロジック4又はデータ処理装置2の他の要素を制御して関連する操作を実行するための制御信号を生成する。ロード/ストア・ユニット12も提供され、(命令デコーダ8によってデコードされたロード命令に応答して)ロード操作を実行して、データ・キャッシュ14又は主メモリ16からアーキテクチャ・レジスタ6にデータ値をロードし、(命令デコーダ8によってデコードされたストア命令に応答して)ストア操作を実行して、アーキテクチャ・レジスタ6からのデータ値をデータ・キャッシュ14又はメモリ16に格納する。
【0031】
装置2は、ハードウェアのトランザクショナル・メモリ(HTM)をサポートするための様々なリソースを提供する、トランザクショナル・メモリ用サポート回路20も備える。トランザクショナル・メモリ用サポート回路20内のHTMリソースは、たとえば、トランザクションの投機結果を格納する投機結果記憶部22、トランザクションがアクセスしたアドレスを追跡するアドレス追跡回路24、トランザクションが行ったデータ・アクセスと他のスレッドが行ったデータ・アクセスとの間の競合を検出し、それにより競合が検出されたときにトランザクションを打ち切ることができる競合検出回路26、及びトランザクション開始時にアーキテクチャ・レジスタ6からのアーキテクチャ状態データのスナップショットを格納し、それによりトランザクションが打ち切られたときに、トランザクションの投機結果に上書きするように、この状態を復元できる復元状態記憶回路28を備え得る。また、リソースには、強いロック識別子のためのロック記憶構造体30、及びトランザクションのネストのレベルを追跡する、ネスト深さの値を格納するためのネスト深さレジスタ32を備えることができ、これらについては後でより詳細に説明することにする。
【0032】
図2は、トランザクショナル・メモリ用サポート回路20及び処理ロジック4を使用して、所与のスレッド内のトランザクションを実行する実例を示す。トランザクションは、トランザクション開始命令(tstart)及びトランザクション終了命令(tcommit)で区切られたプログラム・コードのセクションである。図2に示すように、トランザクション開始命令に応答して、アーキテクチャ・レジスタ6内の現在のアーキテクチャ状態が取り込まれ、復元状態記憶回路28に格納される。処理ロジック4は、tstart命令の後に続く命令の投機的な実行を開始し、こうした命令が実行されると、その命令によってアクセスされるアドレスがアドレス追跡回路24によって追跡され、競合検出回路26が、追跡されたアドレスと、他のスレッドに応答してロード/ストア・ユニット12を使用してアクセスされたアドレスとの間の競合を検出する。トランザクション内の命令の少なくともいくつかの投機結果は、投機結果記憶回路22内に格納される。たとえば、ストア命令STRに応答してキャッシュ又はメモリに格納された値は、トランザクションが保留状態にある間、投機結果記憶部22に保持することができる。その間にアボート・イベントが発生せずにトランザクション終了命令(tcommit)に至る場合、トランザクション終了命令に応答して投機結果はコミットされる。トランザクションをコミットすると、そのスレッドについての投機結果記憶部22に格納されたどの結果も、データ・キャッシュ14又はメモリ16に書き込むことができ、もはやトランザクション開始命令が検出される前のポイントにアーキテクチャの状態を戻す必要がなくなったので、復元状態28は破棄されるか、又は上書きが許可され得る。
【0033】
一方、アボート・イベントが発生する場合、たとえば、すでにトランザクションによってアクセスされているアドレスに別のスレッドがアクセスするときに、競合検出回路26によって競合が検出される場合、トランザクションの打切りがトリガされ、復元状態記憶部28からの復元状態が、アーキテクチャ・レジスタ6に復元される。アボート・イベントが発生する他の原因には、たとえば、トランザクション内での実行が許可されていない命令の実行、所与のトランザクションが必要とする投機結果又はアドレスを扱う投機結果記憶部22又はアドレス追跡回路24内のリソース不足、或いはトランザクション中に受信されている割込みが含まれ得る。
【0034】
図2は、トランザクションの開始及び終了命令を使用して、実行されるべき特定の処理操作のセットが、トランザクショナル・モードでどのように実行され得るかを示す。図3に示すように、ロック・ベースの仕組みを使用して、非トランザクショナル・モードで同じ処理操作のセットを実行することもできる。この場合、コードのセクションを開始する前に、少なくとも1つのロック確認命令40が、ロックのアドレス#addLockで特定されるロック変数を確認し、ロック変数が、別のスレッドがすでにロックを保持していることを示すかどうかを確認する。別のスレッドがロックを保持している場合、ロックが解放されるまで、処理は、ロック確認命令40より先に進まない。ロックが使用可能であると判断されると、ロックのアドレス#addLockに所与の値(たとえば、バイナリの1)を書き込むことでロックが要求される。たとえば、ロック確認命令40は、指定されたアドレスに格納されている現在の値を比較してロックが保持されているかどうかを判断し、ロックが要求されていない場合は、ロック変数を更新してロックを要求する、不可分な比較及びスワップ命令を使用して実施され得る。或いは、ロックの確認は、ロックを読み取りロックの値をテストする一連の複数の命令を使用して実施してもよく、どちらでも、ロックがすでに要求されている場合は処理を延期させ、又はロックが現在要求されていない場合はロック変数を更新することによりロックを要求させる。ロックによって保護されたコードのセクションを完了して、ロックによって保護されたリソースへの排他的アクセスがもはや不要になると、別の命令42がロックを解放できる。たとえば、ロックによって保護されるリソースは、介在するコードのセクション間にアクセスされる、様々なアドレスによって特定されるデータの場所である。
【0035】
したがって、処理ロジック4によって実行されている処理のいくつかのスレッドは、図2に示すように、トランザクション・モードを使用でき、一方他のスレッドは、トランザクションを使用しないロック・ベースのモードを使用できる。また、トランザクショナル・モードを使用して最初に試行されたスレッドは、そのトランザクションで頻繁な打切りが生じる場合、ロックを使用する非トランザクショナル・モードの使用に切り替えることができる。たとえば、競合が発生し続けるスレッドのセットが存在する可能性があるため、そうしたスレッドすべてに対してトランザクションを継続して使用することは効率的ではない。したがって、1つのスレッドが図2に示すものと同様のトランザクショナル・モードを使用している間でも、依然としてロック・ベースの仕組みを使用する必要がある他のスレッドが存在し得る。また、トランザクショナル・モードで操作するスレッドは、依然として、非トランザクショナル・スレッドからもアクセスされる共有リソースへのアクセスが必要な場合がある。場合によっては、非トランザクショナル・スレッドが実際にトランザクショナル・スレッドと同じコードを実行していることがあるが、コードは、そのコード内にトランザクショナル経路と非トランザクショナル経路との両方を有している場合があり、経路は、トランザクションが以前のときに効率的であると判明したかどうかに応じて選択され得る(たとえば、トランザクショナル経路が打切りを続ける場合、ソフトウェアが、非トランザクショナル経路に切り替えることができる)。
【0036】
ロックによって保護されたリソースへのアクセスを共有する必要がある、トランザクショナル・スレッドと非トランザクショナル・スレッドとの両方が存在する可能性があるので、この場合図4に示すように、ときどきトランザクショナル・スレッドは、依然としてロックのアドレスを読み取り、ロックがクリアされている場合は、ロックを要求し、ロックが現在要求されているか又はセットされている場合は、トランザクションを打ち切るか又はしばらく待機する、いくつかの命令を有する必要があり得る。競合確認回路26は、別のスレッド操作がトランザクションと競合するかどうかを検出し、競合する場合、トランザクションを打ち切って誤った結果を防ぐことができるので、かかるロック確認命令が、トランザクショナル・スレッド自体の正しい処理を保証する必要はないが、非トランザクショナル・スレッドの操作を含み得る、別のスレッドがロックを保持しているときのトランザクションの結果のコミットを防ぐために、ロックの確認は必要になるであろう。
【0037】
したがって、図5に示すように、トランザクショナル・スレッドと非トランザクショナル・スレッドとが共存する場合、一般的に、非トランザクショナル・スレッドT1がトランザクショナル・スレッドT0でトランザクションを開始する前にロックを要求するような状況が発生する。トランザクションに入ると、トランザクショナル・スレッドT0は、図4に示すようにいくつかの命令を実行して、ロックのアドレス#addLockで特定されるロックが保持されているかどうかを確認することができ、トランザクショナル・スレッドT0がロックを要求できるまで、トランザクションの機能命令の後の処理を遅らせることができる。これには時間がかかる場合があり、非トランザクショナル・スレッドT1はいくつかのサイクルでロックを解除できないので、図5に示すように遅延が発生する。
【0038】
図6は、かかる遅延を回避するのに役立ち得る、トランザクションでロック確認を行う代替のやり方を示す。所定のタイプのトランザクション開始命令、tstartLが提供され、これは、たとえば即値又はレジスタ参照を使用して、ロックのアドレスを指定する。所定のタイプのトランザクション開始命令に応答して、ロックのアドレスは、図1に示すロック記憶構造体30内に取り込まれる。たとえば、ロック記憶構造体30は、ロック変数のアドレスを書き込むことができる1つ又は複数のレジスタを備えることができる。ロックのアドレスを取り込んで、従来のトランザクション開始命令に関連する他のどんな操作をも実行すると、トランザクションの機能命令を実行でき、ロック変数を確認して、ロックが現在保持されている場合、トランザクションの処理を延期するためのどんな命令も含める必要がない。したがってこれにより、図5に示す遅延が解消される。その代わりに、ロック変数の確認が、トランザクション終了命令tcommitに至るまで延期される。トランザクション終了命令に応答して、処理ロジック4は命令デコーダ8により制御され、ロック記憶構造体30内に取り込まれた任意のロックのアドレスで示されるロック変数を確認する。場合によっては、この確認を、図1に示すロック確認エンジン34に任せることができ、ロック確認エンジン34は、該エンジン34を制御する、関連するタイマ36を備えることができ、トランザクション終了命令tcommitによって起動されると、ロック記憶構造体30に格納されたロックのアドレスによって特定されるロック変数を読み取るロード操作を定期的に発行して、ロック変数が現在、ロックが別のスレッドによって保持されていることを示しているかどうかを確認し、そのロックがもはや別のスレッドによって保持されなくなるまで確認を続行する。したがって、現在ロックされている場合、トランザクションの投機的に実行された命令によって生成された結果のコミットは、延期又は防止される。一方、ロックが要求されていないことが判明した場合は、トランザクションの結果はコミットされ得る。ロック確認回路34は必須ではなく、代わりに、かかるロックの確認は、処理ロジック4又はロード・ストア・ユニット12によって行われ得る。
【0039】
図7は、所定のタイプのトランザクション開始命令tstartLを実現する代替のやり方を示す。この場合、tstartL命令自体はロック識別子のアドレスを指定しないが、代わりにロック識別子のアドレスは、所定のタイプのトランザクション開始命令に続く最初のロード命令50によって取得され、次いで図6と同じように、ロードのアドレスが取り込まれる。図7のトランザクション終了命令の操作は、図6のそれと同じである。
【0040】
図6及び図7に示す所定のタイプのトランザクション開始命令tstartLは、図4に示す従来のタイプのトランザクション開始命令tstartと様々なやり方で区別することができる。場合によっては、相異なるタイプのトランザクション開始命令は、相異なる命令のオペコードを有することができる。或いは、それらのトランザクション開始命令は、同じオペコードを共有できるが、ロックのアドレスの取込みをトリガしない通常のトランザクション開始命令を、図6及び図7に示す、ロックの取込みをトリガする、特殊なタイプのトランザクション開始と区別する、命令エンコードの別のフィールド内に指定されたパラメータが存在し得る。或いは、アーキテクチャ・レジスタ6の状態レジスタ内のモード・ビットは、トランザクション開始命令がロックのアドレスの取込みをトリガすべきかどうかを決定することができる。トランザクション開始命令自体がロックのアドレスの取込みをトリガしない図7などの実施態様では、レジスタ6の1つの中のフラグは、所定のタイプのトランザクション開始命令tstartLに応答して、第1の値にセットすることができ、それによりロード命令50が検出されると、状態フラグが第1の値を有する場合にはロックのアドレスが取り込まれ、状態フラグが第2の値を有する場合には取り込まれない。ロックのアドレスが取り込まれると、フラグは、第2の値にセットすることができ、それにより後に続くロードで、次のアドレスの取込みがトリガされなくなる。この手法では、コンパイラ又はプログラマは、所定のトランザクション開始命令の後に実行される最初のロード命令を、確実にロック変数のアドレスを提供するものにする必要がある(実際には、トランザクション開始命令は通常、ロックを必要とするコードの重要なセクションの先頭に含まれているはずなので、いずれにしても、ロックの確認が、トランザクションで最初に実行される操作である可能性は高い)。
【0041】
図8に示すように、図6及び図7に示す手法を用いて、ロックを保持する非トランザクショナル・スレッドが存在する場合でも、図5の遅延を解消できる。ロックのアドレスは、トランザクショナル・スレッドT0の所定のタイプのトランザクション開始命令に続いて取り込まれ、トランザクションの終了に達したときにロック変数の確認が必要になることを示す。この時点では、ロックが別のスレッドによって実際に保持されているかどうかは関係なく、トランザクションの機能命令を投機的に実行し続けることができる。トランザクションの終わりに、tcommit命令がロック変数の確認をトリガし、図8に示す状況では、非トランザクショナル・スレッドT1がロック変数をすでにロック解除しているので、ロックは現在要求されていないことが判明している。したがって、トランザクショナル・スレッドT0のトランザクションの結果をコミットできる。対照的に、以前に論じた手法では、トランザクショナル・スレッドT0のトランザクションの開始時に非トランザクショナル・スレッドによってロックが保持されていた場合、遅延が発生していたであろう。トランザクションの最初ではなく最後にロック変数を確認することにより、トランザクションが終了する前に非トランザクショナル・スレッドがロック変数をロック解除している可能性がより高くなる。
【0042】
図9に示すように、トランザクション終了命令tcommitに達した時点で依然として他のスレッドT1によってロックが保持されている場合でも、ロックが放棄されるのを待つことに伴う遅延52は、図5に示す手法が使用され、トランザクションの開始時にロックが確認された場合に発生していたはずである遅延よりも短い可能性がある。というのは、ロックが解放されるのを待つのに費やされた時間の一部が、トランザクションの機能命令を実行するために使用されているからである。したがって、これにより、図5に示す場合と比較して、さらに性能が向上する可能性がある。
【0043】
図10に示すように、それぞれのトランザクショナル及び非トランザクショナル・スレッドT0、T1によってアクセスされるアドレス間に競合がある場合、これは競合検出回路26によって検出されることになり、トランザクションは打ち切られ、後で再試行されるか、又は代わりに非トランザクショナル・モードで実行され得る。したがって、非トランザクショナル・スレッドT1がロックを保持していても、トランザクションの命令を進めることができることに問題は生じない。確実にトランザクショナル・スレッドT0の正しい処理を行うために、ロックの確認は不要である。また、トランザクションがすでに開始された後に非トランザクショナル・スレッドT1がロックを要求しようとする(そして、ロックのアドレスがロック記憶構造体30に取り込まれている場合でも、スレッドT0のトランザクションがロックを要求しようとしないので、スレッドT1はロックを首尾良く要求できる)場合でも、アドレスの競合により依然としてトランザクションの打切りがトリガされることになり、打切りが起こらずにT0がトランザクションの終了に達したときに、スレッドT1が依然としてロックを保持している場合は、トランザクションのコミットは延期/防止される。
【0044】
ロックのアドレスがロック記憶部30に割り当てられると、そのロックのアドレスは、アドレス追跡回路24によって追跡される必要がないので、他のスレッドによるそのアドレスへのアクセスが競合の検出をトリガすることはない。これにより、トランザクションの終了時にロックが確認されることになるので、打切りが不要になるため、トランザクションを中断することなく、他のスレッドによるロック変数への書込みが可能になる。
【0045】
図11に示すように、トランザクションがネストされ、その結果以前のトランザクション開始命令に対応するトランザクション終了命令が検出される前、且つ以前のトランザクションが依然として保留されており、打ち切られていないときに、別のトランザクション開始命令を受信することが可能である。ネスト深さレジスタ32は、トランザクションの現在のネスト深さを追跡して、トランザクションが開始されていない場合か、ただ1つのトランザクションだけが開始された場合か、又は前のトランザクション内でさらにネストされたトランザクションが開始された場合かを、区別することができる。図11に示すように、トランザクションがまだ開始されていない場合、ネスト深さは0となり得る。最初のトランザクション開始命令に応答して、ネスト深さを1に増加させることができる。さらにネストされたトランザクションが開始されると、ネスト深さを2に、さらに増加させることができる、などである。トランザクションをコミットすると、ネスト深さを減少させることができる。したがって、それぞれのネストされたトランザクションがコミットされると、すべてのトランザクションがコミットされてネスト深さが再び0に戻るまで、ネスト深さは徐々に戻される。
【0046】
実際には、ネストされたトランザクションごとに個別の復元状態のセットを維持する価値はないかもしれない。その代わりに、ハードウェアは、ネストされたどのトランザクションをも事実上無視し、単にネストされたセットのより大きな外側のトランザクションの一部としてネストされたトランザクションを扱うことができる。それにもかかわらず、コードが外側のトランザクション開始命令の後にプログラム・コードの一部に分岐する場合でも、分岐点に続くコードのセクションが、依然として確実にトランザクションとして扱われるようにするために、コードがネストされたトランザクションを定義している場合がある。したがって、場合によっては、HTMリソース20は、セットの内側のトランザクション(すなわち、ネスト深さがすでに1以上であるときにトランザクション開始命令が実行されるトランザクション)のトランザクション開始及び終了命令を事実上無視することができる。したがって、(ネスト深さが1のときに実行される)外側のトランザクションのトランザクション終了命令tcommitは、状態のコミット及び復元状態の破棄をトリガし、一方内側のトランザクションのトランザクション終了命令tcommitは、無視されることになる(ネスト深さが2以上のとき)。ネスト深さは、ネスト深さレジスタ32内で明示的に表す必要はなく、実際のネスト深さの数を示すバイナリ値以外の、ネスト深さを表す他のやり方があり得ることに留意されたい(たとえば、状態コードは、ネスト深さを表す可能性がある)。
【0047】
したがって、上記で論じたロック取込機能を備える場合、ネストされたセットの各トランザクション開始命令は、個別のロック変数の取込みをもたらすことができる。場合によっては、第2のトランザクション開始命令に関連するロック識別子は、すでに取り込まれたロック識別子と同じである可能性があり、この場合、ロック記憶構造体30は、同じロック識別子に対して別個のエントリを割り当てる必要がない。しかし、ロック識別子がすでに取り込まれたロック識別子と異なる場合、第2のロック識別子がロック記憶構造体30に割り当てられる。ネストされたセットの内側のトランザクションであるトランザクションに関連するトランザクション終了命令tcommitでは、動作は実行されない。ただし、外側のトランザクション終了命令では(ネストの深さが1のとき)、ロック記憶構造体に格納されている1つ、2つ、又はそれ以上のロック識別子が確認され、対応するロック変数のいずれかが、別のスレッドがロックを保持していることを示すかどうかを調べ、現在のスレッドについてのロック記憶構造体30で示されるすべてのロックが現在解放されている場合、トランザクション(どの内側のトランザクションをも含む)の結果がコミットされる。やはり、この仕組みにより、ネストされたトランザクションのセットの終了までロックの確認を延期することにより、性能向上が可能となり、トランザクションの初めにロックが保持されている場合でも、トランザクションを前に進めることができる。
【0048】
図12は、トランザクション開始命令の処理を示す流れ図である。ステップ100で、トランザクション開始命令が命令デコーダ8によってデコードされる。ステップ102で、デコーダは、トランザクション開始命令が所定のタイプのトランザクション開始命令であるかどうかを判断する。そうである場合、ステップ104で、命令デコーダ8は、処理ロジック4をトリガして、ロック記憶構造体30内のロック識別子を取り込むか、又は選択されたタイプの次の命令(たとえば次のロード命令)に応答して、ロック識別子の取込みをトリガするために状態をセットする、制御信号を生成する。トランザクション開始命令が所定のタイプではなかった場合、ステップ104は省略される。
【0049】
トランザクション開始命令のタイプに関係なく、ステップ106で、命令デコーダ8によって生成された制御信号はまた、処理ロジック4を制御して、アーキテクチャ・レジスタ6内に格納されている現在の値を復元状態記憶部に書き込むことによって、トランザクションの復元状態のセットを取り込む。場合によっては、復元状態記憶部28には、複数のスレッドに対応する2つ以上の相異なる復元状態のセットが含まれてもよく、それにより、取り込まれた復元状態は、異なるスレッドの復元状態の処置にまだ割り当てられていない領域に、割り当てられ得る。ステップ108で、トランザクション開始命令の後に続く命令に応答して、命令デコーダ8は、そうした命令の投機的実行を開始するように処理ロジック4を制御する、制御信号を生成する。アドレス追跡回路24は、後続の投機的に実行される命令によってアクセスされるアドレスの追跡を開始し、競合検出回路26は、アドレス追跡回路24で追跡されるアドレスと他のスレッドによってアクセスされるアドレスとの間の競合の確認を開始する。
【0050】
図13は、トランザクション終了命令の処理を示す流れ図である。ステップ120で、トランザクション終了命令が命令デコーダ8によってデコードされ、図13の後続のステップを実行するように処理ロジック4を制御するための制御信号が生成される。ステップ122で、ネスト深さレジスタ32が確認され、ネスト深さが1に等しいかどうかが判断される。1でない場合、現在のトランザクションはネストされたセットの内側のトランザクションであり、ステップ123で、トランザクション終了命令は無視される。ネスト深さが1の場合、トランザクション終了命令が実行され、ステップ124で、処理ロジック4は、現在のスレッドについて、取り込まれた任意のロック識別子がロック記憶構造体30に格納されているかどうかを判断する。格納されていない場合、ロックを確認する必要はなく(たとえば、元のトランザクション開始命令が、所定のタイプのトランザクション開始命令でなかった可能性がある)、それによりステップ126で、トランザクションで投機的に生成された結果がコミットされる。したがって、投機結果記憶回路22に格納されたいかなる結果も、データ・キャッシュ14又はメモリ16に書き込むことができる。また、アーキテクチャ・レジスタ6に格納されているどんな投機的な値も、非投機的になる(これを確実にするための変更は不要であり、そうではなくて、結果はもはや復元状態によって上書きされないので、結果は非投機的になる)。復元状態記憶部28内の現在のトランザクションに関連するどんな復元状態も、破棄されるか、又は後のトランザクションに関連する復元状態によって上書きできるよう利用可能にされ得る。
【0051】
ステップ124で、取り込まれた任意のロック識別子が、ロック記憶構造体30内に存在していた場合、ステップ127で、処理ロジック4又はロック確認エンジン34は、取り込まれたロックのいずれかが現在ロックされているかどうかを確認する。ロックされていない場合、やはりステップ126で、トランザクションの結果をコミットすることができる。ステップ127で、現在のスレッドの取り込まれたロック識別子のいずれかが、対応するリソースが別のスレッドによってロックされていることを示すロック変数を参照していると判断された場合、ステップ128で、処理ロジック4又はロック確認エンジン34は、トランザクションの結果のコミットを延期するため、ある期間待機する。ある期間待機した後、ステップ130で、再試行の数又は待機に費やされた期間が、閾値未満かどうかが判断され、閾値未満であれば、ステップ127で、取り込まれたロックのいずれかが現在ロックされているかどうかを確認する試みがもう一度行われ、すべてのロックが解除されている場合、ここでトランザクションの結果をコミットできる126。そうでない場合、システムは待機し続ける。ステップ130で、再試行の数又は待機期間が閾値に達した場合、ステップ132で、トランザクションを打ち切ることができる。或いは、待機の仕組みを実施するのではなく、取り込まれたロックのいずれかがステップ127でロックされていると判断される場合は、直接ステップ132に進むことにより、トランザクションを単に打ち切る方がより簡単であり得る。トランザクションが打ち切られた場合、ソフトウェアは、後でトランザクションを再スケジュールするか、又はロック・ベースの非トランザクショナル・モードを使用してトランザクションの実行を試みるかを判断することができる。
【0052】
図14は、使用することができるシミュレータの実施態様を示す。前述の実施例は、当該の技法をサポートする特定の処理ハードウェアを操作する装置及び方法の点から本発明を実現する一方で、本明細書に記載の実施例にしたがって、コンピュータ・プログラムの使用によって実現される、命令実行環境を提供することも可能である。かかるコンピュータ・プログラムは、ハードウェア・アーキテクチャのソフトウェア・ベースでの実施態様を提供する限り、シミュレータと呼ばれることが多い。シミュレータのコンピュータ・プログラムの種類には、エミュレータ、仮想マシン、モデル、及び動的バイナリ・トランスレータを含むバイナリ・トランスレータが含まれる。通常、シミュレータの実施態様は、ホスト・プロセッサ230上で実行することができ、任意選択で、ホスト・オペレーティング・システム220を実行し、シミュレータ・プログラム210をサポートする。いくつかの配置構成では、ハードウェア及び提供された命令実行環境、並びに/又は同じホスト・プロセッサ上に設けられた複数の別個の命令実行環境の間に、複数のシミュレーションの層があり得る。歴史的に、合理的な速度で実行するシミュレータの実施態様を提供するには強力なプロセッサが必要であったが、かかる手法は、互換性又は再利用性のために別のプロセッサでネイティブなコードを実行することが望まれる場合など、特定の状況で正当化され得る。たとえば、シミュレータの実施態様は、ホスト・プロセッサのハードウェアでサポートされていない追加の機能性を有する命令実行環境を提供するか、又は異なるハードウェア・アーキテクチャに通常関連する命令実行環境を提供することができる。シミュレーションの概要は、Robert Bedichek、「Some Efficient Architecture Simulation Techniques」、1990年冬、USENIXカンファレンス、53~63頁に提示されている。
【0053】
前に実施例を説明してきた限りにおいて、特定のハードウェア構成又は特徴を参照して、シミュレーションされた実施例で、好適なソフトウェア構成又は特徴により同等の機能性を提供することができる。たとえば、特定の回路は、シミュレーションされた実施例では、コンピュータ・プログラム・ロジックとして実現することができる。同様に、レジスタ又はキャッシュなどのメモリ・ハードウェアは、ソフトウェア・データ構造としてシミュレーションされた実施例で実現することができる。前に説明した実施例で参照された1つ又は複数のハードウェア要素がホスト・ハードウェア(たとえば、ホスト・プロセッサ230)上に存在する配置構成では、いくつかのシミュレーションされた実施例は、好適な場合、ホスト・ハードウェアを使用することができる。
【0054】
シミュレータ・プログラム210は、コンピュータ可読の記憶媒体(非一時的媒体であり得る)に格納することができ、シミュレータ・プログラム210によってモデル化されているハードウェア・アーキテクチャのアプリケーション・プログラム・インターフェースと同じ、プログラム・インターフェース(命令実行環境)を、ターゲット・コード200(アプリケーション、オペレーティング・システム及びハイパーバイザが含まれ得る)に提供する。したがって、上記の所定のタイプのトランザクション開始/終了命令を含むターゲット・コード200のプログラム命令は、シミュレータ・プログラム210を使用して命令実行環境内から実行されてもよく、その結果、上記で論じた装置2のハードウェアの特徴を実際には備えていないホスト・コンピュータ230が、こうした特徴をエミュレーションできる。
【0055】
本出願では、「...するよう構成される」という用語は、装置の要素が、定義された操作を実行できる構成を備えることを意味するように使用される。これに関連して、「構成」とは、ハードウェア又はソフトウェアの相互接続の配置構成又は態様を意味する。たとえば、装置は、定義された操作を提供する専用のハードウェアを備えてもよく、又はプロセッサ若しくは他の処理デバイスを、機能を実行するようにプログラムしてもよい。「するよう構成される」は、定義された操作を提供するために、装置要素をいかなる形であれ変更する必要があることを示唆するものではない。
【0056】
本発明の例示的な実施例を、添付図面を参照して本明細書で詳細に説明してきたが、本発明はそれらの正確な実施例に限定されるものではなく、当業者によってその中に、添付の特許請求の範囲によって定義される本発明の範囲及び精神から逸脱することなく、様々な変更及び修正を行うことができることを理解されたい。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14