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