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

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

▶ グーグル インコーポレイテッドの特許一覧

<>
  • 特許-低レイテンシ行列乗算ユニット 図1A
  • 特許-低レイテンシ行列乗算ユニット 図1B
  • 特許-低レイテンシ行列乗算ユニット 図1C
  • 特許-低レイテンシ行列乗算ユニット 図2
  • 特許-低レイテンシ行列乗算ユニット 図3
  • 特許-低レイテンシ行列乗算ユニット 図4
  • 特許-低レイテンシ行列乗算ユニット 図5
  • 特許-低レイテンシ行列乗算ユニット 図6
  • 特許-低レイテンシ行列乗算ユニット 図7
  • 特許-低レイテンシ行列乗算ユニット 図8
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-02-27
(45)【発行日】2024-03-06
(54)【発明の名称】低レイテンシ行列乗算ユニット
(51)【国際特許分類】
   G06F 17/16 20060101AFI20240228BHJP
【FI】
G06F17/16 K
【請求項の数】 20
【外国語出願】
(21)【出願番号】P 2022138332
(22)【出願日】2022-08-31
(62)【分割の表示】P 2021131278の分割
【原出願日】2018-05-17
(65)【公開番号】P2022172257
(43)【公開日】2022-11-15
【審査請求日】2022-09-28
(31)【優先権主張番号】62/507,766
(32)【優先日】2017-05-17
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】502208397
【氏名又は名称】グーグル エルエルシー
【氏名又は名称原語表記】Google LLC
【住所又は居所原語表記】1600 Amphitheatre Parkway 94043 Mountain View, CA U.S.A.
(74)【代理人】
【識別番号】110001195
【氏名又は名称】弁理士法人深見特許事務所
(72)【発明者】
【氏名】フェルプス,アンドリュー・エバレット
(72)【発明者】
【氏名】ジョピー,ノーマン・ポール
【審査官】三坂 敏夫
(56)【参考文献】
【文献】米国特許出願公開第2016/0342892(US,A1)
【文献】特開平03-131965(JP,A)
【文献】特表2013-511891(JP,A)
【文献】加藤 英樹 他,高並列ニューロコンピュータ,FUJITSU 1991-5月号,富士通株式会社,1991年05月10日,第42巻 第3号,第213頁-221頁
【文献】KHAN, Emdadur R. et al.,Two-Dimensional Multirate Systolic Array Design for Artificial Neural Networks,Published in: [1991] Proceedings. First Great Lakes Symposium on VLSI,米国,IEEE,1991年03月02日,pages:186-193
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/00-17/18
(57)【特許請求の範囲】
【請求項1】
行列乗算ユニットのアレイに配置された複数のセルのうちのセルであって、前記セルは、
複数の重み格納レジスタから重み入力を受け取るように構成される重み行列レジスタを備え、前記複数の重み格納レジスタの各々は、前記アレイのそれぞれの方向からそれぞれの重み入力を受け取るように構成され、前記それぞれの方向は、前記アレイの第1の方向と、前記第1の方向とは異なる前記アレイの第2の方向とを含み、前記セルはさらに、
前記重み行列レジスタから前記重み入力を受け取り、前記受け取られた重み入力と別の入力データとに基づいた乗算結果を生成するように構成される乗算ユニットを備える、セル。
【請求項2】
前記別の入力データはベクトルデータ入力を含み、前記乗算結果は複数のニューラルネットワーク計算の一部である、請求項1に記載のセル。
【請求項3】
前記乗算ユニットは、前記重み行列レジスタから別の重み入力を受け取り、前記受け取られた別の重み入力を別のベクトルデータ入力で乗算して別の乗算結果を生成するように構成され、前記別の乗算結果は、前記複数のニューラルネットワーク計算のうちの別の部分である、請求項2に記載のセル。
【請求項4】
前記アレイは、セルのシストリックアレイである、請求項1~3のいずれか1項に記載のセル。
【請求項5】
前記アレイは2次元フォーマットを有し、
前記アレイの前記第1の方向は、前記2次元フォーマットにおける前記第1の方向であり、
前記アレイの前記第2の方向は、前記2次元フォーマットにおける前記第2の方向である、請求項1~4のいずれか1項に記載のセル。
【請求項6】
マルチプレクサをさらに備え、前記マルチプレクサは、
対応する重み格納レジスタに各々格納される少なくとも2つのそれぞれの重み入力から前記重み入力を選択し、
前記選択された重み入力を前記重み行列レジスタに送るように構成される、請求項1~5のいずれか1項に記載のセル。
【請求項7】
前記複数の重み格納レジスタは、転置された重みシフトレジスタと、前記転置された重みシフトレジスタとは別の、転置されない重みシフトレジスタとを含む、請求項1~6のいずれか1項に記載のセル。
【請求項8】
前記複数の重み格納レジスタは、
前記第1の方向に沿った前記複数のセルのうちの第1のセルから第1の有線経路を介して第1の重み入力を受け取るように構成される第1の重み格納レジスタと、
前記第2の方向に沿った前記複数のセルのうちの第2のセルから第2の有線経路を介して第2の重み入力を受け取るように構成される第2の重み格納レジスタとを含み、
前記重み入力は、前記第1の重み入力および前記第2の重み入力のうちの1つである、請求項1~7のいずれか1項に記載のセル。
【請求項9】
方法であって、
行列乗算ユニットのアレイに配置された複数のセルのうちのセルの重み行列レジスタが、複数の重み格納レジスタから重み入力を受け取ることを含み、前記複数の重み格納レジスタの各々は、前記アレイのそれぞれの方向からそれぞれの重み入力を受け取るように構成され、前記それぞれの方向は、前記アレイの第1の方向と、前記第1の方向とは異なる前記アレイの第2の方向とを含み、前記方法はさらに、
前記重み行列レジスタに結合された乗算ユニットが、前記受け取られた重み入力と別の入力データとに基づいた乗算結果を得ることを含む、方法。
【請求項10】
前記別の入力データはベクトルデータ入力を含み、前記乗算結果は複数のニューラルネットワーク計算の一部である、請求項9に記載の方法。
【請求項11】
前記方法はさらに、
前記乗算ユニットが、前記重み行列レジスタから別の重み入力を受け取ることと、
前記乗算ユニットが、前記受け取られた別の重み入力を別のベクトルデータ入力で乗算して別の乗算結果を生成することとを含み、前記別の乗算結果は、前記複数のニューラルネットワーク計算のうちの別の部分である、請求項10に記載の方法。
【請求項12】
前記アレイは、セルのシストリックアレイである、請求項9~11のいずれか1項に記載の方法。
【請求項13】
前記アレイは2次元フォーマットを有し、
前記アレイの前記第1の方向は、前記2次元フォーマットにおける前記第1の方向であり、
前記アレイの前記第2の方向は、前記2次元フォーマットにおける前記第2の方向である、請求項9~12のいずれか1項に記載の方法。
【請求項14】
前記方法はさらに、
マルチプレクサが、対応する重み格納レジスタに各々格納される少なくとも2つのそれぞれの重み入力から前記重み入力を選択することと、
前記重み行列レジスタが、前記マルチプレクサから前記選択された重み入力を受け取ることとを含む、請求項9~13のいずれか1項に記載の方法。
【請求項15】
前記複数の重み格納レジスタは、転置された重みシフトレジスタと、前記転置された重みシフトレジスタとは別の、転置されない重みシフトレジスタとを含む、請求項9~14のいずれか1項に記載の方法。
【請求項16】
前記複数の重み格納レジスタは、
前記第1の方向に沿った前記複数のセルのうちの第1のセルから第1の有線経路を介して第1の重み入力を受け取るように構成される第1の重み格納レジスタと、
前記第2の方向に沿った前記複数のセルのうちの第2のセルから第2の有線経路を介して第2の重み入力を受け取るように構成される第2の重み格納レジスタとを含み、
前記重み入力は、前記第1の重み入力および前記第2の重み入力のうちの1つである、請求項9~15のいずれか1項に記載の方法。
【請求項17】
少なくとも1つのプログラマブルプロセッサに動作を実行させるためのプログラムであって、前記動作は、
行列乗算ユニットのアレイに配置された複数のセルのうちのセルの重み行列レジスタが、複数の重み格納レジスタから重み入力を受け取ることを含み、前記複数の重み格納レジスタの各々は、前記アレイのそれぞれの方向からそれぞれの重み入力を受け取るように構成され、それぞれの方向は、前記アレイの第1の方向と、前記第1の方向とは異なる前記アレイの第2の方向とを含み、前記動作はさらに、
前記重み行列レジスタに結合された乗算ユニットが、前記受け取られた重み入力と別の入力データとに基づいた乗算結果を得ることを含む、プログラム。
【請求項18】
前記アレイは2次元フォーマットを有し、
前記アレイの前記第1の方向は、前記2次元フォーマットにおける前記第1の方向であり、
前記アレイの前記第2の方向は、前記2次元フォーマットにおける前記第2の方向である、請求項17に記載のプログラム。
【請求項19】
前記複数の重み格納レジスタは、転置された重みシフトレジスタと、前記転置された重みシフトレジスタとは別の、転置されない重みシフトレジスタとを含む、請求項17または18に記載のプログラム。
【請求項20】
前記複数の重み格納レジスタは、
前記第1の方向に沿った前記複数のセルのうちの第1のセルから第1の有線経路を介して第1の重み入力を受け取るように構成される第1の重み格納レジスタと、
前記第2の方向に沿った前記複数のセルのうちの第2のセルから第2の有線経路を介して第2の重み入力を受け取るように構成される第2の重み格納レジスタとを含み、
前記重み入力は、前記第1の重み入力および前記第2の重み入力のうちの1つである、請求項17~19のいずれか1項に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
背景
この明細書は、ハードウェアでのニューラルネットワーク計算の実行に関する。
【背景技術】
【0002】
ニューラルネットワークは機械学習モデルであり、モデルの1つ以上の層を用いて、受信した入力に対する出力、たとえば分類などを生成する。一部のニューラルネットワークには、出力層に加えて1つ以上の隠れ層が含まれる。各隠れ層の出力は、ネットワーク内の次の層、つまりネットワークの次の隠れ層または出力層への入力として用いられる。ネットワークの各層は、それぞれのパラメータのセットの現在の値に従って、受信した入力から出力を生成する。
【発明の概要】
【0003】
概要
この明細書では、ニューラルネットワークのトレーニング、ニューラルネットワークの推論の計算、またはその両方を行う専用ハードウェア回路、および特に重み値が行列乗算ユニット内の重み行列レジスタにロードされる速度を増大させることによって行列乗算ユニット全体のレイテンシを低減する専用ハードウェア回路に関する技術について記載する。
【発明が解決しようとする課題】
【0004】
シストリックアレイは、行列乗算を実行するよう配線され、通常、アレイ全体を通して均一な構造を有する。シストリックアレイの行列乗算ユニットは、積和サブユニットで構成され、各サブユニットは、入力オペランドを取り、そのオペランドに格納された重みを乗算して結果を得、その結果を部分和に加算して新たな部分和を生成する。
【0005】
レイテンシを短縮する1つの方法は、重みを積和ユニットにロードする速度を増大させ
ることである。
【0006】
一般に、本明細書で説明する主題の革新的な一局面は、ニューラルネットワークのトレーニング、ニューラルネットワークの推論の計算、またはその両方を行う専用ハードウェア回路で実現できる。
【0007】
この態様の他の実施形態は、各々、方法のアクションを実行するように構成された、対応するコンピュータシステム、装置、および1つ以上のコンピュータ記憶装置に記録されたコンピュータプログラムを含む。1つ以上のコンピュータのシステムが特定の操作またはアクションを実行するように構成されているとは、動作中にそのシステムにそのような操作またはアクションを実行させるソフトウェア、ファームウェア、ハードウェア、またはそれらの組み合わせがそのシステムにインストールされていることを意味する。1つ以上のコンピュータプログラムが特定の操作またはアクションを実行するように構成されるとは、1つ以上のプログラムが、データ処理装置によって実行されると、データ処理装置にそのような操作またはアクションを実行させる命令を含むことを意味する。
【0008】
前述の実施形態および他の実施形態は各々、以下の特徴のうちの1つ以上を単独でまたは組み合わせて任意選択で含むことができる。特に、一実施形態は、以下の特徴をすべて組み合わせて含む。
【課題を解決するための手段】
【0009】
行列乗算ユニットはセルのシストリックアレイとして実装されてもよい。セルのシストリックアレイの各セルは、転置されたまたは転置されない重みシフトレジスタから重み入力を受け取るように構成される重み行列レジスタと、重み行列レジスタに格納されるよう水平方向から重み入力を受け取るように構成される転置された重みシフトレジスタと、重み行列レジスタに格納されるよう垂直方向から重み入力を受け取るように構成される転置されない重みシフトレジスタと、重み行列レジスタに結合され、乗算結果を得るために重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを備えてもよい。各セルは、転置された重みシフトレジスタの重み入力と転置されない重みシフトレジスタとの間で選択を行い、選択された重み入力を重み行列レジスタに転送するように構成されるマルチプレクサを備えてもよい。
【0010】
行列乗算ユニットは、転置された重みシフトレジスタまたは転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第1の重み保持レジスタを備えてもよい。
【0011】
行列乗算ユニットは、転置された重みシフトレジスタまたは転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第2の重み保持レジスタを備えてもよい。
【0012】
重み値は、行列乗算ユニットに、転置された重みシフトレジスタから、水平方向に、第1の重み保持レジスタへ、および転置されない重みシフトレジスタから、垂直方向に、第2の重み保持レジスタへロードされてもよい。
【0013】
重み行列レジスタには、第1の重み保持レジスタまたは第2の重み保持レジスタから値がロードされてもよい。
【0014】
別の実施形態では、シストリックアレイとして実施される行列乗算ユニットは、シストリックアレイの列に配置された複数のセルと、シストリックアレイの列ごとに設けられる重みシフトレジスタの2つのチェーンと、セルごとに設けられ、重みシフトレジスタから受け取られる重み入力を格納するように構成された重み行列レジスタと、重み行列レジスタに結合され、乗算結果を得るために重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを備えてもよい。各重みシフトレジスタは1つのチェーンのみに接続され、各セルは1つの重みシフトレジスタのみに接続される。
【0015】
重み値は、重み値の対を含むベクトルレジスタから重みシフトレジスタの2つのチェーンで送られてもよい。
【0016】
2つの重み値がベクトルレジスタから利用可能でない場合、各列の上部にある保持レジスタが重み値を保持してもよい。
【0017】
2つの重み値が利用可能な場合、2つの重み値はクロックサイクルでセル内の重みシフトレジスタにシフトされる。
【0018】
2つの重み値が利用可能でない場合、第1の重み値が利用可能な第1のクロックサイクルで、保持レジスタに、第1の重み値が、保持される値としてロードされ、シフトは行われない。次のクロックサイクルで、第2の重み値が利用可能になると、第2の重み値と保持された値とが2つのシフトチェーンによってシフトされる。1つの値が、各シフトチェーンによって、シフトチェーンに接続された重みシフトレジスタにシフトされる。
【0019】
各シフトチェーンは、重み値を注入するための2つの注入ポイントを有し、一方のポイントは列の上部にあり、他方のポイントは列の第2のポイントにあってもよい。ベクトルレジスタが、各々が別々の重み値を表す4つの8ビット整数のパックされたセットを含んでもよい。4つの整数のうちの2つが列の上部に注入され、4つの整数の他の2つがアレイの第2のポイントに注入されてもよい。
【0020】
この明細書において記載される主題は、以下の利点の1つ以上を実現するように特定の実施の形態において実現することができる。シストリックアレイの列ごとに重みシフトレジスタのチェーンが2つある行列乗算ユニットは、ベクトルレジスタからの速度が、重みシフトレジスタのチェーンが1つだけの行列乗算ユニットの2倍で、重みを行列乗算ユニットに運ぶことができる。さらに、アレイ内の2つのポイント、つまりアレイの上部と中間ポイントとに重み値を送る、列ごとに重みシフトレジスタのチェーンが2つある行列乗算ユニットは、ベクトルレジスタからの速度が、重みシフトレジスタのチェーンが1つだけの行列乗算ユニットの4倍で、重みを行列乗算ユニットに運ぶことができる。
【0021】
追加的または代替的に、行列乗算ユニットは、転置されない重みシフトレジスタと転置された重みシフトレジスタとを各々が含むセルを有することができる。行列乗算ユニットは、その場合、垂直および水平方向の重みシフトチェーンに別々のレジスタを使用でき、その結果、行列乗算ユニットは、2つの重みシフトチェーンに別々のレジスタを有さない行列乗算ユニットの速度の2倍で、重み値をロードできる。
【0022】
これらの重みシフトロード方法を組み合わせて、列ごとに重みシフトレジスタのチェーンが2つなく、垂直および水平方向の重みシフトチェーン用に別々のレジスタがない行列乗算ユニットから、ロード時間における増大を8倍得ることができる。これらの重みシフトチェーンおよび/または別々のレジスタは、行列乗算ユニットの複雑さやフットプリントを大幅に増加させることなく、行列乗算ユニットに追加できる。
【0023】
この明細書の主題の1つ以上の実施形態の詳細は、添付の図面および以下の詳細な説明において述べられる。主題の他の特徴、局面および利点は、詳細な説明、図面および特許請求の範囲から明らかになる。
【図面の簡単な説明】
【0024】
図1A】ニューラルネットワークをトレーニングするための例示的な専用ハードウェアチップのハイレベル図を示す。
図1B】コンピュートコアのハイレベルの例を示す。
図1C】例示的なニューラルネットワーク処理システムを示す。
図2】行列乗算ユニットを含む例示的なコアアーキテクチャを示し、各行列乗算ユニットは、2次元のシストリックアレイである。
図3】シストリックアレイ内のマルチセルの例示的アーキテクチャを示す。
図4】重み値のロード速度を高めるために、列ごとに2つのチェーンの重みシフトレジスタを有する行列乗算ユニットのアーキテクチャの例を示す。
図5】所与のマルチセルの列に重み値をロードするための例示的な方法の流れ図である。
図6】重み値のロード速度を高めるために、列ごとに2つのチェーンの重みシフトレジスタを有し、列ごとに2つのポイントで重み値を送る、行列乗算ユニットのアーキテクチャの例を示す。
図7】重み値のロード速度を高めるために、水平方向の重みシフトおよび垂直方向の重みシフトのための別個のレジスタを有する行列乗算ユニットのアーキテクチャの例を示す。
図8】重み値のロード速度を高めるために保持レジスタのセットを有する例示的なセルを示す。
【発明を実施するための形態】
【0025】
さまざまな図面の同様の参照番号および名称は、同様の要素を示す。
詳細な説明
複数の層を有するニューラルネットワークをトレーニングし、それを推論の計算に用いることができる。たとえば、ニューラルネットワークは、ある値で各々初期化されるパラメータを有する。トレーニング中、ニューラルネットワークは、ニューラルネットワークのトレーニング手順を実行して、ニューラルネットワークのパラメータの値を調整して、たとえば、逆伝播を用いてパラメータの初期値からパラメータのトレーニングを経た値を判断する。トレーニングされたニューラルネットワークは、推論を計算でき、つまり、ニューラルネットワークの層を介して入力を処理し、その入力に対するニューラルネットワーク出力を生成できる。
【0026】
たとえば、入力が与えられると、ニューラルネットワークはその入力に対する推論を計算することができる。ニューラルネットワークは、ニューラルネットワークの各層を通して入力を処理することによって、この推論を計算する。いくつかの実装形態では、ニューラルネットワークの層はシーケンスで配置される。
【0027】
したがって、受け取った入力から推論を計算するために、ニューラルネットワークはその入力を受け取り、それを各ニューラルネットワーク層を通してシーケンスで処理して推論を生成し、1つのニューラルネットワーク層からの出力が次のニューラルネットワーク層への入力として与えられる。ニューラルネットワーク層へのデータ入力、たとえば、ニューラルネットワークへの入力、またはシーケンス内におけるその層の下の層の、あるニューラルネットワーク層への出力は、その層への活性化入力と呼ぶことができる。
【0028】
いくつかの実装形態では、ニューラルネットワークの層は有向グラフで配置される。つまり、任意の特定の層が複数の入力、複数の出力、またはそれらの両方を受け取ることができる。ニューラルネットワークの層は、ある層の出力を前の層への入力として送り返すことができるように構成することもできる。
【0029】
図1Aは、ニューラルネットワークをトレーニングするための例示的な専用ハードウェアチップのハイレベル図を示す。図示されているように、単一の専用ハードウェアチップは2つの独立したプロセッサ、たとえば102a、102bを含む。各プロセッサ102a、102bには、2つの異なるコア:(1)コンピュートコア、つまり非常に長い命令語(VLIW)マシン(103a、103b)、および(2)疎計算コア、つまり埋め込み層アクセラレータ(105a、105b)が含まれる。
【0030】
各コンピュートコア、たとえば103aおよび103bは、密線形代数問題用に最適化される。各コンピュートコアは、単一の非常に長い命令語によって制御される。各コンピュートコアは、非常に長い命令語命令の、それ自身のストリームを実行する。
【0031】
例示的な疎計算コア、たとえば105aまたは105bは、非常に疎である高次元データを密な低次元データにマッピングし、残りの層が密に充填された入力データを処理するようにする。たとえば、疎計算コアは、トレーニング中のニューラルネットワークの埋め込み層の計算を実行できる。
【0032】
この疎から密へのマッピングを実行するために、疎計算コアは、埋め込みテーブルである、予め構築されたルックアップテーブルを用いる。たとえば、ユーザ入力として一連のクエリワードがある場合、各クエリワードはハッシュ識別子またはワンホットエンコード
されたベクトルに変換される。識別子をテーブルインデックスとして用いて、埋め込みテーブルは対応する密なベクトルを返し、それは、次の層への入力活性化ベクトルになることができる。疎計算コアは、検索クエリワードにわたって簡約操作を実行して、1つの密な活性化ベクトルを作成することもできる。疎計算コアは、協働して、効率的な疎の、分散されたルックアップを実行し、なぜならば、埋め込みテーブルが巨大であり得、専用ハードウェアチップの1つの限られた容量の高帯域幅メモリに収まらないためである。疎計算コア機能に関する詳細は、2016年2月5日に提出された「MATRIX PROCESSING APPARATUS(行列処理装置)」と題される米国特許出願第15/016,486号に見ること
ができる。
【0033】
図1Bは、コンピュートコア(101)のハイレベルの例を示す。コンピュートコアは、いくつかのコンピュートユニットを並列で制御するマシン、つまりVLIWマシンであることができる。各コンピュートコア(101)には、スカラーメモリ(104)、ベクトルメモリ(108)、スカラー処理ユニット(107)、ベクトルレジスタ(106)、および拡張ベクトルユニット(つまり、行列乗算ユニット(MXU)(113)と、転置ユニット(XU)(114)と、簡約および置換ユニット(RPU)(116))が含まれる。
【0034】
例示的なスカラープロセッサは、VLIW命令のフェッチ/実行ループを実行し、コンピュートコアを制御する。命令バンドルをフェッチしてデコードした後、スカラープロセッサ自体は、スカラープロセッサ(107)およびスカラーメモリ(104)の複数のマルチビットレジスタ、つまり32の32ビットレジスタを用いて、命令バンドルのスカラースロットにおいて見いだされる命令を実行するのみである。スカラー命令セットには、アドレス計算、ロード/ストア命令、分岐命令などで使用される通常の算術演算が含まれる。残りの命令スロットは、ベクトル処理ユニットまたは他の拡張ベクトルユニット(113、114、116)の命令をエンコードする。デコードされたベクトル命令は、ベクトル処理ユニットに転送される。
【0035】
ベクトル命令とともに、スカラープロセッサ(107)は、最大3つのスカラーレジスタの値を他のプロセッサおよびユニットに転送して、演算を実行できる。スカラープロセッサは、ベクトルプロセッサから計算結果を直接取得することもできる。ただし、一部の実装形態では、例示的なチップは、ベクトルプロセッサからスカラープロセッサへの低帯域幅通信パスを有する。
【0036】
ベクトル命令ディスパッチャは、スカラープロセッサとベクトルプロセッサとの間にある。このディスパッチャは、非スカラーVLIWスロットからデコードされた命令を受け取り、それらの命令をベクトル処理ユニットにブロードキャストする。ベクトル処理ユニットは、図1Cを参照して詳細に説明される。
【0037】
例示的なスカラープロセッサ(107)は、小さい、高速な、プライベートスカラーメモリ(104)にアクセスする。このメモリは、はるかにより大きく、低速な高帯域幅メモリ(HBM)(110)によってバックアップされる。同様に、例示的なベクトル処理ユニットは、小さい、高速な、プライベートベクトルメモリ(108)にアクセスする。このメモリも、HBM(110)によってバックアップされる。ワード粒度アクセスは、スカラープロセッサ(107)とスカラーメモリ(104)との間、またはベクトル処理ユニットとベクトルメモリ(108)との間で起こる。ベクトルプロセッサとベクトルメモリとの間のロードおよびストアの粒度は、128個の32ビットワードのベクトルである。ダイレクトメモリアクセスは、スカラーメモリ(104)とHBM(110)との間、およびベクトルメモリ(108)とHBM(110)との間で起こる。いくつかの実装形態では、HBM(110)から処理ユニット(107)へのメモリ転送は、スカラーメ
モリまたはベクトルメモリを介してのみ実行できる。さらに、スカラーメモリとベクトルメモリとの間でダイレクトメモリ転送が行われない場合がある。
【0038】
命令は、拡張ベクトルユニット演算を指定する場合がある。実行された各ベクトルユニット命令に加えて、各々が1つのレジスタ値を拡張ベクトルユニットに入力オペランドとして送ることができる2次元、つまり128×8のベクトルユニットがある。各拡張ベクトルユニットは、入力オペランドを受け取り、対応する演算を実行し、結果をベクトルプロセッサ(306)に返す。拡張ベクトルユニットは、図4を参照して以下に説明される。
【0039】
図1Cは、ニューラルネットワーク計算を実行するための例示的な専用集積回路100を示す。説明したように、チップには2つのコンピュートコア(103a、103b)と2つの疎計算コア(152a、152b)とが含まれる。
【0040】
チップは、ホストコンピュータへのホストインターフェイス(150)、下部に沿った高帯域幅メモリの4つのスタック(156a~156d)、およびインターフェイスとメモリとを接続するチップ間相互接続(148)、ならびに他のチップからのデータを含む共有領域を有する。高帯域幅メモリの2つのスタック(156a~156b、156c~156d)が各コンピュートコア(103a、103b)に関連付けられる。
【0041】
チップは、データを高帯域幅メモリ(156c~156d)に保存し、そのデータをベクトルメモリ(108)において読込および読出し、そのデータを処理する。コンピュートコア(103b)自体は、2次元に分割されたオンチップS-RAMであるベクトルメモリ(108)を含む。ベクトルメモリには、アドレスが浮動小数点数、つまり各々32ビットである128個の数値を保持するアドレス空間がある。コンピュートコア(103b)は、値を計算する計算ユニット、および計算ユニットを制御するスカラーユニットも含む。
【0042】
ベクトル処理ユニットは、ベクトル処理ユニットの2次元配列、すなわち128×8から成り、これらはすべて、同じ命令を単一命令複数データ(SIMD)方式で実行する。ベクトルプロセッサには、レーンとサブレーン、つまり128本のレーンおよび8本のサブレーンがある。レーン内において、ベクトルユニットはロード命令およびストア命令を介して互いに通信する。各ベクトルユニットは、一度に1つの4バイト値にアクセスできる。同じレーンに属さないベクトルユニットは直接通信できない。これらのベクトルユニットは、以下で説明する簡約/置換ユニットを用いる必要がある。
【0043】
計算ユニットは、ベクトル処理ユニット(106)において、浮動小数点演算および整数演算の両方に用いることができるベクトルレジスタ、つまり32個のベクトルレジスタを含む。計算ユニットは、計算を実行するための2つの算術論理ユニット(ALU)(126c~126d)を含む。一方のALU(126c)は浮動小数点加算を実行し、他方のALU(126d)は浮動小数点乗算を実行する。両方のALU(126c~126d)は、シフト、マスク、比較などの他のさまざまな演算を実行できる。たとえば、コンピュートコア(103b)は、ベクトルレジスタVと第2のベクトルレジスタVとを加算し、結果を第3のベクトルレジスタVに入れたい場合がある。この加算を計算するために、コンピュートコア(103b)は複数、つまり1024の演算を1クロックサイクルで実行する。これらのレジスタをオペランドとして用いて、各ベクトルユニットは、クロックサイクルごとに2つのALU命令、1つのロードおよび1つのストア命令を同時に実行できる。ロードまたはストア命令のベースアドレスは、スカラープロセッサで計算でき、ベクトルプロセッサに転送できる。各サブレーンにおけるベクトルユニットの各々は、ストライドや特別なインデックス付きアドレスレジスタなどのさまざまな方法を用いて
、それ自体のオフセットアドレスを計算できる。
【0044】
計算ユニットは、平方根や逆数などの演算を実行する拡張単項パイプライン(EUP)(116)も含む。コンピュートコア(103b)は、これらの演算を実行するのに3クロックサイクルかかり、なぜならば、一度に1つのオペランドを取り込むからである。EUP処理には1クロックサイクル以上かかるため、結果を保存する先入れ先出しのデータストレージがある。演算が終了すると、結果はFIFOに保存される。コンピュートコアは、後で別の命令を用いて、FIFOからデータを引き出し、それをベクトルレジスタに格納できる。乱数生成器(120)により、コンピュートコア(103b)はサイクルごとに乱数、つまりサイクルごとに128の乱数を生成できる。
【0045】
上に述べられるように、各プロセッサは3つの拡張ベクトルユニット、つまり、行列乗算演算を実行する行列乗算ユニット(113)と、行列、すなわち128×128の行列の転置演算を実行する転置ユニット(XU)(114)を含むクロスレーンユニット(XLU)と、図1Cにおいて別個のユニット、簡約ユニット115および置換ユニット116として示される簡約および置換ユニットとを有する。
【0046】
行列乗算ユニットは、2つの行列間で行列乗算を実行する。コンピュートコアは、乗算される行列である一連の数値を読み込む必要があるため、行列乗算ユニット(113)はデータを取り込む。図示されているように、データはベクトルレジスタ(106)から来る。各ベクトルレジスタには、ある数値、つまりある32ビットの数値が含まれる。しかしながら、データを行列乗算ユニット(113)に送って、数値をより小さなビットサイズ、つまり32ビットから16ビットに変更すると、浮動小数点変換が発生する場合がある。並直列変換器(130)は、ベクトルレジスタから数値が読み取られるときに、2次元配列つまり128×8の行列が128個の数値のセットとして読み取られ、次の8クロックサイクルの各々ごとに行列乗算ユニット(113)に送信されることを保証する。行列乗算がその計算を完了した後、結果は非直列化され(132a、132b)、これは、結果行列が、ある数のクロックサイクルの間保持されることを意味する。たとえば、128×8の配列の場合、128個の数値が8クロックサイクルの各々ごとに保持され、次いで適当なFIFO、例えば、転置結果FIFO(TRF)134または乗算結果FIFO(MRF)136にプッシュされ、128×8の数値の2次元配列を1クロックサイクルで取得して、ベクトル処理ユニット(106)に含まれるベクトルレジスタに格納できる。
【0047】
あるサイクル期間、すなわち128のサイクルからなる期間にわたって、重みが、行列を乗算する数値として行列乗算ユニット(113)にシフトされる。行列および重みがロードされると、コンピュートコア(103b)は、数値のセット、つまり128×8の数値のセットを行列乗算ユニット(113)に送ることができる。セットの各ラインに行列を乗算して、クロックサイクルごとにある数の結果、つまり128の結果を生成できる。コンピュートコアが行列乗算を実行している間、コンピュートコアは、前の行列の計算プロセスが完了したときに、コンピュートコアが乗算する次の行列が利用できるように、バックグラウンドにおいて次の行列になる新たな数値のセットのシフトも行う。行列乗算ユニット(113)は、乗算されるべき行列におけるデータである重み入力と、行列で乗算されるべきベクトルにおけるデータである左辺データ入力とを処理し、出力のベクトルをベクトル処理ユニットに与えることができる。ベクトル処理ユニットは、出力のベクトルを処理し、処理された出力のベクトルをベクトルメモリに格納することができる。たとえば、ベクトル処理ユニットは、非線形関数を行列乗算ユニットの出力に適用して、ベクトルデータ値を生成できる。いくつかの実装形態では、ベクトル処理ユニット106は、正規化された値、プールされた値、またはその両方を生成する。処理された出力のベクトルは、たとえばニューラルネットワーク内の後続の層で用いるために、行列乗算ユニット1
13への左辺データ入力として用いることができる。
【0048】
転置ユニットは、行列を転置する。転置論理ユニット(114)は、数値を取り込み、それらを転置して、レーンを横切る数値が他の次元の数値と転置されるようにする。一部の実装形態では、ベクトルプロセッサは128×8のベクトルユニットを含む。したがって、128×128の行列を転置するには、完全な行列転置のために16個の個別の転置命令が必要である。転置が終了すると、転置された行列が利用可能になる。ただし、転置された行列をベクトルレジスタファイルに移動するには、明示的な命令が必要である。
【0049】
簡約/置換ユニット(またはユニット115、116)は、置換、レーン回転、回転置換、レーン簡約、置換されたレーン簡約、およびセグメント化された置換されたレーン簡約などのさまざまな操作をサポートすることで、クロスレーン通信の問題に対処する。図示されているように、これらの計算は別々であるが、コンピュートコアは一方もしくは他方または一方に連鎖された他方を用いることができる。簡約ユニット(115)は、数値からなる各ラインを簡約し、それらの数値を置換ユニット(116)に供給する。置換ユニットは、異なるレーン間でデータを変更する。転置ユニット、簡約ユニット、置換ユニット、および行列乗算ユニットは、各々、完了までに1クロックサイクル以上かかる。したがって、各ユニットにはFIFOが関連付けられ、計算結果をFIFOにプッシュし、後で別の命令を実行して、データをFIFOからベクトルレジスタにプルできる。FIFOを用いることにより、コンピュートコアは、長々とした演算の間、複数のベクトルレジスタを予約する必要がない。図示されているように、各ユニットはベクトル処理ユニット(106)におけるベクトルレジスタからデータを取得する。
【0050】
コンピュートコアは、スカラーユニットを用いて計算ユニットを制御する。スカラーユニットには2つの主要な機能があり、それは、(1)ループカウントおよびアドレス指定を実行すること、ならびに(2)DMAコントローラがバックグラウンドにおいて高帯域幅メモリ(156c~156d)とベクトルメモリ(108)との間で、および次いで例示のシステムにおける他のチップへのチップ間接続(148)にデータを移動するよう、ダイレクトメモリアドレス(DMA)要求を生成することである。スカラーユニットは、命令メモリ(104)と、命令デコードおよび発行(102)と、スカラーレジスタすなわち32ビットを含むスカラー処理ユニット(107)と、スカラーメモリ(104)と、クロックサイクルごとに2つの演算を実行する2つのALU(126a、126b)とを含む。スカラーユニットは、オペランドと即値とをベクトル演算に渡すことができる。各命令は、ベクトル処理ユニット(106)においてベクトルレジスタで実行される命令を含む命令バンドルとして、命令デコードおよび発行(102)から送ることができる。各命令バンドルは非常に長い命令語(VLIW)であり、各命令はある数のビット幅であり、ある数の命令フィールドに分割される。
【0051】
図2は、行列乗算ユニット(MXU)201aおよび201bを含む例示的なコアアーキテクチャ200を示す。各MXUは2次元のシストリックアレイである。アレイは、行列乗算演算を実行するように配線される。MXUは、クロックサイクルごとに1つの乗算という一定のスループットで、128要素のベクトルをプリロードされた128×128の行列で乗算する。
【0052】
各MXUは、128の行および128の列を有する。MXUは、タイルと呼ばれる同一のブロックに分割できる。たとえば、MXUは32個のタイルに分割でき、各タイルには32行×16列が含まれる。各タイルは、さらに積和サブユニットセルに分割できる。各セルはベクトルデータ入力オペランドを取り、そのオペランドに格納された重みを乗算して結果を得、その結果を部分和に加算して新たな部分和を生成する。いくつかの実装形態では、サブユニットセルをより大きなマルチセル、つまり、2×2の積和サブユニットセ
ルのアレイまたはセーデキム(16)セルと呼ばれる4×4の積和サブユニットセルのアレイにグループ化できる。入力データを1つの積和サブユニットセルからクロックサイクルごとに1つの速度で次のセルに移動する代わりに、データはクロックサイクルごとに1つのマルチセルでシストリックアレイを移動できる。
【0053】
一連のベクトル行列乗算を開始する前に、行列をMXUにプリロードする必要がある。この行列のためのデータは「重み」データと呼ばれる。重み行列は、ソースバスを介して、MXUに接続されたバスによってMXUに送られ、重みシフトレジスタにシフトされる。次いで、重みシフトレジスタの内容が重み行列レジスタにロードされ、行列の乗算が開始できるようになる。この重みロードプロセスは、図3図8に関してより詳細に説明される。
【0054】
図2に示すように、各MXU、例えば113aおよび113bは、3つのバス、転置されない重み用の第1のソースバス(230a、230b)、転置された重み用の第2のソースバス(220a、220b)、およびMXUに格納されている行列で乗算されるベクトルデータ用の左辺バス(210a、210b)に接続される。MXUは、MXUのエッジに接続するワイヤによってバスに接続される。各転置ユニット(XU)、たとえば114aおよび114bも、第1のソースバスおよび第2のソースバスに接続される。
【0055】
第1および第2のソースバスは、XUまたはMXUで消費されるべくベクトル処理ユニットから送られるデータを含む多目的バスである。データ処理は、ベクトルレジスタ206、直列化処理ユニット202、および選択ユニット204を含むベクトル処理データパスで発生する。ベクトル処理ユニットがバスで重みを送る方法はいくつかある。重みは、通常の「ハイ(H)」または「ロー(L)」で送られてもよい。レーンごとに8つの32ビットの浮動小数点数(サブレーンごとに1つ)が、bfloatの16ビットの浮動小数点数に丸められる。これらの値は4つの対にパックされ、8サイクルのコースにわたって1サイクルおきにMXUに送られる。通常の「H」と「L」との違いは、ベクトル処理ユニットが浮動小数点の32からbfloatへの変換を行う方法である。重みがパックされる場合がある、とは、レーンごとの8つの32ビット値の各々に、パックされたbfloatの対が含まれることを意味する。8つの連続したサイクルの間に各サイクルでソースバスを使用して、8つではなく16の値がMXUに送られる。奇数サイクルでは、各サブレーンの下位16ビットがMXUに送られ、偶数サイクルでは、各サブレーンの上位16ビットが送られる。重みは、追加または代替としてバイト単位で送られてもよい。各32ビットオペランドには、4つの8ビット符号付き2の補数整数のパックされたセットが含まれる。各バイトは、修正された符号絶対値に変換される。これらの値は、連続する8サイクルにわたってソースバスによってMXUに送られる。
【0056】
重みは、第1または第2のソースバスを用いて転置されないまたは転置された命令として送られ、重みシフトレジスタにシフトされてもよい。ロード操作でトリガされると、以下に説明するように、重みシフトレジスタの内容は重み行列レジスタにロードされる。重みシフトレジスタから重み行列レジスタへのロードパスは、修正された符号絶対値からbfloatへの変換がバイトモードデータで行われる場所でもある。ロード制御バスは、この変換を実行するかどうかを示す。
【0057】
実行中の命令に応じて、ソースバスからの32ビット値には、ビット[15:0]の値が(時間において)より早い値を表す16ビット浮動小数点値のパックされた対、またはビット[7:0]の値が(時間において)より早い値を表し、他の値がシーケンスで後に続く、修正された符号絶対値形式の4つの8ビットの整数のパックされたセットが含まれてもよい。MXUがバスからデータを受け取ると、データ値はMXU全体に均等に、左側に値0、右側に値127で、拡散される。
【0058】
左辺(LHS)データバスは、接続されたMXUに格納される行列で乗算されるよう、128個の16ビット浮動小数点数を特定の形式、たとえば、bfloatで運ぶ。LHSデータバスのデータは、ベクトル処理ユニットから来て、転置ユニット、例えば、114aおよび114bを通過する。LHS入力がMXUに到着すると、値はMXU全体に均等に、左側に値0、右側に値127で、拡散される。
【0059】
行列乗算の結果は、MXU全体に均等に拡散され、MXUから行列結果FIFO(MRF)、たとえば136aおよび136bに送られる。XUからの結果は、対応する転置結果FIFO(TRF)、たとえば134aおよび134bに送られる。
【0060】
図3は、行列乗算ユニット内のマルチセルの例示的なアーキテクチャを示す。上記で説明したように、行列乗算ユニットは2次元のシストリックアレイである。アレイは、マルチセルにグループ化できる複数の積和サブユニットを含む。いくつかの実装形態では、シストリックアレイの第1の次元はセルの列に対応し、シストリックアレイの第2の次元はセルの行に対応する。シストリックアレイは、列よりも行が多くてもよく、行よりも列が多くてもよく、または列と行とが同数であってもよい。この明細書では、列または垂直方向についての特定の処理について説明する。ただし、異なる設計で行または水平方向の処理を実行できる。
【0061】
図示された例では、左辺データレジスタ315a、315bは、アレイの行にベクトルデータ入力を送る。重みシフトチェーン301aおよび301bは、重み入力値をアレイの列に送り、重みシフトチェーン302aおよび302bは、重み入力値をアレイの行に送る。シフトチェーンは、たとえばメモリから行列乗算ユニット内のさまざまなレジスタの各々に値を渡すことができる有線経路である。
【0062】
各重みシフトレジスタ305は、その重み内容値をソースバスから重みシフトレジスタ305のチェーンに沿ってシフトするように設計される。データがシフトインされた後、並列コピー操作により、すべてのデータが重みシフトレジスタ305から対応する重み行列レジスタ325に確実にコピーされる。データが重み行列レジスタ325にあるとき、データは任意の数の乗算サイクルで用いられる。この間、次の乗算セットに備えて、より多くの重みをバックグラウンドで重みレジスタ305にシフトしてもよい(通常はシフトされる)。
【0063】
左辺データレジスタ315a、315bは、ベクトルデータ入力を受け取ることができる。各左辺データレジスタは、1クロックサイクルについて各クロックサイクルで1つのLHSデータ項目を保持する。マルチセルによって受け取られる各ベクトルデータ入力は、左辺データレジスタ315a、315bなど、マルチセルの対応する左辺レジスタ内を自由に流れてもよい。左辺データレジスタは、ベクトルレジスタによって、またはアレイ内の所与のマルチセルの位置に応じて、そのマルチセルの左にある隣接するマルチセルによって与えられ得るベクトルデータ入力を格納する。例えば、マルチセル300が行列乗算ユニットのシストリックアレイ内の最も左の位置にある場合、ベクトルデータ入力はベクトルレジスタによって与えられる。ベクトルレジスタは、複数の異なるベクトルデータ入力をマルチセル300に与えてもよく、各受け取られたベクトルデータ入力は、次いで、左辺データレジスタ315のうちの異なる1つによって格納されてもよい。各行は、マルチセルにグループ化される行の数に関係なく、クロックサイクルごとに1つの値を受け取る。
【0064】
各左辺レジスタは、マルチセルのアレイの第1の次元に沿ってセルに結合されてもよい。左辺レジスタのセルへの接続は、図3において点線で示される。例えば、マルチセル内
の左辺データレジスタ315a(ある左辺データレジスタ)は、第1の行のセル350aおよび350cに結合される。同様に、マルチセル内の左辺データレジスタ315b(第2の左辺レジスタ)は、第2の行のセル350bおよび350dに結合される。各左辺レジスタ315は、格納されたベクトルデータ入力を、左辺レジスタが結合されるセル350に転送する。したがって、第1の次元に沿って(たとえば、所与の行または所与の列に沿って)延びる所与の数のセルについて、単一のセルだけでなく、マルチセル内のすべてのセルにベクトルデータ入力を渡すことができ、これにより、ベクトルデータ入力がセルのアレイ全体に速く拡散し、マルチセルの動作の効率が向上する。
【0065】
複数のベクトルデータ入力を隣接する左辺レジスタに送って、複数のベクトルデータ入力をアレイの別のマルチセルで使用できるようにすることもできる。このプロセスにより、アレイの別の特定のマルチセルで使用するためにベクトルデータ入力をシフトできる。
【0066】
マルチセル300の各セル350は、格納された重み値を含む。行列乗算プロセスを開始する前に、重みをシストリックアレイのセルにシフトしてロードする。専用チェーンおよび重みシフトレジスタが重みシフト用に設けられ、前の行列乗算処理の実行と同時に新たな重みをシフトインできる。行列入力演算処理全体のレイテンシを短縮する方法で、重み入力をマルチセルにロードできる。
【0067】
上述のように、重みシフトチェーン301、302は、メモリユニット、例えば図1のベクトルメモリ108から重み入力を受け取ることができる。シフトチェーンは、複数の対応する重み入力を、マルチセル300に関連付けられた重み行列レジスタ325に送ることができる。
【0068】
いくつかの実装形態では、重みシフトレジスタは、ベクトルデータ入力をアレイ全体にわたって1つの次元に沿って、たとえば右にシフトし、重み入力をアレイ全体にわたって1つまたは両方の次元、たとえば右または下にシフトする。例えば、1クロックサイクルにわたって、マルチセル300における複数のベクトルデータ入力の各ベクトルデータ入力は、同じ行における次のマルチセルにおいて対応する左辺データレジスタにシフトできる。水平データ(左辺データ)および垂直データ(部分和)は、各々、クロックサイクルごとに、クロックサイクルにつき1マルチセルずつ移動する。重みは、システムによって指示された場合にのみシフトし、実装形態および実行される命令に応じて、1、2、もしくは4行(または列)シフトしてもよい。
【0069】
マルチプレクサ330は、第1のシフトチェーン301または第2のシフトチェーン302の重みシフトレジスタ305から重みを選択し、選択された入力を重み行列レジスタ325への単一のラインに転送する。マルチプレクサ330はセル350の境界線の外側に示されるが、いくつかの実装形態では、マルチプレクサ330はセル350内に存在する。
【0070】
あるクロックサイクルで、各マルチセルは複数の所与の重み入力および複数の所与のベクトルデータ入力を処理して、複数の累積出力を生成できる。一般に、処理には、ベクトルデータ入力に格納された重みを乗算する乗算演算が含まれる。累積出力は、所与の重み入力と同じ次元に沿って、下に、隣接するマルチセルに渡すこともできる。いくつかの実装形態では、1つの畳み込み計算から別の畳み込み計算に移行するために、重みが所与のクロックサイクル中に1より多いマルチセルをシフトされる。
【0071】
累積出力は、重み入力と同じ列に沿って、たとえばアレイ内の列の一番下に向かって渡すことができる。いくつかの実装形態では、部分和レジスタ310a、311aは、部分和値を前のマルチセルから当該のマルチセルに渡す。アレイは、マルチセルの各列から累
積出力を格納する部分和レジスタ310b、311bを含むことができる。マルチセルの各列について、列のサブユニットセルによって生成された積は、上のマルチセルからの入来部分和と結合され、次の部分和として送られる。特定のマルチセル、例えばシストリックアレイの一番下の列のマルチセルなどの場合、累積出力は、ベクトル計算ユニットに転送できる最終的な累積値を含んでもよい。いくつかの実装形態では、最終的な累積値はアレイの一番下のマルチセルからベクトル計算ユニットに直接転送されるが、他の実装形態では、最終的な累積値はまずメモリに保存されるか、または異なるコンポーネントによって処理されてからベクトル計算ユニットに送られる。
【0072】
図4は、重み値のロード速度を高めるために、マルチセルサブアレイの列ごとに重みシフトレジスタの2つのチェーンを備えた行列乗算ユニットのマルチセルのアーキテクチャの例を示す。図4に示すように、セル435aおよびセル435bはマルチセル400の1つの列を構成し、セル435cおよびセル435dはマルチセル400の第2の列を構成する。各列には、重みシフトレジスタのチェーンが2つある。所与の列の各セルは、その列の2つのチェーンのうちの1つのみから重み入力を受け取るように構成される。図4に示すように、1つのチェーン401は偶数行において重みシフトレジスタに接続し、1つのチェーン402は奇数行において重みシフトレジスタに接続する。各サイクルで、2つの新たな値が各列にシフトされ、既存のすべての重み値が2行下にシフトされる。したがって、重みは、シストリックアレイの列ごとに重みシフトレジスタの2つのチェーンを有さない行列乗算ユニットの2倍の速度でマルチセルにロードできる。
【0073】
図示されるように、重み値はベクトルレジスタ403からシフトインされる。一実装形態では、行列乗算ユニットの列ごとに1つのベクトルレジスタ403がある。図3の例では、ベクトルレジスタ403は行列乗算ユニットの上部に示されるが、ベクトルレジスタ403は、行列乗算ユニットに対して様々な位置、例えばユニットの底部に物理的に位置することができる。
【0074】
ベクトルレジスタ403は、行列乗算ユニットによって演算される値よりも何らかの大きさだけ大きいまたは小さいレジスタ値を保持することができる。たとえば、レジスタはnビット値を保持し、行列乗算ユニットはn/2ビット値で動作する。一部の実装形態では、各ベクトルレジスタは32ビット値を保持し、行列乗算ユニットは16ビット値で動作する。ある例示的な行列乗算ユニットは、レジスタの各32ビット値を16ビット値の対として処理するモードを有し、この対の1つの16ビット値は、第1の重みシフトチェーン401に送られ、この対の第2の16ビット値は、第2の重みシフトチェーン402に送られる。列ごとに1つのベクトルレジスタ403が示されるが、マルチセルごとにわずか1つのベクトルレジスタ403があってもよい。追加的または代替的に、各チェーンは、単一の16ビットの重み値をチェーンに与える別個のベクトルレジスタ303に接続されてもよい。この場合、ベクトルレジスタ403における32ビット浮動小数点値は16ビット値に変換される。
【0075】
ある実装形態では、重み値は、列ごとに2つのシフトチェーンがない状態で行列乗算ユニットの速度の2倍で値を送信するよう利用可能でない場合がある。この状況を処理するために、各垂直シフトチェーンに1つずつ、2つの重み値が利用可能になるまで、重み値を保持するよう、保持レジスタ445が各列の上部に配置される。1つの重み値のみが利用可能な最初のクロックサイクルで、利用可能な重み値は保持レジスタ445にコピーされる。新たな重み値が利用可能な次のクロックサイクルで、保持レジスタ内の重み値は1つの重みシフトチェーンによって保持レジスタから重みシフトレジスタにシフトされることになり、そのクロックサイクルで利用可能な新たな重み値は、第2の重みシフトチェーンによって第2の重みシフトレジスタにシフトされる。
【0076】
水平シフトチェーン405は、上述のようにセルに重み値を与えてもよい。いくつかの実装形態では、上記の垂直シフトチェーン401、402と同じ方法で重みロードレイテンシを減少させるように機能する2つの水平シフトチェーンがあり得る。
【0077】
マルチプレクサ430は、セル内の重み行列レジスタに送られる重み値が水平シフトチェーン405から来るか、または垂直シフトチェーン401bもしくは402bから来るかを判断する。重み値が重み行列レジスタにロードされ、左辺データレジスタ415がベクトルデータ入力を与えると、セル435で行列乗算を実行できる。
【0078】
図5は、重み値を所与のマルチセルの列にロードするための例示的なプロセス500の流れ図である。インターフェイスは、ベクトルレジスタから少なくとも1つの重み値を受け取る(501)。
【0079】
インターフェイスは、複数の重み値が利用可能かどうかを判断する(502)。
複数の重み値が利用可能な場合、インターフェイスは、重み値を、シフトチェーンによって、クロックサイクルで、マルチセル内のセル435の重みシフトレジスタにシフトする(504)。
【0080】
インターフェイスは、重み行列からのすべての重み値が行列乗算ユニットにロードされるまで、重み値をロードし続ける(506)。
【0081】
同じクロックサイクルで2つの重み値が利用可能でない場合、単一の重み値が利用可能な最初のサイクルで、保持レジスタ445にその利用可能な重み値がロードされ、シフトは行われない(503)。
【0082】
別の重み値が利用可能になる次のサイクルで、インターフェイスは、新たな値および保持レジスタ445に保持される値を2つのシフトチェーンによってマルチセルの重みシフトレジスタにシフトする(505)。
【0083】
次に、インターフェイスは、重み行列からのすべての重み値が行列乗算ユニット506にロードされるまで、重み値のロードを続ける。
【0084】
サイクルごとに複数の重み値が利用可能でない場合、インターフェイスは1サイクルおきにシフトチェーンを活性化する。
【0085】
図6は、重み値のロード速度を4倍増加させるために、列ごとに2つのチェーンの重みシフトレジスタを伴い、列ごとに2つのポイントで重み値を注入する、行列乗算ユニットのアーキテクチャの例を示す。図3に示すように、行列乗算ユニットには、シストリックアレイの列ごとに2つのシフトチェーンがある。各セル650は、1つのシフトチェーンのみに接続されるシフトレジスタ635を含む。上述のように、ベクトルレジスタ603は、行列乗算ユニットによって演算される値よりも何らかの大きさだけ大きいまたは小さいレジスタ値を保持することができる。たとえば、あるレジスタはnビット値を保持し、行列乗算ユニットはn/2ビット値で動作する。ベクトルレジスタ内の値は、行列乗算ユニットに期待される値サイズに一致するように分割または何らかの方法で変換できる。
【0086】
一実装形態では、各レジスタ603は32ビットの値を保持することができる。各ベクトルレジスタ603の値は、各々別個の重み値である4つの8ビット符号付き整数のパックされたセットとして扱われる。図3に示すように、各8ビットの符号付き整数は、2つの16ビットのチェーンで送られる。ただし、それらの整数はシストリックアレイにおいて列ごとに2つの注入ポイント680、681に送られる。それらの整数は、アレイの上
部(680a、6801a)および下の別のポイント(680b、680b)に送られる。説明した複数の注入ポイントを有する実施形態は、本明細書で説明する他の実施形態および特徴と組み合わせることができる。
【0087】
いくつかの実装形態では、整数がアレイの下半分のポイントに送られる場合、整数を注入するための追加の配線は必要ではなく、なぜならば、ベクトルレジスタからアレイの上部へのチェーンがアレイの全長を下から上まで横断するからである。各列の上部で、整数のうちの2つが、アレイで用いられる形式の16ビットの浮動小数点値に変換され、上記の2つの重みシフトチェーン(680a、681a)に注入される。シフトチェーンはマルチプレクサによって中間ポイントで切断され、そのポイントでの整数から浮動小数点へのコンバータの第2のセットが、各32ビット値から他の2つの整数を取得し、変換し、そのポイント(680b、681b)で注入する。たとえば、32ビットのワードを、8ビットの4つの等しい部分、A、B、C、Dに分割できる。重みインターフェイスで、部分Aおよび部分Bをアレイの上部に送り、それらを、行列乗算ユニットによって演算される16ビット値に変換する。重みインターフェイスは、マルチプレクサを介してアレイの中間ポイントに部分Cおよび部分Dを送ることもできる。この実装形態では、部分Cおよび部分Dはアレイの上部には送られず、シフトチェーンの中間ポイントでセルの重みシフトレジスタに注入される。シフトチェーン上において中間ポイントにマルチプレクサが存在するため、重み値は、シフトチェーン上の前の重みシフトレジスタからではなく、注入ポイントから選択される。
【0088】
第2の重みの対をアレイに注入するポイントは、中間ポイントではなく、他のポイントである可能性がある。たとえば、アレイの下への1/4のポイントになる場合がある。この場合、上部に注入された重みは、行列乗算ユニットの最初の1/4のセルおよび行列乗算ユニットの3番目の1/4のセルにシフトされ、1/4のポイントに注入された重みは、行列乗算ユニットの2番目および4番目の1/4のセルにシフトされる。このプロセスには追加の配線が必要であるが、前の行列乗算が終了しつつある間に重みがより早くシフトし始めることができる。
【0089】
示されるように、2つのシフティングチェーンは列ごとに発生する。ただし、一部の実装形態では、2つのシフティングチェーンは、追加的または代替的に、シフティングチェーンごとに2つの注入ポイントがある状態で、行ごとに生じ得る。
【0090】
図7は、重み値をロードする速度を増加させるために、転置された重みシフトおよび通常の転置されない重みシフトのための別個のレジスタを有する行列乗算ユニットのアーキテクチャの例を示す。各マルチセル700は複数のセル750を含み、垂直方向または水平方向のいずれかから重み値をロードすることができる。重みを上から垂直方向にロードすると、重み行列が行列乗算ユニットに格納される。同じ重みを同じ順序で横からロードすると、重み行列の転置が行列乗算ユニットに格納される。ニューラルネットワークシステムのトレーニングでは、転置されない重み行列および転置された重み行列の両方を、トレーニングアルゴリズムの異なるステップでロードする必要がある。重みが上から垂直方向にロードされると、重み値はセルを通して下にシフトされる。重みが左から水平方向にロードされると、重み値はマルチセル700を通って右にシフトされる。図7は、通常のシフトレジスタ705に接続された通常のシフトチェーン701a、701bを示す。転置されたシフトチェーン702a、702bは転置されたシフトレジスタ705に接続される。マルチプレクサ730は、どのシフトチェーン701、702から重み行列レジスタ725をロードするかを判断する。
【0091】
一部の実装形態では、ある重みのセットを行列乗算ユニットの重み行列レジスタにシフトするのにnサイクルかかる。2番目の重みのセットは、そのシフトを、最初の重み値が
ロードされたn/2サイクル後に開始でき、新たな重みのセットをn/2サイクルごとにシフトレジスタから重み行列レジスタにロードしてもよい。
【0092】
一部の実装形態では、128×128の重みのセット全体を常に使用する必要はない。未使用の位置の重みをゼロにセットして、重み行列を効果的に小さくすることができる。ある行列乗算ユニットは、その場合、データを重みシフトレジスタのすべての行またはすべての列にシフトする必要はない。各重みシフト命令は、8行のデータ、または転置されたロードの場合には8列のデータを、シストリックアレイにシフトすることになる。16個の重みシフト命令は、128×128の行列全体をロードし、以前のすべてのデータを置き換える。データが重みシフトレジスタから対応する重み行列レジスタにコピーされると、各重みシフトレジスタはクリアされる。新たなデータを重みシフトレジスタにシフトすることは、このロード&クリア信号の伝搬が開始された直後に開始できる。データがロードされる機会を有する前にシフトしないように、重みシフト信号は、ロード&クリア波面の下および右のすべてのセルに対して禁止される。古いデータは完全にクリアされるため、データの行または列のすべてをシフトインする必要はない。シフトレジスタの上(または左)部分のみが新たなデータで埋められ、残りはゼロのままとなるため、それらの行への入来データは無視される(またはそれらの列からの出力データはゼロにされる)。
【0093】
図8は、重み値のロード速度を高めるために保持レジスタのセットを有する例示的なセル800を示す。セル800は、シフトインされた重みのセットのための一時記憶として用いられる1つ以上の重み保持レジスタのセットを含む。1つのセットの重みシフトレジスタ805aの値は、重み行列レジスタ825にコピーされる代わりに、またはそれに加えて、1つのセットの重み保持レジスタ845aにコピーすることができる。第2のセットの重みシフトレジスタ805bの値は、重み行列レジスタ825にコピーされる代わりに、またはそれに加えて、第2のセットの重み保持レジスタ845bにコピーすることができる。重み値のセットが重み行列レジスタにロードされるとき、重み値のセットは、重みシフトレジスタ805a、805bから直接ではなく、保持レジスタ845のセットの1つから取得されてもよい。このプロセスにより、重み値のセットを、アレイへのシフト後に複数回ロードすることができる。たとえば、アルゴリズムが2つの重みセット間の切り替えを必要とする場合、1つのシフトチェーンからの重み値をロード間で保持レジスタにシフトできる。このプロセスにより、重みシフトのタイミングを重みロードから切り離すこともできる。たとえば、新たな重み値のセットがn/cサイクルごとにシフトを開始する場合、両方の重み値のセットを同時にシフトし、最初のセットが重み行列レジスタにロードされると、もう1つのセットが重み保持レジスタに移動されることが考えられる。追加のn/2サイクルの後、2番目のセットが保持レジスタから重み行列レジスタにロードされる。
【0094】
いくつかの実装形態では、図4および/または図6の2つのシフトチェーンは、所与の時間に行列乗算ユニットにロードできる重み値の量の増大のために、通常のおよび転置されたシフトレジスタの追加と組み合わせることができる。
【0095】
本明細書において記載される主題および機能的動作の実施形態は、本明細書に開示される構造およびそれらの構造的等価物を含む、デジタル電子回路系において、有形で実施されるコンピュータソフトウェアもしくはファームウェアにおいて、コンピュータハードウェアにおいて、またはそれらの1つ以上の組合せにおいて実現され得る。本明細書に記載される主題の実施形態は、1つ以上のコンピュータプログラムとして、すなわち、データ処理装置による実行のために、または、データ処理装置の動作を制御するために有形の非一時的な記憶媒体上でエンコードされたコンピュータプログラム命令の1つ以上のモジュールとして実現され得る。コンピュータ記憶媒体は、機械可読記憶装置、機械可読記憶基板、ランダムもしくはシリアルアクセスメモリデバイス、または、それらの1つ以上の組
合せであり得る。代替的に、または加えて、プログラム命令は、データ処理装置による実行に対して好適な受信側装置への送信のために情報をエンコードするよう生成される、たとえばマシンにより生成された電気信号、光信号、または電磁気信号などの、人為的に生成された伝搬される信号上でエンコードすることができる。
【0096】
「データ処理装置」という用語は、データ処理ハードウェアを指し、例としてプログラマブルプロセッサ、コンピュータ、または複数のプロセッサもしくはコンピュータを含む、データを処理するためのすべての種類の装置、デバイスおよびマシンを包含する。当該装置は、たとえばFPGA(フィールドプログラマブルゲートアレイ)またはASIC(特定用途向け集積回路)といった特定目的論理回路でもあることができるかまたはそれをさらに含み得る。当該装置は、ハードウェアに加えて、たとえばプロセッサファームウェア、プロトコルスタック、データベース管理システム、オペレーティングシステム、または、それらの1つ以上の組合せを構成するコードといった、コンピュータプログラムについて実行環境を作成するコードをオプションとして含み得る。
【0097】
プログラム、ソフトウェア、ソフトウェアアプリケーション、アプリケーション、モジュール、ソフトウェアモジュール、スクリプトまたはコードとも称され、または記載され得るコンピュータプログラムは、コンパイル型もしくはインタープリタ型言語、または宣言型もしくは手続き型言語を含む任意の形態のプログラミング言語で記述され得、スタンドアロンプログラムとして、または、モジュール、コンポーネント、サブルーチン、もしくは、コンピューティング環境で使用するのに好適な他のユニットとして任意の形態で展開され得る。プログラムは、ファイルシステムにおけるファイルに対応し得るが、対応する必要があるわけではない。プログラムは、当該プログラムに専用である単一のファイルにおいて、または、複数の連携ファイル(coordinated files)(たとえばコードの1つ以上のモジュール、サブプログラムまたは部分を格納するファイル)において、他のプログラムまたはデータ(たとえばマークアップ言語ドキュメントに格納される1つ以上のスクリプト)を保持するファイルの一部に格納され得る。コンピュータプログラムは、1つの場所に位置するかもしくは複数の場所にわたって分散されデータ通信ネットワークによって相互接続される1つのコンピュータまたは複数のコンピュータ上で実行されるように展開され得る。
【0098】
本明細書に記載されるプロセスおよび論理フローは、入力データ上で動作し出力を生成することにより機能を実行するよう1つ以上のプログラマブルコンピュータが1つ以上のコンピュータプログラムを実行することによって実行され得る。本プロセスおよび論理フローは、たとえばFPGAもしくはASICといった特殊目的論理回路系によっても、または特殊目的論理回路計と1つ以上のプログラムされたコンピュータとの組み合わせによっても実行され得る。
【0099】
コンピュータプログラムの実行に好適であるコンピュータは、汎用マイクロプロセッサもしくは特殊目的マイクロプロセッサもしくはその両方または任意の種類の中央処理ユニットに基づき得る。一般に、中央処理ユニットは、リードオンリメモリもしくはランダムアクセスメモリまたはその両方から命令およびデータを受け取る。コンピュータの必須の要素は、命令を実行するための中央処理ユニットと、命令およびデータを格納するための1つ以上のメモリデバイスとである。中央処理ユニットおよびメモリは、特殊目的論理回路系によって補足され得るか、または特殊目的論理回路に組み込まれ得る。一般に、コンピュータはさらに、たとえば磁気ディスク、光磁気ディスクまたは光ディスクといった、データを格納するための1つ以上の大容量記憶装置を含むか、当該1つ以上の大容量記憶装置からデータを受け取るかもしくは当該1つ以上の大容量記憶装置にデータを転送するよう動作可能に結合されるか、またはその両方を行う。しかしながら、コンピュータはそのような装置を有する必要はない。さらに、コンピュータはたとえば、携帯電話、携帯情
報端末(PDA)、モバイルオーディオまたはビデオプレーヤ、ゲームコンソール、全地球測位システム(GPS)受信機、またはポータブル記憶装置(たとえばユニバーサルシリアルバス(USB)フラッシュドライブ)といった別のデバイスに埋め込まれ得る。
【0100】
コンピュータプログラム命令およびデータを格納するのに好適であるコンピュータ可読媒体は、例として、たとえばEPROM、EEPROMおよびフラッシュメモリデバイスといった半導体メモリデバイスを含むすべての形態の不揮発性メモリ、媒体およびメモリデバイス;たとえば内部ハードディスクまたはリムーバブルディスクといった磁気ディスク;光磁気ディスク;ならびにCD-ROMおよびDVD-ROMディスクを含む。
【0101】
ユーザとの対話を与えるために、本明細書に記載される主題の実施形態は、たとえばCRT(陰極線管)またはLCD(液晶ディスプレイ)モニタといったユーザに対して情報を表示するための表示デバイスと、たとえばマウス、トラックボールといったユーザがコンピュータに入力を与えることができるキーボードおよびポインティングデバイスとを有するコンピュータ上で実現され得る。他の種類のデバイスが、同様に、ユーザとの対話を与えるために用いられ得;たとえば、ユーザに提供されるフィードバックは、たとえば視覚フィードバック、聴覚フィードバックまたは触覚フィードバックといった任意の形態の感覚フィードバックであり得;ユーザからの入力は、音響入力、音声入力、または触覚入力を含む任意の形態で受け取られ得る。加えて、コンピュータは、ユーザが使用するデバイスにドキュメントを送信しユーザが使用するデバイスからドキュメントを受信することによって、たとえば、ウェブブラウザから受信された要求に応答してユーザのデバイス上のウェブブラウザにウェブページを送信することによって、ユーザと対話し得る。また、コンピュータは、テキストメッセージまたは他の形式のメッセージを個人用デバイス、たとえばスマートフォンなどに送信し、メッセージングアプリケーションを実行し、ユーザから応答メッセージを受信することにより、ユーザと対話できる。
【0102】
本明細書に記載される主題の実施形態は、たとえばデータサーバとしてバックエンドコンポーネントを含む計算システムにおいて実現され得るか、たとえばアプリケーションサーバといったミドルウェアコンポーネントを含む計算システムにおいて実現され得るか、たとえば本明細書に記載される主題の実現例とユーザが対話することが可能であるグラフィカルユーザインターフェイス、ウェブブラウザもしくはアプリを有するクライアントコンピュータといったフロントエンドコンポーネントを含む計算システムにおいて実現され得るか、または1つ以上のそのようなバックエンドコンポーネント、ミドルウェアコンポーネントもしくはフロントエンドコンポーネントの任意の組合せの計算システムにおいて実現され得る。システムのコンポーネントは、たとえば通信ネットワークといったデジタルデータ通信の任意の形態または媒体によって相互接続され得る。通信ネットワークの例は、ローカルエリアネットワーク(LAN)およびワイドエリアネットワーク(WAN)、たとえばインターネットを含む。
【0103】
計算システムはクライアントおよびサーバを含むことができる。クライアントとサーバとは一般に互いから遠隔にあり、典型的には通信ネットワークを通じて対話する。クライアントとサーバとの関係は、それぞれのコンピュータ上で実行されるとともに互いに対してクライアント-サーバ関係を有するコンピュータプログラムによって発生する。いくつかの実施形態では、サーバは、例えば、クライアントとして振る舞うユーザデバイスと対話するユーザにデータを表示し、およびそのユーザからユーザ入力を受信する目的で、データ、例えば、HTMLページをユーザデバイスに送信する。ユーザデバイスで生成されたデータ、例えば、ユーザ対話の結果は、ユーザデバイスからサーバで受信することができる。
【0104】
実施形態1は、セルのシストリックアレイとして実装される行列乗算ユニットであって
、セルのシストリックアレイの各セルは、転置されたまたは転置されない重みシフトレジスタから重み入力を受け取るように構成される重み行列レジスタと、重み行列レジスタに格納されるよう水平方向から重み入力を受け取るように構成される転置された重みシフトレジスタと、重み行列レジスタに格納されるよう垂直方向から重み入力を受け取るように構成される転置されない重みシフトレジスタと、重み行列レジスタに結合され、乗算結果を得るために重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを含む。
【0105】
実施形態2は実施形態1の行列乗算ユニットであって、各セルはさらに、転置された重みシフトレジスタの重み入力と転置されない重みシフトレジスタとの間で選択を行い、選択された重み入力を重み行列レジスタに転送するように構成されるマルチプレクサを備える。
【0106】
実施形態3は、転置された重みシフトレジスタまたは転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第1の重み保持レジスタをさらに備える、実施形態1または2の行列乗算ユニットである。
【0107】
実施形態4は、転置された重みシフトレジスタまたは転置されない重みシフトレジスタのいずれかからの重み値を保持するように構成された第2の重み保持レジスタをさらに備える、実施形態1~3のいずれか1つの行列乗算ユニットである。
【0108】
実施形態5は実施形態1~4のいずれか1つの行列乗算ユニットであって、ある重み値が転置された重みシフトレジスタから第1の重み保持レジスタにロードされ、ある重み値が垂直方向から第2の重み保持レジスタにロードされる。
【0109】
実施形態6は実施形態1~5のいずれか1つの行列乗算ユニットであって、重み行列レジスタには、第1の重み保持レジスタまたは第2の重み保持レジスタから値がロードされる。
【0110】
実施形態7はシストリックアレイとして実装される行列乗算ユニットであって、シストリックアレイの列に配置された複数のセルと、シストリックアレイの列ごとに設けられる重みシフトレジスタの2つのチェーンとを備え、各重みシフトレジスタは1つのチェーンのみに接続され、各セルは1つの重みシフトレジスタのみに接続され、行列乗算ユニットはさらに、セルごとに設けられ、重みシフトレジスタから受け取られる重み入力を格納するように構成された重み行列レジスタと、重み行列レジスタに結合され、乗算結果を得るために重み行列レジスタの重み入力をベクトルデータ入力で乗算するように構成される乗算ユニットとを備える。
【0111】
実施形態8は、実施形態7の行列乗算ユニットであり、重み値は、重み値の対を含むベクトルレジスタから重みシフトレジスタの2つのチェーンで送られる。
【0112】
実施形態9は、ベクトルレジスタから2つの重み値が利用可能でない場合に重み値を保持するために各列の上部に保持レジスタをさらに備える、実施形態7または8の行列乗算ユニットである。
【0113】
実施形態10は、実施形態7~9のいずれか1つの行列乗算ユニットであり、2つの重み値が利用可能な場合、2つの重み値はクロックサイクルでセル内の重みシフトレジスタにシフトされる。
【0114】
実施形態11は、実施形態7~10のいずれか1つの行列乗算ユニットであって、2つ
の重み値が利用可能でない場合、第1の重み値が利用可能な第1のクロックサイクルで、保持レジスタに、第1の重み値が、保持される値としてロードされ、シフトは行われず、次のクロックサイクルで、第2の重み値が利用可能な場合、第2の重み値と保持された値とは、2つのシフトチェーンによって、1つの値が各シフトチェーンによりシフトされて、シフトチェーンに接続された重みシフトレジスタにシフトされる。
【0115】
実施形態12は、各シフトチェーンは、重み値を注入するための2つの注入ポイントを有し、一方のポイントは列の上部にあり、他方のポイントは列の第2のポイントにある、実施形態7~11のいずれか1つの行列乗算ユニットである。
【0116】
実施形態13は、各々別々の重み値を表す4つの8ビット整数のパックされたセットを含むベクトルレジスタをさらに備える、実施形態7~12のいずれか1つの行列乗算ユニットである。
【0117】
実施形態14は、列の上部に4つの整数のうちの2つを注入し、アレイの第2のポイントに4つの整数の他の2つを注入することをさらに含む、実施形態7~13のいずれか1つの行列乗算ユニットである。
【0118】
本明細書は多くの特定の実現例の詳細を含んでいるが、これらは如何なる発明の範囲または請求され得るものの範囲に対する限定としても解釈されるべきではなく、特定の発明の特定の実施形態に特有の特徴であり得る記載として解釈されるべきである。別個の実施形態の文脈で本明細書において記載されるある特徴は、単一の実施形態において組合せでも実現され得る。反対に、単一の実施形態の文脈において記載されるさまざまな特徴は、複数の実施形態において別々に、または任意の好適な部分的組合わせでも実現され得る。さらに、特徴は、ある組合せにおいて作用すると上で記載され、最初はそのように請求されていさえする場合もあるが、請求される組合せからの1つ以上の特徴はいくつかの場合には当該組合せから削除され得、請求される組合せは、部分的組合わせまたは部分的組合わせの変形例に向けられ得る。
【0119】
同様に、動作が図においては特定の順に示されているが、そのような動作は、望ましい結果を達成するために、示された当該特定の順もしくは連続した順で実行される必要があると理解されるべきではなく、または、すべての示された動作が実行される必要があると理解されるべきではない。ある状況においては、マルチタスキングおよび並列処理が有利であり得る。さらに、上述の実施形態におけるさまざまなシステムモジュールおよびコンポーネントの分離は、すべての実施形態においてそのような分離を必要とすると理解されるべきではなく、記載されるプログラムコンポーネントおよびシステムは一般に単一のソフトウェア製品に統合され得るかまたは複数のソフトウェア製品にパッケージ化され得ることが理解されるべきである。
【0120】
主題の特定の実施形態が記載された。他の実施形態は以下の請求の範囲内にある。たとえば、請求項において記載されるアクションは、異なる順で実行され得、それでも望ましい結果を達成し得る。一例として、添付の図において示されるプロセスは、望ましい結果を達成するために、示された特定の順または連続する順であることを必ずしも必要としない。ある場合においては、マルチタスキングおよび並列処理が有利であり得る。
図1A
図1B
図1C
図2
図3
図4
図5
図6
図7
図8