(57)【要約】  ベクトル演算を実行する際にアドレス衝突を管理するための装置及び方法が提供される。  装置は、ベクトルオペランドを記憶するためにレジスタストアを有し、各ベクトルオペランドは、複数の要素と、命令を実行してこれらの命令により定められる動作を実行するための実行回路とを備える。実行回路は、レジスタストアとメモリとの間でベクトルオペランドを移動させるためにメモリアクセス動作を実行するためのアクセス回路と、ベクトルオペランドを使用してデータ処理動作を実行するための処理回路とを有する。実行回路は、ベクトルループを反復的に実行するようになっていてもよく、各反復中に、実行回路は、命令のシーケンスを実行してベクトルループを実施する。シーケンスは、複数のメモリアドレスを特定するチェック命令を含み、また、実行回路は、チェック命令の実行に応答して、複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定する。ベクトルループのそれぞれの反復ごとに、実行回路は、アドレスハザード状態の不存在を決定するチェック命令の実行に応答し、ベクトルループを実施するべく命令のシーケンスを実行する際にベクトル化のデフォルトレベルを使用する。これに対し、アドレスハザード状態の存在下で、実行回路は、ベクトルループを実施するべく命令のシーケンスを実行する際にベクトル化の低いレベルを使用する。そのような手法は、ベクトルループの各反復中に使用されるベクトル化のレベルを動的に調整するための低レイテンシメカニズムをもたらし、それにより、アドレスハザード状態の存在下で効率的な性能を依然として可能にしつつコードをベクトル化できることが分かってきている。
2019517060.tif 000002
【特許請求の範囲】
【請求項１】
それぞれが複数の要素を含むベクトルオペランドを記憶するためのレジスタストアと、
命令によって定められる動作を行うために命令を実行する実行回路であって、前記レジスタストアとメモリとの間で前記ベクトルオペランドを移動させるためにメモリアクセス動作を行うアクセス回路と、前記ベクトルオペランドを使用してデータ処理動作を行う処理回路とを備える、実行回路と、
を備え、
前記実行回路がベクトルループを反復的に実行するようになっており、各反復中に、前記実行回路は、命令のシーケンスを実行してベクトルループを実施するようになっており、前記シーケンスは、複数のメモリアドレスを特定するチェック命令を含み、前記実行回路は、前記チェック命令の実行に応答して、前記複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定し、
前記ベクトルループのそれぞれの反復ごとに、前記実行回路は、前記アドレスハザード状態の不存在を決定する前記チェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際にデフォルトレベルのベクトル化を使用するとともに、前記アドレスハザード状態の存在を決定する前記チェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際に低レベルのベクトル化を使用する、
装置。
【請求項２】
前記実行回路は、前記アドレスハザード状態の不存在を決定する前記チェック命令の実行に応答し、前記ベクトルループを実施するべく前記命令のシーケンス内の第１の複数の命令を実行することによって前記デフォルトレベルのベクトル化を使用し、
前記実行回路は、前記アドレスハザード状態の存在を決定する前記チェック命令の実行に応答し、前記ベクトルループを実施するべく前記命令のシーケンス内の第２の複数の命令を反復的に実行することによって前記低レベルのベクトル化を使用する、
請求項１に記載の装置。
【請求項３】
前記実行回路は、前記チェック命令の実行に応答して、前記シーケンス内のその後の命令による参照のために、前記アドレスハザード状態が存在するかどうかを示す結果データを生成する請求項２に記載の装置。
【請求項４】
前記結果データが１つ以上のフラグを含み、前記その後の命令が分岐命令であり、該分岐命令は、前記実行回路によって実行されると、前記第１の複数の命令を実行すべきかどうか又は前記第２の複数の命令を反復的に実行すべきかどうかを決定するために前記１つ以上のフラグを参照する請求項３に記載の装置。
【請求項５】
前記第２の複数の命令がスカラー命令を含み、これらのスカラー命令によって前記実行回路が個々の要素に対して作用し、前記ベクトルループを実施するために必要な前記第２の複数の命令の反復実行の数は、ベクトル化の前記デフォルトレベルと関連するベクトルオペランドのアクティブ要素の数に依存する請求項２から４のいずれか一項に記載の装置。
【請求項６】
前記実行回路は、前記チェック命令の実行に応答して、初期述語値を有するガード述語を生成し、
前記第２の複数の命令がベクトル命令を含み、該ベクトル命令によって前記前記実行回路が１つ以上のベクトルオペランドの要素のサブセットに同時に作用し、前記サブセットが前記ガード述語によって特定され、
前記第２の複数の命令の各反復時に、前記ガード述語の述語値は、任意の先行する反復によって作用される１つ以上のベクトルオペランドの任意の要素を除外するように更新される請求項２から４のいずれか一項に記載の装置。
【請求項７】
前記ガード述語は、マスター述語によって特定されるアクティブ要素である要素のサブセットを特定するように制約される請求項６に記載の装置。
【請求項８】
前記デフォルトレベルのベクトル化が第１の数のアクティブ要素を特定し、前記実行回路は、前記アドレスハザード状態の不存在を決定する前記チェック命令の実行に応答して、前記ベクトルループを実施するべく命令のシーケンスを実行する際に前記第１の数の要素を同時に処理するようになっており、
前記実行回路は、前記チェック命令の実行に応答して、チェック命令の実行が前記アドレスハザード状態の存在を決定する際にアクティブ要素の数を前記第１の数よりも少ないアクティブ要素の第２の数まで減らす制御出力を生成し、それにより、前記実行回路は、前記ベクトルループを実施するべく命令のシーケンスを実行する際に前記第２の数の要素を並列に処理することによって前記低レベルのベクトル化を使用する請求項１に記載の装置。
【請求項９】
前記ベクトルループの各反復の開始時に、前記実行回路は、デフォルトレベルのベクトル化の使用に戻るようになっている請求項８に記載の装置。
【請求項１０】
前記制御出力は、前記第２の数のアクティブ要素を形成するアクティブ要素を特定するガード述語を含む請求項８又は９に記載の装置。
【請求項１１】
前記チェック命令は、複数のアクティブアドレス要素を含む少なくとも１つのベクトルオペランドを定め、前記実行回路は、前記チェック命令の実行時に、それぞれのアクティブアドレス要素とそれぞれの他のアクティブアドレス要素とを比較して、前記アドレスハザード状態が存在するかどうかを決定するようになっている請求項１から１０のいずれか一項に記載の装置。
【請求項１２】
前記チェック命令は、連続するアドレスの第１のシーケンスと関連する第１のアドレスと、連続するアドレスの第２のシーケンスと関連する第２のアドレスとを定め、前記実行回路は、チェック命令の実行時に、前記第１のアドレスと前記第２のアドレスとの間の差に応じて前記アドレスハザード状態の存在を決定するようになっている請求項１から１０のいずれか一項に記載の装置。
【請求項１３】
前記チェック命令がチェック・メモリアクセス命令であり、前記実行回路は、前記チェック・メモリアクセス命令の実行に応答してチェック動作を実行し、前記複数のメモリアドレス中に前記アドレスハザード状態が存在するかどうかを決定する一方で、前記複数のメモリアドレスに関してメモリアクセス動作も行う請求項１から１２のいずれか一項に記載の装置。
【請求項１４】
前記実行回路は、前記アドレスハザード状態の存在を決定する際に、メモリアクセス動作の任意の残りの部分を終了するようになっている請求項１３に記載の装置。
【請求項１５】
前記処理回路は、前記チェック命令の実行時にチェック動作を行うための専用のチェック回路を備える請求項１から１４のいずれか一項に記載の装置。
【請求項１６】
前記処理回路は、データ処理動作を行うための処理ユニットを備え、前記処理ユニットは、前記チェック命令の実行時にチェック動作を行うために再使用される請求項１から１４のいずれか一項に記載の装置。
【請求項１７】
前記チェック動作の実行中に必要とされる１つ以上のアドレス比較をマージするために処理ユニット内の回転子回路及び比較器回路が使用される請求項１６に記載の装置。
【請求項１８】
ハザードチェック状態レジスタを更に備え、前記実行回路は、前記チェック命令の実行によって生成される結果データを前記ハザードチェック状態レジスタに記憶するようになっている、請求項３に従属する場合の請求項１から１７のいずれか一項に記載の装置。
【請求項１９】
前記各ベクトルオペランドがＮ個の要素を含み、Ｎ個の前記アクティブ要素は、前記実行回路が前記アドレスハザード状態の不在を決定するチェック命令の実行に応答して前記ベクトルループを実施するべく命令のシーケンスを実行する際にＮ個の要素を並列に処理するようにベクトル化の前記デフォルトレベルに関連付けられる請求項１から１８のいずれか一項に記載の装置。
【請求項２０】
前記各ベクトルオペランドがＮ個の要素を含み、マスター述語がＮ以下の数の要素をアクティブ要素として特定し、ベクトル化の前記デフォルトレベルは、前記マスター述語によって特定されるアクティブ要素に対応し、それにより、前記実行回路は、前記アドレスハザード状態の不在を決定するチェック命令の実行に応答して、前記ベクトルループを実施するべく命令のシーケンスを実行する際に前記マスター述語によって特定されるアクティブ要素を並列に処理する請求項１から１８のいずれか一項に記載の装置。
【請求項２１】
先に実行された命令シーケンスにおける前記アドレスハザード状態の発生に関連する履歴データを維持するためのカウンタ回路を更に備え、
前記実行回路は、複数の異なるタイプのチェック命令を含む命令セットの制御下で動作するようになっており、
これにより、前記履歴データをコンパイラが利用できるようにすることで、前記コンパイラは、前記履歴データを考慮してどのタイプのチェック命令をベクトルループ内で使用すべきかを決定することができる請求項１から２０のいずれか一項に記載の装置。
【請求項２２】
選択された期間にわたり、前記履歴データは、検出されるアドレス衝突の総数及び前記ベクトルオペランドのベクトル長内で検出されるアドレス衝突の数のうちの少なくとも一方を特定する請求項２１に記載の装置。
【請求項２３】
それぞれが複数の要素を含むベクトルオペランドを記憶するためのレジスタストアと、命令によって定められる動作を行うために命令を実行する実行回路であって、前記レジスタストアとメモリとの間で前記ベクトルオペランドを移動させるためにメモリアクセス動作を行うとともに、前記ベクトルオペランドを使用してデータ理動作を行う、実行回路とを有する装置でベクトル演算を実行する際にアドレス衝突を管理する方法であって、前記方法は、
ベクトルループを反復的に実行し、
各反復中に、命令のシーケンスを前記実行回路内で実行してベクトルループを実施し、前記シーケンスは、複数のメモリアドレスを特定するチェック命令を含み、前記実行回路は、前記チェック命令の実行に応答して、前記複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定し、
前記ベクトルループのそれぞれの反復ごとに、前記アドレスハザード状態の不存在を決定する前記チェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際にデフォルトレベルのベクトル化を使用するとともに、前記アドレスハザード状態の存在を決定する前記チェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際に低レベルのベクトル化を使用する、
方法。
【請求項２４】
請求項１から２２のいずれか一項に記載の装置に対応するプログラム命令のための仮想マシン実行環境を与えるようにコンピュータを制御するコンピュータプログラムを持続的形態で記憶するコンピュータプログラムプロダクト。
【請求項２５】
それぞれが複数の要素を含むベクトルオペランドを記憶するためのレジスタストア手段と、
命令によって定められる動作を行うために命令を実行するための実行手段であって、前記レジスタストア手段とメモリとの間で前記ベクトルオペランドを移動させるためにメモリアクセス動作を行うためのアクセス手段と、前記ベクトルオペランドを使用してデータ処理動作を行うための処理手段とを備える、実行手段と、
を備え、
前記実行手段がベクトルループを反復的に実行するようになっており、各反復中に、前記実行手段は、命令のシーケンスを実行してベクトルループを実施するようになっており、前記シーケンスは、複数のメモリアドレスを特定するチェック命令を含み、前記実行手段は、前記チェック命令の実行に応答して、前記複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定し、
前記ベクトルループのそれぞれの反復ごとに、前記実行手段は、前記アドレスハザード状態の不存在を決定する前記チェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際にデフォルトレベルのベクトル化を使用するとともに、前記アドレスハザード状態の存在を決定する前記チェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際に低レベルのベクトル化を使用する、
装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、ベクトル演算を実行する際にアドレス衝突を管理するための装置及び方法に関する。
【背景技術】
【０００２】
データ処理装置の性能を向上させるための１つの既知の技術は、ベクトル演算の実行をサポートするための回路を設けることである。ベクトル演算は少なくとも１つのベクトルオペランドに対して実行され、各ベクトルオペランドは複数の要素を備える。このとき、ベクトル演算の実行は、ベクトルオペランド内の様々な要素にわたって演算を反復的に適用することを伴う。
【０００３】
特定の実施では、ベクトルオペランド内の様々な要素に対して演算を並行して実行するために複数のレーンの並列処理をもたらすベクトル処理回路（しばしば、ＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）処理回路と称される）を設けることも知られている。
【０００４】
ベクトル演算の使用により、等価な一連のスカラー演算の性能と比べた際にかなりの性能利点を実現することができる。
【０００５】
ＳＩＭＤにしたがう伝統的なプログラムは、通常、規則的なメモリアクセスを実行するとともに、しばしば、スカラーコードからベクトルコードへの変換を容易にする線形メモリアドレッシング方式にしたがう。そのような状況では、ループ反復間に依存性がなく、また、ベクトルの要素が同時に処理されるときに想定し得る競合条件が存在しないため、ベクトル化は複雑ではない。残念ながら、性能に関してベクトル化が望まれる多くの現実のプログラムでは、スカラーコードにおいて軽微ではない大きさの依存性が反復間に存在する。そのような場合、コードがベクトル化されれば、ランタイム時に現れ得るアドレス競合の頻度を予測することは困難となり得る。
【０００６】
したがって、コンパイル段階では、控えめな手法をとることがしばしば必要であり、その結果、アドレス競合の存在を正確に予測できなければコードをベクトル化できず、したがって、任意の潜在的な性能向上が犠牲にされる。
【０００７】
アドレスのベクトルにおけるアドレス競合を動的に解析するためのメカニズムを導入しようとする以前の試みは、重大な遅延問題を有しており、そのため、それらの使用から実現されるべき任意の潜在的な利点が制限される可能性がある。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記問題を軽減するメカニズムを提供することが望ましい。
【課題を解決するための手段】
【０００９】
１つの形態例では、それぞれが複数の要素を含むベクトルオペランドを記憶するためのレジスタストアと、命令によって定められる動作を行うために命令を実行する実行回路であって、レジスタストアとメモリとの間でベクトルオペランドを移動させるためにメモリアクセス動作を行うアクセス回路と、前記ベクトルオペランドを使用してデータ処理動作を行う処理回路とを備える、実行回路とを備え、実行回路がベクトルループを反復的に実行するようになっており、各反復中に、実行回路は、命令のシーケンスを実行してベクトルループを実施するようになっており、前記シーケンスは、複数のメモリアドレスを特定するチェック命令を含み、実行回路は、チェック命令の実行に応答して、複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定し、ベクトルループのそれぞれの反復ごとに、実行回路は、前記アドレスハザード状態の不存在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際にデフォルトレベルのベクトル化を使用するとともに、前記アドレスハザード状態の存在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際に低レベルのベクトル化を使用する、装置が提供される。
【００１０】
別の形態例では、それぞれが複数の要素を含むベクトルオペランドを記憶するためのレジスタストアと、命令によって定められる動作を行うために命令を実行する実行回路であって、レジスタストアとメモリとの間でベクトルオペランドを移動させるためにメモリアクセス動作を行うとともに、前記ベクトルオペランドを使用してデータ処理動作を行う、実行回路とを有する装置でベクトル演算を実行する際にアドレス衝突を管理する方法が提供され、方法は、ベクトルループを反復的に実行し、各反復中に、命令のシーケンスを実行回路内で実行してベクトルループを実施し、前記シーケンスは、複数のメモリアドレスを特定するチェック命令を含み、実行回路は、チェック命令の実行に応答して、複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定し、ベクトルループのそれぞれの反復ごとに、前記アドレスハザード状態の不存在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際にデフォルトレベルのベクトル化を使用するとともに、前記アドレスハザード状態の存在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際に低レベルのベクトル化を使用する。
【００１１】
更に他の形態例では、前述の構成のような装置に対応するプログラム命令のための仮想マシン実行環境を与えるようにコンピュータを制御するコンピュータプログラムを持続的形態で記憶するコンピュータプログラムプロダクトが提供される。
【００１２】
更に別の形態例では、それぞれが複数の要素を含むベクトルオペランドを記憶するためのレジスタストア手段と、命令によって定められる動作を行うために命令を実行するための実行手段であって、レジスタストア手段とメモリとの間でベクトルオペランドを移動させるためにメモリアクセス動作を行うためのアクセス手段と、前記ベクトルオペランドを使用してデータ処理動作を行うための処理手段とを備える、実行手段と、を備え、実行手段がベクトルループを反復的に実行するようになっており、各反復中に、実行手段は、命令のシーケンスを実行してベクトルループを実施するようになっており、前記シーケンスは、複数のメモリアドレスを特定するチェック命令を含み、実行手段は、チェック命令の実行に応答して、複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定し、ベクトルループのそれぞれの反復ごとに、実行手段は、前記アドレスハザード状態の不存在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際にデフォルトレベルのベクトル化を使用するとともに、前記アドレスハザード状態の存在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際に低レベルのベクトル化を使用する、装置が提供される。
【００１３】
添付図面に示される本技術の実施形態に関連して、本技術を単なる一例として更に説明する。
【図面の簡単な説明】
【００１４】
【図１】１つの実施形態に係る装置のブロック図である。
【図２】１つの実施形態に係る図１の装置を使用するベクトルループの実行を示すフロー図である。
【図３】別の実施形態に係る図１の装置を使用するベクトルループの実行を示すフロー図である。
【図４】更なる実施形態に係る図１の装置を使用するベクトルループの実行を示すフロー図である。
【図５】チェック命令の実行中に必要とされる比較を１つの実施形態にしたがってどのようにグループ化できるのかを概略的に示す。
【図６】１つの実施形態に係る、回転子及び比較器を使用して図５に示されるグループ分けにしたがって複数のアドレス比較をどのようにマージするのかを示すブロック図である。
【図７Ａ】アドレス競合検出が必要とされる関連するアドレスベクトルが連続したメモリアドレスを含む１つの実施形態で使用され得るチェック命令の別の変形例を示すために使用される図である。
【図７Ｂ】アドレス競合検出が必要とされる関連するアドレスベクトルが連続したメモリアドレスを含む１つの実施形態で使用され得るチェック命令の別の変形例を示すために使用される図である。
【図７Ｃ】アドレス競合検出が必要とされる関連するアドレスベクトルが連続したメモリアドレスを含む１つの実施形態で使用され得るチェック命令の別の変形例を示すために使用される図である。
【図７Ｄ】アドレス競合検出が必要とされる関連するアドレスベクトルが連続したメモリアドレスを含む１つの実施形態で使用され得るチェック命令の別の変形例を示すために使用される図である。
【図７Ｅ】アドレス競合検出が必要とされる関連するアドレスベクトルが連続したメモリアドレスを含む１つの実施形態で使用され得るチェック命令の別の変形例を示すために使用される図である。
【図８】１つの実施形態に係る、特定のベクトルループ内で使用するためのチェック命令の適切な形態を決定するためにコンパイル動作をどのように実行できるのかを概略的に示すフロー図である。
【図９】ベクトルループ内に挿入されるチェック命令のタイプに依存するスカラー実装にわたるベクトル化されたコードの潜在的な高速化を示すグラフである。
【図１０】１つの実施形態に係るデータ処理装置の仮想マシン実装を概略的に示す。
【発明を実施するための形態】
【００１５】
添付図面を参照して実施形態を論じる前に、以下の実施形態の説明が与えられる。
【００１６】
１つの実施形態では、ベクトルオペランドを記憶するためにレジスタストアを有する装置が提供され、その場合、各ベクトルオペランドは、複数の要素と、命令を実行してこれらの命令により定められる動作を実行するための実行回路とを備える。実行回路は、レジスタストアとメモリとの間でベクトルオペランドを移動させるためにメモリアクセス動作を実行するためのアクセス回路と、ベクトルオペランドを使用してデータ処理動作を実行するための処理回路とを有する。実行回路は、ベクトルループを反復的に実行するようになっていてもよく、また、各反復中に命令のシーケンスを実行してベクトルループを実施するようになっていてもよい。記載された実施形態によれば、シーケンスは、複数のメモリアドレスを特定するチェック命令を含み、また、実行回路は、チェック命令の実行に応答して、複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定する。記載された実施形態によれば、ベクトルループのそれぞれの反復ごとに、実行回路は、アドレスハザードの不存在を決定するチェック命令の実行に応答し、ベクトルループを実施するべく命令のシーケンスを実行する際にベクトル化のデフォルトレベルを使用する。一方、アドレスハザード状態の存在を決定するチェック命令の実行に応じて、実行回路は、ベクトルループを実施するべく命令のシーケンスを実行する際にベクトル化の低いレベルを使用するようになっている。
【００１７】
記載された技術は、ベクトルループの各反復中にアドレスハザード状態の存在又は不存在を動的に決定するための効率的なメカニズムを提供する。この手法は、ベクトルループの任意の特定の反復中に使用されるベクトル化のレベルがベクトルループの反復内でチェック命令を実行する結果により直接に影響され得るようにすることによって、低レイテンシ解決策を提供する。特に、ベクトル化のデフォルトレベルが与えられる状態で、チェック命令の実行がアドレスハザード状態の存在を決定する任意の特定の反復に関し、実行回路は、ベクトル化の低いレベルを直接に使用して、そのアドレスハザード状態に対処し、そのため、メカニズムは、ベクトルループの各反復中に使用されるベクトル化のレベルを動的に切り換えることができる。
【００１８】
そのような手法により、コードをベクトル化することができるとともに、基本的にベクトルループ反復ごとに、結果として生じ得るアドレスハザードに効率的に対処できる。このメカニズムと関連付けられる低レイテンシに起因して、等価なスカラー処理と比べると、ベクトル演算の実行時にアドレス競合が生じ得る様々な状況でかなりの性能利点をもたらすことが分かってきた。使用されるベクトル化のレベルをベクトルループの各反復で動的に変えることができるため、それにより、幾つかの反復がアドレス競合を有し且つ他の反復がアドレス競合を有さない状況で、かなりの性能利点をもたらすことができる。
【００１９】
デフォルトレベルのベクトル化と低レベルのベクトル化とを実施できる方法は多く存在する。１つの実施形態において、実行回路は、アドレスハザード状態の不存在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンス内の第１の複数の命令を実行することによってベクトル化のデフォルトレベルを使用する。一方、実行回路は、アドレスハザード状態の存在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンス内の第２の複数の命令を反復的に実行することによってベクトル化の低レベルを使用する。
【００２０】
したがって、そのような実施形態では、アドレスハザード状態が検出されるときに第２の複数の命令を含む効率的なフォールバックパスを与えることによって、チェック命令の実行結果がループ内の制御フローに直接に影響を及ぼす。フォールバックパスの効率的な付与によって、そのような手法は、さもなければベクトル化できないと見なされるスカラーコードのベクトル化を可能にする。特に、スカラーコードをベクトル化することができ、また、ベクトルループの各反復中のチェック命令の実行により、アドレスハザード状態が検出されるときにはいつでも処理がフォールバックパスに移ることができる。その結果、そのフォールバックパス内の第２の複数の命令の反復実行は、アドレスハザードを回避することによって正しい処理が行われるようにする。
【００２１】
ベクトルループの現在の反復内で使用されるベクトル化のレベルに影響を及ぼすようにチェック命令の実行をもたらすことができる方法は多く存在する。１つの実施形態において、実行回路は、チェック命令の実行に応答して、シーケンス内のその後の命令による参照のために、アドレスハザード状態が存在するかどうかを示す結果データを生成する。
【００２２】
結果データは様々な形態をとることができる。例えば、結果データは、その後の命令による参照のためにシステムレジスタに書き込まれてもよい。或いは、結果データは、実行回路によって参照される状態フラグなどの１つ以上のフラグの更新において直接に表されてもよい。そのような手法によって、その後の命令の動作は、結果データによって更新されるそれらのフラグの現在の状態によって影響され得る。例えば、１つの実施形態では、その後の命令が分岐命令であり、該分岐命令は、実行回路によって実行されると、第１の複数の命令を実行すべきかどうか又は第２の複数の命令を反復的に実行すべきかどうかを決定するために１つ以上のフラグを参照する。したがって、そのような手法によって、分岐命令は、チェック命令を実行する結果として設定されるフラグに応じて第２の複数の命令に条件付きで分岐するようになっていてもよい。そのため、アドレスハザード状態が存在しない場合には、分岐命令の実行により、処理が第１の複数の命令を進めるだけであり、一方、ハザード状態が存在する場合には、分岐命令の実行により、命令フローが第２の複数の命令に分岐し、第２の複数の命令は、その後、ベクトルループの現在の反復によって必要とされる処理を実施するために反復的に実行され得る。
【００２３】
第２の複数の命令は様々な形態をとることができる。１つの実施形態では、これらの命令がスカラー命令を含み、これらのスカラー命令によって実行回路が個々の要素に対して作用し、また、ベクトルループを実施するために必要な第２の複数の命令の反復実行の数は、ベクトル化のデフォルトレベルと関連するベクトルオペランドのアクティブ要素の数に依存する。そのため、単なる一例として、ベクトル化のデフォルトレベルと関連するベクトルオペランド内に８個のアクティブ要素が存在する場合、第２の複数の命令は、ベクトルループの現在の反復を実施するために８回実行されてもよく、各反復中に、第２の複数の命令は、ベクトル化のデフォルトレベルが維持された際、したがって第１の複数の命令が実行された際に実行された並列処理のレーンの１つと関連するスカラー値に作用する。
【００２４】
しかしながら、別の実施形態では、第２の複数の命令がスカラー命令を含まなくてもよく、その代わりに、第２の複数の命令は、ベクトル化のデフォルトレベルと比べて少ない数のベクトル要素に作用するベクトル命令を含んでもよい。例えば、１つの実施形態において、実行回路は、チェック命令の実行に応答して、初期述語値を有するガード述語を生成し、また、第２の複数の命令はベクトル命令を含み、このベクトル命令により、実行回路は、１つ以上のベクトルオペランドの要素のサブセットに同時に作用し、前記サブセットはガード述語によって特定される。第２の複数の命令のそれぞれの反復時、ガード述語の述語値は、任意の先行する反復によって作用される１つ以上のベクトルオペランドの要素を排除するように更新される。そのため、そのような手法によれば、第２の複数の命令を反復的に実行してベクトルループの現在の反復と関連するベクトルオペランドの要素の全てを処理することが依然として必要であるが、第２の複数の命令の各反復では複数の要素が並列に処理される。これにより、ベクトル化のレベルを縮小してアドレスハザード問題を回避することができるが、その一方では、依然としてベクトル化のレベルをベクトルループの現在の反復内で達成できる。
【００２５】
１つの実施形態では、マスター述語を使用してベクトルオペランド内のアクティブ要素を特定することができる。そのため、ベクトル化のデフォルトレベルが使用される場合であっても、ベクトルオペランド内で定められる全ての要素がベクトルループの現在の反復内で処理されるとは限らない場合がある。したがって、アドレスハザード状態の存在下で第２の複数の命令を含むフォールバックパスを採用することが決定される際には、マスター述語によってアクティブ要素であると見なされないベクトルオペランドの任意の要素が作用されないようにすることも重要である。１つの実施形態において、これは、マスター述語によって特定されるアクティブ要素である要素のサブセットを特定するようにガード述語を制約することによって達成される。
【００２６】
前述したような幾つかの実施形態において、低レベルのベクトル化は、別個のフォールバックパスを与えることによって、及び、アドレスハザード状態の存在下でそのフォールバックパスが使用されるようにチェック命令の実行がループ内の制御フローに直接に影響を及ぼすようにすることによって実施されるが、別の実施形態では、そのような別個のフォールバックパスを与える必要がない場合がある。特に、別の実施形態によれば、デフォルトレベルのベクトル化は、第１の数のアクティブ要素を特定し、また、実行回路は、アドレスハザード状態の不存在を決定するチェック命令の実行に応じて、ベクトルループを実施するべく命令のシーケンスを実行する際に第１の数の要素を並列に処理するようになっている。しかしながら、実行回路は、チェック命令の実行に応答して、チェック命令の実行がアドレスハザード状態の存在を決定するときにアクティブ要素の数を第１の数よりも少ないアクティブ要素の第２の数に減らす制御出力を生成し、それにより、実行回路は、ベクトルループを実施するべく命令のシーケンスを実行する際に第２の数の要素を並列に処理することによってベクトル化の低レベルを使用する。
【００２７】
したがって、そのような手法によれば、チェック命令の実行結果に応じて制御フローの変化を引き起こすのではなく、チェック命令の実行を使用して、チェック結果に応じて処理されるアクティブ要素の数を直接に変更することができる。そのため、ベクトルループの各反復中に、処理されたアクティブ要素の数は、その特定の反復に関するチェック命令の結果に応じて変更されてもよい。したがって、アドレスハザード状態が検出されない任意の反復に関しては、デフォルトの第１の数の要素が並列に実行されてもよいが、アドレスハザード状態が検出される任意の反復に関しては、処理がチェック命令の結果によって決定される少ない数のアクティブ要素に関して進んでもよい。これにより、チェック結果は、ベクトルループの各反復中に処理される要素の数を直接に制御することができ、その結果、反復ごとのレベルでベクトル化の程度を動的に調整することができる。
【００２８】
１つの実施形態では、ベクトルループの各反復の開始時に、実行回路は、デフォルトレベルのベクトル化の使用に戻るようになっている。そのため、使用されるベクトル化のレベルにおける任意の縮小がベクトルループの各開始時にリセットされ、それにより、ベクトル化の完全なデフォルトレベルを可能な限り使用することができる。
【００２９】
アドレスハザード状態の存在下で処理されるべきアクティブ要素の第２の数を特定できる方法は多く存在する。１つの実施形態において、チェック命令を実行する際に実行回路によって生成される制御出力は、アクティブ要素の第２の数を形成するアクティブ要素を特定するガード述語を含む。
【００３０】
チェック命令を実行する際に行われるチェック動作の性質は、実施形態に応じて変化し得る。１つの実施形態において、チェック命令は、複数のアクティブアドレス要素を含む少なくとも１つのベクトルオペランドを定め、また、実行回路は、チェック命令の実行時に、それぞれのアクティブアドレス要素とそれぞれの他のアクティブアドレス要素とを比較して、アドレスハザード状態が存在するかどうかを決定するようになっている。
【００３１】
別の実施形態において、チェック命令は、連続するアドレスの第１のシーケンスと関連する第１のアドレスと、連続するアドレスの第２のシーケンスと関連する第２のアドレスとを定めてもよく、また、実行回路は、チェック命令の実行時に、第１のアドレスと第２のアドレスとの間の差に応じてアドレスハザード状態の存在を決定するようになっている。
【００３２】
そのような手法は、アドレス競合を引き起こし得るアドレスの関連するベクトルがそれぞれ連続するアドレスのシーケンスを定める状況で必要な比較を行うための効率的なメカニズムを提供することができる。
【００３３】
計算された差に基づいてアドレスハザード状態の存在を検出できる方法は多く存在する。  例えば、１つの実施形態では、第１のアドレスをｘ、第２のアドレスをｚとすると、差ｚ−ｘがベクトル長以上であるか或いは負又は０である場合、アドレスハザード状態が存在しないようにすることができる。しかしながら、差ｚ−ｘがベクトル長よりも小さく０よりも大きい場合には、アドレスハザード状態が生じる。
【００３４】
別の実施形態では、代わりに、第１のアドレスと第２のアドレスとの間の絶対差がベクトル長以上ではない状況を検出するべくチェックを行うことが決定されてもよい。絶対差がベクトル長よりも小さい場合、このことはアドレスハザード状態の存在を示すことができる。しかしながら、ｚ−ｘの計算の符号付きの整数結果がベクトル長より小さいとともに負又は０に等しいときには実際には競合状態が存在しないため、絶対差に基づくチェックが幾つかの誤検出をもたらす場合があることに留意すべきである。
【００３５】
１つの実施形態において、チェック命令は、実行回路に必要なチェック動作を行わせてベクトルループ反復の残りの処理に直接に影響を及ぼすために必要な結果データを生成させるようになっていてもよいが、別の実施形態では、チェック動作と他の動作とを組み合わせることによって更なる性能向上を得ることができる。例えば、１つの実施形態では、チェック命令がチェック・メモリアクセス命令であり、実行回路は、チェック・メモリアクセス命令の実行に応答してチェック動作を実行し、複数のメモリアドレス中にアドレスハザード状態が存在するかどうかを決定する一方で、複数のメモリアドレスに関してメモリアクセス動作も行う。
【００３６】
メモリアクセス動作は様々な形態を成すことができる。例えば、メモリアクセス動作は、チェック・メモリアクセス命令によって定められる複数のメモリアドレスを使用してメモリからデータを検索するために使用されるギャザー動作の形態を成すことができる。チェック命令の機能性をメモリアクセス命令とマージすることにより、チェック動作のレイテンシを隠すことができる。また、ある場合には、メモリアクセス動作を行うために必要な処理の一部をチェック動作のために再使用できることも分かる。
【００３７】
チェック動作及びメモリアクセス動作を単一の命令に組み合わせることによって、更なる利点を得ることもできる。例えば、実行回路は、アドレスハザード状態の存在を決定する際に、メモリアクセス動作の任意の残りの部分を終了するようになっていてもよい。したがって、これは、アドレスハザードチェック結果に応じたメモリアクセス動作の幾つかの部分の早期終了を可能にする。そのため、これは、不必要な動作の実行を避けることができ、したがって装置の全体的な効率を向上させることができる。
【００３８】
１つの実施形態において、処理回路は、チェック命令の実行時にチェック動作を行うための専用のチェック回路を備えてもよい。しかしながら、別の実施形態では、そのような専用のチェック回路を設ける必要がない場合があり、代わりに、データ処理動作を実行するために設けられる処理回路内の既存の処理ユニットを再使用して、チェック命令の実行時に必要なチェック動作を行ってもよい。
【００３９】
１つのそのような実施形態では、チェック動作の実行中に必要とされる１つ以上のアドレス比較をマージするために処理ユニット内の回転子回路及び比較器回路が使用される。したがって、処理ユニット内の既存のハードウェアを使用して、チェック動作を行う際に必要なアドレス比較の性能の効率を向上させることができる。
【００４０】
前述したように、幾つかの実施形態では、チェック動作の結果を使用して、ベクトルループ内の１つ以上のその後の命令を実行する際に実行回路によって参照される状態フラグを直接に更新することができる。しかしながら、別の実施形態では、装置がハザードチェック状態レジスタを更に備えていてもよく、実行回路は、チェック命令の実行によって生成される結果データをこのハザードチェック状態レジスタに記憶するようになっている。これは、例えば、命令符号化空間が非常に限られている状況において幾つかの利点をもたらすことができる。例えば、そのような状況では、例えばチェック・メモリアクセス命令の先の例のように、単一の命令を介してチェック動作と他の動作とを組み合わせることが決定されてもよい。このとき、チェック動作が必要でなかった状況ではチェック動作の結果の使用を無視することができる。特に、そのようなシナリオでは、ハザードチェック状態レジスタが結果に伴って更新されるが、その後の命令はハザードチェック状態レジスタを参照せず、したがって、命令の実行は特定のメモリアクセス動作を効果的に行うことができる。したがって、これにより、必要に応じて、単一の命令は、標準的なメモリアクセス動作、又は、関連するアドレス競合チェックを伴うメモリアクセス動作を行うようになることができる。アドレス競合検出を使用することが望まれた状況では、例えば、その後の命令は、ハザードチェック状態スレジスタの内容を読み出して、状態フラグを適切に設定するようになることができ、その後、前述したように分岐命令を実行することができ、この場合、制御フローは、状態フラグがどのように設定されたか、したがって、アドレスハザード状態が検出されたか否かに依存する。他の実施形態では、チェック・メモリアクセス命令が状態フラグを直接に設定することができる。
【００４１】
１つの実施形態では、各ベクトルオペランドがＮ個の要素を含み、また、Ｎ個のアクティブ要素は、実行回路が前記アドレスハザード状態の不在を決定するチェック命令の実行に応答してベクトルループを実施するべく命令のシーケンスを実行する際にＮ個の要素を並列に処理するようにベクトル化のデフォルトレベルに関連付けられる。したがって、そのような実施形態では、それぞれの定められたベクトルオペランドの全ての要素がアクティブ要素であると見なされて適切な処理を受ける。
【００４２】
しかしながら、別の実施形態では、各ベクトルオペランドがＮ個の要素を含み、マスター述語がＮ以下の数の要素をアクティブ要素として特定し、また、ベクトル化のデフォルトレベルは、マスター述語によって特定されるアクティブ要素に対応し、それにより、実行回路は、アドレスハザード状態の不在を決定するチェック命令の実行に応答して、ベクトルループを実施するべく命令のシーケンスを実行する際にマスター述語によって特定されるアクティブ要素を並列に処理する。したがって、マスター述語の使用により、各ベクトルオペランド内の定められた要素のサブセットをベクトルループ反復内で処理されるべきアクティブ要素として特定することができる。
【００４３】
幾つかの実施形態では、チェック命令の複数の異なる変形が提供されてもよい。例えば、１つ変形は、アドレスハザード状態が検出されるときにはいつでも１つ以上のフラグをセットするが、どのアドレス要素がアドレスハザードを引き起こしているかについての情報を捉えないようになっていてもよく、一方、他の変形は、アドレス衝突が検出された入力ベクトルの要素内の場所にその値が依存する、ガード述語を生成するようになっていてもよい。本発明者らは、実際に検出されるアドレス衝突の統計的性質に応じて、チェック命令の様々な変形により異なるレベルの性能向上を達成できることを理解した。１つの実施形態において、装置は、命令のシーケンスを実行するときに検出されるアドレスハザード状態に関する情報を維持するようになっていてもよく、この場合、その情報は、経時的なコードの再コンパイルを可能にするべくコンパイラに利用できるようにされる。
【００４４】
特に、１つの実施形態において、装置は、先に実行された命令シーケンスに関するアドレスハザード状態の発生に関連する履歴データを維持するためのカウンタ回路を更に備え、また、実行回路は、複数の異なるタイプのチェック命令を含む命令セットの制御下で動作するようになっている。その後、履歴データをコンパイラが利用できるようにすることにより、コンパイラは、履歴データを考慮に入れてベクトルループ内でどのタイプのチェック命令を使用すべきかを決定することができる。
【００４５】
コンパイラは、静的コンパイラであってもよく、又は、履歴データに応じて実行される命令シーケンスを動的に変更するためにランタイム時に使用される動的コンパイラであってもよい。
【００４６】
履歴データは様々な形態を成すことができる。例えば、１つの実施形態において、履歴データは、所定の期間にわたってアドレスハザード状態の発生をカウントするだけでもよい。別の実施形態において、履歴データは、これに加えて又は代えて、各ベクトル長内で検出されるアドレス競合の数を捉えようとしてもよい。性能を最も向上させるために使用されるチェック命令のタイプが、検出されるアドレス衝突の総数に依存するだけでなく、それらのアドレス衝突が特定のベクトル長内でクラスタリングされるのか或いはベクトルループの反復内でより均一に分配されるのかどうかにも依存して変化し得ることが分かってきた。アドレス衝突の総数及びそれらのアドレス衝突がベクトル長グループ内でどのようにクラスタリングされるのかに関する情報の両方を捉える履歴データを維持することにより、これは、チェック命令の異なる変形を使用して性能を向上させる最良の方法を決定するための適切な情報をコンパイラに与えることができる。
【００４７】
ここで、図面を参照して特定の実施形態を説明する。
【００４８】
前述したように、性能に関してベクトル化が望まれる多くの現実のプログラムでは、スカラーコードにおいて軽微ではない大きさのアドレス依存性が反復間に存在し得る。説明のために、多くの使用ケースが考慮される。最初の使用ケースとして、以下の演算を実行することが望ましいヒストグラム問題が考慮される。
ｆｏｒ（ｘ＝０；ｘ＜ＳＩＺＥ；ｘ＋＋）｛
Ａ［Ｃ［ｘ］］＋＋；
｝
【００４９】
本質的に、演算は、ｘの一連の値に関して、アドレスを形成するために使用されるようになっている配列Ｃからデータを取得して、そのアドレスでデータ値Ａにアクセスした後、そのデータ値を１だけインクリメントすることを伴う。
【００５０】
競合状態が存在しない（すなわち、アドレス競合がない）ことを保証できる場合には、臨界ループのためのベクトル擬似コードが以下のように表されてもよい。
・オフセットｘの配列ＣからベクトルレジスタｚＣへの連続読み取りを実行する
・ｚＣのポインタを使用して配列Ａから収集し、結果をベクトルレジスタｚＡに書き込む
・ｚＡの全ての要素に＃１を加える
・ｚＣのポインタを使用してベクトルｚＡを分散する
・ベクトル長だけｘをインクリメントする
・ｘが配列のサイズより小さいかどうかをチェックし、それが当てはまる場合には反復処理を続ける
【００５１】
したがって、ポインタのベクトルは、配列Ｃから得られて、ベクトルレジスタｚＣに記憶され、その後、ベクトルレジスタｚＣの様々なポインタを使用して配列Ａからのデータ値が集められる。レジスタｚＣのポインタを使用して配列Ａから得られたデータ値がベクトルレジスタｚＡにポピュレートされた時点で、数値１が全てのデータ値に加えられ、結果として得られるデータ値がレジスタｚＣの同じポインタを使用して元のメモリに分散される。このプロセスは、ｘがもはや演算のために定められる配列のサイズより小さくならなくなるまで繰り返される。
【００５２】
ヒストグラム演算をベクトル化することによってこれが性能を大きく高め得ることが分かる。しかしながら、配列Ｃ内の幾つかのエントリが同じアドレス要素を参照する可能性があるとともに、そのようなアドレス衝突がインデックスの単一のベクトル（すなわち、ベクトルループの１回の反復で使用されるアドレスのベクトル）にたまたま存在する場合、前述の手法は、不正確な結果（特に、１つ以上のデータ値が正しい量だけインクリメントされない場合がある）をもたらす。記載された実施形態に関連して以下で更に詳しく説明するように、ベクトル化を完全に避ける代わりに（低性能につながる）、記載された技術は、前述の競合状態をランタイム時に検出できるようにするベクトルループ内のチェック命令を使用し、また、適切な措置がとられる。
【００５３】
２番目の使用ケースとして、以下の演算の実行を必要とするメモリコピー（Ｍｅｍｃｐｙ）問題を考慮する。
ｆｏｒ（ｘ＝０；ｘ＜ＳＩＺＥ；ｘ＋＋）｛
Ａ［ｘ］＝Ｂ［ｘ］；
｝
【００５４】
この演算は、データを１つの配列から他の配列へコピーする。このコードは、通常、ループ内に制御コードがないため、ベクトル化のための良好な候補である。しかしながら、ベクトル化が任意のアドレス競合をもたらすか否か（配列Ａ，Ｂが重複する場合がある）は不確かであるため、十分なヒントをコンパイラに与えることなくコードを安全にベクトル化することができない。多くの場合、実際にはランタイム時にハザードは存在しないが、コンパイラは、一般に、慎重な手法をとり、曖昧さが存在する場合にはコードをベクトル化せず、それにより、任意の性能向上を犠牲にする。しかしながら、後述するように、本明細書中に記載されるチェック命令の使用を採用することにより、ランタイム時に潜在的なハザードを特定して、適切な是正措置をとることができ、それにより、コンパイル時、コードが実行される際に任意のハザードが発生するか否かが分からないときであっても、ベクトル化の性能向上の利益を享受できる。
【００５５】
記載された実施形態にしたがって与えられるチェック命令を更に詳しく論じる前に、図１を参照して、命令が実行され得る装置について最初に説明する。特に、図１は、１つの実施形態に係るデータ処理装置を示し、この場合、装置により実行されるべき命令は命令キュー１００内に配置され、この命令キュー１００から命令がデコード回路１０５に伝えられる。デコード回路は、発行キュー１１０内に配置される特定の制御情報を生成するために命令をデコードし、そのような制御情報は時としてマイクロ−ｏｐｓと称される。発行キューは、その後、受けられた命令によって定められる動作が実行されるようにするために、装置の実行回路を形成する関連する処理ユニットに適切な制御情報をディスパッチする。
【００５６】
実行回路は、特定のデータ処理動作を行うための多くの処理ユニットから成る処理回路１１５と、メモリとベクトルレジスタファイル１４０との間でいずれかの方向にベクトルオペランドを移動させるために使用されるベクトルロード／ストアユニット（ＬＳＵ）１４５とを備えると考えられてもよい。
【００５７】
図１に示される例において、処理回路１１５は、複数のベクトル処理ユニット１２０，１２５，１３０，１３５から形成される。したがって、発行キュー１１０内で特定される浮動小数点演算が処理用の浮動小数点ユニット（ＦＰＵ）１３５に転送され、乗算演算及び／又は乗累算演算が乗累算（ＭＡＣ）ユニット１３０に伝えられ、及び、標準的な算術演算が算術論理ユニット（ＡＬＵ）１２５に伝えられる。アドレスハザード状態が存在するかどうかを決定するために必要なアドレス比較演算を行うべく、以下で更に詳しく論じられるべきチェック命令を実行するために専用チェックユニット１２０を設けることができる。後述するように、実行されるチェック命令の変形に応じて、必要なアドレス比較演算の結果は、１つ以上のフラグ１５５を設定させ、及び／又は、述語レジスタファイル１５０の述語レジスタのうちの１つの述語レジスタ内でガード述語を設定させる。別個の専用のチェックユニットを有する代わりに、処理回路内の既存のユニットのうちの１つを用いて、チェック命令を実行するのに必要な動作を行ってもよい。例えば、後述するように、１つの実施形態では、ＡＬＵ１２５を使用して、チェック命令を実行するとともに、それに応じてフラグ１５５及び／又はガード述語を述語レジスタファイル１５０内に設定してもよい。
【００５８】
ベクトル処理回路１１５によって必要とされる様々な入力オペランドは、ベクトルレジスタファイル１４０内のソースレジスタから読み取られる。加えて、各ユニットによって生成される結果オペランドは、一般に、ベクトルレジスタファイル１４０内の元の宛先レジスタに記憶される。オペランドデータがメモリからベクトルレジスタファイル１４０の定められたレジスタにロードされるようにするために、又は、ベクトルレジスタのうちの１つ以上の内容が元のメモリに記憶されるように、ロード・ストア命令を使用して、対応するロード・ストア動作がＬＳＵ１４５によって行われるようにする。
【００５９】
多くのシステムレジスタ１６０が設けられてもよく、データ処理装置の動作を制御するためにシステムレジスタ１６０の内容が使用される。以下で更に詳しく説明されるように、１つの実施形態では、フラグ１５５を直接に設定する代わりに、処理回路により実行される１つ以上のその後の命令によるその後の参照のために、チェック動作の結果がハザードチェック状態レジスタ（ＨＣＳＲ）１６５内に記憶されてもよい。
【００６０】
以下で更に詳しく論じられるように、装置内でベクトル演算を行う際に検出されるアドレス衝突の数に関する履歴データを維持するために１つ以上のアドレス衝突統計カウンタ１７０が設けられてもよい。装置に利用可能な命令セットがチェック命令の多くの異なる変形を含む状況では、アドレス衝突に関する適切な統計カウンタを維持することで、これにより、チェック命令のどの変形がより良い性能向上を与える可能性が最も高いのかをコンパイラコードが評価することができ、それにより、コードの再コンパイルが統計カウンタにより維持される履歴データを考慮に入れることができることが分かってきた。これについては、図８及び図９に関連して後述する。
【００６１】
以下に説明される実施形態によれば、図１の装置は、ベクトルループを反復的に実行するようになっていてもよく、また、各反復中に、実行回路は、命令のシーケンスを実行してベクトルループを実施するようになっており、この場合、そのシーケンスは、アドレスハザード状態の存在に関してチェックされるべき複数のメモリアドレスを特定するチェック命令を含む。記載された実施形態によれば、チェック命令の多くの異なる変形が想定される。第１の変形は以下の通りである。
変形１：ＣＨＥＣＫ  Ｐｇ，Ｚｎ．＜Ｔ＞    ／／ｆｌａｇ−ｓｅｔｔｉｎｇ  ｏｎｌｙ
【００６２】
入力オペランドＺｎは、アドレス要素のベクトルを含むベクトルレジスタを特定する。オペランドＰｇは、ベクトルオペランドＺｎ内のアドレス要素のいずれがアクティブアドレス要素であるかを特定するために使用されるマスター述語を含む述語レジスタを特定する。アドレス要素は、直接にアドレスを特定してもよく、或いは代わりに、アドレス自体を特定するためにベースアドレスと組み合わされるポインタ／オフセットであってもよい。１つの実施形態において、そのようなマスター述語の指定は任意であってもよく、また、定められたマスター述語が存在しない場合には、ベクトルオペランドＺｎ内の全てのアドレス要素がアクティブアドレス要素であると想定される。最後に、パラメータＴは、例えば３２ビットデータ、６４ビットデータなどのデータタイプを特定する。したがって、これにより、ベクトルオペランド内の各要素のサイズが特定される。チェック命令の実行時に、処理回路１１５は、アドレス要素のいずれかが同じであるかどうかを決定するために各アクティブアドレス要素とそれぞれの他のアクティブアドレス要素とを比較するとともに、そのような状況を検出する際に、アドレスハザード状態の存在を示す出力を生成する。前述の変形１によれば、出力により、アドレスハザード状態の有無を示す１つ以上の状態フラグ１５５が設定される。
【００６３】
ここで、図２を参照して、ヒストグラム問題の前述した最初の使用ケースを考慮する際の変形１のチェック命令の使用について更に詳しく説明する。ステップ２００では、オフセットｘが初期化され、その後、ステップ２０５において、一連のポインタ（アドレス要素）がオフセットｘを用いてベクトルレジスタｚＣにロードされる。オフセットｘを用いてステップ２０５で行われる連続アドレスロードは、必要に応じてマスター述語情報を考慮に入れることができる。その後、ステップ２１０において、レジスタｚＣにロードされたポインタは、前述のチェック命令の実行によってアドレス衝突に関してチェックされ、それに応じてフラグ１５５が設定される。マスター述語が定められる場合には、任意の非アクティブアドレス要素を排除するためにチェック動作がマスター述語によって制約される。
【００６４】
その後、ステップ２１５では、フラグがアドレス衝突の存在を示すかどうかが決定される。そうでない場合、このことは、ベクトルレジスタｚＣ内の全てのアクティブアドレス要素が一意的なものであることを示し、したがって、ベクトルループの現在の反復に関してベクトル化のデフォルトレベルを採用することができる。説明のために、８個のアクティブアドレス要素Ａ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｇ、Ｈが存在するものとし、したがって、ベクトル化のデフォルトレベルを採用すると、８個のアドレスの全てが並列に処理される。
【００６５】
したがって、チェック動作の実行によって任意のアドレス衝突の不存在が検出される場合には、プロセスがステップ２２０に進み、ステップ２２０では、ベクトルオペランドレジスタｚＣの全てのアドレスポインタを使用してメモリからデータが収集され、その場合、結果として得られるデータがベクトルレジスタｚＡに書き込まれる。その後、ステップ２２５では、ロードされたデータに関して必要な１つのベクトル演算又は複数のベクトル演算が行われ、その結果が元のベクトルレジスタｚＡに書き込まれる。先のヒストグラム問題を考慮すると、このステップで必要とされるのは、レジスタｚＡにロードされた各データ値に１を加えることだけであるが、他のタイプの演算のために、１つ以上の異なるベクトル演算を代わりにステップ２２５で行うことができるのが分かる。望まれる場合には、並列処理の非アクティブレーンに関連するデータを処理しないようにステップ２２５を制約することができる。例えば、非アクティブレーンと関連する任意の例外の想定し得る発生を回避するためにベクトル演算を行うときにマスター述語を考慮することは有益となり得る。
【００６６】
その後、ステップ２３０において、ベクトルレジスタｚＡ内のデータは、オペランドレジスタｚＣの同じアドレスポインタを使用して元のメモリに分散される。マスター述語が定められた場合には、マスター述語によって分散動作が制約される。
【００６７】
この時点で、ベクトルループ反復がデータの８個のレーンを並列に処理し、したがって、８個のアドレスが考慮されたことが分かる。したがって、ステップ２３５では、オフセットｘがベクトル長だけインクリメントされ、その後、ステップ２４０では、処理すべき任意の更なるデータがあるかどうかが決定される。そうでない場合、プロセスはステップ２４５で終了するが、処理すべき更なるデータがあるとすると、プロセスは、ステップ２０５に戻って、ベクトルループの次の反復を行う。
【００６８】
ステップ２１５において状態フラグがアドレス衝突を示すと決定されれば、図２に記載される実施形態にしたがい、図２の右側に示される一連のステップにより実施されるフォールバックパスに分岐することによって低レベルのベクトル化が使用される。単なる一例として、８個のアドレス要素のシーケンスがＡ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｃ、Ｈであり、したがって、アドレス要素Ｃの２つの発生に起因してアドレス競合が存在すると仮定する。この状況では、チェック命令の後に状態分岐命令を実行することによってプロセスをフォールバックパスに分岐させることができ、この場合、分岐命令は、チェック命令の実行によって設定されるフラグがアドレスハザード状態の存在を示す場合にフォールバックパスに分岐する。
【００６９】
ステップ２５０では、処理のための単一のレーンのみを特定するために述語が初期化される。そのため、最初の反復において、その述語は、ベクトル化のデフォルトレベルにしたがって８個の処理レーンが存在すると仮定すると、「１０００００００」の値に初期化され得る。その後、ステップ２５５では、最初の反復において、オペランドレジスタｚＣから１つのポインタを選択するために述語が使用され、これはアドレスＡに対応するポインタを特定する。その後、ステップ２６０において、そのアドレスによって特定されるスカラーデータ要素がロードされて、必要なベクトル演算（先のヒストグラム問題を考えると、値を１だけインクリメントするなど）が行われ、その後、特定されたポインタを使用して結果が元のメモリに記憶される。
【００７０】
その後、ステップ２６５では、処理すべき任意の更なるアクティブレーンがあるかどうかが決定され、アクティブレーンの数は定められた任意のマスター述語に依存する。処理すべき更なるアクティブレーンがあると仮定すると、プロセスはステップ２７０に進み、この場合、述語は、定められた任意のマスター述語を考慮する次のアクティブレーンを特定するように調整される。その後、処理はステップ２５５に戻る。単なる一例として、マスター述語がアクティブ要素を含むものとして８個の全てのレーンを特定する場合又はマスター述語が定められない場合には、引き続いてそれぞれのアドレス要素ごとにステップ２５５，２６０，２６５のプロセスが８回繰り返され、その後、ステップ２６５において、処理すべき更なるアクティブレーンが存在しないと決定されるのが分かる。この時点で、処理は、全ベクトルパスに戻り、特に、ステップ２３５に戻り、このステップでは、オフセットｘがベクトル長だけインクリメントされる。この時点では、ベクトルレジスタｚＣ内の全てのアクティブアドレス要素が図２の右側に示されるステップの反復実行により処理されてしまっているため、オフセットｘをベクトル長だけインクリメントすることが適切である。その後、プロセスは、ステップ２４０を介して次のベクトルループ反復に進むことができる。
【００７１】
変形例１のチェック命令によれば、ステップ２１０が行われる際に、アドレス比較プロセスが幾つかの状況で早期に終了し得るのが分かる。特に、アドレス衝突が検出されると直ぐに、フラグをそれに応じて設定することができ、また、任意の更なるアドレス衝突が存在するかどうかを決定するために任意の更なるアドレス比較を行う必要がない。これにより、非常に効率的なチェックプロセスをもたらすことができる。
【００７２】
更に、フォールバックパスが非常に効率的な態様で実施されるのが分かる。特に、必要なデータがスカラー態様でロードされるが、必要なアドレスの全てがベクトルレジスタｚＣ内で利用できるため、任意のスカラー演算を行って必要なアドレスにロードする必要はなく、また、ステップ２５０，２７０に関連して前述した述語を使用して調整することにより、処理されるべき各アクティブアドレス要素を、それらのアドレス要素に関して任意の更なるロード動作を行うことなく順々に特定することができる。
【００７３】
図２のプロセスを様々な方法で実施できることが分かる。しかしながら、完全を期すべく、以下のコードシーケンスは、図２のプロセスを実行するために使用することができる１つの実施例を示す。
ｍｏｖ  ｘ１，＃０
ｄｕｐ  ｚ２．ｓ，＃１
ｐｆｉｒｓｔ  ｐ１．ｂ，ｐ０，ｐ１．ｂ
ｗｈｉｌｅｌｔ  ｐ０．ｓ，ｘ１，ＳＩＺＥ
．ＬｌｏｏｐＡ：
ｌｄ１ｗ  ｚ０．ｓ，ｐ０／ｚ，［ｘＣ，ｘ１，ｌｓｌ  ＃２］    ／／Ｃｏｎｔｉｇｕｏｕｓ  ｌｏａｄ  ｉｎｔｏ  ｚ０
ｃｈｅｃｋ  ｐ０，ｚ０．ｓ
ｂ．ｎｅ  ．Ｌｆａｌｌｂａｃｋ    ／／Ｆａｌｌｂａｃｋ  ｓｅｑｕｅｎｃｅ  ｕｓｅｄ  ｗｈｅｎ
／／ｃｈｅｃｋ  ｆａｉｌｓ
ｌｄ１ｗ  ｚ１．ｓ，ｐ０／ｚ，［ｘ０，ｚ０．ｓ，ｕｘｔｗ］    ／／Ｇａｔｈｅｒ  ｕｓｉｎｇ  ｚ０
ａｄｄ  ｚ１．ｓ，ｐ０／ｚ，ｚ１．ｓ，ｚ２．ｓ    ／／Ｐｒｅｄｉｃａｔｅｄ  ａｄｄｉｔｉｏｎ
ｓｔ１ｗ  ｚ１．ｓ，ｐ０，［ｘ０，ｚ０．ｓ，ｕｘｔｗ］    ／／Ｓｃａｔｔｅｒ  ｕｓｉｎｇ  ｚ０
．Ｌｌａｂｅｌ１：
ｉｎｃｗ  ｘ１，ＡＬＬ    ／／Ａｄｖａｎｃｅ  ｂｙ  ｎｕｍｂｅｒ  ｏｆ  ｖｅｃｔｏｒ
／／ｅｌｅｍｅｎｔｓ  ｐｒｏｃｅｓｓｅｄ
ｗｈｉｌｅｌｔ  ｐ０．ｓ，ｘ１，ＳＩＺＥ    ／／Ｃｈｅｃｋ  ａｒｒａｙ  ｌｉｍｉｔｓ  ａｎｄ  ｔｒｉｍ
／／ｐｒｅｄｉｃａｔｅ
ｂ．ｆｉｒｓｔ  ．ＬｌｏｏｐＡ
……
……
．Ｌｆａｌｌｂａｃｋ：
ｐｆｉｒｓｔ  ｐ１．ｂ，ｐ０，ｐ１．ｂ
．ＬｆａｌｌｂａｃｋＬｏｏｐ：
ｌａｓｔｂ  ｘ２，ｐ１，ｚ０．ｓ
ｌｄｒ  ｘ３，［ｘ２］
ａｄｄ  ｘ３，ｘ３，＃１
ｓｔｒ  ｘ３，［ｘ２］
ｐｎｅｘｔ  ｐ１．ｓ，ｐ０，ｐ１．ｓ
ｂ．ａｎｙ  ．ＬｆａｌｌｂａｃｋＬｏｏｐ
ｂ  ．Ｌｌａｂｅｌ１
【００７４】
チェック命令の第１の変形によれば、アドレス競合の任意の発生により、関連する１又は複数のフラグがセットされ、また、処理がフォールバックパスに分岐するために、この場合、現在のベクトルループ反復が実際にスカラー演算の反復シーケンスによって実施される。  別の実施形態によれば、チェック命令は、単にフラグを設定するだけでなく、更に推し進めることができ、特に、ガード述語を設定して、どのアドレスが競合を引き起こしているのかを正確に特定することができる。図３に関連して後述するように、これはチェック動作の実施に対して幾つかの付加典型的吸着なステップを導入するが、それにより、フォールバックパスを短いベクトル長に作用するベクトル演算の反復実行によって実装することができ、そのため、フォールバックパスをより速く実装できる。したがって、１つの実施形態では、チェック命令の第２の変形が以下の通りである。
変形２：ＣＨＥＣＫ  Ｐｄ．＜Ｔ＞，Ｐｇ／Ｚ，Ｚｎ．＜Ｔ＞／／ｆｌａｇ−ｓｅｔｔｉｎｇ  ｗｉｔｈ  ｐｒｅｄｉｃａｔｅ
／／ｇｅｎｅｒａｔｉｏｎ
【００７５】
この変形において、オペランドＺｎは、チェック動作が行われるようになっているアドレス要素のベクトルを再び特定し、この場合、タイプ情報Ｔがそのベクトル内の各要素のサイズを特定する。加えて、変数Ｐｄは、第１のアドレス衝突が発生する要素を含めてこの要素に至るまで要素の第１のセットに属するアクティブ要素を示すべくガード述語情報が記憶されるようになっている結果述語を特定する。この場合も先と同様に、タイプ情報Ｔは、述語情報の各項目によって管理される各アドレス要素のサイズを特定するために使用される。変形１と同様に、マスター述語は、述語レジスタＰｇを介して、この例では、結果述語内でマスター述語によって示されるような任意の非アクティブレーンがゼロにされるべきであることを示す「／Ｚ」を介して特定され得る。これは、結果述語が単なるマスター述語のサブセットにしかなり得ないようにする。
【００７６】
図３は、図２に関連して前述した動作と同等の動作を実行するためにベクトルループの各反復を実施するべく行われ得る一連のステップを示すフロー図である。ステップ３００，３０５は、図２のステップ２００，２０５に対応し、したがって、結果として、ベクトルレジスタｚＣにはオフセットｘを使用してメモリから検索される一連のデータ項目がポピュレートされ、この場合、それらのデータ項目のそれぞれがアドレス要素を形成する。ステップ３１０において、チェック命令の変形２の実行に応じたチェック動作の実行により、ベクトルレジスタｚＣの各ポインタは、アドレス衝突、それに応じて設定されるべきフラグ、及び、更には、第１の衝突が発生する要素を含めてこの要素に至るまで要素の第１のセットに属するアクティブアドレス要素を示すべく設定されるべきガード述語に関してチェックされる。前述のように、ガード述語を設定する場合には、これがマスター述語によって制約され、したがって、アドレス衝突は、マスター述語によって示されるような非アクティブレーンと関連する任意のアドレス要素に関して見出されない。
【００７７】
その後、プロセスはステップ３１５に進み、このステップ３１５では、ベクトルオペランドｚＣのポインタを使用してデータが収集され、その結果がベクトルレジスタｚＡに書き込まれる。
【００７８】
ステップ３２０では、アドレス衝突が見出されたかどうかを示すためにフラグが評価される。そうでない場合、プロセスは、図２のステップ２２５，２３０，２３５，２４０に対応するステップ３２５，３３０，３３５，３４０に進む。図２のステップ２２５と同様に、図３のステップ３２５中、ベクトル演算は、マスター述語が定められたと仮定すると、マスター述語によって示されるように並列処理のアクティブレーン内にあると見なされるロードされたデータに関してのみ実行されるように制約されてもよい。
【００７９】
ステップ３２０においてフラグがアドレス衝突の存在を示すと決定される場合、プロセスは、分岐命令の実行により、例えば図２に関連して前述したメカニズムと同じメカニズムを使用してフォールバックパスに分岐する。説明の便宜上、図２に関連して前述した特定の例で見出されたように図３の動作を実行するときに同じアドレス衝突が見出され、そのため、アドレス要素Ｃが並列処理の第３及び第７のレーンで見出されると仮定する。したがって、プロセスがステップ３５０に進み、このステップでは、主述語がマスター述語のコピーになるように初期化される。以下の説明の目的のため、マスター述語がｐ０であり、ガード述語がｐ１であるとともに、主述語がｐ２であると仮定する。以下で更に詳しく論じられるように、主述語が作成される理由は、フォールバックパスの各反復中に主述語値が更新されるためであり、また、他の目的のために維持される必要があるマスター述語の値を破損させることが望ましくないからである。
【００８０】
その後、プロセスはステップ３５５に進み、このステップでは、ベクトル演算がロードされたデータ要素に関して実行され、その結果がレジスタｚＡに書き込まれる。随意的に、ステップ３５５の実行は、任意の不要なデータ処理動作が実行されることを避けるべくガード述語を考慮して制約される。しかしながら、他の実施形態では、ベクトル処理回路が配置される態様に起因して、並列処理の全てのレーンに関して演算を実行し、その後、ガード述語を考慮して必要とされない結果を廃棄することも同様に効率的であり得る。
【００８１】
ステップ３６０では、ガード述語によって特定されるデータ要素に関し、それらのデータ要素がベクトルレジスタｚＣの関連するポインタを使用して元のメモリに分散される。その後、ステップ３６５において、処理されたレーンに対応する主述語内の領域がクリアされ、それにより、更新された主述語ｐ２がもたらされる。その後、プロセスはステップ３７０に進み、このステップでは、処理すべき任意の残りのレーンがあるかどうかが決定される。そうでなければ、処理は全ベクトルパスに戻ることができ、特にプロセスはステップ３３５に分岐することができる。しかしながら、処理すべきレーンが残っていると仮定すると、次のガード述語を生成するために主述語によって制約されるベクトルオペランドｚＣのポインタをチェックするべく更なるチェック動作が実行される。例示目的でマスター述語が全ての８個のレーンをアクティブであると見なすとともに、アドレス競合が図３に示されるようになっている、すなわち、アドレス要素がＡ、Ｂ、Ｃ、Ｄ、Ｅ、Ｆ、Ｃ、Ｈであると仮定すると、最初のガード述語は「１１１０００００」になる。ステップ３５５，３６０，３６５を通じた第１の反復の後、主述語は「０００１１１１１」になるように更新され、したがって、チェックプロセスが新たな主述語によって制約されるステップ３７５を実行する際には、更なるアドレス競合が見出されないため、これが更新されたガード述語「０００１１１１１」を生成する。
【００８２】
ステップ３７５に続いて、その後、ステップ３８０では、ｚＣのポインタを使用してデータが収集され、その結果がレジスタｚＡに書き込まれる。ステップ３６０で行われる分散動作は必要とされるデータ項目のうちの１つ以上の値を潜在的に変更してしまっているため、ステップ３８０でデータを再収集する必要があり、したがって、ステップ３１５において既に収集されてしまったデータに依存することは適切でない。その後、プロセスはステップ３５５に戻り、このステップでは、フォールバックパスの次の反復が実行される。
【００８３】
以下の文章は、図３のプロセス内で使用される様々な述語の具体的な形態例を説明する。  例示目的で、マスター述語が「１１１１１１００」の形態を有すると仮定すると、ベクトル化のデフォルトレベルにしたがって並列処理の８個のレーンがあると想定される。このことは、最後の２つのレーンを除く全てのレーンがアクティブ要素を含むことを特定する。ステップ３１０においてアドレス競合チェックを行う際には、これが「１１１０００００」の形態の初期ガード述語の生成をもたらすと仮定される。アドレス衝突の存在がステップ３２０で検出されるとともに、プロセスがフォールバックパスに分岐し、その場合、主述語ｐ２は、マスター述語と等しくなるように初期化され、したがって値「１１１１１１００」をとる。フォールバックパスの最初の反復中、ステップ３６０で分散動作が実行された後、主述語は、ステップ３６５で更新されて、新たな形態「０００１１１００」をとる、すなわち、処理された最初の３つのレーンをフォールバックパスの最初の反復の結果として無視する。
【００８４】
更なるチェックがステップ３７５で行われた後、これにより、更新されたガード述語がもたらされる。例示目的で、第５のレーンと第６のレーンとの間で他のアドレス競合が特定され、したがって、ガード述語ｐ１が「０００１１０００」となるように更新されると仮定する。
【００８５】
フォールバックパスの第２の反復中、ステップ３６０における分散動作に続いて、主述語がステップ３６５で更新されて「０００００１００」の形態をとる。残りのアクティブアドレス要素が１つしか存在しないため、ステップ３７５でその後に実行されるチェックは公称チェックであり、したがって、結果として得られるガード述語は「０００００１００」の形態を有する。結果として、フォールバックパスの最終反復は、事実上、スカラー反復であり、その後、処理は、次のベクトルループ反復を開始するべく全ベクトルパスに戻る。
【００８６】
図３のプロセスを様々な方法で実施できることは分かるが、図３のプロセスを実施するためのコードシーケンスの一例は以下の通りである。
ｍｏｖ  ｘ１，＃０
ｄｕｐ  ｚ２．ｓ，＃１
ｐｆｉｒｓｔ  ｐ１．ｂ，ｐ０，ｐ１．ｂ
ｗｈｉｌｅｌｔ  ｐ０．ｓ，ｘ１，ＳＩＺＥ
．ＬｌｏｏｐＡ：
ｌｄ１ｗ  ｚ０．ｓ，ｐ０／ｚ，［ｘＣ，ｘ１，ｌｓｌ  ＃２］    ／／Ｃｏｎｔｉｇｕｏｕｓ  ｌｏａｄ  ｉｎｔｏ  ｚ０
ｃｈｅｃｋ  ｐ１．ｓ，ｐ０／ｚ，ｚ０．ｓ
ｌｄ１ｗ  ｚ１．ｓ，ｐ０／ｚ，［ｘ０，ｚ０．ｓ，ｕｘｔｗ］    ／／Ｇａｔｈｅｒ  ｕｓｉｎｇ  ｚ０
ｂ．ｎｅ  ．Ｌｆａｌｌｂａｃｋ    ／／Ｆａｌｌｂａｃｋ  ｓｅｑｕｅｎｃｅ  ｕｓｅｄ  ｗｈｅｎ
／／ｃｈｅｃｋ  ｆａｉｌｓ
ａｄｄ  ｚ１．ｓ，ｐ０／ｚ，ｚ１．ｓ，ｚ２．ｓ    ／／Ｐｒｅｄｉｃａｔｅｄ  ａｄｄｉｔｉｏｎ
ｓｔ１ｗ  ｚ１．ｓ，ｐ０，［ｘ０，ｚ０．ｓ，ｕｘｔｗ］    ／／Ｓｃａｔｔｅｒ  ｕｓｉｎｇ  ｚ０
．Ｌｌａｂｅｌ１：
ｉｎｃｗ  ｘ１，ＡＬＬ    ／／Ａｄｖａｎｃｅ  ｂｙ  ｔｈｅ  ｎｕｍｂｅｒ  ｏｆ  ｖｅｃｔｏｒ
／／ｅｌｅｍｅｎｔｓ  ｐｒｏｃｅｓｓｅｄ
ｗｈｉｌｅｌｔ  ｐ０．ｓ，ｘ１，ＳＩＺＥ    ／／Ｃｈｅｃｋ  ａｒｒａｙ  ｌｉｍｉｔｓ  ａｎｄ  ｔｒｉｍ
／／ｐｒｅｄｉｃａｔｅ
ｂ．ｆｉｒｓｔ  ．ＬｌｏｏｐＡ
……
……
．Ｌｆａｌｌｂａｃｋ：
ｍｏｖ  ｐ２，ｐ０
．ＬｆａｌｌｂａｃｋＬｏｏｐ：
ａｄｄ  ｚ１．ｓ，ｐ１／ｚ，ｚ１．ｓ，ｚ２．ｓ    ／／Ｐｒｅｄｉｃａｔｅｄ  ａｄｄｉｔｉｏｎ
ｓｔ１ｗ  ｚ１．ｓ，ｐ１，［ｘ０，ｚ０．ｓ，ｕｘｔｗ］    ／／Ｓｃａｔｔｅｒ  ｕｓｉｎｇ  ｚ０
ｂｉｃｓ  ｐ２．ｂ，ｐ０／ｚ，ｐ２．ｂ，ｐ１．ｂ    ／／Ｄｉｓａｂｌｅ  ｇｒｏｕｐ  ｏｆ  ｌａｎｅｓ  ｗｈｉｃｈ
／／ｈａｖｅ  ａｌｒｅａｄｙ  ｂｅｅｎ  ｐｒｏｃｅｓｓｅｄ  ａｎｄ  ｓｅｔ  ｆｌａｇｓ
ｂ．ｎｏｎｅ  ．Ｌｌａｂｅｌ１
ｃｈｅｃｋ  ｐ１．ｓ，ｐ２／ｚ，ｚ０．ｓ
ｌｄ１ｗ  ｚ１．ｓ，ｐ１／ｚ，［ｘ０，ｚ０．ｓ，ｕｘｔｗ］    ／／Ｇａｔｈｅｒ  ｕｓｉｎｇ  ｚ０
ｂ  ．ＬｆａｌｌｂａｃｋＬｏｏｐ
【００８７】
図２及び図３に関連して示される例のいずれも、ベクトルループの各反復において、検出されたアドレスハザード状態の存在下でフォールバックパスに分岐することによってその反復内で使用されるベクトル化のレベルを選択的に低減することができる。しかしながら、別の実施形態では、別個のフォールバックパスを設けることなくベクトルループの反復内の低レベルのベクトル化を用いることができる。図４は、そのような別の実施形態にしたがって実行されるステップを示すフロー図であり、図４では、変形２のチェック命令が実行されてそれに応じてガード述語を生成すると仮定されている。ステップ４００，４０５，４１０は、図３のステップ３００，３０５，３１０に対応するが、ステップ４１０でフラグをセットする必要は全くない。これは、そのようなフラグの状態に応じてデフォルトレベルのベクトル化を続けるべきかどうか或いはフォールバックパスに分岐すべきかどうかを決定するその後の分岐命令が存在しないからである。
【００８８】
代わりに、プロセスはステップ４１０の後にステップ４１５に進み、このステップでは、ベクトルレジスタｚＣのポインタを使用してメモリからデータ値のベクトルが収集され、その場合、その結果がベクトルレジスタｚＡに書き込まれる。必要に応じて、１つの実施形態では、ステップ４１０で生成されるガード述語によって収集動作を制約することができる。
【００８９】
その後、プロセスはステップ４２０に進み、このステップでは、ベクトル演算がロードされたデータに関して実行され、その後、その結果は元の宛先レジスタｚＡに書き戻される。この場合も先と同様に、必要に応じて、ガード述語を考慮して演算を制約することができ、それにより、それらの演算は、ガード述語によって特定されるアクティブ要素に関してのみ行われる。
【００９０】
その後、プロセスはステップ４２５に進み、このステップにおいて、ベクトルレジスタｚＡ内のデータは、ベクトルレジスタｚＣのポインタを使用して分散されるが、ガード述語によって制約される。したがって、分散動作中に元のメモリに書き込まれる唯一の結果データは、ステップ４１０で実行されたチェック動作に基づいてガード述語がアクティブであると見なされた処理レーンに関連するのが分かる。そのため、アドレス競合状態の不存在が検出される場合、ベクトル化のデフォルトレベルがステップ４１５，４２０，４２５の実行中に使用され、それにより、全てのアクティブレーンが処理されて任意のマスター述語によってのみ制約されるのが分かる。しかしながら、アドレスハザード状態が検出される場合には、ガード述語を考慮して少なくとも分散動作を制約することによってステップ４１５，４２０，４２５中に低レベルのベクトル化が使用され、それにより、マスター述語によって示されるレーンのサブセットのみがアクティブレーンと見なされる。その後、ステップ４３０において、オフセットｘがガード述語カウントだけインクリメントされる。したがって、ガード述語が３つのアクティブレーンのみを伴う場合には、オフセットｘが３だけインクリメントされる。一方、アドレス競合状態が検出されない任意の反復において、ガード述語は、処理されるレーンに制約がないことを効果的に特定し、したがって、そのような反復では、オフセットｘがステップ４３０においてベクトル長だけインクリメントされる。
【００９１】
ステップ４３５では、処理すべき更なるデータが存在するかどうかが決定され、そうであれば、プロセスがステップ４０５に戻る。ステップ４０５では、デフォルトレベルのベクトル化又は低レベルのベクトル化が前の反復で使用されたかどうかにかかわらず、プロセスが常に次の反復のためにデフォルトレベルのベクトル化に逆戻りし、したがって、ベクトルレジスタｚＣにロードされるポインタの数がベクトル長に依存することに留意すべきである。
【００９２】
ステップ４３５において処理すべき更なるデータが存在しない決定されると、プロセスがステップ４４０において終了する。
【００９３】
図４の先の説明では、フラグ設定が何ら必要でないにもかかわらず、実行されるチェック命令が本質的に変形例２と同じであると仮定されているが、別の実施形態では、ガード述語を生成せずに現在の反復中に処理されるべきアクティブ要素の数を示す数を出力として生成するチェック命令の他の変形を使用できる。アドレス競合が検出されない場合、その数は、単に法線ベクトル長を示すにすぎず、したがって、反復内の下流側の処理は、演算に関して定められる任意のマスター述語によって以外、制約されない。しかしながら、アドレス競合状態の存在が検出される場合、その数は、現在の反復において処理されるべきアクティブ要素の減少された数、したがって、その反復のために使用されるべき低レベルのベクトル化を特定する。
【００９４】
先の図に関連して論じられたチェック命令の先の変形に加えて、チェック動作と他の動作とを組み合わせる変形をもたらすこともできる。例えば、１つの実施形態では、チェック動作をメモリアクセス動作と組み合わせることができ、それにより、その単一の命令の実行時、前述のチェック動作がいずれも実行されるが、加えて、その命令によって定められる複数のメモリアドレスを考慮して、メモリアクセス動作が行われる。１つの特定の例として、チェック命令の変形は、本明細書中で変形３と称されて以下に示されるハザード認識ギャザー動作を行うようにもたらされ得る。
変形３：ＬＤＣＨＥＣＫ  Ｚｄ．＜Ｔ＞、Ｐｇ／Ｚ、［＜Ｘｎ  ｜  ＳＰ＞、＜Ｚｍ＞．＜Ｔ＞］
【００９５】
この例において、スカラーレジスタＸｎ又はスタックポインタレジスタＳＰがベースポインタを含むように使用され、また、このとき、ベクトルレジスタＺｍはオフセットのベクトルを与え、その場合、タイプフィールドＴがベクトルレジスタ内の要素のサイズを特定する。ベクトルレジスタＺｄは、ギャザー動作のための宛先レジスタを特定し、また、タイプフィールドＴは、そのベクトルと共に含まれるデータ要素のサイズを特定する。述語レジスタＰｇを介してマスター述語を定めることができ、また、「／Ｚ」という表記は、等価なレーンがマスター述語によって非アクティブとしてマーキングされている場合に結果ベクトルＺｄ内の任意のデータ要素がゼロにされることを特定する。
【００９６】
そのようなロードチェック命令を実行する際には、アドレス競合のチェックを処理回路１１５内で行うことができ、一方、ＬＳＵ１４５はギャザー動作を行う。チェック動作の実行とギャザー動作とを重なり合わせることにより、これが更なる性能向上を可能にし得る。そのようなシナリオでは、ギャザー動作及びチェック動作が効果的に二重発行され、それにより、差し迫ったアドレス競合に関する情報は、収集を早期に終了して時間を節約することができる。したがって、そのような実施形態では、ハザードチェック結果に基づいてギャザー動作の早期終了をもたらすオプションがあり、それにより、ハザードが検出された時点で、ギャザー動作のその後の段階が実行されない。幾つかの実施形態では、アドレスチェック動作を支援するべくギャザー動作を実行するのに利用できるハードウェアを利用することも可能であり、それにより、特に効率的な実施が行われる。
【００９７】
そのような複合チェック・ギャザー命令を実行する際には、チェック動作の結果を使用して、前述の実施形態のように、競合状態の有無を示すべくＣＰＵ状態フラグを設定することができる。しかしながら、もう１つの方法として、チェック結果を使用して、ＣＰＵシステム又は図１に関連して前述したＨＣＳＲレジスタ１６５などの状態レジスタを設定することができる。例えば、ＨＣＳＲレジスタは、アドレス競合に起因してどのロードアクセスが実行されなかったかに関する情報を与えるようになっていてもよく、また、ブール値、例えば「１」のセットの後に連続する「０」が続く値を含む（ここで、「０」は、衝突が検出された最初のレーンの後のレーンで始まる）。チェックが別個の命令のセットによって実行された場合よりも低いコストで状態ビットをチェックするためにコードを別々に追加することができる。
【００９８】
したがって、アドレス競合の存在下で低レベルのベクトル化を実施するために、状態ビットをチェックし、その後に必要に応じて状態フラグを設定するために状態ビットを使用することができる。
【００９９】
そのような手法の更なる利点は、標準ベクトルロード動作を単に実施することが望まれるとき、すなわち、チェックが必要とされない場合に、同じ命令を使用することもできるという点である。特に、その場合、チェックは依然としてロードと並行して行われ、その場合、結果はＨＣＳＲレジスタに書き込まれるが、ＨＣＳＲレジスタの内容をその後に単に無視できるにすぎない。そのような手法は、命令符号化空間が制限される場合、したがって、望ましい場合がある様々な命令の全てを別々に符号化するのに十分な符号化空間を見つけることが困難である場合に非常に有益となり得る。
【０１００】
変形１，２，３のチェック命令の前述した説明では、単一の入力ベクトルオペランドが与えられるが、別の実施形態では、これらの変形のそれぞれを第２の入力ベクトルオペランドを成すように設計することもできる。これは、例えば、任意のメモリ位置の第１のセットからのギャザー動作が存在するとともに、ロードされて処理されるデータ値がその後に任意のメモリ位置の第２のセットに対する分散動作に与えられる場合に有用となり得る。この使用ケースは、例えば、インプレースデータ変換を実行するアルゴリズム内で起こり得る。
【０１０１】
様々な記載されたチェック命令を使用する状況を考慮すると、必要なチェック動作の実行に関与するレイテンシが考慮されてもよい。レイテンシは、実行される必要がある比較に関連し、また、図５では、ベクトル長が６であり、したがってベクトル要素０〜５を含むベクトルに関して様々な比較が強調表示される。ライン５００によって示されるように、ベクトル要素５は、ベクトル要素４，３，２，１，０のそれぞれと比較される必要がある。同様に、ライン５０５によって示されるように、ベクトル要素４は、ベクトル要素３，２，１，０と比較される必要がある。更に、ベクトル要素３は、ライン５１０によって示されるようにベクトル要素２，１，０と比較される必要があり、一方、ベクトル要素２は、ライン５１５によって示されるようにベクトル要素１，０と比較される必要がある。最後に、ベクトル要素１は、ライン５２０によって示されるようにベクトル要素０と比較される必要がある。図５の破線は、比較をどのようにグループ化できるかを示している。所定のベクトル長ＶＬに関して、実行されなければならない比較の数は、（ＶＬ−１）×（ＶＬ）／２である。したがって、図５に概略的に示されるように、ベクトル長が６の場合、１５回の比較が必要である。
【０１０２】
しかしながら、変形１のチェック命令の実行と変形２のチェック命令の実行との間にはレイテンシに差がある。特に、変形１を考慮すると、現代のＣＰＵ内で既存のデータパスの大部分を使用することができる。特に、図６に示されるように、回転子５５０を使用して入力の一方を比較器５６０に供給することができ、その場合、他方の入力はソースベクトルオペランドからくる。そのような手法は、図５にマーキングされるグループ分けを効率的に組み立てて「コンパクトにする」又は「折り畳む」。これは、通常、データがＣＰＵ内の整数実行パイプラインに供給されるときに飛行中に実行され得る順列のうちの１つである。この回転子を使用すると、比較的軽量の実装がＶＬ／２に比例するレイテンシを与えることができる。図６に示されるように、このとき、比較器からの出力を使用して、ＣＰＵ状態フラグ５７０を設定することができる。前述したチェック命令の変形２は、比較の順序が重要であるため、より高いレイテンシを有し、したがって、ベクトルの各サブセクションをスキャンする必要がある。
【０１０３】
処理中のアドレスのベクトルが連続したアドレスに関連する状況に関しては、チェック命令の付加的な変形を作成することができる。特に、「使用ケース２」として前述したメモリコピーシナリオなどの連続するメモリ位置にアクセスする使用ケースにおいて、そのような命令は、必要なアドレス競合チェックを行うためのより効率的なメカニズムを与えることによって有用となり得る。特に、メモリアクセスが連続しているため、チェック命令を実質的に単純化することができる。これは、データが連続するソースアドレス６００のベクトルからコピーされるメモリコピー動作を考慮する際に図７Ａに示され、この場合、そのデータは、連続する宛先アドレス６１０のベクトルに書き込まれる。各ベクトルにおける要素の数とそれらの要素のサイズとに依存するベクトル長を知ることにより、スカラーオペランドのみを使用して必要なアドレス競合チェックを行うことができる。特に、チェック命令は、ソースベクトルからのアドレス要素のうちの１つと、宛先ベクトルからの対応するアドレス要素とを特定することができ、１つの実施形態では、第１の要素ｘ０，ｚ０がチェック動作のために選択されたアドレス要素であると仮定する。ステップ６２０に示されるように、これらの２つのスカラーアドレス要素が設けられると、チェック動作は、その後、差ｚ０−ｘ０がベクトル長以上であるか或いは負又は０であるかどうかを決定することができる。そうであれば、ソースアドレス６００のベクトルからデータをコピーした後にそのデータを宛先アドレスのベクトル６１０に書き込むときにアドレス競合が存在しないようにすることができる。しかしながら、差ｚ０−ｘ０がベクトル長よりも小さく０よりも大きい場合には、アドレス競合が生じる。
【０１０４】
ステップ６３０では、ＣＰＵ状態フラグを比較の結果に応じて設定して、差ｚ０−ｘ０がベクトル長よりも小さく０よりも大きい場合にアドレス衝突を特定することができる。
【０１０５】
別の実施形態では、実装上の理由から、ステップ６２０において異なるチェックを実行することが決定されてもよく、また、特に、入力として与えられる２つのスカラーアドレス値間の絶対差がベクトル長さ以上でない状況を検出するべくチェックを実行することが決定されてもよい。絶対差がベクトル長よりも小さい場合には、これが競合の存在を示すことができ、また、それに応じてステップ６３０において状態フラグを設定することができる。しかしながら、図７Ａのステップ６２０に関連して前述した先の不等式から、絶対差に基づくチェックが幾つかの誤検出をもたらすのが分かる。これは、計算ｚ０−ｘ０の符号付きの整数結果がベクトル長さよりも小さいとともに負又は０に等しいときに実際に競合条件が存在しないからである。
【０１０６】
チェック命令の変形を生成して図７Ａで説明したチェックを実行することができ、また、以下の変形４，５は、変形１，２のそれぞれの代わりに与えられるチェック命令のそのような変形である。
変形４：ＣＨＥＣＫ＜Ｔ＞Ｐｇ，Ｘｎ，Ｘｍ    ／／ｆｌａｇ−ｓｅｔｔｉｎｇ  ｏｎｌｙ
変形５：ＣＨＥＣＫ＜Ｔ＞Ｐｄ．＜Ｔ＞，Ｐｇ／Ｚ，Ｘｎ，Ｘｍ    ／／ｆｌａｇ−ｓｅｔｔｉｎｇ  ｗｉｔｈ  ｐｒｅｄｉｃａｔｅ
／／ｇｅｎｅｒａｔｉｏｎ．
【０１０７】
変形４に示されるように、２つのスカラー入力値Ｘｎ，Ｘｍが与えられ、これらは、アドレス要素ｘ０，ｚ０をそれぞれ含むレジスタを特定する。必要に応じて、マスター述語を与えて、アクティブレーンの数を特定することができ、また、データ要素サイズを特定するためにタイプ情報Ｔが使用され、それにより、ベクトル長ＶＬを計算することができる。述語情報は、有効ベクトル長を計算するときにも使用できる。例えば、図７の例において最後の２つのデータ要素レーンが排除される場合には、有効ベクトル長がアドレス要素サイズの８倍ではなく、有効ベクトル長がアドレス要素サイズの６倍であり、これは、差ｚ０−ｘ０が関連するベクトル長以上であるか或いは負又は０であるかどうかを決定する際に考慮され得る。
【０１０８】
先の変形５は変形４の述語生成バージョンであり、このバージョンは、競合が検出されなければ、例えば差ｚ０−ｘ０がベクトル長以上であるか或いは負又は０であれば「真」に設定される各アクティブレーンにおける結果を伴う述語を生成する。しかしながら、競合が検出される場合には、差ｚ０−ｘ０が「ｙ」であると仮定すると、述語は、「真」に設定される「ｙ」個の要素の連続するセットと偽に設定される残りの要素とを伴って生成される。これは、ループのための制御マスクとして使用され得る。
【０１０９】
先の述語設定チェックメカニズムは、図７Ｂ〜図７Ｅに一例として示される。図７Ｂは値の最初のシーケンスを示し、この場合、Ａは宛先ポインタであり、Ｂはソースポインタである。ベクトル長が８である場合、この例では、図７Ａのステップ６２０で実行されるチェックに基づいて競合が検出されるのが分かる。図７Ｃは、ｍｅｍｃｐｙ演算が一連のスカラー演算として行われる場合にメモリの内容がどのようになるのかを示し、したがって、任意のベクトル化された演算形式のために必要な結果を示す。図７Ｄは、記載された実施形態のチェックメカニズムを採用せずにｍｅｍｃｐｙ演算がベクトル化された場合に生じるメモリの内容を示す。
【０１１０】
最後に、図７Ｅは、変形５のチェック命令が実行された場合に１つの実施形態で形成されるガード述語を示し、この述語は、各反復中に３つの要素のみが処理されるようにするために使用され、したがって、図７Ｃに示される結果が得られる。
【０１１１】
更に、連続的にロードされている要素がたまたま逆転される場合には特別なチェック命令のための帰結的定義を導き出すことができることに留意すべきである。
【０１１２】
図１の装置によって使用するために与えられる命令セットがチェック命令の複数の異なる変形をもたらすときには、コンパイラが多くの対象の作業負荷にとって最良の変形を静的に決定することができない場合がある。前述のチェック命令の異なる変形によって与えられる様々な性能利点をうまく利用するために、前述のアドレス衝突統計カウンタ１７０を利用することができる。１つの実施形態において、これらのカウンタは、所定のエポックで検出される衝突の総数を特定するためだけでなく、ベクトル内衝突の総数、すなわち、特定のベクトル長内の衝突の数を特定するためにも（或いは代わりに）使用され得る。そのような情報をカウンタ１７０に記録することで、これにより、ソフトウェアは、アドレスベクトルごとにベクトル内衝突の平均数を推定することができる。その場合、この統計値は、所定の計算作業負荷にとって最良の命令変形を選択するために動的最適化ツール又はインテリジェントなランタイムによって使用され得る。これは、統計カウンタ情報を使用して行われる動的コンパイルプロセスを示す図８のフロー図に関連して一例として示される。
【０１１３】
ステップ７００において、アドレス衝突統計カウンタは所定のエポック時間にわたって維持される。ステップ７０５では、所定の時間が経過したかどうかが決定され、そうでない場合、プロセスはステップ７００に戻り、このステップでは、装置によって命令シーケンスが実行されるとアドレス衝突カウンタが維持され続ける。所定の時間が経過した時点で、アドレスベクトルごとにベクトル内衝突の平均数を決定するためにアドレス衝突統計カウンタがステップ７１０で解析される。その後、この情報は、ステップ７１５で適切なチェック命令を選択するために使用され、その後、その選択されたチェック命令変形は、ステップ７２０において、任意の関連する命令シーケンス、例えば、図２及び図３の例に関連して前述したフォールバックパス命令と共にコードに挿入される。その後、ステップ７２５において、ステップ７００に戻る前に、カウンタを任意にリセットすることができる。
【０１１４】
図９は、そのようなコンパイルプロセスがどのように有用であるのか、特に、異なる変形から得ることができる高速化利点がベクトル内競合を伴うベクトルの割合に応じてどのように異なり得るのかを示すために使用されるグラフである。特に、図９の結果は、発生するベクトル内競合を伴うベクトルの割合に応じた、変形１のチェック命令及び変形２のチェック命令の両方に関するスカラー実装にわたるベクトル化されたコードの潜在的な高速化を示す。変形１に関しては、図２の前述の説明から明らかなように、変形１を採用すると、任意のアドレス衝突によりベクトルループの現在の反復がスカラー演算の反復シーケンスとして実行されるため、単一の曲線７５０が存在する。しかしながら、変形２の場合、高速化は、特定のベクトル内で検出されるアドレス競合の数に依存する。図９に示される「ｎｕｍｐａｒｔｓ」値は、現在のベクトルループの反復を実施するために必要な図３のフォールバックパスを通じた反復数を示す。グラフから明らかなように、変形２は、ベクトル内のアドレス衝突の平均回数が少ないとともにベクトル内アドレス衝突の数が増えるにつれ加速が低下する場合に有利である。
【０１１５】
なお、ベクトル内に複数の衝突が存在する可能性は、ベクトル長さが増加するにつれて増加し、そのため、より広いベクトルに関しては、変形１のチェック命令がより良くスケーリングし得る。
【０１１６】
図１０は、使用可能な仮想マシン実装を示す。前述の実施形態は、関連技術をサポートする特定の処理ハードウェアを動作させるための装置及び方法に関して本発明を実施するが、ハードウェアデバイスのいわゆる仮想マシン実装を提供することも可能である。これらの仮想マシン実装は、通常、仮想マシンプログラム８１０をサポートするホストオペレーティングシステム８２０を一般に実行するホストプロセッサ８３０上で実行する。多くの場合、妥当な速度で実行する仮想マシン実装を提供するには大規模な強力なプロセッサが必要とされるが、そのような手法は、互換性や再利用のために他のプロセッサに固有のコードを実行することが望ましい場合など、特定の状況において正当化されてもよい。仮想マシンプログラム８１０は、そのような実際のハードウェアデバイスによるプログラムの実行によって与えられるのと同じ結果を与えるために、アプリケーションプログラム（又はオペレーティングシステム）８００を実行することができる。したがって、前述のチェック命令を含むプログラム命令は、仮想マシンプログラム８１０を使用してアプリケーションプログラム８００内から実行されてもよい。
【０１１７】
前述の実施形態から分かるように、記載されたチェック命令の使用は、不規則又は非線形のメモリアクセスパターンを有するコードがベクトル化されるときに潜在的なメモリ依存性違反の問題に対してオーバヘッドの低い解決策を提供する。記載された技術は、間接的なメモリ参照を有するプログラム、特にそのメモリアクセスが非論理的であることにより競合状態が存在しないことを静的に証明すること或いは更には異なるベクトル長に関してそのようなハザードの平均頻度を決定することが困難又は不可能なプログラムの性能を大幅に向上させることができることが分かってきた。
【０１１８】
本出願において、「〜ように構成される」という用語は、装置の要素が所定の動作を実行できる構成を有することを意味するために使用される。この文脈において、「構成」は、ハードウェア又はソフトウェアの相互接続の配置又は態様を意味する。例えば、装置は、所定の動作を与える専用のハードウェアを有してもよく、或いは、プロセッサ又は他の処理デバイスが機能を果たすようにプログラムされてもよい。「〜ように構成される」は、所定の動作を与えるために装置要素を何らかの方法で変更する必要があることを意味しない。
【０１１９】
本発明の例示的な実施形態を添付図面に関連して本明細書中で詳しく説明してきたが、本発明がこれらの正にその実施形態に限定されず、また、添付の特許請求の範囲により規定される発明の範囲及び技術的思想から逸脱することなくこれらの実施形態に様々な変更、追加、及び、修正を当業者により行うことができることが理解されるべきである。例えば、本発明の範囲から逸脱することなく、従属請求項の特徴の様々な組み合わせを独立請求項の特徴と共に行うことができる。
【図１】
2019517060.tif 000003
【図２】
2019517060.tif 000004
【図３】
2019517060.tif 000005
【図４】
2019517060.tif 000006
【図５】
2019517060.tif 000007
【図６】
2019517060.tif 000008
【図７Ａ】
2019517060.tif 000009
【図７Ｂ】
2019517060.tif 000010
【図７Ｃ】
2019517060.tif 000011
【図７Ｄ】
2019517060.tif 000012
【図７Ｅ】
2019517060.tif 000013
【図８】
2019517060.tif 000014
【図９】
2019517060.tif 000015
【図１０】
2019517060.tif 000016
【国際調査報告】
2019517060.tif 000017
2019517060.tif 000018