IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ エックスモス リミテッドの特許一覧

<>
  • 特許-ベクトル演算の回転累算器 図1
  • 特許-ベクトル演算の回転累算器 図2
  • 特許-ベクトル演算の回転累算器 図3a
  • 特許-ベクトル演算の回転累算器 図3b
  • 特許-ベクトル演算の回転累算器 図4a
  • 特許-ベクトル演算の回転累算器 図4b
  • 特許-ベクトル演算の回転累算器 図4c
  • 特許-ベクトル演算の回転累算器 図4d
  • 特許-ベクトル演算の回転累算器 図5a
  • 特許-ベクトル演算の回転累算器 図5b
  • 特許-ベクトル演算の回転累算器 図6
  • 特許-ベクトル演算の回転累算器 図7
  • 特許-ベクトル演算の回転累算器 図8
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-02-16
(45)【発行日】2024-02-27
(54)【発明の名称】ベクトル演算の回転累算器
(51)【国際特許分類】
   G06F 17/16 20060101AFI20240219BHJP
【FI】
G06F17/16 M
G06F17/16 D
【請求項の数】 13
(21)【出願番号】P 2022548402
(86)(22)【出願日】2020-10-12
(65)【公表番号】
(43)【公表日】2023-04-13
(86)【国際出願番号】 EP2020078580
(87)【国際公開番号】W WO2021160300
(87)【国際公開日】2021-08-19
【審査請求日】2022-12-12
(31)【優先権主張番号】2001789.3
(32)【優先日】2020-02-10
(33)【優先権主張国・地域又は機関】GB
(73)【特許権者】
【識別番号】509257307
【氏名又は名称】エックスモス リミテッド
【氏名又は名称原語表記】XMOS LTD
【住所又は居所原語表記】5th Floor,The Programme,1 All Saints Street,Bristol,BS1 2LZ, United Kingdom
(74)【代理人】
【識別番号】100169904
【弁理士】
【氏名又は名称】村井 康司
(74)【代理人】
【識別番号】100221372
【弁理士】
【氏名又は名称】岡崎 信治
(72)【発明者】
【氏名】ヘンドキック ランベルトゥス ミュラー
【審査官】坂庭 剛史
(56)【参考文献】
【文献】国際公開第2009/073787(WO,A1)
【文献】特表2007-533009(JP,A)
【文献】特表2016-530631(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/16
(57)【特許請求の範囲】
【請求項1】
出力ベクトルを生成する処理ユニットであって、
前記出力ベクトルの異なる成分を保持する複数の要素を有する出力レジスタであって、
前記複数の要素は第1の端部要素及び第2の端部要素を含む出力レジスタと、
少なくとも2つの入力ベクトルを処理して各結果値を生成するベクトルユニットと、
を備え、
前記処理ユニットは、機械コード命令を実行するように構成され、各命令は、前記処理ユニットの命令セット中の命令タイプの予め定義されたセットのインスタンスであり、前記命令セットは、対応する演算コードによって定義されるベクトル処理命令を含み、前記ベクトル処理命令は、前記処理ユニットに、
i)前記ベクトルユニットを使用して、第1の入力ベクトル及び第2の入力ベクトルを処理して結果値を生成することと、
ii)前記出力レジスタの前記複数の要素に対して、前記結果値と回転前の前記第2の端部要素に存在する値との和を前記出力レジスタの前記第1の端部要素に配置する回転演算を実行することと、
を行わせる、処理ユニット。
【請求項2】
前記ベクトルユニットは、積和演算を前記入力ベクトルに実行することによって前記第1の入力ベクトル及び前記第2の入力ベクトルの前記処理i)を実行するように構成され、前記結果値は、前記積和演算から生成されるスカラー値である、請求項1に記載の処理ユニット。
【請求項3】
前記ベクトルユニットは、少なくとも前記第2の入力ベクトルにメモリから直接アクセスするように構成される、請求項1又は2に記載の処理ユニット。
【請求項4】
少なくとも前記第1の入力ベクトルを保持する入力レジスタを備え、
前記ベクトルユニットは、前記入力レジスタから前記第1の入力ベクトルにアクセスするように構成される、請求項1~3の何れか1項に記載の処理ユニット。
【請求項5】
前記入力レジスタは、レジスタファイル中の複数のレジスタから選択され、前記ベクトル処理命令は前記入力レジスタを指定するオペランドを含む、請求項4に記載の処理ユニット。
【請求項6】
前記入力レジスタは、前記ベクトル処理命令のオペランドによって指定されず、前記ベクトル処理命令の前記演算コードにおいて暗黙的である、請求項4に記載の処理ユニット。
【請求項7】
前記出力レジスタは、レジスタファイル中の複数のレジスタから選択され、前記ベクトル処理命令は前記出力レジスタを指定するオペランドを含む、請求項1~6の何れか1項に記載の処理ユニット。
【請求項8】
前記出力レジスタは、前記ベクトル処理命令のオペランドによって指定されず、前記ベクトル処理命令の前記演算コードにおいて暗黙的である、請求項1~6の何れか1項に記載の処理ユニット。
【請求項9】
出力ベクトルの異なる成分を保持する複数の要素を有する出力レジスタにおいて前記出力ベクトルを生成する、処理ユニットによって実行される方法であって、前記複数の要素は第1の端部要素及び第2の端部要素を含み、前記処理ユニットは機械コード命令を実行するように構成され、各命令は、前記処理ユニットの命令セットにおける命令タイプの予め定義されたセットのインスタンスであり、前記命令セットは対応する演算コードによって定義されるベクトル処理命令を含み、前記方法は、前記処理ユニットに、
)第1の入力ベクトル及び第2の入力ベクトルを処理して結果値を生成させ、
ii)前記結果値と回転前の前記第2の端部要素に存在する値との和を前記出力レジスタの前記第1の端部要素に配置する回転演算を前記出力レジスタの前記複数の要素に対して実行させる、
ベクトル処理演算を実現する前記ベクトル処理命令を含む、
方法。
【請求項10】
前記第1の入力ベクトルはレジスタに記憶され、前記方法は、同じ前記第1の入力ベクトルを使用して複数の前記ベクトル処理演算を実行することを含む、請求項9に記載の方法。
【請求項11】
複数の前記ベクトル処理演算の完了に続き、前記出力レジスタに存在する前記値を記憶場所に出力することを含む請求項10に記載の方法。
【請求項12】
前記出力レジスタ中の要素の数の整数倍に等しくない複数のベクトル処理演算の完了に続き、回転の総数が前記出力レジスタ中の要素数の整数倍に等しいように前記出力レジスタの前記要素に存在する前記値を変更せずに、1つ又は複数の回転演算を前記出力レジスタに実行することを含む請求項10又は11に記載の方法。
【請求項13】
請求項10~12の何れか1項に記載の方法を実行するようにプログラムされた請求項1~9の何れか1項に記載の処理ユニットを備えたコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、行列ベクトル演算等のベクトル演算を実施する実行ユニットを有するプロセッサに関する。
【背景技術】
【0002】
所与のプロセッサのプロセッサアーキテクチャは、特定の命令セットの中からインスタンス化された命令を実行するように設計される。プロセッサの命令セットは、プロセッサが実行するように構成された種類の機械コード命令の定義の基本セットである。これらは、幾つかの計算命令、例えば加算、乗算等の算術命令を含む。実行される各命令は、命令セットからの命令タイプの1つのインスタンスである。命令セットにおいて定義される各命令は演算コード及びゼロ以上のオペランドフィールドで構成される機械コード命令であり、演算コードは実行されるべき演算を指定し、オペランドフィールド(もしあれば)は、指定された演算によって演算すべき1つ又は複数のオペランドを指定するのに使用される。
【0003】
幾つかのプロセッサには、命令セットの一部としてベクトル処理命令が構成されている。このタイプの典型的なプロセッサは、対応する機械コード命令に応答してベクトル演算を実行するベクトル処理ユニット(VPU)を含む。例えば、VPUは、対応する機械コード命令に応答して2つの入力ベクトルに積和演算を実行し得、その出力は2つの入力ベクトルの内積(ドット積)に等しい。
【発明の概要】
【発明が解決しようとする課題】
【0004】
ベクトルユニットは、より大きなタスクの一部を構成するベクトル演算を実行するのに使用することができる。しかしながら、それに従って個々のベクトル演算の各々からの結果を記憶、配置する必要があり、命令に追加のオペランドが必要とされ、結果値の移動にメモリが使用され、又はこれら両方が必要とされ得る。より簡素化された実施メカニズムを提供することが望ましい。
【課題を解決するための手段】
【0005】
本明細書に開示される第1の態様によれば、出力ベクトルを生成する処理ユニットが提供され、本処理ユニットは、出力ベクトルの異なる成分を保持する複数の要素を有する出力レジスタであって、複数の要素は第1の端部要素及び第2の端部要素を含む、出力レジスタと、少なくとも2つの入力ベクトルを処理して、各結果値を生成するベクトルユニットとを備え、処理ユニットは機械コード命令を実行するように構成され、各命令は、処理ユニットの命令セット中の命令タイプの予め定義されたセットのインスタンスであり、命令セットは対応する演算コードによって定義されるベクトル処理命令を含み、ベクトル処理命令は処理ユニットに、i)ベクトルユニットを使用して、第1の入力ベクトル及び第2の入力ベクトルを処理して結果値を生成することと、ii)出力レジスタの複数の要素に対して、結果値又は結果値に基づく値を出力レジスタの第1の端部要素に配置する回転演算を実行することと、を行わせる。
【0006】
一例では、上記回転演算の一環として出力レジスタの第1の端部要素に配置される値は、結果値と回転前の第2の端部要素に存在する値との和である。
【0007】
この特定の例には、各々がメモリ中のポインタを調整するだけでよい一連の命令が、複数のパスを生成する必要がある事例を処理可能であるという利点を有する。これは例えば、行列及び/又はベクトルが、ベクトルユニットによって処理可能(又は入力レジスタに保持可能)な量よりも大きい行列ベクトル乗算を実施する場合である。
【0008】
一例では、ベクトルユニットは、積和演算を入力ベクトルに実行することによって第1の入力ベクトル及び第2の入力ベクトルの上記処理i)を実行するように構成され、結果値は、積和演算から生成されるスカラー値である。
【0009】
一例では、ベクトルユニットは、少なくとも第2の入力ベクトルにメモリから直接アクセスするように構成される。
【0010】
一例では、本処理ユニットは、少なくとも第1の入力ベクトルを保持する入力レジスタを備え、ベクトルユニットは入力レジスタから第1の入力ベクトルにアクセスするように構成される。
【0011】
一例では、入力レジスタは、レジスタファイル中の複数のレジスタから選択され、ベクトル処理命令は入力レジスタを指定するオペランドを含む。
【0012】
一例では、入力レジスタは、ベクトル処理命令のオペランドによって指定されず、ベクトル処理命令の演算コードにおいて暗黙的である。
【0013】
一例では、出力レジスタは、レジスタファイル中の複数のレジスタから選択され、ベクトル処理命令は出力レジスタを指定するオペランドを含む。
【0014】
一例では、出力レジスタは、ベクトル処理命令のオペランドによって指定されず、ベクトル処理命令の演算コードにおいて暗黙的である。
【0015】
本明細書に開示される第2の態様によれば、出力ベクトルの異なる成分を保持する複数の要素を有する出力レジスタにおいて出力ベクトルを生成する、処理ユニットによって実行される方法が提供され、複数の要素は第1の端部要素及び第2の端部要素を含み、処理ユニットは機械コード命令を実行するように構成され、各命令は、処理ユニットの命令セットにおける命令タイプの予め定義されたセットのインスタンスであり、命令セットは対応する演算コードによって定義されるベクトル処理命令を含み、本方法は、処理ユニットに、i)第1の入力ベクトル及び第2の入力ベクトルを処理して結果値を生成させ、ii)結果値又は結果値に基づく値を出力レジスタの第1の端部要素に配置する回転演算を出力レジスタの複数の要素に対して実行させるベクトル処理演算を実現するベクトル処理命令を含む。
【0016】
一例では、上記回転演算の一環として出力レジスタの第1の端部要素に配置される値は、結果値と回転前の第2の端部要素に存在する値との和である。
【0017】
一例では、第1の入力ベクトルはレジスタに記憶され、本方法は、同じ第1の入力ベクトルを使用して複数のベクトル処理演算を実行することを含む。例えば、これは行列乗算の実行に使用し得る。
【0018】
一例では、本方法は、複数の上記ベクトル処理演算の完了に続き、出力レジスタに存在する値を記憶場所に出力することを含む。
【0019】
一例では、本方法は、出力レジスタ中の要素の数の整数倍に等しくない複数のベクトル処理演算の完了に続き、回転の総数が出力レジスタ中の要素数の整数倍に等しいように出力レジスタの要素に存在する値を変更せずに、1つ又は複数の回転演算を出力レジスタに実行することを含む。
【0020】
本明細書に開示される第3の態様によれば、第2の態様による方法を実行するようにプログラムされた、第1の態様による処理ユニットを備えたコンピュータシステムが提供される。
【0021】
本開示の理解を助け、実施形態をいかに実施し得るかを示すために、例として添付図面を参照する。
【図面の簡単な説明】
【0022】
図1】本明細書に記載される例によるコンピュータシステムを模式的に示す。
図2】ベクトル処理命令の第1の実施例を模式的に示す。
図3a】回転演算の2つの例をより詳細に模式的に示す。
図3b】回転演算の2つの例をより詳細に模式的に示す。
図4a】行列及びベクトルを処理するベクトル処理命令の第1の使用例を示す。
図4b】行列及びベクトルを処理するベクトル処理命令の第1の使用例を示す。
図4c】行列及びベクトルを処理するベクトル処理命令の第1の使用例を示す。
図4d】行列及びベクトルを処理するベクトル処理命令の第1の使用例を示す。
図5a】行列及びベクトルを処理するベクトル処理命令の第2の使用例を示す。
図5b】行列及びベクトルを処理するベクトル処理命令の第2の使用例を示す。
図6】ベクトル処理命令の第2の実施例を模式的に示す。
図7】処理ユニットによって実行される方法の一例を模式的に示す。
図8】処理ユニットによって実行される方法の別の例を模式的に示す。
【発明を実施するための形態】
【0023】
本開示は、行列ベクトル演算を効率的に実施するのに使用できる命令及びマイクロアーキテクチャ構造を設計することに関する。
【0024】
本明細書で使用される場合、「命令」という用語は、機械コード命令、即ちプロセッサの命令セットの基本命令タイプの1つを指し、各命令タイプは、単一の演算コード及び1つ又は複数のオペランドフィールドによって定義される。オペランドは即値オペランド、即ち演算が行われるべき値を命令に直接符号化することもできる。または、代替的にはオペランドは間接オペランド、即ち演算が行われるべき値を見つけることができるアドレスの形態とすることができる。例えば、加算命令はオペランドとして3つのポインタをとり得る。すなわち、加算する値をとるべきアドレスを指定する2つのポインタ及び結果を書き込む宛先アドレスを指定するもう1つのポインタである。実際には、ベクトル乗算命令等のソースオペランドフィールド中の値は、典型的には、即値オペランドとは対照的に、作用される実際のベクトル値を保持するベクトルレジスタへのポインタである。
【0025】
ベクトル演算の一例は、行列ベクトル演算である。行列ベクトル演算は、多くの計算分野で使用されている。例えば、行列ベクトル積は、畳み込みニューラルネットワーク等の深層学習環境で畳み込み層を実施するのに使用することができる。そのような場合、値の入力アレイ(例えば画像のピクセル値のアレイ)に、1つ又は複数のフィルタ(カーネルとも呼ばれる)を畳み込むことができる。これは、フィルタと受容野と呼ばれる入力アレイのサブセットとの内積(ドット積)を特定することを含む。フィルタは入力アレイを通り過ぎるため、内積は各受容野で特定される。そうして特定された各内積は、活性化マップ又は特徴マップと呼ばれる出力アレイにおける異なる値を表す。したがって、畳み込み層は行列とのベクトル(フィルタを表す)の乗算と見なすことができる(行列の各行は異なる受容野を表す)。この演算は2回以上、例えばRGB画像の個々の各カラーチャネルに対して実行し得る。
【0026】
出力ベクトルA中の各要素は入力行列Mの(異なる)行との入力ベクトルVの内積に対応するため、一般に、ベクトルVと行列Mとの積を特定することは複数の内積を特定することを含む。
【0027】
従来のマイクロプロセッサでは、内積を計算するための計算は、各項目を順に積和するループを含む。これは、例えば、以下のように表現しうる。
【数1】
【0028】
ここで、「for」ループは、要素毎の積和を実施して、最終内積値(「sum」)を生成する。
【0029】
行列計算の場合、これは以下のように2つのループを含む。
【数2】
【0030】
ここで、内部「for」ループ(インデックスjにわたる)は前と同じように内積を実施し、外部「for」ループ(インデックスiにわたる)は行列Mの各行にわたってこの内積をループする。n番目の内積の結果は、出力ベクトルAのn番目の要素A[n]を決定する。
【0031】
これは、ベクトル処理ユニット(単にベクトルユニットVUとも呼ばれる)を使用することによって加速させることができる。ベクトルユニット自体は当技術分野において既知である。ベクトルユニットは例えば、幾つかの積和(VMA)演算を同時に実行することによって2つの入力ベクトルの内積を特定し得る。
【0032】
具体例として、ベクトルユニットは16の乗算を一度に計算でき、累積演算が後に続き、累積演算では、16の個々の乗算演算の合計(和)が特定、出力される。そのような演算は以下の形態をとり得る。
【数3】
【0033】
これは16の乗算器(ベクトルユニット)を設置することを代償として16倍高速である。この演算は以下のように行列に対して使用することもできる。
【数4】
【0034】
上と同様に、内部「for」ループ(インデックスjにわたる)は内積を実施し、外部「for」ループ(インデックスiにわたる)は行列Mの各行にわたりこの内積をループする。
【0035】
ここでも、n番目の内積の結果は出力ベクトルのn番目の要素A[n]を決定する。換言すれば、そのようなプロセスを上述したように実施する場合、ベクトルユニットからの出力値が最終出力ベクトルの構築に使用される。即ち、ベクトルV及び行列Mのn番目の行をベクトルユニットに渡す結果は、出力ベクトルのn番目の要素(要素0)に対応するスカラー値(内積)である。上記例では、これは16個の値を含み、これらの値は最終出力ベクトルの正しい各要素に書き込まれる必要がある。
【0036】
出力ベクトルがベクトルユニットからの個々の出力値から正しく構築されることを保証するために、従来的には2つの選択肢がある。
【0037】
第1の選択肢は、レジスタファイルの小さな部分を使用して、単一の結果を構築すること、即ち、ベクトルユニットからの出力値を従来のスカラーレジスタに記憶し、次いで、これらの値をスカラーレジスタからベクトルレジスタに読み出すことによってベクトルレジスタにおいて最終ベクトルを構築することである。この欠点は、値を繰り返しロードする必要があるため、より多くのメモリ帯域幅を必要とすることである。
【0038】
第2の選択肢は、結果を累積する場所についてベクトルレジスタにおける明示的なインデックスを使用すること、即ち、ベクトルユニットからの各出力が、ベクトルユニットからの出力時にベクトルレジスタにおける正しい要素に書き込まれることを保証することである。この欠点は、出力が書き込まれるベクトルレジスタにおける場所を指定するために、追加のオペランドが必要とされることである。
【0039】
本開示は、値及びベクトルレジスタにおける場所を指定する(即ちどの値が出力ベクトルのどの要素に対応するかを指定する)いかなる追加情報も繰り返しロードする必要もなく、命令を繰り返して適用することによって出力ベクトルを自動的に構築できるようにする命令及び対応するマイクロアーキテクチャ構造を提供することによってますます効率的な実施を提供する。これにより、単一のオペランドだけで効率的な行列ベクトル乗算等が可能になる。
【0040】
典型的には、行列及びベクトルは、任意のレジスタセットが保持することができるよりもはるかに大きい。したがって、入力ベクトルは、ベクトルユニットに記憶することができる要素数よりも長くなりうる。そのような場合、複数のパスを形成する必要がある。これにより、更に多くの出力値が生成される。したがって、別の課題は、レジスタセット中のデータの正しいビットをロードし、データの残りをメモリから順にロードすることである。この複雑性を処理するのに必要なのは、メモリにおけるポインタの調整を必要とするだけの命令シーケンスの順次生成であるため、本発明はこれに対する改良を提供する。
【0041】
図1は、プロセッサ101を備えた一例のコンピュータシステム100を示す。プロセッサ101は、一連のパイプラインステージを含むパイプライン102を含む。例えば、パイプラインは、命令をフェッチするフェッチステージ103と、命令を復号化するデコードステージ104と、実行ユニット105と、を含み得る。実行ユニット105は、1つ又は複数のステージ、例えばレジスタファイル106から、計算を実行する計算ステージを読み出すレジスタ読み出しステージ、メモリをアドレス指定し、命令に応じてメモリに対するデータの読み書きを行う1つ又は複数のメモリアクセスステージ等を含み得る。なお、図1に示す特定のパイプラインステージは、ここでは、限定ではなく例として示されており、当業者は他の可能なパイプライン変形を認識するであろう。
【0042】
プロセッサ101は、フェッチステージ103に結合されたスケジューラ(図示せず)を含み得る。実行ユニット105(例えば、実行ユニット105のメモリアクセスステージ)は、データメモリ107に結合される。命令フェッチステージ103の入力は、別個の命令メモリ108に結合される。プロセッサ101は、レジスタファイル106を含み、レジスタファイル106は少なくとも1つのレジスタセットを含む。最も一般的には、本明細書で言及されるレジスタファイルは、プロセッサ上のアドレス指定可能レジスタの全セットまでのレジスタの任意のグループを指すことができ、レジスタアドレス空間中のいかなる特定の物理的モジュール又は細分区画にも限定されないことにも留意する。特に、レジスタファイル106は、後述するように、1つ又は複数のベクトルレジスタを含む。
【0043】
データメモリ107は、計算によって作用されるべきデータ及び計算の結果を最終的に記憶し得るメモリである。データメモリ107は、プロセッサ101と同じ物理的ユニットに記憶し得る。代替的には、データメモリ107は、別個のユニット上のストレージ、例えば外部メモリであってよい。図1に示す等の実施形態では、命令は、データメモリ107とは別個の命令メモリ108に記憶され、命令メモリ108からフェッチされる。これらは別個のメモリデバイスであってよく、又は同じメモリデバイスの別個の領域であってよい。いずれの場合でも、命令メモリ108及びデータメモリ107は重複しないアドレス空間を有するため、これは、フェッチステージ103によって実行される命令フェッチが、メモリアクセスステージによって実行されるデータアクセス(ロード又は記憶)と競合するリスクがないことを意味する。データメモリは、限定ではなく、揮発性ストレージ(例えばランダムアクセスメモリ)、不揮発性ストレージ(例えば読み取り専用メモリ)、フラッシュメモリ、又はそのようなメモリの任意の組合せを含み得る。
【0044】
実行ユニット105は、命令セットと呼ばれる予め定義されたセットからの命令に応答して、限られたセットの演算を実行することが可能である。典型的な命令セットは、実行ユニット105が各命令に応答して理解し実施するように構成される、例えばロード、加算、記憶等の命令を含み得る。したがって、実行ユニット105は、一般に、固定小数点算術ユニット(AU)、論理ユニット(LU)、算術論理ユニット(ALU)、及び浮動小数点ユニット(FPU)等のそのような命令を実行するための1つ又は複数の算術演算ユニットを含む。算術とは、数字に対する数学演算を指す:例えば、乗算、加算、除算、減算等。計算は、はるかに広いセットを構成することができる:例えば、オペランド0が真である場合、オペランド1は宛先に記憶され、その他の場合、オペランド2が宛先に記憶される。図1に示すように、実行ユニット105はベクトルユニット201も含み、これにつてより詳細に後述する。
【0045】
本明細書に記載される例によれば、実行ユニット105は、本明細書では例としてVLMACCR(ベクトルロード積和縮小:vector-load-multiply-accumulate-reduce)と呼ばれる新規のタイプの命令を実施するように構成される。
【0046】
図2は、対応する命令に応答してVLMACCR演算を実施するように構成された処理ユニット200を使用したVLMACCR演算の実施例を模式的に示す。VLMACCR演算自体については図3を参照して後述する。
【0047】
処理ユニット200は、ベクトルユニット201及び出力レジスタrAを含む。図2には、上述した入力レジスタrV及びメモリ107も示す。入力レジスタrVは処理ユニット201の一部をなしてもよく、又はなさなくてもよい。同様に,メモリ107も処理ユニット201の一部をなしてもよく、又はなさなくてもよい。
【0048】
出力レジスタrA及び入力レジスタrVは、ベクトルレジスタである。ベクトルレジスタは、ベクトルの異なる成分を保持する複数の要素を含むレジスタである。出力レジスタrA及び入力レジスタrVは、上述した(例えばVLMACCR命令のオペランドによって指定される)レジスタファイル106の一部として実施し得る。代替的には、出力レジスタrA及び入力レジスタrVの1つ又は複数は、ベクトルユニット201によって自動的に使用される暗黙的レジスタであり得る(オペランドによって指定される必要がない)。したがって、特定のレジスタrV、rAが図に示されるが、レジスタ自体は固定されなくてよいことが理解される。即ち、処理ユニット200によって使用可能なより多くのレジスタがあり得、rV及びrAの1つ又は複数はレジスタセット(例えばレジスタファイル106中の)から選ばれ得る。使用するベクトルは、VLMACCR命令のオペランドによって指定し得る(例えば、ベクトルが記憶されるレジスタを指定することにより)。
【0049】
なお、出力レジスタrAは入力レジスタrVと同じ長さである必要はない。出力レジスタrAの2つの端部要素は、本明細書では第1の端部要素及び第2の端部要素と呼ばれる。これらが相対的な名称であることが理解される。即ち、第1の端部要素が左端の要素(図2に示すように)である場合、第2の端部要素は右端の要素であり、逆も同様である。同様に、第1の端部要素が一番上の要素である場合、第2の端部要素は一番下の要素である。
【0050】
レジスタrV及びrAは、異なるタイプ及び/又は幅の要素を記憶し得る。一例では、rVは8ビット整数を記憶し得、rAは32ビット整数を記憶し得る。他の形式も可能であり、例えば32ビット又は16ビットフロート又はタイプを混合することができる。
【0051】
ベクトルユニット201は、上述した実行ユニット105の一環として実施し得る。代替的には、ベクトルユニット201は、実行ユニット105自体とは別体として実施し得る。いずれの場合でも、ベクトルユニット201はメモリ107に動作可能に結合し得る。
【0052】
ベクトルユニット201は、少なくとも2つの入力ベクトルに対して演算を実行して、結果値を生成するように構成される。図2に示す例では、ベクトルユニット201は、第1の入力ベクトルVを保持する入力レジスタrV及び第2の入力ベクトルMを保持するメモリ107に動作可能に結合される。他の例では、V及びMは両方とも、ベクトルユニット201によって使用するために各レジスタに記憶し得る。
【0053】
図2に示す例では、ベクトルユニット201によって実行される演算は内積であり、したがって、入力ベクトルV及びMからベクトルユニット201によって生成される結果値は、MとのVの内積に等しいスカラー値である。1ビット数の内積の特定の実施態様例では、「0」は-1を表すのに使用し得、「1」は+1を表すのに使用し得る(又はこの逆)。そのような場合、積は常に+1又は-1であり(即ちNOT-XOR演算)、値の和は単にこれらの-1ビット及び+1ビットの和であり、これはポピュレーションカウントである。これは、分解能が非常に低いが、並列内積が非常に高い一例である。内積以外の演算をベクトルユニットによって実行してもよい。例えば、ベクトルユニットは単に、点毎加算で2つのベクトルを一緒に加算することが可能であり得る(for k in range(len(V0)):V2[k]=V0[k]+V1[k])。乗算、減算、又は絶対値は他の例である。
【0054】
図3aは、第1の例のVLMACCR演算を模式的に示す。この例では、出力レジスタrAは、8つの要素を含む。出力レジスタrAの初期状態301a及び最終状態301bが示されている。初期状態では、出力レジスタrAの8つの要素は、値A~Aを順に保持する。これらの値は、より詳細に後述するようにゼロに初期化し得る。
【0055】
ベクトルユニット201は、第1の入力ベクトルV及び第2の入力ベクトルMを処理して、結果値sを生成する。先に触れたように、これは、ベクトルユニット201がVとMとの内積を特定することを含み得る。
【0056】
出力レジスタrAの要素における値は、図3aに示すように、結果値sと共に初期状態値A~Aを使用して更新される。即ち:
・出力レジスタrAにおける各値は、左に1つシフトする(即ち要素nからの値は要素n-1に移動する)。
・左端の要素における値Aには結果値sが加算され、合計が出力レジスタrAの右端(n番目の)要素に配置される。
【0057】
図3bは、第2の例のVLMACCR演算を模式的に示す。この例は、図3aの例と同様であるが、出力レジスタrAにおける値は右にシフトする。ここでも、出力レジスタrAの初期状態302a及び最終状態302bが示されている。初期状態では、出力レジスタrAの8つの要素は前と同様に値A~Aを保持している。
【0058】
ここでも、出力レジスタrAの要素における値は、図3aに示すように、結果値sと共に初期状態値A~Aを使用して更新される。しかしながら、これはこの例では:
・出力レジスタrAにおける各値は右に1つシフトする(即ち要素nからの値は要素n+1に移動する)。
・右端要素における値An-1には結果値sが加算され、合計は出力レジスタrAの左端(最初の)要素に配置される。
【0059】
上記の2つの例から分かるように、ベクトルユニット201からの結果値sは、第1の端部要素と第2の端部要素との間で移動する出力ベクトルのいずれかの構成要素に加算される(これは回転方向に依存する)。(出力レジスタrAの一端部から他端部に移動しない)その他の値は単に、いかなる加算もされずに要素1つ分左(又は右)に移動する。
【0060】
したがって、このステップは、結果値が、第1の端部要素と第2の端部要素との間で移動する出力ベクトルの構成要素に加算される、出力レジスタの複数の要素への回転演算(循環シフトとも呼ばれる)である。他の例では、結果値と、第1の端部要素と第2の端部要素との間で移動する出力ベクトルの構成要素とに対して実行される演算は、別の算術演算又は論理演算であり、例えば乗算、XOR、減算等である。
【0061】
出力レジスタrAにおける要素に記憶される値は加算される(出力レジスタrAが回転するにつれて一度に1つずつ)ため、要素は累積器と呼ぶことができる。出力レジスタrA自体も同様の理由で累積器と呼ぶことができる。
【0062】
回転演算は、浮動小数点演算を使用して実施し得る。そのような一実施態様では、データは、最後の要素から最初の要素へのルート(レジスタがどの方向に回転するかに依存する)上に組み合せ要素(例えば加算器)を含んだルートを単に回動する。代替の一実施態様では、キャリーレジスタを使用して、1つの値を一時的に記憶しつつ、その他の値をシフトできる。
【0063】
上述したVLMACCR演算は、例えば以下の疑似コードを使用して表し得る。
【数5】
【0064】
この例では、ベクトルV及びMは両方とも32個の構成要素を含み、出力レジスタrAは、出力値を保持するための8つの要素(累積器)を含む。Mはメモリ107に記憶され、Mの最初の要素はメモリアドレス「address」に配置される。最初の「for」ループは積和演算(内積)を実施する。2番目の「for」ループは、出力レジスタrAの右回転を実施し、積和演算の結果は出力レジスタrAの最初の要素に書き込まれる。
【0065】
先に触れたように、処理ユニット200及びVLMACCR命令は、行列ベクトル乗算を効率的に実施するのに使用することができる。
【数6】
【0066】
後述する図8は、このプログラムコードをフローチャートとして示す。
【0067】
例えば、(例えばメモリ107に記憶される)行列の連続行を順に読み出して、rVに記憶されているベクトルVによって乗算し得る。代替の一実施態様では、行列の行を第2の入力レジスタに記憶することが可能である。VLMACCR演算は、行列の各行で実行され、出力ベクトルAは出力レジスタrAにおいて構成要素毎に自動的に構築される。
【0068】
処理ユニット200が行列MとベクトルVとの積の特定に使用される一例について、図4a~図4dを参照してこれより説明する。この例では、行列Mは32列8行を含む。ベクトルユニット201は、一度に16個の要素を処理することが可能である。入力レジスタrVは、16個の要素を含む。なお、一般に、入力レジスタrVは、ベクトルユニット201が一度に処理可能な数と同数の要素を含むべきである。出力レジスタrAは、出力ベクトルAを保持するための8個の要素を含む。
【0069】
図4aに示すように、出力レジスタrAにおける値はまずゼロに初期化される。
【0070】
ベクトルVの最初の16個の構成要素は、まず、メモリ107から読み出され、入力レジスタrVに記憶される。
【0071】
次いで、第1のVLMACCR命令に応答して、ベクトルユニット201は、ベクトルレジスタrVに記憶されているベクトルVの最初の16個の構成要素及びメモリ107から読み出された行列Mの最初の行の最初の16個の要素に対して演算を行い、出力値s0を生成する。即ち、処理ユニット200は、一度に2つのベクトルに対して演算を行うように構成されている。第1のベクトルはベクトルVであり、第2のベクトルは行列Mの最初の行(及び後続行)である。この例では、第1のベクトルVはレジスタrVに記憶されるが、第2のベクトルはポインタを使用してメモリ107から直接読み出される。行列Mの後続行に対して演算を行うためには、単にポインタを調整するだけでよい。他の例では、第2のベクトルは、(第1のベクトルVと同様に)処理ユニット200による演算のためにベクトルレジスタに記憶されてもよい。そのような場合、第2のベクトル(又はその一部分)は、まず、別個のロード命令を使用してメモリ107から第2の入力レジスタに読み出されてもよい。
【0072】
次いで、回転演算が上述したように適用される。この場合、s0は出力レジスタrAの第1の端部要素(左端要素)の値に加算され、第2の端部要素(右端要素)に配置される。出力レジスタrA中の他の全ての値は左に1要素シフトする。
【0073】
次のステップは、図4bに示されている。第2のVLMACCR命令に応答して、ベクトルユニット201は、ベクトルレジスタrVに記憶されているベクトルVの最初の16個の構成要素及びメモリ107から読み出された行列Mの2行目の最初の16個の要素に対して演算を行い、出力値s1を生成する。なお、Vは再使用されるので、rVに再ロードされる必要はない。
【0074】
次いで、回転演算が適用される。この場合、s1は出力レジスタrAの第1の端部要素(左端要素)の値に加算され、第2の端部要素(右端要素)に配置される。出力レジスタrA中の他の全ての値は、(先に書き込まれたs0を含め)左に1要素シフトされる。
【0075】
次いで、このプロセスは、行列Mの8行の各々からの最初の16個の値が処理されるまで続けられる。換言すれば、行列Mの左側はベクトルユニット201によって掃引されて、出力レジスタrAにおける要素として記憶される「部分和」の第1のセットを生成する。その結果、生成される出力ベクトルレジスタrAの状態は、以下のとおりである:[s0][s1][s2][s3][s4][s5][s6][s7]。
【0076】
図4cに示すように、次いで、ベクトルVの2番目の16個の構成要素がメモリ107から入力レジスタrVにロードされる。
【0077】
9番目のVLMACCR命令に応答して、ベクトルユニット201は、ベクトルレジスタrVに記憶されているベクトルVの2番目の16個の構成要素及びメモリ107から読み出された行列Mの最初の行の2番目の16個の要素に対して演算して、出力値s0’を生成する。
【0078】
次いで、上述したように回転演算が適用される。この場合、s0’は出力レジスタrAの第1の端部要素(左端要素)の値s0に加算され、結果s0’+s0は第2の端部要素(右端要素)に配置される。出力レジスタrA中の他の全ての値は左に1要素シフトする。
【0079】
次のステップは、図4dに示されている。別のVLMACCR命令に応答して、ベクトルユニット201は、ベクトルレジスタrVに記憶されているベクトルの2番目の16個の構成要素及びメモリ107から読み出された行列Mの2行目の2番目の16個の要素に対して演算して、出力値s1’を生成する。なお、ここでも、Vは再使用されるので、rVに再ロードされる必要はない。
【0080】
次いで、回転演算が適用される。この場合、s1’は、出力レジスタrAの第1の端部要素(左端要素)の値s1に加算され、第2の端部要素(右端要素)に配置される。出力レジスタrA中の他の全ての値は左に1要素シフトする。
【0081】
次いで、このプロセスは、行列Mの8行の各々からの2番目の16の値が処理されるまで続けられる。換言すれば、行列Mの右側はベクトルユニット201によって掃引されて、先に特定された部分和の第1のセットに加算されて、出力レジスタrAにおける要素として記憶される「部分和」の第2のセットを生成する。その結果生成される出力ベクトルレジスタrAの状態は以下のとおりである:[s0’+s0][s1’+s1][s2’+s2][s3’+s3][s4’+s4][s5’+s5][s6’+s6][s7’+s7]。これは所望のように最終的な答え(即ちMとVの乗算から生成されるベクトル)である。
【0082】
当然ながら、上記は、入力レジスタrVの厳密に2倍の長さ(且つベクトルユニット201によって処理することができる長さの2倍)である行列M及びベクトルVを参照して説明されたが、同じVLMACCR演算は、任意の長さの入力ベクトルに対して同様の演算を実行するのに使用できる。
【0083】
入力ベクトル長(及び行列Mの幅)が入力レジスタrVよりも短い場合、内積(又は他の演算)の全体は1度に実行することができる。
【0084】
入力ベクトル長がrVの長さの整数倍Nである場合、VLMACCR命令は、出力ベクトルrAのN個の全回転が行われるまで、上述したように使用することができる。
【0085】
入力ベクトル長がrVの長さの非整数倍である場合、上記の組合せが適用される。例えば、16要素ベクトルユニット201を使用して、42構成要素ベクトル演算を処理することは、16個全ての要素が使用される出力レジスタrAの2つの全回転及びそれに続く、要素のうちの10個のみが使用される第3の全回転を含むことになる。
【0086】
図5a及び図5bは、行列が16列16行を含む一例を示す。入力レジスタrVは16個の要素を含む。ベクトルユニット201は、16個の要素を一度に処理するように構成される。出力レジスタrAは8個の要素を含む。
【0087】
VLMACCR演算自体の実施は、上述したものと同様であるため、ここで繰り返さない。
【0088】
この場合、ベクトルユニット201は、行列Mの各行とベクトルVとの内積(又は他の演算)全体を一度に処理することが可能である。したがって、従来のように部分和が関わる回転の繰り返しは必要ない。しかしながら、行列は16行を含み、最終(所望の)出力ベクトルが16の構成要素を有することになることを意味し、これは出力レジスタrAには長すぎる。したがって、処理ユニット200は、図5aに示すように、行列Mの最初の8行がベクトルユニット201によって処理されると、出力レジスタrAの要素から値が記憶場所、例えばメモリ107に出力される(例えばプログラムコードによって命令されるように)ように構成される。なお、上記に与えられたコード例では、この動作を実行するのは外部forループである。
【0089】
次いで図5bに示すように、処理ユニット200は、(出力レジスタをゼロにリセットした後)、同様にして行列Mの次の(最後の)8行の処理を続行する。図5bに示すように、最終結果ベクトルが次いで、第2のプロセスからの値を、記憶場所に既に記憶されている第1のプロセスからの値の終わりに連結することにより、例えば記憶場所に構築される。
【0090】
上記例の全てにおいて、行列Mの行数は、出力レジスタrA中の要素数の整数倍に等しかった。行列Mが任意の他の数の行を含む場合、プロセスは、プロセスへの残りの行数が、出力レジスタrA中の要素数未満であるまで同じである。これらの「残差」行はなお、上述したようにVLMACCR命令を使用して処理することができるが、出力レジスタrAに存在する値は、最初の値(上記例でのs0及びa0)が出力レジスタrAの最初の要素に存在するように再配置する必要がある。したがって、処理ユニット200は、追加の回転演算を適用するように構成し得る。これは、標準回転演算を実施することにより又はメモリ107若しくは入力レジスタrVのいずれかから1つ若しくは複数の「ダミー」VLMACCR演算を(全てゼロを含む)ヌルベクトルに対して実施することによって行うことができる。
【0091】
別の実施態様例では、ベクトルユニット201からの出力は単に出力レジスタrAに書き込まれ、出力レジスタrAは回転する(左又は右に)。これを図6に示す。
【0092】
これにはなお、値のロードを繰り返す必要なく又はベクトルレジスタ中の場所を指定するいかなる追加情報も必要なく、命令の反復適用によって出力ベクトルを自動的に構築できるようにするという利点があるが、出力レジスタrAの1つの前回転にしか使用できない。入力行列が、出力レジスタrA中の要素よりも多くの行を含む場合、追加の演算が必要である。これらについて後述する。
【0093】
図7は、図6に示す例で処理ユニット200によって実行される方法の一例を模式的に示す。処理ユニット200は、本明細書ではここでもVLMACCR命令と呼ぶ単一の命令に応答して方法を実行するように構成される。
【0094】
S701において、ベクトルM及びベクトルVからの各構成要素はベクトルユニット201によって乗算される。即ち、ベクトルユニット201はrMのn番目の要素における値をrVのn番目の要素における値で乗算する。個々の各乗算演算はスカラー値を生成する。
【0095】
S702において、スカラー値はベクトルユニット201によって単一の結果値A1に累積される。即ち、ベクトルユニット201は各乗算演算から生じたスカラー値を合算して結果値A1を生成する。ベクトルユニット201は結果値A1をレジスタrAに提供する。
【0096】
S701及びS702はともに、ベクトルユニット201が2つの入力ベクトルの内積を特定することに対応する。したがって、この例では、結果値A1はスカラー値である。先に触れたように、内積以外の演算をベクトルユニットによって実行してもよい。
【0097】
S703において、出力レジスタrAは回転演算(循環シフトとも呼ばれる)を実行する。この一例は、図6において点線矢印で模式的に示されている。回転演算は、積和演算と並列に(同時に)実行し得る。一般に、演算はパイプライン化可能であり、例えば、メモリに1ステージ、乗算に1ステージ、及び累積器を実施する加算ツリーに1ステージである。
【0098】
回転演算自体は既知である。図6に示す例では、出力レジスタrAは、全ての値が左にシフトされ、第1の端部要素の値が第2の端部要素に書き込まれる「左回転」を実行する。即ち、出力レジスタrAの最初の要素に存在する値は最後の要素に書き込まれ、他の全ての要素nに存在する値はrAのn-1番目の要素に書き込まれる。他の例では、出力レジスタrAは、値が逆方向に移動する(即ち、第2の端部要素に存在する値が第1の端部要素に書き込まれ、他の全ての要素nに存在する値はn+1要素に書き込まれる)「右回転」を実行し得る。これについてより詳細に後述する。
【0099】
S704において、結果値A1は出力レジスタrAの最初の要素に書き込まれる。即ち、出力レジスタrAは、ベクトルユニット201から受け取った結果値を出力レジスタrAの最初の要素に記憶する。この例では、出力レジスタrAの最初の要素は、図6に示すように左端要素である。
【0100】
上記例では、回転演算は、結果値A1が出力レジスタrAの最初の要素に書き込まれる前に実行される。他の例では、出力レジスタrAは、出力値が最初の要素に書き込まれた後、回転し得る(何れかの方向に)。
【0101】
したがって、演算順(最初に回転又は最初に書き込み)及び回転方向(左又は右)に4つの可能な組合せが存在する。これについて、VLMACCR命令の反復インスタンスによって4×4行列Mが4構成要素ベクトルVで乗算される簡単な例を参照してこれより説明する。例では、VLMACCR演算は4回適用されて、4つの結果値A~Aを生成する。この例では、出力レジスタrAのサイズも4要素である。
【0102】
VLMACCR演算がまず出力レジスタrAを右に回転し、次いでベクトルユニット201からの結果を出力レジスタrAの最初の要素に書き込むことを含む第1の例を考える。4つのVLMACCR演算後、出力レジスタrAは最終ベクトルAを含む。ベクトルAの各構成要素A~Aは、出力レジスタrAの異なる要素に存在する。重要なことに、構成要素A~Aは正しい順にある。次いでベクトルAは、例えばメモリ107又は何らかの他の記憶場所に出力し得る。
【0103】
VLMACCR演算がまず、結果をベクトルユニット201から出力レジスタrAの最初の要素に書き込み、次いで出力レジスタrAを左に回転することを含む第2の例を考える。前と同様に、4つのVLMACCR演算後、出力レジスタrAは最終ベクトルAを含む。ベクトルAの各構成要素A~Aは出力レジスタrAの異なる要素に存在する。重要なことに、構成要素A~Aは正しい順にある。次いでベクトルAは、例えばメモリ107又は何らかの他の記憶場所に出力し得る。なお、この例では、ベクトルAの要素A~Aは、最初の例と比較して逆順になる。
【0104】
VLMACCR演算がまず出力レジスタrAを左に回転し、次いで結果をベクトルユニット201から出力レジスタrAの最初の要素に書き込むことを含む第3の例を考える。4つのVLMACCR演算後、出力レジスタrAは、前と同様にベクトルAの構成要素A~Aを含む。しかしながら、前例と異なり、構成要素A~Aは正しい順ではない。追加の修正演算を実施して、これを考慮に入れることができる。この例では、修正演算は左回転を含む。3つの右回転を使用することもできる。
【0105】
VLMACCR演算がまず、結果をベクトルユニット201から出力レジスタrAの最初の要素に書き込み、次いで出力レジスタrAを右に回転することを含む第4の例を考える。第3の例と同様に、4つのVLMACCR演算後、出力レジスタrAはベクトルAの構成要素A~Aを含むが、正しい順ではない。ここでも、追加の修正演算を実施して、これを考慮に入れることができる。この例では、修正演算は左回転を含む。3つの右回転を使用することもできる。
【0106】
先に与えられた全ての例では、出力レジスタrAの長さは、計算すべきベクトルAと同じ長さであると仮定された。しかしながら、出力レジスタrAは固定サイズ(例えば32要素)を有し、一方、特定すべきベクトルAは、これよりも小さいか又は大きい(例えば32構成要素よりも小さいか又は大きい)サイズを有し得る。ベクトルAが出力レジスタrAの要素よりも多くの構成要素を含む場合については先に考察した。
【0107】
ベクトルAが出力レジスタrAの要素よりも少ない構成要素を含む場合、ベクトルAの全ての要素は、VLMACCR命令の完了時、出力レジスタrA(のどこか)に存在することになる。上記と同様に、値を「再配置」するために追加の演算が必要になることもあれば、ないこともある。
【0108】
これらの追加の演算の性質は、VLMACCR命令の特定の実施に依存する。これは、上述した4つの例を考慮することによって説明することができるが、最初の3つのVLMACCR命令は1回のみ実行される。これは、出力レジスタrAが4要素長であり、3つの構成要素のみを有するベクトルAを計算する演算の一環として使用される一例に対応する。
【0109】
最初の例では、3つのVLMACCR命令後の出力レジスタrAの状態は以下のとおりである:[A3][A2][A1][0]。追加の右回転演算を使用して、結果ベクトルAの要素を再配置することができる。
【0110】
2番目の例では、3つのVLMACCR命令後の出力レジスタrAの状態は以下のとおりである:[0][A1][A2][A3]。追加の左回転演算を使用して、結果ベクトルAの要素を再配置することができる。
【0111】
3番目の例では、3つのVLMACCR命令後の出力レジスタrAの状態は以下のとおりである:[A3][0][A1][A2]。2つの追加の左回転演算を使用して、結果ベクトルAの要素を再配置することができる。
【0112】
4番目の例では、3つのVLMACCR命令後の出力レジスタrAの状態は以下のとおりである:[0][A3][A2][A1]。この場合、追加の演算は必要ない。
【0113】
図8は、処理ユニット200がカウンタを使用して、VLMACCR命令が現サイクルで実行された回数を追跡するように構成された、本明細書に記載される一例による方法を示すフローチャートである。カウンタは方法の開始時にリセットし得る。
【0114】
図8に示す方法は、以下に示すコードの最外forループを除いたものを表す。
【数7】
【0115】
即ち、フローチャートは、行列Mの1行とrVからのベクトルVとの内積を実施する方法の一例を表す。
【0116】
この例では、出力ベクトルAは8構成要素の整数倍を含み、入力ベクトルVは16構成要素の整数倍を含み、ベクトルユニット201が16の乗加算を同時に実行して、8要素の回転累積器rAにすることができると仮定する。
【0117】
S800において、処理ユニット200は、カウンタiを0にリセットし、出力ベクトルAの最初の部分を計算していることを示す。
【0118】
S801において、(即ち、出力レジスタrAの各要素に存在する値がゼロになるよう)処理ユニット200は、全ての累積器の値をゼロにリセットすることによって出力レジスタrAをリセットする。
【0119】
S802において、処理ユニット200はカウンタjを0にリセットする。これは、行列Mの最初の16列(即ちMの1行目からの最初の16個の要素)を処理していることを示す。
【0120】
S803において、処理ユニット200は、行列Mの最初の16列と乗算する入力ベクトルVの最初の16個の値をロードする。続く反復において、jはベクトルの後の部分を指すように変更され、S803において、処理ユニット200は、行列の2番目の16行、3番目の16行と乗算するベクトルの2番目の16個の値、3番目の16個の値等をロードする。
【0121】
S804において、処理ユニット200は、行列中のi、i+1、i+2、・・・、i+7を使用して8つのVLMACCR命令を実施する。
【0122】
S805において、処理ユニット200はカウンタjを16増分して、ベクトルV及び行列Mの次の部分に演算するようにS803及びS804を進める。
【0123】
S806において、処理ユニット200は、カウンタjが入力ベクトルの長さに等しいか否か(即ち行列Mの部分の終わりに達したか否か)を判断する。部分の終わりに達した場合、VLMACCR命令は残っておらず、方法はS807に進む。その他の場合、ステップ803、S804、及びS805が再び実行されて、行列Mの次の16列にわたって繰り返す。
【0124】
S807において、処理ユニット200は、出力レジスタrAに存在する値を別の記憶場所、例えばメモリ107に出力する。これは、S806において、出力レジスタrAが全回転のセットを完了したと判断されたためであり、これは、出力レジスタrAの全ての要素がこの時点で、現計算から生成されたベクトルユニット201からの値を保持していることを意味する。
【0125】
S808において、処理ユニット200はカウンタiを8増分して、行列Mの次の部分に対して演算するようにS804で使用された行アドレスを進める。
【0126】
S809において、処理ユニット200は、カウンタiの値が出力ベクトルV中の要素の数(「n」)に等しいか否かを判断する。即ち、処理ユニット200は、方法がS800において開始されてから、出力レジスタrAが出力ベクトルVの各部分に記憶されたか否かを判断する。各部分に記憶された場合、方法は終了する。各部分に記憶されていない場合、方法はS801に進む。
【0127】
プロセッサは、パイプラインプロセッサであってもよい。パイプラインプロセッサでは、実行ユニットは一連のパイプラインステージに分割され、各々が特定のタイプの演算を実行する。パイプラインは、典型的には、フェッチステージ、デコードステージ、レジスタ読み出しステージ、少なくとも1つの計算ステージ、及び1つ又は複数のメモリアクセスステージを含む。命令フェッチステージは、最初の命令をメモリからフェッチし、それをパイプラインの最初のステージに発行する、次のプロセッササイクルにおいて、復号化された命令は、パイプライン中の次のステージ、例えばレジスタ読み出しステージに渡される。同時に、フェッチステージは、2番目の命令を命令メモリからデコードステージにフェッチする。その後の次に続くプロセッササイクルにおいて、最初の命令は、3番目のパイプラインステージ、例えば計算ステージに渡され、一方、2番目の命令は、2番目のパイプラインステージに渡され、3番目の命令は、最初のパイプラインステージに発行される等々である。これなしでは、プロセッサは、次を実行ユニットに発行する前に、命令全体の実行を待つ必要があるため、これはプロセッサをビジーに保ち、それにより待ち時間を短縮するのに役立つ。
【0128】
プロセッサは、マルチスレッドプロセッサであってもよい。マルチスレッドプロセッサでは、プロセッサは複数のコンテキストレジスタセットを含み、各コンテキストレジスタセットは、複数の現在実行中のプログラムスレッドのそれぞれ1つのコンテキスト(即ちプログラム状態)を表す。プログラム状態は、各スレッドのプログラムカウンタ、各スレッドのオペランド、及び任意にスレッド又はコンテキストが現在アクティブであるか否か等の各ステータス情報を含む。プロセッサは、例えばラウンドロビン様式でパイプラインを通る命令を一時的にインターリーブするよう命令フェッチステージを制御するように構成されたスケジューラを更に含む。そのようにインターリーブされたスレッドは、同時に実行されると言える。実行ユニットがパイプライン化される場合、1つのスレッドの命令があるパイプラインステージから次のパイプラインステージに進むにつれて、別のスレッドの命令はパイプラインを1ステージ分下がって進む等々である。このインターリーブ手法は、パイプライン待ち時間を隠すより多くの機会を提供するため、有益である。インターリーブなしでは、パイプラインは、パイプラインにおいて命令間の従属性を解決するためのメカニズムを必要とし(2番目の命令は最初の命令の結果を使用し得、間に合わないことがある)、最初の命令が実行を完了するまで2番目及び更なる命令が保留されるパイプラインバブルを生み出す恐れがある。
【0129】
本明細書では、データを記憶するためにデータストレージを参照する。これは、単一のデバイス又は複数のデバイスによって提供し得る。適したデバイスには、例えば、ハードディスク及び不揮発性半導体メモリ(例えば固体状態デバイス(SSD)を含む)が含まれる。
【0130】
本明細書に記載された例は、本発明の実施形態の説明のための例として理解されるべきである。更なる実施形態及び例が考案される。任意の一例又は一実施形態に関連して記載された任意の特徴は、単独で又は他の特徴と組み合わせて使用し得る。加えて、任意の一例又は一実施形態に関連して記載された任意の特徴は、任意の他の例若しくは実施形態又は任意の他の例若しくは実施形態の任意の組合せの1つ若しくは複数の特徴と組み合わせて使用することも可能である。さらに、特許請求の範囲に規定される本発明の範囲内で、本明細書に記載されていない均等物及び変更を採用することも可能である。
図1
図2
図3a
図3b
図4a
図4b
図4c
図4d
図5a
図5b
図6
図7
図8