(57)【要約】第１のタイプのベクトルロード命令および第２のタイプのベクトルロード命令が提供される。第１のタイプについては、少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、応答アクションが遂行されるが、第１のアクティブなデータ要素以外のアクティブなデータ要素について例外条件が検出された場合は、応答アクションが抑制され、要素識別情報がストアされて、例外条件をもたらした要素を識別する。第２のタイプについては、応答アクションが抑制され、任意のアクティブなデータ要素に対して例外条件が生じた場合に要素識別情報がストアされる。この手法は、ループ投機およびループ展開を一緒に使用して、ベクトル化されたコードの性能を改善させるのに有用である。
2018534672.tif 000002
【特許請求の範囲】
【請求項１】
装置であって、
ベクトルロード命令に応答して、データストアから少なくとも１つのベクトルレジスタの複数の要素にデータをロードするようにロード演算を遂行するための処理回路を備え、
第１のタイプのベクトルロード命令に応答して、所定のシーケンスで前記少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行された前記ロード演算について例外条件が検出された場合、前記処理回路が応答アクションを遂行するように構成されており、前記所定のシーケンスで前記第１のアクティブなデータ要素以外のアクティブなデータ要素に対して遂行された前記ロード演算について前記例外条件が検出された場合、前記処理回路が、前記応答アクションを抑制し、前記例外条件が検出された前記アクティブなデータ要素を識別する要素識別情報をストアするように構成されており、
第２のタイプのベクトルロード命令に応答して、前記少なくとも１つのベクトルレジスタの任意のアクティブなデータ要素に対する前記ロード演算について前記例外条件が検出された場合、前記処理回路が、前記応答アクションを抑制し、前記例外条件が検出された前記アクティブなデータ要素を識別する前記要素識別情報をストアするように構成されており、
第１のタイプのベクトルロード命令および第２のタイプのベクトルロード命令は、それらの命令エンコーディングによって区別される、装置。
【請求項２】
前記第１のタイプのベクトルロード命令または前記第２のタイプのベクトルロード命令に応答して、前記ロード演算が少なくとも１つのアクティブなデータ要素に対して遂行されるべきか否かを決定するための関連条件が解決される前に、前記処理回路が前記少なくとも１つのベクトルレジスタの少なくとも１つのアクティブなデータ要素に対して前記ロード演算を遂行するように構成されている、請求項１に記載の装置。
【請求項３】
前記ベクトルロード命令が、前記少なくとも１つのベクトルレジスタのどのデータ要素がアクティブなデータ要素であるかを示すマスクを識別する、請求項１〜２のいずれか一項に記載の装置。
【請求項４】
前記処理回路が、少なくとも１つの別の命令に応答して、前記要素識別情報に基づいて、前記第１のタイプのベクトルロード命令を実行しようとする後続の試みのために新しいマスクおよび新しいアドレスのうちの少なくとも１つを生成する、請求項３に記載の装置。
【請求項５】
前記要素識別情報が、前記少なくとも１つのベクトルレジスタの前記データ要素のうちの１つに各々が対応する複数の表示を備える要素識別マスクを備え、前記例外条件が検出された前記アクティブなデータ要素および前記所定のシーケンスで任意の後続のアクティブなデータ要素に対応する表示が第１の値を有し、前記例外条件が検出された前記アクティブなデータ要素よりも早く前記所定のシーケンスで任意のデータ要素に対応する表示が第２の値を有する、請求項１〜４のいずれか一項に記載の装置。
【請求項６】
前記所定のシーケンスにおいて前記第１のアクティブなデータ要素が、前記少なくとも１つのベクトルレジスタの最下位のアクティブなデータ要素を含む、請求項１〜５のいずれか一項に記載の装置。
【請求項７】
前記ベクトルロード命令が、連続アドレスブロックを識別し、前記少なくとも１つのベクトルレジスタの各データ要素について、前記ロード演算が、前記連続アドレスブロックのそれぞれの部分に対応する前記データストア内のストレージロケーションからデータをそのデータ要素にロードすることを含む、請求項１〜６のいずれか一項に記載の装置。
【請求項８】
前記第２のタイプのベクトルロード命令が、ベースレジスタおよびイミディエートオフセット値を指定し、
前記第２のタイプのベクトルロード命令に応答して、前記処理回路が、前記ベースレジスタ内にストアされたベースアドレスを、前記イミディエートオフセット値と前記連続アドレスブロックのサイズに対応する乗数との積に加算した結果と同等な値を有する前記連続アドレスブロックの開始アドレスを決定するように構成されている、請求項７に記載の装置。
【請求項９】
前記第１のタイプのベクトルロード命令が、ベースレジスタおよびオフセットレジスタを指定し、
前記第１のタイプのベクトルロード命令に応答して、前記処理回路が、前記ベースレジスタ内にストアされたベースアドレスを、前記オフセットレジスタ内にストアされた値に基づいて決定されたオフセット値に加算した結果と同等な値を有する前記連続アドレスブロックの前記開始アドレスを形成するように構成されている、請求項７および８のいずれか一項に記載の装置。
【請求項１０】
前記第１のタイプのベクトルロード命令が所定のレジスタを前記オフセットレジスタとして指定するとき、前記処理回路が前記オフセット値をゼロとして決定するように構成されている、請求項９に記載の装置。
【請求項１１】
前記第１のタイプのベクトルロード命令および前記第２のタイプのベクトルロード命令の両方が、ベースレジスタおよびイミディエートオフセット値を指定し、
前記第１のタイプのベクトルロード命令または前記第２のタイプのベクトルロード命令に応答して、前記処理回路が、前記ベースレジスタ内にストアされたベースアドレスを、前記イミディエートオフセット値と前記連続アドレスブロックのサイズに対応する乗数との積に加算した結果と同等な値を有する、前記連続アドレスブロックの前記開始アドレスを決定するように構成され、
前記第１のタイプのベクトルロード命令については、前記イミディエートオフセット値がゼロであり、
前記第２のタイプのベクトルロード命令については、前記イミディエートオフセット値が非ゼロである、請求項７および８のいずれか一項に記載の装置。
【請求項１２】
前記例外条件が、アドレス変換フォールトまたはメモリ許可フォールトを含む、請求項１〜１１のいずれか一項に記載の装置。
【請求項１３】
前記応答アクションが、例外処理ルーチンの実行をトリガすることを含む、請求項１〜１２のいずれか一項に記載の装置。
【請求項１４】
データ処理方法であって、
ベクトルロード命令に応答して、データストアから少なくとも１つのベクトルレジスタの複数の要素にデータをロードするようにロード演算を遂行することと、
前記ベクトルロード命令が第１のタイプのものであり、所定のシーケンスで前記少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行された前記ロード演算について例外条件が検出された場合、応答アクションを遂行することと、
前記ベクトルロード命令が前記第１のタイプのものであり、前記所定のシーケンスで前記第１のアクティブなデータ要素以外のアクティブなデータ要素に対して遂行された前記ロード演算について前記例外条件が検出された場合、前記応答アクションを抑制し、前記例外条件が検出された前記アクティブなデータ要素を識別する要素識別情報をストアすることと、
前記ベクトルロード命令が第２のタイプのものであり、前記少なくとも１つのベクトルレジスタの任意のアクティブなデータ要素に対する前記ロード演算について前記例外条件が検出された場合、前記応答アクションを抑制し、前記例外条件が検出された前記アクティブなデータ要素を識別する前記要素識別情報をストアすることと、を含み、
前記第１のタイプのベクトルロード命令および前記第２のタイプのベクトルロード命令が、それらの命令エンコーディングによって区別される、データ処理方法。
【請求項１５】
装置であって、
ベクトルロード命令に応答して、データストアから少なくとも１つのベクトルレジスタの複数の要素にデータをロードするようにロード演算を遂行するための手段を含み、
第１のタイプのベクトルロード命令に応答して、所定のシーケンスで前記少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行された前記ロード演算について例外条件が検出された場合、前記遂行するための手段が、応答アクションを遂行するように構成されており、前記所定のシーケンスで前記第１のアクティブなデータ要素以外のアクティブなデータ要素に対して遂行された前記ロード演算について前記例外条件が検出された場合、前記遂行するための手段が、前記応答アクションを抑制し、前記例外条件が検出された前記アクティブなデータ要素を識別する要素識別情報をストアするように構成されており、
第２のタイプのベクトルロード命令に応答して、前記少なくとも１つのベクトルレジスタの任意のアクティブなデータ要素に対する前記ロード演算について前記例外条件が検出された場合、前記遂行するための手段が、前記応答アクションを抑制し、前記例外条件が検出された前記アクティブなデータ要素を識別する前記要素識別情報をストアするように構成されており、
前記第１のタイプのベクトルロード命令および前記第２のタイプのベクトルロード命令が、それらの命令エンコーディングによって区別される、装置。
【請求項１６】
請求項１〜１３のいずれか一項に記載の装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するためのコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、データ処理の分野に関する。より具体的には、データストアのストレージロケーションから少なくとも１つのベクトルレジスタの複数のデータ要素にデータをロードするためのベクトルロード命令に関する。
【背景技術】
【０００２】
いくつかのデータ処理装置は、ベクトルの各データ要素に対して所与の処理演算を遂行して、結果ベクトルの対応するデータ要素を生成し得るベクトル処理をサポートすることができる。これにより、所与の数のデータ値を処理するのに必要なプログラム命令の数を減らすために、いくつかの異なるデータ値を単一の命令で処理することが可能になる。ベクトル処理はまた、ＳＩＭＤ（単一命令、複数データ）処理と称されることがある。ベクトルロード命令を使用して、データストア内の対応するストレージロケーションから少なくとも１つのベクトルレジスタのそれぞれの要素にデータをロードすることができる。
【発明の概要】
【課題を解決するための手段】
【０００３】
少なくともいくつかの例は、装置であって、
ベクトルロード命令に応答して、データストアから少なくとも１つのベクトルレジスタの複数の要素へデータを転送するようにロード演算を遂行するための処理回路を備え、
第１のタイプのベクトルロード命令に応答して、所定のシーケンスで該少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、処理回路が、応答アクションを遂行するように構成されており、該所定のシーケンスで該第１のアクティブなデータ要素以外のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、処理回路が、該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアするように構成されており、
第２のタイプのベクトルロード命令に応答して、該少なくとも１つのベクトルレジスタの任意のアクティブなデータ要素に対するロード演算について該例外条件が検出された場合、処理回路が、該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアするように構成されており、
第１のタイプのベクトルロード命令および第２のタイプのベクトルロード命令が、それらの命令エンコーディングによって区別される、装置を提供する。
【０００４】
少なくともいくつかの例は、データ処理方法であって、
ベクトルロード命令に応答して、データストアから少なくとも１つのベクトルレジスタの複数の要素へデータを転送するようにロード演算を遂行することと、
ベクトルロード命令が第１のタイプのものであり、所定のシーケンスで該少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、応答アクションを遂行することと、
ベクトルロード命令が第１のタイプのものであり、該所定のシーケンスで該第１のアクティブなデータ要素以外のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアすることと、
ベクトルロード命令が第２のタイプのものであり、該少なくとも１つのベクトルレジスタの任意のアクティブなデータ要素に対するロード演算について例外条件が検出された場合、該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアすることと、を含み、
第１のタイプのベクトルロード命令および第２のタイプのベクトルロード命令が、それらの命令エンコーディングによって区別される、データ処理方法を提供する。
【０００５】
少なくともいくつかの例は、装置であって、
ベクトルロード命令に応答して、データストアから少なくとも１つのベクトルレジスタの複数の要素にデータをロードするようにロード演算を遂行するための手段を含み、
第１のタイプのベクトルロード命令に応答して、所定のシーケンスで該少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、遂行するための手段が、応答アクションを遂行するように構成されており、該所定のシーケンスで該第１のアクティブなデータ要素以外のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、遂行するための手段が、該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアするように構成されており、
第２のタイプのベクトルロード命令に応答して、該少なくとも１つのベクトルレジスタの任意のアクティブなデータ要素に対するロード演算について該例外条件が検出された場合、遂行するための手段が、該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアするように構成されており、
第１のタイプのベクトルロード命令および第２のタイプのベクトルロード命令が、それらの命令エンコーディングによって区別される、装置を提供する。
【０００６】
少なくともいくつかの例はまた、上記で説明される装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するためのコンピュータプログラムを提供する。コンピュータプログラムは、非一時的ストレージ媒体であり得るコンピュータ可読ストレージ媒体にストアすることができる。
【０００７】
少なくともいくつかの例は、ソースプログラムに基づいて、処理回路によって処理するための命令を生成するためのコンピュータ実装方法であって、本方法が、
ソースプログラム内で、複数の反復を含むソースループを検出することであって、各反復が、データストアから少なくとも１つのベクトルレジスタの複数のデータ要素にデータをロードするようにロード演算を遂行するための処理回路をトリガするための第１のタイプのベクトルロード命令を含み、第１のタイプのベクトルロード命令が、所定のシーケンスで該少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行されたロード演算について例外条件が処理回路によって検出された場合、処理回路が応答アクションを遂行し、該所定のシーケンスで該第１のアクティブなデータ要素以外のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、処理回路が該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアすることを示すエンコーディングを有する、検出することと、
ソースループを検出することに応答して、ソースループよりも少ない反復を含む展開されたループのための命令を生成することであって、展開されたループの各反復が、ソースループの少なくとも２つの反復に対応し、
該第１のタイプのベクトルロード命令、および
該少なくとも１つのベクトルレジスタの任意のアクティブなデータ要素に対して遂行されたロード演算についてのロード演算について例外条件が検出された場合、処理回路が該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアすることを示すエンコーディングを有する少なくとも１つの第２のタイプのベクトルロード命令を含む、生成することを含む、コンピュータ実装方法を提供する。
【０００８】
少なくともいくつかの例はまた、上記で説明される命令を生成するための方法を遂行するように構成されたデータ処理装置を提供する。
【０００９】
コンピュータプログラムは、上記で説明される命令を生成する方法を遂行するようにコンピュータを制御するための命令を備えるように提供することができる。コンピュータプログラムは、非一時的ストレージ媒体であり得るコンピュータ可読ストレージ媒体にストアすることができる。
【００１０】
本技術のさらなる態様、特徴、および利点は、添付の図面と併せて読まれるべき例の以下の説明から明らかになるであろう。
【図面の簡単な説明】
【００１１】
【図１】ベクトルデータ転送命令をサポートするデータ処理装置の一例を概略的に説明する。
【図２】少なくとも１つのベクトルレジスタの複数のデータ要素と連続アドレスブロックに対応するデータストアのストレージロケーションとの間でデータ転送を遂行する一例を示す。
【図３】所与のサイズのデータ要素を異なるサイズのアドレスブロックにマッピングする３つの例を示す。
【図４】ベースレジスタを使用してアクセスされるアドレスブロックの開始アドレスと、アドレスブロックのサイズの倍数として指定されたイミディエートオフセット値とを識別するベクトルデータ転送命令の一例を示す。
【図５】ベクトルデータ転送命令を処理する方法を示す。
【図６】ベクトルデータ転送命令を使用して処理回路によって処理される命令を生成するための方法を示す。
【図７】第１のタイプのベクトルロード命令に対する例外条件の処理を説明する。
【図８】第１のタイプのベクトルロード命令に対する例外条件の処理を説明する。
【図９】第２のタイプのベクトルロード命令に対する例外条件の処理を説明する。
【図１０】第１のタイプのベクトルロード命令と第２のタイプのベクトルロード命令とを区別する２つの例を示す。
【図１１】第１のタイプのベクトルロード命令と第２のタイプのベクトルロード命令とを区別する２つの例を示す。
【図１２】どのデータ要素が命令シーケンスに対して例外条件をトリガしたかを識別する累積フォールト情報を記録するためのフォールトレジスタの使用を示す。
【図１３】フォールトが検出されたベクトルロード命令を実行しようとする繰り返しの試みを制御するためにフォールト情報を使用するための２つの異なる技術を示す。
【図１４】ベクトルロード命令に対する例外条件を処理する方法を示す。
【図１５】第１のタイプのロード命令および第２のタイプのロード命令を使用して処理回路によって処理するための命令を生成する方法を説明する。
【図１６】仮想マシンの実装例を説明する。
【発明を実施するための形態】
【００１２】
いくつかの具体的な例をここで説明する。本発明はこれらの特定の例に限定されないことが理解されるであろう。
【００１３】
図１は、システムであって、その中で、説明される実施形態の技術を用いることができる、システムのブロック図である。図１に示される例では、システムは、パイプライン型プロセッサの形態をとる。命令は、フェッチ回路１０によって、（通常は、レベル２キャッシュ５０などの１以上のさらなるレベルのキャッシュを介してメモリ５５に連結される）命令キャッシュ１５からフェッチされ、そこから、命令によって必要とされる演算を遂行するようにパイプライン型プロセッサ内の下流の実行ソースを制御するための適切な制御信号を生成するために各命令をデコードするデコード回路２０を通って渡される。デコードされた命令を形成する制御信号は、パイプライン型プロセッサ内の１つ以上の実行パイプライン３０、３５、４０、８０に発行するための発行ステージ回路２５に渡される。実行パイプライン３０、３５、４０、８０は、集合的に、処理回路を形成すると見なすことができる。
【００１４】
発行ステージ回路２５は、演算によって必要とされるデータ値がストアされ得るレジスタ６０に対するアクセスを有する。具体的には、ベクトル演算のためのソースオペランドをベクトルレジスタ６５内にストアすることができ、スカラ演算のためのソースオペランドをスカラレジスタ７５内にストアすることができる。加えて、１つ以上の述語（マスク）を、特定のベクトル演算を遂行するときに処理されるベクトルオペランドのデータ要素のための制御情報として使用するために、述語レジスタ７０内にストアすることができる。スカラレジスタの１つ以上を使用して、（例えば、ベクトルロード／ストア命令がスカラレジスタを以下で論じられるベースレジスタとして指定することができる）特定のベクトル演算の遂行中に使用するために、かかる制御情報を導出するように使用されるデータ値をストアすることもできる。
【００１５】
レジスタ１６はまた、処理パイプラインの演算を制御するための構成情報、または処理中に生じる条件もしくは命令の結果の特性を示すステータス情報などの種々の制御情報を提供するためのいくつかの制御レジスタ７６を含むことができる。例えば、制御レジスタ７６は、以下でより詳細に説明される第１のフォールトレジスタ（ＦＦＲ）７８およびベクトルサイズレジスタ（ＶＳ）７９を含むことができる。
【００１６】
ソースオペランドおよび任意の関連付けられた制御情報を、それらが各デコードされた命令を実装するように遂行される演算（複数可）を識別する制御信号と共に適切な実行ユニットにディスパッチされ得るように、パス４７を介して発行ステージ回路２５に送ることができる。図１に示される種々の実行ユニット３０、３５、４０、８０は、ベクトルオペランドで演算するためのベクトル処理ユニットであると想定されるが、必要に応じて、装置によってサポートされる任意のスカラ演算を処理するために、別個の実行ユニット（図示せず）を提供することができる。
【００１７】
種々のベクトル演算を考慮に入れると、算術演算または論理演算をそれらのソースオペランドで遂行することを可能にするために、算術演算を、例えば、必要なソースオペランド（および述語などの任意の制御情報）と共に算術論理ユニット（ＡＬＵ）３０に転送することができ、結果値は、通常、ベクトルレジスタバンク６５の指定されたレジスタ内にストアするためのデスティネーションオペランドとして出力される。
【００１８】
ＡＬＵ３０に加えて、浮動小数点ユニット（ＦＰＵ）３５を、デコードされた浮動小数点命令に応答して浮動小数点演算を遂行するために提供することができ、ベクトル置換ユニット８０を、ベクトルオペランドで特定の置換演算を遂行するために提供することができる。加えて、ロード／ストアユニット（ＬＳＵ）４０が、レジスタセット６０内の指定されたレジスタに（データキャッシュ４５およびレベル２キャッシュ５０などの任意の介在するさらなるレベルのキャッシュを介して）メモリ５５からデータ値をロードするためにロード演算を遂行するため、およびこれらのレジスタからのデータ値をメモリ５５内にストアし直すためにストア演算を遂行するために使用される。図１に示されていない他のタイプの実行ユニットも提供され得ることが理解されるであろう。
【００１９】
図１に示されるシステムは、命令シーケンスがプログラム順で実行されるインオーダ処理システムであってもよいし、または代替的に、アウトオブオーダシステムであってもよく、性能を改善する目的で、種々の命令が実行される順番を並べ替えることができる。当業者には理解されるように、アウトオブオーダシステムでは、（図１には明示されていない）追加の構造、例えば、命令によって指定されたアーキテクチャレジスタをレジスタバンク４５内の物理レジスタのプール（物理レジスタのプールは通常、アーキテクチャレジスタ数よりも多い）からの物理レジスタにマッピングするためのレジスタリネーミング回路を提供することができ、それに従って、特定の危険を除去することができ、アウトオブオーダ処理のさらなる使用を容易にする。加えて、アウトオブオーダ実行の経過を追い、種々の命令の実行の結果を順序にコミットさせるように、リオーダバッファを通常提供することができる。
【００２０】
説明される実施形態では、図１の回路は、ベクトルオペランドが複数のデータ要素を含むベクトルレジスタ６５内にストアされたベクトルオペランドでベクトル演算を実行するように配置されている。かかるベクトルオペランドで遂行される特定のベクトル演算（算術演算など）については、必要な演算をベクトルオペランド内の種々のデータ要素に並列に（または反復して）適用することができる。述語情報（マスクとしても知られる）を使用して、ベクトル内のどのデータ要素が特定のベクトル演算のためのアクティブなデータ要素であるか、およびしたがって演算が適用されるべきデータ要素であるかを識別することができる。
【００２１】
ベクトル処理は、処理すべき大量のデータがあり、アレイの各メンバに同じ演算セットを適用する必要がある場合に特に有用である場合がある。完全なスカラ手法では、命令シーケンスは、データキャッシュ４５またはメモリ５５からアレイの各要素をロードし、その要素を処理し、次いで、その結果をメモリにストアし直す必要があるはずであり、そのシーケンスは、アレイのあらゆる要素に対して繰り返される。ベクトル処理とは対照的に、単一の命令は、アレイの複数の要素を１つ以上のベクトルレジスタ６５のいくつかのデータ要素にロードすることができ、次いで、ベクトルレジスタ内のこれらの要素の各々を、結果が次いでデータストアにストアし直される前に、共通の命令セットによって処理することができる。これは、（好ましくは、少なくともいくつかの要素が並列処理される）単一の命令シーケンスに応答して複数の要素を処理し、フェッチ、発行、および実行される命令の数を減らすことによって性能を改善させることができる。
【００２２】
したがって、図２に示されるように、ベクトル処理システムは、連続アドレスブロック１００および少なくとも１つのベクトルレジスタ６５の複数のデータ要素に対応するデータストア内のストレージロケーション間でデータを転送するためのベクトルロードまたはストア命令（本明細においては集合的にベクトルデータ転送命令と称する）をサポートすることができる。ロード命令については、少なくとも１つのベクトルレジスタ６５の各アクティブな要素１０２には、連続アドレスブロック１００の対応する部分１０４から読み取られたデータがロードされる。ストア命令については、所与のアクティブなデータ要素１０２からのデータが、連続ブロック１００の対応する部分１０４に対応するストレージロケーションにストアされる。
【００２３】
所与のベクトルデータ転送命令に応答してアクセスされるアドレスブロック１００は、ある特定のサイズＳＢを有する。ブロックサイズＳＢは、ＮＲ×ＮＥ×ＳＳであり、式中、
・  ＮＲは、命令の対象となるレジスタ数であり、
・  ＮＥは、各レジスタ内のデータ要素数であり、
・  ＳＳは、レジスタ６５の単一のデータ要素１０２に対応するアドレスブロックの細分部分１０４のうちの１つによって表されるアドレスユニットサイズである。
【００２４】
パラメータＮＲ、ＮＥ、ＳＳの各々は、
・  所与のプロセッサのためのハードワイヤされた固定値（例えば、いくつかのプロセッサは単に単一のベクトルレジスタを対象とするロード／ストア命令をサポートし得る）、
・  制御レジスタ７６のうちの１つに（別の変数への依存を介して明示的または暗示的に）指定された変数値、または
・  ベクトルデータ転送命令のエンコーディングで（別の変数への依存を介して明示的または暗示的に）指定された変数値のいずれかであり得る。例えば、オペコードまたは命令エンコーディングの別のフィールドのいずれかは、ＮＲ、ＮＥ、および／またはＳＳに対してどの値が使用されるべきかを識別することができる。
【００２５】
したがって、異なる命令セットアーキテクチャは、これらのパラメータを表す異なる方法を選択することができる。
【００２６】
例えば、図１に示されるように、ベクトルサイズレジスタ７９は、１つのベクトルレジスタ６５内の総ビット数に対応するベクトルサイズＶＳを識別するように提供することができ、命令エンコーディングは、現在の演算のために使用されるデータ要素サイズＥＳ（すなわち、１つのデータ要素内のビット数またはバイト数）を識別することができる。可変制御レジスタ内でベクトルサイズＶＳを識別することは、同じコードを、異なるベクトルサイズを使用して実装され得る広範囲のプラットフォームで実行させるのに有用である。処理回路がＮＥ＝ＶＳ／ＥＳを決定し得るため、レジスタごとのデータ要素数ＮＥを、データ要素サイズＥＳの指定を通じて命令によって暗示的に識別することができる。この場合、連続アドレスブロックのサイズＳＢは、ＳＢ＝ＮＲ×ＶＳ／ＥＳ×ＳＳとして表すこともできる。
【００２７】
ＳＢ、ＶＳ、ＥＳ、およびＳＳは、所与の長さの特定のユニット、例えば、ビット数もしくはバイト数、またはビット数もしくはバイト数の倍数、あるいは他の何らかのデータユニットで表すことができることに留意されたい。以下の例のようにＳＢがバイトで表される場合、ＳＳもバイトで表されるべきであるが、ＶＳおよびＥＳは、それらが同じである限り、他のユニット（例えば、ビット、バイト）であってもよい。概ね、ＳＢおよびＳＳは同じユニットであるべきであり、ＶＳおよびＥＳは同じユニットであるべきであるが、ＳＢおよびＳＳはＶＳおよびＥＳとは異なるユニットであってもよい。
【００２８】
一方、レジスタ数ＮＲは、命令エンコーディングから決定されてもよい。例えば、オペコードは、これが、例えば、シングルレジスタ、ダブルレジスタ、またはトリプルレジスタのロード／ストアであるか否かを指定してもよいし、または命令がレジスタ数ＮＲを指定するフィールドを含んでもよい。
【００２９】
また、ストレージユニットサイズＳＳは、命令エンコーディングから識別することもできる（この場合もまた、異なるオペコードは、異なるストレージユニットサイズＳＳにマッピングしてもよいし、またはＳＳを識別するエンコーディングのフィールドであってもよい）。図３は、なぜストレージユニットサイズＳＳがデータ要素サイズＥＳとは異なる場合があるのかの一例を示す。図３のＡ）の部分に示されるように、いくつかの命令は、ＳＳ＝ＥＳ＝３２ビット＝４バイトであるように、所与のデータ要素サイズ（例えば、ＥＳ＝３２ビット＝４バイト）のデータ要素をデータストアからの対応するデータ量で満たすことができる。しかしながら、図３のＢ）の部分およびＣ）の部分に示されるように、いくつかのプロセッサは、データストアからのより少ないデータ量を、より大きなデータ要素へまたは該データ要素から転送することを可能にすることもできる。例えば、図３のＢ）の部分およびＣ）の部分は、ストレージユニットサイズＳＳがそれぞれ２バイトおよび１バイトである例を示す。かかるベクトルロードでは、サイズＳＳのメモリのユニットからのデータは、サイズＥＳの１つのデータ要素を満たすように符号拡張されるか、またはゼロ拡張されるかのいずれかである。同様に、ストア命令については、データをデータストアにストアするときに、データ要素からの４バイトの値を２バイトまたは１バイトに切り捨てることができる。
【００３０】
一方、他のシステムは、メモリへのロードまたはストア時にデータの拡張または切り捨てをサポートしないことがあり、この場合、ＳＳはデータ要素サイズＥＳに等しい固定値であり得、この場合、ＳＢは単にＮＲ×ＶＳに等しく、ＳＳを命令または制御レジスタに指定する必要はないはずである。
【００３１】
ブロックサイズＳＢは、ＮＲ×ＮＥ×ＳＳと同等であるが、必ずしもこれらのパラメータを乗算することによって決定される必要はないことに留意されたい。上記で示されるように、これらのパラメータのうちの１つ以上は固定されてもよいし、または別の関連するパラメータに基づいて決定されてもよいため、同等の結果を生成する他の方法があってもよい。また、要素の数ＮＥ、ストレージユニットサイズＳＳ、およびベクトルサイズＶＳまたはデータ要素サイズＥＳなどの任意の他の関連パラメータが概ね２の累乗である場合、値を乗算するのではなく、シフト演算を使用して同等の結果を生成することができる。
【００３２】
このタイプの連続ベクトルロード／ストア命令を使用して、データストアからデータブロックＳＢを繰り返しロードし、それを一連のベクトルデータ処理命令（例えば、ベクトル加算、ベクトル乗算など）を使用して何らかの方法で処理し、次いで、その結果ベクトルを、後続の反復のためにブロック１００の開始アドレスをブロックサイズＳＢに対応する量だけインクリメントする前に、メモリにストアし直すプログラムループを形成することができる。したがって、多くの場合、ベクトル化されたコードは、以下に示される形式のループを含むことができる。
【００３３】
【数１】
2018534672.tif 000003
【００３４】
この単純な例では、反復ごとの単一のベクトルロードのみを示すが、実際には、各反復でロードされるいくつかの異なるベクトルが存在し、これらのベクトルを後続のデータ処理で結合させることがあることに留意されたい。
【００３５】
しかしながら、かかるループを提供することは、ループ周りのプログラムフローを制御するための命令を実行する際の性能コストを招く。ロード／ストア命令および実際のデータ処理命令に加えて、ループが何回実行されたかを表すポインタまたはループカウンタ（例えば、上記の［ｘ０］）をインクリメント／デクリメントするための命令、ポインタまたはカウンタを限定値と比較してループをいつ終了させるかを決定するための命令、および終了条件が依然満たされていない場合にループの開始に戻って分岐するための条件分岐命令などのループを管理するためのいくつかの追加の命令も必要とすることになる。これらの命令は、ループの各反復で実行されなければならないはずであり、これは、特に、実際のデータ処理のベクトル命令の数と比較してループ制御命令の数が多い場合、性能を抑制する。
【００３６】
ループ制御のコストを減らすために、ループ展開を遂行して、ソースコード内の所与のプログラムループを、より少ない反復を有する展開されたループに置き換えることが可能である。展開されたループの各反復は、元のソースループの複数の反復処理を効果的に実行するように、より多くの命令を有することができる。例えば、展開されたループの各反復が、メモリ内の４つの異なるデータブロックに対応するデータを処理するためのロード命令、データ処理命令、およびストア命令の４つのシーケンスを含む場合、ループ制御オーバヘッドを３／４まで減らすことができる。かかる展開されたループの一例を以下に示す。
【００３７】
【数２】
2018534672.tif 000004
【００３８】
ループの個々の反復はより長いが、制御命令（例えば、ｉｎｃｂ、ｃｍｐ、ｂｇｅ）をより少ない頻度で実行することにより、全体の性能を改善することができる。ループ展開はまた、ループ制御オーバヘッドを減らすだけでなく、プロセッサリソースのより良好な利用を可能にすることができるソフトウェアパイプライニングまたはモジュロスケジューリングなどの他の最適化技術を有効にすることによって性能を改善することができる。例えば、展開されたループの一反復内の別個のベクトル命令のうちの２つ以上は、（例えば、より大きなベクトルサイズを使用することによって）少なくとも部分的に並列に処理することができるかもしれないが、元のソースループでは、１つの命令のみが同時に出くわすため、かかる改善は利用可能ではないはずである。場合によっては、ループ展開は、例えば、ソースコードをプロセッサハードウェアによって実行される実行可能コードにコンパイルするコンパイラによって、ソフトウェアで遂行することができる。しかしながら、ループ展開を、例えば、ループを検出して、それらを展開されたループと置き換えることができるパイプラインのより早いステージまでハードウェアで遂行することも可能である。
【００３９】
しかしながら、レジスタ値のみを使用して転送の開始アドレスを指定する連続ベクトルデータ転送命令は、いくつかの理由でループ展開をうまくサポートしない。連続ベクトルデータ転送命令は、ベースアドレスを指定するスカラベースレジスタおよびベースレジスタに加算されるインデックス値を指定するスカラインデックスレジスタを使用して、アクセスされるアドレスのブロック１００の開始アドレス＃Ａを指定して、開始アドレス＃Ａを形成する。しかしながら、この手法は、展開されたループ内の各それぞれのベクトルデータ転送命令によって使用されるすべてのインデックスレジスタを初期化するようにループが遂行される前に追加のオーバヘッドを必要とするため、ループ展開に関する欠点を有し、また、各インデックスレジスタをインクリメントするために、ループ内に追加の命令が必要とされることがある。また、追加のインデックスレジスタの使用は、より多くのレジスタ数をループの各反復で参照する必要があるため、スカラレジスタファイルへの負担が増加する。これは、ループの一反復内で必要とされるすべての値に適応するのに十分なスカラレジスタがない場合、いくつかのレジスタからのデータがメモリまたはキャッシュにストアされる（例えば、スタックにプッシュされる）ことを必要とする場合があり、このスタック上のレジスタの溢れおよび充填は、性能を損なう可能性があるため望ましくない。
【００４０】
代わりに、図４に示されるように、ベースレジスタ１２０およびイミディエートオフセット値１２２を使用して、連続アドレスブロック１００の開始アドレス＃Ａを識別するベクトルデータ転送命令が提供される。イミディエート値は、レジスタへの参照ではなく、命令エンコーディングで直接指定される値である。ベースレジスタ１２０およびイミディエートオフセット１２２に加えて、命令エンコーディングはまた、遂行される演算のタイプを識別するオペコード１２４、１つ以上の対象レジスタ１２６の表示、およびベクトル演算を制御するための述語値をストアする述語レジスタ１２８の表示を含むことができる。
【００４１】
ベースレジスタ１２０およびイミディエートオフセット１２２を使用して対象アドレスを指定する連続ベクトルデータ転送命令が有用であろうことは意外であるように思われるかもしれない。イミディエート値を使用して、インデックスレジスタではなく、オフセットを指定することは、展開されたループ内でインデックスレジスタを初期化およびインクリメントするコスト、ならびにより多くのレジスタの使用に伴うレジスタの負担の増加を回避するが、実際には、ベクトルプロセッサのベクトルサイズは非常に長い（例えば、２５６バイト）可能性があり、各命令のブロックサイズＳＢは比較的大きい場合がある。元のループの４つまたは８つの反復が展開されたループの単一の反復に展開される場合、ループの最後のデータ転送に必要なオフセットが大きい可能性があり、これを命令エンコーディング内のイミディエートオフセットで表すためにかなりのビット数を必要とすることがある。実際には、オペコード、対象レジスタ、述語値、ベースレジスタ、および所与の命令によって必要とされ得る任意の他のパラメータを指定するために命令エンコーディングの大部分のビットが既に必要であるため、多くのベクトル命令セットアーキテクチャは利用可能なエンコーディング空間が限定されており、その結果、単に大きなイミディエートオフセットのための十分な余地がないことがある。命令エンコーディングのビット数を増加させることもまた、処理パイプライン内で命令を転送するためのバスのサイズを増加させ、電力消費および回路面積の点で高価すぎるかもしれない所与のプログラムをストアするために必要なメモリ空間量を増加させることになるため、選択肢ではないかもしれない。イミディエートオフセット値を使用する際の別の問題は、上記で論じられるように、異なるハードウェアの実装例が異なるベクトルサイズを使用してもよいし、またはベクトルサイズが単一の実装例内で可変であってもよいため、展開されたループ内の連続したデータ転送命令の開始アドレス間の差は、展開されたループが生成されている時点では既知ではない場合があり、その結果、コンパイラ（またはループ展開を遂行する他のソフトウェアもしくはハードウェア）が、所与の命令に対してどのようなオフセットを指定すべきかを知ることができないかもしれないことである。これらの理由から、ベースレジスタおよび単純なイミディエートバイトオフセットを使用して所与の命令の開始アドレスを指定することは、実行可能な選択肢であるとは思われないであろう。
【００４２】
しかしながら、図４に示されるベクトルデータ転送命令では、イミディエートオフセットは、絶対値ではなく、ロードされる連続アドレスブロックのブロックサイズＳＢの倍数として指定される。ロード／ストアユニット４０は、スカラベースレジスタＸｂ内にストアされたベースアドレスを、イミディエートオフセット値ｉｍｍとブロックサイズＳＢとの積に加算した結果と同等な値を有する開始アドレス＃Ａを生成するアドレス生成ユニットを含み得る。ブロックサイズＳＢは、図２について上記で論じられるように、ＮＲ×ＮＥ×ＳＥと同等であると決定することができる。イミディエート値ｉｍｍとブロックサイズＳＢとの積は、異なる方法で決定することができる。いくつかの実装例では、実際に、イミディエート値ｉｍｍにブロックサイズＳＢを乗算することができるが、ブロックサイズＳＢが２の累乗である場合、別の選択肢は、イミディエート値をログ２（ＳＢ）に対応するビット数だけ左シフトすることである。次いで、積をベースアドレスに加算して、開始アドレス＃Ａを生成することができる。
【００４３】
図５は、連続ベクトルデータ転送命令を処理する方法を示す。ステップ１３０では、命令がベースレジスタおよびイミディエートオフセットを指定する連続ベクトルデータ転送命令であるか否かが決定される。そうでない場合、命令は別の方法で処理される。命令がベースレジスタおよびイミディエートオフセットを指定する連続ベクトルデータ転送命令である場合、ステップ１３２において、ロード／ストアユニット４０は、ベースアドレス＃ｂａｓｅを積ｉｍｍ×ＳＢに加算した結果と同等な値を有する開始アドレス＃Ａを計算する。開始アドレス＃Ａは、＃ｂａｓｅ＋ｉｍｍｘＳＢと同等の結果を与えるが、実際にはこのように計算される必要はない（例えば、上記で論じられるように代わりにシフトを使用して乗算を実装することができる）任意の方法で決定することができることに留意されたい。ステップ１３４では、ロード／ストアユニットは、一連のデータ転送をトリガし、各データ要素は、アドレス＃Ａで開始するアドレスの連続ブロック１００のそれぞれの部分に対応し、データ転  送は、所与のデータ要素とアドレスブロック１００の対応する部分１０４との間で、そのデータ要素が述語レジスタ１２８内の述語によってアクティブなデータ要素として示されるときに遂行される。例えば、対象レジスタの最下位の要素はアドレス＃Ａでデータにマッピングされ得、次の要素はアドレス＃Ａ＋ＳＳでデータにマッピングされ得、以下同様に、１つ以上の対象レジスタ６５の第ｎの要素はアドレス＃Ａ＋ｎ＊ＳＳに対応する。
【００４４】
この手法は、イミディエートオフセットをブロックサイズＳＢの倍数として指定することによって、プログラムコードの書き込み時またはコードのコンパイル時にベクトルサイズＶＳを知る必要がないため、上記で論じられる問題に対処する。これにより、同じ命令を、異なるベクトルサイズを有する広範囲のハードウェアの実装例で実行させる。また、実際には、イミディエートオフセットを指定する連続ベクトルロード／ストア命令はループ展開についてのみ有用であり、レジスタの負担は展開されたループの単一の反復に展開することができる元のソースループの反復数を限定する傾向があるため、実際には、イミディエートオフセット１２２を非常に小さくすることができる。例えば、多くのシステムでは、元のループの９つ以上の反復を、展開されたループの単一の反復に展開することは普通でない可能性があるため、値０〜７の範囲の正の値を表す３ビットの符号なしイミディエート値で十分である場合がある。これは、命令セットアーキテクチャがエンコーディング空間を限定している場合であっても、非常に小さいイミディエートオフセット１２２が命令セットのエンコーディング内に依然収まり得ることを意味する。
【００４５】
図４は命令の所与のビットパターンを使用する命令のエンコーディングを示すが、アセンブラ構文では、命令を以下のように表すことができる。
【００４６】
【数３】
2018534672.tif 000005
式中、上記のすべての例では、イミディエートは、４ビットのバイナリ値０ｂ０００１としてエンコードされるが、メモリからロードされているレジスタ数の倍数としてシンタックスで表される。ニーモニックＬＤ１Ｈ、ＬＤ２Ｈ、ＬＤ３Ｈは、ロードされているレジスタ数を参照する（すなわち、ＮＲは、それぞれ１、２、および３である）。代替的に、アセンブラ構文を、上記で示される３つの事例すべてに対して、イミディエート値（ｉｍｍｅｄｉａｔｅｌｙ  ｖａｌｕｅ）を＃１として定義することができる。
【００４７】
この形式の命令をループ展開のために使用する一例を以下に示す。
【００４８】
【数４】
2018534672.tif 000006
【００４９】
この例では、展開されたループの第１のベクトルロード命令は、０のイミディエートオフセットを有し、連続したさらなるロードは、１、２、３などのイミディエートオフセットを指定して、各ロードがブロックサイズＳＢのそのユニット数によって置き換えられたアドレスブロックからデータをそれぞれロードすることを示す。
【００５０】
しかしながら、実際には、展開されたループの第１のロードのために０オフセットを指定する必要はない。ソフトウェアパイプライニング技術は、ループの開始または終了以外のループ内の位置でループポインタをインクリメントすることが望ましい場合があり、この場合、ベースレジスタの参照点は、展開されたループの中間ロード命令（ｉｎｔｅｒｍｅｄｉａｔｅ  ｌｏａｄ  ｉｎｓｔｒｕｃｔｉｏｎ）のうちの１つのアドレスであり得る。これにより、負のオフセットが指定されるように有用なものにすることができる。したがって、イミディエートオフセット値１２２は、所与のビット数を有する２の補数形式でエンコードされ得る符号付き整数値として指定することができる。例えば、４ビットは、−８〜＋７の範囲内の２の補数値をエンコードすることができる。例えば、ループのインクリメントが最初の２回のロードの後、但し、最後の２回のロードの前に遂行される場合、オフセットは以下のように定義することができる。
【００５１】
【数５】
2018534672.tif 000007
【００５２】
図６は、ループ展開を遂行する方法を示す。この方法は、所与のソースプログラムに応答して処理回路によって処理するための命令を生成する任意のソフトウェアまたはハードウェアによって遂行することができる。例えば、この方法は、ソースプログラムをとり、実行されるコンパイルされたコードを生成するコンパイラによって遂行され得るか、または本方法は、実際に命令を実行する同じ処理パイプライン内の回路によってその場で遂行され得る。概ね、ループ展開を遂行するハードウェアまたはソフトウェアは、ループ展開手段と称される。
【００５３】
ステップ１４０では、ソースプログラムの命令が受信される。ステップ１４２では、ソースプログラムがいくつかの反復を有するソースループを含むか否かが検出され、各反復ｉは、連続アドレスブロックサイズＳＢを対象とし、開始アドレスＡ［ｉ］を有するベクトルデータ転送命令を含む。かかるループをソースプログラムが含まない場合、方法は終了し、ソースプログラムが別の方法で処理される。しかしながら、かかるソースループをソースプログラムが含む場合には、ステップ１４４において、ループ展開手段がソースループよりも少ない反復を有する展開されたループのための命令を生成し、展開されたループの各反復は、ソースループのＮ個の反復に対応し、ベースレジスタおよびゼロオフセットを使用して開始アドレスを指定する少なくとも１つの参照ベクトルデータ転送命令、ならびにベースレジスタおよびブロックサイズＳＢの倍数として指定されたイミディエート値を使用して開始アドレスを指定する少なくとも１つの別のベクトルロードまたはストア命令を含む。展開されたループの各反復はまた、Ｎ×ＳＢに対応する量だけベースレジスタをインクリメントするためのインクリメント命令を含み得る。ベースレジスタがループ内でインクリメントされるタイミングに依存して、参照命令は、ループの他のベクトルデータ転送命令より早くても、遅くても、または途中までであってもよい。参照ベクトルデータ転送のためのゼロオフセットは、上記で論じられるのと同じ方法でイミディエートオフセットを使用するか、または以下で論じられるようなレジスタ参照を使用するかのいずれかで指定することができる。
【００５４】
ステップ１４６では、生成された命令が処理回路による処理のために出力される。例えば、命令は、処理回路による処理のためにメモリ５５に次いでストアされ得るコンパイルされたプログラムとして出力することができる。代替的に、展開がパイプライン内でその場で遂行されている場合、出力命令は処理用に後続のステージに送られる。
【００５５】
イミディエートオフセットフィールド１２２の特定のサイズは、使用されている特定の命令セットアーキテクチャに依存してもよい。実際には、ベクトルレジスタ６０、スカラレジスタ７５、または述語レジスタ７０の数は、展開されたループの単一の反復に展開され得るソースループの反復数に有効な限定を設けることができるため、この限定より大きい任意の値に適応するイミディエートオフセットフィールド１２２を提供することは有用ではないかもしれない。例えば、ソースループの各反復が最大のＲスカラレジスタを使用し、アーキテクチャがＭスカラレジスタを定義すると予想される場合、実際には、単一の反復に展開され得るソースループの最大反復数はＭ／Ｒであることになるため、イミディエートオフセットフィールド１２２のサイズは、表現可能な最大値がＭ／Ｒ−１であるように選択することができる。負のオフセットおよび正のオフセットの両方を定義することができるように、追加のビットを符号付きの値に適応するように割り当てることもできる。例えば、多くの場合、Ｒは２または４であり得るため、Ｍ／２−１またはＭ／４−１のオフセット値をエンコーディングするのに十分なビット空間を提供すれば十分であることがある。例えば、Ｍ＝３２である場合、多くの場合、９つ以上の反復を展開することはまれであるかもしれないため、３ビットの符号なしオフセットフィールドまたは４ビットの符号付きフィールドは、イミディエートオフセットを有するベクトルデータ転送命令が使用される可能性のある最も実用的な状況に適応するのに十分であり得る。一方、スカラレジスタよりも少ない述語レジスタ７０が存在する場合には、展開されたループの単一の反復に実際には展開され得るループの反復数の限定要因である述語レジスタ数であってもよい。したがって、概ね、展開の量を限定するいくつかの制約が存在してもよく、イミディエートオフセットフィールド１２２のサイズが所与の実装例に対して生じる制約に基づいて選択されてもよい。
【００５６】
要約すると、ベースレジスタおよびイミディエートオフセット値を使用して連続アドレスブロックの開始アドレスを識別するベクトルデータ転送命令は、驚くべきことに、比較的長いベクトルまたは可変長のベクトルを有するシステム内においてさえ有用である。イミディエートオフセット値は、ハードウェアによって使用されるベクトルの長さに応じて可変に選択され得る連続アドレスブロックのサイズの倍数として定義されるため、ブロックの絶対サイズを事前に知る必要はなく、同じコードを、異なるベクトルの長さを使用する異なるプラットフォームにわたって、または可変長のベクトルをサポートするプラットフォームで実行することができる。ループ展開については、展開された反復数は比較的少ないと予想されるため、イミディエートオフセット値は、命令エンコーディングでは大きなフィールドを必要とせず、その結果、利用可能な限定されたエンコーディング空間を有する命令セットアーキテクチャであっても使用することができる。
【００５７】
ベクトルデータ転送命令のこの形式は、連続アドレスブロックの固定サイズを使用する装置で使用することができるが、特に、アドレスブロックの可変サイズを提供する装置において有用である。本装置は、ベースアドレスに対してオフセットを形成するようにイミディエートオフセット値に適用される乗数を決定するために、命令を実行するときに読み取られ得る可変制御パラメータをストアするためのストレージ要素を有することができる。例えば、可変制御パラメータは、１つのベクトルレジスタのサイズを識別するベクトルサイズであり得る。
【００５８】
アクセスされる連続ブロックの開始アドレスは、ベースアドレスを、イミディエートオフセット値と連続アドレスブロックのサイズに対応する乗数との積に加算するのと同等である種々の方法で決定することができるが、実際にはこのように決定される必要はない。乗数は、ＮＲ×ＮＥ×ＳＳの積と同等な値を有することができ、式中、ＮＲは、ベクトルデータ転送命令に応答してデータが転送されるベクトルレジスタ数であり、ＮＥは、各ベクトルレジスタに含まれるデータ要素数であり、ＳＳは、単一のデータ要素に対応するアドレスユニットのストレージユニットサイズである。ＮＲ、ＮＥ、ＳＳの各々は、固定されても、命令エンコーディングで定義されても、または制御レジスタ内にストアされた可変パラメータに依存して定義されてもよい。
【００５９】
１つの有用な手法は、ベクトルサイズＶＳ（１つのベクトルレジスタのサイズ）を制御レジスタに定義するため、命令エンコーディングが（明示的にまたは暗示的にオペコードを介して）ＮＲ、ＳＳ、およびＥＳ（１つのデータ要素のサイズ）を識別するため、ならびに乗数をＮＲ×ＶＳ／ＥＳ×ＳＳと同等であると決定される乗数のためのものである。ＮＲ、ＳＳ、ＥＳはすべて、実行される必要のある演算に応じてプログラマ／コンパイラによって事前に知られている可能性があるが、ＶＳは特定のハードウェアの実装例に依存する。したがって、ＶＳを制御レジスタに定義するが、他のパラメータＮＲ、ＳＳ、ＥＳを、命令エンコーディングを使用して定義することにより、同じコードを、異なるベクトルサイズを使用する広範囲のハードウェアの実装例で実行させる。
【００６０】
イミディエートオフセットを乗算するための乗数を決定するために、実際に乗算を遂行する必要はない。多くの場合、ＮＥ、ＳＥ、ＥＳ、ＶＬの可能な値は、２の累乗に対応し得るため、ある特定のビット数による左シフトは、乗算と同等であり得る。
【００６１】
イミディエートオフセット値は、負のオフセットを必要としない場合、より小さなイミディエートフィールドを可能にする符号なし整数値であり得る。代替的に、負のオフセットの使用を可能にするために、イミディエートオフセット値が符号付き整数値であることがあり、これは、負のオフセットを可能にすることが、例えば、ソフトウェアパイプライニング技術を使用して性能を改善するのに有用であり得る、ベースアドレスをループの異なる点で更新するためのより高い柔軟性を与えるため有用である。
【００６２】
ベクトルデータ転送命令によって参照されるベースレジスタは、（ロード／ストアされる対象ベクトルの各要素に対する異なるアドレスを識別するようにベクトルレジスタを指定し得るスキャッタギャザータイプのロード／ストア命令とは対照的に）スカラレジスタであり得る。
【００６３】
場合によっては、ベクトルデータ転送命令がベクトルロード命令である場合に、ベクトルの所与のデータ要素に対して遂行されたロード演算に対して例外条件が検出された場合、例外条件を処理するための応答アクションを抑制することができ、代わりに、要素識別情報をストアし、どのデータ要素が例外条件をトリガする所与のデータ要素であるかを識別することができる。この手法は、いくつかの要素が、これらの要素を実際に処理すべきであるか否かを管理する関連条件が解決される前に、処理されるループ投機（ｌｏｏｐ  ｓｐｅｃｕｌａｔｉｏｎ）を可能にするのに有用であり、性能を改善するのに役立つ場合がある。これについては以下でより詳細に説明する。
【００６４】
イミディエートオフセット値を指定するベクトルデータ転送命令は、ロード命令またはストア命令のいずれかであり得る。
【００６５】
ベクトル化されたコードを処理する際の別の問題は、アドレス変換フォールトまたはメモリ許可フォールトなどの例外条件の処理である。多くの場合、ベクトル化されたコードによって処理されるデータアレイはブロックサイズＳＢの正確な倍数を含まないため、ループの最終的な反復は単に、有効なデータを処理するいくつかの要素を有することができる。いくつかのベクトル化されたループでは、ループの各反復は、ロードされたデータ要素のうちの１つがアレイの端部に達したことを示す停止条件を満たすか否かをチェックするための少なくとも１つの命令を有することができ、この条件が満たされた場合、ループを終了させることができる。各要素を別々にロードし、停止条件をテストしてから次の要素をロードしなければならなかった場合、ベクトル化の性能上の利点は失われることになるため、典型的には、ベクトルロード命令は、データブロックをロードし、次いで、ロードされたデータの任意の要素が停止条件を満たすか否かをテストすることができる。したがって、いくつかの要素は、これらの要素が処理される必要がある有効な要素であるか否かを実際に知る前に、ロードされることがある。少なくとも１つの要素が、その要素が処理されるべきか否かを決定するための関連条件が解決される前に処理されるこの技術は、ループ投機と称されることがある。
【００６６】
しかしながら、ループの所与の反復が、処理されるアレイの端部を越えて拡張するデータをロードする場合、アドレス変換データがアレイの端部を越えてアドレスのページテーブルに定義されておらず、アドレス変換フォールトを引き起こした可能性があるか、または実行されている処理がアレイの端部を越えてアドレスにアクセスする許可を有しておらず、メモリ許可フォールトを引き起こした可能性があるため、これはフォールトを引き起こす可能性がある。したがって、アドレス変換フォールトまたはメモリ許可フォールトなどの例外的条件は、ループ投機が使用される場合、より起こりやすいかもしれない。
【００６７】
例外条件が所与のデータ要素に対して発生したが、アレイの端部に依然達していない場合、これは有効な例外条件であり、フォールトを処理するための例外処理ルーチンの実行など、対応する応答アクションがとられる必要があることがある。例えば、例外処理ルーチンは、ページテーブルを更新して、必要なアドレスに対するアドレス変換マッピングを定義するようにオペレーティングシステムをトリガすることができる。しかしながら、必要なアレイの端部を越えてアドレスからロードされた要素については、例外条件が発生した場合、そのアドレスはいずれにせよアクセスされるべきではなく、そのアドレスにおけるロードは所与のベクトルの長さＶＬまたはアレイの端部を越えて出るブロックサイズＳＢを有するコードをベクトル化するアーチファクトとしてトリガされただけであるため、応答アクションをトリガすることは望ましくないはずである。したがって、ループ投機が遂行されると、すべての例外条件に対して応答アクションをトリガすることは望ましくない場合がある。
【００６８】
図７および８は、これに対処するための第１のタイプのベクトルロード命令の演算を示す。第１のタイプの命令はまた、ロードされているベクトルの第１のアクティブな要素について例外条件が検出された場合、応答アクションをトリガするが、他の要素に対して例外条件が生じたときに応答アクションをトリガしないため、第１のフォールト（ＦＦ）ロード命令と称される。この例では、要素は、最下位の要素から最上位の要素に向かう所定のシーケンスで考慮されるため、第１のアクティブな要素は、述語値Ｐｇによってアクティブとして示される最下位の要素である。例えば、図７では、要素０は０の述語ビットを有し、要素１〜３は１の述語ビットを有するため、第１のアクティブな要素は要素１である。
【００６９】
図７では、第１のアクティブな要素（要素１）に対して遂行されたロード演算に対して例外条件が発生したため、例外処理ルーチンの実行などの応答アクションがトリガされている。概ね、第１のアクティブな要素は、停止条件が満たされることにつながる可能性があるより早いアクティブな要素は存在しないため、非投機的にロードされ、その結果、フォールトが生じた場合、これは有効なフォールトであり、これを処理するために応答アクションがトリガされる。
【００７０】
一方、図８に示されるように、第１のフォールトベクトルロード命令については、第１のアクティブな要素（例えば、この例では要素２）以外の要素に対して例外条件が発生した場合、応答アクションは抑制される。代わりに、処理回路は、どの要素がフォールトを引き起こしたかを識別するように第１のフォールトレジスタ（ＦＦＲ）７８を更新する。後続のデータ要素の２つ以上（第１のアクティブな要素以外）がフォールトした場合、これらの要素の第１の位置はＦＦＲ７８内で識別され得るか、または以下で論じられるように、ＦＦＲがフォールトした第１の要素および任意の後続の要素を識別し得る。
【００７１】
この手法は、第１のアクティブな要素以外の要素に対して例外条件が生じた場合に応答アクションがすぐにトリガされないことを意味するため、ループ投機用に概ね有用である。ＦＦＲ７８を更新した後、いくつかの命令は、フォールトした要素よりも早い要素に対して停止条件が満たされているか否かをチェックすることができ、かつ、そうであれば、ベクトルループが処理されるデータの端部を超えて拡張されたために例外条件が生じただけであるため、例外条件を処理せずにループを終了させる。一方、停止条件が依然満たされていない場合、ＦＦＲ７８を使用して、どの要素が例外条件をトリガしたかを識別することができ、これを使用して、フォールトした要素がここで第１のアクティブな要素であることを伴って、ループされた命令シーケンスの反復をトリガすることが、その結果、例外条件が再び生じた場合は、フォールト要素は第１のアクティブな要素であるため、応答アクションをここでトリガすることができる。したがって、第１のフォールト手法は、（フォールトした各それぞれの要素を第１のアクティブな要素として処理させるように、命令シーケンスを複数回繰り返す必要がある場合があるため）有効な例外条件が処理されるのを遅延させることがあるが、このオーバヘッドは通常、停止条件が解決される前にループの反復ごとに大きなデータブロックがロードされる場合であっても、第１のフォールトメカニズムが、後で必要ではないことが判明する投機的に処理された要素によってトリガされている偽の応答アクションを防止するため可能である、ループの反復ごとに処理されるより多くの要素を可能にすることによって達成される性能の向上（ループ制御のオーバヘッドを減少させる）よりも優れている。
【００７２】
図８に示されるように、ＦＦＲ７８は、ロードされているベクトルの要素のうちの１つに各々が対応するいくつかのビットを含む要素マスクとして定義することができる。フォールト要素および任意の後続の要素に対応するビットは第１の値（この例では０）を有し、フォールト要素よりも早い任意の要素のビットは第２の値（この例では１）を有する。このようにＦＦＲ７８を定義することは、フォールト要素が後続の試みのための第１のフォールト要素になるように、新しい述語またはアドレスを、命令シーケンスを実行しようとする後続の試み（下記の図１３を参照）に対して決定することができるようにするのに有用である。したがって、ＦＦＲ７８は、フォールトをトリガしなかった要素に対して既に遂行された演算を不必要に繰り返すことなく、データ要素の処理をフォールトの解決後に再開させるのに有用である。
【００７３】
したがって、この形式の第１のフォールト命令は、ベクトル化するアーチファクトとして導入された例外条件を処理するためのオペレーティングシステムまたは他のソフトウェアに対する不要なトラップを防止するためのベクトル化されたコードのために有用である。しかしながら、ループ展開を遂行する場合、命令の第１のフォールト形式は、展開されたループの第１の命令以外の命令では機能しない。展開されたループの第１のロードの第１のアクティブな要素は、（停止条件が満たされることにつながる可能性があるより早いアクティブな要素が存在しないため）非投機的である可能性があるが、後続のロードについては、第１のアクティブな要素はまた、投機的にロードされた要素であってもよい。通常、展開されたループの停止条件は、展開されたループ内のすべてのロードが完了すると解決されることがあるため、展開されたループのまさに第１のロードによってロードされた第１のアクティブな要素以外の任意の要素は投機的な要素であり得、その結果、応答アクションを展開されたループ内のあらゆるロードの第１のアクティブな要素でトリガすることは望ましくないであろう。
【００７４】
図９に示されるように、非フォールト（ＮＦ）ベクトルロード命令と称される第２のタイプのベクトルロード命令を提供することができる。非フォールトベクトルロード命令が遂行されると、次いで、第１のアクティブな要素に対して例外条件が生じた場合であっても、応答アクションは依然抑制され、ＦＦＲ７８は、フォールトした要素を識別するように図８と同様の方法で更新される。したがって、非フォールトタイプのロード命令については、どの要素がフォールトをトリガするかにかかわらず、応答アクションはトリガされず、第１のフォールトレジスタ７８は、フォールトを引き起こした要素を識別するように更新される。これにより、以下の例に示されるように、ループ展開が、展開されたループ内のまさに第１のロードに対して第１のフォールト形式の命令（例えば、ｌｄｆｆ  ｉｄ）を使用すること、および展開されたループ内の後続のロードに対して非フォールト形式の命令（例えば、ｌｄｎｆｉｄ）を使用することが可能になる。
【００７５】
【数６】
2018534672.tif 000008
【００７６】
２つのタイプの命令は、命令エンコーディング内で任意の方法で区別することができる。これらの命令に２つの全く異なるオペコードを提供するか、または命令が第１のフォールトであるかもしくは非フォールトであるかを指定する命令エンコーディング内で共通のオペコードにフラグを提供することが可能である。しかしながら、これは、命令セットアーキテクチャ内に追加のエンコーディング空間を必要とすることになり、別の種類の演算が命令セットアーキテクチャ内に含まれることを防止し得る、これらの命令に割り当てられる追加のオペコードを必要とするか、またはフラグを表すためにエンコーディングの追加のビットを必要とする。
【００７７】
したがって、第１のタイプの命令および第２のタイプの命令をエンコーディングするより効率的な方法は、命令が第１のタイプの命令であるかまたは第２のタイプの命令であるかを合図するように命令内でアドレスオフセットが表される方法を使用するものであり得る。上記で論じられるように、ブロックサイズＳＢの倍数を表すイミディエートオフセット１２２を指定する命令形式を提供することができ、これは、第２のタイプの命令が使用される可能性がある状況でもあるループ展開のために主に有用である。したがって、アドレスオフセットが定義される方法はまた、命令が第１のフォールトであるかまたは非フォールトであるかを決定することができる。
【００７８】
図１０は、２つのタイプの命令を区別する第１の例を示す。この例では、イミディエートオフセット値がゼロの場合、命令は第１の（第１のフォールト）タイプであり、イミディエートオフセット値が非ゼロである場合、命令は第２の（非フォールト）タイプである。多くの場合、ループ展開を遂行する場合、展開されたループのまさに第１のロードはゼロのオフセットを有し、後続のロードは非ゼロのオフセットを有するため、イミディエートオフセットがゼロであるか否かを使用して、フォールト挙動のタイプを識別することができる。これにより、２つの形式の命令が、エンコーディング内に任意の追加のビット空間を必要とせずに、異なる例外処理挙動をトリガすることが可能になる。
【００７９】
図１１は、命令を区別する第２の例を示す。イミディエートオフセットを指定する図４に示されるタイプのベクトルロード命令に加えて、命令セットアーキテクチャはまた、インデックスレジスタを使用してオフセットを指定する対応するベクトルロード命令を含むことができる。この場合、ベクトルロード命令がインデックスレジスタを使用してオフセットを指定すると、次いで、これを第１のフォールトタイプの命令として処理することができ、オフセットがイミディエート値で指定されると、次いで、これを非フォールトタイプのロード命令として処理することができる。イミディエートオフセット値および非フォールトタイプのロード命令を両方使用することは、主にループ展開に使用される可能性があるため、非フォールトタイプのロード命令を使用する大部分のインスタンスはまた、イミディエートオフセット値を指定し、その結果、イミディエート指定ロード命令をデフォルトで非フォールトにすることで、非フォールト挙動を識別するために命令エンコーディング内の任意の他のビット空間を使い切る必要がなくなる。
【００８０】
図１１に示される手法を使用すると、展開されたループのまさに第１のロードは、それが第１のフォールト挙動をトリガするように、インデックスレジスタを使用して指定されたそのオフセットを有することができる。場合によっては、第１のロードのインデックスをストアするために汎用レジスタを割り当てることができ、これは、展開されたループの反復ごとに１つの追加のスカラレジスタを必要とするが、後続のロードはイミディエート値を使用してオフセットを指定することができるため、あらゆるロードが個別のインデックスレジスタを有する場合よりも少ないレジスタの負担をさらに招く。いずれの場合でも、展開されたループの第１のロードはゼロオフセットを使用することが多く、いくつかのアーキテクチャは、（任意の値に設定することができる汎用レジスタに加えて）デフォルトではゼロに等しいと想定される所定のレジスタを定義する。ゼロをストアするハードワイヤされたレジスタがハードウェア内に提供されてもよいし、または所定のレジスタが実際のレジスタに対応していなくてもよいが、処理回路は、レジスタバンクにアクセスする必要なしに、所定のレジスタのレジスタ指定子をゼロの入力値に簡単にマッピングすることができる。したがって、展開されたループの第１のロードの所定のレジスタを参照することにより、第１のロードがインデックスレジスタを使用してオフセットを指定するときでも、汎用スカラレジスタを使い果たす必要はない。
【００８１】
したがって、上記に示される展開されたループの例は、第１のフォールト命令ｌｄｆ  ｆｌｄが所定のレジスタｘｚｒを参照することによってそのオフセットを識別するように、図１１に示される手法に基づいて変更することができ、イミディエート値＃１、＃２などを参照する非フォールト命令ｌｄｎｆ  ｉｄとは対照的に、インデックスレジスタを使用してそのオフセットを識別するため、デフォルトでは第１のフォールトとして処理される。
【００８２】
【数７】
2018534672.tif 000009
【００８３】
図１２は、ＦＦＲ７８を使用して、データ要素の所与のセットで作用する命令シーケンスから生じる例外条件を追跡し、シーケンスの各命令が前の命令からの結果を使用する一例を概略的に示す。これらの命令のいずれかに対して所与の要素がフォールトをトリガした場合、その要素および後続の命令シーケンス内の任意の後続の要素の処理を続けることは望ましくないことがある。したがって、第１のフォールトレジスタは、シーケンスの開始前に、すべてのビットが１に等しい状態でセットされ、次いで、任意の命令が（第１のフォールト命令に対する第１のアクティブな要素以外の）所与の要素でフォールトをトリガした場合、所与の要素および任意の後続の要素に対応するビットは、第１のフォールトレジスタ７８でクリアされ、その命令シーケンスの残りの部分についてはクリアなままであるように、累積様式を定義することができる。ＡＮＤ演算を使用して第１のフォールトレジスタ７８を述語値Ｐｇと組み合わせることによって、変更された述語Ｐｇ’を次に任意の後続の命令に対して生成して、フォールトした要素がさらに処理されることを防止することができる。後続の命令（例えば、図１２の命令１）が次により早い要素で別のフォールトを発生した場合、次の命令がさらに少ない要素を処理するように、ＦＦＲ７８のうちの少なくとも１つの別のビットを０にクリアすることができる。
【００８４】
代替的に、図１３に示されるように、以前のマスクＰｇをＦＦＲとＡＮＤ演算するのではなく、代わりに、命令（例えば、上記の例に示されるｒｄｆｆｒ命令）は、単にＦＦＲを読み取り、その結果を後続の命令シーケンスによって述語レジスタとして使用される対応するレジスタｐ４／ｐ５／ｐ６内にストアすることができる。
【００８５】
上記の例のｂｒｋｎ命令は、
ＢＲＫＮ  Ｐｄｍ．Ｂ、Ｐｇ、Ｐｎ．Ｂ、Ｐｄｍ．Ｂの形式であり、
以下の演算を遂行するように処理回路を制御する。
Ｐｇの最後（すなわち、最上位一番左）の真／アクティブ／非ゼロビットに対応するＰｎの述語ビットも真／アクティブ／非ゼロである場合、Ｐｄｍは変更されずに残され、
Ｐｇの最後（すなわち、最上位一番左）の真／アクティブ／非ゼロビットに対応するＰｎの述語ビットが偽／非アクティブ／ゼロである場合、Ｐｄｍはすべて偽／非アクティブ／ゼロにクリアされる。
【００８６】
換言すると、
Ｐｄｍ＝ＬａｓｔＡｃｔｉｖｅ（Ｐｇ、Ｐｎ）？Ｐｄｍ：０；
（／／ＬａｓｔＡｃｔｉｖｅ（）は、Ｐｇの一番左にセットされたビットを検索し、Ｐｎの同じビットが真であるか否かを返却する）。
【００８７】
換言すると、ｂｒｋｎ命令は、第１のロードがそのロードの後にＦＦＲの最後のアクティブな要素が偽であったことを意味する障害を検出した場合、その障害が、第２のロードのＦＦＲの結果に、それをすべてゼロに設定するなどして伝播されることを保証する。ｂｒｋｎ命令は、展開されたループの次の下位反復に「中断」条件を伝播する。
【００８８】
シーケンスの終わりに達すると、正常に完了した任意の要素は有効な結果として処理され、ループは、フォールト要素に対して生成されたフォールトがループ投機により生成された偽のフォールト（したがって、フォールトを処理する必要はなく、ループを終了させることができる）であるか、またはシーケンスを繰り返すことによって処理する必要のある有効なフォールトであるかを決定するようにＦＦＲ７８を検査し、停止条件を解決するためのいくつかの命令を含むことができる。図１３に示されるように、ＦＦＲ７８を使用して、シーケンスを実行しようとする繰り返しの試みのための新しい述語（マスク）または新しいアドレスを決定することができる。図１３の左手側は、フォールトした第１の要素（ＦＦＲ７８の‘０’ビットを有する第１の要素）がここで第１のアクティブな要素（更新されたマスクの‘１’ビットを有する第１の要素）になる状態で新しい述語を生成することを示す。代替的に、図１３の右手側に示されるように、後続の試みのためのベースアドレスがフォールト要素によってロードされたアドレスにここで対応するように、ＦＦＲ７８を使用して、ロード命令のベースアドレスを更新することも可能である。いずれの方法も、シーケンスが繰り返されるとき、フォールトした要素はここで第１のアクティブな要素であるため、その要素に対してフォールトが再び発生した場合、ループしたシーケンスの開始時に第１のフォールトタイプの命令が応答アクションをトリガするであろう。
【００８９】
図１４は、例外条件に出くわし得るベクトルロード命令を処理する方法を示す。ステップ２００では、プロセッサは、現在の命令がベクトルロード命令であるか否かを決定し、そうでなければ、何らかの他の方法で命令が処理される。ベクトルロード命令に出くわすと、次いで、ステップ２０２において、ベクトルの複数のデータ要素に対してロード演算が遂行される。各要素のアドレスは、ベースレジスタおよびオフセットを使用するか、またはベースレジスタおよびインデックスレジスタを使用して計算された開始アドレスに基づいて計算することができる。ステップ２０４では、ベクトルの任意の所与のデータ要素について例外条件が検出されたか否かが決定される。そうでなければ、方法はステップ２００に戻り、次の命令を処理し、ロード演算が首尾よく実行されるであろう。
【００９０】
しかしながら、例外条件が検出された場合、ステップ２０６において、フォールトをトリガした所与のデータ要素がベクトルの第１のアクティブなデータ要素であるか否かが決定される。複数の要素がフォールトをトリガした場合、これらのうちの第１の要素が第１のアクティブな要素であるか否かが決定される。フォールトした所与のデータ要素が第１のアクティブなデータ要素である場合、ステップ２０８において、現在のベクトルロード命令が第１のフォールトタイプの命令であるかまたは非フォールトタイプの命令であるかが決定される。ベクトルロード命令が第１のフォールトタイプの命令であった場合、ステップ２１０において、例外処理ルーチンを実行するか、またはフォールトが発生したことを示す何らかの情報を記録するなどの応答アクションがトリガされる。一方、命令が非フォールト形式の命令である場合、ステップ２１２において、応答アクションは抑制され（すなわち、実行されず）、ステップ２１４において、第１のフォールトレジスタ７８がフォールトした所与のデータ要素を識別するように更新される。ステップ２０６において、所与のデータ要素が第１のアクティブな要素でない場合、本方法はステップ２０６から直接ステップ２１２に進む（応答アクションは抑制され、ＦＦＲ７８は命令が第１のフォールトであるかまたは非フォールトであるかにかかわらず更新される）。
【００９１】
図１４に示される技術は、上記で論じられるタイプの連続ロードだけでなく、すべてのタイプのベクトルロード命令に使用することができる。したがって、異なるフォールト挙動を有する第１のタイプのロード命令および第２のタイプのロード命令を、対象ベクトルの各要素に対するいくつかの不連続アドレスを定義するアドレスベクトルを指定するギャザーロード命令に対して定義することもでき、ロードは各不連続アドレスから対象ベクトルにデータを集める。
【００９２】
図１５は、ソフトウェア（例えば、コンパイラ）またはハードウェア（例えば、生成された命令を実行するであろう同じパイプライン内の回路）で実装され得るループ展開手段によって遂行することができる、処理回路による処理のための命令を生成する方法を示す。ステップ２５０では、ソースプログラムの命令が受信される。ステップ２５２では、ループ展開手段は、ソースプログラムが、各反復が第１のフォールトベクトルロード命令を含むソースループを含むか否かを決定し、かかるループが存在しない場合、本方法は終了し、何らかの他の方法で命令が生成される。しかしながら、ソースプログラムがソースループを含む場合、ステップ２５４において、ループ展開手段は、ソースループよりも少ない反復を有する展開されたループに対する命令を生成する。展開されたループの各反復は、第１のフォールトベクトルロード命令および少なくとも１つの非フォールトベクトルロード命令を含む。ステップ２５６において、ループ展開手段は、次いで、ソースループを展開されたループに置き換えた処理回路による処理のための命令を出力する。
【００９３】
いくつかのループ展開方法は、図１５に示される第１／第２のタイプの命令、および少なくとも第２のタイプの命令がイミディエート値を使用してオフセットを指定する選択肢の両方を使用するように、図６および１５の技術を組み合わせることができることが理解されるであろう。他のループ展開方法は、図６および１５に示される技術のうちの１つまたは他のもののみを使用することができる。
【００９４】
図１６は、使用され得る仮想マシンの実装例を説明する。前述の実施形態は、関連する技術をサポートする特定の処理ハードウェアを動作させるための装置および方法に関して本発明を実装しているが、ハードウェアデバイスのいわゆる仮想マシンの実装例を提供することも可能である。これらの仮想マシンの実装例は、仮想マシンプログラム５１０をサポートするホストオペレーティングシステム５２０を実行するホストプロセッサ５３０上で実行される。通常、大きい強力なプロセッサは、妥当な速度で実行する仮想マシンの実装例を提供する必要があるが、かかる手法は、互換性または再使用の理由で別のプロセッサに固有のコードを実行したいという要望がある場合など、特定の状況で正当化される場合がある。仮想マシンプログラム５１０は、仮想マシンプログラム５１０によってモデル化されているデバイスである実際のハードウェアによって提供されるであろうアプリケーションプログラムインターフェースと同じアプリケーションプログラム５００にアプリケーションプログラムインターフェースを提供する。したがって、上記で説明されるメモリアクセスの制御を含むプログラム命令は、仮想マシンハードウェアとの相互作用をモデル化するために、仮想マシンプログラム５１０を使用してアプリケーションプログラム５００内から実行することができる。
【００９５】
要約すると、第１のタイプのベクトルロード命令および第２のタイプのベクトルロード命令は、命令セットアーキテクチャで定義することができる。第１のタイプの命令については、所定のシーケンスで対象ベクトルレジスタの第１のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出されると応答アクションがトリガされるが、第１のアクティブな要素以外のアクティブな要素に対して遂行されたロード演算について例外条件が発生した場合は応答アクションが抑制され、その場合、要素識別情報がストアされて、例外条件が検出されたアクティブな要素が識別される。第２のタイプの命令については、応答アクションが抑制され、対象ベクトルレジスタの任意のアクティブな要素に対して遂行されたロード演算について例外条件が検出されると要素識別情報がストアされる。
【００９６】
この手法は、ベクトル化されたコードの性能を改善するための２つの技術、つまり、（ループの複数の反復が展開されたループの単一の反復に結合される）ループ展開、および（少なくとも１つのアクティブなデータ要素に対するロード演算が、そのロード演算が実際に遂行されるべきか否かを決定するための関連条件が解決される前に遂行され得る）ループ投機を可能にするため、性能を改善するのに役立つ。対照的に、以前の形式の命令では、ループ展開およびループ投機の両方を使用することは困難であろう。第１のタイプのベクトルロード命令に加えて第２のタイプのベクトルロード命令を提供することによって、展開されたループにおいて、ループ停止条件が解決される前に、展開されたループの第１のロード命令以外の命令によって処理された要素が投機的に処理されている場合、第２のタイプの命令を使用して、偽の例外処理応答アクションがこれらの要素によってトリガされることを防止することができる。
【００９７】
概ね、ベクトルロード命令は、どの要素がアクティブであるかまたは非アクティブであるかを示すマスク（または述語）を有することができる。第１のタイプの命令または第２のタイプの命令の実行後、少なくとも１つの別の命令を実行して、要素識別情報に基づいて、第１のタイプのベクトルロード命令を実行しようとする後続の試みのための新しいマスクおよび新しいアドレスのうちの少なくとも１つを生成することができる。新しいマスクが生成される場合は、例外条件をトリガした所与のデータ要素がここで第１のアクティブな要素である状態で新しいマスクが生成され得、新しいアドレスが生成される場合は、例外条件をトリガした所与のデータ要素によって以前にロードされたアドレスに対応して新しいアドレスが設定され得る。次いで、新しいマスクまたはアドレスを使用して第１のタイプのベクトルロード命令が繰り返されると、フォールト要素はここでは第１のアクティブな要素であるため、フォールトが依然発生している場合、応答アクションをトリガして例外条件を解決することができる。
【００９８】
要素識別情報は、種々の方法で設定することができる。例えば、要素識別情報は単に、例外条件を引き起こした所与のデータ要素の識別子であってもよい。
【００９９】
しかしながら、有用な手法は、データが転送されている少なくとも１つのベクトルレジスタの各要素に対応するいくつかの表示で要素識別マスクを設定することである。例外条件が検出された要素および所定のシーケンス内の任意の後続の要素に対応する表示は、第１の値（例えば、０）に設定されてもよく、シーケンス内のより早い要素（存在する場合）に対応する表示は、第２の値（例えば、１）に設定されてもよい。この方法で要素識別マスクを定義することは、それが要素識別マスクを、どの要素がアクティブであるかをより単純に管理する述語（マスク）に結合させるため有用である。
【０１００】
概ね、どの要素が第１のアクティブな要素であると考慮されるかは、要素のいずれの任意のシーケンスに従って決定することができる。例えば、所定のシーケンスは、ベクトルの最下位の要素から最上位の要素まで拡張することができ、またはその逆も可能である。しかしながら、多くの場合、実際には、ベクトルは、最下位の要素に配置された最下位のアドレスからのデータおよび最上位の要素に配置された最上位のアドレスからのデータで埋められる傾向があり、ほとんどのプログラマ／コンパイラは、最下位のアドレスから最上位のアドレスにわたって反復してループを書き込む傾向がある。したがって、所定のシーケンスが最下位の要素から最上位の要素に及ぶ場合、これは多くの場合、ベクトル化されたコードが書き込まれる方向に最良にマッピングされる。したがって、いくつかの例では、第１のアクティブな要素は、レジスタの最下位のアクティブな要素であり得る。
【０１０１】
上記で説明される第１のタイプのベクトルロード命令および第２のタイプのベクトルロード命令は、連続ベクトルロード（ロードされる各データ要素に対応するアドレスが連続している場合）およびベクトルロードの不連続（ギャザー）形式（各データ要素のアドレスが不連続であり、アドレスベクトルによって指定される場合）の両方について使用することができる。
【０１０２】
しかしながら、連続タイプのベクトルロードについては、少なくとも第２のタイプのベクトルロード命令が、ベースレジスタおよびロードされる連続アドレスブロックのサイズの倍数として表されるイミディエートオフセット値を使用して、ロードされる連続アドレスブロックの開始アドレスを指定するのに有用であり得る。第１のタイプのベクトルロード命令もまた、このようにして定義することができ、そうである場合、これらは、それらのオペコードによって、またはイミディエートオフセット値が第１のタイプに対してゼロであるかまたは第２のタイプに対して非ゼロであるかによってのいずれかで区別することができる。
【０１０３】
他の例では、第２のタイプのベクトルロード命令は、そのオフセットをイミディエート値として指定することができるが、第１のタイプは、ベースアドレスに加算されるオフセット値をストアして、アクセスされる連続アドレスブロックの開始アドレスを形成するオフセット（インデックス）レジスタを指定することができる。したがって、命令のアドレッシングモードを使用して、フォールト挙動タイプを区別することができる。この手法は、これにより、ゼロオフセットをストアするための汎用レジスタを無駄にする必要なしに、第１のタイプの命令がインデックスレジスタ参照でゼロオフセットを定義することが可能になるため、デフォルトでゼロの値に対応する所定のゼロレジスタ指定子を提供するシステムにおいて特に有用である。
【０１０４】
データ要素について検出された例外条件は、何らかの種類の異常な結果または何らかのエラーを合図する任意の条件であってもよい。しかしながら、第１／第２の形式の命令は、例外条件がアドレス変換フォールトまたはメモリ許可フォールトを含む場合に特に有用であり得る。応答アクションは、変動する可能性があり、例外処理ルーチンの実行をトリガすること、および／または例外条件が発生したことを示すようにステータス情報を設定することを含み得る。
【０１０５】
さらなる構成例を以下の条項で定義する。
【０１０６】
（１）装置であって、
複数のデータ要素を含むベクトルオペランドをストアするための複数のベクトルレジスタと、
ベースレジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令に応答して、少なくとも１つのベクトルレジスタの複数のデータ要素と、連続アドレスブロックに対応するデータストアのストレージロケーションとの間でデータを転送するように構成された処理回路とを備え、
ベクトルデータ転送命令に応答して、処理回路が、ベースレジスタ内にストアされたベースアドレスを、イミディエートオフセット値と該連続アドレスブロックのサイズに対応する乗数との積に加算した結果と同等な値を有する該連続アドレスブロックの開始アドレスを決定するように構成されている、装置。
【０１０７】
（２）可変制御パラメータをストアするためのストレージ要素を備え、処理回路が、可変制御パラメータに応じて該連続アドレスブロックのサイズを決定するように構成されている、条項（１）に記載の装置。
【０１０８】
（３）可変制御パラメータが、１つのベクトルレジスタのサイズを識別するベクトルサイズＶＳを指定する、条項（２）に記載の装置。
【０１０９】
（４）処理回路が、ＮＲ×ＮＥ×ＳＳの積と同等な値を有する乗数を決定するように構成され、式中、
ＮＲは、ベクトルデータ転送命令に応答してデータが転送される該少なくとも１つのベクトルレジスタのベクトルレジスタ数であり、
ＮＥは、該少なくとも１つのベクトルレジスタの各々に含まれるデータ要素数であり、
ＳＳは、単一のデータ要素に対応するアドレスユニットのストレージユニットサイズである、条項（１）〜（３）のいずれか一項に記載の装置。
【０１１０】
（５）１つのベクトルレジスタのサイズを識別するベクトルサイズＶＳをストアするためのストレージ要素を含み、
処理回路が、ＮＲ×ＶＳ／ＥＳ×ＳＳと同等な値を有する乗数を決定するように構成され、
式中、ＥＳは、１つのデータ要素のデータ要素サイズであり、
処理回路が、ベクトルデータ転送命令のエンコーディングに基づいて、ＥＳ、ＮＲ、およびＳＳを決定するように構成されている、条項（４）に記載の装置。
【０１１１】
（６）イミディエートオフセット値が、符号なし整数値を含む、条項（１）〜（５）のいずれか一項に記載の装置。
【０１１２】
（７）イミディエートオフセット値が、符号付き整数値を含む、条項（１）〜（５）のいずれか一項に記載の装置。
【０１１３】
（８）ベースレジスタが、スカラレジスタを含む、条項（１）〜（７）のいずれか一項に記載の装置。
【０１１４】
（９）ベクトルデータ転送命令に応答して、処理回路が、該少なくとも１つのベクトルレジスタの各データ要素について、そのデータ要素と連続アドレスブロックのそれぞれの部分に対応するストレージロケーションとの間でデータを転送するためのデータ転送動作を遂行するように構成されている、条項（１）〜（８）のいずれか一項に記載の装置。
【０１１５】
（１０）ベクトルデータ転送命令がベクトルロード命令であり、該少なくとも１つのベクトルレジスタの所与のデータ要素のためのデータ転送動作について少なくとも１つの例外条件が検出された場合、処理回路が該少なくとも１つの例外条件を処理するための少なくとも１つの応答アクションを抑制し、該少なくとも１つのベクトルレジスタのどのデータ要素が該所与のデータ要素であるかを識別する要素識別情報をストアするように構成されている、条項（９）に記載の装置。
【０１１６】
（１１）ベクトルデータ転送命令がベクトルロード命令を含む場合、処理回路が、連続アドレスブロックに対応するデータストアの該ストレージロケーションから少なくとも１つのベクトルレジスタの複数のデータ要素にデータをロードするように構成されている、条項（１）〜（１０）のいずれか一項に記載の装置。
【０１１７】
（１２）ベクトルデータ転送命令がベクトルストア命令を含む場合、処理回路が、少なくとも１つのベクトルレジスタの複数のデータ要素から連続アドレスブロックに対応するデータストアの該ストレージロケーションにデータをストアするように構成されている、条項（１）〜（１１）のいずれか一項に記載の装置。
【０１１８】
（１３）データ処理方法であって、
ベースレジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令を受信することと、
ベクトルデータ転送命令に応答して、
連続アドレスブロックの開始アドレスを決定することであって、開始アドレスが、ベースレジスタ内にストアされたベースアドレスを、イミディエートオフセット値と該連続アドレスブロックのサイズに対応する乗数との積に加算した結果と同等な値を有する、決定することと、
少なくとも１つのベクトルレジスタの複数のデータ要素と連続アドレスブロックに対応するデータストアのストレージロケーションとの間でデータを転送することと、を含む、データ処理方法。
【０１１９】
（１４）装置であって、
複数のデータ要素を含むベクトルオペランドをストアするための複数の手段と、
ベースレジスタおよびイミディエートオフセット値を指定するベクトルデータ転送命令に応答して、ベクトルオペランドをストアするための少なくとも１つの手段の複数のデータ要素と、連続アドレスブロックに対応するデータストアのストレージロケーションとの間でデータを転送するための手段と、を含み、
ベクトルデータ転送命令に応答して、転送するための手段が、ベースレジスタ内にストアされたベースアドレスを、イミディエートオフセット値と該連続アドレスブロックのサイズに対応する乗数との積に加算した結果と同等な値を有する該連続アドレスブロックの開始アドレスを決定するように構成されている、装置。
【０１２０】
（１５）条項（１）〜（１２）のいずれか一項に記載の装置に対応する仮想マシン実行環境を提供するようにコンピュータを制御するためのコンピュータプログラム。
【０１２１】
（１６）ソースプログラムに基づいて、処理回路によって処理するための命令を生成するためのコンピュータ実装方法であって、本方法が、
ソースプログラム内で、複数の反復を含むソースループを検出することであって、ソースループの各反復が、少なくとも１つのベクトルレジスタの複数のデータ要素と、ベクトルデータ転送命令および所与のブロックサイズによって識別される開始アドレスを有する連続アドレスブロックに対応するデータストアのストレージロケーションとの間でデータを転送するためのベクトルデータ転送命令を含み、ソースループの所与の反復に対する連続アドレスブロックが、後続の反復に対する連続アドレスブロックと連続している、検出することと、
ソースループを検出することに応答して、ソースループよりも少ない反復を含む展開されたループのための命令を生成することであって、展開されたループの各反復が、ソースループの少なくとも２つの反復に対応し、
ソースループの該少なくとも２つの反復のうちの選択された反復のベクトルデータ転送命令によって識別された開始アドレスをストアするためのベースレジスタを指定する参照ベクトルデータ転送命令、ならびに
該ベースレジスタ、およびベースレジスタ内にストアされた開始アドレスとソースループの該少なくとも２つの反復のうちの残りの反復のベクトルデータ転送命令によって識別された開始アドレスとの間の差を所与のブロックサイズの倍数として指定するイミディエートオフセット値を指定する少なくとも１つの別のベクトルデータアクセス命令を含む、生成すること、とを含む、コンピュータ実装方法。
【０１２２】
（１７）条項（１６）の方法を遂行するように構成されたデータ処理装置。
【０１２３】
（１８）データ処理装置が、該方法に従って生成された命令を実行するように構成された該処理回路を備える、条項（１７）に記載のデータ処理装置。
【０１２４】
（１９）条項（１６）の方法を遂行するようにコンピュータを制御するための命令を含むコンピュータプログラム。
【０１２５】
（２０）条項（１９）のコンピュータプログラムをストアするストレージ媒体。
【０１２６】
（２１）ソースプログラムに基づいて、処理回路によって処理するための命令を生成するためのコンピュータ実装方法であって、本方法が、
ソースプログラム内で、複数の反復を含むソースループを検出することであって、各反復が、データストアから少なくとも１つのベクトルレジスタの複数のデータ要素にデータをロードするロード演算を遂行するように処理回路をトリガするための第１のタイプのベクトルロード命令を含み、第１のタイプのベクトルロード命令が、所定のシーケンスで該少なくとも１つのベクトルレジスタの第１のアクティブなデータ要素に対して遂行されたロード演算について例外条件が処理回路によって検出された場合、処理回路が応答アクションを遂行し、該所定のシーケンスで該第１のアクティブなデータ要素以外のアクティブなデータ要素に対して遂行されたロード演算について例外条件が検出された場合、処理回路が該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアすることを示すエンコーディングを有する、検出することと、
ソースループを検出することに応答して、ソースループよりも少ない反復を含む展開されたループのための命令を生成することであって、展開されたループの各反復が、ソースループの少なくとも２つの反復に対応し、
該第１のタイプのベクトルロード命令、および
該少なくとも１つのベクトルレジスタの任意のアクティブなデータ要素に対して遂行されたロード演算についてのロード演算について例外条件が検出された場合、処理回路が該応答アクションを抑制し、例外条件が検出されたアクティブなデータ要素を識別する要素識別情報をストアすることを示すエンコーディングを有する少なくとも１つの第２のタイプのベクトルロード命令を含む、生成することを含む、コンピュータ実装方法。
【０１２７】
（２２）条項（２１）の方法を遂行するように構成されたデータ処理装置。
【０１２８】
（２３）データ処理装置が、該方法に従って生成された命令を実行するように構成された該処理回路を備える、条項（２２）に記載のデータ処理装置。
【０１２９】
（２４）条項（２１）の方法を遂行するようにコンピュータを制御するための命令を含むコンピュータプログラム。
【０１３０】
（２５）条項（２４）のコンピュータプログラムをストアするストレージ媒体。
【０１３１】
本出願では、「〜するように構成された」という用語を使用して、装置の要素が定義された動作を実行することができる構成を有することを意味する。この文脈において、「構成」は、ハードウェアまたはソフトウェアの相互接続の配置または様式を意味する。例えば、装置は定義された動作を提供する専用のハードウェアを有してもよいし、またはプロセッサもしくは他の処理デバイスが機能を遂行するようにプログラムされてもよい。「するように構成された」は、定義された動作を提供するために、装置の要素を任意の方法で変更する必要があることを含意しない。
【０１３２】
本発明の例示的な実施形態を添付の図面を参照して本明細書において詳細に説明したが、本発明はこれらの厳密な実施形態に限定されず、種々の変更および修正を、添付の特許請求の範囲によって定義される本発明の範囲および趣旨から逸脱することなく、その中で当業者によって実施され得ることを理解されたい。
【図１】
2018534672.tif 000010
【図２】
2018534672.tif 000011
【図３】
2018534672.tif 000012
【図４】
2018534672.tif 000013
【図５】
2018534672.tif 000014
【図６】
2018534672.tif 000015
【図７】
2018534672.tif 000016
【図８】
2018534672.tif 000017
【図９】
2018534672.tif 000018
【図１０】
2018534672.tif 000019
【図１１】
2018534672.tif 000020
【図１２】
2018534672.tif 000021
【図１３】
2018534672.tif 000022
【図１４】
2018534672.tif 000023
【図１５】
2018534672.tif 000024
【図１６】
2018534672.tif 000025
【国際調査報告】
2018534672.tif 000026
2018534672.tif 000027