(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2023-09-14
(54)【発明の名称】データ転送命令用のレジスタアドレス指定情報
(51)【国際特許分類】
G06F 17/16 20060101AFI20230907BHJP
【FI】
G06F17/16 D
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2023504705
(86)(22)【出願日】2021-07-05
(85)【翻訳文提出日】2023-02-24
(86)【国際出願番号】 GB2021051704
(87)【国際公開番号】W WO2022023701
(87)【国際公開日】2022-02-03
(32)【優先日】2020-07-30
(33)【優先権主張国・地域又は機関】GB
(81)【指定国・地域】
(71)【出願人】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】弁理士法人浅村特許事務所
(72)【発明者】
【氏名】スティーブンス、ナイジェル ジョン
(72)【発明者】
【氏名】ミラノヴィッチ、イェレナ
(72)【発明者】
【氏名】マンセル、デイヴィッド ハンナ
【テーマコード(参考)】
5B056
【Fターム(参考)】
5B056BB33
5B056DD11
5B056FF10
(57)【要約】
レジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報を指定するデータ転送命令が提供される。データ転送命令に応じて、命令デコード回路構成30は、処理回路構成を制御して、レジスタストレージのターゲット部分へ又はからデータを転送するデータ転送動作を実行させる。レジスタアドレス指定情報は、少なくとも、ベース値を記憶するためのレジスタストレージのベースレジスタを識別するベースレジスタ識別子と、データ転送命令のエンコードにおいて指定されたイミディエート値であって、レジスタストレージのターゲット部分を選択するためのインデックス値を提供するためにベース値に加算されるべき値を表すイミディエート値とを含む。これは、可変データ構造サイズにスケーラブルであるコードをサポートし、ループアンローリングをサポートする命令セットアーキテクチャを提供するのに有用であり得る。
【選択図】
図12
【特許請求の範囲】
【請求項1】
命令をデコードする命令デコード回路構成と、
データを記憶するレジスタストレージと、
前記命令デコード回路構成によってデコードされた命令に応じて、データ処理を行い、前記レジスタストレージの少なくとも1つのレジスタに書き込まれるべき処理結果を生成する処理回路構成と、を備える装置であって、
前記レジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報を指定するデータ転送命令に応じて、前記命令デコード回路構成が、前記レジスタストレージの前記ターゲット部分へ又はからデータを転送するデータ転送動作を実行するように前記処理回路構成を制御するように構成されており、
前記レジスタアドレス指定情報が、
ベース値を記憶するための前記レジスタストレージのベースレジスタを識別するベースレジスタ識別子と、
前記データ転送命令のエンコードにおいて指定されたイミディエート値であって、前記レジスタストレージの前記ターゲット部分を選択するためのインデックス値を提供するために前記ベース値に加算されるべき値を表す、イミディエート値と、を少なくとも含む、
装置。
【請求項2】
前記レジスタストレージが、データの少なくとも1つの2次元(2D)配列を記憶するための2D配列レジスタストレージを含み、
前記レジスタストレージの前記ターゲット部分が、前記2D配列レジスタストレージのターゲット部分を含む、請求項1に記載の装置。
【請求項3】
前記データ転送動作が、ターゲット2D配列のサブ部分を前記2D配列レジスタストレージの前記ターゲット部分へ又はから転送することを含み、前記インデックス値が、前記ターゲット2D配列のどのサブ部分が転送されるべきかを識別する、請求項2に記載の装置。
【請求項4】
前記サブ部分が、前記ターゲット2D配列内の同じ垂直位置を共有する要素の単一の水平グループ、又は前記ターゲット2D配列内の同じ水平位置を共有する要素の単一の垂直グループを含む、請求項3に記載の装置。
【請求項5】
前記データ転送命令が、水平方向及び垂直方向のうちの1つを識別する配列方向識別子を指定し、
前記配列方向識別子が前記水平方向を識別するとき、前記ターゲット2D配列の前記サブ部分が、前記インデックス値によって識別される前記ターゲット2D配列の要素の少なくとも1つの水平グループを含み、要素の各水平グループが、前記ターゲット2D配列内の同じ垂直位置を共有する要素を含み、
前記配列方向識別子が前記垂直方向を識別するとき、前記ターゲット2D配列の前記サブ部分が、前記インデックス値によって識別される前記ターゲット2D配列の要素の少なくとも1つの垂直グループを含み、要素の各垂直グループが、前記ターゲット2D配列内の同じ水平位置を共有する要素を含む、請求項3又は4に記載の装置。
【請求項6】
前記データ転送命令が、前記処理回路構成によってサポートされる複数のデータ要素サイズの中から前記データ転送命令のために指定された現在のデータ要素サイズEに関連付けられており、前記現在のデータ要素サイズEが、前記ターゲット2D配列の各要素に関連付けられたデータ要素サイズを識別する、請求項3から5のいずれか一項に記載の装置。
【請求項7】
前記イミディエート値が、前記データ転送命令の命令エンコードのN
immビットを使用してエンコードされており、N
immが、前記現在のデータ要素サイズEに応じて可変であり、N
immが、Eが減少するにつれて増加する、請求項6に記載の装置。
【請求項8】
前記2D配列レジスタストレージが、各々がMVLビットを含むN
R個のベクトルレジスタを含み、
前記命令デコード回路構成が、前記2D配列レジスタストレージの前記N
R個のベクトルレジスタについて可変ベクトル長MVLをサポートする命令セットアーキテクチャに従って命令をデコードするように構成されており、前記命令セットアーキテクチャによってサポートされる最小ベクトル長が、MVL
minであり、
前記ターゲット2D配列の要素がデータ要素サイズEを有する前記データ転送命令に対して、前記データ転送命令の前記命令エンコード内の前記イミディエート値としてエンコードされ得る異なる数値の数が、MVL
min/E未満である、請求項3から7のいずれか一項に記載の装置。
【請求項9】
前記2D配列レジスタストレージが、少なくとも2つの配列ストレージ領域に論理的に分割されることが可能であり、各配列ストレージ領域が、それぞれの2D配列を記憶するためのものであり、
前記レジスタアドレス指定情報がまた、前記2D配列レジスタストレージの選択された配列ストレージ領域を識別する配列識別子も含み、前記インデックス値が、前記選択された配列ストレージ領域のどのサブ部分が前記レジスタストレージの前記ターゲット部分であるかを識別する、請求項2から8のいずれか一項に記載の装置。
【請求項10】
前記処理回路構成が、可変マッピングに基づいて、前記2D配列レジスタストレージのどの部分が前記配列識別子の所与の値に対応する前記配列ストレージ領域であるかを識別するように構成されており、前記可変マッピングが、前記データ転送動作のために指定された現在のデータ要素サイズEに依存する、請求項9に記載の装置。
【請求項11】
前記2D配列レジスタストレージが、N
A個の配列ストレージ領域に論理的に分割されており、N
Aが、前記現在のデータ要素サイズEに応じて変化し、N
Aが、Eが増加するにつれて増加する、請求項10に記載の装置。
【請求項12】
前記配列識別子及び前記イミディエート値が、前記データ転送命令の命令エンコードのビットの共有部分を使用してエンコードされており、
前記共有部分の所与のビットに対して、前記命令デコード回路構成が、前記データ転送命令について指定された現在のデータ要素サイズEに応じて、前記所与のビットが前記配列識別子の指示部分として解釈されるか、それとも前記イミディエート値の指示部分として解釈されるかを変化させるように構成される、請求項9から11のいずれか一項に記載の装置。
【請求項13】
前記配列識別子と前記イミディエート値をエンコードするために使用される前記データ転送命令の前記命令エンコードのビットの総数が、前記現在のデータ要素サイズEにかかわらず一定である、請求項12に記載の装置。
【請求項14】
前記データ転送命令が、前記レジスタアドレス指定情報と、メモリのターゲット部分を識別するためのメモリアドレス指定情報とを指定するロード/ストア命令であるとき、前記データ転送動作が、前記レジスタストレージの前記ターゲット部分とメモリの前記ターゲット部分との間でデータを転送することを含む、請求項1から13のいずれか一項に記載の装置。
【請求項15】
前記データ転送命令が、前記レジスタアドレス指定情報と、前記レジスタストレージの更なる部分を識別するための更なるレジスタアドレス指定情報とを指定するレジスタ移動命令であるとき、前記データ転送動作が、前記レジスタストレージの前記ターゲット部分と前記レジスタストレージの前記更なる部分との間でデータを転送することを含む、請求項1から14のいずれか一項に記載の装置。
【請求項16】
前記ベースレジスタがスカラレジスタである、請求項1から15のいずれか一項に記載の装置。
【請求項17】
前記命令デコーダが、ソース又は宛先レジスタを指定するためのKビットスカラレジスタフィールドを有する少なくとも1つのスカラ計算命令をサポートするように構成されており、
前記データ転送命令が、Lビットのスカラレジスタフィールドを使用して前記ベースレジスタを指定しており、前記少なくとも1つのスカラ計算命令の前記ソース又は宛先レジスタとして指定可能な少なくとも1つのスカラレジスタが、前記データ転送命令用の前記レジスタアドレス指定情報の前記ベースレジスタとして指定することができないように、L<Kである、請求項1から16のいずれか一項に記載の装置。
【請求項18】
命令をデコードすることと。
前記デコードされた命令に応じて、レジスタストレージの少なくとも1つのレジスタに書き込まれるべき処理結果を生成するためにデータ処理を実行するように処理回路構成を制御することと、を含む方法であって、
前記レジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報を指定するデータ転送命令に応じて、前記処理回路構成が、前記レジスタストレージの前記ターゲット部分へ又はからデータを転送するデータ転送動作を実行するように制御され、
前記レジスタアドレス指定情報が、
ベース値を記憶するための前記レジスタストレージのベースレジスタを識別するベースレジスタ識別子と、
前記データ転送命令のエンコードにおいて指定されたイミディエート値であって、前記レジスタストレージの前記ターゲット部分を選択するためのインデックス値を提供するために前記ベース値に加算されるべき値を表す、前記イミディエート値と、を少なくとも含む、
方法。
【請求項19】
ターゲットコードの命令を実行するための命令実行環境を提供するようにホストデータ処理装置を制御するコンピュータプログラムであって、
前記ターゲットコードの命令をデコードして、前記デコードされた命令に対応する処理動作を実行するように前記ホストデータ処理装置を制御する命令デコードプログラムロジックと、
前記ターゲットコードに関連付けられたターゲット命令セットアーキテクチャのレジスタストレージをエミュレーションするために、前記ホストデータ処理装置のホストストレージ内にレジスタエミュレーティングデータ構造を維持するレジスタエミュレーティングプログラムロジックと、を備え、
前記レジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報を指定するデータ転送命令に応じて、前記命令デコードプログラムロジックが、前記ホストデータ処理装置を制御して、前記レジスタストレージの前記ターゲット部分に対応する前記レジスタエミュレーティングデータ構造のロケーションへ又はからデータを転送するデータ転送動作を実行させるように構成されており、
前記レジスタアドレス指定情報が、
ベース値を記憶するための前記レジスタストレージのベースレジスタを識別するベースレジスタ識別子と、
前記データ転送命令のエンコードにおいて指定されたイミディエート値であって、前記レジスタストレージの前記ターゲット部分を選択するためのインデックス値を提供するために前記ベース値に加算されるべき値を表す、前記イミディエート値と、を少なくとも含む、コンピュータプログラム。
【請求項20】
請求項19に記載のコンピュータプログラムを記憶する、ストレージ媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本技法は、データ処理の分野に関する。
【0002】
データ転送命令は、レジスタストレージへの又はからのデータの転送を制御するために、データ処理に使用され得る。
【0003】
少なくともいくつかの例は、命令をデコードする命令デコード回路構成と、データを記憶するレジスタストレージと、処理回路構成であって、命令デコード回路構成によってデコードされた命令に応じて、データ処理を実行し、レジスタストレージの少なくとも1つのレジスタに書き込まれるべき処理結果を生成する処理回路構成と、を含む装置を提供し、レジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報を指定するデータ転送命令に応じて、命令デコード回路構成は、レジスタストレージのターゲット部分へ又はからデータを転送するデータ転送動作を実行するように処理回路構成を制御するように構成されており、レジスタアドレス指定情報は、ベース値を記憶するためのレジスタストレージのベースレジスタを識別するベースレジスタ識別子と、データ転送命令のエンコードにおいて指定されたイミディエート値であって、レジスタストレージのターゲット部分を選択するためのインデックス値を提供するためにベース値に加算されるべき値を表すイミディエート値と、を少なくとも含む。
【0004】
少なくともいくつかの例は、命令をデコードすることと、デコードされた命令に応じて、レジスタストレージの少なくとも1つのレジスタに書き込まれるべき処理結果を生成するためにデータ処理を実行するように処理回路構成を制御することと、を含む方法を提供し、レジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報を指定するデータ転送命令に応じて、処理回路構成は、レジスタストレージのターゲット部分へ又はからデータを転送するデータ転送動作を実行するように制御され、レジスタアドレス指定情報は、ベース値を記憶するためのレジスタストレージのベースレジスタを識別するベースレジスタ識別子と、データ転送命令のエンコードにおいて指定されたイミディエート値であって、レジスタストレージのターゲット部分を選択するためのインデックス値を提供するためにベース値に加算されるべき値を表すイミディエート値と、を少なくとも含む。
【0005】
ターゲットコードの命令を実行するための命令実行環境を提供するようにホストデータ処理装置を制御するコンピュータプログラムであって、ターゲットコードの命令をデコードして、デコードされた命令に対応する処理動作を実行するようにホストデータ処理装置を制御する命令デコードプログラムロジックと、ターゲットコードに関連付けられたターゲット命令セットアーキテクチャのレジスタストレージをエミュレーションするために、ホストデータ処理装置のホストストレージ内にレジスタエミュレーティングデータ構造を維持するレジスタエミュレーティングプログラムロジックと、を含み、レジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報を指定するデータ転送命令に応じて、命令デコードプログラムロジックは、ホストデータ処理装置を制御して、レジスタストレージのターゲット部分に対応するレジスタエミュレーティングデータ構造のロケーションへ又はからデータを転送するデータ転送動作を実行させるように構成されており、レジスタアドレス指定情報は、ベース値を記憶するためのレジスタストレージのベースレジスタを識別するベースレジスタ識別子と、データ転送命令のエンコードにおいて指定されたイミディエート値であって、レジスタストレージのターゲット部分を選択するためのインデックス値を提供するためにベース値に加算されるべき値を表すイミディエート値と、を少なくとも含む、コンピュータプログラム。
【0006】
少なくともいくつかの例は、前述のコンピュータプログラムを記憶するストレージ媒体を提供する。ストレージ媒体は、一時的ストレージ媒体又は非一時的ストレージ媒体であり得る。
【図面の簡単な説明】
【0007】
本技法の更なる態様、特徴、及び利点は、添付の図面と併せて読まれる以下の例の説明から明らかとなる。
【
図1】行列処理をサポートするデータ処理装置の第1の例を概略的に示す。
【
図2A】行列処理をサポートするデータ処理装置の第2の例を示す。
【
図2B】行列処理をサポートするデータ処理装置の第2の例を示す。
【
図2C】行列処理をサポートするデータ処理装置の第2の例を示す。
【
図2D】行列処理をサポートするデータ処理装置の第2の例を示す。
【
図3】行列乗算演算を外積演算に分割して等価な結果を生成する方法を示す。
【
図4】1対のベクトルオペランドに外積演算を実行して、結果としてデータの2次元(Two-Dimensional、2D)配列を生成する外積エンジンの一例を示す。
【
図5】ベクトルオペランドを記憶するためのベクトルレジスタと、データの2D配列を記憶するための配列レジスタとを含む、処理装置のアーキテクチャレジスタの一例を示す。
【
図7】配列レジスタの物理ストレージ容量を可変の数のアーキテクチャ配列レジスタに論理的に分割する方法を示す。
【
図8】配列レジスタの物理ストレージ容量を可変の数のアーキテクチャ配列レジスタに論理的に分割する方法を示す。
【
図9】配列レジスタの物理ストレージ容量を可変の数のアーキテクチャ配列レジスタに論理的に分割する方法を示す。
【
図10】配列レジスタの物理ストレージ容量を可変の数のアーキテクチャ配列レジスタに論理的に分割する方法を示す。
【
図11】配列レジスタの物理ストレージ容量を可変の数のアーキテクチャ配列レジスタに論理的に分割する方法を示す。
【
図12】配列レジスタストレージとメモリとの間でデータの2D配列の一部分を転送するためのロード/ストアデータ転送命令のエンコードの一例を示す。
【
図13】データ転送命令の命令エンコードの結合フィールドを使用して配列識別子とイミディエート値をエンコードする例を示す。
【
図14】
図12のデータ転送命令を使用するプログラムコードの例を示す。
【
図15】配列レジスタとベクトルレジスタとの間でデータの2D配列の一部分を転送するためのレジスタ移動データ転送命令の一例を示す。
【0008】
データ処理装置は、デコードされた命令に応じて命令をデコードする命令デコード回路構成と、データ処理を実行する処理回路構成とを有し得る。レジスタストレージは、データを記憶するために提供され得る。レジスタストレージは、処理回路構成による処理のためのオペランドを提供するために使用され得る。処理回路構成が命令に応じて処理結果を生成するとき、処理結果は、レジスタストレージの少なくとも1つのレジスタに書き込まれ得る。
【0009】
データ転送命令は、レジスタストレージへ又はからデータを転送するために提供される。データ転送命令に応じて、命令デコード回路構成は、データ転送動作を実行するように処理回路構成を制御する。データ転送動作は、レジスタストレージのターゲット部分へ又はからデータを転送することを含む。データ転送命令は、レジスタストレージのターゲット部分を識別するレジスタアドレス指定情報を指定する。
【0010】
典型的なデータ転送命令では、レジスタストレージのターゲット部分として使用するレジスタは、命令エンコード内のレジスタフィールドによって識別されてもよく、レジスタフィールド内の値は、データの転送先/転送元であるアーキテクチャレジスタを直接指定する識別子である。
【0011】
しかしながら、以下で説明する例では、レジスタアドレス指定情報は、少なくともベースレジスタ識別子とイミディエート値とを含む。ベースレジスタ識別子は、ベース値を記憶するためのレジスタストレージのベースレジスタを識別し、イミディエート値は、データ転送命令のエンコードにおいて直接指定され、データがメモリへ転送されるべき、又はデータがメモリから転送されるべきレジスタストレージのターゲット部分を選択するためのインデックス値を提供するためにベース値に加算されるべき値を表す。
【0012】
レジスタアドレス指定情報を定義するためにベースレジスタとイミディエートを使用するこの手法は、命令セットアーキテクチャ設計分野の当業者によって反直感的なものであると理解されるであろう。ベースレジスタとイミディエート値をベースとするアドレス指定は、メモリアドレス指定については知られているが、データ転送においてアクセスされる特定のレジスタは、実行されるプログラムコードのコンパイラによって直接選択することができ、したがって、ベースレジスタへの間接参照を使用する必要がないことが想定されるので、レジスタアドレス指定については不要であるように思われる。しかしながら、本発明者らは、レジスタストレージのターゲット部分を選択するためのインデックスを生成するためのベース値を提供するためにベースレジスタを使用するレジスタアドレス指定情報は、コンパイラがスケーラブルデータストレージサイズに動的に適応することができるコードを生成することを可能にするのに有用であり得ることを認識した。
【0013】
また、インデックス値を生成するときにベース値に加算されるオフセットを提供するためにイミディエート値を使用することは、コンパイラが、プログラムループの反復を制御するオーバーヘッドを低減するのに役立ち得るループアンローリングと呼ばれる技法を使用できるようにするのに有用であり得る。ループの各反復は、データ転送命令のベースレジスタ内のベース値などのループカウンタ又は他の変数をインクリメントするための命令などのループ制御命令を実行する際、及びループ終了条件が満たされているかどうかをテストする際に、性能コストが生じる可能性がある。ループアンローリングを実行することによって、コンパイラは、プログラマによって書かれた高レベルコードに含まれているループの2つ以上の反復のグループを、高レベルコードループ内の2つ以上の反復と同じ動作を実行するコンパイルされたコード内の単一のループ反復にマッピングし得る。これは、ループ制御命令が高レベルコード内の所与の数のループ反復に対して実行される必要がある回数を低減し、また、高レベルコード内のループの後続の反復からのいくつかの命令が独立している場合、前の反復の命令と並列に実行され得るため、より高い命令レベルの並列性を可能にするが、一方、ループが、コンパイルされたコード内で、ループの反復ごとに単一の高レベルループ反復を実行するコードにコンパイルされている場合、高レベルループの後続の反復のための命令は前の反復からの命令に依存し得、可能な並列性の量を低減する。レジスタアドレス指定情報を定義するためにベースレジスタとイミディエート値を使用することは、ループアンローリングをサポートするのに有用であり、その理由は、イミディエート値を使用して、コンパイル済みコード内で単一のループ反復に組み合わされる高レベルコードループの別個の反復のアンローリングされたバージョンに対応する異なるデータ転送命令のベースレジスタ内の値に異なるオフセットを加算することができるからである。
【0014】
よって、要約すると、前述のようにベースレジスタ識別子とイミディエート値を使用して定義されるレジスタアドレス指定情報を有するデータ転送命令は、異なるデータストレージサイズにスケーリングすることができ、コンパイラがループアンローリングを実行することを可能にすることができるスケーラブルコードをサポートするのに特に有用であり得る。
【0015】
イミディエート値は、レジスタストレージのターゲット部分を選択するためのインデックス値を提供するためにベース値に加算されるべき値を表す。命令のいくつかの実装形態では、ベース値に加算されるべき値は、イミディエート値として指定された正確な値であり得る。他の例では、イミディエート値は、加算されるべき値を直接指定しないエンコードを有し得る。例えば、イミディエート値は、Zとイミディエート値との積がベース値に加算されるように、加算されるべき値を所与の定数Zの倍数として指定することができる。
【0016】
また、いくつかの例では、インデックス値は、ベース値とイミディエート値によって表される値との和に等しくなり得る。他の例では、インデックス値は、ベース値とイミディエート値によって表される値との加算に依存し得るが、ベース値とイミディエート値によって表される値との和に厳密に等しくないことがある。例えば、ベース値の範囲外の値に対処するために、場合によっては、インデックス値は、ベース値とイミディエート値によって表される値との和を、得られるインデックスが必要な範囲内にあることを保証するように、選択された所与の値でモジュロ演算した結果に対応することができる(すなわち、インデックス値は、和を所与の値で除算した後の剰余である)。
【0017】
ベースレジスタ識別子とイミディエート値を使用するレジスタアドレス指定情報のエンコードは、データ転送においてどの整数レジスタ、浮動小数点レジスタ、ベクトルレジスタ、又は他のタイプのレジスタストレージがアクセスされるべきかを選択するためにインデックス値が使用されるデータ転送命令を含む、あらゆる形態のデータ転送命令に適用され得る。
【0018】
しかしながら、一例では、レジスタストレージは、データの少なくとも1つの2次元(2D)配列を記憶するための2D配列レジスタストレージを含み、レジスタストレージのターゲット部分は、2D配列レジスタストレージのターゲット部分を含む。よって、この例では、データ転送命令は、データの2D配列の少なくとも一部を配列レジスタストレージへ又はから転送するための配列データ転送命令であり得る。行列などの2D配列は、幅広い処理アプリケーションに有用である。一例は、機械学習の分野であり、行列乗算は、多くのタイプの機械学習モデル用の推論及びトレーニングアルゴリズムのバックボーンであり得るが、拡張現実、仮想現実、コンピュータビジョン、コンピュテーショナルフォトグラフィー、科学シミュレーション、デジタル信号処理のような分野などの他のアプリケーションも行列算術を使用し得る。よって、行列算術に対するサポートは、今後の処理アプリケーションの重要な特徴である可能性が高く、したがって、データの2D配列を記憶するように設計された2D配列レジスタストレージを提供することによって、これは、このようなアプリケーションをサポートするのに有用であり得る。「タイル」という用語は、以下のいくつかの例では、データの2D配列を指すために使用される。
【0019】
ベースレジスタ識別子とイミディエート値を含むレジスタアドレス指定情報を含むデータ転送命令は、データの2D配列の処理を伴うアプリケーションが、配列構造の2次元における配列サイズの変動に対処するためにスケーラブルである必要があり得るので、2D配列レジスタストレージをサポートするシステムに特に有用であり得る。ベースレジスタ識別子とイミディエート値を使用してレジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報を指定することによって、可変配列次元に応じて、どのレジスタがアクセスされるかを変更することができるプログラムループを定義することが可能であり、これは、データの2D配列を処理するのに有用であり得る。
【0020】
一例では、データ転送命令に応じて実行されるデータ転送動作は、ターゲット2D配列のサブ部分を2D配列レジスタストレージのターゲット部分へ又はから転送することを含むことができ、ベース値とイミディエート値から生成されたインデックス値は、ターゲット2D配列のどの特定のサブ部分が転送されるべきかを識別することができる。例えば、ベース値とイミディエート値を使用して、ターゲット2D配列のそれぞれのサブ部分にわたって反復するプログラムループを定義することができる。
【0021】
例えば、インデックス値は、サブ部分としての、ターゲット2D配列内の同じ垂直位置を共有する要素の単一の水平グループ、又はターゲット2D配列内の同じ水平位置を共有する要素の単一の垂直グループを識別し得る。他の実装形態は、単一のデータ転送命令が、ターゲット2D配列の要素の複数の水平グループ又は要素の複数の垂直グループを転送することを可能にし得る。いずれにしても、ベースレジスタと、ターゲット2D配列のどのサブ部分が転送されるべきかを選択するイミディエート値を使用することによって、これは、ソフトウェアが異なる配列次元(異なる数の行又は列)に対してスケーラブルであることをより容易にする。
【0022】
本願では、「水平」及び「垂直」という用語は、2D配列レジスタストレージの視点から見た2D配列の「行」及び「列」方向を指すために使用される。むしろ、「水平」及び「垂直」方向は、計算命令又は2D配列をメモリへ/から転送するための命令が、2D配列内の各要素の論理位置を考慮するという意味で、2D配列内の要素の論理的配置を指す。しかしながら、レジスタストレージの物理的レイアウトは、必ずしもストレージ要素の2Dグリッドに配置されなくてもよいことが理解されるであろう。集積回路レイアウト内で都合のよい任意の位置にストレージ要素を物理的に配置することが可能である。
【0023】
2D配列レジスタストレージに記憶された2D配列に関連付けられた「水平」及び「垂直」方向は、メモリに記憶された行列データ構造の同じ行/列レイアウトに必ずしも対応しなくてもよい。行列データを、行優先順序又は列優先順序などの異なるレイアウトでメモリに記憶することが可能である。行優先順序では、行列の行の隣接要素はメモリ内の連続アドレスに記憶されるが、行列の列の隣接要素はメモリ内でストライド値だけオフセットされる。逆に、列優先順序では、行列の列の隣接要素は、メモリ内の連続アドレスに記憶されるが、行列の行の隣接要素は、メモリ内でストライド値だけオフセットされる。
【0024】
よって、データがメモリから読み出されるとき、データは、(レジスタストレージに読み込まれる連続したメモリ要素がメモリ内の基礎となるマトリクス構造の行又は行の一部を表すように)行優先順序又は(読み込まれる連続したメモリ要素が列又は列の一部を表すように)列優先順序のいずれかであり得るが、いずれの方法でも、2D配列レジスタストレージ内の要素の水平グループ又は要素の垂直グループに要素を書き込むことが可能である。
【0025】
したがって、2D配列レジスタストレージ内の要素の水平グループは、メモリ内の行列構造からの要素の行又は列のいずれか(又は、後でメモリ内の行列構造内の要素の行又は列のいずれかに書き戻され得る要素の新たに計算されたセット)を表すことができることが理解されるであろう。同様に、2D配列レジスタストレージ内の要素の垂直グループは、メモリ内に記憶された基礎となる行列構造からの要素の行又は列のいずれかを表すことができる(又は、このような行又は列に書き戻されるべき新たに計算された値を表すことができる)。混同しないように、「行」及び「列」という用語は、メモリ内の行列要素の配置を指すために使用され、「水平グループ」及び「垂直グループ」は、2D配列レジスタストレージに記憶された2D配列内の要素の配列を指すために使用され得る。
【0026】
いくつかの実装形態では、データ転送命令は、水平/垂直方向のうちの1つにおいて2D配列レジスタストレージへ/からデータを転送することのみをサポートすることができる。例えば、いくつかの実装形態は、水平方向における2D配列レジスタストレージへのアクセスのみをサポートすることができる。これは、2D配列レジスタストレージにアクセスするための回路ロジックを簡略化することができる。
【0027】
しかしながら、他の例では、命令セットアーキテクチャ(Instruction Set Architecture、ISA)は、水平方向と垂直方向との両方において2D配列レジスタストレージの読み取り/書き込みをサポートし得る。よって、データ転送命令は、水平方向及び垂直方向のうちの1つを識別する配列方向識別子を指定し得る。配列方向識別子が水平方向を識別するとき、ターゲット2D配列のサブ部分は、インデックス値によって識別されるターゲット2D配列の要素の少なくとも1つの水平グループを含み、要素の各水平グループは、ターゲット2D配列内の同じ垂直位置を共有する要素を含む。配列方向識別子が垂直方向を識別するとき、ターゲット2D配列のサブ部分は、インデックス値によって識別されるターゲット2D配列の要素の少なくとも1つの垂直グループを含み、要素の各垂直グループは、ターゲット2D配列内の同じ水平位置を共有する要素を含む。これは、データをメモリから2D配列レジスタストレージに転送する時点で、又はデータを2D配列レジスタストレージからメモリに転送し戻すときに、行列のオンザフライ転置を可能にするのに有用であり得、これは、行列メモリレイアウトが計算の要件と互換性がないアプリケーションの性能を改善するのに役立ち、これによって、オンザフライ転置は、行列データをメモリとレジスタストレージとの間で転送するときに要素をシャッフルするために多数のロード/ストア命令又はベクトル置換命令を実行するよりもはるかに高速であり得る。
【0028】
データ転送命令は、一定の固定データ要素サイズで定義された2D配列を扱う実施形態で使用することができ、要素サイズは、2D配列の1つの単一要素内のビット数を指す。
【0029】
しかしながら、データ転送命令が、異なるレベルの精度のデータ値を使用して定義される行列を処理し得るアプリケーションに使用され得るように、可変データ要素サイズをサポートすることは有用であり得る。よって、データ転送命令は、処理回路構成によってサポートされる2つ以上のデータ要素サイズの中からデータ転送命令のために指定された現在のデータ要素サイズEに関連付けられ得る。
【0030】
現在のデータ要素サイズEは、データ転送命令に対して様々な方法で指定することができる。場合によっては、データ転送命令自体のパラメータが、現在のデータ要素サイズEを指定し得る。例えば、データ転送命令の命令エンコードの一部が現在のデータ要素サイズEを指定し得る。別のオプションは、制御レジスタ又は他のストレージロケーションに記憶されている制御情報が、現在のデータ要素サイズEを定義し得ることである。この場合、データ転送命令自体のエンコードは、現在のデータ要素サイズEを識別するいかなるビットも含む必要がない。データ転送命令の実行前に実行された命令を使用して制御ストレージロケーションにおける値を設定して、後続のデータ転送命令に使用される現在のデータ要素サイズEを設定することができる。いくつかの手法は、モード手法を使用することもでき、使用される現在のデータ要素サイズは、データ転送命令を実行する際に動作している処理回路構成の動作モードに依存する。よって、所与のデータ転送命令に対する現在のデータ要素サイズEを識別することができる様々な方法があることが理解されるであろう。
【0031】
可変データ要素サイズをサポートする実装形態では、レジスタアドレス指定情報のイミディエート値は、データ転送命令の命令エンコードの一定のビット数Nimmを使用してエンコードされ得、Nimmは、現在のデータ要素サイズEに応じて可変であり、Eが減少するにつれてNimmは増加する。この手法は、ターゲット2D配列のどのサブ部分が、データ転送命令に応じて実行されるデータ転送において転送されるべきかを識別するインデックスを生成するために、イミディエート値が使用される場合に特に有用であり得る。データ要素サイズが減少すると、これは、より多くのデータ要素が所与のサイズのレジスタ内に収まることができ、レジスタの幅に対応する水平/垂直方向の第1の方向においてより大きな寸法を有する2D配列をサポートすることを意味する。要素サイズが減少するにつれてイミディエート値のサイズを増加させると、これは、ターゲット2D配列のより多くのサブ部分が選択されることを可能にし、反対の垂直/水平方向における2D配列の第2の次元が、第1の方向におけるスケーリングと同程度にスケーリングすることを可能にする。データ要素サイズがより小さいときよりもデータ要素サイズがより大きいときに、より少ない数のビットを使用してイミディエート値がエンコードされるように、可変長を有するイミディエート値のエンコードを使用することによって、より大きい要素サイズにおいて、これは、他のパラメータをエンコードするために使用され得るいくつかの余分なビットを解放し得る。
【0032】
一例では、2D配列レジスタストレージは、一定の数NRのベクトルレジスタを含み得、各ベクトルレジスタは、一定の数のビットMVLを含む(MVLは、単一のベクトルレジスタの「ベクトル長」を示す)。ベクトルレジスタのグループとして2D配列レジスタストレージを実装することによって、これは、ベクトルとしてデータの1D配列を記憶するために使用されるベクトルレジスタを提供するための技法が、2D配列レジスタストレージを実装するために再使用され得るので、プロセッサのマイクロアーキテクチャの実装形態を簡略化することができる。例えば、データの単一の2D配列は、ベクトルレジスタのグループ内で表され得、このグループ内の各ベクトルレジスタは、2D配列の要素の異なる水平(又は垂直)グループを記憶し、ベクトルレジスタのグループは、全体として、要素の複数のこのようなグループを記憶して、2D配列を形成する。
【0033】
いくつかの実装形態では、処理回路構成及び命令デコード回路構成によってサポートされるISAは、2D配列レジスタストレージのベクトルレジスタについて可変ベクトル長MVLをサポートし得る。これにより、マイクロアーキテクチャ設計者は、より高い性能を優先するか、それともより高いエネルギー効率を優先するかなどの設計選好に応じて、所与のマイクロアーキテクチャプロセッサ実装形態上で使用されるレジスタのサイズを変更することができる。例えば、ISAは、最小ベクトル長MVLminから最大ベクトル長MVLmaxまで及ぶベクトル長の範囲をサポートすることができる。
【0034】
ソフトウェア開発を簡略化するために、プログラムコードが、異なるベクトル長MVLを使用する各種プロセッサ上で、ベクトル長のこのような差を考慮したプログラムコードのいかなる修正も必要とせずに、正しく動作することができるように、ISAを設計することが有用であり得る。この特性は、ベクトル長アグノスティックプログラムコードと呼ばれることがある。例えば、ISAは、現在のプラットフォーム上で実装されているベクトル長を示すレジスタをサポートすることができ、このベクトル長は、所与の実装形態に対して静的であり得るが、プロセッサ実装形態間で変化し得、プログラムコードは、プログラムコードループを制御するときにそのレジスタを参照して、実装されているベクトル長MVLに応じて、ループ反復ごとにどれだけのデータが処理されるかを変化させることができる。よって、処理すべき所与の量のデータを有するプログラムは、より短い長さを実装したマイクロアーキテクチャ上よりも、より長いベクトル長を実装したマイクロアーキテクチャ上でより少ないループ反復を使用してそのデータを処理することができるが、いずれの場合も、同じ計算結果を生成するために同じ機能処理動作を実行する(ただし、性能のレベルが異なる)。
【0035】
イミディエート値は、2D配列のどのサブ部分が転送されるべきかを表すことができる。ベクトルレジスタ内に収まることができる要素の数は、ベクトル長MVLが増加するにつれて増加するので、(2D配列の他の次元が同様にスケーリングすることを可能にするために)イミディエート値は、最大ベクトル長MVLmaxが実装されているときに、1つのベクトルレジスタ内に収まることができる要素の数に対応するベクトルレジスタの数を区別することができるように、十分な数のビットを提供されるべきであると考えるかもしれない。
【0036】
しかしながら、本発明者らは、実際には、イミディエート値の別個のエンコードの数がMVLmin/E(ISAによってサポートされる最小ベクトル長MVLminのベクトルレジスタ内の要素の数)よりも大きい場合、これは、MVLmin/Eよりも大きいインデックスを指定する命令が最小ベクトル長MVLminを実装しているマイクロアーキテクチャ上で正しく動作することができないため、プログラムコードがベクトル長アグノスティックでなくなることを意味することを認識した。したがって、ベクトル長アグノスティックのために設計されたISAでは、より大きなイミディエート値を提供するために命令エンコードの追加ビットを使う価値はない。別個のエンコードの数がMVLmin/E以下であるようにイミディエート値エンコードのビット数を制限することによって、これは、エンコードビット空間を他のパラメータのために解放し、ベクトル長アグノスティックに対するサポートを改善する。
【0037】
もちろん、前述のデータ転送命令が、ベクトル長アグノスティックが優先されていないISAにおいて実装されている場合、イミディエート値のより大きな値をサポートすることは依然として可能である。
【0038】
いくつかの例では、レジスタアドレス指定情報のベース値とイミディエート値に基づいて生成されたインデックス値は、データ転送が実行されるべきレジスタストレージのターゲット部分を選択するために使用されるレジスタ識別情報の唯一のアイテムであり得る。例えば、インデックス値は、前述の2D配列レジスタストレージ内の個々のベクトルレジスタのレジスタ識別子を指定することができる。この手法では、ベクトルレジスタのグループは全体として、行列などのデータの2D配列を形成すると考えることができるが、命令は、要素のそのグループを記憶するために使用されるベクトルレジスタの特定のレジスタ識別子を指定することによって、配列の要素の個々の水平/垂直グループを参照することがある。
【0039】
しかしながら、特定のプログラミング技法は、個々の水平/垂直グループの要素ではなく、複数の2D配列の処理を必要とする。したがって、別の手法は、2D配列レジスタストレージが少なくとも2つの配列ストレージ領域に論理的に分割されることが可能であり、各配列ストレージ領域がそれぞれの2D配列を記憶することであり得る。レジスタアドレス指定情報はまた、インデックス値に加えて、2D配列レジスタストレージの選択された配列ストレージ領域を識別する配列識別子も含むことができる。この場合、インデックス値は、選択された配列ストレージ領域のどのサブ部分がレジスタストレージのターゲット部分であるかを識別することができる。よって、データ転送命令は、データ転送のためにアクセスされる配列の配列IDを指定することができ、ベースレジスタとイミディエートを使用して定義されたインデックス値は、その配列から要素の個々の水平/垂直グループを選択するために使用することができる。この手法は、配列内の要素の各水平/垂直グループにわたってループして2D配列をレジスタストレージへ/から転送するプログラムループをソフトウェアが定義することをより簡単にすることができる。
【0040】
いくつかの実装形態では、所与の配列識別子が常に2D配列レジスタストレージの特定の固定部分に対応するように、2D配列レジスタストレージの配列ストレージ領域への分割は固定され得る。例えば、2D配列レジスタストレージが上述のようにベクトルレジスタのセットを使用して実装されているとき、各配列ストレージ領域はベクトルレジスタの固定ブロックに対応することができる。
【0041】
しかしながら、上述のような可変データ要素サイズをサポートする実装形態では、2D配列レジスタストレージの配列ストレージ領域への分割に、現在のデータ要素サイズに依存する可変マッピングを使用することが有用であり得る。処理回路構成は、データ転送動作のために指定された現在のデータ要素サイズEに依存する可変マッピングに基づいて、2D配列レジスタストレージのどの部分が配列識別子の所与の値に対応する配列ストレージ領域であるかを識別し得る。これは、ハードウェア内に実装された利用可能なレジスタ容量の利用効率を改善することによって、性能を改善するのに役立ち得る。
【0042】
上述のように、データ要素サイズEが可変であるとき、これは、単一のレジスタが可変の数のデータ要素を記憶できることを意味するが、配列の第2の次元が同様にスケーリングされることが望ましいことがある。したがって、より多くの数の要素が1つの(水平方向又は垂直方向のいずれか一方を表す)ベクトルレジスタ内に収まる場合、配列はより多くの数の(水平/垂直方向のもう一方における配列の次元を表す)ベクトルレジスタにまたがるようになる。より多くの数のベクトルレジスタが単一の2D配列構造を表すために割り振られている場合、これは、全体として2D配列レジスタストレージの利用可能なレジスタストレージ容量内に収容され得る2D配列が合計でより少ないことを意味する。一方、データ要素サイズが大きくなると、各ベクトルレジスタは、配列の第1の次元においてより少ないデータ要素を記憶することができ、したがって、配列の他の次元を収容するのにより少ないベクトルレジスタが必要とされ、これにより、より多くの数の別個の2D配列が利用可能なハードウェアストレージ容量内に収まることを可能にする。配列識別子と配列ストレージ領域との間の固定マッピングが使用された場合、各記憶領域は、最小データ要素サイズで2D配列を記憶するのに十分大きくなければならず、これは、より大きい要素サイズが使用されている場合にストレージ容量を浪費することになる。前述のように、配列識別子と配列ストレージ領域との間の可変マッピングを使用することによって、分割は、利用可能なレジスタ容量を完全に利用するように調整することができ、これは、より多くの配列がレジスタストレージ内に収まることができるとき、計算命令ごとに実行される(より遅い)ロード/ストア命令の数を低減することができるので、性能を改善するのに役立つことができる。
【0043】
一例では、2D配列レジスタストレージは、一定の数NAの配列ストレージ領域に論理的に分割されてもよく、NAは、現在のデータ要素サイズEに応じて変化してもよく、NAは、Eが増加するにつれて増加する。通常(ベクトル処理では)、データ要素サイズが増加するにつれてパーティションの数が減少することが想定されるので、この関係は反直感的なものに見え得る。しかしながら、2D配列処理では、第1の次元における単一のレジスタ内に収まる要素の数は、要素サイズEが増加するにつれて減少するが、要素がベクトルレジスタにわたってストライピングされる第2の次元では、各要素は、その要素サイズにかかわらず単一のベクトルレジスタを必要とし、したがって、第2の次元における単一の2D配列に使用されるベクトルレジスタの数は、実際には、要素サイズが増加するにつれて減少する。したがって、一定の量の物理ストレージに収まることができる配列ストレージ領域の総数(NA)は、要素サイズが増加するにつれて増加することができる。
【0044】
より小さい要素サイズでは、より大きい要素サイズよりも区別する配列ストレージ領域が少ないので、データ転送命令によってエンコードされた配列識別子も、現在のデータ要素サイズEに依存する可変の数のビットを有することができる。しかしながら、配列識別子に必要なビット数は、先に論じたイミディエート値の関係と比較して、現在のデータ要素サイズEと逆の関係を有し得る。配列識別子は、より小さいデータ要素サイズよりもより大きいデータ要素サイズにおいてより多くのビット数を有し得、一方、イミディエート値は、より大きいデータ要素サイズよりもより小さいデータ要素サイズにおいてより多くのビット数を有し得る。
【0045】
よって、データ転送命令のいくつかの実装形態は、命令エンコード内の2つの別個の非共有フィールドを用いて配列識別子とイミディエート値をエンコードすることができるが、1つの特に効率的なエンコードは、データ転送命令の命令エンコードのビットの共有部分を使用して配列識別子とイミディエート値がエンコードされることであり得る。その共有部分内の所与のビットに対して、命令デコード回路構成は、データ転送命令について指定された現在のデータ要素サイズEに応じて、所与のビットが配列識別子の指示部分として解釈されるか、それともイミディエート値の指示部分として解釈されるかを変化させる。これは、配列識別子とイミディエート値との両方を表すために必要とされるビットの総数を低減するのに役立ち、命令エンコードの他のビットを他の目的のために解放することができる。これは、エンコード空間は一般的に貴重であるので、ISA設計では非常に有益であり得る。
【0046】
いくつかの例では、配列識別子とイミディエート値をエンコードするために使用されるデータ転送命令の命令エンコードのビットの総数は、現在のデータ要素サイズEにかかわらず一定であり得る。
【0047】
いくつかの例では、データ転送命令は、レジスタアドレス指定情報と、メモリのターゲット部分を識別するためのメモリアドレス指定情報とを指定するロード/ストア命令であり得、そのデータ転送動作は、レジスタストレージのターゲット部分とメモリのターゲット部分との間でデータを転送することを含む。この場合、メモリアドレス指定情報は、任意の既知のメモリアドレス指定モードに従って定義され得る(例えば、ベースレジスタとオフセットレジスタ、又はベースレジスタとイミディエート値を使用して、アクセスされるメモリアドレス(単数又は複数)を定義する)。
【0048】
また、データ転送命令は、レジスタアドレス指定情報と、レジスタストレージの更なる部分を識別するための更なるレジスタアドレス指定情報とを指定するレジスタ移動命令であってもよく、データ転送動作は、レジスタストレージのターゲット部分とレジスタストレージの更なる部分との間でデータを転送することを含んでもよい。この場合、レジスタストレージのターゲット部分は、前述のようにベースレジスタ識別子を使用して識別され得るが、更なるアドレス指定情報は、ベースレジスタ識別子を含む必要はない。例えば、更なるアドレス指定情報は、単に、レジスタストレージの更なる部分としてアクセスされるレジスタを直接指定するレジスタ識別子であってもよい。例えば、レジスタストレージのターゲット部分が前述の2D配列レジスタストレージの一部分である例では、レジスタストレージの更なる部分はベクトルレジスタであり得る。
【0049】
よって、データ転送命令は、レジスタストレージとメモリとの間でのデータ転送、又はレジスタストレージのそれぞれの部分間でのデータ転送に使用することができる。いくつかのISAは、レジスタアドレス指定情報の一部としてベースレジスタ識別子とイミディエート値を使用するロード/ストア命令及びレジスタ移動命令のうちの1つのみをサポートすることができる(他のタイプの命令は、ベースレジスタ識別子とイミディエートをベースとするアドレス指定を使用しない)。他のISAは、ベースレジスタ識別子とイミディエート値を含むレジスタアドレス指定情報を使用するロード/ストア命令とレジスタ移動命令との両方をサポートすることができる。
【0050】
ベースレジスタ識別子とイミディエート値を含むレジスタアドレス指定情報を含むデータ転送命令は、命令デコード回路構成及び処理回路構成によって実装されるISAにおいてサポートされる唯一のタイプのデータ転送命令ではない場合があることが理解されるであろう。データ転送においてアクセスすべきレジスタストレージの一部分を選択するために使用されるインデックスの定義に、ベースレジスタ識別子とイミディエート値を使用しない他のタイプのデータ転送命令もあり得る。
【0051】
レジスタアドレス指定情報に識別されるベースレジスタは、スカラレジスタであり得る。スカラレジスタは、(各データ要素が別個のデータ値を表す複数の独立したデータ要素に分割され得るベクトルレジスタとは対照的に)単一のデータ値を記憶するように意図されたレジスタである。
【0052】
いくつかの実装形態では、スカラレジスタは、命令による選択に利用可能なスカラレジスタの特定のプールの中から選択され得る。例えば、スカラ計算命令は、命令のソース又は宛先レジスタとして、命令のオペランド又は命令の結果を記憶する特定のスカラレジスタを指定するためのKビットスカラレジスタフィールドを有することができる。Kビットスカラレジスタフィールドを用いると、これは、システムが2K個の異なるスカラレジスタをサポートすることを可能にし得る。
【0053】
いくつかの実装形態では、ISAにおいてサポートされる別個のスカラレジスタの数が2Kである場合、サポートされるスカラレジスタのどれでもベースレジスタとして選択され得るように、レジスタアドレス指定情報のベースレジスタフィールドに使用されるビットの数はKビットであり得る。
【0054】
しかしながら、他の例では、データ転送命令は、Lビットスカラレジスタフィールドを使用してベースレジスタを指定することができ、少なくとも1つのスカラ計算命令のソース又は宛先レジスタとして指定可能な少なくとも1つのスカラレジスタは、データ転送命令用のレジスタアドレス指定情報のベースレジスタとして指定することが不可能であるように、L<Kである。すなわち、ベースレジスタフィールドは、アーキテクチャにおいてサポートされる任意のスカラレジスタの選択を可能にするのに必要とされるビット数よりも短い圧縮フィールドである。これは、他の目的のために命令エンコードのビットを解放するのに役立つことができる。実際には、スカラレジスタの限られたサブセットからベースレジスタが選択されるように制限することは、行列処理などのアプリケーションの想定されるユースケースを扱うのに十分であり得る。
【0055】
命令デコード回路構成は、2D配列生成計算命令をサポートすることができ、それに応じて、命令デコード回路構成は、2D配列レジスタストレージに書き込まれるべき結果値の2D配列を生成する計算動作を実行するように処理回路構成を制御する。結果値の2D配列は、2D配列生成計算命令の単一のインスタンスに応じて生成され得る。単一の命令に応じて値の2D配列を生成するのをサポートすることができるシステムでは、処理スループットは、ベクトル処理が一度にデータの単一の1D配列を処理するのに使用される実装形態よりもはるかに大きい可能性がある。これは、上述のように、機械学習や信号処理などのアプリケーションに特に有用であり得る。例えば、計算演算は、計算の入力オペランドがデータの2D配列であり、結果が、2D配列オペランドによって表される行列を乗算した結果を表す2D配列である行列乗算演算であってもよい。しかしながら、他の例では、計算演算は、第1と第2のベクトルオペランドに対して実行されて結果値の2D配列を生成する外積演算を含み得る。ハードウェアにおいて、外積演算を実行することは、完全行列乗算を実行することよりも簡単であり得る。外積演算のシーケンスの結果を累算することにより、行列乗算と等価な結果を生成することができる。よって、計算命令は、2つのベクトルの外積を生成するだけでなく、結果として得られた要素を(例えば、上述のレジスタストレージの2D配列ストレージ領域のうちの1つに記憶された)要素のアキュムレータ2D配列に加算する外積及び累算命令であってもよい。上述のタイプのデータ転送命令は、2D配列レジスタの要素の個々の水平/垂直グループへの効率的なアクセスを可能にするので、このような2D配列生成計算命令をサポートするシステムに特に有用である。データ転送命令のエンコードは、スケーラブル配列サイズに動的に適応することが依然として可能でありながら、このようなアクセスがコンパイラによってアンローリングされ、スケジューリングされることを可能にする。
【0056】
上述の技法は、上述の命令デコーダ及び処理回路構成を実装するために設けられたハードウェア回路構成を有するデータ処理装置内で実装されてもよい。
【0057】
しかしながら、同じ技法はまた、ホストデータ処理装置上で実行されてターゲットコードの実行のための命令実行環境を提供するコンピュータプログラムで実装されてもよい。このようなコンピュータプログラムは、ホストデータ処理装置自体がそのアーキテクチャをサポートしていなくても、ホストデータ処理装置を制御して、特定のISAに従ってターゲットコードを実際にサポートするターゲットデータ処理装置上に提供されるはずのアーキテクチャ環境をシミュレーションさせることができる。このようなシミュレーションプログラムは、例えば、1つのISAに対して書かれたレガシーコードが、異なるISAをサポートするホストプロセス上で実行されているときに有用である。また、シミュレーションされた実行環境上でソフトウェアを実行することにより、新しいアーキテクチャをサポートするハードウェアの進行中の開発と並行してソフトウェアのテストを可能にすることができるため、シミュレーションは、新しいアーキテクチャバージョンをサポートする処理ハードウェアが用意される前に、ISAの新しいバージョンのソフトウェア開発を開始することを可能にすることができる。シミュレーションプログラムは、非一時的なストレージ媒体であり得るストレージ媒体に記憶されてもよい。
【0058】
よって、コンピュータプログラムは、ターゲットコードのプログラム命令をデコードして、プログラム命令に応じてデータ処理を実行するようにホストデータ処理装置を制御する(例えば、ターゲットコードの各命令を、同等の機能性を実行するホストのネイティブ命令セット内の1つ以上のの命令のシーケンスにマッピングする)命令デコードプログラムロジックを含むことができる。また、コンピュータプログラムは、シミュレーションされているターゲットISAのレジスタストレージをエミュレーションするために、ターゲットISAを実際にサポートするプロセッサ内のハードウェアに提供されることが想定される、ホストデータ処理装置のホストストレージ内(例えば、ホストのレジスタ又はメモリ内)にデータ構造を維持するレジスタエミュレーティングプログラムロジックを有することができる。
【0059】
このような実装形態では、命令デコードプログラムロジックは、上述のものと同じレジスタアドレス指定情報を有するデータ転送命令をサポートすることができるが、この場合、レジスタアドレス指定情報に基づくレジスタストレージへの参照は、レジスタエミュレーティングデータ構造によって、ホストストレージに記憶されたレジスタエミュレーティングデータ構造の対応するロケーションにマッピングされる。よって、ベースレジスタ識別子とイミディエート値は、ターゲット処理装置上でのその実行が、ホスト装置上でシミュレーションされているデータ転送命令のデータ転送において、エミュレーションされたレジスタのどの部分がアクセスされるべきかを識別するために使用され得る。
【0060】
図1は、データ処理装置20の例を概略的に示す。データ処理装置は、いくつかのパイプラインステージを含む処理パイプライン24を有する。この例では、パイプラインステージは、命令キャッシュ28から命令をフェッチするためのフェッチステージ26と、フェッチされたプログラム命令をデコードして、パイプラインの残りのステージによって処理されるマイクロ演算を生成するためのデコードステージ30(命令デコード回路構成)と、マイクロ演算に必要なオペランドがレジスタファイル34内で利用可能であるかどうかをチェックし、所与のマイクロ演算に必要なオペランドが利用可能になると、実行のためのマイクロ演算を発行する発行ステージ32と、レジスタファイル34から読み出されたオペランドを処理することによって、マイクロ演算に対応するデータ処理演算を実行して、結果値を生成するための実行ステージ36(処理回路構成)と、処理の結果をレジスタファイル34に書き戻すためのライトバックステージ38とを含む。これは、可能なパイプラインアーキテクチャの単なる一例にすぎず、他のシステムは追加のステージ又は異なる構成のステージを有してもよいことが理解されるであろう。例えば、アウトオブオーダプロセッサでは、プログラム命令又はマイクロ演算によって指定されたアーキテクチャレジスタを、レジスタファイル34内の物理レジスタを識別する物理レジスタ指定子にマッピングするためのレジスタリネーミングステージを含めることができる。
【0061】
実行ステージ36は、異なるクラスの処理演算を実行するためのいくつかの処理ユニットを含む。例えば、実行ユニットは、レジスタ34から読み出されたスカラオペランドに対して算術又は論理演算を実行するためのスカラ算術/ロジックユニット(Arithmetic/Logic Unit、ALU)40と、浮動小数点値に対して演算を実行するための浮動小数点ユニット42と、分岐動作の結果を評価し、それに応じて現在の実行時点を表すプログラムカウンタを調整するための分岐ユニット44と、行列処理のための行列処理ユニット46(これについては以下でより詳細に説明する)と、ロード/ストア動作を実行して、メモリシステム50、52、54内のデータにアクセスするためのロード/ストアユニット48と、を含み得る。
【0062】
この例では、メモリシステムは、レベル1データキャッシュ50、共有レベル2キャッシュ52、及びメインシステムメモリ54を含む。これは可能なメモリ階層の一例にすぎず、キャッシュの他の配置を提供することができることが理解されるであろう。実行ステージ36に示される特定のタイプの処理ユニット40から48は単なる一例であり、他の実装形態は、異なるセットの処理ユニットを有してもよく、又は同じタイプの複数のマイクロ演算を並列に処理できるように同じタイプの処理ユニットの複数のインスタンスを含んでもよい。
図1は、可能なプロセッサパイプラインアーキテクチャのいくつかの構成要素の簡素化された表現にすぎず、プロセッサは、簡潔にするために図示していない多くの他の要素を含むことができることが理解されるであろう。
【0063】
いくつかの実装形態では、データ処理装置20は、各々が
図1のCPU60のうちの1つについて示されたものと同様の処理パイプライン24を有する複数のCPU(中央処理装置、又はプロセッサコア)60を備えているマルチプロセッサ装置であってもよい。また、装置20は、少なくとも1つのグラフィックス処理ユニット(Graphics Processing Unit、GPU)62、及び/又はメモリ54にアクセスするために使用されるインターコネクト66を介して互いに及びCPUと通信することができる他のマスタデバイス64を含むことができる。
【0064】
行列処理演算をサポートするための一手法は、所与の行列処理演算の個々の乗算を、所与のCPU60の処理パイプライン24上で処理することができる別個のスカラ整数命令又は浮動小数点命令に分解することであり得る。しかしながら、これは比較的に時間がかかることがある。
【0065】
行列処理を加速するための別の手法は、インターコネクト66に接続されたデバイス64のうちの1つとして、行列演算を扱うために設計された専用ハードウェアを有するハードウェアアクセラレータを提供することであり得る。このようなハードウェアアクセラレータと相互作用するために、CPU24は、ロード/ストアユニット48を使用してロード/ストア命令を実行して、ハードウェアアクセラレータによってメモリから読み出される行列オペランドを定義し、オペランドに適用される処理演算を定義する構成データを、メモリ54(ハードウェアアクセラレータ内のメモリマップドレジスタ)に書き込む。ハードウェアアクセラレータが行列処理を実行し終えると、次いで、CPU60は、ハードウェアアクセラレータ内のレジスタにマッピングされたアドレスを指定するロード命令を使用して、ハードウェアアクセラレータから行列処理の結果を読み戻すことができる。この手法は、パイプライン内で整数演算を使用するよりも高速であり得るが、それにもかかわらず、汎用プロセッサ60とハードウェアアクセラレータ64との間で情報を転送するためにロード/ストア機構を使用することに関連するオーバーヘッドが存在する可能性があり、また、ハードウェアアクセラレータ手法は、同じ処理システム上で実行されている異なる仮想マシンがハードウェアアクセラレータへのアクセスを共有する必要があるときに課題を引き起こす可能性がある。したがって、この手法は、いくつかの仮想マシンを有する仮想化実装形態では十分にスケーリングすることができない場合がある。
【0066】
したがって、
図1に示すように、所与のCPU60の通常処理パイプライン24内に、(ALU40又は浮動小数点ユニット42を使用して通常の整数又は浮動小数点算術演算を制御することと同様に)パイプラインのデコードステージ30によってデコードされた行列演算プログラム命令に応じて、行列処理を実行するように制御可能な行列処理回路構成46を設けることが可能である。これにより、CPU60とハードウェアアクセラレータとの間でデータを後方及び前方に転送する必要がなくなり、多数の異なる仮想マシンが行列演算を実行できるようにすることがはるかに簡単になる。
【0067】
図1は、いくつかのCPU60を有するマルチプロセッサ装置20を示しているが、これは必須ではなく、行列処理回路構成46をシングルコアシステムに実装することもできる。
【0068】
図1の例では、行列処理機能性はCPU60自体の中に提供されている。
【0069】
図2A~
図2Dは、各CPU60自体が行列処理機能性を有していないが、インターコネクト66を介してCPU60に接続されたコプロセッサ70において行列処理がサポートされているデータ処理装置の第2の例を示している。この手法は、コプロセッサ70において行列処理をサポートするために使用されるハードウェアリソースがCPU60の間で共有され得るので、行列処理機能性を実行するハードウェアコストを低減するのに有用であり得る。コプロセッサ70が、CPU60自体によって使用されるアドレス変換データに対応するアドレス変換データを使用してメモリにアクセスすることを可能にするために、メモリ管理ユニット(Memory Management Unit、MMU)72は、
図2Aに示すように、CPU60とコプロセッサ70との間で共有される別個のブロックとして、又は
図2Bに示すように、メモリ内のページテーブルの共通セットからアドレス変換データとともにロードされ得る、各CPU60及びコプロセッサ70が有するそれ自体のMMU72として提供され得る。簡潔にするために
図1には示していないが、その例では、CPU60が内部MMU72を有することも可能であることに留意されたい。また、いくつかの例では、コプロセッサロード/ストア動作に使用されるアドレスの変換が、CPU60内のMMUによって実行され、結果として得られる物理アドレスが、ロード/ストア命令とともにコプロセッサ70に渡されることが可能であろう。MMU72は、プログラム命令によって指定されるメモリアドレス指定情報に基づいて識別された仮想アドレスを、メモリ54内のアクセスすべきロケーションを識別する物理アドレスに変換する。MMU72はまた、プログラムコードが所与のメモリアドレスにアクセスすることを許可されるかどうかをチェックする許可チェックを実装し得る。
【0070】
図2Cは、
図2A/
図2Bの例におけるCPU60を示す。
図1の要素と同じである要素は、同じ参照番号で示されている。この例では、
図1に示すスカラ実行ユニット40、42、44は、スカラレジスタ80に記憶されたスカラオペランドに対して演算を実行するスカラ処理回路構成として集合的に参照される。実行ステージ36はまた、ベクトルレジスタ82に記憶されたベクトルオペランドに対してベクトル処理演算を実行するためのベクトル処理回路構成76を含む。ベクトル処理回路構成76及びベクトルレジスタ82は、
図1に示していないが、それらもまた、その例において提供され得る。
【0071】
図2A~
図2Dの例では、処理装置は、非行列処理モード又は行列処理モードのいずれかでのプログラムの処理をサポートする。非行列処理モードで処理される命令は、実行ステージ36内の処理ユニットによる実行のために、CPU60の発行ステージ32の発行回路構成85によって発行される。
【0072】
しかしながら、行列処理モードで処理される命令は、CPU60の発行ステージ32のコプロセッサインタフェース87によって、(
図2Dに示すように)コプロセッサ70内のキューマネージャ84に転送される。キューマネージャ84は、CPU60と同様の命令デコード回路構成30、発行回路構成32、実行ステージ36、及びライトバック回路構成38を備えているコプロセッサ70内のパイプラインに命令を渡すが、コプロセッサ70内のパイプラインは、CPU60と比較して、ISAの命令の異なるサブセットをサポートする可能性がある。例えば、コプロセッサ70は、行列処理に有用であると想定される演算をサポートしながら、コプロセッサの複雑さを制限するために、CPU60よりも制限された命令セットをサポートする可能性がある。
【0073】
この例におけるCPU60は、いかなる行列処理計算命令もサポートせず、その代わりに、行列処理計算命令は、コプロセッサ70内の行列処理実行ユニット86によってサポートされる。プログラムが現在、行列処理モードそれとも非行列処理モードで実行されているかどうかの選択は、行列処理モードを有効/無効にする特定のモード制御命令に基づいて行うことができる。
【0074】
行列処理をサポートするために、コプロセッサ70は、データの2D配列(行列)を記憶するように指定された行列レジスタ(2D配列レジスタ)88を有する。行列レジスタ88とメモリ54との間、又は行列レジスタ88と他のタイプのレジスタ(ベクトルレジスタ82など)との間で行列の部分を転送するデータ転送命令は、行列処理モードで実行するように制限される。
図1には示していないが、CPU自体が行列処理をサポートする実施形態では、CPU60は同様に、そのレジスタ34内に行列レジスタ88を有することができる。
【0075】
コプロセッサ70内のベクトルレジスタ82のベクトル長は、CPU60内のベクトルレジスタ82のベクトル長と同じでなくてもよい。行列処理演算は、(より大きいデータスループットを可能にする)より大きいベクトル長でより効率的であり得るので、場合によっては、プロセッサ設計者は、CPU60内のベクトルレジスタ82に使用されるベクトル長VL1よりも長いベクトル長VL2をベクトルレジスタ82(及びコプロセッサの行列レジスタ88を提供するために使用されるベクトルレジスタ)に選択することを望む場合がある。にもかかわらず、ISAは、非行列処理モード及び行列処理モードに対して可変ベクトル長VL1、VL2をサポートすることができ、それらの両方は、ISAによってサポートされるベクトル長の範囲の中から所与のハードウェア実装形態に対して選択され得る(場合によっては、VL1としての選択に利用可能な範囲は、VL2としての選択に利用可能な範囲と同じでないことがあるが、範囲が重複することがある。したがって、特定の実装形態がVL1=VL2を選択することは可能であり得る)。ベクトル制御レジスタ(ZCR、ZCR’)81、81’は、非行列処理モード及び行列処理モードのそれぞれで使用されるそれぞれのベクトル長VL1、VL2を示すためにCPU60内に設けられてもよい。
【0076】
ISAに従って定義されるプログラムコードは、両方のハードウェア実装形態(
図1のCPU60内で実装される行列処理、又は
図2A~2Dのコプロセッサ例のいずれか)上で同等に機能し得る。
図1に示すような実装形態上で実行される場合、モード選択命令は、非動作命令として扱われてもよく、任意のベクトルレジスタに対して実装されるベクトル長は、(同じレジスタが両方のモードで使用されるので)両方のモードで同じであってもよいことであり得る。
図2A~
図2Dに示すような実装形態上で実行される場合、モード選択命令は、命令が実行のためにコプロセッサに転送されるべきであることをシグナリングすることができ、そして2つのモードにおいて異なるベクトル長VL1、VL2をサポートすることが有用であり得る。いずれにしても、ソフトウェア開発者の視点から、行列処理は、レジスタに記憶されたオペランドに作用し、レジスタに書き戻される結果を生成するレジスタ間演算を定義する通常のCPU命令(計算/算術命令)に応じて行列処理ロジック46、86によって実行され、これは、行列処理を実装するのに特殊なソフトウェアドライバを必要とし得る、ロード/ストア命令に基づいて制御されるハードウェアプロセッサを使用して行列処理を実行する実装形態よりも、行列処理の制御をはるかに簡単にする。もちろん、行列処理を実行するレジスタ間計算命令用のISAサポートを有するCPU60又はコプロセッサを備えているシステムであっても、ロード/ストア命令を使用してインターコネクト66を介してアクセス可能な専用ハードウェアアクセラレータをデバイス64として提供して、ISAのレジスタ間計算命令ではサポートされない行列処理の形態に追加のサポートを提供することが依然として可能である。しかし、このようなハードウェアアクセラレータは必須ではない。
【0077】
図3は、結果行列Cを生成する第1の行列Aと第2の行列Bとの間の行列乗算の例を示す。この例では、行列は、特定の例ではすべて4×4次元の正方行列であるが、これは必須ではない。Aがm×n行列であり、Bがn×p行列である行列乗算演算C=ABの場合、Cはm×p行列であり、Cの位置(i,j)における所与の要素は、行列Aのi
th(i番目)の行及び行列Bのj
th(j番目)の列の要素のペアワイズ積を加算した結果に対応し、その結果、結果行列の所与の要素c
ijは、
【0078】
【0079】
図3の右側に示すように、一連の外積演算を実行することによって等価な結果を生成することが可能である。対照的に、外積演算は、各々が要素の1次元配列を含む第1のベクトルオペランドu=(u
1,u
2,...,u
m)及び第2のベクトルオペランドv=(v
1,v
2,...,v
n)を取り、これらを組み合わせて2次元結果行列Wを形成し、
【0080】
【数2】
となる。よって、外積結果行列の各要素は、入力ベクトルオペランドの1つの要素と第2のベクトルオペランドの1つの要素との単一の積から導出される。
図3に示すように、行列Aの要素が(前述の行列乗算の場合のように行ではなく)列で読み出され、第2の行列Bの要素が(行列乗算の場合に行われるように列ではなく)行で読み出される場合、行列Aのi
th(i番目)の列と行列Bのi
th(i番目)の行に外積演算を実行し、i=1~nについての結果を累算すると、その結果は行列乗算演算の結果に等しくなる。行列乗算演算を別個の外積演算に分割することは、単一のプログラム命令に応じて計算される必要がある積及び加算の数を低減するのに有用であり得る。これは、より高速な動作であり、タイミングがプロセッサ内の他の動作のパイプラインタイミングに適合する回路ロジックを設計する際に、ハードウェアで設計することをより簡単にすることができる。いずれにしても、外積はまた、特定のアルゴリズムにとってそれ自体が重要な演算であり、したがって、行列乗算を実施する以外の目的に使用することができる。
【0081】
したがって、いくつかの例では、(
図1及び
図2A~
図2Dの例のいずれかにおける)処理回路構成の行列処理ユニット46、88は、外積演算を実行するために、
図4に示すような外積エンジンを備え得る。外積エンジンは、入力として、第1の述語値Paに関連付けられた第1のベクトルオペランドopaと、第2の述語値Pbに関連付けられた第2のベクトルオペランドopbを取る。外積エンジンによって出力される結果は、2D配列(行列)C’となる。結果行列は、2D配列を記憶するために提供される2D配列レジスタストレージ(例えば、
図1の例ではレジスタ34内にも提供される、
図2Dに示す行列レジスタ88)に記憶されてもよい。結果配列ストレージCの各要素に記憶された前の値は、
図4に示す式に従って所与の要素C’[i,j]が生成される外積及び累算演算を実行するように、演算への入力として働くこともでき、Pa[i].opa[i]は、opaの要素iがPaの要素iによって述語化することを示し、Pb[j].opb[j]は、opbの要素jがPaの要素jによって述語化することを示す。マージ述語を実行する外積命令の場合、述語要素Pa[i]又はPb[j]が非アクティブであると示されるとき、対応する要素C’[i,j]は、その前の値を保持する。非アクティブ述語要素Pa[i]又はPb[j]に対応する結果行列の要素C’[i,j]が0に設定され、その要素位置の前の値C[i,j]を上書きするゼロ述語を実装することも可能である。述語は、例えば、行列処理が行列構造の端に達し、そして処理すべき要素の数がハードウェアでサポートされる行列全体を満たすのに十分でないときに有用であり得る。
図4に示すような外積及び累算演算は、行列乗算演算をサポートするハードウェアサポートの実装形態を簡略化するので有用であり、累算は、各外積結果を別個に記憶し、次いで最終ステップとしてそれらを加算する必要がないことを意味する。しかしながら、
図4に示す外積エンジンは一例にすぎず、行列処理エンジン46、88の他の実装形態では、1つの命令でフル行列処理演算を実行するためのサポートを提供することが可能である。しかしながら、上述のように、実際には、外積演算の方が実施しやすいことがある。
【0082】
図5は、行列演算をサポートするためのCPU60又はコプロセッサのアーキテクチャレジスタ34の一例を示す。(ISAで定義されているような)アーキテクチャレジスタは、ALU40によって実行されるALU演算又はパイプラインで処理される他の命令用の汎用レジスタとして働くスカラ整数レジスタのセットを含むことができる。例えば、一定の数の汎用レジスタ、例えば、この例では31個のレジスタX0~X30が提供されてもよい(スカラレジスタフィールドの32
nd(32番目)のエンコードは、例えば、デフォルトで0の値を示すと見なされてもよく、又は汎用レジスタではなく専用タイプのレジスタであることを示すために使用されてもよいため、ハードウェア内に提供されるレジスタに対応しなくてもよい)。同じ物理ストレージにマッピングされた異なるサイズのスカラレジスタにアクセスすることが可能であり得る。例えば、レジスタラベルX0~X30は、64ビットレジスタを指してもよいが、同じレジスタが32ビットレジスタとしてアクセスされてもよく(例えば、ハードウェアで提供される各64ビットレジスタの下位32ビットを使用してアクセスされる)、その場合、レジスタラベルW0~W30は、同じレジスタを参照するためにアセンブラコードで使用されてもよい。
【0083】
また、デコーダ30によってサポートされる、ISA内のプログラム命令による選択に利用可能なアーキテクチャレジスタは、一定の数のベクトルレジスタ82(この例ではZ0~Z31とラベル付けされている)を含むことができる。もちろん、
図5に示すスカラ/ベクトルレジスタの数を提供することは必須ではなく、他の例は、プログラム命令によって指定可能な異なる数のレジスタを提供してもよい。各ベクトルレジスタは、各データ要素が独立したデータ値を表し得る可変の数のデータ要素を含むベクトルオペランドを記憶し得る。ベクトル処理(SIMD)命令に応じて、処理回路構成は、レジスタに記憶されたベクトルオペランドに対してベクトル処理を実行して、結果を生成し得る。例えば、ベクトル処理は、結果ベクトルの要素の対応する結果を生成するために、1つ以上ののオペランドベクトル内の要素の各レーンに対して対応する演算が実行される、レーンごとの演算を含み得る。ベクトル又はSIMD処理を実行するとき、各ベクトルレジスタは、一定のベクトル長VLを有してもよく、ベクトル長は、所与のベクトルレジスタ内のビット数を指す(例えば、ベクトル命令のベクトル長VLは、
図2A~
図2Dに関して前述した第1のベクトル長VL1であってもよい)。ベクトル処理モードで使用されるベクトル長VLは、所与のハードウェア実装形態に対して固定されてもよく、又は可変であってもよい。CPU60によってサポートされるISAは、異なるプロセッサ実装形態が異なるサイズのベクトルレジスタを実装することを選択し得るように、可変ベクトル長をサポートし得るが、ISAは、そのプログラムを実行する所与のCPU上で実装されている特定のベクトル長にかかわらずコードが正しく機能し得るように命令が設計されるように、ベクトル長アグノスティックであり得る。例えば、ベクトル処理命令に使用される特定のベクトル長VLを示す値を記憶する制御レジスタ(例えば、ZCR81)があってもよい。このレジスタは、より長いベクトル長を有する実装形態が、より短いベクトル長を有する実装形態よりも少ないループの反復において所与の数の要素を処理し得るように、一定の数の要素の処理を通じて反復するループを制御するために、ソフトウェアによって読み取られることができる。
【0084】
ベクトルレジスタZ0~Z31は、
図4に関して上述したように、外積エンジン48、86によって実行される外積演算への入力を提供するベクトルオペランドを記憶するためのオペランドレジスタとしても機能し得る。ベクトルレジスタが外積演算又は他の行列演算への入力を提供するために使用されるとき、ベクトルレジスタは、行列ベクトル長MVLを有するようになり、このMVLは、ベクトル演算に使用されるベクトル長VLと同じであってもよく、又は異なるベクトル長(例えば、VL1の代わりに、コプロセッサ70を使用する実施形態におけるモード機能性について上述したVL2)であってもよい。SIMD演算及び行列演算用の異なるベクトル長をサポートするためにISAレベルでアーキテクチャサポートを提供することによって、これは、プロセッサマイクロアーキテクトが、上述のようにコプロセッサ70を使用して行列演算を実行するオプションを含む異なる物理的実装形態を選択するためのより多くの柔軟性を提供することができる。ISAは、プロセッサが行列処理モードで動作しているか、それとも非行列処理モードで動作しているかを選択することができるモード選択命令をサポートすることができ、これは、実装された場合にコプロセッサに処理をオフロードするようにCPUを構成するのに有用であり得る。この場合、モード選択命令は、他の機能の中でもとりわけ、実装されている現在のベクトル長の切り替えをトリガし、現在のモードに応じてVL及びMVLのうちの1つを選択することもできる。ベクトル制御レジスタ81、81’は、それぞれのモードに対してVL及びMVLとして使用される特定のベクトル長を示すために提供されてもよい。
【0085】
よって、一般に、後続の例について説明するベクトル長MVLは、行列処理モードで使用されるベクトル長であり、他のモードで使用されるベクトル長VLと同じであってもなくてもよい。制御レジスタは、プログラムループを制御するためにソフトウェアに利用可能にされ得る、現在のプロセッサ実装形態の行列ベクトル長MVLを示す値を記憶してもよい。
【0086】
図5に示すように、アーキテクチャレジスタはまた、一定の数N
Aの配列レジスタ88、ZA0~ZA(N
A-1)を含む。各配列レジスタは、データの単一の2D配列、例えば上述の外積演算の結果を記憶するためのレジスタストレージのセットと見なすことができる。しかしながら、外積演算は、配列レジスタを使用することができる唯一の演算ではない場合がある。配列レジスタは、メモリ内の行列構造の行/列方向の転置を実行する際に、配列を記憶するために使用することもできる。プログラム命令が配列レジスタ88のうちの1つを参照するとき、それは、配列識別子ZAiを使用して単一のエンティティとして参照されるが、いくつかのタイプの命令(例えば、データ転送命令)は、配列の一部(例えば、要素の1つの水平/垂直グループ)を選択するインデックス値を定義することによって配列のサブ部分を選択することもできる。
【0087】
図5は、ソフトウェアから見た配列レジスタのアーキテクチャ図を示す。しかしながら、
図6に示すように、実際には、配列レジスタに対応するレジスタストレージの物理的実装形態は、一定の数N
RのベクトルレジスタZAR0~ZAR(N
R-1)を含むことができる。配列レジスタストレージ88を形成するベクトルレジスタZARは、SIMD処理や行列処理へのベクトル入力に使用されるベクトルレジスタZ0~Z31とは別個のレジスタセットであり得る。ベクトルレジスタZARの各々は、行列ベクトル長MVLを有し得、したがって、各ベクトルレジスタZARは、可変の数のデータ要素に論理的に分割され得る長さMVLの1Dベクトルを記憶し得る。例えば、MVLが512ビットである場合、これは、例えば、64個の8ビット要素、32個の16ビット要素、16個の32ビット要素、8個の64ビット要素、又は4個の128ビット要素のセットであり得る。これらのオプションのすべてが所与の実装形態においてサポートされる必要があるわけではないことが理解されるであろう。可変要素サイズをサポートすることによって、これは、異なる精度のデータ構造を伴う計算処理の柔軟性を提供する。データの2D配列を表すために、ベクトルレジスタZAR0~ZAR(N
R-1)のグループは、配列レジスタ識別子ZA0~ZA(N
A-1)のうちの所与の1つを割り当てられた単一のエンティティとして論理的に考えることができ、したがって、2D配列は、配列の1つの次元に対応する単一のベクトルレジスタ内に展開する要素と、複数のベクトルレジスタにわたってストライピングされる配列の他の次元の要素とで形成される。
【0088】
配列レジスタZAが、水平方向の要素の数が垂直方向の要素の数に等しいデータの正方配列を記憶するように、行列処理回路構成46、86を実装することは、必須ではないが有用であり得る。これは、配列レジスタ88を水平方向又は垂直方向のいずれかで読み出す/書き込むことにサポートを提供することによって、メモリ内の行列構造の行/列次元が、配列レジスタ88とメモリ54との間で行列を転送する際に切り替えられ得る、行列のオンザフライ転置をサポートするのに役立ち得る。機械学習アルゴリズムや行列データを処理する他のアプリケーションが、上述したように、行優先フォーマット又は列優先フォーマットのいずれかでメモリに記憶されたデータを表すことは一般的であり、いくつかのアルゴリズムは、フォーマットの混合でデータを処理する必要があり得る。以前の技法では、何らかの処理が、入力データがメモリ内のそのレイアウトとは異なるフォーマットであることを必要とする場合、フォーマットの一貫性を保証するために、データが行列処理演算において処理され得る前に、いくつかのロード/ストア命令又はベクトル置換命令を使用して、メモリ内に記憶されたデータの何らかの再配置を必要とし得る。これらの動作は時間がかかることがある。水平方向又は垂直方向のいずれかで2D配列レジスタからデータを書き込む/読み出すことにサポートを提供することによって、これは、メモリとベクトルレジスタとの間でデータを転送するためのいくつかのギャザ/スキャッタロード/ストア又は置換動作を用いて可能であるよりも高速に、一方向(例えば、行毎)にメモリからロードされたデータが、反対方向(例えば、列毎)にメモリに書き戻されることを可能にすることができる。
【0089】
よって、配列レジスタZA88が、各々が対応する2D配列の1つの水平/垂直要素グループを記憶するベクトルレジスタZARのセットとして実装されているとき、正方行列の制約条件が満たされることを保証するために、配列が、1つのベクトルレジスタ内に収まるデータ要素の数に等しいベクトルレジスタの数にまたがることが望ましい場合がある。上述のように可変データ要素サイズをサポートするとき、1つのベクトルレジスタ内に収まることができるデータ要素の数は可変であり、したがって、単一の配列レジスタZAを形成するように、ともにグループ化されるベクトルレジスタの数も可変であり得る。
【0090】
1つの手法は、(命令内で配列レジスタIDを指定することによってアーキテクチャレジスタとしてアクセス可能な)各配列レジスタZAが、サポートされる最小データ要素サイズで1つのベクトルレジスタ内に収まることができるデータ要素の最大数に対応する一定の数のベクトルレジスタに対応することができることであり得る。しかしながら、この場合、配列レジスタが物理ベクトルレジスタストレージ上に固定的にマッピングされているため、データ要素サイズがより大きく、より少ないデータ要素が1つのベクトルレジスタ内に収まるとき、特定の配列レジスタ識別子にマッピングされたベクトルレジスタの固定セットのうちのいくつかは、配列次元が縮小するにつれて事実上無駄になる。
【0091】
したがって、より効率的な実装形態は、配列レジスタの数NAがデータ要素サイズEに応じて可変であることであり得、その結果、配列レジスタZAを実装するために使用される物理レジスタストレージZAR0~ZAR(NR-1)を、データ要素サイズEに応じて異なるサイズグループに論理的に分割することができ、これにより、データ要素サイズにかかわらず利用可能な物理ストレージを完全に利用することができる。これは、所与の配列レジスタ識別子ZA0-ZA(NA-1)によって参照される実際の物理記憶領域は、常に同じではなく、所与の演算に使用される現在のデータ要素サイズEに応じて変化することを意味する。
【0092】
図7~
図11は、物理ストレージが、配列レジスタZA0~ZA(N
A-1)のアーキテクチャレジスタ指定子を使用して分割され、参照され得る異なる方法を示す。
図7~
図11の例では、行列ベクトル長MVLが512ビットであると仮定されているが、他の実装形態は異なる行列ベクトル長を使用することができ、この場合、サポートされる特定の数の配列レジスタZA、又は所与の配列レジスタにマッピングされているベクトルレジスタZARの特定のグルーピングは変化し得ることが理解されるであろう。また、この例は、配列(行列)レジスタ88に提供されるベクトルレジスタZARの総数が64であると仮定するが、この場合も、これは、ISAの他の実装形態において変更することができる。
【0093】
図7は、現在のデータ要素サイズEが32ビットであるときの配列レジスタストレージの分割を示す。この場合、512ビットのベクトルレジスタを用いて、単一のベクトルレジスタ内に各々のサイズが32ビットの要素を16個収めることが可能である。したがって、正方形の2D配列を表すために、16個のベクトルレジスタがともにグループ化されて、配列レジスタ識別子ZA0~ZA(N
A-1)の所与の値によって識別される単一の16×16個の2D配列を表すことができる。例えば、配列レジスタID ZA0の場合、これは、配列ZA0の要素の0
th(0番目)から15
th(15番目)の水平グループをそれぞれ記憶することができるベクトルレジスタZAR0~ZAR15にマッピングされ、要素のi
th(i番目)の垂直グループは、ベクトルレジスタZAR0~ZAR15の各々内の位置iにおける要素のセットにわたってストライピングされる(代替的に、他の実装形態は、単一のベクトルレジスタZAR内に要素の垂直グループを配置し、複数のベクトルレジスタZARの対応する要素位置にわたって要素の水平グループをストライピングすることができる)。
【0094】
16個のベクトルレジスタZRは、32ビット要素の16×16タイルを表すのに十分であり、全部で64個のベクトルレジスタがあるので、これは、4個の別個の16×16配列が、利用可能な64個のベクトルレジスタ内に記憶され得ることを意味し、したがって、32ビット要素サイズの場合、サポートされる配列レジスタの数NAは4である。すなわち、物理ストレージは、配列識別子ZA0~ZA3でラベル付けされた4つの16個のベクトルレジスタを含むグループに分割され、配列識別子ZA0~ZA3は、配列ストレージレジスタとメモリとの間でデータを転送するデータ転送命令によって識別することができる。
【0095】
図7の左側に示すように、4つの別個の2D配列ZA0~ZA3を配列レジスタ88に同時に記憶することが可能であるので、これは、所与の量の行列データを処理することに関連するロード/ストアオーバーヘッドのいくらかの償却を可能にする。例えば、4つの別個の出力タイルZA0~ZA3は、4つのベクトルオペランドの異なる組み合わせから生成することができる(例えば、
図7に示すように、opa0、opb0の外積に基づくZA0、opa0、opb1の外積に基づくZA1、opa1、opb0の外積に基づくZA2、及びopa1、opb1の外積に基づくZA3)。行列処理アルゴリズムは、同じ入力ベクトルを多くの他の入力ベクトルと組み合わせて再使用し得、したがって、ベクトルレジスタ(Z0~Z31のうちの1つ)に記憶された入力ベクトルの同じインスタンスから複数の外積結果が計算されることを可能にして、ベクトルをロードすることに関連するロードオーバーヘッドをより多くの回数の計算動作の間で共有し、ロードごとに達成される乗算の有効な回数を増加させ、このことが生成される個々の結果タイルZAごとに入力オペランドopa、opbの対を別個にロードすることと比較して性能を改善するのに役立ち得るので、これは有用であり得る。
【0096】
図8は、現在のデータ要素サイズEが16ビットであるときの物理レジスタストレージの代替の分割を示し、これは、32個の要素が1つの512ビットベクトルレジスタ(この例ではMVLサイズ)内に収まり、したがって、32個のベクトルレジスタの2つのグループZAR0~ZAR31及びZAR32~ZAR63がそれぞれ、16ビット要素の32×32タイルを表す配列識別子ZA0、ZA1にマッピングされることを意味する。この手法を用いると、配列ストレージは、ベクトルレジスタ内のロードされたベクトルオペランドopa、opb0、opb1の単一のセットに基づいて2つの別個の外積演算を実行して、opaとopb0との外積及びopaとopb1との外積にそれぞれ基づいて2つの32×32タイルZA0、ZA1を生成することをサポートすることができる。よって、
図7と比較して、個々のタイル内の要素の数はより多い(16×16ではなく32×32)が、より少ないタイルが、所与のロードのセットに対して処理され得る。
【0097】
図9は、データ要素サイズが8ビットであり、したがって64個の要素が1つのベクトルレジスタ内に収まる別の構成を示し、これは、64個のベクトルレジスタZAR0~ZAR63のすべてがともにグループ化されて単一の2D配列ZA0を形成することを意味する。
図9は、ベクトルopa、opbに対して単一外積演算を実行して、8ビット要素の64×64配列ZA0を生成することを示す。しかしながら、いくつかの実装形態では、8ビット要素結果は、計算動作についてサポートされない場合があるが、配列レジスタとメモリ又はベクトルレジスタのいずれかとの間でデータを転送する配列ロード/ストアデータ転送又はレジスタ移動データ転送命令での使用、メモリ内のデータ構造に対して行/列方向を転置する際の使用に制限され得る。
【0098】
同様に、
図10及び
図11は、それぞれ64ビット及び128ビットのデータ要素サイズに対する配列ストレージの分割を示す。
【0099】
配列ストレージ88に設けられた他の行列ベクトル長MVL又は他の数NRのベクトルレジスタに対して、同様の分割を実行できることが理解されるであろう。
【0100】
外積演算を実行するように処理回路構成を制御する外積命令は、どのベクトルレジスタZ0~Z31が外積演算用の2つのベクトルオペランドを記憶するかを識別するベクトルレジスタ識別子を指定することができ、外積演算の結果で更新されるべきタイルを識別する宛先配列レジスタ識別子ZA0-ZA(NA-1)を指定することができる。プロセッサの行列処理ハードウェア48、86は、現在のデータ要素サイズE及び指定された配列レジスタ識別子ZAiに基づいて、上述のような可変マッピングに応じて、外積結果に基づいてどの物理ベクトルレジスタZARが更新されるべきかを決定することができる。
【0101】
ISAはまた、選択された配列レジスタZAiへ又はから2D配列の一部分を転送するための配列データ転送命令を定義し得る。ハードウェア回路ロジックの実装形態を簡単化し、任意の個々の命令に対して転送される必要があるデータの量を低減するために、所与のデータ転送命令が、1つの命令で2D配列全体を転送するのではなく、選択された配列レジスタZAi内の要素の単一の水平/垂直グループに作用することがより簡単であり得る。これはまた、命令が、データ転送命令のパラメータに応じて、水平方向それとも垂直方向に読み出し/書き込みを行うかを選択することができるので、前述のオンザフライ転置機能をサポートするのに役立つ。よって、選択された配列レジスタに加えて、データ転送命令は、要素のどの水平/垂直グループが転送されるべきかを識別するインデックスも識別することができる。
【0102】
図12は、配列データ転送命令の例示的なエンコードを示す。この例では、命令は、2D配列レジスタストレージZA88からメモリ54にデータを転送するためのストア命令である。また、メモリ54から配列レジスタストレージ88にデータをロードするためのロード命令である配列データ転送命令を提供することも可能であり、この命令は、
図12のストア命令について示したのと同じ方法で、そのメモリアドレス指定情報及びレジスタアドレス指定情報を指定する。
【0103】
図12の上部は、アセンブリコードで書かれたときの配列データ転送命令の例示的なシンタックスを示し、
図12の下部は、アセンブラ表現で指定された異なるパラメータを表すために割り振られた様々なビットフィールドを有する命令のバイナリエンコードを示す。
【0104】
図12の上部に示すように、データ転送命令は、以下を含むいくつかのパラメータを指定する。
・ データ転送に使用される配列レジスタストレージ88の一部分を識別するためのレジスタアドレス指定情報(オペランド)、
・ データのロード元、又はデータのストア先のメモリのターゲット領域を識別するためのメモリアドレス指定情報(オペランド)。
・ 述語によって示される非アクティブ要素に対応する要素位置について、(ストア命令の場合)メモリが更新されること又は(ロード命令の場合)レジスタストレージが更新されることを防止するために、配列のいくつかのデータ要素が無効にされ得るように、データ転送を制御するための述語値を提供する述語オペランド。配列内の要素の水平及び垂直グループにそれぞれ対応する2つの述語値Ph、Pvがある。
【0105】
メモリアドレス指定オペランドは、任意の既知のアドレス指定方式に従ってメモリ内の更新されるべきアドレスを識別することができる。例えば、メモリアドレス指定オペランドは、ロード/ストア動作のアドレスを導出するために使用されるスカラレジスタの1つ以上ののレジスタ識別子と、0個、1つ以上ののイミディエート値とを含むことができる。例えば、第1のスカラレジスタは、ベースアドレスを提供することができる。オフセット値は、第2のスカラレジスタに記憶された値によって、又は命令エンコードにおいて直接エンコードされたイミディエート値によって表すことができ、オフセットは、データ転送用のアドレスを生成するためにベースアドレスレジスタ内の値に加算される。場合によっては、メモリアドレス指定オペランドは、アドレス指定モードに関する他の情報を指定するための更なるオペランド、例えば、現在のロード/ストア命令のアドレスを計算する前にベースアドレスレジスタ内の値をインクリメントするか、それともアドレスを計算した後にベースアドレスレジスタ内の値をインクリメントするかを示すオペランドを含むこともできる。オペランドはまた、第2のレジスタ又はイミディエートによって表されるオフセットをベースレジスタ値に加算する前に、オフセットに適用されるべきシフト量を指定するパラメータを含むことができる。一般に、多種多様なメモリアドレス指定モードが当技術分野で周知されており、任意のこのような周知のアドレス指定モードを使用して、配列データ転送命令用のメモリアドレス指定オペランドを定義することができる。
【0106】
配列データ転送命令のレジスタアドレス指定オペランドはストア命令である場合、配列レジスタストレージ88のどの部分がメモリに転送されるべきかを識別する(ロード命令の場合、レジスタアドレス指定オペランドは、配列レジスタストレージ88のどの部分がロードされたデータで更新されるべきかを識別する)ために使用される。レジスタアドレス指定オペランドは、配列識別子(IDentifier、ID)ZAi(又はソフトウェアによって使用されるアセンブラ表現では「zai」)を含み、iは、現在のロード/ストア命令のために選択される特定のアーキテクチャ配列レジスタZA0~ZA(NA-1)の番号を表す。レジスタアドレス指定オペランドは、識別された配列レジスタZAiが水平方向にアクセスされるべきかそれとも垂直方向にアクセスされるべきかを示す方向識別子dも含む。レジスタアドレス指定オペランドはまた、現在の演算用の現在の要素サイズである要素サイズEの指示を含み、要素サイズEは、前述のようにいくつかの異なる要素サイズから選択され得る。また、レジスタアドレス指定オペランドは、データが転送されるべき選択された配列レジスタZAi内の要素の水平/垂直グループの位置を示す行/列インデックスJを生成するためのベースレジスタWxとイミディエート値#yとを含む。ベースレジスタ識別子Wxは、インデックスJを生成するために、データ転送命令の命令エンコード内で直接エンコードされたイミディエート値#yによって表されるオフセットに加算されるべきベース値を提供するスカラレジスタを識別する。この例では、インデックスJが、所与のベクトル長MVL及び要素サイズEに対してサポートされる要素位置の範囲内にあることを保証するために、インデックス値Jは、(Wx+#y内の値)MODULO(MVL/E)に設定される。モジュロ演算は、(Wx+#y内の値)を(MVL/E)で除算したときの剰余を求めることを指すが、実際には、MVL及びEは2のべき乗であるため、モジュロ演算は、dim=MVL/Eの場合、Jは(Wx+#yの値)の最下位log2(dim)ビットとなるので、単に和の下位ビットを返すことによって実施することができる。ベースレジスタとイミディエート値との組み合わせを使用して行/列インデックスを表すことによって、これは、行列構造の異なる次元にスケーリングすることができ、以下で更に説明するように、ループアンローリングをサポートするソフトウェアコードをサポートするのに有用である。
【0107】
この例では、インデックス値Jは、配列レジスタZAiに対する選択されたアクセス方向が水平方向であるかそれとも垂直方向であるかにかかわらず、同じように表される。方向識別子dは、選択された配列レジスタZAiに対応するベクトルレジスタZARのグループ内のどの特定の要素が読み出し/書き込みの対象であるかを選択する。例えば、方向識別子が水平方向を選択する場合、転送される要素は、ZAiに対応するグループ内のJth(J番目)のベクトルレジスタZARから読み出され(又は、ロード命令の場合はそのレジスタに書き込まれ)、方向識別子が垂直方向を選択する場合、転送された要素は、ZAiに対応するグループ内の各ベクトルレジスタZAR内のJth(J番目)の要素から読み出される(又は、ロード命令の場合はそのレジスタに書き込まれる)(又は、水平/垂直方向がベクトルレジスタZAR内のレイアウトに対して転置された場合はその逆である)。
【0108】
図12の下部に示すように、命令のバイナリエンコードは、この命令が配列ロード/ストアデータ転送命令であることを識別するオペコードと、前述のように命令のアセンブラ表現において指定された様々なパラメータに対応するいくつかのフィールドと、を含み得る。例えば、命令エンコードのフィールドは、方向識別子D、現在のデータ要素サイズE、レジスタアドレス指定オペランドの行/列インデックスを生成するためのベースレジスタを識別するベースレジスタ識別子Wx、水平及び垂直述語値を提供するための述語レジスタPh及びPv、並びに様々なメモリアドレス指定オペランドを表すように割り振られ得る。
【0109】
この例では、レジスタアドレス指定オペランドのベースレジスタを識別するためのスカラレジスタフィールドWxは、デコーダ30及びプロセッサによってサポートされる少なくとも1つの他の命令内のスカラレジスタフィールドに使用されるビット数K(例えば、整数ALU命令は、それらのソース/宛先レジスタに対してKビットレジスタフィールドを指定することができる)よりも少ない一定のビット数Lを有する。例えば、
図5の例ではK=5である。しかしながら、配列ロード/ストアデータ転送命令内のベースレジスタフィールドのサイズを低減するために、
図12に示すように、Wxフィールドは、配列データ転送命令用の行/列インデックスを生成するためのベースレジスタとして指定されることが許可されないいくつかのスカラレジスタが存在するように、Lビット(L<K)を有し得る。例えば、L=2の場合、データ転送命令は、4つのスカラレジスタ(例えば、W12~W15)の限定されたサブセットから選択することに制限され得る。これは、命令がすでに指定されるべき多数のパラメータを有していて、行列処理のループを制御する際の想定されるユースケースについては、単一のプログラムループ内のレジスタアドレス指定用に少数の異なるベースレジスタのみを定義すれば十分であり、したがって、インデックスJを生成するためのベースレジスタを識別するためのスカラレジスタフィールドのサイズを制限することによって、命令コーディングをより効率的にし、他のパラメータを表すための他のビット空間を解放することを認識したものである。もちろん、これは必須ではなく、他の実装形態は、レジスタアドレス指定オペランド用のベースレジスタとして識別される任意のスカラレジスタをサポートするスカラレジスタフィールドWxを提供することができる。
【0110】
図12は、現在のデータ要素サイズEが、特定のビットフィールドを使用して命令のエンコード内で直接エンコードされている例を示すが、別のオプションは、現在のデータ要素サイズが、以前の命令によって設定され、現在のデータ要素サイズを識別するために配列データ転送命令を処理するときに参照され得る制御レジスタ内に記憶されることであり得、したがって、命令エンコード自体内で現在のデータ要素サイズEを表すことは必須ではない場合がある。
【0111】
この例では、レジスタアドレス指定情報の行/列インデックスを生成するための配列ID iとイミディエート値#yは、データ転送命令の命令エンコード内の結合フィールドによって表される。これは、
図13により詳細に示されている。この結合エンコードは、可変データ要素サイズEに関して、データ要素サイズが増加するにつれて、利用可能な物理的配列ストレージ内に収まることができる別個の2D配列の数が増加する一方で、個々の配列の寸法が減少するという事実を利用する。よって、配列IDとイミディエート値は両方とも、データ要素サイズに依存するが、逆スケーリング関係を有し、これは、いくつかのデータ要素サイズについては配列IDの一部として、他のデータ要素サイズについてはイミディエート値の一部として可変的にマッピングされる、結合フィールドの一定の数のビットを有する結合フィールドにおいて、2つのパラメータを表すことが効率的であり得ることを意味する。
【0112】
また、行列ベクトル長MVLに対して異なるサイズを実装している可能性があるプロセッサ実装形態の範囲で正しく動作することができるベクトル長アグノスティックコードをサポートするために、レジスタアドレス指定オペランドに対して指定される特定のイミディエート値は、実装されている特定の行列ベクトル長MVLにかかわらず、コードによって同じ値に設定されることが望ましいことが認識されている。実際には、これは、サポートされる最小行列ベクトル長MVLminで動作するプロセッサ実装形態において、単一ベクトルレジスタZAR内に収まることができるデータ要素の最大数よりも大きい#yのエンコードの数をサポートするためのエンコード空間を提供することに利点がないことを意味する。これは、最小値よりも大きいベクトル長を有する実装形態では、ベクトルレジスタごとにより多くの要素を参照することが可能であるが、コードは、イミディエート値#y内のそれらの追加のデータ要素を直接参照することができないためであり、そうでなければ、コードは、最小ベクトル長MVLminを実装した実装形態上で正しく機能しないので、もはやベクトル長アグノスティックになるからである。これは、イミディエート値#yに対してサポートされる異なる値の数がMVLmin/E以下(言い換えれば、Nビットイミディエートの場合、2N≦MVLmin/E)であるように、配列ID/イミディエート結合フィールドのサイズが選択され得ることを意味する。例えば、ISAによってサポートされる最小ベクトル長MVLminが128ビットである場合、現在のデータ要素サイズEが8であるとき、128/8=16は4ビット(すなわち、0から15)で表すことができるので、イミディエート値を表すには4ビットは十分である。
【0113】
よって、
図13の例に示すように、データ転送命令の4ビットの結合フィールドは、水平/垂直インデックスJを生成するための(どの配列レジスタZAiがアクセスされるべきかを定義する)配列ID iと、イミディエート値#yとの両方を表すことができる。サポートされる最小のデータ要素サイズ(例えば8ビット)では、結合フィールドの4ビットすべてをイミディエート値#yのビットを表すために割り振ることができる。なぜなら、この要素サイズでは、
図9に示すように、配列レジスタに対応する物理レジスタストレージZAR0~ZAR63全体が単一の2D配列ZA0にマッピングされているので、配列IDを指定する必要が全くないからである。この場合、水平/垂直方向に64個の異なる要素位置が存在するが、イミディエート値♯yは、MVL=MVL
min=128ビットであり、16個の8ビット要素のみが単一のベクトルレジスタに収まることができる実装形態をサポートするために、範囲0~15のみでスケーリングする。範囲16~63内の要素位置にアクセスするには、ソフトウェアコードがレジスタWx内のベース値を0以外の値として指定する必要がある。
【0114】
一方、より大きなデータ要素サイズでは、サポートされる最小ベクトル長のベクトルレジスタ内に収まることができるそのサイズのデータ要素の数が減少するにつれて、より少ないビットがイミディエート値に必要とされるが、これらの例では、配列ID iを表すために結合フィールドの追加ビットが割り振られる。
【0115】
図14は、上述の配列データ転送命令を利用することができるプログラムコードの例を示す。
図14の左側は、プログラマによって高レベルプログラミング言語で書かれた、結果C[N×M]を与える2つの行列A[N×K]とB[K×M]を乗算する高レベルプログラムコードを示す。プログラマは、メモリに記憶された2つの行列構造のそれぞれの行/列にわたってステップし、処理のために行/列をロードし、行列のうちの一方の行及び他方の列に対応するベクトルの対に対していくつかの外積演算を実行し、いくつかの外積結果の累算の生成された結果をメモリに書き戻すように意図されたプログラムループを書く可能性がある。
【0116】
例えば、
図14において、高レベルコードは、各反復において、行列Aの2つの列及び行列Bの2つの行が外積演算用の入力ベクトルとしてロードされるループを示す。4つの外積演算は、(
図7に示す例と同様に)列及び行のそれぞれの対に対して実行されて、出力データの4つの別個の2D配列を生成する。ロード/計算ループは、メモリ内の行列構造の異なる行/列位置にわたって反復され、その結果、ZA0~ZA3は、行列Aからのタイルと行列Bからのタイルとを乗算した結果を累算する。後続のストアループは、結果タイルZA0~ZA3のそれぞれの行/列をメモリ内の結果行列構造Cに戻して記憶する。外側ループは、ロード/計算ループとストアループとの両方にわたって反復され、行列AとBのタイルの他の組み合わせにわたって反復される。
【0117】
図14の右側は、
図14の左側の高レベルコードのコンパイルされたアセンブラ表現を示す。内部ループ(ロード/計算ループ)内には、ベクトルレジスタZ4~Z7にメモリ内の行列A/Bのそれぞれの列又は行をロードするいくつかのベクトルロード命令と、ベクトルレジスタZ4~Z7内のベクトルオペランドのそれぞれの対から配列レジスタZA0~ZA3に書き込まれる外積結果を生成する外積命令FMOPAとがある。この例では、要素サイズは32ビットであり、したがって、(
図7の例を考えると)内側ループの単一の反復内で生成され得るタイルが4つ存在する。この例では、E=32ビットのデータ要素サイズは、様々なロード/ストア命令及び外積命令のアセンブラ表現内に要素サイズ識別子.sを有することによって表される。外積命令は、外積及び累算命令であり、したがって、例えば、命令「fmopa ZA0.s.」は、配列レジスタZA0の各要素の前の内容を、ベクトルレジスタZ4及びZ6内のベクトルオペランドに対して実行された外積演算において生成された要素に加算する。
【0118】
図14のアセンブラコードの下部のループは、生成された2D配列を配列レジスタZA0~ZA3からメモリに転送するために使用される配列ストアデータ転送命令「st1w」を含む。これらは、
図12に関して説明したエンコードを有する。この例では、方向識別子dは、(アセンブラ表現においてzaih.sによって示されるように)水平方向を指定し、したがって、
図14の例に示されるベースレジスタW12とイミディエート値#0は、対応するストア命令に応じてメモリに転送されるべき選択された配列レジスタZAi(ZA0~ZA3のうちの1つ)の要素の特定の水平グループを識別するインデックス値Jを生成するために使用される。生成された配列ZA0~ZA3の各々のすべての要素がメモリに記憶されるまで、ストア命令が生成された2D配列の要素の各水平グループにわたってステップするように、ベースレジスタW12内の値がループの反復ごとにインクリメントされて反復するループが構築される。ストアループの一番下の「add」命令は、メモリアドレス指定情報とレジスタアドレス指定情報にそれぞれ使用されるベースレジスタx17、w12をインクリメントし、比較命令「cmp」は、(この例ではループカウンタとしても機能する)w12内の値を比較して、分岐命令「blt」がループを終了させるかどうかを決定できるようにする。
【0119】
図14は、コンパイラがコードの下部にストアループを生成するときにループアンローリングを使用しなかったアセンブラコードの例を示す。この例では、4つのストア命令の各々に対するイミディエート値は#0であり、したがって、所与の2D配列ZA0~ZA3から記憶されるべき特定の行/列を選択するために使用されるインデックス値は、単にベースレジスタW12に記憶された値によって識別される。
【0120】
しかしながら、コードのこのような実装では、ストアループの各ループ反復において、w12をインクリメントするための「add」命令、並びにループを終了するかどうかを決定するために使用される比較命令及び分岐命令「cmp」、「blt」において、一定の量のオーバーヘッドが存在する。これらのループ制御命令に関連するオーバーヘッドは、ループの複数の反復が、元のループ内の複数の反復に対応していたはずの明示的な命令を含んでいるより大きなループの単一の反復にアンローリングされるループアンローリングを実行することによって低減することができる。例えば、
図14に示すストアループは、以下のようなコードで置き換えることができる。
【0121】
【0122】
この例では、元のループの4つの別個の反復を、新しいループの単一の反復にアンローリングすることができ、これにより、w12をインクリメントするための「加算」命令並びに比較命令及び分岐命令が実行される回数が低減される。メモリアドレスを生成するためのメモリアドレス指定情報が、ターゲットメモリアドレスを生成するためにベース値に加算される要素サイズの倍数を示す追加のイミディエートオフセットを有するベース+イミディエートのアドレス指定モードを使用する場合、更なる性能改善を達成することができ、この場合、異なるストア命令は、単一のレジスタx17に基づいて、アンローリングされるループ反復のための異なるアドレスをターゲットにして、各ループ反復でレジスタX18~X20をインクリメントするための3つの加算命令を更に省くことができる。
【0123】
上記のコードは単なる一例にすぎないが、レジスタアドレス指定情報内にベースレジスタとイミディエート値を使用して水平/垂直位置インデックスJを表すことが、コンパイラによるループアンローリングをサポートするために、並びにデータ構造の異なる次元で動作することができるスケーラブルコードをサポートするのに有用であり得る理由を示すのに役立つことが理解されるであろう(反復ごとに計算されるZA行列タイルの次元を表す、
図14に示す変数dimを参照)。
【0124】
図12の例は、データが配列レジスタストレージ88のターゲット部分とメモリ54との間で転送される、ロード/ストア命令である配列データ転送命令を示す。
【0125】
レジスタアドレス指定情報を使用して配列レジスタ88にアクセスするデータ転送命令の別の例が
図15に示されている。
図15は、配列レジスタ88とベクトルレジスタ82との間でデータを転送するためのレジスタ移動命令を示す。オペコードは、
図12のロード/ストア配列データ転送命令のオペコードとは異なる値を有する。レジスタ移動命令のレジスタアドレス指定情報は、
図12の例と同じ方法でエンコードされる。しかしながら、メモリのターゲット領域を識別するメモリアドレス指定情報を提供する代わりに、レジスタ移動命令は、選択されたベクトルレジスタ82を指定するベクトルレジスタ識別子Zkを指定する。レジスタ移動命令の(異なるオペコードによって表される)異なる変形例を提供することができる。例えば、ベクトルレジスタZkからの要素のベクトルを、方向識別子d、配列レジスタID i、要素サイズE、ベースレジスタWx、及びイミディエート#yを含む配列レジスタアドレス指定情報に基づいて識別される選択された配列レジスタZAiの要素Jの水平/垂直グループに、
図12の例について上述したのと同じ方法で転送するように処理回路構成を制御する、ベクトルから配列レジスタへの移動の変形例があってもよい。同様に、選択された配列レジスタZAiの要素Jの水平/垂直グループからベクトルレジスタZkへデータを移動するように処理回路構成を制御する、配列からベクトルレジスタへの移動の変形例が存在してもよい。どちらの形式の命令も、行列全体に対して2D演算を実行する前又は後に、行列の単一の行/列内の要素のいくつかの操作を実行する必要がある場合があるが、特定の行列処理アルゴリズムをサポートするのに有用であり得る。レジスタ移動命令は、このような単一行/列操作が実行され得るように、ベクトルレジスタへの/からの要素の転送をサポートすることができる。
【0126】
図16は、前述の配列データ転送命令などのデータ転送命令の処理を例示する流れ図を示す。ステップS200では、処理待ちの次の命令が命令デコーダ30によってデコードされ、ステップS202では、命令デコーダ30は、デコードされた命令のタイプを識別する。命令が配列データ転送命令でない場合、ステップS204では、命令によって表される演算が命令デコーダ30の制御下で処理回路構成によって実行され、方法はステップS200に戻って次の命令をデコードする。
【0127】
命令デコーダ30によってデコードされた命令が配列データ転送命令であると識別された場合、ステップS206では、命令デコーダ30及び/又はCPU60もしくはコプロセッサ70の実行ステージ36は、データ転送命令のレジスタアドレス指定情報に基づいて識別されたレジスタストレージのターゲット部分を用いて、データ転送動作に使用するレジスタストレージのターゲット部分を識別する。レジスタアドレス指定情報は、ベースレジスタ識別子とイミディエート値とを含む。処理回路構成は、イミディエート値によって表される値と、ベースレジスタ識別子によって識別されるベースレジスタ内に保持される値との加算に基づいて、インデックス値Jを生成する。インデックス値Jは、データ転送の対象となるレジスタストレージのターゲット部分を選択するために使用される。
【0128】
ステップS208では、(命令デコーダの制御下にある)処理回路構成は、デコードされた配列データ転送命令のタイプを識別する。ステップS208は、簡潔にするためにステップS206の後に示されているが、他の例では、ステップS206の前に実行されてもよく、その場合、ステップS206は、ステップS208に続く処理の両方の代替の分岐に現れる。
【0129】
データ転送命令が
図12の例と同様のロード/ストア命令である場合、ステップS210では、処理回路構成は、命令によって指定されたメモリアドレス指定情報に基づいて、データ転送に使用されるメモリのターゲット部分を決定する。これは、任意の既知のアドレス指定モードに従って行うことができ、命令によって識別されるレジスタ又は命令エンコードによって識別されるイミディエート値のいずれかに基づくことができる。
【0130】
ステップS212では、処理回路構成は、次に、命令デコーダ30によって制御されて、データ転送動作を実行し、レジスタストレージのターゲット部分とメモリのターゲット部分との間でデータを転送する。命令がロード命令である場合、データ転送動作は、メモリのターゲット部分からデータをロードし、それをレジスタストレージのターゲット部分に記憶することを含む。命令がストア命令である場合、データ転送は、レジスタストレージのターゲット部分からメモリのターゲット部分にデータを記憶することを含む。次に、方法はステップS200に戻り、次の命令をデコードする。
【0131】
ステップS208では、配列データ転送命令が(
図15と同様の)レジスタ移動命令であると判定された場合、ステップS214では、レジスタストレージの更なる部分が、更なるレジスタアドレス指定情報に基づいて(例えば、どのレジスタがレジスタストレージの更なる部分であるかを識別する命令エンコード内のレジスタフィールドZkに基づいて)識別される。ステップS216では、データ転送動作が(実行される特定の命令タイプに応じていずれかの方向に)実行されて、ベースレジスタWxとイミディエート#yに基づいて識別されたレジスタストレージのターゲット部分とレジスタストレージの更なる部分との間でデータを転送する。再び、方法はステップS200に戻り、次の命令をデコードする。
【0132】
図12及び
図15の例は、レジスタアドレス指定情報を含む配列データ転送命令を示しており、このレジスタアドレス指定情報は、ベースレジスタとイミディエート値を使用して、配列レジスタストレージ88のターゲット部分を選択してデータ転送に使用するために使用されるインデックス値を表す。しかしながら、レジスタアドレス指定情報のこのようなエンコードは、データの2D配列を記憶するための配列レジスタ88以外のタイプのレジスタにアクセスする他のタイプの命令にも使用することができる。より一般的には、このようにレジスタアドレス指定情報をエンコードすることは、ループアンローリングをサポートしながら、可変次元を有し得るデータの部分を処理するように意図された命令に有用であり得る。
【0133】
図17は、使用され得るシミュレータ実装形態を示す。上記の実施形態は、当該技法をサポートする特定の処理ハードウェアを動作させる装置及び方法の点において本発明を実装しているが、コンピュータプログラムの使用によって実装される本明細書に記載の実施形態による命令実行環境を提供することも可能である。このようなコンピュータプログラムは、コンピュータプログラムがハードウェアアーキテクチャのソフトウェアベースの実装形態を提供する限り、シミュレータとしばしば称される。様々なシミュレータコンピュータプログラムは、エミュレータ、仮想マシン、モデル、及び動的バイナリトランスレータを含むバイナリトランスレータを含む。典型的に、シミュレータの実装形態は、シミュレータプログラム310をサポートするホストオペレーティングシステム320をオプションとして実行して、ホストプロセッサ330で実行し得る。いくつかの配置では、ハードウェアと提供されている命令実行環境との間に複数のレイヤのシミュレーションがあってもよく、及び/又は、同じホストプロセッサ上に提供されている複数の異なる命令実行環境があってもよい。歴史的に、強力なプロセッサが、合理的な速度で実行されるシミュレータ実装形態を提供するのに必要とされてきたが、このような手法は、互換性又は再使用の理由から別のプロセッサにネイティブなコードを実行することが望まれるようなときなど一定の状況では、正当化され得る。例えば、シミュレータ実装形態は、ホストプロセッサハードウェアによってサポートされていない追加の機能性を有する命令実行環境を提供してもよく、又は典型的には異なるハードウェアアーキテクチャに関連付けられた命令実行環境を提供してもよい。シミュレーションの概要は、「Some Efficient Architecture Simulation Techniques」、Robert Bedichek、1990年冬 USENIX Conference、53~63頁に記載されている。
【0134】
これまで、特定のハードウェア構成物又は特性を参照して実施形態を説明してきたが、シミュレーションされた実施形態では、適切なソフトウェア構成物又は特性によって同等の機能性を提供することができる。例えば、特定の回路構成は、シミュレーションされた実施形態で、コンピュータプログラムロジックとして実装されてもよい。同様に、レジスタ又はキャッシュなどのメモリハードウェアは、シミュレーションされた実施形態で、ソフトウェアのデータ構造として実装されてもよい。前述の実施形態で参照されているハードウェア要素のうちの1つ以上がホストハードウェア(例えば、ホストプロセッサ330)に存在する配置では、いくつかのシミュレーションされる実施形態は、適する場合、ホストハードウェアを使用してもよい。
【0135】
シミュレータプログラム310は、(非一時的媒体であってもよい)コンピュータ可読ストレージ媒体に記憶されて、(アプリケーション、オペレーティングシステム、及びハイパーバイザを含み得る)ターゲットコード300に、シミュレータプログラム310によってモデル化されたハードウェアアーキテクチャのインタフェースと同じであるプログラムインタフェース(命令実行環境)を提供することができる。よって、前述の混合した要素サイズ命令を含む、ターゲットコード300のプログラム命令は、シミュレータプログラム310を使用する命令実行環境内から実行されてもよく、これによって、上述の装置のハードウェア特性を実際には有していないホストコンピュータ330が、これらの特性をエミュレーションできるようになる。
【0136】
よって、一例は、ホストデータ処理装置上で実行されると、ホストデータ処理装置を制御して、ターゲットコードの命令を実行するための命令実行環境を提供させるシミュレータコンピュータプログラム310を提供する。当該コンピュータプログラムは、プログラム命令に応じて、データ処理を実行するようにホストデータ処理装置を制御するためにプログラム命令をデコードする命令デコードプログラムロジック312と、ターゲットコードによってサポートされるシミュレーションされたISAにおいて定義されているアーキテクチャレジスタ80、82、88をエミュレーションするために、ホストハードウェア330のホストストレージにおいてデータ構造を維持するレジスタエミュレーティングプログラムロジック314と、を含む。コンピュータプログラムは、コンピュータ可読記録媒体に記憶されてもよい。記録媒体は、非一時的記録媒体であってもよい。
【0137】
例えば、命令デコードプログラムロジック312は、ターゲットコードのプログラム命令の命令エンコードをチェックし、各タイプの命令を、デコードされた命令によって表される機能性に対応する機能性を実行するホストハードウェア330によってサポートされるネイティブ命令セット内の1つ以上のプログラム命令の対応するセットにマッピングする命令を含むことができる。レジスタエミュレーティングプログラムロジック314は、ホストデータ処理装置330の仮想アドレス空間内及び/又はホスト装置330のレジスタ内にデータ構造を維持する命令セットを含むことができ、レジスタエミュレーティングデータ構造は、ターゲットコードがハードウェア内に提供されると想定するが、実際にはホスト装置330のハードウェア内に提供されていないレジスタ80、82、88のレジスタの内容を表す。シミュレーションされた命令セットアーキテクチャにおいて特定のレジスタを参照するターゲットコード300内の命令は、レジスタエミュレーティングプログラムロジック314に、ホスト330のレジスタにアクセスさせるか、又はホスト装置のネイティブ命令セット内にロード/ストア命令を生成させて、対応するシミュレーションされたレジスタ状態の読み出し/書き込みを要求することができる。
【0138】
命令デコードプログラムロジック312は、ハードウェア実施形態について上述したのと同じ方法で、ベースレジスタとイミディエートを使用して定義されたレジスタアドレス指定情報を使用するデータ転送命令をサポートすることができる。
図17のシミュレータの例の場合、ターゲットコードで処理される命令がデータ転送命令のロード/ストア形式であるとき、レジスタストレージのターゲット部分を識別するためのレジスタアドレス指定情報及びシミュレーションされたメモリのターゲット部分を識別するためのメモリアドレス指定情報を指定するロード/ストアデータ転送命令に応じて、命令デコードプログラムロジック312は、ホスト330を制御して、レジスタストレージのターゲット部分にマッピングされたレジスタエミュレーティングデータ構造のロケーションと、シミュレーションされたメモリのターゲット部分にマッピングされたホストデータ処理装置のホストストレージ内のロケーションとの間でデータを転送するデータ転送動作を実行させる。
【0139】
本願では、「~ように構成された(configured to...)」という用語は、装置の要素が、定義された動作を実施することができる構成を有することを意味するために使用される。この文脈では、「構成(configuration)」とは、ハードウェア又はソフトウェアの配置又は相互接続の方法を意味する。例えば、装置は、定義された動作を提供する専用ハードウェアを有してもよく、又はプロセッサ若しくは他の処理デバイスが、機能を実行するようにプログラムされてもよい。「ように構成された」は、装置要素が、定義された動作を提供するために何らかの変更がなされる必要があることを意味しない。
【0140】
本発明の例示的な実施形態が添付の図面を参照して本明細書で詳細に説明されているが、本発明はこれらの精密な実施形態に限定されず、様々な変更及び修正が、添付の特許請求の範囲によって定義された本発明の範囲及び精神から逸脱することなく、当業者によってこれらの実施形態においてなされ得ることを理解されたい。
【国際調査報告】