(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023103392
(43)【公開日】2023-07-26
(54)【発明の名称】ベクトル計算ユニット
(51)【国際特許分類】
G06F 15/173 20060101AFI20230719BHJP
G06F 17/16 20060101ALI20230719BHJP
【FI】
G06F15/173 660Z
G06F17/16 F
【審査請求】有
【請求項の数】1
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2023081312
(22)【出願日】2023-05-17
(62)【分割の表示】P 2020503785の分割
【原出願日】2018-06-20
(31)【優先権主張番号】15/710,433
(32)【優先日】2017-09-20
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】15/920,156
(32)【優先日】2018-03-13
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】62/625,251
(32)【優先日】2018-02-01
(33)【優先権主張国・地域又は機関】US
(31)【優先権主張番号】62/536,399
(32)【優先日】2017-07-24
(33)【優先権主張国・地域又は機関】US
(71)【出願人】
【識別番号】510192916
【氏名又は名称】テスラ,インコーポレイテッド
(74)【代理人】
【識別番号】110000659
【氏名又は名称】弁理士法人広江アソシエイツ特許事務所
(72)【発明者】
【氏名】ダス サルマ,デブジット
(72)【発明者】
【氏名】タルペス,エミル
(72)【発明者】
【氏名】バノン,ピーター ジョセフ
(57)【要約】 (修正有)
【課題】大きなデータセットに対して機械学習および人工知能固有の処理操作を並列して実行するシステムおよび方法を提供する。
【解決手段】マイクロプロセッサシステム100は、計算配列であるマトリクスプロセッサ107とベクトル計算ユニットであるベクトルエンジン111と、計算配列のためのデータを準備するための入力モジュールであるデータ入力103および重み入力105と、を備える。計算配列は、複数の計算ユニット109を含む。ベクトル計算ユニットは、計算配列と通信しており、複数の処理要素113を含む。処理要素は、計算配列から出力データ要素を受け取り、受け取った出力データ要素を並列処理する。
【選択図】
図1
【特許請求の範囲】
【請求項1】
複数の計算ユニットを含む計算配列と、
該計算配列と通信するベクトル計算ユニットと、を備える、マイクロプロセッサシステム。
【請求項2】
前記ベクトル計算ユニットは、複数の処理要素を含み、該処理要素は、前記計算配列から出力データ要素を受け取り、該受け取った出力データ要素を並列処理するように構成される、請求項1に記載のシステム。
【請求項3】
前記処理要素は、単一のプロセッサ命令に応答して、前記受け取った出力データ要素を並列処理する、請求項2に記載のシステム。
【請求項4】
前記計算配列がマトリクスプロセッサを含む、請求項1に記載のシステム。
【請求項5】
前記計算配列は、2つのベクトル入力オペランドを受け取るように構成される、請求項1に記載のシステム。
【請求項6】
前記複数の計算ユニットの各計算ユニットは、算術論理演算ユニット、アキュムレータおよびシャドウレジスタを含む、請求項1に記載のシステム。
【請求項7】
前記複数の計算ユニットの各計算ユニットは、乗算演算および加算演算を実行するように構成される、請求項1に記載のシステム。
【請求項8】
前記複数の計算ユニットの各計算ユニットは、ドット積成分演算を実行するように構成される、請求項1に記載のシステム。
【請求項9】
前記複数の計算ユニットの各計算ユニットは、単一の計算配列命令に応答して、ドット積結果成分を並列して計算するように構成される、請求項1に記載のシステム。
【請求項10】
前記複数の処理要素の各処理要素は、他の処理要素と並列して算術論理演算ユニット操作を実行するように構成された算術論理演算ユニットを含む、請求項2に記載のシステム。
【請求項11】
通知信号が、前記計算配列からの出力データ要素が前記ベクトル計算ユニット用に準備ができていることを識別する、請求項2に記載のシステム。
【請求項12】
前記計算配列は、先入れ先出しキューとして動作するように構成される、請求項1に記載のシステム。
【請求項13】
前記計算配列からの前記出力データ要素は、ドット積結果に相当する、請求項2に記載のシステム。
【請求項14】
前記計算配列からの前記出力データ要素は、画像データに対して実行された畳み込み結果に相当する、請求項2に記載のシステム。
【請求項15】
前記単一のプロセッサ命令は、非線形関数の結果を計算するために使用される、請求項3に記載のシステム。
【請求項16】
前記非線形関数は、正規化線形ユニット関数またはシグモイド関数である、請求項15
に記載のシステム。
【請求項17】
前記ベクトル計算ユニットと通信する後処理ユニットをさらに備える、請求項1に記載のシステム。
【請求項18】
前記後処理ユニットは、プーリング機能を実行するように構成される、請求項17に記載のシステム。
【請求項19】
前記計算配列から受け取った前記出力データ要素はアキュムレータに格納される、請求項2に記載のシステム。
【請求項20】
前記複数の処理要素の各処理要素は、前記アキュムレータのスライスおよび1つまたは複数のベクトルレジスタのスライスにアクセスするように構成される、請求項19に記載のシステム。
【請求項21】
前記ベクトル計算ユニットは、前記計算配列からの出力データ要素に適合するサイズの複数のベクトルレジスタをさらに含む、請求項2に記載のシステム。
【請求項22】
複数の計算ユニットを含み、該複数の計算ユニットの各計算ユニットが単一の計算配列命令に応答してドット積成分演算を実行するように構成された計算配列と、
該計算配列と通信するベクトル計算ユニットであって、該ベクトル計算ユニットは複数の処理要素を含み、該処理要素は、前記計算配列から出力データ要素を受け取り、単一のベクトル計算ユニット命令に応答して、該受け取った出力データ要素を並列処理するように構成されるベクトル計算ユニットと、
を備える、マイクロプロセッサシステム。
【請求項23】
前記単一の計算配列命令を前記計算配列に提供し、前記単一のベクトル計算ユニット命令を前記ベクトル計算ユニットに提供するように構成された制御ユニットをさらに備える、請求項22に記載のシステム。
【請求項24】
前記制御ユニットは、前記計算配列から転送された前記出力データ要素を前記ベクトル計算ユニットの前記処理要素に同期させる、請求項23に記載のシステム。
【請求項25】
ベクトル計算ユニットのための単一のプロセッサ命令を受け取り、該ベクトル計算ユニットは計算配列と通信しており、該計算配列から出力データ要素を受け取るように構成された複数の処理要素を含む工程と、
前記計算配列から該出力データ要素を受け取り、該計算配列は複数の計算ユニットを含む工程と、
該単一のプロセッサ命令に応答して、該受け取った出力データ要素を並列処理する工程と、を含む方法。
【発明の詳細な説明】
【技術分野】
【0001】
[関連出願の相互参照]
本出願は、2018年2月1日に出願されたVECTOR COMPUTATIONAL UNITというタイトルが付けられた米国仮特許出願第62/625,251号の優先権を主張し、かつ2017年7月24日に出願されたACCELERATED MATHEMATICAL ENGINEというタイトルが付けられた米国仮特許出願第62/536,399号の優先権を主張しており、また2017年7月24日に出願されたACCELERATED MATHEMATICAL ENGINEというタイトルが付けられた米国仮特許出願第62/536,399号の優先権を主張する2017年9月20日に出願されたACCELERATED MATHEMATICAL ENGINEというタイトルが付けられた同時出願中の米国特許出願第15/710,433号の一部継続であり、これらの特許はすべて、あらゆる目的のために参照により本明細書に組み込まれている。
【背景技術】
【0002】
機械学習および人工知能の処理には、通常、大量のデータセットに対して数学的演算を実行する必要があり、多くの場合、複数の畳み込み層とプーリング層の解明を伴う。機械学習および人工知能技術は通常、行列演算および活性化関数などの非線形関数を利用する。機械学習のアプリケーションには、自動運転およびドライバ支援自動車が含まれる。一部のシナリオでは、コンピュータプロセッサを使用して機械学習のトレーニングと推論を実行する。従来のコンピュータプロセッサは、1つの数学的演算を非常に高速に実行することは可能であるが、通常、限られた量のデータにしか同時に作用することができない。1つの代替として、グラフィカル処理ユニット(GPU)が利用される場合もあり、より大きなデータセットに対して同じ数学的演算を並列して実行することが可能である。複数のプロセッサコアを利用することによって、GPUは複数のタスクを並列して実行してもよく、通常、従来のコンピュータプロセッサよりも高速で並列処理を利用した大規模なグラフィックス処理タスクを完了することが可能である。ただし、GPUも従来のコンピュータプロセッサも、もともと機械学習や人工知能操作用に設計されたものではない。機械学習および人工知能操作は、非常に大きなデータセットに対して一セットの特定の機械学習プロセッサ操作を繰り返し適用することに依存している場合が多い。したがって、各並列操作に関して複数の処理コアのオーバーヘッドなしで、大きなデータセットに対して機械学習および人工知能固有の処理操作を並列して実行することをサポートするマイクロプロセッサシステムに対する要望がある。
【発明の概要】
【発明が解決しようとする課題】
【0003】
本発明の様々な実施形態は、以下の詳細な説明および添付の図面に開示されている。
【図面の簡単な説明】
【0004】
【
図1】機械学習処理を実行するためのマイクロプロセッサシステムの一実施形態を示すブロック図である。
【0005】
【
図2】機械学習処理を実行するためのマイクロプロセッサシステムの一実施形態を示すブロック図である。
【0006】
【
図3】機械学習処理を実行するためのマイクロプロセッサシステムの一実施形態を示すブロック図である。
【0007】
【
図4A】機械学習処理を実行するためのベクトル計算ユニットの一実施形態を示すブロック図である。
【0008】
【
図4B】ベクトルレジスタの例示的なエイリアシングを示す表である。
【0009】
【
図5】マイクロプロセッサシステムに関するプロセッサ命令を決定するためのプロセスの一実施形態を示すフロー図である。
【0010】
【
図6A】ベクトル計算ユニットの実行を進行させるためのプロセスの一実施形態を示すフロー図である。
【0011】
【
図6B】ベクトル計算ユニットによりベクトルデータを処理するためのプロセスの一実施形態を示すフロー図である。
【0012】
【
図7】ベクトル計算ユニット命令の符号化フォーマットの一実施形態を示すブロック図である。
【0013】
【
図8】ベクトル計算ユニットにより単一のベクトル計算ユニット命令を実行するためのプロセスの実施形態を示すフロー図である。
【0014】
【
図9】ベクトル計算ユニットの例示的な命令サイクルを示す図である。
【0015】
【
図10】計算配列の計算ユニットの一実施形態を示すブロック図である。
【発明を実施するための形態】
【0016】
本発明は、プロセス、装置、システム、物質の組成、コンピュータ可読記憶媒体で具現化されるコンピュータプログラム製品、ならびに/またはプロセッサに結合されたメモリに格納された、および/もしくはプロセッサに結合されたメモリによって提供される命令を実行するように構成されたプロセッサなどのプロセッサとして含め、多数の方法で実行することができる。本明細書では、これらの実装形態、または本発明が採り得る他の任意の形態は、技術と呼ばれる場合がある。一般に、開示されるプロセスのステップの順序は、本発明の範囲内で変更されてもよい。特に明記しない限り、タスクを実行するように構成されていると説明されるプロセッサやメモリなどのコンポーネントは、特定の時間にタスクを実行するように一時的に構成されている一般的なコンポーネント、またはタスクを実行するように製造された特定のコンポーネントとして実装されてもよい。本明細書で使用される「プロセッサ」という用語は、コンピュータプログラム命令などのデータを処理するように構成された1つまたは複数のデバイス、回路、および/または処理コアを指す。
【0017】
本発明の1つまたは複数の実施形態の詳細な説明が、本発明の原理を説明する添付の図とともに以下に提供される。本発明はそのような実施形態に関連して説明されるが、本発明はいかなる実施形態にも限定されない。本発明の範囲は、特許請求の範囲によってのみ制限され、本発明は、多数の代替形態、修正形態および均等物を包含する。本発明の完全な理解を提供するために、多数の特定の詳細が以下の説明に記載されている。これらの詳細は例の目的のために提供されており、本発明はこれらの特定の詳細の一部またはすべてがなくても、特許請求の範囲に従って実施され得る。明確にするために、本発明が不必要に不明瞭にならないように、本発明に関連する技術分野で知られている技術資料は詳細には説明されていない。
【0018】
ベクトル計算ユニットおよびベクトル計算ユニット命令セットアーキテクチャを利用するマイクロプロセッサシステムが開示されている。例えば、マイクロプロセッサシステムは、ベクトル計算ユニットと通信する計算配列を含む。様々な実施形態において、計算配列は、2つの入力ベクトルに対して算術演算を実行することが可能なマトリクスプロセッサであり、入力ベクトルからM個のオペランドとN個のオペランドを受け取る複数の計算ユニットを含む。いくつかの実施形態では、計算ユニットは、ドット積の生成および畳み込みのための様々な処理の実行などの操作を実行するための算術論理演算ユニット、アキュムレータおよびシャドウレジスタを含むサブ回路である。各コアがその固有の独自の処理命令を受け取るように構成されている従来のグラフィカル処理ユニット(GPU)または中央処理ユニット(CPU)処理コアとは異なり、計算配列の計算ユニットは各々、計算配列が受け取った個々の命令に応答して同じ計算を並列して実行する。様々な実施形態において、ベクトル計算ユニットは、入力データのベクトルに対してロード操作、算術演算およびストア操作を並列して実行するための複数の処理要素を含む。ベクトル計算ユニットの処理要素は、計算配列から出力を受け取るように構成される。様々な実施形態において、計算配列の出力およびベクトル計算ユニットへの入力は、データの配列である。ベクトル計算ユニットに受け取られた入力は、単一のプロセッサ命令に応答して並列処理される。計算配列と同様に、ベクトル計算ユニットの処理要素はそれぞれ、ベクトル計算ユニットが受け取った個々の命令に応答して同じ計算を並列して実行する。いくつかの実施形態では、マイクロプロセッサシステムは、ベクトル計算ユニットに命令を提供するように構成された制御ユニットをさらに含む。各単一のプロセッサ命令は、ベクトル計算ユニットによって実行される複数のコンポーネント命令を指定してもよい。単一の命令に応答して、ベクトル計算ユニットの複数の処理要素のそれぞれは、他の処理要素と並列してベクトル入力の異なるデータ要素を処理する。いくつかの実施形態では、ベクトル計算ユニットの出力は、プーリング作業などの後処理を実行するための後処理ユニットに供給される。
【0019】
いくつかの実施形態では、マイクロプロセッサシステムは、少なくとも計算配列と、ベクトル計算ユニットとを含む。例えば、計算配列の出力がベクトル計算ユニットへの入力として供給されるように、計算配列はベクトル計算ユニットに通信可能に接続される。様々な実施形態において、計算配列は複数の計算ユニットを含む。例えば、計算ユニットは、1つまたは複数の乗算、加算およびシフト演算を実行する機能を含むマトリクスプロセッサのサブ回路であり得る。別の例として、計算ユニットは、ドット積演算を実行する機能を含むサブ回路であり得る。様々な実施形態において、計算配列には、データ入力に対して複数の操作を並列して実行するのに十分な数の計算ユニットが含まれる。例えば、M個のオペランドとN個のオペランドを受け取るように構成された計算配列には、少なくともM×N個の計算ユニットが含まれてよい。様々な実施形態において、マイクロプロセッサシステムは、計算配列とベクトル計算ユニットとの間の処理を調整するための制御ユニットをさらに含む。例えば、制御ユニットは、メモリから計算配列に供給されるデータ、計算配列からベクトル計算ユニットに供給されるデータ、および/またはベクトル計算ユニットからメモリに格納される、または後処理ユニットに供給されるデータを調整してもよい。いくつかの実施形態では、制御ユニットは、計算配列命令を計算配列に提供する、ベクトル計算ユニット命令をベクトル計算ユニットに提供する、および/または後処理命令を後処理ユニットに提供するように構成される。
【0020】
いくつかの実施形態では、計算配列と通信するベクトル計算ユニットは、入力として計算配列から出力データ要素を受け取るように構成された複数の処理要素を含む。例えば、ベクトルエンジンなどのベクトル計算ユニットは、処理するためのベクトルを入力として受け取る。ベクトル計算ユニットは、入力ベクトルの各要素に対する処理要素を含んでもよい。N個の要素(またはオペランド)のベクトルを受け取るように構成された例示的なベクトル計算ユニットは、N個の要素を並列して処理するためのN個の処理要素を含んで
よい。様々な実施形態において、処理要素は、計算配列から出力データ要素を受け取るように構成される。例えば、計算配列からの出力は、ベクトル計算ユニットの処理要素が受け取るように供給されるデータ要素のベクトルであり得る。様々な実施形態において、各ベクトル計算ユニットは、単一のプロセッサ命令に応答して、計算配列から受け取った出力データ要素を並列処理する。例えば、単一のプロセッサ命令が、対応するデータ要素に対して実行されるベクトル計算ユニットの処理要素のそれぞれに適用される。
【0021】
いくつかの実施形態では、制御ユニットは、ベクトル計算ユニットに少なくとも単一のプロセッサ命令を提供するように構成される。単一のプロセッサ命令は、(例えば、単一のプロセッサ命令に応答して)ベクトル計算ユニットによって実行される複数のコンポーネント命令を指定する。例えば、制御ユニットは、複数のコンポーネント命令を含む命令トライアドなどの単一のベクトル命令をベクトル計算ユニットに提供する。いくつかの実施形態では、命令トライアドは、別個のロード命令、算術論理演算ユニット(ALU)命令およびストア命令などの最大3つのコンポーネント命令を含む簡素なプロセッサ命令である。3つのコンポーネント命令は、ベクトル計算ユニットによって受け取られ、(例えば、命令トライアドに応じて)実行される。例えば、ロード命令、ALU命令およびストア命令をバンドルする命令トライアドを受け取るベクトル計算ユニットは、そのロード命令、算術命令およびストア命令を実行する。様々な実施形態では、単一のプロセッサ命令に応答して、ベクトル計算ユニットの複数の処理要素は、他の処理要素と並列して異なるデータ要素を処理するように構成される。例えば、各処理要素は、入力ベクトルからベクトル計算ユニットへの異なるデータ要素を並列処理することが可能である。
別の例として、単一のベクトルプロセッサ命令トライアドのコンポーネント命令の各々がベクトル入力の各要素に適用されて、ベクトル計算ユニットを使用してN個の要素の入力ベクトル全体の処理を並列して完了する場合もある。
【0022】
図1は、機械学習処理を実行するためのマイクロプロセッサシステムの一実施形態を示すブロック図である。示される例では、マイクロプロセッサシステム100は、制御ユニット101、データ入力103、重み入力105、マトリクスプロセッサ107、ベクトルエンジン111および後処理ユニット115を含む。データ入力103および重み入力105は、マトリクスプロセッサ107のためのデータを準備するための入力モジュールである。いくつかの実施形態では、データ入力103および重み入力105はそれぞれ、入力データフォーマッタ、キャッシュもしくはバッファ、および/またはマトリクスプロセッサ107のためのデータを準備するための論理回路を含む。例えば、データ入力103は、画像データに対応する2次元配列からN個のオペランドを準備し、重み入力105は、マトリクスプロセッサ107によって処理される重み値のベクトルに対応するM個のオペランドを準備することができる。いくつかの実施形態では、
図5のプロセスは、マトリクスプロセッサ107に対するマトリクスプロセッサ命令およびベクトルエンジン111に対するベクトルエンジン命令を含む、マイクロプロセッサシステム100上で機能するための命令を準備するために実行される。いくつかの実施形態では、ベクトルエンジン111を含むマイクロプロセッサシステム100は、
図6A、
図6Bおよび
図8に関して以下で説明するプロセスを実行する。
【0023】
いくつかの実施形態では、マトリクスプロセッサ107は、複数の計算ユニットを含む計算配列である。例えば、重み入力105およびデータ入力103からそれぞれM個のオペランドおよびN個のオペランドを受け取るマトリクスプロセッサはM×N個の計算ユニットを含む。示される図では、マトリクスプロセッサ107の内部の小さな正方形は、マトリクスプロセッサ107が計算ユニットの論理的2次元配列を含むことを示している。計算ユニット109は、マトリクスプロセッサ107の複数の計算ユニットのうちの1つである。いくつかの実施形態では、各計算ユニットは、データ入力103から1つのオペランドを受け取り、重み入力105から1つのオペランドを受け取るように構成される。
いくつかの実施形態では、計算ユニットは論理的二次元配列に従って構成されるが、マトリクスプロセッサは必ずしも物理的な二次元配列として配置された計算ユニットで製造されるわけではない。例えば、データ入力103のi番目のオペランドおよび重み入力105のj番目のオペランドは、マトリクスプロセッサ107のi番目×j番目の計算ユニットによって処理されるように構成される。
【0024】
様々な実施形態において、コンポーネントデータ入力103、重み入力105、マトリクスプロセッサ107、ベクトルエンジン111および後処理ユニット115のデータ幅は広いデータ幅であり、複数のオペランドを並列して転送する能力を含む。いくつかの実施形態では、データ入力103および重み入力105はそれぞれ96バイト幅である。いくつかの実施形態では、データ入力103は192バイト幅であり、重み入力105は96バイト幅である。様々な実施形態において、データ入力103および重み入力105の幅は動的に構成することが可能である。例えば、データ入力103は、96バイトまたは192バイトに動的に構成されてもよく、重み入力105は、96バイトまたは48バイトに動的に構成されてもよい。いくつかの実施形態では、動的な構成は制御ユニット101によって制御される。さまざまな実施形態において、96バイトのデータ幅により、96個のオペランドを並列して処理することが可能になる。例えば、データ入力103が96バイト幅になるように構成された実施形態では、データ入力103は、96のオペランドをマトリクスプロセッサ107に並列して転送することができる。
【0025】
様々な実施形態において、マトリクスプロセッサ107は、データ入力103からNバイトを受け取り、重み入力105からMバイトを受け取るように構成されており、少なくともM×Nの計算ユニットを含む。例えば、マトリクスプロセッサ107は、データ入力103から96バイトを受け取り、重み入力105から96バイトを受け取るように構成されてもよく、少なくとも96×96の計算ユニットを含む。別の例として、マトリクスプロセッサ107は、データ入力103から192バイトを受け取り、重み入力105から48バイトを受け取るように構成されてもよく、少なくとも192×48の計算ユニットを含む。様々な実施形態において、マトリクスプロセッサ107の次元は動的に構成されてもよい。例えば、マトリクスプロセッサ107のデフォルト次元は、データ入力103から96バイトを受け取り、重み入力105から96バイトを受け取るように構成され得るが、入力次元は、192バイトおよび48バイトにそれぞれ動的に構成されてもよい。様々な実施形態において、各計算ユニットの出力サイズは、入力サイズと等しいか、それより大きい。例えば、いくつかの実施形態では、各計算ユニットへの入力は2つの1バイトのオペランドであり、1つはデータ入力103からのオペランドに相当し、もう1つは重み入力105からのものであり、2つのオペランドの処理の出力は4バイトの結果である。別の例として、マトリクスプロセッサ107は、データ入力103から96バイトを受け取り、重み入力105から96バイトを受け取り、96個の4バイト結果を出力するように構成されてもよい。いくつかの実施形態では、マトリクスプロセッサ107の出力はベクトルである。例えば、入力ベクトルの各要素(またはオペランド)のサイズが1バイトである2つの96幅の入力ベクトルを受け取るように構成されたマトリクスプロセッサは、ベクトル結果の各要素が4バイトのサイズである96幅のベクトル結果を出力することができる。
【0026】
様々な実施形態において、マトリクスプロセッサ107の各計算ユニットは、算術論理演算ユニット、アキュムレータおよびシャドウレジスタを含むサブ回路である。示される例では、マトリクスプロセッサ107の計算ユニットは、重み入力105およびデータ入力103それぞれからのM個のオペランドおよびN個のオペランドに対して算術演算を実行することができる。様々な実施形態において、各計算ユニットは、1つまたは複数の乗算、加算、累積および/またはシフト演算を実行するように構成される。いくつかの実施形態では、各計算ユニットはドット積演算を実行するように構成される。例えば、いくつ
かの実施形態では、計算ユニットは、ドット積結果を計算するために複数のドット積成分演算を実行してもよい。例えば、マトリクスプロセッサ107の計算ユニットの配列は、機械学習モデルを使用して推論を実行するために必要な畳み込みステップを実行するために利用されてもよい。画像などの二次元データセットは、フォーマットされ、一度に1つのベクトルで、データ入力103を使用してマトリクスプロセッサ107に供給されてもよい。並行して、重みをフォーマットし、重み入力105を使用してそれらをベクトルとしてマトリクスプロセッサ107に供給することにより、重みのベクトルが2次元データセットに適用されてもよい。マトリクスプロセッサ107の対応する計算ユニットは、重み入力およびデータ入力の対応するオペランドに対してマトリクスプロセッサ命令を並列して実行する。
【0027】
いくつかの実施形態では、ベクトルエンジン111は、マトリクスプロセッサ107に通信可能に結合されたベクトル計算ユニットである。ベクトルエンジン111は、処理要素113を含めた複数の処理要素を含む。示される図では、ベクトルエンジン111内の小さな正方形は、ベクトルエンジン111が、ベクトルとして配置された複数の処理要素を含むことを示している。いくつかの実施形態では、処理要素は、データ入力103と同じ方向でベクトル内に配置される。いくつかの実施形態では、処理要素は、重み入力105と同じ方向でベクトル内に配置される。様々な実施形態において、ベクトルエンジン111の処理要素のデータサイズは、マトリクスプロセッサ107の計算ユニットのデータサイズと同じサイズか、またはそれより大きい。例えば、いくつかの実施形態では、計算ユニット109は、サイズがそれぞれ1バイトの2つのオペランドを受け取り、サイズが4バイトの結果を出力する。処理要素113は、計算ユニット109からの4バイトの結果をサイズが4バイトの入力として受け取る。様々な実施形態において、ベクトルエンジン111の出力は、ベクトルエンジン111への入力と同じサイズである。いくつかの実施形態では、ベクトルエンジン111の出力は、ベクトルエンジン111への入力と比較してサイズが小さい。例えば、ベクトルエンジン111は、サイズがそれぞれ4バイトの最大96個の要素を受け取り、サイズがそれぞれ1バイトの96個の要素を出力する場合もある。様々な実施形態において、ベクトルエンジン111は、出力結果に対して量子化を実行し、その結果、ベクトルエンジン111の出力は、ベクトルエンジン111への入力と比較してサイズが小さくなる。様々な実施形態において、量子化が単一の命令の一部として実行される。例えば、量子化および非線形関数は、単一のプロセッサ命令として実行される。上記のように、いくつかの実施形態では、データ入力103および重み入力105からマトリクスプロセッサ107への通信チャネルは、各要素が1バイトのサイズの96要素幅であり、ベクトルエンジン111の出力サイズ(各要素のサイズが1バイトの96個の要素幅)に一致する。
【0028】
いくつかの実施形態では、処理要素113を含めたベクトルエンジン111の処理要素はそれぞれ、算術論理演算ユニット(ALU)(図示せず)を含む。例えば、いくつかの実施形態では、各処理要素のALUは算術演算を実行することが可能である。いくつかの実施形態では、処理要素の各ALUは、正規化線形ユニット(ReLU)関数および/またはスケーリング関数を並列して実行することが可能である。いくつかの実施形態では、各ALUは、非線形活性化関数を含む非線形関数を実行することが可能である。様々な実施形態において、ベクトルエンジン111の各処理要素は、入力オペランドを受け取るための1つまたは複数のフリップフロップを含む。いくつかの実施形態では、各処理要素は、ベクトルエンジンアキュムレータのスライスおよび/またはベクトルエンジン111のベクトルレジスタにアクセスできる。例えば、96個の要素を受け取ることが可能なベクトルエンジンは、96個の要素幅のアキュムレータと、1つまたは複数の96個の要素のベクトルレジスタとを含む。各処理要素は、アキュムレータおよび/またはベクトルレジスタの1要素スライスにアクセスできる。いくつかの実施形態では、各要素はサイズが4バイトである。さまざまな実施形態において、アキュムレータおよび/またはベクトルレ
ジスタは、少なくとも入力データベクトルのサイズに適合するサイズにされている。いくつかの実施形態では、ベクトルエンジン111は、ベクトルエンジン111の出力に適合するサイズの追加のベクトルレジスタを含む。
【0029】
いくつかの実施形態では、ベクトルエンジン111の処理要素は、マトリクスプロセッサ107からデータを受け取るように構成され、各処理要素は、データの受け取った部分を並列処理することができる。処理要素の一例として、ベクトルエンジン111の処理要素113は、マトリクスプロセッサ107の計算ユニット109からデータを受け取る。様々な実施形態において、ベクトルエンジン111は単一のベクトルプロセッサ命令を受け取り、次いで各処理要素は他の処理要素と並列してこのプロセッサ命令を実行する。いくつかの実施形態では、プロセッサ命令は、ロード操作、ストア操作および/または算術論理演算ユニット操作などの1つまたは複数のコンポーネント命令を含む。様々な実施形態では、no-op操作を使用して、コンポーネント命令を置き換えることができる。
【0030】
示される例では、データ入力103とマトリクスプロセッサ107との間、重み入力105とマトリクスプロセッサ107との間、マトリクスプロセッサ107とベクトルエンジン111との間、ベクトルエンジン111と後処理ユニット115との間の点線の矢印は、データ要素のベクトルなど、複数のデータ要素を送信することが可能なコンポーネントのそれぞれのペア間の結合を示している。一例として、マトリクスプロセッサ107とベクトルエンジン111との間の通信チャネルは、96×32ビット幅であり、各要素のサイズが32ビットである96個の要素の並行した転送をサポートすることができる。別の例として、ベクトルエンジン111と後処理ユニット115との間の通信チャネルは96×1バイト幅であり、各要素のサイズが1バイトである場合の96個の要素の並列した転送をサポートしてもよい。様々な実施形態において、データ入力103および重み入力105は、メモリモジュール(
図1には図示せず)に結合され、メモリモジュールからそれぞれ入力データを受け取ってもよい。いくつかの実施形態では、ベクトルエンジン111は、メモリモジュール(
図1には示されない)に追加的に結合され、マトリクスプロセッサ107からの入力に加えて、またはその代わりにメモリモジュールから入力データを受け取る場合もある。様々な実施形態では、メモリモジュールは通常、スタティックランダムアクセスメモリ(SRAM)である。
【0031】
いくつかの実施形態では、マトリクスプロセッサ107の1つまたは複数の計算ユニットは、マトリクスプロセッサ107が複数のレーンを有するように、1つのレーンに一緒にグループ化されてもよい。様々な実施形態において、マトリクスプロセッサ107のレーンは、データ入力103または重み入力105のいずれかと整列されてよい。例えば、重み入力105と整列されたレーンには、重み入力105のすべてのオペランドを入力として受け取るように構成された一セットの計算ユニットが含まれる。同様に、データ入力103と整列されたレーンには、データ入力103のすべてのオペランドを入力として受け取るように構成された計算ユニットのセットが含まれる。
図1に示される例では、レーンは重み入力105に沿って垂直列に並べられ、各レーンはベクトルエンジン111の対応するレーンに供給される。いくつかの実施形態において、各レーンは、乗算、加算および/または累積ならびにシフト機能を含むサブ回路の垂直列である。いくつかの実施形態では、マトリクスプロセッサ107はタイルの行列を含み、各タイルは計算ユニットの行列である。例えば、96x96マトリクスプロセッサには6x6タイルの行列が含まれ、各タイルには16x16の計算ユニットが含まれる。いくつかの実施形態では、垂直レーンはタイルの単一の列である。いくつかの実施形態では、水平レーンはタイルの単一の行である。様々な実施形態において、レーンの次元は動的に構成されてもよく、マトリクスプロセッサ107、ベクトルエンジン111および/または後処理ユニット115への入力に対して整列操作を実行するために利用されてもよい。いくつかの実施形態では、動的構成は、制御ユニット101によって、もしくは制御ユニット101を使用して、および
/または制御ユニット101によって制御されるプロセッサ命令を使用して実行される。
【0032】
いくつかの実施形態では、制御ユニット101は、マトリクスプロセッサ107、ベクトルエンジン111および後処理ユニット115によって実行される処理を同期させる。例えば、制御ユニット101は、マトリクスプロセッサ107、ベクトルエンジン111および後処理ユニット115のそれぞれにプロセッサ固有の命令を送ることができる。制御ユニット101は、マトリクスプロセッサ命令をマトリクスプロセッサ107に送信してもよい。マトリクスプロセッサ命令は、データ入力103および/または重み入力105からの指定されたオペランドを使用して、ドット積またはドット積成分などの算術演算を実行するように計算配列に指示する計算配列命令であり得る。制御ユニット101は、ベクトルエンジン111にベクトルプロセッサ命令を送ることができる。例えば、ベクトルプロセッサ命令は、ベクトル計算ユニットによって一緒に実施される複数のコンポーネント命令を備えた単一のプロセッサ命令を含んでもよい。制御ユニット101は、後処理ユニット115に後処理命令を送信してもよい。様々な実施形態において、制御ユニット101は、データ入力103および重み入力105からマトリクスプロセッサ107に、マトリクスプロセッサ107からベクトルエンジン111に、およびベクトルエンジン111から後処理ユニット115に供給されるデータを同期させる。いくつかの実施形態では、制御ユニット101は、プロセッサ固有のメモリ、キューおよび/またはデキュー操作を利用することにより、データ入力103、重み入力105、マトリクスプロセッサ107、ベクトルエンジン111および/または後処理ユニット115を含む、マイクロプロセッサシステム100の異なるコンポーネント間でデータを同期させる。いくつかの実施形態では、データと命令の同期は制御ユニット101によって実行される。いくつかの実施形態では、データおよび命令の同期は、マトリクスプロセッサ107、ベクトルエンジン111および/または後処理ユニット115の間で処理を同期させるための1つまたは複数のシーケンサを含む制御ユニット101によって実行される。
【0033】
いくつかの実施形態では、マトリクスプロセッサ107およびベクトルエンジン111は、畳み込み層を処理するために利用される。いくつかの実施形態において、ベクトルエンジン111を利用して、マトリクスプロセッサ107の出力に対して活性化関数などの非線形関数を実行する。例えば、マトリクスプロセッサ107を使用してドット積を計算し、ベクトルエンジン111を使用して、正規化線形ユニット(ReLU)関数またはシグモイド関数などの活性化関数を実行することができる。いくつかの実施形態では、プーリング作業を実行するのに後処理ユニット115が使用される。いくつかの実施形態において、後処理ユニット115は、処理されたデータをフォーマットし、メモリに格納するために利用され、メモリ書き込みレイテンシを同期させるために利用されてもよい。
【0034】
図2は、機械学習処理を実行するためのマイクロプロセッサシステムの一実施形態を示すブロック図である。示される例では、マイクロプロセッサシステム200は、制御ユニット201、ベクトル入力203、ベクトルエンジン入力キュー207、ベクトルエンジン211および後処理ユニット215を含む。ベクトルエンジン入力キュー207は、計算ユニット209および221~229を含む複数の計算ユニットを含み、ベクトルエンジン211は、処理要素213および231を含む複数の処理要素を含む。ベクトル入力203は、ベクトルエンジン入力キュー207にデータを供給するための入力モジュールである。いくつかの実施形態では、ベクトル入力203は、入力データフォーマッタ、キャッシュもしくはバッファおよび/またはベクトルエンジン入力キュー207用のデータを準備するための論理回路を含む。例えば、ベクトル入力203は、ベクトルエンジン入力キュー207を先入れ先出し(FIFO)入力キューとして利用するベクトルエンジン211によって処理される2次元配列からN個のオペランドを準備することができる。いくつかの実施形態では、ベクトル入力203は、データを取り出すためのスタティックランダムアクセスメモリ(SRAM)などのメモリ(
図2には示されていない)に結合され
ている。
【0035】
様々な実施形態において、制御ユニット201、ベクトル入力203、ベクトルエンジン入力キュー207、ベクトルエンジン211および後処理ユニット215はそれぞれ、
図1の制御ユニット101、データ入力103、マトリクスプロセッサ107、ベクトルエンジン111、および後処理ユニット115である。例えば、
図1のマトリクスプロセッサ107は、
図1のデータ入力103からデータを受け取り、入力の各ベクトルを
図1のベクトルエンジン111に繰り返しシフトすることにより、ベクトルエンジン入力キュー207などの入力キューを実装するために使用されてよい。
【0036】
いくつかの実施形態では、ベクトルエンジン入力キュー207は計算配列ユニットであり、その列が先入れ先出し(FIFO)キューである計算ユニットの行列を含む。示される例では、ベクトルエンジン入力キュー207はベクトル入力203の入力キューであり、複数のデータ要素をベクトル入力203からベクトルエンジン211に供給するワイド先入れ先出し(FIFO)キューとして機能する。例えば、計算ユニット221~229は、単一のFIFOキューとして一緒に機能する計算ユニットの垂直列を構成する。様々な実施形態において、ベクトルエンジン入力キュー207は、計算ユニット221~229と同様の計算ユニットの垂直列で構成される複数のFIFOキューを含む。例えば、ベクトルエンジン入力キュー207が96計算ユニット幅である実施形態では、ベクトルエンジン入力キュー207は96のFIFOキューに対応する96の垂直列の計算ユニットを有する。さらなる例として、ベクトルエンジン入力キュー207が96計算ユニット長である実施形態では、ベクトルエンジン入力キュー207は96段長のFIFOキューを有する。
【0037】
様々な実施形態において、各先入れ先出し(FIFO)キューは並列して機能し、ベクトル入力203から受け取った入力をFIFOキューに沿ってベクトルエンジン211にシフトする。計算ユニット221を含むベクトルエンジン入力キュー207の計算ユニットの第1の行は、ベクトル入力203に接続されている。計算ユニットの最初の行は、ベクトル入力203からのデータの行全体を並行して受け取るように構成される。ベクトルエンジン入力キュー207の計算ユニットの最後の行は、ベクトルエンジン211の処理要素の行に接続されている。例えば、ベクトルエンジン入力キュー207の計算ユニットの最後の行には、計算ユニット229および209が含まれる。計算ユニット209は処理要素213に接続され、計算ユニット229は処理要素231に接続される。処理要素213および231は、それぞれ計算ユニット209および229のデータ出力要素を受け取るように構成される。ベクトルエンジン211の処理要素は、ベクトルエンジン入力キュー207の計算ユニットの最後の行からデータの行全体を並行して受け取る。様々な実施形態において、ベクトルエンジン入力キュー207の計算ユニットの最後の行にデキューするのに利用可能なデータがある場合、ベクトルエンジン入力キュー207がキュー操作を受け取る準備ができていることを示すデキュー準備信号をベクトルエンジン211が受け取る。
【0038】
説明される例では、計算ユニットの最初の行からのデータは、ベクトルエンジン211に向かう論理方向で計算ユニットの次の行にその列を下にシフトされる。例えば、ベクトル入力203のデータ要素に対応する入力は、計算ユニット221においてオペランドとして受け取られ、計算ユニット221で受け取ったオペランドが計算ユニット221から、中間計算ユニット222~228を介して計算ユニット229まで増分式にシフトされるまで、計算ユニット221から計算ユニット222にシフトされ、計算ユニット222から計算ユニット223にシフトされ、計算ユニット223から計算ユニット224にシフトされるなどする。様々な実施形態において、FIFOに押し込まれたデータ要素は、FIFOが計算ユニット内での深さと同じ数のシフトを取る。例えば、96の計算ユニッ
トと、96の段とを有するFIFOキューでは、挿入された要素をデキューするには96回のシフトが必要である。様々な実施形態において、FIFOの各段は、他の段と並列してオペランドをシフトすることができる。例えば、FIFOキューにおける各中間計算ユニットは、そのオペランドを次の計算ユニットにシフトする一方で、最初の計算ユニットはベクトル入力203から次のデータ要素を取り出し、最後の計算ユニットは、ベクトルエンジン211の対応する処理要素によって受け取られるデータ要素をデキューすることができる。説明した例では、計算ユニットの各行に沿った各計算ユニットは、ベクトル入力203から最初に受け取った対応するデータ要素をベクトルエンジン211にシフトするために並列して動作する。
【0039】
いくつかの実施形態では、ベクトルエンジン入力キュー207はベクトル入力203に結合され、計算ユニットの行列の一次元はベクトル入力203の次元と一致する。例えば、96バイトの幅を有するベクトル入力203を備えた実施形態では、ベクトルエンジン入力キュー207は、少なくとも96バイトの幅を有する計算ユニットの行列を有する。いくつかの実施形態では、ベクトル入力203の幅およびベクトルエンジン入力キュー207への入力の対応する幅は動的に構成可能である。例えば、ベクトル入力203は96バイトまたは96×2バイトになるように動的に構成することができ、ベクトルエンジン入力キュー207への入力の対応する幅は96バイトまたは96×2バイトにそれぞれ構成可能である。いくつかの実施形態では、構成は、制御ユニット201および/またはベクトルエンジン入力キュー207へのプロセッサ命令を使用して実行される。
【0040】
いくつかの実施形態では、ベクトルエンジン211は、ベクトルエンジン入力キュー207に通信可能に結合されたベクトル計算ユニットである。ベクトルエンジン211は、処理要素213および231を含む複数の処理要素を含む。示される図では、ベクトルエンジン211内の小さな正方形は、ベクトルエンジン211が、ベクトルとして配置された複数の処理要素を含むことを示している。いくつかの実施形態では、処理要素は、ベクトル入力203と同じ方向でベクトルに配置される。様々な実施形態では、ベクトルエンジン211の処理要素のデータサイズは、ベクトルエンジン入力キュー207の計算ユニットのデータサイズと同じか、それより大きい。例えば、いくつかの実施形態において、計算ユニット209は、サイズが1バイトのオペランドを受け取り、やはり1バイトのサイズを有する処理要素213への出力をデキューする。処理要素213は、サイズが1バイトの入力として計算セル209から1バイトの出力を受け取る。様々な実施形態において、ベクトルエンジン211の出力は、ベクトルエンジン211への入力と同じサイズである。様々な実施形態において、ベクトルエンジン211の出力は、ベクトルエンジン211への入力と比較してサイズが小さい。例えば、ベクトルエンジン211は、サイズがそれぞれ4バイトの最大96個の要素を受け取り、サイズがそれぞれ1バイトの96個の要素を出力する場合もある。いくつかの実施形態では、ベクトル入力203からベクトルエンジン入力キュー207への通信チャネルは、各要素が1バイトのサイズの96要素幅であり、ベクトルエンジン211の出力サイズ(各要素が1バイトのサイズの96要素幅)に一致する。
【0041】
いくつかの実施形態では、処理要素213および231を含む、ベクトルエンジン211の処理要素はそれぞれ、算術論理演算ユニット(図示せず)を含み、
図1のベクトルエンジン111に関してさらに詳細に説明される。いくつかの実施形態では、ベクトルエンジン211の処理要素は、ベクトルエンジン入力キュー207からデータを受け取るように構成されており、各処理要素は、受け取ったデータの部分を並列処理することができる。処理要素の一例として、ベクトルエンジン211の処理要素213および231は、ベクトルエンジン入力キュー207の計算ユニット209および229からそれぞれデータを受け取る。様々な実施形態では、ベクトルエンジン211は単一のベクトルプロセッサ命令を受け取り、次いで各処理要素は他の処理要素と並列してプロセッサ命令を実行する
。いくつかの実施形態では、プロセッサ命令は、ロード操作、ストア操作および/または算術論理演算ユニット操作などの1つまたは複数のコンポーネント命令を含む。様々な実施形態では、no-op操作を使用して、コンポーネント命令を置き換えることができる。
【0042】
示される例では、ベクトル入力203とベクトルエンジン入力キュー207、ベクトルエンジン入力キュー207とベクトルエンジン211、およびベクトルエンジン211と後処理ユニット215の間の点線の矢印は、複数のデータ要素を送信することが可能なコンポーネントのそれぞれのペア間の結合を示している。一例として、ベクトルエンジン入力キュー207とベクトルエンジン211との間の通信チャネルは、96×32ビット幅であり、各要素のサイズが32ビットである96個の要素の並列転送をサポートすることができる。別の例として、ベクトルエンジン211と後処理ユニット215との間の通信チャネルは、96×1バイト幅であり、各要素のサイズが1バイトである96個の要素の並列転送をサポートすることができる。様々な実施形態において、ベクトル入力203はメモリモジュール(
図2には示されていない)に結合され、メモリモジュールから入力データを受け取る場合もある。いくつかの実施形態では、ベクトルエンジン211は、メモリモジュール(
図1には図示せず)に追加的に結合され、ベクトルエンジン入力キュー207からの入力に加えて、または代替として、メモリモジュールから入力データを受け取る場合もある。様々な実施形態では、メモリモジュールは通常、スタティックランダムアクセスメモリ(SRAM)である。
【0043】
いくつかの実施形態では、ベクトルエンジン入力キュー207の1つまたは複数の計算ユニットは、ベクトルエンジン入力キュー207が複数の垂直列レーンを有するように、特定の垂直列に一緒にグループ化され得る。
図2に示す例では、レーンは上記の先入れ先出し(FIFO)キューと同じ垂直列に沿って配置され、各レーンはベクトルエンジン211の対応するレーンに供給される。いくつかの実施形態において、各レーンは、乗算、加算および/または累積ならびにシフト機能を含むサブ回路の垂直列である。いくつかの実施形態では、垂直レーンは計算ユニットの単一の列である。いくつかの実施形態では、垂直レーンは、隣接する計算ユニットの複数の列のグループである。様々な実施形態において、レーンの次元は動的に構成されてもよく、ベクトルエンジン入力キュー207、ベクトルエンジン211および/または後処理ユニット215への入力に対して整列操作を実行するために利用されてもよい。いくつかの実施形態では、動的構成は、制御ユニット201によって、もしくは制御ユニット201を使用して、および/または制御ユニット201によって制御されるプロセッサ命令を使用して実行される。
【0044】
いくつかの実施形態では、制御ユニット201は、ベクトルエンジン入力キュー207、ベクトルエンジン211、および/または後処理ユニット215によって実行される処理を同期させる。例えば、制御ユニット201は、プロセッサ固有の命令をベクトルエンジン入力キュー207、ベクトルエンジン211および後処理ユニット215のそれぞれに送信することができる。制御ユニット201は、ベクトルエンジン入力キュー命令をベクトルエンジン入力キュー207に送信してもよい。いくつかの実施形態では、ベクトルエンジン入力キュー命令は、
図1のマトリクスプロセッサ107が応答することが可能なマトリクスプロセッサ命令のサブセットであり、
図1に関してさらに説明される。ベクトルエンジン入力キュー命令は、ロード操作、シフト操作、または入力キューとインターフェースするための他の適切な命令を実行するように計算配列に指示する計算配列命令であり得る。制御ユニット201は、ベクトルエンジン211にベクトルプロセッサ命令を送ることができる。例えば、ベクトルプロセッサ命令は、ベクトル計算ユニットによって一緒に実施される複数のコンポーネント命令を備えた単一のプロセッサ命令を含んでもよい。制御ユニット201は、後処理ユニット215に後処理命令を送信してもよい。様々な実施形態において、制御ユニット201は、ベクトル入力203からベクトルエンジン入
力キュー207に、ベクトルエンジン入力キュー207からベクトルエンジン211に、およびベクトルエンジン211から後処理ユニット215に供給されるデータを同期させる。いくつかの実施形態では、制御ユニット201は、プロセッサ固有のメモリ、キューおよび/またはデキュー操作を利用することにより、異なるコンポーネントのベクトル入力203、ベクトルエンジン入力キュー207、ベクトルエンジン211および/または後処理ユニット215の間でデータを同期させる。制御ユニット201の機能は、
図1の制御ユニット101に関してさらに詳細に説明される。
【0045】
いくつかの実施形態では、制御ユニット201は、ベクトルエンジン入力キュー207、ベクトルエンジン211および/または後処理ユニット215によって受け取られるデータ要素のサイズおよび数を構成するために利用される。例えば、いくつかの実施形態では、制御ユニット201を使用して、ベクトルエンジン入力キュー207への入力を、各々がサイズ1バイトの96個の要素、または各々がサイズ2バイトの48個の要素、各々がサイズ2バイトの96個の要素、各々がサイズ4バイトの192個の要素などの他の適切な変動値として構成してもよい。いくつかの実施形態では、ベクトルエンジン入力キュー207は、一連のロード操作および論理シフト演算を実行することにより、それが受け取ることが可能なものよりも大きいサイズのデータ要素を出力することが可能である。例えば、4バイトの入力データ要素の4つの連続する1バイト部分を読み取り、各バイトを適切なビットフィールドに論理的にシフトすることにより、4バイトの入力データ要素がベクトルエンジン入力キュー207にロードされる。別の例として、いくつかの実施形態では、制御ユニット201を使用して、ベクトルエンジン211への入力を、各々がサイズ4バイトの96個の要素、または各々がサイズ1バイトの各96個の要素、各々がサイズ2バイトの48個の要素などの他の適切な変動値として構成してもよい。
【0046】
様々な実施形態において、後処理ユニット215は、ベクトルエンジン211からの出力の後処理を実行するために利用される。後処理ユニット215の後処理機能は、
図1の後処理ユニット115に関してさらに詳細に説明される。
【0047】
図3は、機械学習処理を実行するためのマイクロプロセッサシステムの一実施形態を示すブロック図である。示される例では、マイクロプロセッサシステム300は、制御ユニット301、メモリ307、ベクトルエンジン311、および後処理ユニット315を含む。様々な実施形態において、メモリ307は通常、スタティックランダムアクセスメモリ(SRAM)である。様々な実施形態において、後処理ユニット315は、ベクトルエンジン311から入力データを受け取り、ベクトルエンジン311からの出力の後処理を実行するために利用される。後処理ユニット315の後処理機能は、
図1の後処理ユニット115に関してさらに詳細に説明される。
【0048】
図3のブロック図は、ベクトルエンジン311がメモリ307に結合され、メモリ307から直接データを取り出すことができるシステムアーキテクチャの実施形態を描いている。様々な実施形態において、メモリ307とベクトルエンジン311との間の通信チャネルのサイズは、メモリ307からベクトルエンジン311に複数のデータ要素を並列して転送するように構成され得る。例えば、ベクトルエンジン311が各々が32ビットサイズの96個の要素を並行して受け取ることが可能な実施形態では、メモリ307とベクトルエンジン311間の通信チャネルのサイズは、各々が32ビットサイズの96個の要素をメモリ307からベクトルエンジン311に並列して転送するように構成される。いくつかの実施形態では、メモリ307は、ベクトルエンジン311に転送する前にメモリからのデータをフォーマットするためのデータキャッシュもしくはバッファおよび/または論理回路を含み得るデータフォーマッタ(図示せず)を含む。例えば、サイズ1バイトのデータ要素がメモリ307内のワード境界に格納される場合もあり、データフォーマッタを利用して、データをバイト境界にフォーマットする、および/またはマスクする。様
々な実施形態において、制御ユニット301、ベクトルエンジン311および後処理ユニット315は、それぞれ、
図1の制御ユニット101、ベクトルエンジン111および後処理ユニット115である。様々な実施形態では、ベクトルエンジン311は、
図1のマトリクスプロセッサ107に関して説明したように、マトリクスプロセッサ(図示せず)にさらに結合されてもよい。
【0049】
いくつかの実施形態では、ベクトルエンジン311は、メモリ307に通信可能に結合されたベクトル計算ユニットである。ベクトルエンジン311は、処理要素313を含む複数の処理要素を含む。示される図では、ベクトルエンジン311内の小さな正方形は、ベクトルエンジン311がベクトルとして配置された複数の処理要素を含むことを示している。いくつかの実施形態では、処理要素313を含むベクトルエンジン311の処理要素はそれぞれ、算術論理演算ユニット(図示せず)を含む。ベクトルエンジン311の処理要素は、メモリ307からデータを受け取するように構成され、処理要素のそれぞれは、受け取ったデータの一部を並列して処理することができる。様々な実施形態において、ベクトルエンジン311は単一のベクトルプロセッサ命令を受け取り、次いで処理要素の各々は他の処理要素と並列してプロセッサ命令を実行する。いくつかの実施形態では、プロセッサ命令は、ロード操作、ストア操作および/または算術論理演算ユニット操作などの1つまたは複数のコンポーネント命令を含む。ベクトルエンジン311の機能は、それぞれ
図1および
図2のベクトルエンジン111および211に関してさらに詳細に説明される。
【0050】
いくつかの実施形態では、制御ユニット301は、ベクトルエンジン311および後処理ユニット315によって実行される処理と、メモリ307へのアクセスを同期させる。例えば、制御ユニット301は、プロセッサ固有の命令をベクトルエンジン311および後処理ユニット315のそれぞれに送ることができる。いくつかの実施形態では、制御ユニット301は、ベクトルプロセッサ命令をベクトルエンジン311に送信してもよい。例えば、ベクトルプロセッサ命令は、ベクトル計算ユニットによって一緒に実施される複数のコンポーネント命令を備えた単一のプロセッサ命令を含んでもよい。いくつかの実施形態では、制御ユニット301は、後処理ユニット315に後処理命令を送信してもよい。様々な実施形態において、制御ユニット301は、ベクトルエンジン311によってメモリ307から受け取り、後処理ユニット315によってベクトルエンジン311から受け取るデータを同期させる。いくつかの実施形態では、制御ユニット301は、ベクトルエンジンおよび/または後処理ユニットプロセッサ固有の動作を利用することにより、異なるコンポーネントベクトルエンジン311および/または後処理ユニット315の間でデータを同期させる。制御ユニット301の機能は、
図1の制御ユニット101に関してさらに詳細に説明される。
【0051】
いくつかの実施形態において、制御ユニット301は、ベクトルエンジン311および/または後処理ユニット315が受け取るデータ要素のサイズおよび数を構成するために利用される。例えば、いくつかの実施形態では、制御ユニット301を使用して、各々がサイズ4バイトの96個のデータ要素、または各々がサイズ1バイトの96個の要素、各々がサイズ2バイトの48個の要素などの他の適切な変動値を受け取るようにベクトルエンジン311を構成することができる。
図1および2に関してさらに説明されるように、ベクトルエンジン311と後処理ユニット315との間の点線の矢印は、複数のデータ要素を送信することができるコンポーネントのそれぞれのペア間の結合を描いている。一例として、ベクトルエンジン311と後処理ユニット315との間の通信チャネルは、96×1バイト幅であり、各要素のサイズが1バイトである96個の要素の並列転送をサポートすることができる。
【0052】
図4Aは、機械学習処理を実行するためのベクトル計算ユニットの一実施形態を示すブ
ロック図である。示される例では、マイクロプロセッサシステム400は、ベクトル計算ユニット401、入力バス411および出力バス431を含む。ベクトル計算ユニット401への入力は、入力バス411から届く。ベクトル計算ユニット401からの出力は、出力バス431に書き込まれる。いくつかの実施形態では、入力バス411および出力バス431は、入力バス411と出力バス431の両方の機能を含む単一のバスである。様々な実施形態において、入力バス411および出力バス431は、複数のデータ要素の並列転送を可能にするワイドデータバスである。例えば、計算ユニット401の並列処理機能に対応するために、入力バス411は96×32ビット幅であり、出力バス431は96バイト幅であり得る。いくつかの実施形態では、ベクトル計算ユニット401は、入力バス411を介してベクトル計算ユニット命令を受け取る。いくつかの実施形態では、ベクトル計算ユニット401は、命令バス(図示せず)などの入力バス411以外の通信チャネルを介してベクトル計算ユニット命令を受け取る。
【0053】
様々な実施形態において、ベクトル計算ユニット401は、それぞれ
図1、
図2および
図3のベクトルエンジン111、211および/または311である。いくつかの実施形態では、入力バス411は、
図1のマトリクスプロセッサ107、
図2のベクトルエンジン入力キュー207および/または
図3のメモリ307に接続される。いくつかの実施形態では、出力バス431は、それぞれ
図1、
図2および
図3の後処理ユニット115、215および/または315に接続される。様々な実施形態では、ベクトル計算ユニット401は、
図1、
図2および
図3の制御ユニット101、201および/または301など、ベクトル計算ユニット401の外部にある、マイクロプロセッサシステム400の制御ユニット(図示せず)に双方向で結合される。様々な実施形態において、マイクロプロセッサシステム400の制御ユニットは、ベクトル計算ユニット命令をベクトル計算ユニット401に送信する。いくつかの実施形態では、マイクロプロセッサシステム400の制御ユニットは、命令およびデータをベクトル計算ユニット401に同期させるための1つまたは複数のシーケンサを含む。
【0054】
示される例では、ベクトル計算ユニット401は、レジスタ421、ベクトルエンジン制御論理423、入力バッファ425、算術論理演算ユニット(ALU)427および出力バッファ429を含む。入力バス411からの入力データは入力バッファ425によって受け取られ、出力バス431に書き込まれる出力は出力バッファ429から書き込まれる。いくつかの実施形態において、入力バッファ425および出力バッファ429はデータバッファまたはキャッシュであり、メモリ同期機能を提供する。例えば、いくつかの実施形態では、入力バス411からの入力読み取りおよび/または出力バス431への出力書き込みは、入力バッファ425を利用して入力データを受け取り、計算した結果を格納するために出力バッファ429を利用することにより平滑化することができる予測不可能なレイテンシを有する。別の例として、ALU427からの出力が書き込みのための準備ができているとき、出力バス431を利用できない場合がある。いくつかの実施形態では、出力バッファ429は、出力バス431が出力バッファ429に格納された結果を書き込むために利用可能になるまで、ALU427が保留中のデータの処理を継続することを許可する。様々な実施形態において、入力バス411および出力バス431は、マイクロプロセッサシステム400の制御ユニット(図示せず)によって制御される通信チャネルである。
【0055】
上述のように、様々な実施形態において、ベクトル計算ユニットは複数の処理要素を含む。いくつかの実施形態では、各処理要素は、データをロードし、データを格納し、算術論理演算ユニット操作を実行するための個々の機能を含む。個々の処理要素は、
図4Aのブロック図には示されない。様々な実施形態において、算術論理演算ユニット(ALU)427は、各処理ユニットの対応する算術論理演算ユニット(ALU)を含む。同様に、入力バッファ425および出力バッファ429は、各処理ユニットに対応する入力バッフ
ァおよび出力バッファを含む。様々な実施形態において、ALU427は、ベクトル計算ユニット401への入力ベクトルのすべての要素を並列処理するためのALU論理を含む。いくつかの実施形態では、ALU427は、ALU結果を量子化するための論理を含む。様々な実施形態において、ALU論理、例えば、非線形関数および量子化を実行するための論理は、単一のプロセッサ命令に応答して実行することができる。
【0056】
様々な実施形態において、レジスタ421は、ベクトル計算ユニット401の機能を実施するためのレジスタを含む。例えば、レジスタ421を使用して、他の適切な機能の中でもベクトル計算ユニット命令を実行するためのオペランドを格納する、ビットマスクを実装する、および異なるメモリサイズのレジスタエイリアスを使用してベクトル要素を参照することができる。いくつかの実施形態では、レジスタ421は、算術命令ベクトルレジスタ、マスクレジスタ、加算、減算、浮動小数点演算などの算術演算を実行するためのレジスタ、および/またはベクトル要素のエイリアシング用のレジスタを含む。いくつかの実施形態では、ベクトル要素のエイリアシングに使用されるレジスタは、算術演算を実行するためにも利用される。
【0057】
いくつかの実施形態では、レジスタ421は算術命令ベクトルレジスタを含む。例えば、レジスタは、ロード操作、ストア操作および算術論理演算ユニット(ALU)操作のオペランドとして使用されてもよい。別の例として、いくつかの実施形態では、ALU操作は、ソースレジスタとして3つ、および宛先レジスタとして1つの最大4つのベクトルレジスタを引数として取ってもよい。様々な実施形態において、プロセッサ動作によって使用されるベクトルレジスタは、ベクトル要素のサイズに基づいて異なるベクトル要素にエイリアスされる。例えば、いくつかの実施形態では、8ビット、16ビット、32ビットで、および/または浮動小数点値で動作するためにベクトルレジスタの異なるセットが利用可能である。いくつかの実施形態では、32ビット値用のベクトルレジスタのセットは、浮動小数点値にも使用される。様々な実施形態において、32ビットのベクトルレジスタは、16ビットのベクトルレジスタおよび8ビットのベクトルレジスタにエイリアスされる。例えば、1つの32ビットベクトルレジスタは、2つの16ビットベクトルレジスタと、4つの8ビットベクトルレジスタにエイリアスされる。別の例として、8つの96×32ビットベクトルレジスタ(レジスタRD0~RD7)を備えたベクトル計算ユニット401は、16個の96×16ビットベクトルレジスタ(レジスタRW0~RW15)と32個の96×8ビットベクトルレジスタ(レジスタRB0~RB31)にエイリアスされる。RD0は96×32ビットのベクトルレジスタであり、RW0は96×16ビットのベクトルレジスタであり、RB0は96×8ビットのベクトルレジスタである。ベクトルレジスタのエイリアシングの別の例が
図4Bに描かれる。
【0058】
いくつかの実施形態では、レジスタ421は、ベクトル計算ユニット401の処理要素の数に基づいた1つまたは複数のビットマスクレジスタを含む。例えば、96個の処理要素を持つベクトル計算ユニットには、1つまたは複数の96個のビットマスクレジスタが含まれてよい。様々な実施形態において、マスクレジスタは、メモリからビットマスクをロードすることにより設定されてよい。マスクレジスタを使用して、ベクトル計算ユニット401への入力データに対して実行された論理演算の結果を格納することができる。
【0059】
いくつかの実施形態では、レジスタ421は、加算、減算および浮動小数点演算などの算術演算を実行するためのレジスタを含む。例えば、いくつかの実施形態では、ベクトル計算ユニット401は、ベクトル加算命令およびベクトル減算命令のキャリーアウトビットならびに浮動小数点命令に対応するステータスビットを格納するためのレジスタを含む。
【0060】
いくつかの実施形態では、ベクトル計算ユニット401は、ベクトル計算ユニット命令
のシーケンスを格納するための命令バッファ(図示せず)を含む。いくつかの実施形態では、命令バッファはコマンドキューである。さまざまな実施形態において、命令バッファは、実行される現在および/または最後の命令を参照するための1つまたは複数のポインタを含む。様々な実施形態において、命令バッファは、ベクトル計算ユニット命令のキャッシュとして機能する。例えば、1つまたは複数のベクトル計算ユニット命令は、ベクトル計算ユニット401の命令バッファにロードされ、命令を実行することができるようになるまでキャッシュされる。命令が実行されて不要になると、新しい命令が命令バッファにロードされてよい。いくつかの実施形態では、マイクロプロセッサシステム400の制御論理(図示せず)を介して外部命令コマンドキューからベクトル計算ユニット命令を受け取る。
【0061】
いくつかの実施形態では、ベクトル計算ユニット401は、ベクトルエンジン制御論理423を含む。ベクトルエンジン制御論理423は、ベクトル計算ユニット命令のフェッチ、命令の復号化および/または命令の実行を含めたベクトル計算ユニット401の機能を実装するために利用される。様々な実施形態において、ベクトルエンジン制御論理423は、入力バッファ425、出力バッファ429およびレジスタ421を介して、データを読み取る、書き込む、マスキングする、および/またはエイリアシングするための論理を含む。いくつかの実施形態では、ベクトル計算ユニット401は、デキュー準備完了信号を受け取り、ベクトルエンジン制御論理423を使用して、データが入力バス411を介して利用可能であると判定する。例えば、ベクトルエンジン制御論理423は、デキュー準備信号を受け取ると、入力バス411に取り付けられた入力先入れ先出しキュー(図示せず)からデータをデキューすることができる。
【0062】
図4Bは、ベクトルレジスタの例示的なエイリアシングを示す表である。表450は、16個の96×16ビットベクトルレジスタ(レジスタRW0~RW15)と32個の96×8ビットベクトルレジスタ(レジスタRB0~RB31)にエイリアスされた8個の96×32ビットベクトルレジスタ(レジスタRD0~RD7)を有するベクトル計算ユニットの実施形態のベクトルレジスタのエイリアシングを例示する。いくつかの実施形態では、表450のベクトルレジスタは、
図4Aのベクトル計算ユニット401のレジスタ421のベクトルレジスタである。示される例では、行451には、バイト0、1、2および3の列が含まれており、これらの列は、その下の行に列記される各レジスタにエイリアスされる。行453、463および473は、96×32ビットのベクトルレジスタRD0、RD1およびRD7に対応している。行455、465および475は、96×16ビットのベクトルレジスタRW0~RW3およびRW14~RW15に対応していている。行457、467および477は、96×8ビットのベクトルレジスタRB0~RB7およびRB28~RB31に対応している。この例では、バイト0~3は、それぞれ
図1、
図2、
図3のベクトルエンジン111、211、および/または311などのベクトル計算ユニットの96個のレーンのうちの1つである。
【0063】
示される例では、表450は、ベクトル計算ユニットの実施形態の96個のレーンのうちの単一レーンに関するベクトルレジスタエイリアシングを示している。96x32ビットのベクトルレジスタRD0は、バイト0からバイト3までの順の4バイトを利用する。96×16ビットのベクトルレジスタRW0およびRW1は、それぞれ2バイトにエイリアスされる。ベクトルレジスタRW0は、バイト0とバイト1にエイリアスされ、ベクトルレジスタRW1は、バイト2とバイト3にエイリアスされる。96×8ビットベクトルレジスタRB0~RB3は、各々がバイト0~3にそれぞれ対応する1バイトにエイリアスされる。同様に、96×32ビットベクトルレジスタRD1は、96×16ビットベクトルレジスタRW2(バイト0および1)およびRW3(バイト2および3)に、そしてバイト0~3に関して96×8ビットベクトルレジスタRB4~RB7にそれぞれエイリアスされる。別の例として、96×32ビットベクトルレジスタRD7は、96×16ビ
ットベクトルレジスタRW14(バイト0および1)およびRW15(バイト2および3)に、そしてバイト0~3に関して96×8ビットベクトルレジスタRB28~B31にそれぞれエイリアスされる。
【0064】
様々な実施形態において、ベクトル計算ユニット命令は、ベクトルレジスタの96個のレーンすべてにおいて並列して動作する。例えば、96個のレーンのそれぞれについて、ベクトルレジスタRB0はバイト0で動作し、ベクトルレジスタRB5はバイト1で動作し、ベクトルレジスタRW2はバイト0および1で動作し、ベクトルレジスタRW15はバイト2および3で動作し、ベクトルレジスタRD7は並列してバイト0~3で動作する。
【0065】
図5は、マイクロプロセッサシステムのためのプロセッサ命令を決定するためのプロセスの一実施形態を示すフロー図である。いくつかの実施形態では、
図5のプロセスは、高レベルのプログラミング言語で書かれたソフトウェアプログラムを、計算配列およびベクトル計算ユニットを備えたマイクロプロセッサシステムのための計算配列命令およびベクトル計算ユニット命令のシーケンスに変換する。様々な実施形態において、マイクロプロセッサシステムは
図1のマイクロプロセッサシステム100であり、計算配列は
図1のマトリクスプロセッサ107であり、ベクトル計算ユニットは
図1のベクトルエンジン111である。様々な実施形態において、
図5のプロセスは、自動運転および運転者支援自動車などの機械学習モデルを使用して推論を実行するアプリケーションを含む、機械学習に依存するアプリケーションを実装するために利用される。
【0066】
501において、実行される処理、ならびに計算配列、ベクトル計算ユニットおよび/または後処理ユニットなどの異なる共処理コンポーネントに割り当てられる処理のサブセットに関する決定がなされる。様々な実施形態では、処理は、異なる共処理コンポーネントの機能および効率に基づいて割り当てられる。例えば、特定の行列関連の作業は計算配列に割り当てられ、活性化関数などの非線形関数を含む作業はベクトル計算ユニットに割り当てられる。いくつかの実施形態では、プーリング作業が後処理ユニットに割り当てられる。別の例として、いくつかの実施形態では、501において、畳み込み演算がドット積演算を必要とすること、およびドット積演算は、計算配列によって実行される行列処理を最適に利用するという決定がなされる。いくつかの実施形態では、この決定は、本明細書に記載されるマイクロプロセッサシステムを対象とするように機械学習アプリケーションをコンパイルすることによって実行される。
【0067】
503において、501で決定され、割り当てられた処理に対応する1つまたは複数のマトリクスプロセッサ命令が決定される。例えば、501でマトリクスプロセッサにより実行されると決定されたドット積演算が1つまたは複数のマトリクスプロセッサ命令に変換される。様々な実施形態において、マトリクスプロセッサ命令は計算配列命令である。一例として、計算配列命令は、
図1のデータ入力103などのデータ入力コンポーネントから1つまたは複数のデータベクトルを受け取り、
図1の重み入力105などの対応する重み入力コンポーネントから1つまたは複数の重みベクトルを受け取ることを要求する場合がある。追加の計算配列命令は、ドット積演算を処理するための乗算、累積およびシフト演算を含む場合がある。例えば、1つまたは複数のドット積成分演算を使用してドット積結果を計算してもよい。様々な実施形態において、計算配列命令は、計算配列の対応する計算ユニットが受け取った入力データに対して実行される処理に向けられる。いくつかの実施形態では、追加の計算配列命令は、ベクトル計算ユニットによる処理のためにドット積結果を準備するための命令を含む。
【0068】
505において、ベクトル計算ユニットによって実行されるベクトルエンジン命令に関して決定がなされる。例えば、501でベクトルエンジンにより実行されると決定された
活性化関数に関連する動作は、1つまたは複数のベクトルエンジン命令に変換される。様々な実施形態では、ベクトルエンジン命令はベクトル計算ユニット命令である。一例として、ベクトル計算ユニット命令は、
図1のマトリクスプロセッサ107などの計算配列から1つまたは複数のデータベクトルを受け取ることを要求する場合がある。追加のベクトル計算ユニット命令には、正規化線形ユニット(ReLu)関数などの非線形活性化関数を実行する作業が含まれる場合もある。様々な実施形態において、ベクトル計算ユニット命令は、ベクトル計算ユニットの対応する処理要素が受け取った入力データに対して実行される処理に向けられる。いくつかの実施形態では、追加のベクトル計算ユニット命令は、後処理ユニットによる後処理のために処理要素の結果を準備するための命令を含む。
【0069】
様々な実施形態において、各ベクトル計算ユニット命令は、ベクトル計算ユニットによって一緒に実行される複数のコンポーネント命令を指定する単一のプロセッサ命令である。複数のコンポーネント命令の実行は、単一のベクトル計算ユニット命令に応答して、異なるデータ入力要素上で並列してベクトル計算ユニットの処理要素によって実行される。例えば、いくつかの実施形態では、単一のプロセッサ命令は、3つのコンポーネント命令、すなわち別個のロード命令、算術論理演算ユニット命令およびストア命令を含む。3つのコンポーネント命令は、ベクトル計算ユニットによって受け取られ、実行される。いくつかの実施形態では、コンポーネント命令を単一の処理命令にバンドルする作業が505で実行される。様々な実施形態において、ベクトル計算ユニット命令にバンドルするためのコンポーネント命令の順序および選択は、決定されたデータハザードに基づいている。
【0070】
507において、後処理ユニットによって実行される後処理命令に関して決定がなされる。例えば、後処理機能に関連する動作は、501で後処理ユニットにより実行されると決定され、1つまたは複数の後処理命令に変換される。一例として、後処理命令は、
図1のベクトルエンジン111などのベクトル計算ユニットから1つまたは複数のデータベクトルを受け取ることを要求する場合がある。追加の後処理命令には、マックスプーリング(maxpooling)などのプーリング層機能を実行する操作が含まれる場合がある。様々な実施形態において、後処理命令は、とりわけカーネルサイズ、ストライドおよび/または空間範囲などのプーリング機能を構成するための命令を含んでもよい。いくつかの実施形態では、追加の後処理命令は、後処理の結果を準備し書き出すための命令を含む。
【0071】
509において、503、505および507で決定されたコプロセッサ命令のコレクションの実行に対応するシーケンスがスケジューリングされる。例えば、計算配列、ベクトル計算ユニットおよび/または後処理ユニットなどの様々なコプロセッサのそれぞれのプロセッサ命令の相対的な順序および/またはシーケンスが決定される。いくつかの実施形態では、シーケンスは、コプロセッサ間の相互作用および依存関係に依存している。例えば、ベクトル計算ユニットへの入力は、計算配列からの出力結果の可用性に依存する場合がある。様々な実施形態において、データハザードを含む依存関係が決定され、考慮される。例えば、様々な実施形態において、ベクトル計算ユニット命令は複数のコンポーネント命令を含み、複数のベクトル計算ユニット命令が並列に実行されるように実行することができる。利用できないデータリソースに基づいたデータハザードが特定され、考慮される。例えば、ロード操作の完了に依存する算術論理演算ユニット操作が実行される前にロード操作を完了することができるように、ベクトル計算ユニット命令のコンポーネント命令にno-opが挿入されてもよい。いくつかの実施形態では、コンポーネント命令を単一のベクトル計算ユニット命令にバンドルする作業が509で決定される。いくつかの実施形態では、コプロセッサ命令の順序付けなどの命令スケジューリングの一部またはすべてが、マトリクスプロセッサおよびベクトルエンジンに対して503および505でそれぞれ実行される。例えば、いくつかの実施形態では、各単一のベクトル計算ユニット命令のコンポーネント命令をバンドルする作業は505で決定される。
【0072】
いくつかの実施形態では、マイクロプロセッサシステムの制御ユニットおよび/または1つもしくは複数のシーケンサを使用して、コプロセッサ命令のコレクションの処理を開始し調整する。例えば、509で決定した命令シーケンスは、
図1の制御ユニット101などの制御ユニットによって、および/または1つもしくは複数のシーケンサによって使用されて、
図1のマトリクスプロセッサ107などの計算配列、
図1のベクトルエンジン111などのベクトル計算ユニットおよび/または
図1の後処理ユニット113などの後処理ユニットに対して、対応するコプロセッサ命令を発行する。いくつかの実施形態では、1つまたは複数のシーケンサの機能は、制御ユニットによって実行される。例えば、いくつかの実施形態では、制御ユニットは、とりわけ、実行シーケンサ、メモリアクセスシーケンサ、ネットワークシーケンサおよび/またはベクトルエンジンシーケンサを含む。
【0073】
図6Aは、ベクトル計算ユニットの実行を進行させるためのプロセスの一実施形態を示すフロー図である。
図6Aのプロセスは、ベクトルの要素を並列に処理するためにベクトル計算ユニットによって実行されてよい。様々な実施形態では、ベクトル計算ユニットは、それぞれ
図1、
図2、
図3および
図4Aのベクトルエンジン111、211、311および/またはベクトル計算ユニット401である。いくつかの実施形態では、
図6Aのプロセスは、
図1の制御ユニット101などの制御ユニットによって開始される。様々な実施形態において、
図6Aのプロセスのステップ間の移行は、
図4Aのベクトルエンジン制御論理423などのベクトル計算ユニットの制御論理によって実行される。
【0074】
601において、ベクトルエンジン命令が取得される。様々な実施形態において、ベクトルエンジン命令はベクトル計算ユニット命令であり、複数のコンポーネント命令を指定する。例えば、命令トライアドは、最大3つのコンポーネント命令を指定する単一のベクトル計算ユニット命令である。命令トライアドの例は、単一の命令としてロード操作、算術論理演算ユニット操作およびストア操作を含む。601において、命令が取得されると、プロセスは603と605の両方に進む。
【0075】
603において、追加の命令が保留中であるかどうかについての判定がなされる。例えば、次のベクトルエンジン命令が利用可能であり、取得の準備ができている場合がある。別の例として、保留中の命令をキャッシュするための命令バッファが空である場合があり、次の利用可能な命令を取得する、および/または待機する必要がある。いくつかの実施形態では、追加の命令の可用性は、命令バッファ内の最後の有効な命令を参照するポインタの検査に基づいている。利用可能な追加の命令がないことに応答して、処理はステップ609に進む。1つまたは複数の追加の命令が利用可能になったことに応じて処理は601に戻る。
【0076】
605において、601で取得したベクトルエンジン命令がデコードされる。様々な実施形態において、単一のベクトルエンジン命令は、1つまたは複数のコンポーネント命令を指定する。様々な実施形態において、命令およびコンポーネント命令はデコードされる。例えば、ロードコンポーネント命令、算術論理演算ユニットコンポーネント命令およびストアコンポーネント命令を含む命令トライアドが、個別のコンポーネント操作にデコードされる。いくつかの実施形態では、復号化は、各コンポーネント操作のオペコードと、そのオペコードに対応する引数の両方を決定する。一例として、ロードコンポーネント命令には、バイトベクトルデキュー操作に対応するオペコードと、デキューの結果としてバイトのベクトルを格納する対応する宛先ベクトルレジスタの両方が含まれる。別の例として、追加コンポーネント命令には、符号付き16ビット加算操作に対応するオペコードと、ソースおよび宛先引数に関する対応するベクトルレジスタの両方が含まれる。
【0077】
607において、605でデコードされた命令が実行される。いくつかの実施形態では
、複数のコンポーネント命令を指定する単一のベクトルエンジン命令が、ベクトル計算ユニットの処理要素によって実行される。例えば、処理要素のベクトルは、605でデコードされた単一のベクトルエンジン命令を実行する。いくつかの実施形態では、単一のベクトルエンジン命令のコンポーネント命令の各々は、処理要素のそれぞれによって並列してさらに実行される。例えば、各処理要素に対して、ロード命令と算術論理演算ユニット命令が並列して実行されてよい。いくつかの実施形態では、ロード命令、算術論理演算ユニット命令およびストア命令が並列に実行されてもよい。例えば、入力データのベクトルが入力アキュムレータからベクトルレジスタにロードされる、算術論理演算ユニット(ALU)によって浮動小数点乗算演算が2つの異なるベクトルレジスタに対して実行される、および16ビット要素のベクトルがベクトルレジスタからメモリに格納されるなどのコンポーネント操作が、ベクトルエンジンの各処理セルによって並列して実行される。様々な実施形態では、処理要素がコンポーネント命令の実行を終えると、ベクトルエンジン命令の処理は完了する。
【0078】
609において、ベクトル計算ユニットは次の命令を待つ。例えば、ベクトル計算ユニットは、保留中の命令をキャッシュするための命令バッファが実行される有効な命令を含むまで待機する。別の例として、ベクトル計算ユニットは、メモリから次の命令を受け取り、ベクトル計算ユニットに対して利用可能になるまで待機する。いくつかの実施形態では、ベクトル計算ユニットは、追加の命令が利用可能になるのを待ちながら609で停止する。様々な実施形態では、ベクトル計算ユニットは、追加の命令を待っている間に609において割り込みに応答してもよい。追加の命令の到着に応答して、処理は601に戻る。
【0079】
図6Bは、ベクトル計算ユニットによってベクトルデータを処理するためのプロセスの一実施形態を示すフロー図である。例えば、
図6Bは、計算配列および/または先入れ先出し(FIFO)キューなどの入力ソースからベクトル計算ユニットが受け取ったベクトルデータに適用されるプロセスを図示している。いくつかの実施形態では、
図6Bのプロセスは、ベクトル結果を計算するためにベクトル入力に対してベクトル演算を実行するためにベクトル計算ユニットによって実行されるステップを例示している。様々な実施形態において、
図6Bのプロセスは、ベクトル計算ユニットの複数の処理要素を利用して、ベクトルの要素に対する処理を並列して実行する。様々な実施形態において、ベクトル計算ユニットは、それぞれ
図1、
図2、
図3および
図4Aのベクトルエンジン111、211、311および/またはベクトル計算ユニット401である。
【0080】
651において、ロード操作がデコードされ、発行される。いくつかの実施形態では、データをベクトル計算ユニットに受け入れるためにロード操作が必要である。例えば、いくつかの実施形態において、デキュー操作は、ベクトル計算ユニットの処理要素が受け取る計算配列からのデータ要素のベクトルをデキューするロード操作である。様々な実施形態では、ロード操作は、単一のベクトル計算ユニット命令を構成する複数のコンポーネント命令のうちの1つであり得る。ロード操作の復号化により、特定のタイプのロード操作および適切な操作が決定される。例えば、指定された異なるベクトルレジスタに異なるサイズのベクトル要素をロードするためのさまざまなロード操作が存在する。651において、ロード操作がデコードされ発行されて、先入れ先出し(FIFO)キューからのデータ結果のベクトルのデキューなどの入力データの受け取りを開始する。
【0081】
653において、ベクトル計算ユニットは、651で発行されたロード操作の結果として、ベクトルの形で入力データを受け取る。例えば、ベクトル計算ユニットは、
図1のマトリクスプロセッサ107などの計算配列、
図2のベクトルエンジン入力キュー207などの先入れ先出し(FIFO)キューなどの計算配列、またはその他の適切なデータソースから入力データ要素のベクトルを受け取る。いくつかの実施形態では、入力データは入
力バッファに格納される。いくつかの実施形態において、入力バッファは、フリップフロップおよび/または1つもしくは複数のアキュムレータのセットを利用して入力データを格納する。入力データを入力ステップ655において1つまたは複数のベクトルレジスタにロードすることができるように、入力ベクトルのサイズの入力バッファを使用して入力データを格納する場合もある。
【0082】
655において、653で受け取ったベクトルデータが適切なレジスタにロードされる。例えば、653で読み取られたベクトルデータは、ロード命令によって指定されたベクトルレジスタにロードされる。いくつかの実施形態では、レジスタエイリアスを使用して、データがどのようにベクトルレジスタにロードされるかを決定する。例えば、データは同じレジスタのメモリ位置にロードされるが、使用される命令およびエイリアスされたレジスタに基づいて、バイト、ハーフワードまたはワード境界に合わせて調節されてもよい。いくつかの実施形態では、ベクトルレジスタへのベクトルデータのロードは、ベクトルビットマスクなどのビットマスクを利用してベクトルのどのバイトをどのレジスタメモリ位置にロードするかを決定する。例えば、96ビットマスクを使用して、ベクトルレジスタのどの要素がデータを受け取るかを決定してもよい。
【0083】
657において、追加のデータが必要かどうかに対する判定がなされる。例えば、現在のベクトル計算ユニットの命令に基づいて、算術論理演算ユニット(ALU)操作を実行する前に追加のデータが必要になる場合がある。追加のデータが必要とされないことに応じて、処理は661に進む。一例として、現在のベクトル計算ユニット命令が、no-op操作ではないALUコンポーネント操作(追加操作など)を含む場合には処理は661へと続く。追加のデータを必要としていることに応じて、例えば、ロード操作が保留中であり、ALU操作が保留中ではない場合、処理は659に進む。いくつかの実施形態では、命令トライアドは、ALU操作が現在の命令に対して実行されるべきでないことを示すno-opでALU操作を置き換える場合もある。
【0084】
659において、追加のデータが処理のためにベクトル計算ユニットにロードされる。例えば、入力重みのベクトルなどの追加の入力データは、メモリの読み取り、マトリクスプロセッサの結果の受け取り、先入れ先出し(FIFO)キューのキュー解除、またはその他の適切な手法によってロードされてよい。いくつかの実施形態では、静的ランダムアクセスメモリ(SRAM)などのメモリを読み取ることにより、追加のデータがロードされてもよい。様々な実施形態では、読み取りバッファなどの追加のコンポーネントを利用して、データのロード作業を同期させる、および/または読み取り遅延と待ち時間を考慮してもよい。様々な実施形態において、659でロードされるデータは、重み入力のベクトルなどの入力データのベクトルであり得る。
【0085】
661において、ベクトル算術論理演算ユニット(ALU)操作が実行される。様々な実施形態において、ベクトルALU操作は、とりわけ、加算演算子(符号付きおよび符号なし)、減算演算子(符号付きおよび符号なし)、乗算演算子、絶対値演算子および論理演算子のためのベクトル演算を含む。ベクトルALU操作は、異なるオペランドサイズで実行されてよい。オペランドサイズの例には、8ビット、16ビット、32ビットおよび浮動小数点の値が含まれる。いくつかの実施形態において、異なるオペランドサイズは、レジスタエイリアシングおよび/または操作のオペコードに基づいて決定される。例えば、8ビットのオペランドのベクトル加算演算では、8ビットのベクトルレジスタを使用する。
図4Aおよび4Bに関してより詳細に説明したように、レジスタエイリアシングによって、異なるエイリアスを使用して同じメモリ位置を参照することが可能になる。例えば、32ビットのメモリブロックは、所望される結果に応じて、単一の4バイトのオペランド、2つの2バイトのオペランド、または4つの1バイトのオペランドとして参照することができる。様々な実施形態において、ベクトル計算ユニットの各処理要素は、他の処理
要素と並列して同じALU操作(例えば加算、減算、乗算など)を実行する。いくつかの実施形態では、出力結果はALU結果の量子化バージョンである。例えば、出力結果は、表現するのにALUの結果よりも少ないビットしか必要としない量子化されたバージョンである。いくつかの実施形態では、ALU結果は、入力オペランドよりも少ないビットを使用して表される結果を使用して計算される。例えば、入力オペランドのサイズはそれぞれ4バイトであり、出力結果のサイズは1バイトであり得る。
【0086】
663において、661で実行された算術論理演算ユニット(ALU)操作のベクトル結果がベクトル計算ユニットから書き出される。いくつかの実施形態では、出力バスがデータを受け取るのに利用できない場合、次のALU操作のために処理を継続することを可能にする出力バッファを利用してベクトル結果が書き出される。いくつかの実施形態では、ベクトル出力の結果は、それぞれ
図1、
図2および
図3の後処理ユニット115、215および/または315などの後処理ユニットに転送される。例えば、ALU操作の実行の結果は、後処理プーリング作業を実行するための後処理ユニットに書き込まれる。いくつかの実施形態では、出力ベクトルの結果は、スタティックランダムアクセスメモリ(SRAM)などのメモリに書き込まれる。さまざまな実施形態において、出力は、各要素が1バイトのサイズを有する96個の要素ベクトルなどの要素のベクトルとして書き出される。
【0087】
図7は、ベクトル計算ユニット命令の符号化フォーマットの一実施形態を示すブロック図である。示される例では、ベクトル計算ユニット命令710は、単一の命令によって指定される複数のコンポーネント命令の符号化を描いている。ベクトル計算ユニット命令740は、単一の命令によって指定される複数のコンポーネント命令のそれぞれのフォーマットをさらに詳細に説明する。ベクトル計算ユニット命令710は、符号化された命令トライアドであり、ロード操作711、算術論理演算ユニット(ALU)操作713およびストア操作715を含む。ベクトル計算ユニット命令740は、オペコード741、レジスタ743、オペコード751、レジスタ753、オペコード構成フィールド755、即値フィールド757、オペコード761およびレジスタ763などのフィールドを含む。ベクトル計算ユニット命令710によって表されるコンポーネント命令(ロード操作、ALU操作およびストア操作に対応)のフィールドは、ベクトル計算ユニット命令740にマッピングされる。ベクトル計算ユニット命令740には、符号化されたロード操作(オペコード741およびレジスタ743)、算術論理演算ユニット操作(オペコード751、レジスタ753、オペコード構成フィールド755および即値フィールド757)およびストア操作(オペコード761およびレジスタ763)が含まれる。
【0088】
いくつかの実施形態では、ベクトル計算ユニット命令は、3つのコンポーネント命令を指定する命令トライアドである。例えば、ロード操作、算術論理演算ユニット(ALU)操作およびストア操作は、128ビットフォーマットを使用して単一の命令にバンドルされてもよい。様々な実施形態では、より大きな、またはより小さなビットフォーマットを利用して、必要に応じて3つのコンポーネント命令をバンドルしてもよい。いくつかの実施形態では、ロード操作およびストア操作は13ビットに符号化され、ALU操作は64ビットに符号化される。様々な実施形態において、バンドルされたロード操作、ストア操作およびALU操作によって使用されないいずれの残りのビットも、パディングビットである。いくつかの実施形態では、オペコードは8ビットに符号化され、レジスタは5ビットに符号化され、即値フィールドは32ビットに符号化される。様々な実施形態では、異なる長さの符号化が適切に利用されてよく、また命令サイズ、サポートされるベクトル演算の数、レジスタの数、ベクトルサイズおよび/または他の適切な要因に基づいている。一部のシナリオでは、1つまたは複数のコンポーネント命令が使用されない場合、no-op操作が使用される。
【0089】
示される例では、ベクトル計算ユニット命令740の符号化されたロード操作は、オペコード741およびレジスタ743を含む。オペコード741はベクトルロード操作に対応し、レジスタ743はそのロード操作に関する対応する宛先ベクトルレジスタである。例えば、オペコード741を使用してデータをロードするデキュー操作のためのオペコードを格納することができ、レジスタ743はロードされたデータを格納するための宛先レジスタである。様々な実施形態において、ロード操作は、ベクトル計算ユニットによる処理のために、入力データのベクトルをベクトルレジスタにロードするのに使用される。いくつかの実施形態では、オペコード741は8ビットフィールドであり、レジスタ743は5ビットフィールドである。
【0090】
示される例では、ベクトル計算ユニット命令740の符号化されたストア操作は、オペコード761およびレジスタ763を含む。オペコード761は、ベクトルストア操作に対応しており、レジスタ763は、ストア操作がデータのベクトルをそこから読み取るべき対応するソースベクトルレジスタである。例えば、オペコード761を使用して、レジスタ763からのデータをスタティックランダムアクセスメモリ(SRAM)などの外部メモリに格納するストア操作のためのオペコードを格納することができる。いくつかの実施形態では、格納作業に使用されるメモリの開始アドレスは、メモリ位置を参照するための書き込みポインタを使用して外部シーケンサまたは制御ユニットによって維持される。いくつかの実施形態において、ストア操作は、データのベクトルを出力データバスに書き込むのに使用される。いくつかの実施形態では、オペコード761は8ビットフィールドであり、レジスタ763は5ビットフィールドである。
【0091】
示される例では、符号化された算術論理演算ユニット(ALU)操作には、オペコード751、レジスタ753、オペコード構成フィールド755および即値フィールド757が含まれる。オペコード751は、ALUオペコードの符号化に使用される。例えば、ALUオペコードには、とりわけ加算演算子(符号付きおよび符号なし)、減算演算子(符号付きおよび符号なし)、乗算演算子、絶対値演算子および論理演算子のためのベクトル演算に対応するオペコードが含まれてよい。ベクトルALU操作に応じて、操作はレジスタ753、オペコード構成フィールド755および即値フィールド757といったフィールドを利用してよい。いくつかの実施形態では、レジスタ753は、3つのソースレジスタと1つの宛先レジスタを含む最大4つのベクトルレジスタを指定する。いくつかの実施形態では、レジスタ753は20ビットフィールドであり、各レジスタに対して5ビットを利用する。
【0092】
いくつかの実施形態では、符号化された算術論理演算ユニット(ALU)操作は、特定のALU操作によって利用されるオペコード構成フィールド755を含む。いくつかの実施形態では、オペコード構成フィールド755は5ビットフィールドであり、レジスタサイズフィールド(2ビット)、マスクビット(1ビット)および即値有効ビット(1ビット)を含む。例えば、一部のシナリオでは、レジスタサイズフィールド(2ビット)に格納されている値を使用して、レジスタのサイズ(8ビット、16ビットまたは32ビット)を指定してもよい。追加の例として、マスクビット(1ビット)を使用して即値フィールド757をビットマスクとして処理する場合もあり、即値有効ビット(1ビット)を使用して即値フィールド757の有効性を識別してもよい。様々な実施形態において、即値フィールド757は、即値フィールドを必要とするALU操作に利用される32ビットのフィールドである。例えば、ベクトル移動操作は、32ビット値を即値フィールド757から宛先ベクトルレジスタに移動するように構成されてよい。
【0093】
いくつかの実施形態において、ベクトル計算ユニットは、ベクトルビットマスクをベクトルマスクレジスタにロードするために、ベクトルマスク移動命令(図示せず)をサポートする。いくつかの実施形態では、ベクトルマスク移動命令は、対応するオペコードフィ
ールド、宛先レジスタフィールドおよび即値フィールドを含む。一例として、ベクトルマスクの移動は、即値フィールドに格納されているベクトルビットマスクをベクトルマスクレジスタにロードする。いくつかの実施形態において、ベクトル計算ユニットによってサポートされるベクトルのサイズ(例えば、96個の要素幅)は、ビットマスクを格納するのに十分な大きさの即値フィールド(例えば96ビット)を必要とする。いくつかの実施形態では、ベクトルマスク移動命令は、ベクトル計算ユニット命令710および740の符号化フォーマットに制限されない。例えば、即値フィールドのサイズに基づいて、ベクトルマスクの移動は他のコンポーネント命令と一緒にバンドルされない場合もある。
【0094】
様々な実施形態において、ベクトル計算ユニット命令のコンポーネント命令は、
図5のプロセスを使用して一緒にバンドルされる。いくつかの実施形態では、
図7の符号化フォーマットは、それぞれ
図1、
図2、
図3および
図4Aのベクトルエンジン111、211、311および/またはベクトル計算ユニット401などのベクトル計算ユニットによって利用される。いくつかの実施形態では、ベクトル計算ユニット命令は、マイクロプロセッサシステムのシーケンサまたは特定のシーケンサを含む制御ユニットによってベクトル計算ユニットに対して発行される。
【0095】
図8は、ベクトル計算ユニットにより単一のベクトル計算ユニット命令を実行するためのプロセスの一実施形態を示すフロー図である。
図8のプロセスは、ベクトル計算ユニットの処理要素を利用して、ベクトルの要素に対して並列してベクトル計算ユニットによって実行されてよい。いくつかの実施形態では、
図8のプロセスは、それぞれ
図1、
図2、
図3および
図4Aのベクトルエンジン111、211、311および/またはベクトル計算ユニット401などのベクトル計算ユニットによって実行される。
【0096】
801において、ベクトル計算ユニット命令がフェッチされる。いくつかの実施形態では、命令は、命令バッファおよび/またはコマンドキューからフェッチされる。様々な実施形態において、命令バッファは、実行される現在の命令を参照するための1つまたは複数のポインタを含む。様々な実施形態において、命令バッファは、ベクトル計算ユニット命令のキャッシュとして機能する。
【0097】
821において、ベクトル計算ユニット命令がデコードされる。例えば、命令トライアドであるベクトル計算ユニット命令は、その3つのコンポーネント命令にデコードされる。様々な実施形態において、各コンポーネント命令によって利用される引数およびフィールドがデコードされる。例えば、
図7のレジスタ753などのレジスタフィールドで指定されたベクトルレジスタは、ソースレジスタと、宛先レジスタにデコードされる。
【0098】
831において、コンポーネント命令が発行される。いくつかの実施形態では、コンポーネント命令の発行は、リソースハザードおよび/またはデータハザードが存在するかどうかを判定することを含む。ハザードが存在する場合、いくつかの実施形態では、ベクトル計算ユニットはハザードが解決されるのを待つ。例えば、前のクロックサイクルでのロード操作によってリソースハザードが生じた場合、ベクトル計算ユニットは、そのロードが完了し、リソースが利用可能になるまで1つまたは複数のクロックサイクルを待機する。
【0099】
いくつかの実施形態では、複数のコンポーネント命令が一緒に発行され、並列して実行される。例えば、命令トライアドのロード操作、算術論理演算ユニット(ALU)操作およびストア操作は、同じクロックサイクルの中で一緒に実行される。コンポーネント命令が一緒に実行されるシナリオでは、ロード操作(ステップ845)、ALU操作(ステップ855)およびストア操作(ステップ865)の実行に対応する各ステップは、対応するno-op代替手段(ステップ843、854および863)と共に、同じクロックサ
イクル内で開始され、実行は並列して進行する。
【0100】
いくつかの実施形態では、異なるコンポーネント命令が、開始をずらして実行される。例えば、いくつかの実施形態では、ロード操作が最初に実行され、続いて算術論理演算ユニット(ALU)操作が実行され、次にストア操作が実行される。ずらされるシナリオでは、最初のベクトル計算ユニット命令のALU操作は、次のベクトル計算ユニット命令のロード操作と並列して実行されてもよい。
【0101】
さまざまな実施形態において、異なる算術論理演算ユニット(ALU)操作を含む異なる操作は完了するために1つまたは複数のクロックサイクルを要するが、同じクロックサイクルの終わりまでに異なる操作が完了するという保証はない。いくつかの実施形態では、フェッチステップ(ステップ801)、デコードステップ(ステップ821)および発行ステップ(ステップ831)のうちの1つまたは複数が同じ命令サイクル内で実行されてもよい。
【0102】
841において、ベクトル計算ユニット命令がロード操作を含むかどうかに対する判定がなされる。例えば、一部のシナリオでは、ロード操作が実行されるべきでないことを示すために、ロード操作をno-opで置き換える場合もある。no-opに応答して、処理は843に続く。ロード操作が存在する場合、処理は845に続く。
【0103】
843において、no-opが処理され、ロード操作は実行されない。例えば、841では命令の中にロード命令が存在せず、代わりにno-opのオペコードが使用された。
【0104】
845において、ベクトル計算ユニットによってロード操作が実行される。例えば、ベクトルエンジン入力キュー207などの先入れ先出しキューから入力ベクトルをロードするためのデキュー操作が実行される。
【0105】
851において、ベクトル計算ユニット命令が算術論理演算ユニット(ALU)操作を含むかどうかに対する判定がなされる。例えば、一部のシナリオでは、ALU操作が実行されるべきではないことを示すために、ALU操作をno-opで置き換える場合もある。no-opに応答して、処理は853に続く。ALU操作が存在する場合、処理は855に続く。
【0106】
853において、no-opが処理され、算術論理演算ユニット(ALU)操作は実行されない。例えば、851の命令にALU命令が存在せず、代わりにno-opのためのオペコードが使用された。
【0107】
855において、ベクトル計算ユニットによって算術論理演算ユニット(ALU)操作が実行される。例えば、ベクトル加算演算に応答して、ベクトル計算ユニットの算術論理演算ユニットはベクトル加算演算を実行して、2つのソースベクトルレジスタの内容を加算し、その結果を宛先ベクトルレジスタに格納する。いくつかの実施形態では、ベクトル計算ユニットの算術論理演算ユニットは、
図4Aの算術論理演算ユニット(ALU)427である。
【0108】
861において、ベクトル計算ユニット命令がストア操作を含むかどうかに対する判定がなされる。例えば、一部のシナリオでは、ストア操作が実行されるべきではないことを示すために、ストア操作をno-opで置き換える場合もある。no-opに応答して、処理は863に続く。ストア操作が存在する場合、処理は865に続く。
【0109】
863において、no-opが処理され、ストア操作は実行されない。例えば、861
の命令にはストア命令が存在せず、代わりにno-opのためのオペコードが使用された。
【0110】
865において、ベクトル計算ユニットによってストア操作が実行される。例えば、ベクトルレジスタ内のベクトルデータをメモリに格納するストア操作が実行される。
【0111】
図9は、ベクトル計算ユニットの例示的な命令サイクルを示す図である。
図9のプロセスは、並列して実行される3つのベクトル計算ユニット命令の順序およびシーケンスの例を示しているが、開始がずらされた状態である。いくつかの実施形態では、
図9の例示的な命令サイクルは、それぞれ
図1、
図2、
図3および
図4Aのベクトルエンジン111、211、311および/またはベクトル計算ユニット401によって利用される。
図9の例では、単一の命令としてバンドルされたコンポーネント命令は、ロード操作が最初に実行され、その後に算術論理演算ユニット(ALU)操作が実行され、次にストア操作が実行されるように開始をずらして実行される。いくつかの実施形態では、順次ベクトル計算ユニット命令はパイプライン化されるが、コンポーネント命令は並列に実行され、
図9に示されるずらした開始には従わない。
【0112】
示される例では、第1の命令サイクル910は、最初のベクトル計算ユニット命令に相当するフェッチステップ911、デコードステップ921、発行ステップ931、ロード実行ステップ941、算術論理演算ユニット(ALU)実行ステップ951およびストア実行ステップ961を含む。第2の命令サイクル920は、第2のベクトル計算ユニット命令に対応するフェッチステップ923、デコードステップ933、発行ステップ943、ロード実行ステップ953、算術論理演算ユニット(ALU)実行ステップ963およびストア実行ステップ973を含む。第3の命令サイクル930は、第3のベクトル計算ユニット命令に対応するフェッチステップ935、デコードステップ945、発行ステップ955、ロード実行ステップ965、算術論理演算ユニット(ALU)実行ステップ975およびストア実行ステップ985を含む。いくつかの実施形態では、点線の垂直線はクロックサイクル境界である。様々な実施形態において、同じクロックサイクル境界内のステップは、同じクロックサイクルの中で開始される。
【0113】
いくつかの実施形態では、命令サイクルの開始は、1段分だけずらされている。例えば、第1の命令サイクル910は、第2の命令サイクル920と比較して処理において1段先であり、第3の命令サイクル930の2段先である。任意の所与のクロックサイクルの中で、異なるベクトル計算ユニット命令は、フェッチ、デコード、発行、ロード実行、算術論理演算ユニット(ALU)実行、ストア実行といった、異なる段に関連付けられたハードウェアリソースを利用することができる。一例として、第1、第2および第3の命令サイクル910、920および930の発行段931、デコード段933およびフェッチ段935は、それぞれ同じクロックサイクルの中で実行される。別の例として、第1、第2および第3の命令サイクル910、920および930のストア実行ステップ961、算術論理演算ユニット(ALU)実行ステップ963およびロード実行ステップ965は、それぞれ同じクロックサイクルの中で実行される。
【0114】
いくつかの実施形態では、ベクトル計算ユニットの命令サイクルは、クロックサイクルごとに1つのベクトル計算ユニット命令のスループットを達成する。いくつかの実施形態において、フェッチステップ、デコードステップおよび/または発行ステップは、単一のクロックサイクルに圧縮される。例えば、いくつかの実施形態において、フェッチ時間を最小化するために命令バッファが利用され、フェッチステップとデコードステップは一緒に実行される。いくつかの実施形態では、命令サイクルの各段は、完了するのに1つまたは複数のクロックサイクルを要する場合がある。いくつかの実施形態では、段自体がパイプライン化される。例えば、実行ステップが完了するまでに2サイクル以上かかる場合、
複数のクロックサイクルにわたって完了するために、実行ステップがパイプライン化される場合もある。いくつかの実施形態では、複数の実行ステップがパイプライン方式で並列に処理されてもよく、各実行ステップは異なるベクトル計算ユニット命令に対応してもよい。いくつかの実施形態では、フェッチステップ911、923および935は
図8のステップ801に対応し、デコードステップ921、933および945は
図8のステップ821に対応し、発行ステップ931、943および955は
図8のステップ831に対応し、ロード実行ステップ941、953および965は、
図8のステップ845に対応し、算術論理演算ユニット(ALU)実行ステップ951、963および975は、
図8のステップ855に対応し、ストア実行ステップ961、973および985は
図8のステップ865に対応している。
【0115】
代替の実施形態(図示せず)では、命令サイクルのフェッチ段、デコード段および発行段は
図9と同じ順序で実行される。
図9の例示的な実施形態とは対照的に、ロード実行ステップ、算術論理演算ユニット(ALU)実行ステップおよびストア実行ステップは、同じクロックサイクルの中に一緒に並列して実行される。例えば、同じベクトル計算ユニット命令のロード実行ステップ941、ALU実行ステップ951およびストア実行ステップ961は一緒に実行される。
【0116】
図10は、計算配列の計算ユニットの一実施形態を示すブロック図である。示される例では、計算ユニット1000は、入力値重み1002、データ1004およびResultIn1006、信号ClearAcc信号1008、Clock信号1010、ResultEnable信号1012、ResultCapture信号1014およびShiftEn信号1016、コンポーネントアキュムレータ1024、マルチプレクサ1026、シャドウレジスタ1028、乗算器1030および加算器1032、論理1034、1036および1038ならびに出力値ResultOut1050を含む。いくつかの実施形態では、論理1034、1036および1038はANDゲートである。いくつかの実施形態では、必要に応じて追加の信号が含まれる。様々な実施形態において、
図10の計算ユニットは、
図1のマトリクスプロセッサ107などの計算配列の計算ユニット109などの複数の計算ユニットのそれぞれに対して繰り返される。計算ユニット1000を利用して、計算操作を並列して実施することができる。様々な実施形態において、計算配列の各計算ユニットは、他の計算ユニットと並列して計算を実行する。様々な実施形態において、計算ユニット1000は、1つまたは複数の乗算、加算、累積および/またはシフト演算を実行する機能を含むマトリクスプロセッサのサブ回路である。例えば、計算ユニット1000は、ドット積演算を実行するための機能を含むサブ回路であってもよい。様々な実施形態において、計算ユニット1000は、
図1の計算ユニット109、および/または
図2の計算ユニット209および/または221~229である。
【0117】
いくつかの実施形態では、Clock信号1010は、計算ユニット1000が受け取ったクロック信号である。様々な実施形態において、計算配列の各計算ユニットは同じクロック信号を受け取り、このクロック信号を利用して各計算ユニットの処理を他の計算ユニットと同期させる。
【0118】
示される例では、乗算器1030は、入力値データ1004と、重み1002を受け取り、それらに対して乗算演算を実行する。乗算器1030の出力は、加算器1032に供給される。加算器1032は、乗算器1030の出力と、論理1034の出力を受け取り、それらに対して加算を実行する。加算器1032の出力は、アキュムレータ1024に供給される。いくつかの実施形態では、入力値データ1004および重み1002は、計算ユニットを横断し、対応するデータおよび/または重みを隣接する計算ユニットに供給するラインである。例えば、いくつかの実施形態では、データ1004は同じ列のすべての計算ユニットに供給され、重み1002は同じ行のすべての計算ユニットに供給される
。様々な実施形態において、データ1004および重み1002は、データ入力103および重み入力105から計算ユニット1000にそれぞれ供給される入力要素に対応する。さまざまな実施形態において、データ1004および重み1002は、データハードウェアデータフォーマッタおよび重みハードウェアデータフォーマッタから計算ユニット1000にそれぞれ供給される入力要素に対応する。
【0119】
いくつかの実施形態では、ClearAcc信号1008はアキュムレータ1024の内容をクリアする。一例として、アキュムレータ1024をクリアすることによって累積演算をリセットし、乗算器1030の結果を累積するために使用することができる。いくつかの実施形態では、新しいドット積演算を実行するために、ClearAcc信号1008を使用してアキュムレータ1024をクリアする。例えば、要素ごとの乗算は乗算器1030によって実行され、部分ドット積の結果は加算器1032およびアキュムレータ1024を使用して加算される。
【0120】
様々な実施形態において、アキュムレータ1024は、加算器1032の結果および間接的に乗算器1030の結果を累積することが可能なアキュムレータである。例えば、いくつかの実施形態では、アキュムレータ1024は、ClearAcc信号1008のステータスに基づいて、乗算器1030の結果をアキュムレータ1024の内容と一緒に累積するように構成される。別の例として、ClearAcc信号1008のステータスに基づいて、アキュムレータ1024に格納されている現在の結果は加算器1032によって無視される場合もある。示される例では、アキュムレータ1024は32ビット幅のアキュムレータである。様々な実施形態において、アキュムレータ1024は、必要に応じて異なるサイズ、例えば8ビット、16ビット、64ビットなどである場合もある。様々な実施形態において、計算配列の複数の計算ユニットの各アキュムレータは同一サイズである。様々な実施形態において、アキュムレータ1024は、データを累積して保存する、データを累積して消去する、または単にデータを消去する場合がある。いくつかの実施形態では、アキュムレータ1024は、累積レジスタとして実装されてもよい。いくつかの実施形態では、アキュムレータ1024は、レジスタを含む一セットの算術論理演算ユニット(ALU)を含む場合もある。
【0121】
いくつかの実施形態では、データ1004が有効であるという決定に応答して、ResultEnable信号1012が起動される。例えば、ResultEnable信号1012が有効にされて、乗算器1030および加算器1032によるアキュムレータ1024への処理などの計算ユニットによる処理を有効にすることができる。
【0122】
いくつかの実施形態では、ResultCapture信号1014は、マルチプレクサ1026の機能を決定するために利用される。マルチプレクサ1026は、ResultIn1006、アキュムレータ1024の出力およびResultCapture信号1014を入力として受け取る。様々な実施形態において、ResultCapture信号1014は、ResultIn1006またはアキュムレータ1024の出力のいずれかをマルチプレクサ1026の出力として通過させることを可能にするために使用される。いくつかの実施形態では、マルチプレクサ1026は出力レジスタとして実装される。いくつかの実施形態では、ResultIn1006は、計算ユニット1000と同じ列の計算ユニットに接続される。例えば、隣接する計算ユニットの出力は、入力値ResultIn1006として計算ユニット1000に供給される。いくつかの実施形態では、隣接する計算ユニットの入力は、計算ユニットの対応するResultOut値である。
【0123】
いくつかの実施形態では、シャドウレジスタ1028は、マルチプレクサ1026の出力を入力として受け取る。いくつかの実施形態では、シャドウレジスタ1028は、Re
sultCapture信号1014の値に応じて、マルチプレクサ1026を介してアキュムレータ1024の出力を受け取るように構成される。示される例では、シャドウレジスタ1028の出力は、出力値ResultOut1050である 様々な実施形態では、結果がシャドウレジスタ1028に挿入されると、アキュムレータ1024を使用して新しい計算を開始することができる。例えば、最終的なドット積結果がシャドウレジスタ1028に格納されると、アキュムレータ1024はクリアされ、新たな重み入力値およびデータ入力値に対する新たなドット積演算の部分結果、ならびに最終的には最終結果を累積し、格納するために使用されてよい。示される例では、シャドウレジスタ1028はShiftEn信号1016を受け取る。様々な実施形態において、ShiftEn信号1016は、シャドウレジスタ1028への値の格納を有効にする、または無効にするために使用される。いくつかの実施形態では、ShiftEn信号1016は、シャドウレジスタ1028に格納された値を出力値ResultOut1050にシフトするために使用される。例えば、ShiftEn信号1016が有効な場合、シャドウレジスタ1028に格納されている値は、出力値ResultOut1050としてシャドウレジスタ1028からシフトアウトされる。いくつかの実施形態では、ResultOut1050は、隣接する計算ユニットの入力値ResultInに接続される。いくつかの実施形態では、計算ユニットの列の最後のセルは、計算配列の出力に接続される。様々な実施形態において、計算配列の出力は、ベクトル処理のために
図1のベクトルエンジン111などのベクトルエンジンに供給される。例えば、
図1の計算セル109などの計算セルの出力ResultOut1050は、
図1のベクトルエンジン111の処理要素113などのベクトルエンジンの処理要素に供給されてもよい。
【0124】
示される例では、シャドウレジスタ1028は32ビット幅である。様々な実施形態では、シャドウレジスタ1028は、必要に応じて、例えば8ビット、16ビット、64ビットなどの異なるサイズにされてもよい。様々な実施形態では、計算配列の複数の計算ユニットの各シャドウレジスタは同じサイズである。様々な実施形態では、シャドウレジスタ1028はアキュムレータ1024と同じサイズである。様々な実施形態において、マルチプレクサ1026のサイズは、アキュムレータ1024および/またはシャドウレジスタ1028のサイズに基づいている(例えば、同じサイズ、またはそれより大きい)。
【0125】
いくつかの実施形態では、論理1034、1036および1038は、制御信号などの信号を受け取って計算ユニット1000の機能を有効化する、および/または構成する。様々な実施形態では、論理1034、1036および1038は、ANDゲートを使用して、および/またはANDゲートに対応する機能を使用して実装される。例えば、上述のように、論理1034はClearAcc信号1008と、アキュムレータ1024に格納された値に対応する入力値とを受け取る。ClearAcc信号1008に基づいて、論理1034の出力が決定され、加算器1032に供給される。別の例として、論理1036はResultEnable信号1012およびClock信号1010を受け取る。ResultEnable信号1012に基づいて、論理1036の出力が決定され、アキュムレータ1024に供給される。別の例として、論理1038はShiftEn信号1016およびClock信号1010を受け取る。ShiftEn信号1016に基づいて、論理1038の出力が決定され、シャドウレジスタ1028に供給される。
【0126】
様々な実施形態において、計算ユニットは、乗算、加算演算およびシフト演算を同時に実行する、すなわち単一のサイクルの中で実行することができ、それにより各サイクルで発生する操作の総数が2倍になる。いくつかの実施形態では、結果は、単一のクロックサイクル内で、すなわち中間の実行操作および保存操作を必要とせずに、マルチプレクサ1026からシャドウレジスタ1028に移動される。様々な実施形態において、クロックサイクルは、Clock信号1010で受け取った信号に基づいている。
【0127】
様々な実施形態において、入力値の重み1002およびデータ1004は8ビット値である。いくつかの実施形態では、重み1002は符号付きの値であり、データ1004は符号なしである。様々な実施形態において、重み1002およびデータ1004は、必要に応じて符号が付けられてもよいし、符号が付けられなくてもよい。いくつかの実施形態では、ResultIn1006およびResultOut1050は32ビット値である。様々な実施形態において、ResultIn1006およびResultOut1050は、入力オペランドの重み1002およびデータ1004よりも多いビットを使用して実装される。多数のビットを利用することにより、例えばドット積結果を計算するために重み1002とデータ1004の複数のペアを乗算した結果が、スカラー結果をオーバーフローさせることなく累積されてよい。
【0128】
いくつかの実施形態では、計算ユニット1000は、アキュムレータ1024で中間計算結果および/または最終計算結果を生成する。最終計算結果は、マルチプレクサ1026を介してシャドウレジスタ1028に格納される。いくつかの実施形態では、マルチプレクサ1026は出力レジスタとして機能し、アキュムレータ1024の出力を格納する。様々な実施形態において、最終計算結果は畳み込み演算の結果である。例えば、ResultOut1050における最終結果は、重み1002を使用して入力値として計算ユニット1000が受け取ったフィルタと、データ1004を使用して入力値として計算ユニット1000が受け取ったセンサデータの2次元領域との畳み込みの結果である。
【0129】
一例として、センサデータの領域に対応する2×2データ入力行列[d0 d1;d2
d3]、および重みの2×2行列[w0 w1;w2 w3]に対応するフィルタに対して、計算ユニット1000を使用して畳み込み演算を実行することができる。2×2データ入力行列には、1行目[d0 d1]と2行目[d2 d3]がある。フィルタ行列には、1行目[w0 w1]と2行目[w2 w3]がある。様々な実施形態では、計算ユニット1000は、データ1004を介してクロックサイクルごとに1要素で1次元入力ベクトル[d0 d1 d2 d3]としてデータ行列を受け取り、重み1002を介してクロックサイクルごとに1要素で1次元入力ベクトル[w0 w1 w2 w3]として重み行列を受け取る。計算ユニット1000を使用して、2つの入力ベクトルのドット積が実行され、ResultOut1050においてスカラー結果が生成される。例えば、乗算器1030を使用して、入力重みとデータベクトルの対応する各要素を乗算し、その結果は格納され、アキュムレータ1024における前の結果に追加される。例えば、要素d0に要素w0を乗算した結果(例えば、d0*w0)が、クリアされたアキュムレータ1024に最初に格納される。次に、要素d1に要素w1を乗算し、加算器1032を使用して、アキュムレータ1024に格納されている前の結果(例えば、d0*w0)に加算して、d0*w0+d1*w1の等価値を計算する。処理は要素d2とw2の3番目のペアに進み、アキュムレータ1024でd0*w0+d1*w1+d2*w2の等価値を計算する。要素の最後のペアが乗算され、ドット積の最終結果(例:d0*w0+d1*w1+d2*w2+d3*w3)がアキュムレータ1024に格納される。次に、ドット積の結果がシャドウレジスタ1028にコピーされる。シャドウレジスタ1028に格納されると、例えば、センサデータの異なる領域を使用して、新しいドット積演算を開始することができる。ShiftEn信号1016に基づいて、シャドウレジスタ1028に格納されたドット積結果はシャドウレジスタ1028からResultOut1050にシフトされる。様々な実施形態において、重み行列およびデータ行列は、上記の例とは異なる次元である場合もある。例えば、より大きな次元が使用される場合もある。
【0130】
いくつかの実施形態では、バイアスパラメータが導入され、アキュムレータ1024を使用してドット積結果に追加される。いくつかの実施形態では、他の入力値としての乗算一致素子と共に、重み1002またはデータ1004のいずれかにおける入力としてバイアスパラメータを受け取る。バイアスパラメータを一致素子に対して乗算してバイアスパ
ラメータを保持し、乗算の結果(バイアスパラメータなど)は加算器1032を使用してドット積結果に可算される。加算結果であるバイアス値によるドット積結果オフセットは、アキュムレータ1024に格納され、シャドウレジスタ1028を使用してResultOut1050でシフトアウトされる。いくつかの実施形態では、
図1のベクトルエンジン111などのベクトルエンジンを使用してバイアスが導入される。
【0131】
前述の実施形態は、理解を明確にする目的で一部の詳細において説明されているが、本発明は提供された詳細に限定されるものではない。本発明を実施する多くの代替方法が存在する。開示された実施形態は例示的であり、限定的ではない。
【手続補正書】
【提出日】2023-06-12
【手続補正1】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項1】
複数の計算ユニットを含む計算配列と、
該計算配列と通信するベクトル計算ユニットと、を備える、マイクロプロセッサシステム。
【外国語明細書】