(57)【特許請求の範囲】
【請求項１】
セルのシストリックアレイとして実装される行列乗算ユニットであって、前記セルのシストリックアレイの各セルは、
転置されたまたは転置されない重みシフトレジスタから重み入力を受け取るように構成される重み行列レジスタと、
前記重み行列レジスタに格納されるよう、２次元フォーマットの第１の方向から重み入力を受け取るように構成される転置された重みシフトレジスタと、
前記重み行列レジスタに格納されるよう、前記第１の方向に対して垂直である前記２次元フォーマットの第２の方向から重み入力を受け取るように構成される転置されない重みシフトレジスタと、
前記重み行列レジスタに結合され、乗算結果を得るために前記重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを備える、行列乗算ユニット。
【請求項２】
前記重み入力は、ニューラルネットワークの重み入力であり、
前記ベクトルデータ入力は、ニューラルネットワークのベクトルデータ入力である、請求項１に記載の行列乗算ユニット。
【請求項３】
各セルは、前記転置された重みシフトレジスタの重み入力と前記転置されない重みシフトレジスタの重み入力との間で選択を行い、選択された重み入力を前記重み行列レジスタに転送するように構成されるマルチプレクサをさらに備える、請求項１または２に記載の行列乗算ユニット。
【請求項４】
前記転置された重みシフトレジスタまたは前記転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第１の重み保持レジスタをさらに備える、請求項１〜３のいずれか１項に記載の行列乗算ユニット。
【請求項５】
前記転置された重みシフトレジスタまたは前記転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第２の重み保持レジスタをさらに備える、請求項４に記載の行列乗算ユニット。
【請求項６】
ある重み値は、転置された重みシフトレジスタから前記第１の重み保持レジスタにロードされ、ある重み値は、垂直方向から前記第２の重み保持レジスタにロードされる、請求項５に記載の行列乗算ユニット。
【請求項７】
前記重み行列レジスタには、前記第１の重み保持レジスタまたは前記第２の重み保持レジスタから値がロードされる、請求項５または請求項６に記載の行列乗算ユニット。
【請求項８】
データが前記重み行列レジスタにあるとき、前記データは任意の数の乗算サイクルで用いられる、請求項１から請求項７のいずれか１項に記載の行列乗算ユニット。
【請求項９】
前記任意の数の乗算サイクルの間に、次の乗算セットに備えて、より多くの重みがバックグラウンドで前記重みシフトレジスタにシフトされる、請求項８に記載の行列乗算ユニット。
【請求項１０】
前記任意の数の乗算サイクルの間に、乗算結果を得るために、前記重み行列レジスタの重み入力がベクトルデータ入力で乗算される、請求項８に記載の行列乗算ユニット。
【請求項１１】
ベクトルデータ入力がクロックサイクルごとに１マルチセルだけ移動する、請求項１から請求項１０のいずれか１項に記載の行列乗算ユニット。
【請求項１２】
命令が受け取られると、前記命令に基づいて重みがシフトされる、請求項１から請求項１１のいずれか１項に記載の行列乗算ユニット。
【発明の詳細な説明】
【技術分野】
【０００１】
背景
この明細書は、ハードウェアでのニューラルネットワーク計算の実行に関する。
【背景技術】
【０００２】
ニューラルネットワークは機械学習モデルであり、モデルの１つ以上の層を用いて、受信した入力に対する出力、たとえば分類などを生成する。一部のニューラルネットワークには、出力層に加えて１つ以上の隠れ層が含まれる。各隠れ層の出力は、ネットワーク内の次の層、つまりネットワークの次の隠れ層または出力層への入力として用いられる。ネットワークの各層は、それぞれのパラメータのセットの現在の値に従って、受信した入力から出力を生成する。
【発明の概要】
【０００３】
概要
この明細書では、ニューラルネットワークのトレーニング、ニューラルネットワークの推論の計算、またはその両方を行う専用ハードウェア回路、および特に重み値が行列乗算ユニット内の重み行列レジスタにロードされる速度を増大させることによって行列乗算ユニット全体のレイテンシを低減する専用ハードウェア回路に関する技術について記載する。
【発明が解決しようとする課題】
【０００４】
シストリックアレイは、行列乗算を実行するよう配線され、通常、アレイ全体を通して均一な構造を有する。シストリックアレイの行列乗算ユニットは、積和サブユニットで構成され、各サブユニットは、入力オペランドを取り、そのオペランドに格納された重みを乗算して結果を得、その結果を部分和に加算して新たな部分和を生成する。
【０００５】
レイテンシを短縮する1つの方法は、重みを積和ユニットにロードする速度を増大させることである。
【０００６】
一般に、本明細書で説明する主題の革新的な一局面は、ニューラルネットワークのトレーニング、ニューラルネットワークの推論の計算、またはその両方を行う専用ハードウェア回路で実現できる。
【０００７】
この態様の他の実施形態は、各々、方法のアクションを実行するように構成された、対応するコンピュータシステム、装置、および１つ以上のコンピュータ記憶装置に記録されたコンピュータプログラムを含む。１つ以上のコンピュータのシステムが特定の操作またはアクションを実行するように構成されているとは、動作中にそのシステムにそのような操作またはアクションを実行させるソフトウェア、ファームウェア、ハードウェア、またはそれらの組み合わせがそのシステムにインストールされていることを意味する。１つ以上のコンピュータプログラムが特定の操作またはアクションを実行するように構成されるとは、１つ以上のプログラムが、データ処理装置によって実行されると、データ処理装置にそのような操作またはアクションを実行させる命令を含むことを意味する。
【０００８】
前述の実施形態および他の実施形態は各々、以下の特徴のうちの１つ以上を単独でまたは組み合わせて任意選択で含むことができる。特に、一実施形態は、以下の特徴をすべて組み合わせて含む。
【課題を解決するための手段】
【０００９】
行列乗算ユニットはセルのシストリックアレイとして実装されてもよい。セルのシストリックアレイの各セルは、転置されたまたは転置されない重みシフトレジスタから重み入力を受け取るように構成される重み行列レジスタと、重み行列レジスタに格納されるよう水平方向から重み入力を受け取るように構成される転置された重みシフトレジスタと、重み行列レジスタに格納されるよう垂直方向から重み入力を受け取るように構成される転置されない重みシフトレジスタと、重み行列レジスタに結合され、乗算結果を得るために重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを備えてもよい。各セルは、転置された重みシフトレジスタの重み入力と転置されない重みシフトレジスタとの間で選択を行い、選択された重み入力を重み行列レジスタに転送するように構成されるマルチプレクサを備えてもよい。
【００１０】
行列乗算ユニットは、転置された重みシフトレジスタまたは転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第１の重み保持レジスタを備えてもよい。
【００１１】
行列乗算ユニットは、転置された重みシフトレジスタまたは転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第２の重み保持レジスタを備えてもよい。
【００１２】
重み値は、行列乗算ユニットに、転置された重みシフトレジスタから、水平方向に、第１の重み保持レジスタへ、および転置されない重みシフトレジスタから、垂直方向に、第２の重み保持レジスタへロードされてもよい。
【００１３】
重み行列レジスタには、第１の重み保持レジスタまたは第２の重み保持レジスタから値がロードされてもよい。
【００１４】
別の実施形態では、シストリックアレイとして実施される行列乗算ユニットは、シストリックアレイの列に配置された複数のセルと、シストリックアレイの列ごとに設けられる重みシフトレジスタの２つのチェーンと、セルごとに設けられ、重みシフトレジスタから受け取られる重み入力を格納するように構成された重み行列レジスタと、重み行列レジスタに結合され、乗算結果を得るために重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを備えてもよい。各重みシフトレジスタは１つのチェーンのみに接続され、各セルは１つの重みシフトレジスタのみに接続される。
【００１５】
重み値は、重み値の対を含むベクトルレジスタから重みシフトレジスタの２つのチェーンで送られてもよい。
【００１６】
２つの重み値がベクトルレジスタから利用可能でない場合、各列の上部にある保持レジスタが重み値を保持してもよい。
【００１７】
２つの重み値が利用可能な場合、２つの重み値はクロックサイクルでセル内の重みシフトレジスタにシフトされる。
【００１８】
２つの重み値が利用可能でない場合、第１の重み値が利用可能な第１のクロックサイクルで、保持レジスタに、第１の重み値が、保持される値としてロードされ、シフトは行われない。次のクロックサイクルで、第２の重み値が利用可能になると、第２の重み値と保持された値とが２つのシフトチェーンによってシフトされる。１つの値が、各シフトチェーンによって、シフトチェーンに接続された重みシフトレジスタにシフトされる。
【００１９】
各シフトチェーンは、重み値を注入するための２つの注入ポイントを有し、一方のポイントは列の上部にあり、他方のポイントは列の第２のポイントにあってもよい。ベクトルレジスタが、各々が別々の重み値を表す４つの８ビット整数のパックされたセットを含んでもよい。４つの整数のうちの２つが列の上部に注入され、４つの整数の他の２つがアレイの第２のポイントに注入されてもよい。
【００２０】
この明細書において記載される主題は、以下の利点の１つ以上を実現するように特定の実施の形態において実現することができる。シストリックアレイの列ごとに重みシフトレジスタのチェーンが２つある行列乗算ユニットは、ベクトルレジスタからの速度が、重みシフトレジスタのチェーンが１つだけの行列乗算ユニットの２倍で、重みを行列乗算ユニットに運ぶことができる。さらに、アレイ内の２つのポイント、つまりアレイの上部と中間ポイントとに重み値を送る、列ごとに重みシフトレジスタのチェーンが２つある行列乗算ユニットは、ベクトルレジスタからの速度が、重みシフトレジスタのチェーンが１つだけの行列乗算ユニットの４倍で、重みを行列乗算ユニットに運ぶことができる。
【００２１】
追加的または代替的に、行列乗算ユニットは、転置されない重みシフトレジスタと転置された重みシフトレジスタとを各々が含むセルを有することができる。行列乗算ユニットは、その場合、垂直および水平方向の重みシフトチェーンに別々のレジスタを使用でき、その結果、行列乗算ユニットは、２つの重みシフトチェーンに別々のレジスタを有さない行列乗算ユニットの速度の２倍で、重み値をロードできる。
【００２２】
これらの重みシフトロード方法を組み合わせて、列ごとに重みシフトレジスタのチェーンが２つなく、垂直および水平方向の重みシフトチェーン用に別々のレジスタがない行列乗算ユニットから、ロード時間における増大を８倍得ることができる。これらの重みシフトチェーンおよび／または別々のレジスタは、行列乗算ユニットの複雑さやフットプリントを大幅に増加させることなく、行列乗算ユニットに追加できる。
【００２３】
この明細書の主題の１つ以上の実施形態の詳細は、添付の図面および以下の詳細な説明において述べられる。主題の他の特徴、局面および利点は、詳細な説明、図面および特許請求の範囲から明らかになる。
【図面の簡単な説明】
【００２４】
【図１Ａ】ニューラルネットワークをトレーニングするための例示的な専用ハードウェアチップのハイレベル図を示す。
【図１Ｂ】コンピュートコアのハイレベルの例を示す。
【図１Ｃ】例示的なニューラルネットワーク処理システムを示す。
【図２】行列乗算ユニットを含む例示的なコアアーキテクチャを示し、各行列乗算ユニットは、２次元のシストリックアレイである。
【図３】シストリックアレイ内のマルチセルの例示的アーキテクチャを示す。
【図４】重み値のロード速度を高めるために、列ごとに２つのチェーンの重みシフトレジスタを有する行列乗算ユニットのアーキテクチャの例を示す。
【図５】所与のマルチセルの列に重み値をロードするための例示的な方法の流れ図である。
【図６】重み値のロード速度を高めるために、列ごとに２つのチェーンの重みシフトレジスタを有し、列ごとに２つのポイントで重み値を送る、行列乗算ユニットのアーキテクチャの例を示す。
【図７】重み値のロード速度を高めるために、水平方向の重みシフトおよび垂直方向の重みシフトのための別個のレジスタを有する行列乗算ユニットのアーキテクチャの例を示す。
【図８】重み値のロード速度を高めるために保持レジスタのセットを有する例示的なセルを示す。
【発明を実施するための形態】
【００２５】
さまざまな図面の同様の参照番号および名称は、同様の要素を示す。
詳細な説明
複数の層を有するニューラルネットワークをトレーニングし、それを推論の計算に用いることができる。たとえば、ニューラルネットワークは、ある値で各々初期化されるパラメータを有する。トレーニング中、ニューラルネットワークは、ニューラルネットワークのトレーニング手順を実行して、ニューラルネットワークのパラメータの値を調整して、たとえば、逆伝播を用いてパラメータの初期値からパラメータのトレーニングを経た値を判断する。トレーニングされたニューラルネットワークは、推論を計算でき、つまり、ニューラルネットワークの層を介して入力を処理し、その入力に対するニューラルネットワーク出力を生成できる。
【００２６】
たとえば、入力が与えられると、ニューラルネットワークはその入力に対する推論を計算することができる。ニューラルネットワークは、ニューラルネットワークの各層を通して入力を処理することによって、この推論を計算する。いくつかの実装形態では、ニューラルネットワークの層はシーケンスで配置される。
【００２７】
したがって、受け取った入力から推論を計算するために、ニューラルネットワークはその入力を受け取り、それを各ニューラルネットワーク層を通してシーケンスで処理して推論を生成し、１つのニューラルネットワーク層からの出力が次のニューラルネットワーク層への入力として与えられる。ニューラルネットワーク層へのデータ入力、たとえば、ニューラルネットワークへの入力、またはシーケンス内におけるその層の下の層の、あるニューラルネットワーク層への出力は、その層への活性化入力と呼ぶことができる。
【００２８】
いくつかの実装形態では、ニューラルネットワークの層は有向グラフで配置される。つまり、任意の特定の層が複数の入力、複数の出力、またはそれらの両方を受け取ることができる。ニューラルネットワークの層は、ある層の出力を前の層への入力として送り返すことができるように構成することもできる。
【００２９】
図１Ａは、ニューラルネットワークをトレーニングするための例示的な専用ハードウェアチップのハイレベル図を示す。図示されているように、単一の専用ハードウェアチップは２つの独立したプロセッサ、たとえば１０２ａ、１０２ｂを含む。各プロセッサ１０２ａ、１０２ｂには、２つの異なるコア：（１）コンピュートコア、つまり非常に長い命令語（ＶＬＩＷ）マシン（１０３ａ、１０３ｂ）、および（２）疎計算コア、つまり埋め込み層アクセラレータ（１０５ａ、１０５ｂ）が含まれる。
【００３０】
各コンピュートコア、たとえば１０３ａおよび１０３ｂは、密線形代数問題用に最適化される。各コンピュートコアは、単一の非常に長い命令語によって制御される。各コンピュートコアは、非常に長い命令語命令の、それ自身のストリームを実行する。
【００３１】
例示的な疎計算コア、たとえば１０５ａまたは１０５ｂは、非常に疎である高次元データを密な低次元データにマッピングし、残りの層が密に充填された入力データを処理するようにする。たとえば、疎計算コアは、トレーニング中のニューラルネットワークの埋め込み層の計算を実行できる。
【００３２】
この疎から密へのマッピングを実行するために、疎計算コアは、埋め込みテーブルである、予め構築されたルックアップテーブルを用いる。たとえば、ユーザ入力として一連のクエリワードがある場合、各クエリワードはハッシュ識別子またはワンホットエンコードされたベクトルに変換される。識別子をテーブルインデックスとして用いて、埋め込みテーブルは対応する密なベクトルを返し、それは、次の層への入力活性化ベクトルになることができる。疎計算コアは、検索クエリワードにわたって簡約操作を実行して、１つの密な活性化ベクトルを作成することもできる。疎計算コアは、協働して、効率的な疎の、分散されたルックアップを実行し、なぜならば、埋め込みテーブルが巨大であり得、専用ハードウェアチップの１つの限られた容量の高帯域幅メモリに収まらないためである。疎計算コア機能に関する詳細は、２０１６年２月５日に提出された「MATRIX PROCESSING APPARATUS（行列処理装置）」と題される米国特許出願第１５／０１６，４８６号に見ることができる。
【００３３】
図１Ｂは、コンピュートコア（１０１）のハイレベルの例を示す。コンピュートコアは、いくつかのコンピュートユニットを並列で制御するマシン、つまりＶＬＩＷマシンであることができる。各コンピュートコア（１０１）には、スカラーメモリ（１０４）、ベクトルメモリ（１０８）、スカラー処理ユニット（１０７）、ベクトルレジスタ（１０６）、および拡張ベクトルユニット（つまり、行列乗算ユニット（ＭＸＵ）（１１３）と、転置ユニット（ＸＵ）（１１４）と、簡約および置換ユニット（ＲＰＵ）（１１６））が含まれる。
【００３４】
例示的なスカラープロセッサは、ＶＬＩＷ命令のフェッチ／実行ループを実行し、コンピュートコアを制御する。命令バンドルをフェッチしてデコードした後、スカラープロセッサ自体は、スカラープロセッサ（１０７）およびスカラーメモリ（１０４）の複数のマルチビットレジスタ、つまり３２の３２ビットレジスタを用いて、命令バンドルのスカラースロットにおいて見いだされる命令を実行するのみである。スカラー命令セットには、アドレス計算、ロード／ストア命令、分岐命令などで使用される通常の算術演算が含まれる。残りの命令スロットは、ベクトル処理ユニットまたは他の拡張ベクトルユニット（１１３、１１４、１１６）の命令をエンコードする。デコードされたベクトル命令は、ベクトル処理ユニットに転送される。
【００３５】
ベクトル命令とともに、スカラープロセッサ（１０７）は、最大３つのスカラーレジスタの値を他のプロセッサおよびユニットに転送して、演算を実行できる。スカラープロセッサは、ベクトルプロセッサから計算結果を直接取得することもできる。ただし、一部の実装形態では、例示的なチップは、ベクトルプロセッサからスカラープロセッサへの低帯域幅通信パスを有する。
【００３６】
ベクトル命令ディスパッチャは、スカラープロセッサとベクトルプロセッサとの間にある。このディスパッチャは、非スカラーＶＬＩＷスロットからデコードされた命令を受け取り、それらの命令をベクトル処理ユニットにブロードキャストする。ベクトル処理ユニットは、図１Ｃを参照して詳細に説明される。
【００３７】
例示的なスカラープロセッサ（１０７）は、小さい、高速な、プライベートスカラーメモリ（１０４）にアクセスする。このメモリは、はるかにより大きく、低速な高帯域幅メモリ（ＨＢＭ）（１１０）によってバックアップされる。同様に、例示的なベクトル処理ユニットは、小さい、高速な、プライベートベクトルメモリ（１０８）にアクセスする。このメモリも、ＨＢＭ（１１０）によってバックアップされる。ワード粒度アクセスは、スカラープロセッサ（１０７）とスカラーメモリ（１０４）との間、またはベクトル処理ユニットとベクトルメモリ（１０８）との間で起こる。ベクトルプロセッサとベクトルメモリとの間のロードおよびストアの粒度は、１２８個の３２ビットワードのベクトルである。ダイレクトメモリアクセスは、スカラーメモリ（１０４）とＨＢＭ（１１０）との間、およびベクトルメモリ（１０８）とＨＢＭ（１１０）との間で起こる。いくつかの実装形態では、ＨＢＭ（１１０）から処理ユニット（１０７）へのメモリ転送は、スカラーメモリまたはベクトルメモリを介してのみ実行できる。さらに、スカラーメモリとベクトルメモリとの間でダイレクトメモリ転送が行われない場合がある。
【００３８】
命令は、拡張ベクトルユニット演算を指定する場合がある。実行された各ベクトルユニット命令に加えて、各々が１つのレジスタ値を拡張ベクトルユニットに入力オペランドとして送ることができる２次元、つまり１２８×８のベクトルユニットがある。各拡張ベクトルユニットは、入力オペランドを受け取り、対応する演算を実行し、結果をベクトルプロセッサ（３０６）に返す。拡張ベクトルユニットは、図４を参照して以下に説明される。
【００３９】
図１Ｃは、ニューラルネットワーク計算を実行するための例示的な専用集積回路１００を示す。説明したように、チップには２つのコンピュートコア（１０３ａ、１０３ｂ）と２つの疎計算コア（１５２ａ、１５２ｂ）とが含まれる。
【００４０】
チップは、ホストコンピュータへのホストインターフェイス（１５０）、下部に沿った高帯域幅メモリの４つのスタック（１５６ａ〜１５６ｄ）、およびインターフェイスとメモリとを接続するチップ間相互接続（１４８）、ならびに他のチップからのデータを含む共有領域を有する。高帯域幅メモリの２つのスタック（１５６ａ〜１５６ｂ、１５６ｃ〜１５６ｄ）が各コンピュートコア（１０３ａ、１０３ｂ）に関連付けられる。
【００４１】
チップは、データを高帯域幅メモリ（１５６ｃ〜１５６ｄ）に保存し、そのデータをベクトルメモリ（１０８）において読込および読出し、そのデータを処理する。コンピュートコア（１０３ｂ）自体は、２次元に分割されたオンチップＳ−ＲＡＭであるベクトルメモリ（１０８）を含む。ベクトルメモリには、アドレスが浮動小数点数、つまり各々３２ビットである１２８個の数値を保持するアドレス空間がある。コンピュートコア（１０３ｂ）は、値を計算する計算ユニット、および計算ユニットを制御するスカラーユニットも含む。
【００４２】
ベクトル処理ユニットは、ベクトル処理ユニットの２次元配列、すなわち１２８×８から成り、これらはすべて、同じ命令を単一命令複数データ（ＳＩＭＤ）方式で実行する。ベクトルプロセッサには、レーンとサブレーン、つまり１２８本のレーンおよび８本のサブレーンがある。レーン内において、ベクトルユニットはロード命令およびストア命令を介して互いに通信する。各ベクトルユニットは、一度に１つの４バイト値にアクセスできる。同じレーンに属さないベクトルユニットは直接通信できない。これらのベクトルユニットは、以下で説明する簡約／置換ユニットを用いる必要がある。
【００４３】
計算ユニットは、ベクトル処理ユニット（１０６）において、浮動小数点演算および整数演算の両方に用いることができるベクトルレジスタ、つまり３２個のベクトルレジスタを含む。計算ユニットは、計算を実行するための２つの算術論理ユニット（ＡＬＵ）（１２６ｃ〜１２６ｄ）を含む。一方のＡＬＵ（１２６ｃ）は浮動小数点加算を実行し、他方のＡＬＵ（１２６ｄ）は浮動小数点乗算を実行する。両方のＡＬＵ（１２６ｃ〜１２６ｄ）は、シフト、マスク、比較などの他のさまざまな演算を実行できる。たとえば、コンピュートコア（１０３ｂ）は、ベクトルレジスタＶ１と第２のベクトルレジスタＶ２とを加算し、結果を第３のベクトルレジスタＶ３に入れたい場合がある。この加算を計算するために、コンピュートコア（１０３ｂ）は複数、つまり１０２４の演算を１クロックサイクルで実行する。これらのレジスタをオペランドとして用いて、各ベクトルユニットは、クロックサイクルごとに２つのＡＬＵ命令、１つのロードおよび１つのストア命令を同時に実行できる。ロードまたはストア命令のベースアドレスは、スカラープロセッサで計算でき、ベクトルプロセッサに転送できる。各サブレーンにおけるベクトルユニットの各々は、ストライドや特別なインデックス付きアドレスレジスタなどのさまざまな方法を用いて、それ自体のオフセットアドレスを計算できる。
【００４４】
計算ユニットは、平方根や逆数などの演算を実行する拡張単項パイプライン（ＥＵＰ）（１１６）も含む。コンピュートコア（１０３ｂ）は、これらの演算を実行するのに３クロックサイクルかかり、なぜならば、一度に１つのオペランドを取り込むからである。ＥＵＰ処理には１クロックサイクル以上かかるため、結果を保存する先入れ先出しのデータストレージがある。演算が終了すると、結果はＦＩＦＯに保存される。コンピュートコアは、後で別の命令を用いて、ＦＩＦＯからデータを引き出し、それをベクトルレジスタに格納できる。乱数生成器（１２０）により、コンピュートコア（１０３ｂ）はサイクルごとに乱数、つまりサイクルごとに１２８の乱数を生成できる。
【００４５】
上に述べられるように、各プロセッサは３つの拡張ベクトルユニット、つまり、行列乗算演算を実行する行列乗算ユニット（１１３）と、行列、すなわち１２８×１２８の行列の転置演算を実行する転置ユニット（ＸＵ）（１１４）を含むクロスレーンユニット（ＸＬＵ）と、図１Ｃにおいて別個のユニット、簡約ユニット１１５および置換ユニット１１６として示される簡約および置換ユニットとを有する。
【００４６】
行列乗算ユニットは、２つの行列間で行列乗算を実行する。コンピュートコアは、乗算される行列である一連の数値を読み込む必要があるため、行列乗算ユニット（１１３）はデータを取り込む。図示されているように、データはベクトルレジスタ（１０６）から来る。各ベクトルレジスタには、ある数値、つまりある３２ビットの数値が含まれる。しかしながら、データを行列乗算ユニット（１１３）に送って、数値をより小さなビットサイズ、つまり３２ビットから１６ビットに変更すると、浮動小数点変換が発生する場合がある。並直列変換器（１３０）は、ベクトルレジスタから数値が読み取られるときに、２次元配列つまり１２８×８の行列が１２８個の数値のセットとして読み取られ、次の８クロックサイクルの各々ごとに行列乗算ユニット（１１３）に送信されることを保証する。行列乗算がその計算を完了した後、結果は非直列化され（１３２ａ、１３２ｂ）、これは、結果行列が、ある数のクロックサイクルの間保持されることを意味する。たとえば、１２８×８の配列の場合、１２８個の数値が８クロックサイクルの各々ごとに保持され、次いで適当なＦＩＦＯ、例えば、転置結果ＦＩＦＯ（ＴＲＦ）１３４または乗算結果ＦＩＦＯ（ＭＲＦ）１３６にプッシュされ、１２８×８の数値の２次元配列を１クロックサイクルで取得して、ベクトル処理ユニット（１０６）に含まれるベクトルレジスタに格納できる。
【００４７】
あるサイクル期間、すなわち１２８のサイクルからなる期間にわたって、重みが、行列を乗算する数値として行列乗算ユニット（１１３）にシフトされる。行列および重みがロードされると、コンピュートコア（１０３ｂ）は、数値のセット、つまり１２８×８の数値のセットを行列乗算ユニット（１１３）に送ることができる。セットの各ラインに行列を乗算して、クロックサイクルごとにある数の結果、つまり１２８の結果を生成できる。コンピュートコアが行列乗算を実行している間、コンピュートコアは、前の行列の計算プロセスが完了したときに、コンピュートコアが乗算する次の行列が利用できるように、バックグラウンドにおいて次の行列になる新たな数値のセットのシフトも行う。行列乗算ユニット（１１３）は、乗算されるべき行列におけるデータである重み入力と、行列で乗算されるべきベクトルにおけるデータである左辺データ入力とを処理し、出力のベクトルをベクトル処理ユニットに与えることができる。ベクトル処理ユニットは、出力のベクトルを処理し、処理された出力のベクトルをベクトルメモリに格納することができる。たとえば、ベクトル処理ユニットは、非線形関数を行列乗算ユニットの出力に適用して、ベクトルデータ値を生成できる。いくつかの実装形態では、ベクトル処理ユニット１０６は、正規化された値、プールされた値、またはその両方を生成する。処理された出力のベクトルは、たとえばニューラルネットワーク内の後続の層で用いるために、行列乗算ユニット１１３への左辺データ入力として用いることができる。
【００４８】
転置ユニットは、行列を転置する。転置論理ユニット（１１４）は、数値を取り込み、それらを転置して、レーンを横切る数値が他の次元の数値と転置されるようにする。一部の実装形態では、ベクトルプロセッサは１２８×８のベクトルユニットを含む。したがって、１２８×１２８の行列を転置するには、完全な行列転置のために１６個の個別の転置命令が必要である。転置が終了すると、転置された行列が利用可能になる。ただし、転置された行列をベクトルレジスタファイルに移動するには、明示的な命令が必要である。
【００４９】
簡約／置換ユニット（またはユニット１１５、１１６）は、置換、レーン回転、回転置換、レーン簡約、置換されたレーン簡約、およびセグメント化された置換されたレーン簡約などのさまざまな操作をサポートすることで、クロスレーン通信の問題に対処する。図示されているように、これらの計算は別々であるが、コンピュートコアは一方もしくは他方または一方に連鎖された他方を用いることができる。簡約ユニット（１１５）は、数値からなる各ラインを簡約し、それらの数値を置換ユニット（１１６）に供給する。置換ユニットは、異なるレーン間でデータを変更する。転置ユニット、簡約ユニット、置換ユニット、および行列乗算ユニットは、各々、完了までに１クロックサイクル以上かかる。したがって、各ユニットにはＦＩＦＯが関連付けられ、計算結果をＦＩＦＯにプッシュし、後で別の命令を実行して、データをＦＩＦＯからベクトルレジスタにプルできる。ＦＩＦＯを用いることにより、コンピュートコアは、長々とした演算の間、複数のベクトルレジスタを予約する必要がない。図示されているように、各ユニットはベクトル処理ユニット（１０６）におけるベクトルレジスタからデータを取得する。
【００５０】
コンピュートコアは、スカラーユニットを用いて計算ユニットを制御する。スカラーユニットには２つの主要な機能があり、それは、（１）ループカウントおよびアドレス指定を実行すること、ならびに（２）ＤＭＡコントローラがバックグラウンドにおいて高帯域幅メモリ（１５６ｃ〜１５６ｄ）とベクトルメモリ（１０８）との間で、および次いで例示のシステムにおける他のチップへのチップ間接続（１４８）にデータを移動するよう、ダイレクトメモリアドレス（ＤＭＡ）要求を生成することである。スカラーユニットは、命令メモリ（１０４）と、命令デコードおよび発行（１０２）と、スカラーレジスタすなわち３２ビットを含むスカラー処理ユニット（１０７）と、スカラーメモリ（１０４）と、クロックサイクルごとに２つの演算を実行する２つのＡＬＵ（１２６ａ、１２６ｂ）とを含む。スカラーユニットは、オペランドと即値とをベクトル演算に渡すことができる。各命令は、ベクトル処理ユニット（１０６）においてベクトルレジスタで実行される命令を含む命令バンドルとして、命令デコードおよび発行（１０２）から送ることができる。各命令バンドルは非常に長い命令語（ＶＬＩＷ）であり、各命令はある数のビット幅であり、ある数の命令フィールドに分割される。
【００５１】
図２は、行列乗算ユニット（ＭＸＵ）２０１ａおよび２０１ｂを含む例示的なコアアーキテクチャ２００を示す。各ＭＸＵは２次元のシストリックアレイである。アレイは、行列乗算演算を実行するように配線される。ＭＸＵは、クロックサイクルごとに１つの乗算という一定のスループットで、１２８要素のベクトルをプリロードされた１２８×１２８の行列で乗算する。
【００５２】
各ＭＸＵは、１２８の行および１２８の列を有する。ＭＸＵは、タイルと呼ばれる同一のブロックに分割できる。たとえば、ＭＸＵは３２個のタイルに分割でき、各タイルには３２行×１６列が含まれる。各タイルは、さらに積和サブユニットセルに分割できる。各セルはベクトルデータ入力オペランドを取り、そのオペランドに格納された重みを乗算して結果を得、その結果を部分和に加算して新たな部分和を生成する。いくつかの実装形態では、サブユニットセルをより大きなマルチセル、つまり、２×２の積和サブユニットセルのアレイまたはセーデキム（１６）セルと呼ばれる４×４の積和サブユニットセルのアレイにグループ化できる。入力データを１つの積和サブユニットセルからクロックサイクルごとに１つの速度で次のセルに移動する代わりに、データはクロックサイクルごとに１つのマルチセルでシストリックアレイを移動できる。
【００５３】
一連のベクトル行列乗算を開始する前に、行列をＭＸＵにプリロードする必要がある。この行列のためのデータは「重み」データと呼ばれる。重み行列は、ソースバスを介して、ＭＸＵに接続されたバスによってＭＸＵに送られ、重みシフトレジスタにシフトされる。次いで、重みシフトレジスタの内容が重み行列レジスタにロードされ、行列の乗算が開始できるようになる。この重みロードプロセスは、図３〜図８に関してより詳細に説明される。
【００５４】
図２に示すように、各ＭＸＵ、例えば１１３ａおよび１１３ｂは、３つのバス、転置されない重み用の第１のソースバス（２３０ａ、２３０ｂ）、転置された重み用の第２のソースバス（２２０ａ、２２０ｂ）、およびＭＸＵに格納されている行列で乗算されるベクトルデータ用の左辺バス（２１０ａ、２１０ｂ）に接続される。ＭＸＵは、ＭＸＵのエッジに接続するワイヤによってバスに接続される。各転置ユニット（ＸＵ）、たとえば１１４ａおよび１１４ｂも、第１のソースバスおよび第２のソースバスに接続される。
【００５５】
第１および第２のソースバスは、ＸＵまたはＭＸＵで消費されるべくベクトル処理ユニットから送られるデータを含む多目的バスである。データ処理は、ベクトルレジスタ２０６、直列化処理ユニット２０２、および選択ユニット２０４を含むベクトル処理データパスで発生する。ベクトル処理ユニットがバスで重みを送る方法はいくつかある。重みは、通常の「ハイ（Ｈ）」または「ロー（Ｌ）」で送られてもよい。レーンごとに８つの３２ビットの浮動小数点数（サブレーンごとに１つ）が、ｂｆｌｏａｔの１６ビットの浮動小数点数に丸められる。これらの値は４つの対にパックされ、８サイクルのコースにわたって１サイクルおきにＭＸＵに送られる。通常の「Ｈ」と「Ｌ」との違いは、ベクトル処理ユニットが浮動小数点の３２からｂｆｌｏａｔへの変換を行う方法である。重みがパックされる場合がある、とは、レーンごとの８つの３２ビット値の各々に、パックされたｂｆｌｏａｔの対が含まれることを意味する。８つの連続したサイクルの間に各サイクルでソースバスを使用して、８つではなく１６の値がＭＸＵに送られる。奇数サイクルでは、各サブレーンの下位１６ビットがＭＸＵに送られ、偶数サイクルでは、各サブレーンの上位１６ビットが送られる。重みは、追加または代替としてバイト単位で送られてもよい。各３２ビットオペランドには、４つの８ビット符号付き２の補数整数のパックされたセットが含まれる。各バイトは、修正された符号絶対値に変換される。これらの値は、連続する８サイクルにわたってソースバスによってＭＸＵに送られる。
【００５６】
重みは、第１または第２のソースバスを用いて転置されないまたは転置された命令として送られ、重みシフトレジスタにシフトされてもよい。ロード操作でトリガされると、以下に説明するように、重みシフトレジスタの内容は重み行列レジスタにロードされる。重みシフトレジスタから重み行列レジスタへのロードパスは、修正された符号絶対値からｂｆｌｏａｔへの変換がバイトモードデータで行われる場所でもある。ロード制御バスは、この変換を実行するかどうかを示す。
【００５７】
実行中の命令に応じて、ソースバスからの３２ビット値には、ビット［１５：０］の値が（時間において）より早い値を表す１６ビット浮動小数点値のパックされた対、またはビット［７：０］の値が（時間において）より早い値を表し、他の値がシーケンスで後に続く、修正された符号絶対値形式の４つの８ビットの整数のパックされたセットが含まれてもよい。ＭＸＵがバスからデータを受け取ると、データ値はＭＸＵ全体に均等に、左側に値０、右側に値１２７で、拡散される。
【００５８】
左辺（ＬＨＳ）データバスは、接続されたＭＸＵに格納される行列で乗算されるよう、１２８個の１６ビット浮動小数点数を特定の形式、たとえば、ｂｆｌｏａｔで運ぶ。ＬＨＳデータバスのデータは、ベクトル処理ユニットから来て、転置ユニット、例えば、１１４ａおよび１１４ｂを通過する。ＬＨＳ入力がＭＸＵに到着すると、値はＭＸＵ全体に均等に、左側に値０、右側に値１２７で、拡散される。
【００５９】
行列乗算の結果は、ＭＸＵ全体に均等に拡散され、ＭＸＵから行列結果ＦＩＦＯ（ＭＲＦ）、たとえば１３６ａおよび１３６ｂに送られる。ＸＵからの結果は、対応する転置結果ＦＩＦＯ（ＴＲＦ）、たとえば１３４ａおよび１３４ｂに送られる。
【００６０】
図３は、行列乗算ユニット内のマルチセルの例示的なアーキテクチャを示す。上記で説明したように、行列乗算ユニットは２次元のシストリックアレイである。アレイは、マルチセルにグループ化できる複数の積和サブユニットを含む。いくつかの実装形態では、シストリックアレイの第１の次元はセルの列に対応し、シストリックアレイの第２の次元はセルの行に対応する。シストリックアレイは、列よりも行が多くてもよく、行よりも列が多くてもよく、または列と行とが同数であってもよい。この明細書では、列または垂直方向についての特定の処理について説明する。ただし、異なる設計で行または水平方向の処理を実行できる。
【００６１】
図示された例では、左辺データレジスタ３１５ａ、３１５ｂは、アレイの行にベクトルデータ入力を送る。重みシフトチェーン３０１ａおよび３０１ｂは、重み入力値をアレイの列に送り、重みシフトチェーン３０２ａおよび３０２ｂは、重み入力値をアレイの行に送る。シフトチェーンは、たとえばメモリから行列乗算ユニット内のさまざまなレジスタの各々に値を渡すことができる有線経路である。
【００６２】
各重みシフトレジスタ３０５は、その重み内容値をソースバスから重みシフトレジスタ３０５のチェーンに沿ってシフトするように設計される。データがシフトインされた後、並列コピー操作により、すべてのデータが重みシフトレジスタ３０５から対応する重み行列レジスタ３２５に確実にコピーされる。データが重み行列レジスタ３２５にあるとき、データは任意の数の乗算サイクルで用いられる。この間、次の乗算セットに備えて、より多くの重みをバックグラウンドで重みレジスタ３０５にシフトしてもよい（通常はシフトされる）。
【００６３】
左辺データレジスタ３１５ａ、３１５ｂは、ベクトルデータ入力を受け取ることができる。各左辺データレジスタは、１クロックサイクルについて各クロックサイクルで１つのＬＨＳデータ項目を保持する。マルチセルによって受け取られる各ベクトルデータ入力は、左辺データレジスタ３１５ａ、３１５ｂなど、マルチセルの対応する左辺レジスタ内を自由に流れてもよい。左辺データレジスタは、ベクトルレジスタによって、またはアレイ内の所与のマルチセルの位置に応じて、そのマルチセルの左にある隣接するマルチセルによって与えられ得るベクトルデータ入力を格納する。例えば、マルチセル３００が行列乗算ユニットのシストリックアレイ内の最も左の位置にある場合、ベクトルデータ入力はベクトルレジスタによって与えられる。ベクトルレジスタは、複数の異なるベクトルデータ入力をマルチセル３００に与えてもよく、各受け取られたベクトルデータ入力は、次いで、左辺データレジスタ３１５のうちの異なる１つによって格納されてもよい。各行は、マルチセルにグループ化される行の数に関係なく、クロックサイクルごとに１つの値を受け取る。
【００６４】
各左辺レジスタは、マルチセルのアレイの第１の次元に沿ってセルに結合されてもよい。左辺レジスタのセルへの接続は、図３において点線で示される。例えば、マルチセル内の左辺データレジスタ３１５ａ（ある左辺データレジスタ）は、第１の行のセル３５０ａおよび３５０ｃに結合される。同様に、マルチセル内の左辺データレジスタ３１５ｂ（第２の左辺レジスタ）は、第２の行のセル３５０ｂおよび３５０ｄに結合される。各左辺レジスタ３１５は、格納されたベクトルデータ入力を、左辺レジスタが結合されるセル３５０に転送する。したがって、第１の次元に沿って（たとえば、所与の行または所与の列に沿って）延びる所与の数のセルについて、単一のセルだけでなく、マルチセル内のすべてのセルにベクトルデータ入力を渡すことができ、これにより、ベクトルデータ入力がセルのアレイ全体に速く拡散し、マルチセルの動作の効率が向上する。
【００６５】
複数のベクトルデータ入力を隣接する左辺レジスタに送って、複数のベクトルデータ入力をアレイの別のマルチセルで使用できるようにすることもできる。このプロセスにより、アレイの別の特定のマルチセルで使用するためにベクトルデータ入力をシフトできる。
【００６６】
マルチセル３００の各セル３５０は、格納された重み値を含む。行列乗算プロセスを開始する前に、重みをシストリックアレイのセルにシフトしてロードする。専用チェーンおよび重みシフトレジスタが重みシフト用に設けられ、前の行列乗算処理の実行と同時に新たな重みをシフトインできる。行列入力演算処理全体のレイテンシを短縮する方法で、重み入力をマルチセルにロードできる。
【００６７】
上述のように、重みシフトチェーン３０１、３０２は、メモリユニット、例えば図１のベクトルメモリ１０８から重み入力を受け取ることができる。シフトチェーンは、複数の対応する重み入力を、マルチセル３００に関連付けられた重み行列レジスタ３２５に送ることができる。
【００６８】
いくつかの実装形態では、重みシフトレジスタは、ベクトルデータ入力をアレイ全体にわたって１つの次元に沿って、たとえば右にシフトし、重み入力をアレイ全体にわたって１つまたは両方の次元、たとえば右または下にシフトする。例えば、１クロックサイクルにわたって、マルチセル３００における複数のベクトルデータ入力の各ベクトルデータ入力は、同じ行における次のマルチセルにおいて対応する左辺データレジスタにシフトできる。水平データ（左辺データ）および垂直データ（部分和）は、各々、クロックサイクルごとに、クロックサイクルにつき１マルチセルずつ移動する。重みは、システムによって指示された場合にのみシフトし、実装形態および実行される命令に応じて、１、２、もしくは４行（または列）シフトしてもよい。
【００６９】
マルチプレクサ３３０は、第１のシフトチェーン３０１または第２のシフトチェーン３０２の重みシフトレジスタ３０５から重みを選択し、選択された入力を重み行列レジスタ３２５への単一のラインに転送する。マルチプレクサ３３０はセル３５０の境界線の外側に示されるが、いくつかの実装形態では、マルチプレクサ３３０はセル３５０内に存在する。
【００７０】
あるクロックサイクルで、各マルチセルは複数の所与の重み入力および複数の所与のベクトルデータ入力を処理して、複数の累積出力を生成できる。一般に、処理には、ベクトルデータ入力に格納された重みを乗算する乗算演算が含まれる。累積出力は、所与の重み入力と同じ次元に沿って、下に、隣接するマルチセルに渡すこともできる。いくつかの実装形態では、１つの畳み込み計算から別の畳み込み計算に移行するために、重みが所与のクロックサイクル中に１より多いマルチセルをシフトされる。
【００７１】
累積出力は、重み入力と同じ列に沿って、たとえばアレイ内の列の一番下に向かって渡すことができる。いくつかの実装形態では、部分和レジスタ３１０ａ、３１１ａは、部分和値を前のマルチセルから当該のマルチセルに渡す。アレイは、マルチセルの各列から累積出力を格納する部分和レジスタ３１０ｂ、３１１ｂを含むことができる。マルチセルの各列について、列のサブユニットセルによって生成された積は、上のマルチセルからの入来部分和と結合され、次の部分和として送られる。特定のマルチセル、例えばシストリックアレイの一番下の列のマルチセルなどの場合、累積出力は、ベクトル計算ユニットに転送できる最終的な累積値を含んでもよい。いくつかの実装形態では、最終的な累積値はアレイの一番下のマルチセルからベクトル計算ユニットに直接転送されるが、他の実装形態では、最終的な累積値はまずメモリに保存されるか、または異なるコンポーネントによって処理されてからベクトル計算ユニットに送られる。
【００７２】
図４は、重み値のロード速度を高めるために、マルチセルサブアレイの列ごとに重みシフトレジスタの２つのチェーンを備えた行列乗算ユニットのマルチセルのアーキテクチャの例を示す。図４に示すように、セル４３５ａおよびセル４３５ｂはマルチセル４００の１つの列を構成し、セル４３５ｃおよびセル４３５ｄはマルチセル４００の第２の列を構成する。各列には、重みシフトレジスタのチェーンが２つある。所与の列の各セルは、その列の２つのチェーンのうちの１つのみから重み入力を受け取るように構成される。図４に示すように、１つのチェーン４０１は偶数行において重みシフトレジスタに接続し、１つのチェーン４０２は奇数行において重みシフトレジスタに接続する。各サイクルで、２つの新たな値が各列にシフトされ、既存のすべての重み値が２行下にシフトされる。したがって、重みは、シストリックアレイの列ごとに重みシフトレジスタの２つのチェーンを有さない行列乗算ユニットの２倍の速度でマルチセルにロードできる。
【００７３】
図示されるように、重み値はベクトルレジスタ４０３からシフトインされる。一実装形態では、行列乗算ユニットの列ごとに１つのベクトルレジスタ４０３がある。図３の例では、ベクトルレジスタ４０３は行列乗算ユニットの上部に示されるが、ベクトルレジスタ４０３は、行列乗算ユニットに対して様々な位置、例えばユニットの底部に物理的に位置することができる。
【００７４】
ベクトルレジスタ４０３は、行列乗算ユニットによって演算される値よりも何らかの大きさだけ大きいまたは小さいレジスタ値を保持することができる。たとえば、レジスタはｎビット値を保持し、行列乗算ユニットはｎ／２ビット値で動作する。一部の実装形態では、各ベクトルレジスタは３２ビット値を保持し、行列乗算ユニットは１６ビット値で動作する。ある例示的な行列乗算ユニットは、レジスタの各３２ビット値を１６ビット値の対として処理するモードを有し、この対の１つの１６ビット値は、第１の重みシフトチェーン４０１に送られ、この対の第２の１６ビット値は、第２の重みシフトチェーン４０２に送られる。列ごとに１つのベクトルレジスタ４０３が示されるが、マルチセルごとにわずか１つのベクトルレジスタ４０３があってもよい。追加的または代替的に、各チェーンは、単一の１６ビットの重み値をチェーンに与える別個のベクトルレジスタ３０３に接続されてもよい。この場合、ベクトルレジスタ４０３における３２ビット浮動小数点値は１６ビット値に変換される。
【００７５】
ある実装形態では、重み値は、列ごとに２つのシフトチェーンがない状態で行列乗算ユニットの速度の２倍で値を送信するよう利用可能でない場合がある。この状況を処理するために、各垂直シフトチェーンに１つずつ、２つの重み値が利用可能になるまで、重み値を保持するよう、保持レジスタ４４５が各列の上部に配置される。１つの重み値のみが利用可能な最初のクロックサイクルで、利用可能な重み値は保持レジスタ４４５にコピーされる。新たな重み値が利用可能な次のクロックサイクルで、保持レジスタ内の重み値は１つの重みシフトチェーンによって保持レジスタから重みシフトレジスタにシフトされることになり、そのクロックサイクルで利用可能な新たな重み値は、第２の重みシフトチェーンによって第２の重みシフトレジスタにシフトされる。
【００７６】
水平シフトチェーン４０５は、上述のようにセルに重み値を与えてもよい。いくつかの実装形態では、上記の垂直シフトチェーン４０１、４０２と同じ方法で重みロードレイテンシを減少させるように機能する２つの水平シフトチェーンがあり得る。
【００７７】
マルチプレクサ４３０は、セル内の重み行列レジスタに送られる重み値が水平シフトチェーン４０５から来るか、または垂直シフトチェーン４０１ｂもしくは４０２ｂから来るかを判断する。重み値が重み行列レジスタにロードされ、左辺データレジスタ４１５がベクトルデータ入力を与えると、セル４３５で行列乗算を実行できる。
【００７８】
図５は、重み値を所与のマルチセルの列にロードするための例示的なプロセス５００の流れ図である。インターフェイスは、ベクトルレジスタから少なくとも１つの重み値を受け取る（５０１）。
【００７９】
インターフェイスは、複数の重み値が利用可能かどうかを判断する（５０２）。
複数の重み値が利用可能な場合、インターフェイスは、重み値を、シフトチェーンによって、クロックサイクルで、マルチセル内のセル４３５の重みシフトレジスタにシフトする（５０４）。
【００８０】
インターフェイスは、重み行列からのすべての重み値が行列乗算ユニットにロードされるまで、重み値をロードし続ける（５０６）。
【００８１】
同じクロックサイクルで２つの重み値が利用可能でない場合、単一の重み値が利用可能な最初のサイクルで、保持レジスタ４４５にその利用可能な重み値がロードされ、シフトは行われない（５０３）。
【００８２】
別の重み値が利用可能になる次のサイクルで、インターフェイスは、新たな値および保持レジスタ４４５に保持される値を２つのシフトチェーンによってマルチセルの重みシフトレジスタにシフトする（５０５）。
【００８３】
次に、インターフェイスは、重み行列からのすべての重み値が行列乗算ユニット５０６にロードされるまで、重み値のロードを続ける。
【００８４】
サイクルごとに複数の重み値が利用可能でない場合、インターフェイスは１サイクルおきにシフトチェーンを活性化する。
【００８５】
図６は、重み値のロード速度を４倍増加させるために、列ごとに２つのチェーンの重みシフトレジスタを伴い、列ごとに２つのポイントで重み値を注入する、行列乗算ユニットのアーキテクチャの例を示す。図３に示すように、行列乗算ユニットには、シストリックアレイの列ごとに２つのシフトチェーンがある。各セル６５０は、１つのシフトチェーンのみに接続されるシフトレジスタ６３５を含む。上述のように、ベクトルレジスタ６０３は、行列乗算ユニットによって演算される値よりも何らかの大きさだけ大きいまたは小さいレジスタ値を保持することができる。たとえば、あるレジスタはｎビット値を保持し、行列乗算ユニットはｎ／２ビット値で動作する。ベクトルレジスタ内の値は、行列乗算ユニットに期待される値サイズに一致するように分割または何らかの方法で変換できる。
【００８６】
一実装形態では、各レジスタ６０３は３２ビットの値を保持することができる。各ベクトルレジスタ６０３の値は、各々別個の重み値である４つの８ビット符号付き整数のパックされたセットとして扱われる。図３に示すように、各８ビットの符号付き整数は、２つの１６ビットのチェーンで送られる。ただし、それらの整数はシストリックアレイにおいて列ごとに２つの注入ポイント６８０、６８１に送られる。それらの整数は、アレイの上部（６８０ａ、６８０１ａ）および下の別のポイント（６８０ｂ、６８０ｂ）に送られる。説明した複数の注入ポイントを有する実施形態は、本明細書で説明する他の実施形態および特徴と組み合わせることができる。
【００８７】
いくつかの実装形態では、整数がアレイの下半分のポイントに送られる場合、整数を注入するための追加の配線は必要ではなく、なぜならば、ベクトルレジスタからアレイの上部へのチェーンがアレイの全長を下から上まで横断するからである。各列の上部で、整数のうちの２つが、アレイで用いられる形式の１６ビットの浮動小数点値に変換され、上記の２つの重みシフトチェーン（６８０ａ、６８１ａ）に注入される。シフトチェーンはマルチプレクサによって中間ポイントで切断され、そのポイントでの整数から浮動小数点へのコンバータの第２のセットが、各３２ビット値から他の２つの整数を取得し、変換し、そのポイント（６８０ｂ、６８１ｂ）で注入する。たとえば、３２ビットのワードを、８ビットの４つの等しい部分、Ａ、Ｂ、Ｃ、Ｄに分割できる。重みインターフェイスで、部分Ａおよび部分Ｂをアレイの上部に送り、それらを、行列乗算ユニットによって演算される16ビット値に変換する。重みインターフェイスは、マルチプレクサを介してアレイの中間ポイントに部分Ｃおよび部分Ｄを送ることもできる。この実装形態では、部分Ｃおよび部分Ｄはアレイの上部には送られず、シフトチェーンの中間ポイントでセルの重みシフトレジスタに注入される。シフトチェーン上において中間ポイントにマルチプレクサが存在するため、重み値は、シフトチェーン上の前の重みシフトレジスタからではなく、注入ポイントから選択される。
【００８８】
第２の重みの対をアレイに注入するポイントは、中間ポイントではなく、他のポイントである可能性がある。たとえば、アレイの下への１／４のポイントになる場合がある。この場合、上部に注入された重みは、行列乗算ユニットの最初の１／４のセルおよび行列乗算ユニットの３番目の１／４のセルにシフトされ、１／４のポイントに注入された重みは、行列乗算ユニットの２番目および４番目の１／４のセルにシフトされる。このプロセスには追加の配線が必要であるが、前の行列乗算が終了しつつある間に重みがより早くシフトし始めることができる。
【００８９】
示されるように、２つのシフティングチェーンは列ごとに発生する。ただし、一部の実装形態では、２つのシフティングチェーンは、追加的または代替的に、シフティングチェーンごとに２つの注入ポイントがある状態で、行ごとに生じ得る。
【００９０】
図７は、重み値をロードする速度を増加させるために、転置された重みシフトおよび通常の転置されない重みシフトのための別個のレジスタを有する行列乗算ユニットのアーキテクチャの例を示す。各マルチセル７００は複数のセル７５０を含み、垂直方向または水平方向のいずれかから重み値をロードすることができる。重みを上から垂直方向にロードすると、重み行列が行列乗算ユニットに格納される。同じ重みを同じ順序で横からロードすると、重み行列の転置が行列乗算ユニットに格納される。ニューラルネットワークシステムのトレーニングでは、転置されない重み行列および転置された重み行列の両方を、トレーニングアルゴリズムの異なるステップでロードする必要がある。重みが上から垂直方向にロードされると、重み値はセルを通して下にシフトされる。重みが左から水平方向にロードされると、重み値はマルチセル７００を通って右にシフトされる。図７は、通常のシフトレジスタ７０５に接続された通常のシフトチェーン７０１ａ、７０１ｂを示す。転置されたシフトチェーン７０２ａ、７０２ｂは転置されたシフトレジスタ７０５に接続される。マルチプレクサ７３０は、どのシフトチェーン７０１、７０２から重み行列レジスタ７２５をロードするかを判断する。
【００９１】
一部の実装形態では、ある重みのセットを行列乗算ユニットの重み行列レジスタにシフトするのにｎサイクルかかる。２番目の重みのセットは、そのシフトを、最初の重み値がロードされたｎ／２サイクル後に開始でき、新たな重みのセットをｎ／２サイクルごとにシフトレジスタから重み行列レジスタにロードしてもよい。
【００９２】
一部の実装形態では、１２８×１２８の重みのセット全体を常に使用する必要はない。未使用の位置の重みをゼロにセットして、重み行列を効果的に小さくすることができる。ある行列乗算ユニットは、その場合、データを重みシフトレジスタのすべての行またはすべての列にシフトする必要はない。各重みシフト命令は、８行のデータ、または転置されたロードの場合には８列のデータを、シストリックアレイにシフトすることになる。１６個の重みシフト命令は、１２８×１２８の行列全体をロードし、以前のすべてのデータを置き換える。データが重みシフトレジスタから対応する重み行列レジスタにコピーされると、各重みシフトレジスタはクリアされる。新たなデータを重みシフトレジスタにシフトすることは、このロード＆クリア信号の伝搬が開始された直後に開始できる。データがロードされる機会を有する前にシフトしないように、重みシフト信号は、ロード＆クリア波面の下および右のすべてのセルに対して禁止される。古いデータは完全にクリアされるため、データの行または列のすべてをシフトインする必要はない。シフトレジスタの上（または左）部分のみが新たなデータで埋められ、残りはゼロのままとなるため、それらの行への入来データは無視される（またはそれらの列からの出力データはゼロにされる）。
【００９３】
図８は、重み値のロード速度を高めるために保持レジスタのセットを有する例示的なセル８００を示す。セル８００は、シフトインされた重みのセットのための一時記憶として用いられる１つ以上の重み保持レジスタのセットを含む。１つのセットの重みシフトレジスタ８０５ａの値は、重み行列レジスタ８２５にコピーされる代わりに、またはそれに加えて、１つのセットの重み保持レジスタ８４５ａにコピーすることができる。第２のセットの重みシフトレジスタ８０５ｂの値は、重み行列レジスタ８２５にコピーされる代わりに、またはそれに加えて、第２のセットの重み保持レジスタ８４５ｂにコピーすることができる。重み値のセットが重み行列レジスタにロードされるとき、重み値のセットは、重みシフトレジスタ８０５ａ、８０５ｂから直接ではなく、保持レジスタ８４５のセットの１つから取得されてもよい。このプロセスにより、重み値のセットを、アレイへのシフト後に複数回ロードすることができる。たとえば、アルゴリズムが２つの重みセット間の切り替えを必要とする場合、１つのシフトチェーンからの重み値をロード間で保持レジスタにシフトできる。このプロセスにより、重みシフトのタイミングを重みロードから切り離すこともできる。たとえば、新たな重み値のセットがｎ／ｃサイクルごとにシフトを開始する場合、両方の重み値のセットを同時にシフトし、最初のセットが重み行列レジスタにロードされると、もう１つのセットが重み保持レジスタに移動されることが考えられる。追加のｎ／２サイクルの後、２番目のセットが保持レジスタから重み行列レジスタにロードされる。
【００９４】
いくつかの実装形態では、図４および／または図６の２つのシフトチェーンは、所与の時間に行列乗算ユニットにロードできる重み値の量の増大のために、通常のおよび転置されたシフトレジスタの追加と組み合わせることができる。
【００９５】
本明細書において記載される主題および機能的動作の実施形態は、本明細書に開示される構造およびそれらの構造的等価物を含む、デジタル電子回路系において、有形で実施されるコンピュータソフトウェアもしくはファームウェアにおいて、コンピュータハードウェアにおいて、またはそれらの１つ以上の組合せにおいて実現され得る。本明細書に記載される主題の実施形態は、１つ以上のコンピュータプログラムとして、すなわち、データ処理装置による実行のために、または、データ処理装置の動作を制御するために有形の非一時的な記憶媒体上でエンコードされたコンピュータプログラム命令の１つ以上のモジュールとして実現され得る。コンピュータ記憶媒体は、機械可読記憶装置、機械可読記憶基板、ランダムもしくはシリアルアクセスメモリデバイス、または、それらの１つ以上の組合せであり得る。代替的に、または加えて、プログラム命令は、データ処理装置による実行に対して好適な受信側装置への送信のために情報をエンコードするよう生成される、たとえばマシンにより生成された電気信号、光信号、または電磁気信号などの、人為的に生成された伝搬される信号上でエンコードすることができる。
【００９６】
「データ処理装置」という用語は、データ処理ハードウェアを指し、例としてプログラマブルプロセッサ、コンピュータ、または複数のプロセッサもしくはコンピュータを含む、データを処理するためのすべての種類の装置、デバイスおよびマシンを包含する。当該装置は、たとえばＦＰＧＡ（フィールドプログラマブルゲートアレイ）またはＡＳＩＣ（特定用途向け集積回路）といった特定目的論理回路でもあることができるかまたはそれをさらに含み得る。当該装置は、ハードウェアに加えて、たとえばプロセッサファームウェア、プロトコルスタック、データベース管理システム、オペレーティングシステム、または、それらの１つ以上の組合せを構成するコードといった、コンピュータプログラムについて実行環境を作成するコードをオプションとして含み得る。
【００９７】
プログラム、ソフトウェア、ソフトウェアアプリケーション、アプリケーション、モジュール、ソフトウェアモジュール、スクリプトまたはコードとも称され、または記載され得るコンピュータプログラムは、コンパイル型もしくはインタープリタ型言語、または宣言型もしくは手続き型言語を含む任意の形態のプログラミング言語で記述され得、スタンドアロンプログラムとして、または、モジュール、コンポーネント、サブルーチン、もしくは、コンピューティング環境で使用するのに好適な他のユニットとして任意の形態で展開され得る。プログラムは、ファイルシステムにおけるファイルに対応し得るが、対応する必要があるわけではない。プログラムは、当該プログラムに専用である単一のファイルにおいて、または、複数の連携ファイル（ｃｏｏｒｄｉｎａｔｅｄ  ｆｉｌｅｓ）（たとえばコードの１つ以上のモジュール、サブプログラムまたは部分を格納するファイル）において、他のプログラムまたはデータ（たとえばマークアップ言語ドキュメントに格納される１つ以上のスクリプト）を保持するファイルの一部に格納され得る。コンピュータプログラムは、１つの場所に位置するかもしくは複数の場所にわたって分散されデータ通信ネットワークによって相互接続される１つのコンピュータまたは複数のコンピュータ上で実行されるように展開され得る。
【００９８】
本明細書に記載されるプロセスおよび論理フローは、入力データ上で動作し出力を生成することにより機能を実行するよう１つ以上のプログラマブルコンピュータが１つ以上のコンピュータプログラムを実行することによって実行され得る。本プロセスおよび論理フローは、たとえばＦＰＧＡもしくはＡＳＩＣといった特殊目的論理回路系によっても、または特殊目的論理回路計と１つ以上のプログラムされたコンピュータとの組み合わせによっても実行され得る。
【００９９】
コンピュータプログラムの実行に好適であるコンピュータは、汎用マイクロプロセッサもしくは特殊目的マイクロプロセッサもしくはその両方または任意の種類の中央処理ユニットに基づき得る。一般に、中央処理ユニットは、リードオンリメモリもしくはランダムアクセスメモリまたはその両方から命令およびデータを受け取る。コンピュータの必須の要素は、命令を実行するための中央処理ユニットと、命令およびデータを格納するための１つ以上のメモリデバイスとである。中央処理ユニットおよびメモリは、特殊目的論理回路系によって補足され得るか、または特殊目的論理回路に組み込まれ得る。一般に、コンピュータはさらに、たとえば磁気ディスク、光磁気ディスクまたは光ディスクといった、データを格納するための１つ以上の大容量記憶装置を含むか、当該１つ以上の大容量記憶装置からデータを受け取るかもしくは当該１つ以上の大容量記憶装置にデータを転送するよう動作可能に結合されるか、またはその両方を行う。しかしながら、コンピュータはそのような装置を有する必要はない。さらに、コンピュータはたとえば、携帯電話、携帯情報端末（ＰＤＡ）、モバイルオーディオまたはビデオプレーヤ、ゲームコンソール、全地球測位システム（ＧＰＳ）受信機、またはポータブル記憶装置（たとえばユニバーサルシリアルバス（ＵＳＢ）フラッシュドライブ）といった別のデバイスに埋め込まれ得る。
【０１００】
コンピュータプログラム命令およびデータを格納するのに好適であるコンピュータ可読媒体は、例として、たとえばＥＰＲＯＭ、ＥＥＰＲＯＭおよびフラッシュメモリデバイスといった半導体メモリデバイスを含むすべての形態の不揮発性メモリ、媒体およびメモリデバイス；たとえば内部ハードディスクまたはリムーバブルディスクといった磁気ディスク；光磁気ディスク；ならびにＣＤ−ＲＯＭおよびＤＶＤ−ＲＯＭディスクを含む。
【０１０１】
ユーザとの対話を与えるために、本明細書に記載される主題の実施形態は、たとえばＣＲＴ（陰極線管）またはＬＣＤ（液晶ディスプレイ）モニタといったユーザに対して情報を表示するための表示デバイスと、たとえばマウス、トラックボールといったユーザがコンピュータに入力を与えることができるキーボードおよびポインティングデバイスとを有するコンピュータ上で実現され得る。他の種類のデバイスが、同様に、ユーザとの対話を与えるために用いられ得；たとえば、ユーザに提供されるフィードバックは、たとえば視覚フィードバック、聴覚フィードバックまたは触覚フィードバックといった任意の形態の感覚フィードバックであり得；ユーザからの入力は、音響入力、音声入力、または触覚入力を含む任意の形態で受け取られ得る。加えて、コンピュータは、ユーザが使用するデバイスにドキュメントを送信しユーザが使用するデバイスからドキュメントを受信することによって、たとえば、ウェブブラウザから受信された要求に応答してユーザのデバイス上のウェブブラウザにウェブページを送信することによって、ユーザと対話し得る。また、コンピュータは、テキストメッセージまたは他の形式のメッセージを個人用デバイス、たとえばスマートフォンなどに送信し、メッセージングアプリケーションを実行し、ユーザから応答メッセージを受信することにより、ユーザと対話できる。
【０１０２】
本明細書に記載される主題の実施形態は、たとえばデータサーバとしてバックエンドコンポーネントを含む計算システムにおいて実現され得るか、たとえばアプリケーションサーバといったミドルウェアコンポーネントを含む計算システムにおいて実現され得るか、たとえば本明細書に記載される主題の実現例とユーザが対話することが可能であるグラフィカルユーザインターフェイス、ウェブブラウザもしくはアプリを有するクライアントコンピュータといったフロントエンドコンポーネントを含む計算システムにおいて実現され得るか、または１つ以上のそのようなバックエンドコンポーネント、ミドルウェアコンポーネントもしくはフロントエンドコンポーネントの任意の組合せの計算システムにおいて実現され得る。システムのコンポーネントは、たとえば通信ネットワークといったデジタルデータ通信の任意の形態または媒体によって相互接続され得る。通信ネットワークの例は、ローカルエリアネットワーク（ＬＡＮ）およびワイドエリアネットワーク（ＷＡＮ）、たとえばインターネットを含む。
【０１０３】
計算システムはクライアントおよびサーバを含むことができる。クライアントとサーバとは一般に互いから遠隔にあり、典型的には通信ネットワークを通じて対話する。クライアントとサーバとの関係は、それぞれのコンピュータ上で実行されるとともに互いに対してクライアント−サーバ関係を有するコンピュータプログラムによって発生する。いくつかの実施形態では、サーバは、例えば、クライアントとして振る舞うユーザデバイスと対話するユーザにデータを表示し、およびそのユーザからユーザ入力を受信する目的で、データ、例えば、ＨＴＭＬページをユーザデバイスに送信する。ユーザデバイスで生成されたデータ、例えば、ユーザ対話の結果は、ユーザデバイスからサーバで受信することができる。
【０１０４】
実施形態１は、セルのシストリックアレイとして実装される行列乗算ユニットであって、セルのシストリックアレイの各セルは、転置されたまたは転置されない重みシフトレジスタから重み入力を受け取るように構成される重み行列レジスタと、重み行列レジスタに格納されるよう水平方向から重み入力を受け取るように構成される転置された重みシフトレジスタと、重み行列レジスタに格納されるよう垂直方向から重み入力を受け取るように構成される転置されない重みシフトレジスタと、重み行列レジスタに結合され、乗算結果を得るために重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを含む。
【０１０５】
実施形態２は実施形態１の行列乗算ユニットであって、各セルはさらに、転置された重みシフトレジスタの重み入力と転置されない重みシフトレジスタとの間で選択を行い、選択された重み入力を重み行列レジスタに転送するように構成されるマルチプレクサを備える。
【０１０６】
実施形態３は、転置された重みシフトレジスタまたは転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第１の重み保持レジスタをさらに備える、実施形態１または２の行列乗算ユニットである。
【０１０７】
実施形態４は、転置された重みシフトレジスタまたは転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第２の重み保持レジスタをさらに備える、実施形態１〜３のいずれか１つの行列乗算ユニットである。
【０１０８】
実施形態５は実施形態１〜４のいずれか１つの行列乗算ユニットであって、ある重み値が転置された重みシフトレジスタから第１の重み保持レジスタにロードされ、ある重み値が垂直方向から第２の重み保持レジスタにロードされる。
【０１０９】
実施形態６は実施形態１〜５のいずれか１つの行列乗算ユニットであって、重み行列レジスタには、第１の重み保持レジスタまたは第２の重み保持レジスタから値がロードされる。
【０１１０】
実施形態７はシストリックアレイとして実装される行列乗算ユニットであって、シストリックアレイの列に配置された複数のセルと、シストリックアレイの列ごとに設けられる重みシフトレジスタの２つのチェーンとを備え、各重みシフトレジスタは１つのチェーンのみに接続され、各セルは１つの重みシフトレジスタのみに接続され、行列乗算ユニットはさらに、セルごとに設けられ、重みシフトレジスタから受け取られる重み入力を格納するように構成された重み行列レジスタと、重み行列レジスタに結合され、乗算結果を得るために重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを備える。
【０１１１】
実施形態８は、実施形態７の行列乗算ユニットであり、重み値は、重み値の対を含むベクトルレジスタから重みシフトレジスタの２つのチェーンで送られる。
【０１１２】
実施形態９は、ベクトルレジスタから２つの重み値が利用可能でない場合に重み値を保持するために各列の上部に保持レジスタをさらに備える、実施形態７または８の行列乗算ユニットである。
【０１１３】
実施形態１０は、実施形態７〜９のいずれか１つの行列乗算ユニットであり、２つの重み値が利用可能な場合、２つの重み値はクロックサイクルでセル内の重みシフトレジスタにシフトされる。
【０１１４】
実施形態１１は、実施形態７〜１０のいずれか１つの行列乗算ユニットであって、２つの重み値が利用可能でない場合、第１の重み値が利用可能な第１のクロックサイクルで、保持レジスタに、第１の重み値が、保持される値としてロードされ、シフトは行われず、次のクロックサイクルで、第２の重み値が利用可能な場合、第２の重み値と保持された値とは、２つのシフトチェーンによって、１つの値が各シフトチェーンによりシフトされて、シフトチェーンに接続された重みシフトレジスタにシフトされる。
【０１１５】
実施形態１２は、各シフトチェーンは、重み値を注入するための２つの注入ポイントを有し、一方のポイントは列の上部にあり、他方のポイントは列の第２のポイントにある、実施形態７〜１１のいずれか１つの行列乗算ユニットである。
【０１１６】
実施形態１３は、各々別々の重み値を表す４つの８ビット整数のパックされたセットを含むベクトルレジスタをさらに備える、実施形態７〜１２のいずれか１つの行列乗算ユニットである。
【０１１７】
実施形態１４は、列の上部に４つの整数のうちの２つを注入し、アレイの第２のポイントに４つの整数の他の２つを注入することをさらに含む、実施形態７〜１３のいずれか１つの行列乗算ユニットである。
【０１１８】
本明細書は多くの特定の実現例の詳細を含んでいるが、これらは如何なる発明の範囲または請求され得るものの範囲に対する限定としても解釈されるべきではなく、特定の発明の特定の実施形態に特有の特徴であり得る記載として解釈されるべきである。別個の実施形態の文脈で本明細書において記載されるある特徴は、単一の実施形態において組合せでも実現され得る。反対に、単一の実施形態の文脈において記載されるさまざまな特徴は、複数の実施形態において別々に、または任意の好適な部分的組合わせでも実現され得る。さらに、特徴は、ある組合せにおいて作用すると上で記載され、最初はそのように請求されていさえする場合もあるが、請求される組合せからの１つ以上の特徴はいくつかの場合には当該組合せから削除され得、請求される組合せは、部分的組合わせまたは部分的組合わせの変形例に向けられ得る。
【０１１９】
同様に、動作が図においては特定の順に示されているが、そのような動作は、望ましい結果を達成するために、示された当該特定の順もしくは連続した順で実行される必要があると理解されるべきではなく、または、すべての示された動作が実行される必要があると理解されるべきではない。ある状況においては、マルチタスキングおよび並列処理が有利であり得る。さらに、上述の実施形態におけるさまざまなシステムモジュールおよびコンポーネントの分離は、すべての実施形態においてそのような分離を必要とすると理解されるべきではなく、記載されるプログラムコンポーネントおよびシステムは一般に単一のソフトウェア製品に統合され得るかまたは複数のソフトウェア製品にパッケージ化され得ることが理解されるべきである。
【０１２０】
主題の特定の実施形態が記載された。他の実施形態は以下の請求の範囲内にある。たとえば、請求項において記載されるアクションは、異なる順で実行され得、それでも望ましい結果を達成し得る。一例として、添付の図において示されるプロセスは、望ましい結果を達成するために、示された特定の順または連続する順であることを必ずしも必要としない。ある場合においては、マルチタスキングおよび並列処理が有利であり得る。
【図１Ａ】
0006929958.tif 000002
【図１Ｂ】
0006929958.tif 000003
【図１Ｃ】
0006929958.tif 000004
【図２】
0006929958.tif 000005
【図３】
0006929958.tif 000006
【図４】
0006929958.tif 000007
【図５】
0006929958.tif 000008
【図６】
0006929958.tif 000009
【図７】
0006929958.tif 000010
【図８】
0006929958.tif 000011