(57)【要約】  装置は、ベクトル・ロード命令及びベクトル・ストア命令をサポートする処理回路機構４を有している。処理回路機構は、トランザクション開始事象に応答して、１つ又は複数の後続する命令を投機的に実行する。処理回路機構４は、トランザクション終了事象に応答して、これらの命令の投機的結果をコミットする。ハザード検出回路機構５０は、以前のベクトル・ロード命令に対するデータ要素Ｊのためのアドレスと、以後のベクトル・ストア命令に対するデータ要素Ｋのためのアドレスとの間に要素間アドレス・ハザードが生じているかどうかを検出し、Ｋ及びＪは等しくない。ハザード検出回路機構５０は、要素間アドレス・ハザードの検出に応答して、トランザクション開始事象に引き続く命令のそれ以上の処理を中止するように処理回路機構４をトリガし、投機的結果がコミットされることを防止する。この手法は、ベクトル化されたコードのためのより高速の実施を提供することができる。
2019534504.tif 000002
【特許請求の範囲】
【請求項１】
命令に応答してデータ処理を実施するための処理回路機構であって、ベクトル・ロード命令に応答して、データ記憶装置のそれぞれの記憶位置からのデータを、ベクトル値のそれぞれのデータ要素をロードするように構成され、ベクトル・ストア命令に応答して、ベクトル値のそれぞれのデータ要素からのデータを前記データ記憶装置のそれぞれの記憶位置に記憶するように構成される処理回路機構を備え、
前記処理回路機構が、トランザクション開始事象に応答して、１つ又は複数の後続する命令を投機的に実行し、トランザクション終了事象に応答して、前記トランザクション開始事象に引き続いて投機的に実行された前記１つ又は複数の後続する命令の投機的結果をコミットし、
前記装置が、前記トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令に対するデータ要素Ｊに対応するアドレスと、前記トランザクション開始事象に引き続いて投機的に実行された以後のベクトル・ストア命令に対するデータ要素Ｋに対応するアドレスとの間に要素間アドレス・ハザードが生じているかどうかを検出するためのハザード検出回路機構を備え、ＫがＪとは異なり、前記以前のベクトル・ロード命令及び前記以後のベクトル・ストア命令が、いずれも、前記処理回路機構によって処理された命令の同じスレッドからのものであり、
前記ハザード検出回路機構が、前記要素間アドレス・ハザードの検出に応答して、前記トランザクション開始事象に引き続く前記命令のそれ以上の処理を中止するように前記処理回路機構をトリガし、前記投機的結果がコミットされることを防止するように構成される、装置。
【請求項２】
前記ハザード検出回路機構が、前記要素間アドレス・ハザードの検出に応答して、アーキテクチャ状態データを、前記トランザクション開始事象に応答して捕獲されたアーキテクチャ状態データの先行するバージョンに回復するように前記処理回路機構をトリガするように構成される、請求項１に記載の装置。
【請求項３】
Ｋ＜Ｊである、請求項１及び２のいずれかに記載の装置。
【請求項４】
前記トランザクション開始事象に引き続いて投機的に実行された１つ又は複数の以前のベクトル・ロード命令のために使用されたアドレスを追跡するためのハザード追跡データを記憶するためのハザード追跡記憶回路機構を備える、請求項１から３までのいずれかに記載の装置。
【請求項５】
前記ハザード追跡記憶回路機構が前記データ記憶装置の一部を備える、請求項４に記載の装置。
【請求項６】
前記ハザード検出回路機構が、前記トランザクション開始事象に応答して前記ハザード追跡データを消去するように構成される、請求項４及び５のいずれかに記載の装置。
【請求項７】
前記ハザード検出回路機構が、前記トランザクション開始事象に引き続いて実行されるトランザクション消去命令に応答して前記ハザード追跡データを消去するように構成される、請求項４から６までのいずれかに記載の装置。
【請求項８】
前記ハザード検出回路機構が、前記トランザクション開始事象に引き続いて投機的に実行されたベクトル・ロード命令に応答して、前記ベクトル・ロード命令のために使用されたアドレスに基づいて前記ハザード追跡データを更新する、請求項４から７までのいずれかに記載の装置。
【請求項９】
前記ハザード検出回路機構が、所定のタイプのベクトル・ロード命令に応答して前記ハザード追跡データを更新し、前記所定のタイプのベクトル・ロード命令以外のベクトル・ロード命令に応答して前記ハザード追跡データの更新を抑制するように構成される、請求項８に記載の装置。
【請求項１０】
前記ハザード追跡データが複数の追跡入口を含み、個々の追跡入口が、アドレスのそれぞれのブロックに対応し、且つ、アドレスの前記対応するブロック内のアドレスが、前記トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令のために使用された最も高いデータ要素位置を識別する、請求項４から９までのいずれかに記載の装置。
【請求項１１】
前記ハザード検出回路機構が、前記以後のベクトル・ストア命令の所与のデータ要素位置に対して使用されたアドレスを含むアドレスのブロックに対応する前記追跡入口が前記所与のデータ要素位置より高いデータ要素位置を識別すると、前記トランザクション開始事象に引き続いて投機的に実行された以後のベクトル・ストア命令に対する前記要素間アドレス・ハザードを検出するように構成される、請求項１０に記載の装置。
【請求項１２】
前記データ記憶装置が、データを記憶するための複数のキャッシュ・ラインを備えるキャッシュを備え、前記追跡入口が前記キャッシュに記憶され、個々のキャッシュ・ラインが前記キャッシュ・ラインに対応するアドレスの１つ又は複数のブロックのための前記追跡入口のうちの１つ又は複数と結合される、請求項１０及び１１のいずれかに記載の装置。
【請求項１３】
前記ハザード検出回路機構が、アドレスの前記対応するブロックの少なくとも１つのアドレスが前記トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令のために使用されたことを示す追跡入口と結合した前記キャッシュからのキャッシュ・ラインの追払いに応答して、前記トランザクション開始事象に引き続く前記命令のそれ以上の処理を中止するように前記処理回路機構をトリガし、前記投機的結果がコミットされることを防止するように構成される、請求項１２に記載の装置。
【請求項１４】
前記ハザード追跡データが１つ又は複数のロード追跡入口を含み、個々のロード追跡入口が、前記トランザクション開始事象に引き続いて投機的に実行された対応するベクトル・ロード命令のためにアクセスされた最小アドレス及び最大アドレスのうちの少なくとも１つを識別する、請求項４から９までのいずれかに記載の装置。
【請求項１５】
前記ハザード検出回路機構が、前記トランザクション開始事象に引き続いて投機的に実行された以後のベクトル・ストア命令のための最小アドレスが前記ロード追跡入口のうちの１つによって示された前記最小アドレスより大きく、且つ、前記最大アドレス以下である場合、前記要素間アドレス・ハザードを検出するように構成される、請求項１４に記載の装置。
【請求項１６】
前記ハザード追跡データが、前記トランザクション開始事象に引き続いて投機的に実行された１つ又は複数のベクトル・ロード命令のそれぞれのデータ要素に対してアクセスされた１つ又は複数のアドレスを識別するアドレス・リストを含む、請求項４から９までのいずれかに記載の装置。
【請求項１７】
前記ハザード検出回路機構が、前記以後のベクトル・ストア命令に対する所与のデータ要素位置に対応するアドレスが、前記トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令に対する前記所与のデータ要素位置以外のデータ要素位置に対応するアドレスと同じである場合、前記要素間アドレス・ハザードを検出するように構成される、請求項１６に記載の装置。
【請求項１８】
前記トランザクション開始事象がトランザクション開始命令を含み、前記トランザクション終了事象がトランザクション終了命令を含む、請求項１から１７までのいずれかに記載の装置。
【請求項１９】
命令に応答してデータを処理するための手段であって、ベクトル・ロード命令に応答して、データ記憶装置のそれぞれの記憶位置からのデータを、ベクトル値のそれぞれのデータ要素をロードするように構成され、ベクトル・ストア命令に応答して、ベクトル値のそれぞれのデータ要素からのデータを前記データ記憶装置のそれぞれの記憶位置に記憶するように構成される、処理するための手段を備え、
処理するための前記手段が、トランザクション開始事象に応答して、１つ又は複数の後続する命令を投機的に実行し、トランザクション終了事象に応答して、前記トランザクション開始事象に引き続いて投機的に実行された前記１つ又は複数の後続する命令の投機的結果をコミットし、
前記装置が、前記トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令に対するデータ要素Ｊに対応するアドレスと、前記トランザクション開始事象に引き続いて投機的に実行された以後のベクトル・ストア命令に対するデータ要素Ｋに対応するアドレスとの間の要素間アドレス・ハザードを検出するための手段を備え、ＫがＪとは異なり、前記以前のベクトル・ロード命令及び前記以後のベクトル・ストア命令が、いずれも、前記処理回路機構によって処理された命令の同じスレッドからのものであり、
検出するための手段が、前記要素間アドレス・ハザードの検出に応答して、前記トランザクション開始事象に引き続く前記命令のそれ以上の処理を中止するように処理のための前記手段をトリガし、前記投機的結果がコミットされることを防止するように構成される、装置。
【請求項２０】
トランザクション開始事象に応答して、１つ又は複数の後続する命令を投機的に実行するステップと、
ベクトル・ロード命令に応答して、データ記憶装置のそれぞれの記憶位置からのデータを、ベクトル値のそれぞれのデータ要素にロードするステップと、
ベクトル値のそれぞれのデータ要素からのデータを前記データ記憶装置のそれぞれの記憶位置に記憶するためのベクトル・ストア命令に応答して、前記ベクトル・ロード命令に対するデータ要素Ｊに対応するアドレスと、前記ストア命令に対するデータ要素Ｋに対応するアドレスとの間に要素間アドレス・ハザードが生じているかどうかを検出するステップであって、ＫがＪとは異なり、前記以前のベクトル・ロード命令及び前記以後のベクトル・ストア命令が、いずれも命令の同じスレッドからのものであるステップと、
前記要素間アドレス・ハザードの検出に応答して、前記１つ又は複数の後続する命令のそれ以上の処理を中止し、前記１つ又は複数の後続する命令の投機的結果がコミットされることを防止するステップと、
トランザクション終了事象に応答して、前記１つ又は複数の後続する命令の前記投機的結果をコミットするステップと
を含むデータ処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本技法はデータ処理の分野に関する。
【背景技術】
【０００２】
いくつかのデータ処理システムは、命令のソース・オペランド又は結果値が複数のデータ要素を含むベクトルであるベクトル命令の処理をサポートしている。単一の命令に応答して多数の全く異なるデータ要素の処理をサポートすることにより、コード密度を改善することができ、また、命令の取込み及び復号化のオーバヘッドを低減することができる。データ値をベクトル・オペランドのそれぞれの要素中にロードし、且つ、単一のベクトル命令を使用する時点でいくつかの要素のデータ値を処理することにより、処理されるべきデータ値のアレイをより効果的に処理することができる。
【発明の概要】
【課題を解決するための手段】
【０００３】
少なくともいくつかの実例は、
命令に応答してデータ処理を実施するための処理回路機構であって、ベクトル・ロード命令に応答して、データ記憶装置のそれぞれの記憶位置からのデータを、ベクトル値のそれぞれのデータ要素にロードするように構成され、ベクトル・ストア命令に応答して、ベクトル値のそれぞれのデータ要素からのデータをデータ記憶装置のそれぞれの記憶位置に記憶するように構成される処理回路機構を備え、
処理回路機構は、トランザクション開始事象に応答して、１つ又は複数の後続する命令を投機的に実行し、トランザクション終了事象に応答して、トランザクション開始事象に引き続いて投機的に実行された１つ又は複数の後続する命令の投機的結果をコミットし、
装置は、トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令に対するデータ要素Ｊに対応するアドレスと、トランザクション開始事象に引き続いて投機的に実行された以後のベクトル・ストア命令に対するデータ要素Ｋに対応するアドレスとの間に要素間アドレス・ハザードが生じているかどうかを検出するためのハザード検出回路機構を備え、ＫはＪとは異なり、また、以前のベクトル・ロード命令及び以後のベクトル・ストア命令は、いずれも、処理回路機構によって処理された命令の同じスレッドからのものであり、
ハザード検出回路機構は、要素間アドレス・ハザードの検出に応答して、トランザクション開始事象に引き続く命令のそれ以上の処理を中止するように処理回路機構をトリガし、前記投機的結果がコミットされることを防止するように構成される、装置を提供する。
【０００４】
少なくともいくつかの実例は、
命令に応答してデータを処理するための手段であって、ベクトル・ロード命令に応答して、データ記憶装置のそれぞれの記憶位置からのデータを、ベクトル値のそれぞれのデータ要素にロードするように構成され、また、ベクトル・ストア命令に応答して、ベクトル値のそれぞれのデータ要素からのデータをデータ記憶装置のそれぞれの記憶位置に記憶するように構成される、処理するための手段を備え、
処理するための手段は、トランザクション開始事象に応答して、１つ又は複数の後続する命令を投機的に実行し、また、トランザクション終了事象に応答して、トランザクション開始事象に引き続いて投機的に実行された１つ又は複数の後続する命令の投機的結果をコミットし、
装置は、トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令に対するデータ要素Ｊに対応するアドレスと、トランザクション開始事象に引き続いて投機的に実行された以後のベクトル・ストア命令に対するデータ要素Ｋに対応するアドレスとの間の要素間アドレス・ハザードを検出するための手段を備え、ＫはＪとは異なり、また、以前のベクトル・ロード命令及び以後のベクトル・ストア命令は、いずれも、処理回路機構によって処理された命令の同じスレッドからのものであり、
検出するための手段は、要素間アドレス・ハザードの検出に応答して、トランザクション開始事象に引き続く命令のそれ以上の処理を中止するように処理のための手段をトリガし、前記投機的結果がコミットされることを防止するように構成される、装置を提供する。
【０００５】
少なくともいくつかの実例は、
トランザクション開始事象に応答して、１つ又は複数の後続する命令を投機的に実行するステップと、
ベクトル・ロード命令に応答して、データ記憶装置のそれぞれの記憶位置からのデータを、ベクトル値のそれぞれのデータ要素にロードするステップと、
ベクトル値のそれぞれのデータ要素からのデータをデータ記憶装置のそれぞれの記憶位置に記憶するためのベクトル・ストア命令に応答して、ベクトル・ロード命令に対するデータ要素Ｊに対応するアドレスと、ストア命令に対するデータ要素Ｋに対応するアドレスとの間に要素間アドレス・ハザードが生じているかどうかを検出するステップであって、ＫはＪとは異なり、また、以前のベクトル・ロード命令及び以後のベクトル・ストア命令は、いずれも命令の同じスレッドからのものであるステップと、
要素間アドレス・ハザードの検出に応答して、１つ又は複数の後続する命令のそれ以上の処理を中止し、１つ又は複数の後続する命令の投機的結果がコミットされることを防止するステップと、
トランザクション終了事象に応答して、１つ又は複数の後続する命令の投機的結果をコミットするステップと
を含むデータ処理方法を提供する。
【０００６】
本技法の他の態様、特徴及び利点は、添付の図面に関連して読まれるべき実例についての以下の説明から明らかになるであろう。
【図面の簡単な説明】
【０００７】
【図１】ベクトル命令の処理をサポートするデータ処理装置の実例を示す略図である。
【図２】連続するベクトル・ロード命令及び連続するベクトル・ストア命令の実例を示す略図である。
【図３】ベクトル化されたコードの実行中にトランザクション開始事象に応答する方法を示す流れ図である。
【図４】ベクトル・ロード命令に応答してハザード追跡データを更新する方法を示す流れ図である。
【図５】トランザクション消去事象に応答してハザード追跡データを消去する方法を示す流れ図である。
【図６】要素間アドレス・ハザードを検出する方法を示す流れ図である。
【図７】トランザクション終了事象に応答する方法を示す流れ図である。
【図８】データと共にキャッシュ内に記憶されたハザード追跡データの第１の実例を示す図である。
【図９】連続するロード命令によってアクセスされる最小アドレス及び最大アドレスが格納構造で追跡されるハザード追跡データの第２の実例を示す図である。
【図１０】非連続（又はギャザー）ベクトル・ロード命令の実例を示す図である。
【図１１】ハザード追跡データの第３の実例を示す図である。
【発明を実施するための形態】
【０００８】
装置は、ベクトル命令の処理をサポートする処理回路機構を有することができる。ベクトル命令の一実例はベクトル・ロード命令であり、このベクトル・ロード命令に応答して、データ記憶装置のそれぞれの記憶位置からのデータを、ベクトル値のそれぞれのデータ要素にロードされる。別の実例はベクトル・ストア命令であり、処理回路機構は、このベクトル・ストア命令に応答して、ベクトル値のそれぞれのデータ要素からのデータをデータ記憶装置のそれぞれの記憶位置に記憶することができる。例えばベクトル・ロード／ストア命令のために使用されるベクトル値はレジスタに記憶することができる。
【０００９】
処理回路機構は、トランザクション開始事象に応答して、１つ又は複数の後続する命令を投機的に実行し、また、トランザクション終了事象に応答して、トランザクション開始事象に引き続いて投機的に実行されたこれらの１つ又は複数の後続する命令の投機的結果をコミットする。ハザード検出回路機構は、トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令に対するデータ要素Ｊに対応するアドレスと、トランザクション開始事象に引き続いて同じく投機的に実行された以後のベクトル・ストア命令に対するデータ要素Ｋに対応するアドレスとの間に要素間アドレス・ハザードが生じているかどうかを検出するために提供される。Ｋ及びＪは互いに等しくない整数値である。以前のベクトル・ロード命令及び以後のベクトル・ストア命令は、いずれも、処理回路機構によって処理された命令の同じスレッドからのものである。ハザード検出回路機構は、要素間アドレス・ハザードの検出に応答して、トランザクション開始事象に引き続く命令のそれ以上の処理を中止するように処理回路機構をトリガし、投機的結果がコミットされることを防止することができる。
【００１０】
処理される命令の同じスレッド内の以後の命令と以前の命令の間のアドレス・ハザードをハザード検出回路機構が検出する必要があることはすぐには明らかではないことがあり得る。このような命令は、通常、逐次的に作用することが予期され、したがってプログラム実行の異なるスレッドによるデータへの並列アクセスのために典型的に使用されるハザード検出又はトランザクション取扱い等の機構は不要であろう。しかしながらベクトル処理をサポートする装置では、ベクトル命令に対して、一連のベクトル命令のためのベクトル処理のそれぞれのレーンにマップされたループの複数の反復を使用して、スカラー・コードで書かれたプログラム・ループの多数の反復をベクトル化することが広く使用されている。したがってベクトル・ロード命令は、ループの多数の連続反復によって処理される入力をベクトル値のそれぞれの要素中にロードすることができ、１つ又は複数のベクトル命令は、次に、処理のそれぞれのレーン内のこれらの要素の各々を処理することができ、また、次に、ベクトル・ストア命令は、個々のレーンの結果をデータ記憶装置内のそれぞれの記憶位置に記憶することができる。これにより、スカラー命令を使用して個々の反復を個別に実行する場合と比較すると、性能を改善することができ、また、命令キャッシング、取込み及び復号化のオーバヘッドを低減することができる。
【００１１】
しかしながらスカラー・ループの異なる反復間には相互依存性が存在していてもよく、例えば以前の反復は、以後の反復に対する入力として使用される値をデータ記憶装置に書き込むことができる。ループに対するこのような反復がベクトル命令の同じシーケンスの異なるレーンにマップされる場合、ベクトル化されるループの以後の反復に対応するレーンは、以前の反復に対応するレーンによって未だ更新されていない値をロードし得るため、結果のうちのいくつかは不適切であることがあり得る。いくつかのハザードはコンパイル時に静的に識別することができるが、いくつかのロード／ストア・アドレスは、データ記憶装置から読み出される他の値に依存しているため、これはすべての潜在的ハザードに対して保護することはできず、したがってハザードが生じるか否かは、ランタイム時に動的に変化し得る。
【００１２】
動的ハザードに対して保護するための１つの手法は、ベクトル・シーケンスの前に追加コードを提供して、それぞれのレーンにおけるロード／ストアによって使用されるアドレスをチェックし、それによりアドレス・ハザードが存在する場合にコードがベクトル化されることを防止することであり得る。しかしながらこのようなチェックは遅く、また、ベクトル化されたループの反復毎にこれらのチェックのペナルティを負うことは性能に対して有害であり得る。別の手法は、コンパイラの場合、異なるレーン内のロード／ストア・アドレス間にハザードが存在し得るため、スカラー・ループをベクトル化してはならないこと、また、その代わりに、スカラー命令を使用して逐次的に実施された元のプログラム・コードにおけるループの個々の反復を使用して処理しなければならないことを保守的に仮定することであり得る。しかしながら実際には要素間アドレス・ハザードは比較的まれであり、ごく少数の事例は適切な結果をもたらし得ないため、したがってこの手法には、ほとんどの事例においてベクトル化を介して達成することができる何らかの潜在的性能利点を棒に振る危険がある。
【００１３】
これらの問題は、トランザクション開始事象に引き続く一連の命令の投機的な実行の開始を処理回路機構に許容し、且つ、トランザクション終了事象に引き続いて、実行された命令の投機的結果のコミットを許容することによって対処することができる。ハザード検出回路機構は、トランザクション開始事象とトランザクション終了事象の間に生じる要素間アドレス・ハザードを検出し、且つ、トランザクション終了事象に到達する前にハザードが検出されると、トランザクション開始事象に引き続く命令のそれ以上の処理の中止をトリガするために提供することができ、したがって投機的結果がコミットされることが防止される。この手法によれば、投機的に実行された結果は、ハザードの事象において破棄することができるため、アドレス・ハザードが存在しない場合におけるコード自体の進行がハザード・チェックのために遅延することはなく、したがってハザードが存在しないことを仮定して安全に命令の実行を継続することができる。また、実際に生じる静的ハザード又は動的ハザードを検出するためのハードウェア・サポートが存在しているため、コンパイラは、最悪事例シナリオを保守的に仮定する必要がなく、したがってループの反復間における相互依存性の可能性が存在する場合であっても、スカラー・ループのベクトル化を許容することができる。したがって性能を改善することができる。
【００１４】
要素間アドレス・ハザードが検出されると、ハザード検出回路機構は、アーキテクチャ状態データを、トランザクション開始事象に応答して捕獲（キャプチャー）されたアーキテクチャ状態データの先行するバージョンに回復するように処理回路機構を同じくトリガすることができる。例えばレジスタ内の、トランザクション開始事象に引き続く命令の処理で生じたデータ値への変更は、トランザクション開始事象の時点で捕獲された以前の状態にロール・バックされ得る。一方、投機的に実施されたすべてのロード／ストア操作の結果も同じく巻き戻すことができる。例えばストア命令と結合した書込みデータは、データ記憶装置のキャッシュ又はメモリ内にバッファすることができる。バッファされたこれらのデータ値は、要素間アドレス・ハザードが検出されると、破棄し、無効にし、又は重ね書きすることができ、或いはトランザクション終了事象に到達すると状態にコミットすることができる。
【００１５】
通常、ハザード検出回路機構は、以前のベクトル・ロード命令のデータ要素Ｊと、以後のストア命令のデータ要素Ｋとの間の要素間アドレス・ハザードを検出することができ、ＫはＪとは異なる。いくつかの事例では、ハザード・チェックは、それぞれロード及びストアのための異なるデータ要素位置の任意の対の間のあらゆるアドレス・ハザードをチェックすることができる。それぞれのロード命令及びストア命令におけるベクトル内の異なる位置におけるデータ要素は、典型的にはベクトル化されるスカラー・ループの異なる反復に対応することになり、したがって相互要素ハザードをチェックすることにより、１つの反復がループの別の反復によって設定された値に頼っている事例を検出することができる。
【００１６】
しかしながら実際にはほとんどのコンパイラは、典型的には、シーケンス内のベクトルの最も低い要素から最も高い要素まで、ベクトルの最も低い数の要素（要素０）に割り当てられるスカラー・ループの最も前の反復、及びベクトルの最も高い数の要素（要素Ｎ−１、Ｎはベクトル中の要素の数である）に割り当てられるループの最も後の反復でベクトルを満たすことによってスカラー・コードをベクトル化する。実際、いくつかのベクトル・アーキテクチャは、最初の要素から最後の要素までベクトルを満たすようにコンパイラに要求することができる。通常、スカラー・ループの以後の反復をスカラー・ループの以前の反復によって既に読み取られた値に設定することは問題ではないため、いくつかの事例では、ハザード検出回路機構は、そのハザード検出をＫ＜Ｊであるハザードの検出に限定することができる（ハザードとなるアドレスは、以前のベクトル・ロード命令のもっと高い要素Ｊ、及び以後のベクトル・ストア命令のもっと低い要素Ｋに対応する）。この手法は、アドレスを比較しなければならない要素の対の数を少なくするため、多くの事例においてハザード追跡を簡略化することができる。また、ハザード検出をＫ＜Ｊである事例に限定することにより、トランザクションが中止される可能性がより小さいため、同じく性能を改善することができる。それにもかかわらずいくつかのシステムは、これがより適切であると見なされる場合（例えばコンパイラがループ反復を上で説明したボトム−アップ手法とは異なる方法でベクトル・レーンにマップする自由を有している場合）、依然として、ロード及びストアの別様に位置している要素の任意の対のために使用されるアドレス間のハザードを検出することができる。
【００１７】
プログラマ又はコンパイラは、トランザクション開始事象及びトランザクション終了事象を使用して、要素間アドレス・ハザードの危険にさらされている命令のシーケンスを識別することができる。トランザクション開始事象及びトランザクション終了事象は、処理回路機構によってサポートされる専用トランザクション開始命令及び専用トランザクション終了命令であってもよい。例えばトランザクション開始命令及びトランザクション終了命令は、処理回路機構によって処理される命令を復号する命令復号器によってサポートされる固有プログラム命令であってもよい。処理回路機構は、トランザクション開始命令に応答して、上で説明したアーキテクチャ状態の捕獲等の後続する命令の投機的処理のために処理回路機構を準備するための操作を実施することができる。トランザクション終了命令に応答して投機的結果をコミットすることができ、また、アーキテクチャ状態の既に捕獲済みのすべてのバージョンを破棄することができる。したがってプログラマ／コンパイラは、命令をトランザクション開始／終了命令で拘束することにより、トランザクションとして処理されるべき命令を識別することができる。
【００１８】
別法としては、トランザクション開始事象及びトランザクション終了事象を信号発信するための固有命令を提供する代わりに、他の機構を使用することも可能である。例えばトランザクション開始事象は、汎用命令を使用して制御レジスタ内の制御ビットをセットし、それによりトランザクションの開始に印を付けることによって信号発信することができ、また、終了事象は、制御レジスタを更新してトランザクションの終了を信号発信することによって同様の方法で実現することができる。
【００１９】
ハザード追跡記憶回路機構は、トランザクション開始事象に引き続いて投機的に実行された１つ又は複数の以前のベクトル・ロード命令のために使用されたアドレスを追跡するためのハザード追跡データを記憶するために提供することができる。このハザード追跡データは、次に、以後のベクトル・ストア命令に遭遇した際にハザード検出回路機構により使用され、要素間アドレス・ハザードが存在しているかどうかを検出することができる。
【００２０】
いくつかの事例では、ハザード追跡記憶回路機構は、データ記憶装置自体の一部を備えることができる（この場合、データは、ベクトル・ロード命令又はベクトル・ストア命令に応答してアクセスされる）。例えばハザード追跡データは、データ自体と共にキャッシュに記憶することができる。別法としては、ハザード追跡記憶回路機構は、データ記憶装置によって取り扱われるべきロード要求又はストア要求を管理するために使用される、処理回路機構によって発行されるロード命令又はストア命令を待ち行列にするためのロード／ストア待ち行列等のデータ構造の一部を含むことも可能であり、或いはメモリに書き込まれるデータ値を記憶するためのストア・バッファを含むことも可能である。別法としては、ハザード追跡記憶回路機構は、例えばハザード検出回路機構によって維持される専用構造のようなロード要求又はストア要求を管理するために提供される回路機構とは全く別のものであってもよい。
【００２１】
ハザード検出回路機構は、トランザクション開始事象に応答してハザード追跡データを消去することができる。これは、以前のトランザクションによって既にアクセス済みの別のアドレスと同じアドレスを新しいトランザクションがアクセスした場合のハザード検出回路機構によるハザードの検出を防止することができる。別法としては、ハザード追跡データは、トランザクション終了事象に応答して消去することができ、したがってハザード追跡データは、新しいトランザクションの開始時に初期化されることになる。
【００２２】
また、ハザード検出回路機構は、トランザクション開始事象に引き続いて生じる（但し、トランザクション終了事象の前）トランザクション消去事象に応答してハザード追跡データを消去することも可能である。例えばトランザクション消去事象は、トランザクション消去命令によってトリガされ得る（この命令は、命令復号器によってサポートされる固有命令であってもよい）。専用トランザクション消去命令を提供してハザード追跡データを消去することは、１つのトランザクション内における、ベクトル化されたループの複数の反復の実行を許容するためにとりわけ有用であり得る。トランザクション開始事象又はトランザクション終了事象に応答して実施されるアクションは、性能オーバヘッドをもたらし得る。例えばトランザクション開始事象に応答してアーキテクチャ状態を保存する必要があり、一方、トランザクション終了時には投機的結果をコミットする必要があり得る。スカラー・ループがそれぞれＮ個の要素のベクトルを使用してベクトル化される場合、ベクトル化は、ループのＮ個の連続反復のブロックに対応する１つのベクトルのレーン内にハザードを導入し得るが、例えば反復Ｎ＋１は、あらゆる事例において、すべての先行するＮ個の反復が完了した後に実施されることになるため、ベクトル化は、Ｎ個を超える反復を隔てた反復間にはハザードを導入しない。したがって不要な中止を回避するためには、Ｎ個の反復が処理されるとハザード追跡データを消去することが場合によっては望ましい。しかしながらループのＮ個の反復の個々のブロックを個別のトランザクションとして実行すると、Ｎ個の反復が完了する毎にトランザクション入口／出口オーバヘッドをもたらし得る。このオーバヘッドは、トランザクション自体を実際に終了させることなくハザード追跡データを消去することができることを信号発信するトランザクション消去命令を提供することによって低減することができる。この方法によれば、ループに対するＮ個の反復のブロックがベクトル・コード・シーケンス中で処理される毎にトランザクション消去命令を実行することができ、また、ループのＮ個を超える反復を単一のトランザクション内で処理することができ、その一方でハザードに対して保護される。
【００２３】
通常、ハザード検出回路機構は、トランザクション開始事象に引き続いて投機的に実行されるベクトル・ロード命令のために使用されるアドレスに基づいてハザード追跡データを更新することができる。ハザード検出回路機構は、次に、ハザード追跡データを後続するベクトル・ストア命令によって使用されたアドレスと比較し、要素間アドレス・ハザードが生じたかどうかを検出することができる。
【００２４】
いくつかの事例では、ハザード検出回路機構は、すべてのベクトル・ロード命令に応答してハザード追跡データを更新することはできないが、更新を所定のタイプのベクトル・ロード命令に限定することは可能であり、ハザード追跡データの更新は、その所定のタイプ以外のベクトル・ロード命令に応答して抑制される（追跡データに対する更新は、スカラー・ロード命令に応答して同じく抑制することができる）。例えば所定のタイプのベクトル・ロード命令は、その演算コードによって、命令符号化内のフラグによって、或いは後続するベクトル・ロード命令がハザード検出回路機構を使用して追跡されるべきタイプのベクトル・ロード命令であろうことを信号発信するベクトル・コード内のベクトル・ロード命令の前に置かれるヒント命令等の、ベクトル・ロード命令の符号化には無関係の暗黙の指示によって他のタイプのベクトル・ロード命令から区別することができる。
【００２５】
例えば特定のロードは、すべての後続するストアのアドレスとは異なることが分かっている静的に決定されたアドレスを使用するため、或いはベクトル化されるべきスカラー・ループの異なる反復間に相互依存性が存在しないため、プログラマ又はコンパイラは、しばしば、特定のロードは要素間アドレス・ハザードの原因になる危険がないことに気が付き得る。一方、後続するストアと衝突する危険が存在する特定のロードが存在する場合、所定のタイプのベクトル・ロード命令をそのロードのために使用することができる。ハザード追跡データの更新を所定のタイプのベクトル・ロード命令に限定することにより、これは、追跡されるべきアドレスの数を少なくする（これは、利用可能な追跡記憶容量の使用をより有効にすることができる）。また、以下で考察されるように、いくつかの事例では、アドレス追跡のハードウェア・コストを低減するためにアドレス追跡を比較的不正確にすることができ、例えばアドレス追跡は、個別のアドレスではなく、アドレスのブロックの細分性でロード／ストア・アクセスを追跡することも可能である。これは、すべてのタイプのロードに対するハザードを検出することは、検出された偽りの断定的ハザードに起因する中止がより頻繁になる危険があり得ることを意味しており、ロード及びストアは、アドレスの同じブロックをアクセスするが、同じアドレスを実際にアクセスしない。ハザード検出を所定のタイプのロードに限定することにより、ハザードが生じることはないであろうことをプログラマ／コンパイラが既に示している（所定のタイプのロードを使用しないことを選択することによって）他のタイプのロードに対する偽りの断定的ハザードによってトランザクションが不必要に中止されることはない。
【００２６】
ハザード追跡データを実現するいくつかの方法が存在している。一実例では、ハザード追跡データは多数の追跡入口を含むことができ、個々の追跡入口は、アドレスのそれぞれのブロックに対応し、且つ、アドレスのそのブロック内のあるアドレスがトランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令のために使用された最も高いデータ要素位置を識別する。この文脈においては、最も高いデータ要素位置は、ベクトル・オペランドの最上位端に最も近い位置を意味している。ハザード検出回路機構は、次に、以後のベクトル・ストア命令に対する所与のデータ要素位置のために使用されたアドレスを含むアドレスのブロックに対応する追跡入口が、上記所与のデータ要素位置より高いデータ要素位置を識別すると、以後のベクトル・ストア命令に対する要素間アドレス・ハザードを検出することができる（これは、要素間ハザード検出を上で言及したＫ＜Ｊの事例に限定する手法の実例である）。要約すると、アドレスの所与のブロックにアクセスした最も高い要素を追跡し、且つ、後続するストアがより低いデータ要素位置からアドレスのそのブロックへのアクセスを試行するとハザードを信号発信することにより、これは、ループの以後の反復が、ループの以前の反復が値を更新する前に順番を狂わせて値にアクセスした（ハザードを読み取った後に書き込む）事例を検出することができ、その場合、トランザクションの中止をトリガすることができる。
【００２７】
ハザードを追跡するこの手法の場合、１つのオプションは、追跡入口をデータ自体と共にキャッシュ内に記憶することである。即ちデータ記憶装置は、データを記憶するための多数のキャッシュ・ラインを含むキャッシュを備えることができ、また、追跡入口は、個々のキャッシュ・ラインがそのキャッシュ・ラインに対応するアドレスの１つ又は複数のブロックのための追跡入口のうちの１つ又は複数と結合されているキャッシュに記憶することができる。
【００２８】
追跡入口がアドレスのブロックへのアクセスを追跡する細分性は変更することができる。いくつかの事例では、個々のキャッシュ・ラインは単一の追跡入口を備えることができ、したがって以後のストアがロードより低い要素位置からの以前のロードと同じキャッシュ・ラインにアクセスすると、ハザードを検出することができる（ストアが以前のロードと同じキャッシュ・ライン内の異なるアドレスに実際にアクセスしても）。他の実施態様は、もっと細かく細分されたレベルでアクセスを追跡することができ、また、キャッシュ・ラインの異なる部分へのアクセスを追跡するために、キャッシュ・ライン毎に複数の追跡入口を提供して、ハザードのより正確な検出を提供することができる。したがって検出されたハザードは、ロード／ストアが同じアドレスに実際にアクセスしたであろうことを必ずしも意味しているわけではなく、ハザード検出回路機構は、アクセスが衝突する危険を不正確な追跡データに基づいて単純に検出し得た可能性があることは認識されよう。より正確なハザード追跡／それほどは正確ではないハザード追跡のハードウェア・コストと性能利点の間にはトレード・オフが存在している。
【００２９】
キャッシュを使用して、先行するロードによってアクセスされたアドレスを追跡するための追跡入口を記憶する場合、他のデータをキャッシュに記憶する必要がある場合は、所与のキャッシュ・ラインがキャッシュから追い払われることがあり得る。この時点では、対応する追跡入口も同じく追い払われており、したがって先行するロード・アドレスに関する情報が失われる可能性がある。したがってアドレスの対応するブロック内の少なくとも１つのアドレスがトランザクション開始事象以降の以前のベクトル・ロード命令のために使用されたことを示す追跡入口を有するキャッシュ・ラインが追い払われると、ハザード検出回路機構は、ハザードが実際に検出された場合と同様の方法で、トランザクション開始事象に引き続く命令のそれ以上の処理を中止するように処理回路機構をトリガし、投機的結果がコミットされることを防止することができる。実際にはトランザクションは比較的短くすることができ、したがってロード命令によって既にアクセス済みのデータがトランザクションの終了（又は消去命令）に到達する前に追い払われる機会を比較的少なくすることができるが、そのまれな事例においてトランザクションを中止する能力を提供することにより、追跡データはもはやキャッシュには存在しないため、これは、見逃されるハザードに対してガードし、また、追い払われた追跡情報がメモリ又は別の構造中に保持される、より複雑な代替よりも有効であり得る。
【００３０】
別の実例では、ハザード追跡データは１つ又は複数のロード追跡入口を含むことができ、個々のロード追跡入口は、トランザクション開始事象のうちの１つから投機的に実行された対応するベクトル・ロード命令のためにアクセスされた最小アドレス及び最大アドレスのうちの少なくとも１つを識別する。この手法は、ベクトルの最下位要素がロード／ストア操作のための所与のアドレスを使用し、また、ベクトルの後続する要素が、ベクトルの最下位要素に対して使用されたアドレスから連続的に引き続く連続アドレスを使用する、連続するベクトル・ロード命令又はベクトル・ストア命令のために有用であり得る。このような命令の場合、所与のロード命令のために使用された最小アドレス及び最大アドレスのうちの少なくとも１つの識別は、後続するストアが異なる要素位置における対応するアドレスにアクセスすることになるかどうかを決定することができるためには十分であり得る。例えばハザード検出回路機構は、以後のベクトル・ストア命令のための最小アドレスがロード追跡入口のうちの１つによって示された最小アドレスより大きく、且つ、最大アドレス以下である場合、要素間アドレス・ハザードを検出することができる。いくつかの事例では、最小アドレス及び最大アドレスの両方を識別することは場合によっては不要であり、例えばすべてのベクトル命令が固定数の要素を使用している場合、最大アドレスは最小アドレスから暗黙的であり、その逆についても真である。また、いくつかの事例では、最小アドレス及び最大アドレスのうちの一方は、オフセットを介して識別することができ、或いは明確なアドレスとしてではなく、ベクトルの要素の総数として識別することができ、依然として実際の最大アドレス又は最小アドレスの識別を許容する。
【００３１】
ハザードを追跡する別の手法は、トランザクション開始事象に引き続いて投機的に実行された１つ又は複数のベクトル・ロード命令のそれぞれのデータ要素に対してアクセスされた１つ又は複数のアドレスを識別するアドレス・リストを提供することであり得る。例えばアドレス・リストは、アクセスされたアドレスと、これらのアドレスがアクセスされた要素位置との間の相応関係を識別することができる。ハザード検出回路機構は、次に、以後のベクトル・ストア命令に対する所与のデータ要素位置に対応するアドレスが、トランザクション開始事象に引き続いて投機的に実行された以前のベクトル・ロード命令に対するその所与のデータ要素位置以外のデータ要素位置に対応するベクトル・アドレスと同じである場合、要素間アドレス・ハザードを検出することができる。この手法は、ベクトル演算の個々の要素によって使用されるアドレスが、要素の各々のために使用される非連続アドレス即ちアドレス・オフセットを指定することができる別のベクトル入力から誘導される非連続ロード命令又はストア命令のためにとりわけ有用であり得る。この事例では、ベクトルの以後の要素に対するアドレスを以前の要素から決定することはできず、したがってその代わりにアクセスされたアドレスの各々を追跡することができる。それにもかかわらずこの手法は、連続するタイプのロード・ストア命令のために同じく使用することができる。例えば非連続命令がサポートされる場合、両方のタイプのロード／ストア命令のための共通追跡フォーマットを使用することがより有効であり得る。
【００３２】
図１は、ベクトル処理をサポートするデータ処理装置２の実例を概略的に示したものである。装置２は、命令に応答してデータ処理操作を実施する、例えばプロセッサ、ＣＰＵ（中央処理装置）又はＧＰＵ（グラフィック処理装置）等の処理回路機構４を有している。処理回路機構４は、例えば実行される命令を命令キャッシュ８から取り込むための取込み段６、取り込まれた命令を復号して、適切な処理操作を実施するよう、後続する段を制御するための制御信号を生成する復号段１０、復号された命令を待ち行列にして、それらに必要なオペランドが利用可能になるまで実行を待機し、利用可能になった時点で実行のためにそれらが発行される発行段１２、発行された命令を実行して、レジスタ１６、１８から読み出されたオペランドを使用して対応する処理操作を実施するための実行段１４、及び実行された命令の結果をレジスタ１６、１８にライトバックするためのライトバック段２０を含む多数のパイプライン段を含む処理パイプラインを含む。実行段１４は、算術演算又は論理演算を実施するための算術／論理ユニット（ＡＬＵ）２２、浮動小数点演算を実施するための浮動小数点ユニット２４、及びロード操作又はストア操作を実施するためのロード／ストア・ユニット２６等の異なるタイプの命令を実行するための多数の実行ユニットを含む。他のタイプの処理ユニットを提供することも可能であり、これは単なる一実例にすぎないことは認識されよう。この実例は、パイプライン段の特定の組合せを有しているが、他の実例は追加段を有することも可能である。例えばアウト・オブ・オーダ・プロセッサの場合、命令によって指定されたアーキテクチャ・レジスタ指示子を、ハードウェア内に提供されたレジスタ１６、１８を識別する物理レジスタ指示子に再マッピングするために、レジスタ・リネーム段を復号段１０と発行段１２の間に提供することができ、また、リオーダ・バッファ等の追加資源を提供して、命令が取込み段６によってキャッシュ８から取り込まれたプログラム順序とは異なる順序で実行された命令の完了を追跡することも可能である。
【００３３】
パイプライン４は、スカラー・オペランド上で操作を実施するスカラー命令の処理をサポートし、個々のスカラー・オペランドは、単一のデータ値、及び単一のレジスタ内に記憶された多数の独立データ要素を含むベクトル値の処理を必要とし、或いはベクトル値を生成するベクトル命令を含む。個別のスカラー・レジスタ１６及びベクトル・レジスタ１８は、それぞれスカラー値及びベクトル値を記憶するために提供され得る。いくつかの命令は、スカラー・オペランド及びベクトル・オペランドの両方の処理を必要とする混合命令であってもよく、一方、他の命令は、ベクトルのみ、或いはスカラー・オペランドのみを処理することができる。簡潔にするために図１には示されていないが、いくつかの事例では、実行段１４は、それぞれスカラー演算及びベクトル演算を処理するための個別の実行ユニット、例えば個別のスカラーＡＬＵ及びベクトルＡＬＵを含むことができる。ベクトル実行ユニットは、単一の命令に応答して処理のレーンの各々を実施するための回路機構を含むことができる。いくつかの事例では、所与のベクトル命令に応答して複数のレーンの並列処理を実施するために、多数の並列実行ユニットを提供することができ、それにより性能を改善することができる。別の手法は、単一のセットの実行ユニットを使用してレーンの逐次処理を実施するためのものであっても、或いはベクトル処理の２つ以上のレーンのブロックを並列に実施することができる十分な実行ユニットを提供するためのものであってもよいが、フル・ベクトルには、これらの実行ユニットを介したいくつかのサイクルが必要であり得る。したがってベクトル処理は、すべてのレーンを並列に処理しなければならないことを暗に意味していない。ベクトル・レーンの並列処理は性能を改善するが、スカラー・コードと比較すると、たとえすべてのレーンが逐次処理されたとしても、命令キャッシュ８、取込み段６及び復号段１０でのより少ない命令の取扱いにおけるオーバヘッドの低減のため、ベクトル化された処理の利点が依然として存在している。
【００３４】
ベクトル演算の一実例は、データをメモリ・システムからベクトルのそれぞれのデータ要素へロードするためのベクトル・ロード命令、又はベクトル・レジスタ１８のうちの１つのベクトルのそれぞれのデータ要素からのデータをメモリ・システムに記憶するためのベクトル・ストア命令であってもよい。図１の実例では、メモリ・システムは、レベル１命令キャッシュ８、レベル１データ・キャッシュ２８、データ及び命令の両方のために使用される共有レベル２キャッシュ３０及び主記憶装置３２を含む。これは、可能なメモリ階層構造の一実例にすぎず、他の構成を使用することも可能であることは認識されよう。
【００３５】
図２は、ベクトル・ロード命令及びベクトル・ストア命令の実例を概略的に示したものである。図２の上側の部分に示されているように、ベクトル・ロード命令の場合、多数の処理レーンが実施され、個々の処理レーンは、メモリ・アドレス空間４０の所与のアドレスによって識別されたデータ値をデータ記憶装置からターゲット・ベクトル・レジスタＺ０の対応するデータ要素へロードする。この実例は、ターゲット・レジスタの最下位要素Ａ［０］のために使用されるアドレスが、スカラー・レジスタ・ファイル１６から読み出されたベース・レジスタ値Ｒａにオフセット＃４０を追加することによって獲得され、また、後続する要素Ａ［１］からＡ［３］のためのアドレスが要素Ａ［０］によって使用されるアドレスの後に連続的に続く、連続するロード命令を示している。この実例は、（ベース・レジスタ＋オフセット）アドレス指定モードを示しているが、他の実施態様は、他のスカラー・レジスタを使用してオフセットを指定することができ、或いは即値アドレスを使用することも可能である。
【００３６】
図２の下側に示されているストア命令の場合、処理の個々のレーンが、ベクトル・レジスタＺ１の対応する要素から読み出されたデータ値を、そのレーンに対して計算されたアドレスに対応するデータ記憶装置の記憶位置に記憶する。この場合も、連続するタイプのストア命令に対して、アドレスはアドレス空間４０内で連続している。
【００３７】
ベクトル・アーキテクチャが性能を改善する１つの方法は、ループ・ベクトル化を介することである。即ちループの複数の反復｛ｌｉ．．ｌｎ｝がベクトルの複数の要素｛ｅｉ…ｅｎ｝内で実行される。これが可能である場合、また、これが可能であるところでは、ループの実行は最大ｎ倍だけ加速することができる（マイクロ−アーキテクチャ実施態様がベクトル・レーンを並列に実行する範囲によって決まる）。
【００３８】
ループを上で説明したようにベクトル化することができない多くの理由が存在している。１つはメモリ・ハザードによるものである。即ちループの反復、例えばｌｉは、消費する必要がある新たしい値ｌ（ｉ＋ｍ）を生成する。単純な実例を以下に示す。
【００３９】
「実例１」
2019534504.tif 000003
スカラー・コードでは、このループは以下のように実現することができる。
【００４０】
「実例２」
2019534504.tif 000004
これは、以下のベクトル演算にベクトル化することができる。
【００４１】
「実例３」
【表１】
2019534504.tif 000005
ベクトル命令構文は、
【００４２】
「実例４」
2019534504.tif 000006
に多少似ていると言える（簡潔にするために、ここではロード及びストアに対する断定は無視されている）。
【００４３】
この深慮のない手法は、反復ｉと反復ｉ＋３の間にハザードが存在しているため（実例３の太字で示されている演算によって示されている）、元のスカラー・バージョンの意味を維持しない。サイクル０におけるアドレス［ａ、＃６４］からのロードは、次にサイクル２で記憶される、サイクル１でなされた増分を反映しないため、これは不正確な結果をもたらす。
【００４４】
上記実例では、これらの依存性は静的に決定することができる。しかしながら一般的な事例では、サイクル０におけるロード及びサイクル２におけるストアのために使用されるアドレスは、間接的処理（別のメモリ・アクセス）に由来するものであってもよく、その場合、依存性はランタイム時にのみ決定することができる。これらは動的依存性と呼ばれている。多くの事例ではこのような動的依存性は極めてまれであるが、残念なことにはこのような事例では、コンパイラは保守的になる傾向があり、ループをベクトル化しない。これは、依存性が存在しない場合、ほとんどの事例において潜在的性能改善が失われることを意味している。
【００４５】
その代わりに、本明細書において説明されている手法は、通常、依存性は存在せず、また、ループ・ベクトル化による性能利得からの利点も存在しないことを仮定しているが、このような要素間依存性が実際に生じると、それらが検出され、且つ、解決されることを保証する機構を提供する。このような依存性を取り扱うための代替手法は、明示的アドレス比較命令を使用して潜在的衝突ロードを注釈することによって依存性を常に試験することであろう。しかしながらこれらの操作はコストをもたらし、また、このような命令のマイクロ−アーキテクチャ実施態様は遅い。
【００４６】
その代わりに依存性トランザクションの概念が導入されている。依存性トランザクション（ＤＴＸ：ｄｅｐｅｎｄｅｎｃｙ  ｔｒａｎｓａｃｔｉｏｎ）内では、依存性が検出されてもアーキテクチャ状態をロール・バックすることができる限り、コードを安全にベクトル化することができ、トランザクションの終了時に安全にコミットするポイントに至るまでの間、あらゆる投機的更新が見られることを防止することができる。このような概念を上記実例に適用することにより、アセンブリ・コードは、
【００４７】
「実例５」
2019534504.tif 000007
に多少似ていると言える。
【００４８】
トランザクション開始（ｔｈａｚａｒｄ）命令を実行すると、ハードウェアは、アーキテクチャ状態のチェックポイントを取るか、或いはアーキテクチャ状態の何らかの部分を取り、且つ、キャッシュを特殊なトランザクション−エイリアス・モードに置くことになる。キャッシュは、潜在的に安全ではない操作からの投機的メモリ更新を構造内にバッファすることができる（例えばレベル１専用データ・キャッシュ）。投機は、トランザクション終了（ｔｅｎｄ）命令が実行され、且つ、トランザクションが首尾よくコミットするか、又はトランザクションが自己中止されるか、或いは衝突のために中止するまで継続する。
【００４９】
トランザクション開始命令とトランザクション終了命令の間に投機的に実行される命令を含む依存性トランザクション（ＤＴＸ）の場合、要素間アドレス・ハザード（相互要素衝突とも呼ばれる）が検出される。相互要素衝突は、ライト・アフタ・リード・ハザードとして見ることができ、リードは要素ｉからのものであり、また、ライトは要素ｉ−ｊからのものである（ｊは正である）。このようなハザードは、実例３のコードの中に見ることができる。要素０（サイクル３）におけるストアは、要素３（サイクル０）における以前のロードによって読まれている。衝突は、何らかの連続するベクトル・ストア命令によってアクセスされる最も低いアドレスが（先行する）連続するベクトル・ロード命令によってアクセスされる最も高いアドレス以下であり、且つ、ベクトル・ロード命令によってアクセスされる最も低いアドレスより高い場合、依存性トランザクションにおいて生じる。
【００５０】
要素追跡は、通常のメモリ操作又はキャッシュ可能なメモリ操作毎に（或いはいくつかの実施態様では、以下で考察される所定のタイプのロード等の限定されたセットのメモリ操作に対してのみ）提供される。個々のこのようなメモリ操作は、その操作を生成する要素（ベクトル・レーン）を指定する情報を捕獲することができる。この要素は、何らかの後続するメモリ操作がメモリ・アドレス空間の同じアドレス（又はより多くの不正確なマッピングが使用される場合、アドレスの同じブロック）と抵触する最大要素を識別することができるよう、構造の中に捕獲され得る。
【００５１】
例えば要素は６４ビット要素細分性で追跡することができ、また、所与のキャッシュ・ラインにアクセスする最大要素は、キャッシュ・ラインを使用してＬ１キャッシュに記憶される。即ちキャッシュ・ライン毎に１つの「最大要素」が捕獲される。ベクトル毎の要素の数は（ＶＬｂ／６４ｂ）であり、ＶＬｂはベクトル長であり、したがって５１２ビット・ベクトル・アーキテクチャの場合、８個の全く異なる要素が追跡されることになり、また、追跡ビットは、キャッシュ・ライン毎に３ビットを含むことになる。
【００５２】
「実例６」
キャッシュ・ライン−アドレス・タグ、コヒーレンス状態、ＴＭ状態（トランザクション・メモリ目的のためにハザードを追跡するための状態）及びＤＴＸエイリアス状態を示す。
【００５３】
【表２】
2019534504.tif 000008
【００５４】
上記実例３を参照すると、キャッシュ・ライン・エイリアス・ビットは、個々のベクトル・ロード命令の後に更新される。
【００５５】
「実例７」
【表３】
2019534504.tif 000009
ｌｄ１ｄ  ｚ０．ｄ、［ａ、＃４０］
／／サイクル０  ｌｄｒ  ｘ０、［ａ、＃６４］｜ｌｄｒ  ｘ０、［ａ、＃５６］｜ｌｄｒ  ｘ０、［ａ、＃４８］｜ｌｄｒ  ｘ０、［ａ、＃４０］
【００５６】
【表４】
2019534504.tif 000010
／／範囲＃０〜＃６３内のアドレスにアクセスする最大要素は要素２であり、また、範囲＃６４〜１２７内のアドレスにアクセスする最大要素は要素３である。
ａｄｄ  ｚ０．ｄ、ｚ０．ｄ、＃４
／／サイクル１  これはベクトル・ロード操作ではないため、キャッシュ・ライン・エイリアス・インデックスに対する変更はない。
ｓｔ１ｄ  ｚ０．ｄ、［ａ、＃６４］
／／サイクル２  ｓｔｒ  ｘ０、［ａ、＃８８］｜ｓｔｒ  ｘ０、［ａ、＃８０］｜ｓｔｒ  ｘ０、［ａ、＃７２］｜ｓｔｒ  ｘ０、［ａ、＃６４］
【００５７】
【表５】
2019534504.tif 000011
／／要素３が、依存性ハザードが存在したことを意味する、反復の順序を外れてこのキャッシュ・ラインにアクセスしたため、要素０を有するｓｔｒ＠＃６４は後続し得ない。
【００５８】
ストア（サイクル３）の時点では、メモリ記憶位置［ａ、＃６４］における第２のキャッシュ・ライン内のデータは、以後のロードによって、反復の順序を外れて読まれたことは明らかである。この時点でキャッシュは、プロセッサ４にＤＴＸ中止を信号発信する。プロセッサ４は、必要なアクションを取ってアーキテクチャ状態をロール・バックし、また、キャッシュは投機的修正を一掃し、且つ、エイリアス・ビットを消去する。この時点でプロセッサ４は、進行の実施を保証するために、スカラー・コードを使用して、或いは分割サイズ（ベクトル・ループの所与の反復で処理されるベクトル要素の数）を小さくすることによって再試行することができる。ＤＴＸ中止（或いは他の形態のトランザクション中止）がない場合、コードは投機的メモリ修正を安全に発行する。これは、トランザクションの終了に印を付けるトランザクション終了（ｔｃｏｍｍｉｔ）命令を使用して達成することができる。
【００５９】
要約すると、プログラマは、トランザクション開始事象及びトランザクション終了事象を定義して、レーン間ハザードの可能性があり得るベクトル命令のシーケンスを拘束することができ、また、トランザクションの開始と終了の間で、図１に示されているように装置２内に提供されたハザード検出回路機構５０は、ロード命令及びストア命令によってアクセスされるアドレスを追跡することができ、また、ベクトル・ロード命令及び後続するベクトル・ストア内の異なる要素位置における要素間でレーン間ハザードが検出されると、トランザクションの処理を中止することができる。ハザード追跡記憶装置５２は、アクセスされたアドレスを追跡するための追跡データを記憶するために提供することができる。ハザード追跡記憶装置５２は独立したデータ構造として提供することができるが、他の実例ではハザード追跡データは、Ｌ１データ・キャッシュ２８内等のデータ記憶装置自体の一部に記憶することができるため、ハザード追跡記憶装置５２は図１には点線で示されている。いくつかの事例では、ハザード検出回路機構１５は、ロード／ストア・ユニット２６内、又はキャッシュ２８と結合したキャッシュ・コントローラ内等の、ロード操作及びストア操作を制御するための制御回路機構の一部の中に提供することも可能である。
【００６０】
図３から７で考察される以下の流れ図は、このような依存性トランザクションの取扱いの実例を提供している。
【００６１】
図３は、トランザクションの開始時に実施される操作を示したものである。ステップ６０で処理回路機構４は、トランザクション開始事象が生じたかどうか、例えばトランザクション開始命令に遭遇したかどうかを検出する。トランザクション開始事象に応答して、ステップ６２で処理迂遠４は、現在のアーキテクチャ状態の少なくともサブセットを捕獲する。例えばスカラー・レジスタ１６及びベクトル・レジスタ１８の少なくともいくつかの内容をメモリ・システム２８、３０、３２に保存することができ、したがってトランザクションを中止しなければならない場合に、以後にデータを回復することができる。別法としては、専用のセットの回復レジスタを提供して、アーキテクチャ状態の現在のスナップショットをバックアップし、それによりデータをメモリ・システムに保存する必要を回避することも可能である。現在のアーキテクチャ状態は、制御レジスタの内容、例えば現在の実行点を示すプログラム・カウンタ、例外の取扱いに引き続いて処理を戻さなければならない戻りアドレスを指定しているリンク・レジスタ、又はプロセッサの現在の状態を表している他の情報等の他の情報を含むことも可能である。
【００６２】
ステップ６４でハザード追跡記憶装置５２内のハザード追跡データが消去される。例えば追跡ハザード・データが更新され、したがって追跡ハザード・データは、現在のトランザクション内のベクトル・ロード命令によって既にアクセスされているアドレスをもはや一切示していない。ステップ６６で実行の現在のスレッドの処理が投機的に継続し、したがって引き続いて実行された命令の結果は、状態に未だコミットされていない。スカラー・レジスタ又はベクトル・レジスタ内の値を更新するＡＬＵ、浮動小数点、ロード命令又は他のタイプの命令の事例では、これらを通常通りに単純に実行してターゲット・レジスタを更新することができ、また、これは、このような命令の結果は、依然として、アーキテクチャ状態の既に捕獲済みのスナップショットを使用して巻き戻しすることができる、という意味で投機的に実施される。データをメモリ・システムに書き込むためのストア操作の場合、メモリに書き込まれる値は、ロード・ストア・ユニット２６内、又はキャッシュ２８、３０又はメモリ３２内の構造内のいずれかにバッファすることができ、それにより結果が依然として投機的である間におけるメモリの実際の更新を防止することができる。次に、図４から７に示されている事象のうちの１つが生じるまでトランザクションの処理が継続する。
【００６３】
図４は、トランザクション開始事象に引き続いて、また、トランザクション終了事象の前に遭遇するベクトル・ロード命令の処理を示したものである。ステップ７０でこのようなベクトル・ロード命令が検出されると、ステップ７２で、そのロード命令が所定のタイプのロード命令であるかどうかが検出される。所定のタイプのベクトル・ロードは、例えば特定の演算コードを有するベクトル・ロードであっても、或いはそのベクトル・ロードが所定のタイプのベクトル・ロードであることを識別する制御パラメータを指定するベクトル・ロードであってもよく、或いは所定のタイプのベクトル・ロードは、このベクトル・ロードが所定のタイプの命令であることのヒントを提供するためにそのベクトル・ロードの直前に修正命令が実行されたかどうかに基づいて検出され得る。所定のタイプの命令が検出されると、ステップ７４でハザード検出回路機構５０は、ベクトル・ロード命令のそれぞれの要素に対して使用されたアドレスに基づいてハザード追跡記憶装置５２内のハザード追跡データを更新する。次にステップ７６でベクトル・ロード命令が投機的に実行される。一方、ベクトル・ロードが所定のタイプのベクトル・ロードではない場合、方法はステップ７２から直接ステップ７６へ進行し、ステップ７４におけるハザード追跡データを更新するステップを省略する。
【００６４】
他の実施例では、ステップ７２を省略し、その代わりにステップ７４で、すべてのタイプのベクトル・ロードに対してハザード追跡データを更新することも可能である。しかしながらハザード追跡データの更新を特定のタイプのロードに限定することは、ハザード追跡のオーバヘッドを低減し、また、ハザードが検出される機会を少なくするために有用であり得る。ハザードが追跡されるべき所定のタイプとしてのベクトル・ロードの印付けをサポートするシステムの場合、プログラマは、それらが要素間アドレス・ハザードを生成しないことが分かっているロードに対するハザード追跡のオーバヘッドを回避するために、所定のタイプの使用をハザードが予期される事例に限定することができる。
【００６５】
図５に示されているように、トランザクションを処理している間、処理回路機構４又はハザード検出回路機構５０は、トランザクション消去事象が生じたかどうかを検出することができる（図５のステップ８０）。トランザクション消去事象が生じると、ステップ８２で、ステップ６４と同じ方法でハザード追跡記憶装置５２内のハザード追跡データが消去される。これは、トランザクションの終了に未だ到達していない場合であっても追跡データを消去するための機構を提供する。単一のトランザクション内で実行されるべきループの複数の反復を許容し、それによりトランザクション取扱いのオーバヘッドを低減するため、これは有用である。トランザクション消去事象は、例外、或いは制御レジスタをセットする命令等のハザード追跡データを安全に消去することができることを信号発信する任意の事象であってもよい。しかしながらトランザクション消去事象を表現するとりわけ有用な方法の１つは、追跡データを消去するための専用のトランザクション消去命令（ｔｃｌｅａｒ）を提供することである。プログラマ又はコンパイラは、次に、ベクトル命令のシーケンス内でトランザクション消去命令を使用して、ベクトル化されるループの対応する反復に従ってベクトルのデータの価値が処理される毎に追跡データを消去することができる。
【００６６】
図６は、トランザクション開始事象に引き続いて、且つ、トランザクション終了事象の前にベクトル・ストア命令に遭遇した場合に実施されるハザード検出操作を示したものである。ステップ９０でこのような命令が検出されると、ステップ９２でハザード検出回路機構５０は、ベクトル・ストア命令の要素Ｋと以前のロード命令の要素Ｊの間に要素間アドレス・ハザードが存在しているかどうかを検出し、ＫはＪに等しくない。いくつかの事例では、ハザードは、ＫがＪ未満であるハザードに限定することができる。以前のロード及び後続するストアは、いずれも、処理回路機構４によって実行される命令の同じスレッド内であることに留意されたい。ステップ９２でアドレス・ハザードが検出されない場合、ステップ９３で通常通りストア操作が投機的に実行される。
【００６７】
ハザードが検出されると、ステップ９４でハザード検出回路機構５０は、トランザクション内の命令のそれ以上の処理を中止するように処理回路機構４をトリガし、トランザクション内の既に実行済みの命令によって生成された投機的結果がコミットされることを防止する。これは、メモリ・システム内に投機的にバッファされた書込みデータを破棄することによって実施することができる。また、既に捕獲済みのアーキテクチャ状態は、トランザクションを開始する前に動作していた状態にプロセッサを巻き戻すためにレジスタ１６、１８に回復される。したがって投機的に実行された命令の効果が逆転される。
【００６８】
トランザクションが中止されると、これは、例えば例外の使用を介してプロセッサ４に信号発信することができる。例外ハンドラーは、次に、順方向の前進を保証するべく必要なアクションを取ることができる。例えば順方向の前進がなされることを保証するために、スカラー・コードを使用して等価処理操作を再試行することができ、或いはベクトル長を短くすることができる（同じメモリ記憶位置へのアクセスは、ベクトルの１つの部分で書込みが実施され、一方、他の部分で読出しが実施されるようなものであり得るため、例えばＮ個の要素の代わりにＮ／２個のデータ要素のグループにおける必要な操作を処理することにより、要素間アドレス・ハザードの機会を少なくすることができる）。それにもかかわらずアドレス・ハザードはまれであるため、いくつかのトランザクションを時折り中止するコストは、ベクトル化されたコードとして処理されるべきスカラー・ループの複数の反復を可能にすることによって達成することができる性能改善と比較すると重大なものではない。
【００６９】
図７は、トランザクションの終了時におけるトランザクション終了事象に到達すると実施されるアクションを示したものである。ステップ１００で検出されたトランザクション終了事象に応答して、ステップ１０２でプロセッサ４は、トランザクションの開始以降に実行された命令のすべての投機的に生成された結果をコミットする。アーキテクチャ状態の既に捕獲済みのスナップショットは、破棄するか、或いは重ね書きを許容することができる。次に、すべてのバッファされたメモリ・ライトをキャッシュ２８、３０又はメモリ３２によって実際のメモリ記憶装置に書き込むことができる。ステップ１０４で、後続する命令が、ハザード追跡／検出機構５０、５２を使用することなく非投機的に実行される。
【００７０】
図８は、ロード命令によって使用されたアドレスを追跡するための追跡データの第１の実例を示したものである（上で示した実例６に対応している）。この実例では、ハザード追跡のための追跡入口は、対応するデータと共にＬ１データ・キャッシュ２８内に記憶される。個々のキャッシュ・ライン１１０は、キャッシュされたデータのアドレスの少なくとも一部を識別するキャッシュ・タグ１１２、対応するデータのコヒーレンス性状態（例えばデータが共有されているか、又は独自のものであるかどうか、或いはデータがきれいであるか、又は汚れているかどうか）を示すコヒーレンス性状態データ、及びキャッシュされたデータと結合した他の状態データ１１６（例えばトランザクション・メモリ・アドレス追跡目的のためのデータ）を含む。更に、個々のキャッシュ・ライン１１０は、トランザクションの開始以降に実行された以前のベクトル・ロード命令が対応するキャッシュ・ラインからのデータにアクセスした最も高いデータ要素位置を指定するエイリアス値１１８を記憶する。したがって所与のロードに遭遇すると、要素毎にアクセスされるデータを含むキャッシュ・ラインが更新され、そのキャッシュ・ラインに対するエイリアス・ビット１１９をセットし、その要素がエイリアス・ビット１１８によって既に示されている要素位置より高い場合、そのデータがアクセスされた要素を示す。後続するストア命令に遭遇すると、書込みが実施されている現在のデータ要素より高いデータ要素位置をエイリアス・ビットが示しているキャッシュ・ラインにデータが書き込まれる場合、ハザードが検出され、また、これは、トランザクションの中止をトリガすることができる。図８は、キャッシュ・ライン毎にエイリアス・ビットが提供される実例を示したものであるが、これは、ハザードのいくつかの偽りの断定的検出をもたらすことがあり、以前のロードが後続するストアと比較してキャッシュ・ラインの異なる部分に実際にアクセスした場合であってもハザードのフラグが立てられる。偽りの断定的ハザードの数は、例えばキャッシュ・ラインの異なる部分のための複数のエイリアス欄１１８を使用して、より細かい細分性でキャッシュ・ラインに注釈を付けることによって少なくすることができる。しかしながらエイリアス欄を記憶し、更新し、且つ、比較するための追加回路機構と、達成される性能改善の間にはトレード・オフが存在している。
【００７１】
図９は、ハザード追跡記憶装置５２のための別の実例を示したものである。エイリアス・ビットをキャッシュに追加する代わりに、ハザード検出論理をロード／ストア待ち行列、ストア・バッファ、等々の他の構造に追加することができ、或いは全く異なる構造を導入することも可能である。連続するベクトル・ロードに遭遇すると、この構造（又はバッファ）は、アクセスされた最大アドレス及び最小アドレス｛ＭａｘＡｄｄｒ、ＭｉｎＡｄｄｒ｝を記録することができ、また、後続するストアが到着すると、ストアの最も低いアドレス＊Ａが入口に対してチェックされる。条件（ＭｉｎＡｄｄｒ＜Ａ＜＝ＭａｘＡｄｄｒ）を維持している場合、衝突が検出され、中止がトリガされる。
【００７２】
図１０に示されているように、別のタイプのロードは、連続していない要素の各々に対するアドレスを使用することができる。これは、非連続（又はギャザー）ロードと呼ぶことができる。同様に、非連続ベクトル・ストア命令は、ベクトルのそれぞれの要素からのデータ値を非連続アドレスを有するメモリ記憶位置に記憶することができる。個々の要素に対するアドレスは、例えば入力要素の各々に対する異なるアドレス・オフセットを指定する第２のベクトル・オペランドＺ１から誘導することができる。非連続ロード／ストア命令の場合、図８に示されている手法は依然として機能するが、図９に対する代替として、図１１に示されている手法を使用することも可能であり、バッファは、最大／最小アドレスではなく、個々の要素に対して使用された実際のアドレスを記憶する。アドレスは、これらのアドレスがアクセスされたデータ要素位置との相応関係で記憶される（例えば図１１の実例では、追跡構造の列ｎのアドレスが以前のロードのデータ要素ｎからアクセスされた）。後続するストア命令に対して、ハザード・チェック回路機構５０は、次に、ストアによって使用されたアドレスのセットをバッファの内容に対してチェックし、ストアの所与の要素が以前のロードに対するより高い要素によって使用されたアドレスと同じアドレスにアクセスする衝突を識別することができる。
【００７３】
いくつかの事例では、プログラマ又はコンパイラは、入れ子型トランザクションを導入することができ、１つのトランザクションが開始した後、その第１のトランザクションが終了する前に別のトランザクション開始事象が検出される。いくつかのハードウェア実施態様は、このような入れ子型トランザクションをサポートしてアーキテクチャ状態の複数のスナップショットを維持することができ、したがって内部トランザクションが中止すると、その状態は、外部トランザクションの開始まで巻き戻すのではなく、その内部トランザクションの開始点へ回復されるにすぎない。しかしながら入れ子型トランザクションをサポートするために必要な追加回路オーバヘッドは必ずしも正当化され得ず、いくつかのより単純な実施態様は、内部トランザクションの中止が検出されると、プロセッサ状態を外部トランザクションの開始まで単純に巻き戻すことができる。したがっていくつかの実施態様は、入れ子型トランザクションを単一のより大きいトランザクションに有効にロールすることができる。
【００７４】
ハザード検出回路機構５０は、スカラー・ループを一連のベクトル命令中にベクトル化する人工産物として、実行の所与のスレッド中に導入されたレーン間アドレス・ハザードを検出する。他の機構を処理装置２内に予め提供することができる、プログラム実行の独立スレッド間のライト・アフタ・リード・ハザード又はライト・アフタ・ライト・ハザード等の他のタイプのアドレス・ハザードを検出する必要はない。例えばいくつかのシステムは、多重プロセッサ・システム内で実行されている処理の異なるスレッド間の衝突を管理するためハードウェア・トランザクション・メモリ・サポートを予め有することができる。処理の独立したスレッドが個別の実行ユニットを使用して並列に実施されている場合、１つの実行ユニットが所与のアドレスを読み出し、或いは書き込むことができ、その間に別の実行ユニットが同じアドレスに同じくアクセスしてハザードをもたらす危険が存在する。ハードウェア・トランザクション・メモリ技法は、このようなハザードを検出すると、衝突が存在しないことを仮定して投機的に進行する操作を許容し、次に、衝突が検出されると、トランザクションを中止して処理を実行の以前の時点に巻き戻すことにより、投機的処理を使用して性能を改善することができる。衝突することなく処理がトランザクションの終了に到達すると、投機的結果をコミットすることができる。本明細書において説明されている形態の依存性トランザクションは、異なる処理要素間の衝突を処理するためのトランザクション・メモリ・トランザクションを取り扱うために既に提供されている回路機構のうちの少なくともいくつかを使用してサポートすることができる。例えばアーキテクチャ状態のスナップショットを捕獲するための、或いはメモリ・システムへの書込みをバッファするための回路機構のうちのいくつかを再使用することができる。しかしながらトランザクション・メモリ技法とは異なり、要素間ハザードを検出するために使用されるハザード検出回路機構５０及びハザード追跡記憶装置５２は異なっていてもよく、また、検出されるハザードは、独立したスレッド間ではなく、通常はハザードの発生を誰も予期しないであろうプログラム実行の単一のスレッド内に存在してもよい。
【００７５】
本出願においては、「…ように構成された」という語は、定義された操作を実施することができる構成を装置の要素が有していることを意味するべく使用されている。この文脈においては、「構成」は、ハードウェア又はソフトウェアの配置又はこれらの相互接続の方法を意味している。例えば装置は、定義された操作を提供する専用ハードウェアを有することができ、或いはプロセッサ又は他の処理デバイスは、機能を実施するようにプログラムすることができる。「ように構成された」は、定義された操作を提供するために装置要素を何らかの方法で変更しなければならないことを暗に意味していない。
【００７６】
本発明の例証実施例について、本明細書において、添付の図面を参照して詳細に説明したが、本発明はこれらの厳密な実施例に制限されないこと、また、当業者は、添付の特許請求の範囲によって定義されている本発明の範囲及び精神を逸脱することなく、様々な変更及び修正をそれらに実施することができることを理解されたい。
【図１】
2019534504.tif 000012
【図２】
2019534504.tif 000013
【図３】
2019534504.tif 000014
【図４】
2019534504.tif 000015
【図５】
2019534504.tif 000016
【図６】
2019534504.tif 000017
【図７】
2019534504.tif 000018
【図８】
2019534504.tif 000019
【図９】
2019534504.tif 000020
【図１０】
2019534504.tif 000021
【図１１】
2019534504.tif 000022
【国際調査報告】
2019534504.tif 000023
2019534504.tif 000024