(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2023-09-14
(54)【発明の名称】データ処理装置及び方法におけるコア内並列化
(51)【国際特許分類】
G06F 9/38 20180101AFI20230907BHJP
【FI】
G06F9/38 370A
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2023512132
(86)(22)【出願日】2021-08-26
(85)【翻訳文提出日】2023-02-17
(86)【国際出願番号】 GB2021052211
(87)【国際公開番号】W WO2022049367
(87)【国際公開日】2022-03-10
(32)【優先日】2020-09-01
(33)【優先権主張国・地域又は機関】GB
(32)【優先日】2020-09-02
(33)【優先権主張国・地域又は機関】GB
(81)【指定国・地域】
(71)【出願人】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】ザイディ,サイード アリ ムスタファ
(72)【発明者】
【氏名】ガブリエリ,ジャコモ
【テーマコード(参考)】
5B013
【Fターム(参考)】
5B013BB07
5B013DD01
(57)【要約】
データを処理するためのデータ処理装置及び方法が開示される。データ処理装置は、複数のマイクロスレッドの処理動作を実行するマルチスレッド処理回路を備え、各マイクロスレッドは、アーキテクチャ状態を定義する対応する実行コンテキストにおいて動作する。スレッド制御回路は、処理動作に関連する性能メトリックを示す実行時データを収集する。デコーダ回路は、第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答して、デタッチ制御信号をスレッド制御回路に提供し、デタッチ命令はアドレスを指定する。実行時データが並列化基準を満たすとき、スレッド制御回路は、デタッチ制御信号に応答して、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成し、命令の第2のマイクロスレッドは、アドレスから開始する命令の第1のマイクロスレッドの命令のサブセットを含む。
【選択図】
図1
【特許請求の範囲】
【請求項1】
データ処理装置であって、
複数のマイクロスレッドの処理動作を実行するマルチスレッド処理回路であって、各マイクロスレッドがアーキテクチャ状態を定義する対応する実行コンテキストにおいて動作する、マルチスレッド処理回路と、
前記処理動作に関連する性能メトリックを示す実行時データを収集するスレッド制御回路と、
第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答して、デタッチ制御信号を前記スレッド制御回路に提供するデコーダ回路であって、前記デタッチ命令がアドレスを指定する、デコーダ回路と、
を備え、
前記実行時データが並列化基準を満たすとき、前記スレッド制御回路は、前記デタッチ制御信号に応答して、前記第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成し、命令の前記第2のマイクロスレッドは、前記アドレスから開始する命令の前記第1のマイクロスレッドの命令のサブセットを含む、データ処理装置。
【請求項2】
前記アドレスは第1のアドレスであり、命令の前記サブセットは命令の第1のサブセットであり、前記デタッチ命令が第2のアドレスを更に含み、
前記実行時データが前記並列化基準を満たすとき、前記スレッド制御回路は、前記デタッチ制御信号に応答して、命令の前記第1のマイクロスレッドに、前記第2のアドレスで開始する命令の第2のサブセットを実行させる、請求項1に記載のデータ処理装置。
【請求項3】
命令の前記第1のサブセット及び命令の前記第2のサブセットは、動的実行中に重複しない命令の前記第1のマイクロスレッドのサブセットである、請求項2に記載のデータ処理装置。
【請求項4】
前記実行時データが前記並列化基準を満たさないとき、前記スレッド制御回路は、前記デタッチ命令を、無条件分岐命令及び無動作のうちの1つとして解釈するように適合される、請求項1~3のいずれか一項に記載のデータ処理装置。
【請求項5】
前記デコーダ回路は、命令の特定のマイクロスレッド内の再アタッチ命令に応答して、前記スレッド制御回路に再アタッチ制御信号を提供し、
前記スレッド制御回路は、前記再アタッチ制御信号に応答して、前記命令の特定のマイクロスレッドを終了させる、請求項1~4のいずれか一項に記載のデータ処理装置。
【請求項6】
前記スレッド制御回路は、命令の前記特定のマイクロスレッドと命令の別のマイクロスレッドとの間のデータハザードの発生に応答して、前記特定のマイクロスレッドの不成功終了を示す、請求項5に記載のデータ処理装置。
【請求項7】
前記スレッド制御回路は、前記不成功終了の指示に応答して、命令の前記特定のマイクロスレッドを再スポーンする、請求項6に記載のデータ処理装置。
【請求項8】
前記実行時データが前記並列化基準を満たさないとき、前記スレッド制御回路は、前記再アタッチ命令を、無条件分岐命令及び無動作のうちの1つとして解釈するように適合される、請求項5~7のいずれか一項に記載のデータ処理装置。
【請求項9】
各マイクロスレッドは、エポック識別子によって識別される、請求項5~8のいずれか一項に記載のデータ処理装置。
【請求項10】
命令の前記特定マイクロスレッドは、命令の前記第1のマイクロスレッドであり、
前記デタッチ命令に応答して、前記スレッド制御回路は、命令の前記第2のマイクロスレッドに新しいエポック識別子を割り当てるように適合される、請求項5~9のいずれか一項に記載のデータ処理装置。
【請求項11】
命令の前記特定のマイクロスレッドは、命令の前記第2のマイクロスレッドであり、
前記デタッチ命令の前に、前記第1のマイクロスレッドは第1のエポック識別子を割り当てられており、前記デタッチ命令に応答して、前記スレッド制御回路は、命令の前記第1のマイクロスレッドに新しいエポック識別子を割り当て、命令の前記第2のマイクロスレッドに前記第1のエポック識別子を割り当てるように適合される、請求項5~9のいずれか一項に記載のデータ処理装置。
【請求項12】
前記デタッチ命令は領域識別子を指定し、少なくとも1つの後続の再アタッチ命令は前記領域識別子を指定する、請求項5~11のいずれか一項に記載のデータ処理装置。
【請求項13】
前記領域識別子は、第1の領域識別子であり、後続のデタッチ命令は、第2の領域識別子を指定し、後続の再アタッチ命令は、前記第2の領域識別子を指定し、
前記エポック識別子は、外側エポック識別子及び内側エポック識別子を含み、
前記後続のデタッチ命令及び前記後続の再アタッチ命令が、プログラム順序において前記デタッチ命令と前記再アタッチ命令との間にある場合、前記外側エポック識別子は前記デタッチ命令に関連付けて割り当てられ、前記内側エポック識別子は前記後続のデタッチ命令に関連付けて割り当てられる、請求項12に記載のデータ処理装置。
【請求項14】
前記実行時データは、第1の実行時データであり、前記性能メトリックは、前記第1の領域識別子に関連付けられた第1の性能メトリックであり、
前記スレッド制御回路は、前記第2の領域識別子に関連付けられた第2の性能メトリックを示す第2の実行時データを収集するように適合される、請求項13に記載のデータ処理装置。
【請求項15】
現在アクティブなマイクロスレッドの数が、サポートされるマイクロスレッドの最大数に等しいとき、前記データ処理装置は、前記デタッチ命令を、無条件分岐命令及び無動作のうちの1つとして扱うように構成される、請求項1~14のいずれか一項に記載のデータ処理装置。
【請求項16】
前記デコーダ回路は、最も新しいエポック識別子を有する命令のマイクロスレッド内の同期命令に応答して、より古いエポック識別子及び同じ領域識別子を有するすべての生成されたマイクロスレッドが終了するまで、命令の最も新しいマイクロスレッド内の後続の命令の実行を一時停止する、請求項12~15のいずれか一項に記載のデータ処理装置。
【請求項17】
前記実行時データが前記並列化基準を満たさないとき、前記スレッド制御回路は、前記同期命令を無動作として解釈するように適合される、請求項16に記載のデータ処理装置。
【請求項18】
前記デコーダ回路は、前記最も新しいエポック識別子を有する命令のマイクロスレッド内の前記同期命令に更に応答して、より古いエポック識別子及び異なる領域識別子を有するすべての生成されたマイクロスレッドが終了するまで、命令の前記最も新しいマイクロスレッド内の後続の命令の実行を一時停止する、請求項16又は17に記載のデータ処理装置。
【請求項19】
請求項5に従属するとき、スケジューリング係数nに基づいて、前記スレッド制御回路は、前記デタッチ命令の発生及び前記再アタッチ命令の発生を、無条件分岐命令及び無動作のうちの1つとして解釈するように適合される、請求項1~18のいずれ一項に記載のデータ処理装置。
【請求項20】
前記スレッド制御回路は、前記デタッチ命令のn番目ごとの発生に応答して命令の前記第2のマイクロスレッドを生成し、前記デタッチ命令の他のすべての発生を、前記無条件分岐命令及び前記無動作のうちの1つとして解釈するように適合され、
前記スレッド制御回路は、前記再アタッチ命令の(n-1)番目ごとの発生に応答して前記特定のマイクロスレッドの命令を終了し、前記再アタッチ命令の他のすべての発生を、前記無条件分岐命令及び前記無動作のうちの1つとして解釈するように適合される、請求項19に記載のデータ処理装置。
【請求項21】
前記スケジューリング係数nは、前記実行時データに基づく、請求項19又は20に記載のデータ処理装置。
【請求項22】
前記デコーダ回路は、代替アドレスを指定する前記デタッチ命令に更に応答し、
nが1より大きいとき、前記スレッド制御回路は、前記代替アドレスから前記第2の実行コンテキストにおける実行を開始するように構成される、請求項19~21のいずれか一項に記載のデータ処理装置。
【請求項23】
前記デコーダ回路は、代替アドレスを指定する前記デタッチ命令に更に応答し、
nが1よりも大きいとき、前記スレッド制御回路は、命令の前記第1のマイクロスレッドに前記代替アドレスからの実行を継続させるように構成される、請求項19~21のいずれか一項に記載のデータ処理装置。
【請求項24】
前記デコーダ回路は、追加のメタデータを指定する前記デタッチ命令に更に応答し、前記追加のメタデータは、
実行時に発生するマイクロスレッド間の動的依存関係の尤度を表す並列化信頼レベルと、
命令の前記第2のマイクロスレッドに含まれる推定数の命令を提供する並列化価値レベルと、
実行時にマイクロスレッド間で発生することが予想される動的依存関係の種類の指示と、
のうちの少なくとも1つを含む、請求項1~23のいずれか一項に記載のデータ処理装置。
【請求項25】
前記性能メトリックは、
サイクルごとに実行される命令の平均数と、
前記マルチスレッド処理回路内のリソースの平均占有率と、
検出された書き込み競合後のメモリ読み取りの数と、
命令のマイクロスレッドごとに実行される命令の数と、
のうちの少なくとも1つを含む、請求項1~24のいずれか一項に記載のデータ処理装置。
【請求項26】
物理レジスタのセットと、
アーキテクチャレジスタのセットを前記物理レジスタのセットのサブセットにマッピングするレジスタリネーム回路と、
を更に備え、前記レジスタリネーム回路は、アーキテクチャレジスタの第1のセットを前記第1の実行コンテキストに関連付けられた物理レジスタの第1のセットにマッピングし、前記レジスタリネーム回路は、アーキテクチャレジスタの第2のセットを前記第2の実行コンテキストに関連付けられた物理レジスタの第2のセットにマッピングする、請求項1~25のいずれか一項に記載のデータ処理装置。
【請求項27】
前記物理レジスタの前記第1のセットの第1のサブセット及び前記物理レジスタの前記第2のセットの第1のサブセットは、レジスタの同じセットであり、
前記物理レジスタの前記第1のセットの第2のサブセット及び前記物理レジスタの前記第2のセットの第2のサブセットは、レジスタの異なるセットである、請求項26に記載のデータ処理装置。
【請求項28】
データ処理方法であって、
マルチスレッド処理回路上のアーキテクチャ状態を定義する対応する実行コンテキストにおいて複数のマイクロスレッドの処理動作に関連する性能メトリックを示す実行時データを収集することと、
第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答してデタッチ制御信号を生成することであって、前記デタッチ命令はアドレスを指定する、ことと、
前記デタッチ制御信号に応答して、かつ前記実行時データが並列化基準を満たすときに、前記第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成することであって、命令の前記第2のマイクロスレッドは、前記アドレスから開始する命令の前記第1のマイクロスレッドの命令のサブセットを含む、ことと、
を含む、データ処理方法。
【請求項29】
データ処理装置であって、
マルチスレッド処理回路上のアーキテクチャ状態を定義する対応する実行コンテキストにおいて複数のマイクロスレッドの処理動作に関連する性能メトリックを示す実行時データを収集するための手段と、
第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答してデタッチ制御信号を生成するための手段であって、前記デタッチ命令はアドレスを指定する、手段と、
前記デタッチ制御信号に応答して、かつ前記実行時データが並列化基準を満たすときに、前記第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成するための手段であって、命令の前記第2のマイクロスレッドは、前記アドレスにおいて開始する前記命令の第1のマイクロスレッドの命令のサブセットを含む、手段と、
を含む、データ処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、データ処理装置におけるコードのコア内並列化に関する。
【0002】
順次命令の並列化は、データ処理装置内の順次性能のスケーリングを改善する手段を提供する。現代の汎用CPUプロセッサで使用される典型的なアウトオブオーダ実行は、順次命令ストリームを制限されたデータフロー実行モデルに変換するために、細粒度命令レベル並列処理に依存する。しかしながら、性能利得は、アウトオブオーダプロセッサの命令ウィンドウサイズの制約内に制限される。この機構は、順次命令スキーム内の粗粒度タスクレベル並列処理の機会を識別し、利用することができない。タスクレベル並列処理は、順次コードの性能を改善することができる。しかしながら、タスクレベル並列処理は、典型的には、並列処理の機会を明示的に公開するために、コードの実行時性能の広範なプロファイリングに基づいて、コードを書き換えるためのプログラマの介入を必要とする。代替的に、コンパイラサポートが存在する場合、タスクレベル並列化を利用するコードは、最適化された順次コードと比較して著しいオーバーヘッドを招く可能性があり、それによって、2つの異なるコードバージョン、すなわち、タスクレベル並列化がサポートされるときに使用するためのコードバージョンと、順次実行のためのコードバージョンとを必要とする。これらの理由により、ソフトウェアに大きく依存する従来のマルチコアプロセッサに依存するタスクレベル並列化への典型的なアプローチは、不十分な性能スケーリング及び不十分な効率を呈する傾向がある。
【0003】
本開示の少なくとも1つの実施形態は、データ処理装置を提供し、データ処理装置は、複数のマイクロスレッドの処理動作を実行するマルチスレッド処理回路であって、各マイクロスレッドがアーキテクチャ状態を定義する対応する実行コンテキストにおいて動作する、マルチスレッド処理回路と、処理動作に関連する性能メトリックを示す実行時データを収集するスレッド制御回路と、第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答して、デタッチ制御信号をスレッド制御回路に提供するデコーダ回路であって、デタッチ命令がアドレスを指定する、デコーダ回路とを備え、実行時データが並列化基準を満たすとき、スレッド制御回路は、デタッチ制御信号に応答して、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成し、命令の第2のマイクロスレッドは、アドレスから開始する命令の第1のマイクロスレッドの命令のサブセットを含む。
【0004】
本開示の少なくとも1つの実施形態は、データ処理方法を提供し、データ処理方法は、マルチスレッド処理回路上のアーキテクチャ状態を定義する対応する実行コンテキストにおいて複数のマイクロスレッドの処理動作に関連する性能メトリックを示す実行時データを収集することと、第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答してデタッチ制御信号を生成することであって、デタッチ命令はアドレスを指定する、ことと、デタッチ制御信号に応答して、実行時データが並列化基準を満たす場合に、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成することであって、命令の第2のマイクロスレッドは、アドレスから開始する命令の第1のマイクロスレッドの命令のサブセットを含む、こととを含む。
【0005】
本開示の少なくとも1つの実施形態は、データ処理装置を提供し、データ処理装置は、マルチスレッド処理回路上のアーキテクチャ状態を定義する対応する実行コンテキストにおいて複数のマイクロスレッドの処理動作に関連する性能メトリックを示す実行時データを収集するための手段と第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答してデタッチ制御信号を生成するための手段であって、デタッチ命令はアドレスを指定する、手段と、デタッチ制御信号に応答して、実行時データが並列化基準を満たす場合に、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成するための手段であって、命令の第2のマイクロスレッドは、アドレスから開始する命令の第1のマイクロスレッドの命令のサブセットを含む、手段とを含む。
【図面の簡単な説明】
【0006】
添付図面に示されるそれらの実施形態を参照して、あくまで一例として本技法を更に説明する。
【
図1】本技法の様々な実施例を具体化し得るデータ処理装置を概略的に示す。
【
図2】本技法の様様々な実施例を具体化し得るスレッド制御回路の動作の詳細を概略的に示す。
【
図3A】本技法の様々な実施例を具体化し得るエポック識別子の割り当ての詳細を概略的に示す。
【
図3B】本技法の様々な実施例を具体化し得るエポック識別子の割り当ての詳細を概略的に示す。
【
図4】本技法の様々な実施例を具体化し得るマイクロスレッド実行の詳細を概略的に示す。
【
図5】本技法の様々な実施例を具体化し得るマイクロスレッド実行の詳細を概略的に示す。
【
図6】本技法の様々な実施例を具体化し得るマイクロスレッド実行の詳細を概略的に示す。
【
図7】本技法の様々な実施例を具体化し得るマイクロスレッド実行の詳細を概略的に示す。
【
図8】本技法の様々な実施例を具体化し得るマイクロスレッド実行の詳細を概略的に示す。
【
図9】本技法の様々な実施例を具体化し得るマイクロスレッド実行の詳細を概略的に示す。
【
図10】本発明のいくつかの実施例によって実行される一連の工程を概略的に示す。
【0007】
少なくともいくつかの実施形態は、データ処理装置を提供し、データ処理装置は、複数のマイクロスレッドの処理動作を実行するマルチスレッド処理回路であって、各マイクロスレッドがアーキテクチャ状態を定義する対応する実行コンテキストにおいて動作する、マルチスレッド処理回路と、処理動作に関連する性能メトリックを示す実行時データを収集するスレッド制御回路と、第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答して、デタッチ制御信号をスレッド制御回路に提供するデコーダ回路であって、デタッチ命令がアドレスを指定する、デコーダ回路とを備え、実行時データが並列化基準を満たすとき、スレッド制御回路は、デタッチ制御信号に応答して、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成し、命令の第2のマイクロスレッドは、アドレスから開始する命令の第1のマイクロスレッドの命令のサブセットを含む。
【0008】
マルチスレッド処理回路のスレッド制御回路は、各々が対応する実行コンテキストを有する複数のマイクロスレッドの実行を維持及び制御する。実行コンテキストは、利用可能な物理レジスタの対応するサブセットにマッピングされ得るいくつかのアーキテクチャレジスタと、いくつかの制御レジスタ及びステータスレジスタと、実行コンテキストの現在実行中の命令の一連の命令内の位置を示すプログラムカウンタ値とを含むアーキテクチャ状態を定義する。マルチスレッドデータ処理装置は、複数の並列パイプライン上で複数のマイクロスレッドのうちのいくつかを並列に実行するように構成されてもよく、更に又は代わりに、複数のマイクロスレッドのうちの異なるマイクロスレッドが順次実行されることを可能にする時間インターリーブ技法を使用してもよく、例えば、1つのスレッドがデータがフェッチされるのを待っているとき、異なるスレッドがデータ処理装置のリソースを利用することができる。スレッド制御回路は、マイクロスレッドの処理動作に関連する性能メトリックを示す実行時データを収集するように更に構成される。特に、以下で更に説明するように、性能メトリックは、現在実行中の命令が並列性から利益を得ることができるかどうかの指示を提供する。
【0009】
データ処理装置は、暗黙的タスク並列化のためのいくつかのヒントベース命令に応答し得るデコーダ回路を更に備える。特に、デコーダ回路は、スレッド制御回路に渡されるデタッチ制御信号をデコーダ回路に生成させるデタッチ命令に応答する。デタッチ命令は、命令の第1のマイクロスレッド内の命令のセットが並列実行から利益を得ることができることをデータ処理装置に示す、プログラマ又はコンパイラによって挿入され得るヒントベースの命令である。ヒントベース命令に作用するかどうかに関連する判定は、デタッチ制御信号及び性能インジケータに基づいて、スレッド制御回路によって実行時に実行される。例えば、デコード回路は、命令のセットを並列に実行することに利益がないことを性能メトリックが示す時点でデタッチ命令をデコードしてもよい。そのような状況では、スレッド制御回路は、命令のセットを順次実行し続けることができる。一方、デコード回路がデタッチ命令をデコードし、性能メトリックが命令のセットが並列化から利益を得ることを示す場合、スレッド制御回路は、命令の第1のマイクロスレッドからその実行コンテキストを少なくとも部分的に継承する命令の第2のマイクロスレッドを生成してもよい。デタッチ命令は更に、命令の第2のマイクロスレッドの開始点を示す命令のアドレスを指定する。このようにして、命令の第1のマイクロスレッド及び命令の第2のマイクロスレッドは、そのような並列化が、デタッチ命令がなければ命令の第1のマイクロスレッドにおいて完全に実行されたであろう命令の実行に有益であることを性能メトリックが示すとき、並列に実行することができる。
【0010】
ヒントベースの手法に依存することによって、プログラマ又はコンパイラが、並列化が利益をもたらす可能性があるコードのセクションの周りに低コストのヒントを挿入することができると期待される。しかしながら、任意の特定の組のヒントにわたる並列化が有益であるかどうかを実行時に判定することは、マイクロアーキテクチャの仕事である。次に、これは、収益性を評価するために過度に複雑な分析を実行する必要がなく、同じ機能の並列化されたコピー及び順次コピーの両方を含むファットバイナリを生成する必要もないので、コンパイラの負担を軽減する。プログラマ又はコンパイラは、マイクロアーキテクチャが実行時により情報を得たうえでの判定を行うことができることを信頼して、特定の領域に対する並列化の利益性について低い信頼度を有する場合であっても、これらのヒントを便宜的に挿入することができる。ヒントベース命令の挿入がコンパイラに残されると、コンパイラはより扱いやすいジョブを有するため、スレッドレベル投機から利益を得ることができるように、プログラマがコードを書き換える必要がなくなる。したがって、並列化ヒントを挿入するときに、積極的なコンパイラ分析又はプログラマ支援はもはや必要ない。
【0011】
少なくともいくつかの実施形態では、アドレスは第1のアドレスであり、命令のサブセットは命令の第1のサブセットであり、デタッチ命令は第2のアドレスを更に含み、実行時データが並列化基準を満たすとき、スレッド制御回路は、デタッチ制御信号に応答して、命令の第1のマイクロスレッドに、第2のアドレスから開始する命令の第2のサブセットを実行させる。このようにして、ヒントベースのデタッチ命令は、命令の第1のサブセット及び命令の第2のサブセットを、それぞれがそれ自体の実行コンテキストにおいて実行される別個のマイクロスレッドのセットの一部として実行させるために使用され得る。命令の第1のサブセットは、デタッチ命令に含まれる第1のアドレスによって定義され、命令の第2のサブセットは、デタッチ命令に含まれる第2のアドレスによって定義される。命令の第1及び第2のサブセットは、様々に定義することができる。具体的には、命令の第1及び第2のサブセットは、命令の異なるサブセットに対応することができる。例えば、命令の第2のサブセットが、コンパイラによって生成される静的バイナリ内の命令の第1のセットの前又は後に順次発生し、実行時データが、これらの2つのサブセットが有利に並列に実行され得ることを識別する場合、スレッド制御回路は、命令の第2のサブセットを実行するための第1のマイクロスレッドの実行環境に基づいて、第2の実行環境を生成することができる。
【0012】
少なくともいくつかの実施形態では、命令の第1のサブセット及び命令の第2のサブセットは、動的実行中に重複しない命令の第1のマイクロスレッドのサブセットである。第1のマイクロスレッド及び第2のマイクロスレッドによって実行される命令は、コンパイラによって生成される静的バイナリ内の同じ命令に対応し得るが、それらは、動的実行中の重複しない命令に対応する。例えば、命令の第1のサブセットは、第1の値をとるループインデックスによって定義されるループの第1の反復に対応することができ、命令の第2のサブセットは、第2の値をとるループインデックスによって定義されるループの第2の反復に対応することができる。このようにして、スレッド制御回路は、ループが並列実行から利益を得るかどうかを実行時に決定することができ、そうである場合、並列実行を利用するために追加のマイクロスレッドを発生させることができる。
【0013】
少なくともいくつかの実施形態では、実行時データが並列化基準を満たさないとき、スレッド制御回路は、デタッチ命令を、無条件分岐命令及び無動作のうちの1つとして解釈するように適合される。スレッド制御回路がデタッチ命令を無動作として解釈すると、命令実行は順次次の命令に移動する。代替的に、スレッド制御回路は、プログラム実行が分岐ターゲットから順次継続するように、デタッチ命令を無条件分岐命令として扱ってもよい。このようにして、プログラム実行は、デタッチ命令が発生しなかったかのように継続するように構成することができ、デタッチ命令がコンパイラ又はプログラマによって挿入されなかった場合に発生したはずの命令からプログラム実行が継続する。
【0014】
少なくともいくつかの実施形態では、デコーダ回路は、命令の特定のマイクロスレッド内の再アタッチ命令に応答して、再アタッチ制御信号をスレッド制御回路に提供し、スレッド制御回路は、再アタッチ制御信号に応答して、命令の特定のマイクロスレッドを終了させる。このようにして、命令の特定のマイクロスレッドの一部として実行されることによって並列化から利益を得ることができる命令のブロックは、命令の特定のマイクロスレッドが開始することができる点を示すデタッチ命令と、命令の特定のマイクロスレッドが終了する点を示す再アタッチ命令との間に命令のブロックを配置することによって境界を定めることができる。再アタッチ命令が発生する特定のマイクロスレッドは限定されず、命令の第1のマイクロスレッド又は命令の第2のマイクロスレッドのいずれかであり得る。再アタッチ命令が第1のマイクロスレッドにおいて発生する場合、実行は命令の第2のマイクロスレッドにおいて継続し得る。代替的に、再アタッチ命令が第2のマイクロスレッドにおいて発生する場合、実行は、命令の第1のマイクロスレッドにおいて継続し得る。
【0015】
少なくともいくつかの実施形態では、スレッド制御回路は、命令の特定のマイクロスレッドと命令の別のマイクロスレッドとの間のデータハザードの発生に応答して、特定のマイクロスレッドの不成功終了を示す。並列化は、ヒントベースの命令と、並列化が有益であり得る実行時データからの指示との組合せに基づくため、予期せぬデータハザードが1つ以上のスレッドにおいて発生し得る可能性がある。特に、並列実行が有益であることが識別されたとき、特定のマイクロスレッドは投機的に実行しており、再アタッチ命令を実行すると正常に終了することができ、これは、実行中にメモリハザードが発生しておらず、特定のマイクロスレッドが最終的にコミットできることを示す。しかしながら、特定のマイクロスレッドは、潜在的なハザード、例えば、リードアフターライトハザードなどのメモリ依存違反、又は投機的状態(及び潜在的に特定のマイクロスレッドに関連付けられた他のマイクロスレッドのもの)のフラッシュを引き起こす例外若しくは割込みイベントの発生が検出された場合、正常に終了しない可能性がある。このようにして、特定のマイクロスレッドの投機的実行中に発生するハザードを回避することができる。
【0016】
少なくともいくつかの実施形態では、スレッド制御回路は、不首尾の終了の指示に応答して、命令の特定のマイクロスレッドを再生成する。特定のマイクロスレッドの再生成は、特定のマイクロスレッドが正常に終了したと判定することができるまで、既知の正しい、より投機的でない、又は非投機的な状態からのデタッチ命令の再実行を必要とする場合がある。
【0017】
少なくともいくつかの実施形態では、実行時データが並列化基準を満たさないとき、スレッド制御回路は、再アタッチ命令を、無条件分岐命令及び無動作のうちの1つとして解釈するように適合される。スレッド制御回路が再アタッチ命令を無動作として解釈すると、命令実行は順次次の命令に移動する。代替として、スレッド制御回路は、プログラム実行が分岐ターゲットから順次継続するように、再アタッチ命令を無条件分岐命令として扱ってもよい。このようにして、プログラム実行は、再アタッチ命令が発生しなかったかのように継続するように構成することができ、再アタッチ命令がコンパイラ又はプログラマによって挿入されなかった場合に発生したはずの命令からプログラム実行が継続する。
【0018】
少なくともいくつかの実施形態において、各マイクロスレッドは、エポック識別子によって識別される。スレッド制御回路は、元のプログラムの順次セマンティクスを追跡しなければならない。したがって、任意の所与の時間において、エポック識別子は、マイクロスレッド間の総実行順序を追跡するために使用される。新しいマイクロスレッドが生成されるとき、新しいエポック識別子が生成されなければならない。エポック識別子の処理を実用的にするために、いくつかの実施形態では、エポック識別子は循環的に処理される。スレッド制御回路は、新しいマイクロスレッドが生成される際にエポック識別子を昇順で割り当て、最大のサポートされたエポック識別子値に到達するとラップアラウンドする。このスキームは、(最も古い投機的マイクロスレッドに割り当てられた)最も前に割り当てられたエポック識別子と、(最も新しい投機的マイクロスレッドに割り当てられた)直近に割り当てられたエポック識別子とをそれぞれ格納する2つのカウンタを用いて効率的に実施することができる。この簡略化が可能であるのは、マイクロスレッドの状態がコミットされ、すなわち、順次セマンティクスを保存するために、最も古い投機的マイクロスレッドから最も新しい投機的マイクロスレッドへのエポック識別子の順序でアーキテクチャ状態にマージされ、したがってエポック識別子が順序通りに解放されるからである。
【0019】
少なくともいくつかの実施形態では、命令の特定のマイクロスレッドは、命令の第1のマイクロスレッドであり、デタッチ命令に応答して、スレッド制御回路は、命令の第2のマイクロスレッドに新しいエポック識別子を割り当てるように適合される。このようにして、デタッチ命令の実行後、実行時データが並列化基準を満たすとき、命令の第1のマイクロスレッドは、その現在のエポック識別子を保持し、再アタッチ命令に到達するまでいくつかの命令を実行する。命令の第1のマイクロスレッドが、成功裏に、すなわち、ハザード又は割込みの識別なしに、再アタッチ命令に到達したとき、命令の第1のマイクロスレッドは、アーキテクチャ状態にコミットし得る。更に、デタッチ命令が実行されると、命令の第2のマイクロスレッドが生成され、新しいエポック識別子が割り当てられる。いくつかの実施形態では、命令の第2のマイクロスレッドは、上記で説明された機構を使用して第3のマイクロスレッドを更に生成させるデタッチ命令を含み得る。このようにして、例えば、ループ本体の反復ごとに新しいスレッドが生成されるループを並列化することができる。ループ反復の数が少ない場合、各マイクロスレッドがループ本体における命令の実行のために使用され得るので、このアプローチは有利であり得る。
【0020】
少なくともいくつかの実施形態では、命令の特定のマイクロスレッドは、命令の第2のマイクロスレッドであり、デタッチ命令の前に、第1のマイクロスレッドは、第1のエポック識別子を割り当てられ、デタッチ命令に応答して、スレッド制御回路は、命令の第1のマイクロスレッドに新しいエポック識別子を割り当て、命令の第2のマイクロスレッドに第1のエポック識別子を割り当てるように適合される。このようにして、デタッチ命令の実行後、実行時データが並列化基準を満たすとき、命令の第2のマイクロスレッドが生成され、命令の第1のマイクロスレッドのエポック識別子を継承し、新しいエポック識別子が生成され、命令の第1のマイクロスレッドに割り当てられる。命令の第2のマイクロスレッドが、成功裏に、すなわち、ハザード又は割込みの識別なしに、再アタッチ命令に到達したとき、命令の第2のマイクロスレッドは、アーキテクチャ状態にコミットし得る。いくつかの実施形態では、命令の第1のマイクロスレッドは、上記で説明された機構を使用して第3のマイクロスレッドを更に生成させるデタッチ命令を含み得る。このようにして、例えば、ループを並列化することができ、命令の第1のマイクロスレッドのマイクロスレッドは、ループの各反復を処理するために命令の別個のマイクロスレッドを生成する。このアプローチは、後続のスレッドを順次生成する各新しいスレッドに関連する任意の生成オーバーヘッドを待つ必要なく、命令の第1のマイクロスレッドによって複数のマイクロスレッドを迅速に生成することができるため、有利である。
【0021】
少なくともいくつかの実施形態では、デタッチ命令は領域識別子を指定し、少なくとも1つの後続の再アタッチ命令は領域識別子を指定する。このようにして、デコード回路は、どの再アタッチ-デタッチ命令対が互いに対応するかを識別するためにスレッド制御回路が使用することができる制御信号を生成することができる。特に、これにより、プログラマ又はコンパイラは、ネストされたヒントベースの再アタッチ-デタッチの対を挿入することが可能になり、スレッド制御回路がプログラムの順次セマンティクスを保存することが可能になる。
【0022】
少なくともいくつかの実施形態では、領域識別子は第1の領域識別子であり、後続のデタッチ命令は第2の領域識別子を指定し、後続の再アタッチ命令は第2の領域識別子を指定し、エポック識別子は外側エポック識別子及び内側エポック識別子を含み、後続のデタッチ命令及び後続の再アタッチ命令がプログラム順序でデタッチ命令と再アタッチ命令との間にあるとき、外側エポック識別子はデタッチ命令に関連して割り当てられ、内側エポック識別子は後続のデタッチ命令に関連して割り当てられる。エポック識別子を、外側再アタッチ及びデタッチ命令に関連付けられた外側エポック識別子と、内側再アタッチ及びデタッチ命令に関連付けられた内側エポック識別子とに分割することによって、総プログラム順序をエポック識別子に基づいて維持することができる。本開示が外側エポック識別子及び内側エポック識別子に限定されないこと、並びに任意の数のネストされたエポック識別子が定義され、ネストされたデタッチ命令及び再アタッチ命令の対応する数のセットに割り当てられ得ることは、当業者には容易に明らかであろう。
【0023】
いくつかの実施形態では、実行時データは、第1の実行時データであり、性能メトリックは、第1の領域識別子に関連付けられた第1の性能メトリックであり、スレッド制御回路は、第2の領域識別子に関連付けられた第2の性能メトリックを示す第2の実行時データを収集するように適合される。このようにして、スレッド制御回路は、特定の領域識別子について、その領域識別子に関連付けられた新しいマイクロスレッドをスレッド制御回路が生成することが有益であるかどうか、又はその領域識別子に関連付けられたヒントベースの並列化命令を無視することがより有益であるかどうかを判定することができる。例えば、スレッド制御回路は、第1の実行時データ及び第1の性能メトリックに基づいて、デタッチ-再アタッチ命令の外側セットに対応する外側ループを並列化することが有益ではないと判定するが、第2の実行時データ及び第2の性能メトリックに基づいて、スレッド制御回路は、デタッチ-再アタッチ命令の内側セットに対応する内側ループを並列化することが有益であると判定し得る。代替的に、内側ループではなく外側ループを並列化することが有益であると判定されてもよい。
【0024】
いくつかの実施形態では、現在アクティブなマイクロスレッドの数がサポートされるマイクロスレッドの最大数に等しいとき、データ処理装置は、デタッチ命令を、無条件分岐命令及び無動作のうちの1つとして扱うように構成される。これは、データ処理装置が、スレッド制御回路によってサポートされ得ないマイクロスレッド、データ処理装置において利用可能な物理レジスタの数、利用可能なメモリ帯域幅、又は実行ユニットスループットに起因するマイクロスレッドを生成することを防止する。これらは、追加のマイクロスレッドをサポートすることができない状況の単なる例であり、データ処理装置は、特定の実施形態に依存するハードウェアの任意の制限に応答して、デタッチ命令を、無条件分岐命令及び無動作のうちの1つとして扱うことができることは、当業者には容易に明らかであろう。
【0025】
いくつかの実施形態では、デコーダ回路は、最も新しいエポック識別子を有する命令のマイクロスレッド内の同期命令に応答して、より古いエポック識別子及び同じ領域識別子を有するすべての生成されたマイクロスレッドが終了するまで、命令の最も新しいマイクロスレッド内の後続の命令の実行を一時停止する。同期命令は、プログラマ又はコンパイラによって選択された特定の領域識別子に関連付けられて、対になったデタッチ-再アタッチ命令の領域識別子に一致する。同期命令の役割は、特定の並列領域内で生成されたすべてのマイクロスレッドに対する同期バリアとして機能することである。すべての生成されたマイクロスレッドが再アタッチ命令を発行することによって実行を完了すると、同期命令を発行するマイクロスレッドは、領域識別子に関連付けられた唯一の実行マイクロスレッドとして実行を継続することができる。同期命令を発行するマイクロスレッドは、並列領域で実行される最も新しいエポック識別子を有するスレッドである。最初に予期された順次観察可能なセマンティクスを保存するすべての生成されたマイクロスレッドのマージは、より古いエポック識別子を有するすべてのマイクロスレッドが、それらの再アタッチ命令を実行することによって、厳密なエポック識別子順序でアーキテクチャ状態に成功裏に終了及びコミットされていることを必要とし、同期発行マイクロスレッドが、最も古いコミットされていない投機的状態を有するものになると、アーキテクチャ状態にコミットし、同期命令を超えて順次実行を継続することができる。このアプローチは、潜在的な並列領域の後の任意の動作が、並列化ヒントが省略されたか、又は無動作及び無条件分岐命令のうちの1つとして処理されたかのように、同じアーキテクチャ状態で実行を継続することができることを保証する。
【0026】
少なくともいくつかの実施形態では、実行時データが並列化基準を満たさないとき、スレッド制御回路は、同期命令を無動作として解釈するように適合される。このようにして、プログラム実行は、同期命令が発生しなかったかのように継続するように構成することができ、同期命令がコンパイラ又はプログラマによって挿入されなかった場合に発生したはずの命令からプログラム実行が継続する。
【0027】
少なくともいくつかの実施形態では、デコーダ回路は更に、最も新しいエポック識別子を有する命令のマイクロスレッド内の同期命令に応答して、より古いエポック識別子及び異なる領域識別子を有するすべての生成されたマイクロスレッドが終了するまで、命令の最も新しいマイクロスレッド内の後続の命令の実行を一時停止する。このようにして、グローバル同期命令として動作する同期命令を実行して、特定の時点で、すべての領域識別子からのすべてのマイクロスレッドがコミットされて、それにより、グローバル同期命令の実行後に1つのスレッドだけが存在することができ、既存のスレッドだけが同期命令を発行したスレッドであることを保証することができる。
【0028】
少なくともいくつかの実施形態では、スケジューリング係数nに基づいて、スレッド制御回路は、デタッチ命令の発生及び再アタッチ命令の発生を、無条件分岐命令及び無動作のうちの1つとして解釈するように適合される。並列タスクのためのデフォルトスケジューリングポリシーは、非動作及び無条件分岐命令のうちの1つとして扱われないデタッチ動作が、新しいマイクロスレッドの作成をトリガすると仮定する。いくつかのループの自動ヒントベース並列化の場合、これは、特にループ本体が少数の命令を含むとき、準最適であり得る。しかしながら、ループ内依存関係が実行時に稀であるか又は存在しない場合、ループは依然として並列化から利益を得ることができる。
【0029】
少なくともいくつかの実施形態では、スレッド制御回路は、デタッチ命令のn番目ごとの発生に応答して命令の第2のマイクロスレッドを生成し、デタッチ命令の他のすべての発生を無条件分岐命令及び非動作のうちの1つとして解釈するように適合され、スレッド制御回路は、再アタッチ命令の(n-1)番目ごとの発生に応答して命令の特定のマイクロスレッドを終了し、再アタッチ命令の他のすべての発生を無条件分岐命令及び非動作のうちの1つとして解釈するように適合される。例えば、n=2の場合、デタッチ命令の第1の発生は、新しいマイクロスレッドを生成させるが、再アタッチ命令の第1の発生及びデタッチ命令の第2の発生は、無動作及び無条件分岐動作のうちの1つとして扱われる。このようにして、各マイクロスレッドは、並列化の利点を依然として得ながら、新しいスレッドを生み出す負担を低減するコードの並列領域の2回の発生を通じて実行される。
【0030】
いくつかの実施形態では、スケジューリング係数nは実行時データに基づく。この機構は、スレッド制御回路が、実行時データに基づいて各マイクロスレッド内で並列コードの領域が実行される回数を調整することを可能にする。例えば、実行時データは、マイクロスレッドを生成するオーバーヘッドに基づいて、3未満のnの値の場合、並列化の利点を得ることができないことを示すことができるが、nのより大きな値の場合、データハザードが発生する可能性が高くなり得ると判定することもできる。したがって、スレッド制御回路は、データハザードが発生する可能性を最小限に抑えながら並列化の利点を得るために、3のnの値を有利に選択することができる。
【0031】
少なくともいくつかの実施形態において、デコーダ回路は、代替アドレスを指定するデタッチ命令に更に応答し、nが1より大きいとき、スレッド制御回路は、代替アドレスから第2の実行コンテキストにおける実行を開始するように構成される。nが1より大きい場合、代替アドレスに対応する命令を使用して、帰納変数を量nだけインクリメントすることができる。例えば、ヒントベースの並列化命令を挿入して、スレッド制御回路が、n=1又はn=2の値を有する並列スレッドを生成するかどうかを選択できるようにすることができる。n=1の場合、命令の第1のマイクロスレッドが実行を継続する第2のアドレスは、ループに関連付けられた帰納変数が1だけ増加されるループ継続ブロックを定義することができる。更に、代替アドレスをn=2の場合に使用して、ループに関連付けられた帰納変数が2だけ増加される代替継続ブロックを定義することができる。n=1及びn=2の選択は説明のためであり、nの任意の値が選択され得ることは、当業者には容易に明らかであろう。
【0032】
少なくともいくつかの実施形態では、デコーダ回路は、代替アドレスを指定するデタッチ命令に更に応答し、nが1より大きいとき、スレッド制御回路は、命令の第1のマイクロスレッドに代替アドレスからの実行を継続させるように構成される。nが1より大きい場合、代替アドレスに対応する命令を使用して、帰納変数を量nだけインクリメントすることができる。例えば、ヒントベースの並列化命令を挿入して、スレッド制御回路が、n=1又はn=2の値を有する並列スレッドを生成するかどうかを選択できるようにすることができる。n=1の場合、スレッド制御回路は、第2のスレッドを生成することができ、アドレスは、ループに関連付けられた帰納変数が1だけ増加されるループ継続ブロックを定義することができる。更に、代替アドレスをn=2の場合に使用して、ループに関連付けられた帰納変数が2だけ増加される代替継続ブロックを定義することができる。n=1及びn=2の選択は説明のためであり、nの任意の値が選択され得ることは、当業者には容易に明らかであろう。
【0033】
少なくともいくつかの実施形態では、デコーダ回路は、実行時に発生するマイクロスレッド間の動的依存関係の尤度を表す並列化信頼レベルと、命令の第2のマイクロスレッドに含まれる命令の推定数を提供する並列化価値レベルと、実行時にマイクロスレッド間で発生することが予想される動的依存関係の種類の指示とのうちの少なくとの1つを含む追加メタデータを指定するデタッチ命令に更に応答する。追加のメタデータは、例えば、プロファイリングデータ及び/又は推定されたユースケースに基づいて、プログラマ又はコンパイラによって指定することができる。指定された追加のメタデータは、実行時データと組み合わせてスレッド制御回路によって解釈されて、追加のマイクロスレッドを投機的に発生させるのに最も適切なときを決定することができる。例えば、プログラマ又はコンパイラが高い並列化信頼レベル又は高い並列化価値レベルを示す場合、スレッド制御回路は、追加のマイクロスレッドを生成する前に、実行時データがより低い閾値を満たすことを要求してもよい。代替的に、プログラマ又はコンパイラが低い並列化信頼レベル又は低い並列化価値レベルを示す場合、スレッド制御回路は、追加のマイクロスレッドを生成する前に、実行時データがより高い閾値を満たすことを要求してもよい。
【0034】
少なくともいくつかの実施形態では、性能メトリックは、サイクルごとに実行される命令の平均数と、マルチスレッド処理回路内のリソースの平均占有率と、書き込み競合が検出された後のメモリ読み取りの数と、命令のマイクロスレッドごとに実行される命令の数とのうちの少なくとも1つを含む。このようにして、スレッド制御回路は、実行時に、特定の命令セットについて、命令を並列に実行することが有益である可能性が高いかどうか、あるいは、命令を並列に実行するためのリソースが不十分であるかどうか、データハザードが発生する可能性が高すぎるかどうか、又は特定の命令セットの並列化に関連するオーバーヘッドが高すぎて何らかの利益が認められない可能性があるかどうかを判定することができる。少なくともいくつかの実施形態では、実行時データは絶えず更新され、その結果、マイクロスレッドの現在並列のセットがほとんど又は全く利点を提供していないと判定され得る。この点で、スレッド制御回路は、データ処理装置の性能を向上させるために、並列実行を停止するか、又は無動作命令若しくは無条件分岐命令のうちの1つとして扱われたいくつかのデタッチ及び再アタッチの対を修正する方がよいと判定し得る。
【0035】
少なくともいくつかの実施形態では、データ処理装置は、物理レジスタのセットと、アーキテクチャレジスタのセットを物理レジスタのセットのサブセットにマッピングするレジスタリネーム回路とを備え、レジスタリネーム回路は、アーキテクチャレジスタの第1のセットを第1の実行コンテキストに関連付けられた物理レジスタの第1のセットにマッピングし、レジスタリネーム回路は、アーキテクチャレジスタの第2のセットを第2の実行コンテキストに関連付けられた物理レジスタの第2のセットにマッピングする。このようにして、現在実行中のマイクロスレッドのセットに関連付けられた実行コンテキストの各々について、アーキテクチャレジスタの完全なセットを維持することができる。
【0036】
少なくともいくつかの実施形態では、物理レジスタの第1のセットの第1のサブセット及び物理レジスタの第2のセットの第1のサブセットは、レジスタの同じセットであり、物理レジスタの第1のセットの第2のサブセット及び物理レジスタの第2のセットの第2のサブセットは、レジスタの異なるセットである。このようにして、そうすることが有益である場合、スレッド制御回路は、いくつかの実行コンテキストに、物理レジスタの第1のサブセットを共有させ、各実行コンテキストに固有の物理レジスタの第2のサブセットを維持させることができる。言い換えれば、各実行コンテキストのアーキテクチャ状態は、各実行コンテキストに固有のいくつかのレジスタに加えて、いくつかの共有レジスタによって定義することができる。マイクロスレッドの並列実行中にデータが修正される可能性が低い場合、そのデータが記憶される物理レジスタの1つのコピーのみを維持することが有益である。これにより、異なる実行コンテキストに利用可能な物理レジスタの数が増加し、したがって、サポートされる実行コンテキストの総数を増加させることができる。
【0037】
少なくともいくつかの実施形態では、データ処理方法は、マルチスレッド処理回路上のアーキテクチャ状態を定義する対応する実行コンテキストにおける複数のマイクロスレッドの処理動作に関連する性能メトリックを示す実行時データを収集することと、第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答してデタッチ制御信号を生成することであって、デタッチ命令はアドレスを指定する、ことと、デタッチ制御信号に応答して、実行時データが並列化基準を満たす場合に、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成することであって、命令の第2のマイクロスレッドは、アドレスから開始する命令の第1のマイクロスレッドの命令のサブセットを含む、こととを含む。
【0038】
少なくともいくつかの実施形態では、データ処理装置が、マルチスレッド処理回路上のアーキテクチャ状態を定義する対応する実行コンテキストにおける複数のマイクロスレッドの処理動作に関連する性能メトリックを示す実行時データを収集するための手段と、第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答してデタッチ制御信号を生成するための手段であって、デタッチ命令はアドレスを指定する、手段と、デタッチ制御信号に応答して、実行時データが並列化基準を満たすとき、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成するための手段であって、命令の第2のマイクロスレッドは、アドレスから始まる命令の第1のマイクロスレッドの命令のサブセットを含む、手段とを備える。
【0039】
ここで、いくつかの特定の実施形態を図を参照しながら説明する。
【0040】
図1は、本技法の様々な実施例を具体化し得るデータ処理装置を概略的に示す。データ処理装置10は、マルチスレッド処理回路12及びスレッド制御回路14を備える。スレッド制御回路14は、複数のマイクロスレッドコンテキスト16をサポートするように適合される。マルチスレッド処理回路12は、マルチスレッド実行リソースのセットであり、複数の実行パイプライン18と、物理レジスタ20のセットと、命令キャッシュ22と、レベル1データキャッシュ26と、レベル2キャッシュ24とを備える。複数の実行パイプラインの各々は、命令キャッシュ22から命令をフェッチするフェッチ回路28を含む。フェッチされた命令は、スレッド制御回路14を含むマルチスレッド処理回路の他の構成要素のための制御信号を生成するデコード回路30と、リネーム回路32とに渡される。リネーム回路32は、いくつかの物理レジスタ20を、パイプライン18上で実行されている実行コンテキストに関連付けられた対応する1組のアーキテクチャレジスタにマッピングしてから、デコードされた命令を発行回路43に渡して実行回路36に発行し、実行回路は、算術論理ユニット、浮動小数点ユニット、及びロード/ストアユニットを含むがこれらに限定されない任意の数の実行ステージを含むことができる。命令が実行を完了すると、それらは書き換え回路40に渡される。構成要素28、30、32、34、36、及び40のパイプラインは、典型的なマルチスレッドデータ処理装置の例示であることが意図されており、任意のパイプライン構成要素は、各パイプラインに対して提供される専用構成要素であってもよく、又は任意の数の複数のパイプライン18の間で共有されてもよいことが、当業者には容易に明らかになるであろう。例えば、各パイプライン18は、いくつかの専用パイプライン構成要素と、1つ以上の他のパイプライン18と共有されるいくつかの構成要素とを有し得る。しかしながら、明示的に示されていない追加の構造がデータ処理装置10に追加されてもよい。マルチスレッド処理回路12が、複数のマイクロスレッドコンテキストにわたってそのリソースをインターリーブする単一のパイプライン18を含むこともできることは、当業者には容易に明らかになるであろう。
【0041】
図2は、本技法の様々な実施例を具体化し得るスレッド制御回路の動作の詳細を概略的に示す。いくつかの実施形態では、このスレッド制御回路42は、
図1のスレッド制御回路14を提供し得る。スレッド制御回路42は、データ処理装置上で実行される異なるマイクロスレッドを制御し追跡するために使用されるいくつかのカウンタを記憶する。特に、スレッド制御回路は、エポックカウンタ44を使用して、命令のデタッチ-再アタッチの対によって示される現在実行中のコードのセットに対応する各領域識別子について、その領域識別子を有するマイクロスレッドに発行された最も古いエポック識別子と、その領域識別子を有するマイクロスレッドに発行された最も新しいエポック識別子とを追跡する。このようにして、
図3Aに関連して更に説明されるように、インフライトエポック識別子は、各領域識別子について維持され得る。加えて、スレッド制御回路42は、マルチスレッド処理装置によって現在維持されている各実行コンテキスト、対応するエポック識別子、及び対応する領域識別子を示す実行コンテキストテーブル46を維持することができる。実行コンテキストテーブル46に保持されるように示された情報は網羅的なものではなく、実行コンテキストに関連付けられた任意の情報もそこに記憶され得ることは、当業者には容易に明らかであろう。例えば、実行コンテキストテーブル46は、物理レジスタと各実行コンテキストに割り当てられたアーキテクチャレジスタとの間のマッピングを維持し得る。加えて、スレッド制御回路は、処理動作に関連する性能メトリックを示すことに基づいて、実行時データ48を維持する。実行時データは、現在実行中の命令に基づいて継続的に更新されてもよく、及び/又は各領域識別子に対して独立して維持されてもよい。このようにして、スレッド制御回路は、各領域識別子に対して、追加のマイクロスレッドが生成されるかどうか、及びマイクロスレッドが生成される場合には、どのエポック識別子がどの実行コンテキスト及びどの領域識別子に関連付けられるかを制御及び維持することができる。
【0042】
図3A及び
図3Bは、本技法の様々な実施例を具体化し得るエポック識別子の割り当ての詳細を概略的に示す。
図3Aから開始して、エポック識別子50は循環的に処理される。スレッド制御回路は、新しいマイクロスレッドが生成される際にエポック識別子を昇順で割り当て、最大のサポートされたエポック識別子に到達するとラップアラウンドする。このスキームは、最も古いエポック識別子52及び最も新しいエポック識別子54を追跡する2つのカウンタを使用して実施される。新しいエポック識別子が割り当てられると、最も新しいエポック識別子がインクリメントされ、最も古いエポック識別子が割り当てられると0にラップアラウンドする。マイクロスレッドがコミットされると(これは順序通りに行われる)、最も古いエポック識別子がインクリメントされ、それによってエポック識別子が後続のマイクロスレッドによって使用されるように解放される。
図2に示されるように、最も新しいエポックカウンタ54及び最も古いエポックカウンタ52は、各領域識別子に対して維持される。
【0043】
図3Bに示すように、ネストされた並列化領域がサポートされる実施形態では、各マイクロスレッドに関連付けられたエポック識別子56は階層的に定義されてもよい。図示の実施形態では、エポック識別子56は、最も外側対のデタッチ-再アタッチ命令に関連付けられた最も外側の識別子58と、最も外側対のデタッチ-再アタッチ命令内にネストされた外側対のデタッチ-再アタッチ命令によって定義された外側識別子60と、外側対のデタッチ-再アタッチ命令内にネストされた内側対のデタッチ-再アタッチ命令に関連付けられた内側識別子62と、内側対の再アタッチ命令内にネストされた最も内側対のデタッチ-再アタッチ命令に関連付けられた最も内側の識別子とによって定義される。デタッチ-再アタッチ命令のネストされた対に関連付けられたエポック識別子の4つの層の定義は、説明のためだけのものであり、デタッチ-再アタッチ命令のネストされた対の任意の数のセットが、説明された機構に基づいてサポートされ得ることは、当業者には容易に明らかであろう。いくつかの実施形態では、エポック識別子のレイヤの各々に割り当てられたビット幅は、実行時にハードウェアによって動的に変更されてもよく、他の実施形態では、エポック識別子のレイヤの各々に割り当てられたビット幅は、静的に決定されてもよい。
図3Aに関連して説明した例と同様に、最も外側の識別子58、外側の識別子60、内側の識別子62、及び最も内側の識別子64のそれぞれは、最も古いエポック識別子及び最も新しいエポック識別子に関連付けられた一対のカウンタのメンテナンスを必要とする。特に、最も外側のエポック識別子58は、利用可能な最も外側の識別子66のセットのうちの1つであり、最も古い最も外側の識別子68及び最も新しい最も外側の識別子70に関連付けられる。同様に、外側識別子60、内側識別子62、及び最も内側の識別子64の各々の割り当ては、対応する外側の最も古い識別子及び外側の最も新しい識別子、内側の最も古い識別子及び内側の最も新しい識別子、並びに最も内側の最も古い識別子74及び最も内側の最も新しい識別子76を通じて維持される。
【0044】
図4~
図7は、本技法の様々な実施例を具体化し得るマイクロスレッド実行の例の詳細を概略的に示す。特に、これらの図は、対応する最適化されたアセンブリコードを有する以下の例示的なCコードに基づく。
【0045】
【0046】
図示された実施例では、本発明のいくつかの実施形態で説明されるタスクレベル並列化を利用するために、コンパイラによってアセンブリコードに対して以下の修正が行われる。
【0047】
【0048】
上記の修正されたアセンブリコードで使用されるデタッチ命令は、複数の入力を含む。loop_bodyフィールド及びloop_contフィールドは、それぞれ、命令のデタッチブロック及び継続ブロックのアドレスである。これは、そのようなアドレスを表すためのプログラムカウンタベースのオフセットを使用して符号化することができる。デタッチブロックフィールドは、プログラム順序でデタッチ命令に続く命令に対応する場合には省略することができる。region_idフィールドは、実行時に一意であり、特定の注釈付き領域に関連付けられなければならない領域識別子である。実際には、領域識別子が領域ネスト内でのみ一意であれば十分であり、これは、同じ領域識別子が異なるネストにわたって再使用され得ることを意味する。メタデータフィールドは、スレッド制御回路に渡すことができる余分な情報を捕捉してもよい。特に、メタデータは、例えばプロファイリングデータに基づいて、実行時に具体化する動的依存関係の尤度を表す並列化信頼レベルを符号化するために使用することができ、例えば、命令の数で表現される並列パスの推定長についての追加情報であって、最良の場合の命令の数と最悪の場合の命令の数の両方を含み得る追加情報と、リードアフターライトハザードの有無などの領域内の予想される依存関係の種類に関連する他の情報とを含めることによって並列化価値レベルを符号化する。同様に、再アタッチ命令はloop_contアドレスと領域識別子を指定し、同期命令は領域識別子を指定する。
【0049】
図4は、本技法の様々な実施例を具体化し得るマイクロスレッド実行の例の詳細を概略的に示す。特に、デタッチ命令(この場合、uthread 0)を実行するスレッドは、新たに割り当てられたエポック識別子を有する継続パス(loop_cont)から開始して実行を継続し、元のシリアルプログラムにおいて、継続パスがプログラム順序でデタッチパス(ループ本体)の後に実行されたであろうという事実を反映する。生成されたマイクロスレッド(uthread 1)は、親マイクロスレッドから継承されたエポック識別子を有するデタッチパス(loop_body)から実行を開始する。この例示的な実施形態では、uthread 0は、loop_contの後に命令を実行し、最初にx10に記憶された値を1だけインクリメントし、x10の値をx3と比較し、loop_headに分岐してデタッチ命令を再実行する前に、結果に基づいて条件フラグを更新する。これにより、新しいマイクロスレッドuthread 2が生成され、uthread 0に関連付けられた実行コンテキストからuthread 2に関連付けられた実行コンテキストにインポートされたレジスタx10内の更新された値を用いてloop_bodyから継続する。図示されるように、uthread 0によるマイクロスレッドの生成は、b.ne命令に関連付けられた条件フラグが、0フラグが設定されていること、すなわち、レジスタx10に保持された値がx3に等しいことを示すまで継続する。この時点で、同期命令が発行され、uthread 0の実行は、古いエポック識別子を有するマイクロスレッドがすべて完了する、すなわち、マイクロスレッドが再アタッチ命令の実行に成功するまで一時停止される。
【0050】
図5は、本技法の様々な代替例を具体化し得るマイクロスレッド実行の例の詳細を概略的に示す。特に、デタッチ命令(最初はuthread 0)を実行するスレッドは、そのエポック識別子を変更することなく、loop_bodyから実行を継続する。生成されたマイクロスレッド(最初はuthread 1)は、新たに割り当てられたエポック識別子を用いてloop_contから実行を開始して、元のシリアルプログラムにおいて、継続パスがプログラム順序でデタッチパスの後に実行されたであろうという事実を反映する。この場合、uthread 0は、再アタッチ命令に到達し、uthread 1が継続アドレスで開始し、レジスタx10に記憶された値を1だけインクリメントし、x10に記憶された値をx3に記憶された値と比較し、loop_headに分岐する前に結果に基づいて条件フラグを更新するまで継続する(データハザードなしで実行が成功したと仮定する)。uthread 1の実行は、uthread 1の実行がloop_body(データハザードがなく実行が成功したと仮定して)から再アタッチ命令に達するまで続く前に、マイクロスレッドuthread 2を生成するデタッチ命令の発行を伴ってloop_headから続く。図示されるように、各前のマイクロスレッドによる新しいマイクロスレッドの生成は、b.ne命令に関連付けられた条件フラグが、0フラグが設定されていること、すなわち、レジスタx10に保持された値がx3に等しいことを示すまで継続する。この時点で、同期命令を発行するマイクロスレッドの実行(この場合、uthread n)は、古いエポック識別子を有するマイクロスレッドがすべて完了する、すなわち、再アタッチ命令の実行に成功するまで一時停止される。
【0051】
図6は、本技法の様々な実施例を具体化し得るマイクロスレッド実行の例の詳細を概略的に示す。図示された例では、マイクロスレッドの生成は、スケジューリング係数n>1が設定されているという追加の特徴を有する
図4に記載された方式に従う。その結果、マイクロスレッドは、デタッチ命令及び再アタッチ命令の特定の発生を、それらを無動作命令及び無条件分岐命令のうちの1つとして扱うことによって、シリアルに削除しなければならない。具体的には、デタッチ-再アタッチ命令が、i=0から開始しプログラム順に昇順するマイクロスレッド内でインデックス付けされる場合、i番目のデタッチは、(i%n)≠0の場合シリアルに削除されるべきであり、デタッチを発行するマイクロスレッドは、すべての生成されたスレッドの親スレッドであり(この例ではuthread 0)、ここで表記i%nは、i modulo nを指す。他の生成されたマイクロスレッドについては、親マイクロスレッドのみが新しいマイクロスレッドを生成することができるため、すべてのデタッチ命令はシリアルに削除されなければならない。加えて、i番目の再アタッチ命令は、(i%n)≠n-1の場合にのみシリアルに削除されるべきである。特に、この実施形態では、スケジューリング係数はn=2に設定される。その結果、uthread 0は、デタッチ命令の奇数番目の発生に対して新しいマイクロスレッドを生成し、デタッチ命令の偶数番目の発生をシリアルに削除する。更に、uthread 0は、シリアルに削除されない各デタッチ命令の間でループインデックスiを2回インクリメントする。生成されたマイクロスレッドはそれぞれ、命令のloop_contブロックが実行されるたびにループインデックスiをインクリメントするループ本体の2回の反復を通じて実行される。その結果、uthread 0は、インデックスi=0を有するuthread 1を生成し、uthread 0は、次に、デタッチ命令の第2の発生をシリアルに削除する前に、ループインデックスをインクリメントする。ループインデックスは、第3のデタッチ命令に遭遇する前にuthread 0によって再びインクリメントされ、uthread 2はループインデックスi=2で生成され、
図4に関連して説明したように、このプロセスはuthread 0が同期命令に遭遇するまで継続する。
【0052】
図7は、本技法の様々な実施例を具体化し得るマイクロスレッド実行の例の詳細を概略的に示す。ループの反復回数がスケジューリング係数の整数倍でない場合、親マイクロスレッド(図示された実施例ではuthread 0)及び最後に生成されたマイクロスレッドの両方が同期命令を実行する可能性がある。このシナリオは、同期が、同期命令自体を発行するマイクロスレッドのエポック識別子よりも新しいエポック識別子を有するマイクロスレッドを削除又はスカッシュすることを述べる規則の導入を通じて処理される。図示された実施例では、マイクロスレッドuthread n/2は、エポック識別子(x+(n/2)-1)%max_epochsとの同期の実行に達し、ここで、xはuthread 0の初期エポック識別子であり、max_epochsは最も高く定義されたエポック識別子である。マイクロスレッドuthread 0のエポック識別子は、それが同期命令に到達するとき、(x+(n/2))%max_epochsである。この実施例では、マイクロスレッドuthread 0のエポック識別子は、マイクロスレッドuthread n/2のエポック識別子よりも新しく、結果としてスカッシュされ、順次実行は、マイクロスレッドuthread n/2の実行コンテキストから並列セクションの最後で継続する。
【0053】
図8及び
図9は、本技法の様々な実施例を具体化し得るマイクロスレッド実行の例の詳細を概略的に示す。具体的には、これらの図は、
図4~
図7に対応する同じ例示的なCコードに基づいており、本発明のいくつかの実施形態において記載されているスケジューリング係数n>1を有するタスクレベル並列化を利用するために、コンパイラによってアセンブリコードに対して以下の修正が加えられている。
【0054】
【0055】
ループが比較的単純な連続パスを有することは一般的であり、コードは主に帰納変数の増分及び減分を扱う。したがって、スレッドの発生率は比較的高い可能性があり、複数のループ反復をカバーするために帰納変数を1回インクリメントすることによってより速い生成速度を可能にする代替継続パス(loop_cont_x2)で開始する継続ブロックの代替バージョンを提供することによって、更なる最適化を活用することができる。上述した例示的なコードでは、スケジューリング係数n=2が使用されているが、当業者であれば、これは説明のためだけに選択されたものであり、1より大きい任意の整数を使用できることを認識するであろう。
【0056】
図8は、上記の例示的なアセンブリコードに基づいて本技法の様々な実施例を具体化し得るマイクロスレッド実行の例の詳細を概略的に示す。図示された実施形態では、実行は
図7に関連して説明されたように進行するが、注目すべき例外は、デタッチ命令が実行されるときにマイクロスレッドuthread 0が代替継続アドレス(loop_cont_x2)にジャンプすることである。代替継続ブロックは、代替継続アドレスから開始して、レジスタx10内のループインデックスの値を2だけインクリメントする。次に、x10内の値がx3に対してチェックされ、条件フラグをセットする。x10の値がx3未満である場合、b.lt(未満なら分岐)命令は、フローをloop_headにジャンプさせ、そうでない場合、フローは、同期命令へのジャンプに進む。これらの図示された実施形態では、マイクロスレッドuthread 0がループインデックスを2回デクリメントする必要はない。代わりに、代替継続ブロックにおいて2の値だけ1回デクリメントされる。
【0057】
図9は、上記の例示的なアセンブリコードに基づいて本技法の様々な実施例を具体化し得るマイクロスレッド実行の例の詳細を概略的に示す。特に、デタッチ命令(最初はuthread 0)を実行するスレッドは、そのエポック識別子を変更することなく、loop_bodyから実行を継続する。生成されたマイクロスレッド(最初にuthread 1)は、新たに割り当てられたエポック識別子を有する代替継続パス(loop_cont_x2)から実行を開始して、元のシリアルプログラムにおいて、代替継続パスがプログラム順序でデタッチパスの後に実行されたであろうという事実を反映する。図示の例では、スケジューリング係数は、n=2に設定されている。その結果、マイクロスレッドは、デタッチ命令及び再アタッチ命令の特定の発生を、それらを無動作命令及び無条件分岐命令のうちの1つとして扱うことによって、シリアルに削除しなければならない。具体的には、i=0以下から開始して、プログラム順に昇順するマイクロスレッド内でデタッチ-再アタッチ命令にインデックス付けする場合。i番目のデタッチは、(i%n)≠0の場合シリアルに削除されるべきであり、i番目のアタッチ命令は、(i%n)≠n-1の場合にのみシリアルに削除されるべきである。その結果、uthread 0はインデックスi=0を有するuthread 1を生成し、これは、デタッチ命令が実行されてマイクロスレッドuthread 2がインデックスi=2を有するように生成されるloop_headに戻る前に、代替継続ブロックにおいてi=2に直ちにインクリメントされる。最初のデタッチ命令がマイクロスレッドによって実行されると(一例としてマイクロスレッドuthread 0を使用して)、ループ本体はインデックスi=0を用いて実行され、その後、再アタッチ命令の最初の発生がシリアルに削除され、フローは継続ブロック(loop_cont)にジャンプし、そこでループインデックスが再びインクリメントされる(i=1)。次に、フローはループヘッドに移動し、デタッチ命令がシリアルに削除され、第2の再アタッチ命令に遭遇する前にループ本体が実行され、uthread 0が完了する。代替継続ブロック(loop_cont_x2)に続くデタッチ命令は、スケジューリング係数nがコンパイラによってこのバージョンにハードワイヤードされるため、シリアルに削除されることはない。このプロセスは、フローが同期命令に分岐するときにレジスタx10内の値がx3以上であることを代替継続ブロック内の命令未満分岐(b.lt)に関連付けられた条件付きフラグが示すまで継続し、この時点で、同期命令を発行するマイクロスレッド(この場合、uthread(n/2)の実行は、古いエポック識別子を有するマイクロスレッドがすべて完了する、すなわち、再アタッチ命令を正常に実行するまで一時停止される。
【0058】
図10は、本発明のいくつかの実施例によって実行される一連の工程を概略的に示す。工程S1で、マルチスレッド処理回路上のアーキテクチャ状態を定義する対応する実行コンテキストにおいて複数のマイクロスレッドの処理動作に関連する性能メトリックを示す実行時データが収集される。工程S2で、第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答してデタッチ制御信号が生成され、デタッチ命令はアドレスを指定する。工程S3で、デタッチ制御信号に応答して、かつ実行時データが並列化基準を満たすとき、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドが生成され、命令の第2のマイクロスレッドは、アドレスから開始する命令の第1のマイクロスレッドの命令のサブセットを含む。並列化基準が、追加のマイクロスレッドを発生させることが有益であるという指示であり得ること、あるいは、並列化基準が、追加のマイクロスレッドを発生させる価値がないという指示の欠如であり得ることは、当業者には容易に明らかになるであろう。
【0059】
要約すると、データを処理するデータ処理装置及び方法の概要が開示される。データ処理装置は、複数のマイクロスレッドの処理動作を実行するマルチスレッド処理回路を備え、各マイクロスレッドは、アーキテクチャ状態を定義する対応する実行コンテキストにおいて動作する。スレッド制御回路は、処理動作に関連する性能メトリックを示す実行時データを収集する。デコーダ回路は、第1のアーキテクチャ状態を定義する第1の実行コンテキストにおいて実行される命令の第1のマイクロスレッド内のデタッチ命令に応答して、デタッチ制御信号をスレッド制御回路に提供し、デタッチ命令はアドレスを指定する。実行時データが並列化基準を満たすとき、スレッド制御回路は、デタッチ制御信号に応答して、第1のアーキテクチャ状態に基づいて第2のアーキテクチャ状態を定義する第2の実行コンテキストにおいて実行される命令の第2のマイクロスレッドを生成し、命令の第2のマイクロスレッドは、アドレスから開始する命令の第1のマイクロスレッドの命令のサブセットを含む。
【0060】
本出願において、「~ように構成された(configured to...)」という用語は、装置の要素が、定義された動作を実施することが可能である構成を有することを意味するために使用される。この文脈において、「構成」とは、ハードウェア又はソフトウェアの構成又は相互接続の方法を意味する。例えば、装置は、定義された動作を提供する専用ハードウェアを有してもよく、又はプロセッサ若しくは他の処理デバイスが、機能を実行するようにプログラムされてもよい。「ように構成された」は、装置要素が、定義された動作を提供するために何らかの変更がなされる必要があることを意味しない。
【0061】
本明細書では例示的な実施形態について添付の図面を参照して詳細に説明してきたが、理解されるように、本発明はそれらと寸分違わない実施形態に制限されるのではなく、また、添付の特許請求の範囲に定める本発明の範囲及び精神から逸脱することなく、当業者によって様々な変更、追加、及び修正を行うことができる。例えば、独立請求項の特徴の様々な組み合わせは、本発明の範囲から逸脱することなく、従属請求項の特徴でなされてもよい。
【国際調査報告】