(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-04-28
(45)【発行日】2023-05-11
(54)【発明の名称】行列の空間局所性変換
(51)【国際特許分類】
G06F 17/10 20060101AFI20230501BHJP
【FI】
G06F17/10 A
(21)【出願番号】P 2021527941
(86)(22)【出願日】2019-11-19
(86)【国際出願番号】 US2019062303
(87)【国際公開番号】W WO2020106781
(87)【国際公開日】2020-05-28
【審査請求日】2022-11-14
(32)【優先日】2018-11-19
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2019-11-18
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2019-11-18
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2019-11-18
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2019-11-18
(33)【優先権主張国・地域又は機関】US
【早期審査対象出願】
(73)【特許権者】
【識別番号】518286459
【氏名又は名称】グロック,インコーポレイテッド
(74)【代理人】
【識別番号】110001243
【氏名又は名称】弁理士法人谷・阿部特許事務所
(72)【発明者】
【氏名】ジョナサン アレキサンダー ロス
(72)【発明者】
【氏名】トーマス ホーキンス
(72)【発明者】
【氏名】グレゴリー マイケル ソーソン
(72)【発明者】
【氏名】マット ボイド
【審査官】漆原 孝治
(56)【参考文献】
【文献】米国特許出願公開第2016/0342893(US,A1)
【文献】米国特許出願公開第2001/0051860(US,A1)
【文献】米国特許出願公開第2019/0244080(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 17/10
(57)【特許請求の範囲】
【請求項1】
出力アクティベーションを生成するためにカーネルの重みによって修正された入力値の畳み込みを効率的に計算する方法であって、
入力ストリーム生成器で、前記カーネルと、前記入力値を含む入力テンソルとを受け取るステップと、
前記入力ストリーム生成器によって、前記入力テンソルを複数のタイルに分割するステップであって、各タイルは、前記カーネルのサイズに等しいサイズを有する、ステップと、
前記入力ストリーム生成器によって、前記複数のタイル
の前記入力値を
含む複数の平滑化された入力ベクトル
を有する平滑化された入力ストリームを生成するステップと、
拡張カーネル生成器によって、前記カーネル
に基づいて複数のカーネルベクトルを有する
拡張カーネルを生成するステップであって、前記
複数のカーネルベクトルの数が前記入力テンソルの各タイル内の要素の数に
等しく、前記拡張カーネルのサイズが前記カーネルのサイズよりも大きい、ステップと、
前記入力ストリーム生成器と前記拡張カーネル生成器とに結合される乗加算ユニットによって、前記複数の平滑化された入力ベクトルと前記複数のカーネルベクトルとの間の前記畳み込みを実行して、前記入力テンソルの各タイルについての前記出力アクティベーションの出力タイルを生成するステップと
を備える、方法。
【請求項2】
前記入力ストリーム生成器によって、前記出力アクティベーションのサイズが前記入力テンソルのサイズと同じであるように、前記入力テンソルをパディング値によりパディングするステップ
をさらに備える請求項1に記載の方法。
【請求項3】
前記入力ストリーム生成器によって、前記入力テンソルの各次元のサイズが前記カーネルの対応する次元の整数倍になるように、前記入力テンソルをパディング値によりパディングするステップ
をさらに備える請求項1に記載の方法。
【請求項4】
前記入力ストリーム生成器によって、前記入力テンソルの各次元のトレーリングエッジを、前記カーネルの対応する次元のサイズに等しい幅を有するパディング値によりパディングするステップ
をさらに備える請求項1に記載の方法。
【請求項5】
前記パディング値は、0の値である、請求項4に記載の方法。
【請求項6】
前記カーネルの第1の辺と前記カーネルの第2の辺とは互いに垂直であり、前記第1の辺は、前記第2の辺とは異なる長さであり、前記方法は、
前記入力ストリーム生成器によって、前記入力テンソルにわたる前記カーネルのストライドの方向にアラインされた順序で、前記入力テンソルを分割するステップ
をさらに備える請求項1に記載の方法。
【請求項7】
前記カーネルの第1の辺と前記カーネルの第2の辺とは互いに垂直であり、前記第1の辺は、前記第2の辺とは異なる長さであり、前記方法は、
前記入力ストリーム生成器によって、前記入力テンソルにわたる前記カーネルのストライドの方向と直交する順序で、前記入力テンソルを分割するステップ
をさらに備える請求項1に記載の方法。
【請求項8】
前記平滑化された入力ストリームは、
前記入力ストリーム生成器によって
前記複数のタイルのそれぞれについて、前記各タイルの前記入力値のセットに定義された順序でアクセスする
ことと、
前記入力ストリーム生成器によって
前記複数のタイルのそれぞれについて、前記定義された順序に従ってベクトル内に前記アクセスされた入力値を配置する
ことと、
前記入力ストリーム生成器によって、前記複数のタイルに対応する複数のベクトルを平行な構成で配置して、
前記平滑化された入力ストリーム
の前記複数のカーネルベクトルを生成する
ことと
によって生成される、請求項1に記載の方法。
【請求項9】
前記定義された順序は、行優先順序、列優先順序、およびアイル優先順序のうちの少なくとも1つであり、前記アイル優先順序は、3次元(3D)タイル内の要素に、まず、3Dタイルの深さに対応する軸に沿ってアクセスし、続いて、前記3Dタイルの幅および前記3Dタイルの高さに対応する軸に沿って、アクセスする、
請求項8に記載の方法。
【請求項10】
前記複数の
カーネルベクトルを含む平滑化された入力ストリームは、バッファに記憶され、前記バッファは、乗加算演算の実行ためにハードウェアアクセラレーテッドプロセッサによって読み取られ、前記乗加算演算は、前記乗加算ユニットによって、1)制御パターンによって選択される、前記平滑化された入力ストリーム内の入力値と、2)前記複数のカーネルベクトルとの間で実行され、前記入力値を前記バッファ内へ複数回ロードすることなく、前記出力アクティベーションを生成する、
請求項1に記載の方法。
【請求項11】
前記入力テンソルは、複数の入力チャネルを有し、前記カーネルは、複数の
カーネルフィルタを有し、前記入力チャネルは、
前記複数のカーネルフィルタの各カーネルフィルタを用いて畳み込まれて、複数の出力チャネルを有する出力が生成される、
請求項1に記載の方法。
【請求項12】
プロセッサ回路であって、
カーネルと、入力値を含む入力テンソルとを受け取り、
前記入力テンソルを複数のタイルに分割することであって、各タイルは、前記カーネルのサイズに等しいサイズを有し、
前記複数のタイル
の前記入力値を
含む複数の平滑化された入力ベクトル
を有する平滑化された入力ストリームを生成するように構成される入力ストリーム生成器と、
複数のカーネルベクトルを有する
拡張カーネルを生成するように構成される拡張カーネル生成器であって、前記
複数のカーネルベクトルの数が前記入力テンソルの各タイル内の要素の数に等し
く、前記拡張カーネルのサイズが前記カーネルのサイズよりも大きい、拡張カーネル生成器と、
前記入力ストリーム生成器と前記拡張カーネル生成器とに結合される乗加算ユニットであって、前記複数の平滑化された入力ベクトルと前記複数のカーネルベクトルとの間の畳み込みを実行し、前記入力テンソルの各タイルについての出力アクティベーションの出力タイルを生成する乗加算ユニットと、
を備える、プロセッサ回路。
【請求項13】
前記入力ストリーム生成器は、
前記出力アクティベーションのサイズが前記入力テンソルのサイズと同じであるように、前記入力テンソルをパディング値によりパディングするようにさらに構成される請求項12に記載のプロセッサ回路。
【請求項14】
前記入力ストリーム生成器は、
前記入力テンソルの各次元のサイズが、前記カーネルの対応する次元の整数倍となるように、前記入力テンソルをパディング値によりパディングするようにさらに構成される請求項12に記載のプロセッサ回路。
【請求項15】
前記入力ストリーム生成器は、
前記入力テンソルの各次元のトレーリングエッジを、前記カーネルの対応する次元のサイズに等しい幅を有するパディング値によりパディングするようにさらに構成される請求項12に記載のプロセッサ回路。
【請求項16】
前記パディング値は、0の値である、請求項15に記載のプロセッサ回路。
【請求項17】
前記カーネルの第1の辺と前記カーネルの第2の辺とは互いに垂直であり、前記第1の辺は、前記第2の辺とは異なる長さであり、前記入力ストリーム生成器は、
前記入力テンソルにわたる前記カーネルのストライドの方向にアラインされた順序で、前記入力テンソルを分割するようにさらに構成される請求項12に記載のプロセッサ回路。
【請求項18】
前記カーネルの第1の辺と前記カーネルの第2の辺とは互いに垂直であり、前記第1の辺は、前記第2の辺とは異なる長さであり、前記入力ストリーム生成器は、
前記入力テンソルにわたる前記カーネルのストライドの方向と直交する順序で、前記入力テンソルを分割するようにさらに構成される請求項12に記載のプロセッサ回路。
【請求項19】
前記入力ストリーム生成器は、
前記複数のタイルの各々について
、前記各タイルの前記入力値のセットに定義された順序でアクセスすることと、
前記複数のタイルの各々について、前記定義された順序に従って、ベクトル内に前記アクセスされた入力値を配置することと、
前記複数のタイルに対応する複数のベクトルを平行な構成で配置して、
前記平滑化された入力ストリーム
の複数のカーネルベクトルを生成することと
を行うようにさらに構成される請求項12に記載のプロセッサ回路。
【請求項20】
前記定義された順序は、行優先順序、列優先順序、およびアイル優先順序のうちの少なくとも1つであり、前記アイル優先順序は、3次元(3D)タイル内の要素に、まず、3Dタイルの深さに対応する軸に沿ってアクセスし、続いて、前記3Dタイルの幅および前記3Dタイルの高さに対応する軸に沿って、アクセスする、
請求項19に記載のプロセッサ回路。
【請求項21】
前記拡張カーネルは、
前記カーネルの第一の次元について、前記カーネルの単一次元ベクトルごとに、その一次元ベクトルのすべてのローテーションを含む、値の正方ブロックを生成することと、
前記カーネルの付加的な次元ごとに、
直前の次元のブロックをブロックのセットにグループ化することであって、ブロックの各セットは、前記付加的な次元の軸に平行なベクトルに沿って整列された直前の次元のブロックを含む、ことと、
1つまたは複数の値のブロックを生成することであって、前記1つまたは複数の値のブロックの各ブロックは、直前の次元の各ブロックのセット内のブロックのすべてのローテーションを含む、ことと、
前記カーネルの最後の次元に対応する値のブロックを前記拡張カーネルとして出力することと
によって生成される、請求項1に記載の方法。
【請求項22】
前記拡張カーネル生成器は、
前記カーネルの第一次元について、その一次元ベクトルのすべてのローテーションを含む、前記カーネルの各一次元ベクトルの値の正方ブロックを生成することと、
前記カーネルの付加的な次元ごとに、
直前の次元のブロックをブロックのセットにグループ化することであって、ブロックの各セットは、前記付加的な次元の軸に平行なベクトルに沿って整列された直前の次元のブロックを含む、ことと、
1つまたは複数の値のブロックを生成することであって、前記1つまたは複数の値のブロックの各ブロックは、直前の次元の各ブロックのセット内のブロックのすべてのローテーションを含む、ことと、
前記カーネルの最後の次元に対応する値のブロックを、前記拡張カーネルとして出力することと
をさらに行うように構成される、請求項12に記載のプロセッサ回路。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、一般に、行列計算に関し、特に、行列の空間局所性変換に関する。
【背景技術】
【0002】
現代のニューラルネットワークは、多様な層を含む。各層は、多数の入力値を含んでもよく、入力値は、出力(すなわち、アクティベーション)を生成するために後に変換され、出力は、後続の層に対する入力としての役割を果たす。典型的には、これらの入力値および出力値は、行列(例えば、1次元から多次元の値の配列)として表される。これらの入力値に対して実行される一般的な変換は、畳み込みである。畳み込みは、重み値を含み、行列としても表さられることができるカーネルを、入力において隣接する値に適用して、出力値を生成する。これは、(重みによって修正された)入力におけるすべての値に対して繰り返されて、値の出力セットが生成される。しかしながら、多様な出力を生成すべく、カーネルが、同じ入力値を多様な回数ストライドするにつれて、またはスライドするにつれて、隣接する値を多様な回数読まなければならないことに起因して、素朴なアプローチを使用して実行された場合には、計算コストが高くなる場合がある。
【0003】
したがって、カーネルによる重みによって修正される入力値の畳み込みをより効率的に計算して、出力値を生成することができるシステムが望まれる。
【図面の簡単な説明】
【0004】
【
図1】一実施形態にかかる、出力アクティベーションを生成するためにカーネルの空間局所性変換(SLT)を介した入力テンソルの畳み込みのためのシステム100を例示する図である。
【
図2】一実施形態にかかる、カーネルによる2次元入力の畳み込みの例を示す図である。
【
図3】一実施形態にかかる、入力テンソルを平滑化する方法を例示するフロー図である。
【
図4】一実施形態にかかる、1次元カーネルの場合における入力テンソルの平滑化の例を例示する図である。
【
図5A】一実施形態にかかる、2次元カーネルの場合において入力テンソルを平滑化する例の第1の部分を例示する図である。
【
図5B】一実施形態にかかる、2次元カーネルの場合において入力テンソルを平滑化する例の第2の部分を例示する図である。
【
図5C】一実施形態にかかる、多様な入力チャネルについての入力テンソルを平滑化する例を例示する図である。
【
図6A】一実施形態にかかる、3次元カーネルの場合において入力テンソルを平滑化する例の第1の部分を例示する図である。
【
図6B】一実施形態にかかる、3次元カーネルの場合において入力テンソルを平滑化する例の第2の部分を例示する図である。
【
図7】一実施形態にかかる、拡張カーネルを生成する方法を例示するフロー図である。
【
図8】一実施形態にかかる、1次元カーネルの場合において拡張カーネルを生成する例を例示する図である。
【
図9A】一実施形態にかかる、異なる2次元カーネルのための拡張カーネルを生成する例を例示する図である。
【
図9B】一実施形態にかかる、列優先拡張を使用して拡張カーネルを生成する例を例示する図である。
【
図9C】一実施形態にかかる、多様なカーネルフィルタの場合において拡張カーネルを生成する例を例示する図である。
【
図10A】一実施形態にかかる、3次元カーネルの場合において拡張カーネルを生成する例の第1の部分を例示する図である。
【
図10B】一実施形態にかかる、3次元カーネルの場合において拡張カーネルを生成する例の第2の部分を例示する図である。
【
図10C】一実施形態にかかる、3次元カーネルの場合において拡張カーネルを生成する例の第3の部分を例示する図である。
【
図11】一実施形態にかかる、制御パターンを生成する方法を例示するフロー図である。
【
図12A】一実施形態にかかる、制御パターンの生成のための概念的基礎の例の第1の部分を例示する図である。
【
図12B】一実施形態にかかる、制御パターンの生成のための概念的基礎の例の第2の部分を例示する図である。
【
図13A】一実施形態にかかる、2次元カーネルのための制御パターンの値の生成の一部の例を例示する図である。
【
図13B】一実施形態にかかる、3次元カーネルのための制御パターンの値の生成の一部の例を例示する図である。
【
図13C】一実施形態にかかる、異なる次元のカーネルのための生成された制御パターンの例を例示する図である。
【
図14】一実施形態にかかる、平滑化された入力、拡張カーネル、および制御パターンを使用して、畳み込みの出力を生成する方法を例示するフロー図である。
【
図15A】一実施形態にかかる、1次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第1の部分を例示する図である。
【
図15B】一実施形態にかかる、1次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第2の部分を例示する図である。
【
図15C】一実施形態にかかる、1次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第3の部分を例示する図である。
【
図16A】一実施形態にかかる、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第1の部分を例示する図である。
【
図16B】一実施形態にかかる、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第2の部分を例示する図である。
【
図16C】一実施形態にかかる、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第3の部分を例示する図である。
【
図16D】一実施形態にかかる、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第4の部分を例示する図である。
【
図16E】一実施形態にかかる、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、多様なチャネルを有する出力アクティベーションを生成する例を例示する図である。
【
図16F】一実施形態にかかる、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、多様なチャネルを有する出力アクティベーションを生成する例の第2の部分を例示する図である。
【
図17A】一実施形態にかかる、3次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第1の部分を例示する図である。
【
図17B】一実施形態にかかる、3次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第2の部分を例示する図である。
【
図18A】一実施形態にかかる、拡張カーネルを生成するための例示的な構成要素についてのハードウェア図である。
【
図18B】一実施形態による、拡張カーネルを生成するために例示的な構成要素において使用される例示的なシフター回路についてのハードウェア図である。
【
図19】一実施形態にかかる、制御パターンを生成するための例示的な構成要素についてのハードウェア図である。
【
図20】一実施形態にかかる、乗加算演算を行って出力アクティベーションを生成するための例示的な構成要素についてのハードウェア図である。
【
図21】一実施形態にかかる、機械学習プロセッサにおいて出力アクティベーションを計算するための例示的な構成要素のレイアウトを例示する図である。
【
図22A】一実施形態にかかる例示的な機械学習プロセッサを例示する図である。
【
図22B】別の実施形態にかかる例示的な機械学習プロセッサを例示する図である。
【
図23】コンピュータ可読媒体からの命令を読み取り、それらをプロセッサ(またはコントローラ)において実行することができる例示的な計算機の構成要素を例示するブロック図である。
【0005】
図は、例示のみを目的として様々な非限定的な実施形態を示し、詳細な説明は、例示のみを目的として様々な非限定的な実施形態を説明する。
【発明を実施するための形態】
【0006】
図および下記の説明は、あくまでも例示としての好適な実施形態に関する。当業者は、本明細書で開示されている構造および方法の代替的実施形態を、開示されている内容の原理から逸脱せずに採用されることができる実現可能な代替案として認識することができる。
【0007】
ここで、いくつかの実施形態が詳細に参照されることとなり、それらの例は、添付の図面に示されている。実現可能な限り、類似した参照番号または同様の参照番号が、図において使用されてよく、類似した機能性または同様の機能性を示すことができることに留意されたい。図は、例示のみを目的として、開示されているシステム(または方法)の実施形態を図示する。当業者は、本明細書で示される構造および方法の代替的実施形態が、本明細書で説明される原理から逸脱せずに採用されることができることを、下記の説明から容易に認識するであろう。
【0008】
(例示的なシステム)
図1は、一実施形態による、出力アクティベーションを生成するためにカーネルの空間局所性変換(SLT)を介した入力テンソルの畳み込みのためのシステム100を示す図である。1つの実施形態において、システム100は、入力テンソル102、カーネル110、入力ストリーム生成器122、平滑化された入力ストリーム124、拡張カーネル生成器126、拡張カーネル128、制御パターン生成器134、制御パターン136、乗加算ユニット140、および出力アクティベーション142を含む。ただし、他の実施形態において、システム100は、異なる要素を含み、および/またはシステム100は、異なる個数の図示された要素を含む。
【0009】
入力テンソル102は、出力アクティベーション142を生成するために、畳み込み演算においてカーネル110によって修正される入力値108の集合である。1つの実施形態において、入力テンソル102は、行列によって表される。行列は、1次元、2次元、3次元、または3次元以上を有してもよく、メモリ内に配列として記憶されてよい。配列の次元の数は、行列の次元の数に等しくてよい。別の実施形態において、入力テンソル102は、多様な入力チャネル104A~104N(入力チャネル104と一般に称される)を有する。各入力チャネル104は、1次元または複数次元の行列、例えば、例示されるように、入力チャネル104Aにおける行列の次元1~3 106A~106Cなどを含む。
【0010】
カーネル110は、畳み込み演算において入力テンソル102に適用されて、出力アクティベーション142などの出力アクティベーションを生成する。畳み込み演算に関する付加的な詳細は、
図2を参照して後述される。カーネル110は、1次元または複数次元の行列によって表されることが可能である。行列は、カーネル値114を含み、カーネル値114は、ニューラルネットワークの場合、入力テンソル102の入力値108に対して適用される重みを表す。入力テンソル102の次元、および、特に、各入力チャネル104の行列の次元の数は、少なくともカーネル110の次元の数に等しく、またはカーネル110の次元の数よりも大きくするべきである。サイズ(すなわち、各次元にまたがるカーネル110の要素の数)は、入力テンソル102よりも小さくすることも、または大きくすることもできる。カーネル110が入力テンソル102よりも大きい場合、カーネル110のサイズが、パディングされた入力テンソル102以下となるように、入力テンソル102はパディングされることが可能であり、畳み込み演算が行われることを可能にする。結果として得られる出力アクティベーション142は、(パディングされた)入力テンソル102と同じサイズである行列である。
【0011】
1つの実施形態において、カーネル110は、1つまたは複数のカーネル「フィルタ」112A~112M(カーネルフィルタ112と一般に称される)を含む。カーネルフィルタ112の数は、入力チャネル104の数に等しくする必要はない。カーネルフィルタ112は、サブフィルタカーネルのセットを含み、サブフィルタカーネルは、それら自身がフィルタであり、入力チャネル104の数に等しい。畳み込み演算は、各サブフィルタカーネルを用いて各入力チャネル104に対して実行され、結果として得られる出力行列は、加算されて、単一の出力アクティベーションフィーチャ行列、または出力フィーチャ144A~144M(出力フィーチャ114と一般に称される)を生成する。これは、各カーネルフィルタ112について繰り返される。生成される出力フィーチャ144の数は、カーネル110内に存在するカーネルフィルタ112の数に等しい。したがって、例えば、カーネル110が、1つのカーネルフィルタ112を含む場合、単一の出力フィーチャ144が生成される。ただし、カーネル110が、5つのカーネルフィルタ112を含む場合、出力アクティベーション142は、5つの出力フィーチャ144を有することになる。これは、ニューラルネットワークが、入力の異なる部分(すなわち、異なる入力チャネル104)に対して異なるカーネル重みを適用し、結果を新しい出力(すなわち、異なる出力フィーチャ144)へと組み合わせることを可能にし、新しい出力は、次いで、ニューラルネットワークの別の層において、さらなる入力として使用されることが可能である。多様な入力チャネル104および多様なカーネルフィルタ112の使用に関する付加的な詳細は、
図16E~
図16Fを参照して後述される。
【0012】
入力ストリーム生成器122は、入力テンソル102を平滑化された入力ストリーム124に変換する。入力テンソル102をより効率的に読み取り、カーネル110が入力テンソル102をストライドする場合に入力テンソル102の同じ値を複数回読み取ることを回避すべく、入力ストリーム生成器122は、入力テンソル102を平滑化された入力ストリーム124に変換し、平滑化された入力ストリーム124は、次いで、必要な入力値の読み取りの数を著しく低減する、後述されるような効率的な手法で乗加算ユニット140によってアクセスされるバッファまたは他のメモリ内へ供給されることが可能である。
【0013】
入力テンソルの変換を実行するために、入力ストリーム生成器122は、まず、入力テンソル102をパディングしてよい。入力テンソル102は、そのサイズがカーネル110のサイズのモジュロ(すなわち、倍数)となるように、パディングされてよい。また、カーネル110は、「フォーカス」のポイントを有する。フォーカスのポイントは、カーネル110を用いた畳み込みの出力値が生成される、カーネル110の位置である。カーネル110が、入力テンソル102をストライドする場合に、入力テンソル102におけるあらゆる入力値に到達するように、入力ストリーム生成器122は、入力テンソル102をパディングする。したがって、例えば、カーネルが3×3カーネルであり、フォーカスのポイントがそのカーネルの中心である場合、入力テンソル102の2次元行列は、カーネルのモジュロとなるようにパディングされた後、パディング値の単一のベクトルを用いて行列の外側境界のまわりをさらにパディングされて、カーネルのフォーカスが入力テンソル102の外側エッジにおいて入力値をスライドすることを可能にすることができる。
【0014】
最終的に、入力ストリーム生成器122は、入力テンソル102をパディングして、畳み込みを実行するために使用されるプロセッサの任意の要件も満たすことができる。バスのサイズ、パラレルプロセッサの数、メモリサイズ、または他の制約に起因して、入力ストリーム生成器122は、入力テンソル102が、平滑化された入力ストリーム124になるように平滑化された後に、プロセッサの制約を満たすように、入力テンソル102をパディング値によりさらにパディングしてもよい。1つの実施形態において、入力ストリーム生成器122は、入力テンソル102(または、入力テンソル102の各入力チャネル104)の各次元の一辺(例えば、トレーリングエッジ)をパディング値によりパディングして、カーネル110のサイズ(または、各カーネルフィルタ122の各サブフィルタカーネルのサイズ)に等しくする。ここで説明されるパディング値は、任意のヌル、ゼロ、または基準パディング値としてよい。
【0015】
入力テンソル102をパディングした後、入力ストリーム生成器122は、パディングされた状態の入力テンソル102を、タイルに分割し、またはセグメント化する。各タイルは、カーネル110のサイズである。したがって、入力テンソル102のパディングされた行列は、各々がカーネル102のサイズである、多様な個々のより小さな行列に分割される。入力テンソル102は、分割されるものとしてここでは説明されているが、これは、入力ストリーム生成器122が必ずしも各タイルについて新しい行列を生成することを意味するものではない。代わりに、入力ストリーム生成器122は、入力テンソル102の行列における各タイルの境界を単純に区切ってもよい。
【0016】
多様な入力チャネル104の場合において、入力ストリーム生成器122は、各入力チャネル104の行列を多様なタイルのそれ自身のセットに分割する。各入力チャネル104のタイルのサイズは、その入力チャネル104に対して適用される各カーネルフィルタ112のサブフィルタカーネルのサイズに等しい。
【0017】
入力テンソル102を分割した後、入力ストリーム生成器122は、平滑化順序を識別する。これは、入力テンソル102における各タイルの値が読み取られる順序である。順序は、任意の順序とすることが可能であり、行優先順序、列優先順序、対角線優先順序、アイル優先などを含むことが可能である。行優先順序において、各行内の値は、特定の順序で(例えば、左から右へ)読み取られ、次に、各行も同様に、特定の順序で(例えば、上から下へ)読み取られる。列優先順序においては、各行を読み取る代わりに、各列が、特定の順序で(例えば、左から右へ)読み取られ、各行内の値は、各列について特定の順序で(例えば、上から下へ)読み取られる。対角線優先順序において、タイルは、対角線に沿って読み取られてよい。タイルが、1つを超える層を含む場合、各層は連続的に処理されてよい。同じ順序付けパターンが、拡張カーネル128の生成および制御パターン136の生成においてその後に使用される限り、他の順序も取ることができる。
【0018】
入力ストリーム生成器122は、識別された平滑化順序で各タイルの値を読み取り、それらが各タイルについて読み取られるにつれて値を単一のベクトル内に配置し、それによって、タイルを「平滑化する」。入力ストリーム生成器122は、入力テンソル102のすべてのタイルを読み取り、対応する数のベクトルを生成する。ベクトルは、互いに平行に配置されて、平滑化された入力ストリーム124が生成される。入力ストリーム生成器122は、特定の順序、例えば、行優先順序、列優先順序などで、タイルを読み取ることができる。タイルの順序が、拡張カーネル128および制御パターン136の生成に反映される限り、任意の順序が使用されることが可能であり、有効な出力が乗加算ユニット140によって生成されることが可能である。
【0019】
入力テンソル102が多様な入力チャネル104を含む場合、各入力チャネル104についての行列は、別個に処理されて、各入力チャネル104の各行列のための平滑化された入力ストリームが生成される。多様な平滑化された入力ストリームは、(組み合わされた)平滑化された入力ストリーム124を形成するために共に組み合わされてよい。多様な平滑化された入力ストリームは、それらを共に「積み重ねる」ことによって、それらを共に連結することによって、または、何らかの他の組み合わせ方法を介して、組み合わせられてもよい。
【0020】
平滑化された入力ストリーム124は、入力ストリーム生成器122が入力テンソル102を平滑化した結果である。入力テンソル102の次元の数に関わらず、入力テンソル102の各行列についての平滑化された入力ストリーム124は、(最大でも)2次元である。これは、入力テンソル102の各タイルが上述したようにベクトルに変換され、ベクトルは互いに平行に配置されるからである。1つの実施形態において、入力テンソル102が、多様な入力チャネル104を含む場合、各入力チャネル104の各行列から生成された平滑化された入力ストリームは、他の入力チャネル104の他の行列の平滑化された入力ストリームと、各平滑化された入力ストリームを互いに隣り合うように垂直にまたは水平に(コンピュータ可読メモリ内で)置くことによって、組み合わされてよい。組み合わされた平滑化された入力ストリームは、各入力チャネルから生成された各平滑化された入力ストリームが互いの上に積み重ねられた状態で、3次元的にも表されることができる。メモリ内で、これは、3次元の平滑化された入力ストリームの深さに沿った値が優先順序として記憶される状態で、深さ優先記憶アプローチを使用して表されることができる。
【0021】
平滑化された入力ストリーム124は、バッファに供給され、またはメモリに記憶されることができる。それは、乗加算ユニット140によって読み取られ、平滑化された入力ストリーム124において各ベクトルが対応するタイル番号に応じて、参照されることが可能である。例示される例において、平滑化された入力ストリーム124のタイルは、0からKからJまでの範囲である。ここで、タイル番号1+Kは、タイルの第2の行(または列)の第1のタイルである、元の入力テンソル102内のタイルを表す。値Kは、(タイルが読み取られる順序に依存して)パディングされた入力テンソル102の行または列内のタイルの数を表し、入力テンソル102の幅に依存して変化する。例えば、パディングされた幅9を有する入力テンソルは、カーネルが、したがって、タイルが3×3行列である場合、K値3を有することになる。この場合には、3枚のタイルが入力テンソルの幅に沿って適合し、したがって、第2の行の第1のタイル(すなわち、全体で第4のタイル)の番号は、タイルカウントが0から始まるので、タイル番号3になる。入力テンソル102が、付加的な次元を含む場合、付加的なマーカーは、その次元についての値の各第2のシリーズの第1のタイルに対して示される。例えば、入力テンソル102が3次元を含む場合、別個のマーカーMは、入力テンソル102の単一の層内のタイルの数を示し、タイル番号1+Mは、入力テンソル102の第2の層内の第1のタイルのインデックス値を示すことになる。これらのマーカーは、タイル番号と共に、乗加算ユニットによって、制御パターン136におけるインジケータを使用して、後述されるように、平滑化された入力ストリーム124内の正確なタイルを参照し、または指し示すために使用されることが可能である。あるいは、マーカーを含めて、タイル番号は、クロックサイクル遅延値として使用されて、乗加算ユニット140が、平滑化された入力ストリーム124を含有するバッファからの値の読み取りを遅延させることを可能にしてもよい。これは、乗加算ユニット140が平滑化された入力ストリーム124内の特定のタイルを同様に参照することを可能にする。
【0022】
このアクセスの方法は、システム100の他の構成要素と共に、以下でさらに詳細に説明されるように、カーネル110における値の数に等しい入力テンソルにおけるいくつかの値の読み取りを必要とする基準となる畳み込みと比較して、システム100が入力テンソル102の2
s-1回のみの読み取りを行うことを可能にし、ただし、sは、入力の次元の数であり、したがって、著しいリソースを節約する。入力ストリーム生成器122および平滑化された入力ストリーム124に関する付加的な詳細は、
図3~
図6Bを参照して後述される。
【0023】
拡張カーネル生成器126は、拡張カーネル128を生成し、拡張カーネル128は、乗加算ユニット140によって、平滑化された入力ストリーム124および制御パターン136と共に使用されて、出力アクティベーション142が生成される。拡張カーネル128は、カーネル110から生成される。カーネルを「拡張する」目的は、平滑化された入力ストリーム124の入力値の選択されたベクトルが、下記に示されるように、入力テンソル102上で元のカーネル110をストライドさせなければならない代わりに、拡張カーネル128のベクトル(例えば、列、行、アイル)を用いて単純なドット積を使用して乗算されることを可能なようにすることである。これは、出力アクティベーション142の生成を著しく単純化する。カーネル110の拡張は、カーネル110のローテーション組み合わせを階層的に生成することを含む特定のパターンに従う。下記の説明では、最初の次元、付加的な次元、および最後の次元への参照が行われる。これは、カーネルが1次元から多次元まで有することができるため、カーネルの次元を体系的に参照するための手段であり、各次元のランキングまたはサイズを示すように意図されたものではない。例えば、カーネルが3次元である場合、カーネルの最後の次元は、必ずしもカーネルの何らかの3次元表現を参照するとは限らず、それが3つの異なる次元番号(例えば、次元1、次元2、および次元3)を有する限り、カーネルの次元数3を単純に参照する。
【0024】
1つの実施形態において、拡張カーネル生成器126は、カーネル110の最初の次元(または、1つのカーネルフィルタ112もしくはカーネルフィルタ112のサブフィルタカーネル)を用い、各単一次元ベクトルのすべてのローテーションを含む、カーネルのその単一次元ベクトルについての値の正方形ブロックを生成する。ブロックは、各単一次元ベクトルと平行にローテーションの各々を配置することによって生成される。例えば、3×3の2次元カーネルは、次元1について、3つの3×1の単一次元ベクトルを有することになる。これらのベクトルの各々について、そのベクトルのすべての可能なローテーションが生成され、したがって、各々について2つの付加的な単一次元ベクトルを作成する。これらは、付加的なベクトルを生成するために使用された単一次元ベクトルに平行に配置されて、各単一次元ベクトルについて正方形ブロックが作成される。これらの正方形ブロックは、巡回行列として知られてよい。
【0025】
その後、カーネルの付加的な次元ごとに、直前またはより下位の次元エリアのブロックが、セットにグループ化される。各セットは、直前の次元の軸に平行なベクトルに沿ってアラインされる、その次元のブロックを含む。したがって、3×3行列の例に戻ると、前もって生成された正方形ブロックが、それらが生成されたソースと同じ位置(すなわち、単一次元ベクトル)に配置された場合、次元2について、ベクトルは、生成されたブロックをすべて通ることができる。したがって、次元2のためのセットは、先行する演算において生成されたすべてのブロックを含む。3×3カーネルにおいて、これは、カーネルのベクトルごとに1つずつ、3つのブロックを含む。
【0026】
生成される各セットを用いて、拡張カーネル生成器126は、そのセット内のブロックのすべてのローテーションを生成する。先の例を使用すると、3つのブロックが、次元2のための単独のセット内に存在する。したがって、このセットについてのローテーションは、3つのブロックの2つの付加的な組み合わせを生成し、合計で9つのブロックとなる。2つの付加的な組み合わせは、単一次元ベクトルについて上述した方法と同様に、セット内のブロックに平行に配置される。ここで、2次元カーネルのすべての次元が考慮されたので、拡張カーネル生成器126は、拡張カーネルの生成を終了し、9つのブロックの組み合わされた結果は、拡張カーネル128として出力される。
【0027】
しかしながら、カーネル110がさらなる次元を含む場合、上記のプロセスが繰り返され、ブロックの異なるセットがローテーションされ、組み合わされる結果となる。これは、最終的に、すべての次元が考慮される結果となり、より下位の次元のブロックを有するすべてのブロックの結果として得られる組み合わせは、拡張カーネル128として出力される。したがって、次元の数が増加するにつれて、セットの数は増加する。各付加的な次元において、上述したようなベクトルに沿ってアラインする、先行する次元からのブロックをローテーションさせた後、ローテーションされたブロックの組み合わせは、新しいブロックに配置される。これらの新しいブロックは、次の付加的な次元の計算において使用され、様々なローテーションで組み合わされる。これは、最後の次元まで続き、最後の次元は、カーネルの次元の総数に等しい次元番号を有する。最後の次元において、ローテーションの最終的なセットが実行され、ローテーションの結果として得られる組み合わせは、拡張カーネルとして出力される。したがって、ブロックのセットの数は、処理される付加的な次元ごとに数が減り、最終的な次元についてのローテーションが処理された後には、単一のセット、すなわち出力ブロックのみが残る。
【0028】
拡張カーネル128のベクトル(例えば、行または列)の数は、カーネル内の要素の数、または入力テンソル102のタイル内の要素の数にさらに等しい。拡張カーネル128自体の実際のサイズは、カーネル110のサイズに依存する。2次元の拡張カーネル128の各次元は、カーネル110の各次元のサイズ値の積に等しいサイズを有する。例えば、カーネルが2×2×2行列である場合、拡張カーネル128は、8つのベクトル(23)を有し、したがって、カーネルの次元の値の積が8であるため、8×8のサイズを有することになる。
【0029】
生成される拡張カーネル128は、本明細書で説明されるように、平滑化された入力ストリーム124からの選択された値を用いたドット積において使用されて、出力アクティベーション142が生成されることが可能である。前述したように、平滑化された入力ストリーム124内の値は、制御パターン136のインジケータを使用した遅延またはポインタを介して選択されることができる。これらの値を選択した後、選択された値は、次いで、拡張カーネル128の各ベクトルと平滑化された入力ストリーム124からの異なる選択された値とを乗算することによって、拡張カーネル128の選択されたベクトルと組み合わされて、出力アクティベーション142の出力値を生成することができる。拡張カーネル128のベクトルの数は、(前述されたようにカーネル110と同じサイズである)タイル内の要素の数に等しいので、出力値の数も、各タイルについての同数の要素に等しく、したがって、出力アクティベーション142のタイル(または、多様なカーネルフィルタの場合には、値の出力行列)を含む。出力アクティベーション142の行列内のタイルの位置は、入力テンソル102の行列の同じ位置タイルに対応する位置を有する。
【0030】
ここで説明されるシステム100は、
図2において説明されたものなどの、素朴なアプローチと同じように何回も入力値を再読み取りする必要なく、各出力タイル内の値の計算を可能にする。カーネル110が、出力タイル内の位置に対応する位置の各々へと入力テンソル102にスライドされるにつれて、入力テンソル内の特定の値を繰り返し読み取ることによる代わりに、各出力タイルは、拡張カーネルの単一のパスおよび平滑化された入力ストリーム124からの値の単一の選択において生成される。
【0031】
多様なカーネルフィルタ112の場合には、拡張カーネルは、カーネルフィルタ112ごとに生成され、上述したプロセスと同様に、入力に対して適用されることになる。多様な入力チャネル104の場合には、各カーネルフィルタ112は、各々が入力チャネル104に対応する多様なサブフィルタカーネルを有する。この場合において、拡張カーネルは、サブフィルタカーネルごとに生成されることになり、各サブフィルタカーネルから生成される各拡張カーネルは、そのサブフィルタカーネルが、畳み込みの素朴な実装において適用されていたであろう入力チャネル104に対応する平滑化された入力ストリーム124の関連する部分に対して適用されることになる。拡張カーネルの生成に関する付加的な詳細は、
図7~
図10Cを参照して後述される。
【0032】
制御パターン生成器134は、カーネルサイズ入力132におけるカーネルサイズに関する情報に基づいて、制御パターン136を生成する。カーネルサイズは、カーネル110の各次元の(または、各カーネルフィルタの)サイズを示す。制御パターン生成器134は、この情報を用い、同じサイズおよび次元のカーネルに対して同じである制御パターン136を生成する。制御パターン生成器134は、制御パターン136の各位置についての値を、カーネルの次元のサイズだけでなく、その位置の座標(例えば、行番号、列番号)に基づいて生成する。各位置について、制御パターン生成器134は、1つまたは複数のテスト不等式(カーネルの次元の数に等しい)を実行する。各テスト不等式は、制御パターン136におけるその位置の行番号のモジュロ演算と、列番号のモジュロ演算との間の不等式である。テスト不等式の結果(すなわち、真または偽)は、制御パターンにおけるその位置についての値を生成すべく、制御パターン値の表を参照するために使用される。
【0033】
制御パターン生成器134は、プログラム方法を使用して、カーネルサイズ入力132に基づいて制御パターン136を生成するものとして、ここでは説明されているが、他の実施形態において、制御パターン生成器134は、メモリ、不揮発性記憶装置、プログラム命令スタック、または他のソースからの制御パターン136の予め生成されたバージョンにアクセスし、カーネルサイズ入力132に基づいて、このソースから正確な予め生成された制御パターン136を選択する。
【0034】
制御パターン136は、各出力値を生成するために拡張カーネル128のベクトルで(ドット積を使用して)乗算される、選択された値を生成すべく、乗加算ユニット140に対して、平滑化された入力ストリーム124のどの部分を選択するかを示す行列である。畳み込みの素朴な実装において、入力テンソル102上のある位置におけるカーネル110のストライドごとに、畳み込み演算は、(同じ位置にある)カーネル内の対応する値によって重み付けされるような、フォーカスポイント自体における値と共に、カーネルの現在のフォーカスを表す位置に隣接する値を加算することによって実行される。結果として得られる和は、そのフォーカスに対応する位置についての出力値である。したがって、フォーカス位置ごとに、入力テンソル102からの異なる値が、加算のために選択される。平滑化された入力ストリーム124が、異なるタイルに分割されるにつれて、各出力位置、および、特に、出力タイルにおける各出力位置は、出力タイルと同じ位置における入力タイルから、または隣接する入力タイルにおける入力値からの値を使用して計算される。したがって、制御パターン136は、乗加算ユニット140に対して、タイルにおける出力位置ごとに、畳み込み計算、すなわち、先に述べたドット積を実行するために入力値を引き出す、異なる特定の入力タイルを示す。具体的には、制御パターン136の各ベクトルは、出力タイルにおける異なる位置に対応しており、出力位置の値の計算のために入力値を選択する、入力行列からのタイルを示す。
【0035】
出力がタイルごとに生成されるにつれて、制御パターン136は、処理されている現在の出力タイルの位置に対応する位置を有する入力タイル、および処理されている現在の出力タイルに対して隣接する位置に対応する位置を有する入力タイルを示すだけでよい。例えば、入力テンソル102の2次元行列において、タイルは、処理されている現在の出力タイルに水平かつ垂直に隣接する。3次元行列では、これは、隣接する層にあるタイルを含んでもよい。より上位の次元の行列の場合、これは、「隣接する」さらなるタイルを含むことになる。したがって、制御パターン136によって示されるタイル位置の数は、入力行列の次元サイズの2の累乗である。制御パターン136のサイズは、カーネル110から生成される拡張カーネル128と同じサイズである。
【0036】
制御パターン136は、平滑化された入力ストリーム124内の各タイルのタイル番号に従ってタイルを示す。入力タイルに対して隣接するタイルは、必ずしもタイル番号において隣接するとは限らないので、制御パターン136内のインジケータは、タイル番号を介してタイルを直接示すのではなく、処理されている現在のタイルのタイル番号に関する相対的位置を介して示す。したがって、例えば、相対的位置は、現在のタイル、現在のタイルの下の(もしくは右側の)行(もしくは列)、または現在のタイルの背後の層を示すことができる。入力テンソル102の行列の幅/高さおよび深さは知られているので、相対的位置は、この情報に基づいて計算されることが可能である。例えば、現在のタイルの1行下にあるタイルは、現在のタイルに行列の幅を足したタイル番号となるであろう。したがって、制御パターン136は、そのようなタイルに対して行幅の値、またはポインタ、または行幅への参照を示してもよい。現在のタイルの1行下であって、1つ右側にあるタイルは、現在のタイル番号に、行幅を加え、1を加えることよって示されることになる。したがって、制御パターン136は、そのようなタイルに対して、行幅+1、または行幅+1のインジケータを示すことができる。1つの実施形態において、行幅は、上述したように変数Kである。インジケータのこれらの組み合わせの各々は、1つまたは複数のビットによって示されることができる。制御パターン136は、フラクタルパターンを有するので、制御パターン136の行列の各サブセクションは、単一の主要なビットによって示されてもよく、付加的なサブセクションは付加的なビットによって示され、そのサブセクション内の個々の値は第2のビットを有する。個々の値とその値が属するサブセクションとの組み合わせは、相対的タイル位置を示す。
【0037】
多様なカーネルフィルタ112の場合において、カーネルフィルタまたはサブフィルタカーネルが異なる次元を有するとき、多様な制御パターン136が選択されることができる。異なる次元のカーネルごとに、対応する制御パターン136が、上述した方法に従って選択され、または生成されることになる。対応する制御パターン136は、平滑化された入力ストリーム124の部分から値を選択するために使用されることになる。制御パターン136の生成およびその特徴に関する付加的な詳細は、
図11~
図13を参照して後述される。
【0038】
乗加算ユニット140は、平滑化された入力ストリーム124、拡張カーネル128、および制御パターン136を使用して最終的な計算を行って、出力アクティベーション142を生成する。上記である程度詳細に説明したように、乗加算ユニット140は、制御パターン136からのインジケータを使用して、平滑化された入力ストリーム124から値を選択する。制御パターン136内の各ベクトルは、上述したように、入力値にアクセスする、平滑化された入力ストリーム124からの特定のタイルを示す。制御パターン136内の各位置における識別子は、平滑化された入力ストリーム124のどのタイル、すなわち、どのベクトルから入力値を選択するかという表示に対応する。制御パターン136のベクトル内の位置は、正確な入力値を含有する平滑化された入力ストリーム124内の選択されたベクトルの位置にも対応する。制御パターン136のベクトル全体を解析することによって、乗加算ユニット140は、選択された入力値のベクトルを生成する。
【0039】
乗加算ユニット140は、平滑化された入力ストリーム124から値を選択するために使用された制御パターン136のベクトル(例えば、行番号または列番号)の位置とマッチングする、拡張カーネル128の対応するベクトルをさらに選択する。乗加算ユニット140は、拡張カーネル128の選択されたベクトルと、平滑化された入力ストリーム124の選択された値を含むベクトルとの間のドット積を行って、単一の出力値を生成する。単一の出力値は、現在処理されている入力タイルの位置とマッチングする出力タイルに配置される。さらに、出力タイル内の単一の出力値の位置は、その単一の出力値を生成するために使用される制御パターン136(または拡張カーネル128)内のベクトルの位置番号に対応する。
【0040】
乗加算ユニット140は、ここで説明されたプロセスを、制御パターン136(および拡張カーネル128)内のすべてのベクトルに対して繰り返し、したがって、出力タイル内の位置の数に等しい出力値の総数を生成する。これは、乗加算ユニット140が、入力テンソル102からの入力タイルごとに出力アクティベーション142の出力タイルを生成することを可能にする。乗加算ユニット140は、出力アクティベーション142のために同数の出力タイルを生成すべく、入力テンソル102のすべての入力タイルに対して、このプロセスをさらに繰り返す。出力タイルの全セットを生成した後、乗加算ユニット140は、出力タイルの完成したセットを出力アクティベーション142の最終出力として出力する。
【0041】
多様な入力チャネル104の場合には、乗加算ユニット140は、その入力チャネル104に対して指定されたカーネル110の特定のサブフィルタカーネルまたはカーネル構成要素を使用して、入力チャネル104ごとに「プレ出力」を生成する。各プレ出力は、上述した出力と同様に生成される。ただし、入力チャネルごとにすべてのプレ出力を生成した後、乗加算ユニット140は、プレ出力の値を単一の出力行列へと加算し、単一の出力行列は、出力アクティベーション142となってよい。
【0042】
多様なカーネルフィルタ112の場合には、乗加算ユニット140は、入力テンソル102に対して各カーネルフィルタ112をさらに適用し、多様な入力チャネル104がある場合、乗加算ユニット140は、上述したようにすべての入力チャネル104に対して各カーネルフィルタ112を適用し、プレ出力を加算する。これは、カーネルフィルタ112ごとに、別個の出力フィーチャ144を作成する。各出力フィーチャ144は、入力チャネル104と同じ大きさの行列である。すべての出力フィーチャ144の集合は、出力アクティベーション142を表し、ニューラルネットワークの次の層において入力チャネル104として使用されることができる(すなわち、1つの層の出力アクティベーション142は、ニューラルネットワークの次の層の入力テンソル102になる)。乗加算ユニット140に関する付加的な詳細は、
図14~
図17Bを参照して後述される。
【0043】
(例示的な畳み込み演算)
図2は、一実施形態による、カーネルによる2次元入力の畳み込みの例である。本明細書で説明される入力値202および出力値214は、行列を使用して表されるが、実際には、それらは、配列、フラットファイル、ツリー、または他の方法を使用して単純に表されてもよく、計算結果が同じである限り、行列として配置される必要はない。
【0044】
入力値202のセットに対して畳み込みを実行するために、パディングは、カーネルの「フォーカス」が入力値202のエッジにある値に対して適用されることができるように、入力値202に最初に適用されて、出力値214のサイズを入力値のサイズと同じにすることを可能にする。しかしながら、他の場合において、パディングは入力値202に適用されず、この場合には、出力値214のサイズは、入力202のサイズよりも小さい。入力値202のサイズと比較して、出力値214の各辺は、出力値214の辺と同じカーネルの辺において、カーネルのエッジとカーネルのフォーカスポイントとの間の要素の数に等しい要素の数だけ縮小される。入力値202のエッジは、概念的に、このエッジ上の値よりも行列の中心から遠い値が存在しないように、入力値202を表す行列の外側境界のまわりの位置である。上記のように、カーネルの(「起点」としても知られてよい)「フォーカス」は、カーネルの位置であり、カーネルの位置は、概念的に現在の出力ピクセルの上方にある。典型的には、それは、カーネル内の値/要素のうちの1つの位置に対応することとなり、例示される例における3×3カーネルなどの対称的なカーネルの場合、ため、フォーカスは通常、中心の要素である。
【0045】
したがって、出力値214の位置を入力値202の位置とマッチングさせるためには、入力値における第1の位置をストライドする場合のカーネルのフォーカスが、入力値202の行列上のエッジ値とマッチングする入力値202の位置上になる結果となるように、パディングが入力値に追加され、その後、生成された出力値214は、これらのエッジ値の位置にマッチングする位置を有する。これは、出力値214のサイズが入力値202のサイズと同じになることを保証する。
【0046】
したがって、例示される例において、幅1のパディング204は、入力値202を表す行列のエッジのまわりに追加される。ここで、パディングされた入力値202は、カーネル210のサイズの倍数であるサイズを有し、したがって、このサイズがカーネルのサイズの倍数となることを可能にするために付加的なパディングは必要とされない。
【0047】
パディングの後、カーネル210は、入力値202に対して適用される。カーネル210は、入力値202全体にわたってカーネル210をストライドさせること(すなわち、移動させること)によって適用される。カーネルは、ストライド値に応じて、入力値202上をストライドされる。ストライド値は、ストライドごとにカーネルをどのくらい遠くに移動させるかを決定する値である。この値が1である場合、カーネルのフォーカスは、入力値202のあらゆる可能な位置上にストライドされる。パディングに起因して、カーネル210は、パディングされた入力値202の境界をいかなる時も越えないが、カーネルのフォーカスは、入力値202の元の値の一つ一つと重なることができる。ストライド値が1を越える場合、カーネルのフォーカスは、入力値202のすべての値に適用されないことに留意されたい。
【0048】
カーネル210のフォーカスとなるすべての入力値について、畳み込み演算212は、概念的にカーネル210の下にある入力値202に対して実行される。したがって、例示される例において、カーネルのフォーカスは、選択された畳み込みポイント208である。ここでは、選択された畳み込みポイント208を囲む、太い黒線の正方形ボックス206によって例示されるように、カーネル210のサイズに等しく、選択された畳み込みポイント208を囲む、合計9つの値が選択されている。カーネル210のフォーカスがその中心になければ、このボックスは、ボックスの位置が、その対応するフォーカス位置を選択された畳み込みポイント208にするように、適切にシフトされることになる。例えば、フォーカスポイントが、カーネル210の左上角部にある場合、選択された畳み込みポイント208がボックスの左上角部となるように、ボックスは、1つ下に、および1つ右側にシフトされることになる。
【0049】
畳み込み演算212は、前述した境界ボックス206の下にある入力値202の各々を用い、ボックスの下の入力値202とカーネル210の値との間のドット積を行って、出力値214のうちの単一の出力値を生成する。例示されるように、カーネル210のフォーカスが、選択された畳み込みポイント208にある場合、この出力は、カーネル210および入力値202に対して「8」である。ここで、パディングおよび選択されたフォーカス位置に起因して、出力値の位置は、入力値202における選択された畳み込みポイント208の位置と同じである。
【0050】
次いで、カーネルは、入力値202における1つの位置上をストライドされ(水平または垂直のいずれか)、畳み込み演算212が繰り返される。カーネル212のフォーカスが、すべての可能な入力値202を訪れたときに、畳み込み演算212が完了する。これは、(パディングなしの)入力値と同じサイズを有する出力値の完了したセットを作成する。そのような畳み込み演算は、入力値が重み(カーネル)によって修正され、入力における他の値と組み合わされて、新しい出力を生成することを可能にする。
【0051】
数学的に、畳み込み演算は、次のように表されることができる。
【0052】
【0053】
ここで、Aはカーネルとすることができ、Bはカーネルとすることができ、cは畳み込み結果である。
【0054】
この畳み込み演算は、ニューラルネットワークが、複雑なデータを処理し、そのデータに基づいて所望の出力を生成することを可能にする。しかしながら、ここに示されたように、これは、カーネル210が入力値202上をストライドするにつれて、例示的な繰り返し読み取られる値218などの、同じ入力値を、複数回読み取らせる。入力値の単一の畳み込み期間中に、例示的な繰り返し読み取られる値218は、9つのカーネル位置がこの値と重複することになるので、例示される例では9回読み取られることになる。付加的なカーネルが、説明されるような入力値202に対して適用される場合、その同じ値218について、さらに多くの読み取りが繰り返されることになる。したがって、畳み込み演算212は、機械学習において強力なツールであるが、ここに示されるような素朴なアプローチにおいては、それは、潜在的に非常に多くの読み取り回数、すなわち、非常に多くの入出力操作を生成することがあり、このことは、入力値202が大きくなるにつれて、および畳み込みの回数が増加するにつれて、問題になることがある。したがって、本明細書で開示されるように、入力の値の繰り返される読み取り回数を著しく減らすことができる、より最適化されたアプローチが提供される。上記のように、読み取りの回数は、2s-1回の読み取りに低減されることが可能であり、ただし、sは、入力の次元の数である。したがって、ここでの例において、例示的な値218について上述したような各値についての9回の読み取りとは対照的に、入力値202の2次元行列については2回の読み取りだけが必要である。
【0055】
(平滑化された入力ストリーム生成)
図3は、一実施形態による、入力テンソルを平滑化する方法を例示するフロー
図300である。例示されるフロー図は、動作の順序を示してよいが、例示される動作は、任意の順序で実行されてもよく、より多数の動作またはより少数の動作を有してもよい。1つの実施形態において、
図3に例示される動作は、入力ストリーム生成器122によって実行されることができる。
【0056】
入力ストリーム生成器122は、カーネルによる畳み込みのために入力テンソルを受け取る310。この入力テンソルは、入力テンソル102であってよい。カーネルは、カーネル110であってよい。1つの実施形態において、カーネルを使用した入力テンソルの畳み込みの出力が、入力テンソルと同じサイズを有するように、入力ストリーム生成器122は、入力テンソルをパディング値によりパディングする。1つの実施形態において、パディング値を有する入力テンソルは、パディングされた入力テンソル次元ごとに、カーネルの対応する次元の整数倍のサイズを有する。また別の実施形態において、入力ストリーム生成器122は、入力テンソルの各次元のトレーリングエッジを、対応する次元におけるカーネルのサイズに等しい幅を有するパディング値によりパディングする。各次元のトレーリングエッジは、最大のインデックス値を有する入力テンソルの縁(すなわち、前面または他端部)である。パディング値は、ゼロもしくはヌル、または、何らかの他の値であってもよい。
【0057】
入力ストリーム生成器122は、各タイルがカーネルに等しいサイズを有する、1つまたは複数のタイルに入力テンソルを分割する320。したがって、カーネルが3×3カーネルである場合、9×9入力テンソル(パディングを含む)は、9枚の(2次元または2Dの)タイルに分割されることになる。同様に、3×3×3カーネルであれば、9×9×9入力テンソルは、27枚の(3次元または3Dの)タイルに分割されることになる。1つの実施形態において、カーネルは、正方形の次元を有しておらず、この場合には、入力ストリーム生成器122は、入力テンソルを横切るカーネルのストライドの方向にアラインされた順序で入力テンソルを分割する。したがって、カーネルが行優先アプローチで(左から右へ)ストライドされる場合、入力テンソルは、次の行に行く前に、各行に沿って分割されるなどである。あるいは、別の実施形態において、入力ストリーム生成器122は、入力テンソルを横切るカーネルのストライドの方向に対して直交する順序で入力テンソルを分割する。したがって、上記の例において、入力テンソルは、まず、各列に沿って(上から下へ、次いで、次の列へ)分割される。
【0058】
入力ストリーム生成器122は、平滑化された入力ストリームを生成するために、1つまたは複数のタイル内の値をベクトルへと平滑化する330。これは、入力テンソルの1つまたは複数のタイルの各々について、タイルの値に定義された順序でアクセスすること、定義された順序に従ってベクトル内の値を配置すること、および、1つまたは複数のタイルの各々に対応する1つまたは複数のベクトルを平行な配置に配置して、平滑化された入力ストリームを生成することを含んでよい。この定義された順序は、行優先順序、列優先順序、またはアイル優先順序であってもよい。アイル優先順序は、3次元(3D)のタイル内の要素に、まず、3Dタイルの深さに対応する軸に沿ってアクセスし、その後、3Dタイルの幅および高さに対応する軸に沿ってアクセスする。平滑化された入力は、ここでは2次元であるものとして示されているが、他の実施形態では、それは、より多くの次元を含む。
【0059】
平滑化された入力ストリームは、バッファ内に記憶されることができる。バッファは、本明細書で説明されるように、1)制御パターンによって選択されるような、平滑化された入力ストリーム内の値と、2)カーネルの拡張とを用いて乗加算演算を行って、入力テンソルの値をバッファ内へ複数回ロードすることなく、畳み込み演算の出力を生成するために、ハードウェアアクセラレーテッドプロセッサによって読み取られることが可能である。
【0060】
また、入力テンソルは、複数のチャネルを有し、カーネルは、複数のフィルタを有し、入力チャネルは、各カーネルフィルタを用いて畳み込まれて、複数の出力チャネルを有する出力が生成される。
【0061】
入力ストリームを平滑化する付加的な例は、異なる次元のカーネルについての
図4、
図5A~
図5C、および
図6A~
図6Bに関して、以下に提供される。
【0062】
図4は、一実施形態による、1次元カーネルの場合における入力テンソルの平滑化の例400を例示する。1つの実施形態において、ここで説明されるプロセスは、入力ストリーム生成器122によって実行されることができる。
【0063】
401において、入力ストリーム生成器122は、入力420を受け取る。例示される例において、入力420は、行列として表される6×3セットの入力値である。402において、入力ストリーム生成器122は、カーネルサイズに基づいて、入力420をパディングする。入力ストリーム生成器122は、前述したように、同じサイズの出力を生成すべく、カーネル422のフォーカス(これは中心値bである)が入力420の同じ位置に対応するように、入力420をパディングする。これは、入力ストリーム生成器122に、パディング426Aを追加させる。入力ストリーム生成器122は、入力420を、それがカーネルサイズの倍数(モジュロ)となるようにもパディングする。これは、パディング426Bにおいて2列のパディングを追加する。最後に、1つの実施形態において、ハードウェア要件に起因して、入力ストリーム生成器122は、入力420のトレーリングエッジを、カーネルの幅に等しいパディングを用いてパディングする。ここで、カーネル422は、3の幅であり、そのため、3の幅のパディングが、入力420の端部に追加され、パディング426Cにおける3つの付加的な列のパディングという結果になる。
【0064】
403において、入力ストリーム生成器122は、既にパディングされた入力424を、カーネル422に等しいサイズを有するタイルに分割して、タイル化された入力428を作成する。カーネルは、3×1サイズの行列であるので、パディングされた入力424は、各々がサイズ3×1であるタイルに分割される。これは、12枚のタイルという結果になる。ここで、タイルは、パディングされた入力424が行ごとに分割されるように、行優先の形式で分割され、順序付けられる。ただし、タイルは列ごとに分割されることも可能であり、その場合には、タイル1は[0、0、0]となり、タイル2は[1、7、13]となる。後続の動作も同じ向きに従う限り、結果として生じる出力は同一になる。
【0065】
404において、入力ストリーム生成器122は、タイル化された入力428を平滑化された入力430に変換する。ここで、入力432の方向は、平滑化された入力430が次のステップ(乗加算ユニット140)へ入力される方向を示す。したがって、タイル1が最初に配置され、その後にタイル2が配置され、タイル12まで配置される。各タイルは、単一のベクトルに変換され、その他のタイルから変換されるその他のベクトルと平行に配置される。ここでのタイルは既にベクトルであるので、付加的な変換は生じない。しかしながら、後続の例において示されるように、タイルは必ずしもベクトルとは限らず、そのような場合には、それらはベクトルになるように平滑化される。
【0066】
この平滑化された入力430は、配列、ツリー、または他の構造として記憶されてもよく、バッファ、メモリまたは他の記憶媒体に記憶されてもよい。タイル内の値の各々は、基準ポインタを使用して、メモリアドレスを使用して、またはクロックサイクル遅延に応じて、アクセスされることができる。クロックサイクル遅延の場合において、平滑化された入力430は、一度に1つのベクトルにおいて読み取られてもよく、異なる読み取りは、平滑化された入力430における異なるベクトルにアクセスすべく、一定のクロックサイクル数だけ遅延されることが可能である。例えば、タイル7は、7つのクロックサイクルだけアクセスを遅延させることによってアクセスされることができる。
【0067】
図5Aは、一実施形態による、2次元カーネルの場合において入力テンソルを平滑化する例500の第1の部分を例示する。
図4の例とは対照的に、
図5A~
図5Bでは、2次元カーネルが使用され、2次元のタイルという結果になる。1つの実施形態において、プロセスは、入力ストリーム生成器122によって実行されることができる。
【0068】
501において、入力ストリーム生成器122は、入力を受け取り、それをカーネルサイズに基づいてパディングして、パディングされた入力520を生成する。前述したように、パディングは、3つの要件、すなわち、1)出力値が入力値と同じサイズとなることを可能にするために、パディングは、カーネルのフォーカスポイントに基づいて追加されてもよいこと、2)入力は、それがカーネルサイズのモジュロとなるように、さらにパディングされてもよいこと、および、3)ハードウェア要件に起因して、一定の実施形態では、パディングの付加的なカーネル幅が、入力のトレーリングエッジに追加されること、を満たす。
【0069】
したがって、例示される例において、パディングのベクトル幅は、入力の外部に追加され、パディングの付加的なカーネル幅は、入力の右側および底部側(トレーリングエッジ)に追加される。カーネル522は、3×3カーネルであるので、付加的なパディングは、右側では3ユニットの幅であり、底部では3ユニットの高さである。
【0070】
502において、入力ストリーム生成器122は、パディングされた入力520を、カーネルに等しいサイズのタイルに分割する。カーネルは3×3であるので、各タイルは、したがってサイズが3×3である。これは、タイル化された入力524を作成する。タイル化された入力524の行サイズは、変数Kを使用して示され、変数Kは、続いて、処理されているタイルからの第2の行内のタイルにインデックス付けするために使用される。したがって、タイル化された入力524の第2の行上の第1のタイルは、タイル1+Kであり、一方で、この右側のタイルは、タイル1+K+1である。第1のタイルが「0」からインデックス付けされる場合、Kは、行タイルサイズの代わりに、[行タイルサイズ]+1に設定されることになることに留意されたい。
【0071】
プロセスは、
図5Bにおいてさらに説明され、
図5Bは、一実施形態による、2次元カーネルの場合において入力テンソルを平滑化する例の第2の部分を例示する。
【0072】
503において、入力ストリーム生成器122は、画像内のタイルを、特定のタイル順序に従ってベクトルに平滑化する。ここで、平滑化順序は、単一のタイル530の例についての平滑化順序532によって示されるような行優先である。言いかえれば、タイルごとに、そのタイル内の値は、方向矢印によって示されるように、行ごとに読み取られ、平滑化された入力528においてそのタイルについてのベクトル内に配置される。このベクトルは、平滑化された入力430についてのベクトルのように、その他のタイルについて生成されるベクトルに平行に(同じ平滑化順序に従って)配置され、入力の方向534に従って乗加算ユニット140への入力として使用される。ベクトルは垂直なものとして示されているが、向きは、他の実施形態では異なるものとすることができる。
【0073】
別の実施形態において、平滑化順序538は、代わりに列優先であり、各タイル内の値が列ごとに読み取られ、次いで、単一のベクトル内に配置され、パディングされた入力のその他のタイルから生成される他のベクトルに平行に配置されることを意味する。したがって、タイル1についてのベクトルが[0、0、0、0、1、2、0、11、12]に順序付けられる平滑化された入力528とは対照的に、ここでは、タイル1内の値が、行ごとの代わりに列ごと読み取られるので、タイル1についてのベクトルは、代わりに、[0、0、0、0、1、11、0、2、12]に順序付けられる。厳密な平滑化順序538は、出力値の生成におけるその他のプロセスの順序が同じ順序付けに対応する限り、出力に影響しない。
【0074】
図5Cは、一実施形態による、多様な入力チャネルについての入力テンソルを平滑化する例を例示する。1つの実施形態において、入力テンソル102は、
図1において説明されたように、多様な入力チャネル104A~104Nを有してもよい。多様な入力チャネルは、カーネルを用いて畳み込まれる。カーネルを用いたこれらの畳み込みの出力は、共に加算されて、出力アクティベーションが生成される。カーネル内に多様なカーネルフィルタがある場合、各カーネルフィルタは、多様な入力チャネルを用いて畳み込まれて、出力フィーチャが生成される。各入力チャネルは、色チャネル等などの、入力の異なる構成要素に対応することができる。1つの実施形態において、プロセスは、入力ストリーム生成器122によって実行されることができる。
【0075】
504において、入力ストリーム生成器122は、第1の平滑化された入力を用いて任意の付加的な入力チャネルをタイル化する。分かりやすくするために、カーネル542は2×2カーネルとして示されている。したがって、各タイルは2×2であり、各ベクトルは1×4ベクトルである。ここで、各入力チャネル540A(一般に入力チャネル540)は、501からの入力に類似しており、したがって、入力ストリーム生成器122は、各入力チャネル540をパディングし、それを平滑化し、平滑化された入力チャネル544A~544Nを生成する。1つの実施形態において、これらは、次いで、互いに「積み重ねられて」、平滑化された入力ストリーム546が生成される。しかしながら、他の実施形態では、それらは、異なった様式で、例えば、連結、3D配列での配置などを介して組み合わされてもよい。これらの場合のいずれにおいても、平滑化された入力ストリーム546は、様々な平滑化された入力チャネル544の組み合わせであり、平滑化された入力チャネル544の各々の対応するタイルは、平滑化された入力ストリーム546において共に参照されてもよい。したがって、例えば、(遅延クロックサイクルであれ、または他の手段であれ)平滑化された入力ストリーム546を用いたタイル5への参照は、平滑化された入力ストリーム546を構成するすべての平滑化された入力チャネル544においてタイル5を参照することができるであろう。
【0076】
図6Aは、一実施形態による、3次元カーネルの場合において入力テンソルを平滑化する例の第1の部分を例示する。
図4~
図5Cと同様に、1つの実施形態において、ここで説明されるプロセスは、入力ストリーム生成器122によって実行されることができる。
【0077】
601において、入力ストリーム生成器122は、3次元入力を受け取り、
図4~
図5Cを参照して上述した方法と同様に、この入力をパディングして、パディングされた入力626を生成する。分かりやすくするために、単一幅のパディング628のみが、ここでは示されている。また、分かりやすいように、実際の入力値630は、それらが透視表現において重複することになるので、ここでは示されない。代わりに、パディング628の値は、濃い灰色パターンを用いて立方体として示され、入力値630は、白い立方体として示される。同じことは、カーネル632およびカーネル値は634に当てはまる。パディングされた入力626は、3つの次元106、すなわち、次元1 106A、次元2 106B、および次元3 106Cを有することに留意されたい。いくつかの場合において、次元1は幅として、次元2は高さとして、次元3は深さとして参照されてもよい。さらに、次元1は列を有するものとして、次元2は行を有するものとして、次元3はアイルまたは層を有するものとして参照されてもよい。
【0078】
602において、入力ストリーム生成器122は、パディングされた入力626を、カーネル632に等しいサイズを有するタイルにタイル化して、タイル入力626を生成する。例示的なカーネル632は、サイズ2×2×2であり、3次元行列によって表されることができるので、タイルもサイズ2×2×2である。タイル化された入力の行内のタイルの数を示すK変数636に加えて、3次元入力は、タイル化された入力の層内のタイルの数を示すM変数も含む。現在のタイルに対応する位置を有する出力値を計算する場合、入力は、(2D入力の場合と同様に)現在のタイルの下のタイルだけでなく、現在のタイルの1つ後ろの層であるタイルから必要となることがある。したがって、現在のタイルの下にあるタイルのロケーションを示すために使用されることが可能であるKパラメータに加えて、Mパラメータが、現在のタイルの後ろにあるタイルを示すために使用されることが可能である。下および後ろなどの方向に対して参照が行われているが、実際には、入力タイルは、ここで示されたように幾何学的に配置されなくてもよく、データ構造において抽象的に示されてもよい。しかしながら、同じKパラメータおよびMパラメータが適用される。パディングされた入力626は、6の幅および6の高さを有しており、カーネルの2×2個の層が、パディングされた入力626の6×6個の層に9回均等に分割するので、タイルの各層は、9つのタイルを含む。したがって、例示される例において、Mパラメータは9であり、Kパラメータは3である。
【0079】
プロセスは、
図6Bに続き、一実施形態による、3次元カーネルの場合において入力テンソルを平滑化する例の第2の部分を例示する。ここで、603において、入力ストリーム生成器122は、各タイルを例示的な平滑化順序640に従ってベクトルへ平滑化し、
図4および
図5Bを参照して上述したプロセスと同様に、ベクトルを互いに平行に配置する。単一タイルは、今やサイズ2×2×2であるので、それは8つの値を含む。ある順序が確立され、それにより、これらの8つの値が、この順序に従って読み取られ、単一のベクトル内に並べられる。ここで、例示的な平滑化順序640は、単一のタイルを、まず、行ごとに(行優先で)読み取り、次いで、各層/アイルを(アイル優先で)読み取る。この順序は、単一のタイルの分解図を示す、例示的な平滑化順序640において、太字のイタリック体の数字によって示されている。したがって、「1」によって示されるタイル位置における値が最初に読み取られ、「2」によって示されるタイル位置における値が次に読み取られるなどし、「8」によって示されるタイル位置における値で終了する。タイルのサイズに応じて、異なる順序付けが確立されることが可能である。先の順序付けと同様に、順序付けが全プロセスにわたって一貫している限り、出力値は、使用される順序付けに関わらず、同じになるであろう。
【0080】
入力ストリーム生成器122によるこの平滑化の結果は、平滑化された入力642である。例示的な平滑化順序640は、平滑化された入力の各ベクトルにおいて順序644で示される。したがって、ベクトルごとに、順序644によって示されるような「1」の位置は、そのタイルについての例示的な平滑化順序640の「1」の位置にある、対応するタイルの位置からの値を有する。ここで、
図6Aと同様に、濃い灰色のエリアは、パディング値を示し、白いエリアは、入力値を示す。例えば、
図6Aにおけるタイル3は、4つの入力値および4つのパディング値を含む。例示的な平滑化順序640に従った後、これは、入力値とパディング値とが交互に繰り返される、平滑化された入力642においてタイル番号3で示されるベクトルに変換される。
図4および
図5Bにおける平滑化された入力と同様に、この平滑化された入力は、出力値を生成するためのさらなる処理のために、乗加算ユニット140へ送信される。
【0081】
(拡張カーネル生成)
図7は、一実施形態による、拡張カーネルを生成する方法を例示するフロー
図700である。例示されるフロー図は、動作の順序を示してもよいが、例示される動作は、任意の順序で実行されてもよく、より多数の動作またはより少数の動作を有してもよい。1つの実施形態において、
図7に例示される動作は、拡張カーネル生成器126によって実行されることができる。
【0082】
拡張カーネル生成器126は、入力テンソルを畳み込むために使用されるカーネルを受け取る710。このカーネルは、カーネル110としてよい。カーネルの第1の(最小の)次元について、拡張カーネル生成器126は、カーネルの単一次元ベクトルごとに、その単一次元ベクトルのすべてのローテーションを含む、値の正方形ブロック(巡回行列)を生成する。ここでの各単一次元ベクトルは、カーネルの行、カーネルの列、カーネルの対角線、またはカーネルのアイルである、一意のベクトルである。カーネルのアイルは、カーネルの深さ(この場合には、第3の次元)に対応する軸に沿ってアラインされたカーネルのベクトルである。
【0083】
カーネル110が、多様なカーネルフィルタ112を有する場合、各カーネルフィルタは、本明細書で例示されるフロー図に従って別々に処理される。各カーネルフィルタが、サブフィルタカーネルを含む場合、そのサブフィルタカーネルも、フロー図に従って別々に処理される。ここでは次元が「第1の」または「最小」のものとして称されるが、カーネルの次元が特定の順序またはサイズ関係を有することを示すようには意図されていない。代わりに、カーネルの任意の次元が、第1の次元として選択されてよい。例えば、
図6Aの3次元カーネルにおいて、X軸620(X次元)、Y軸622(Y次元)、またはZ軸624(Z次元)に沿った次元のいずれかが、第1の次元として選択されてもよい。
【0084】
同様に、単一チャネルの入力テンソルまたは多様なチャネルの入力テンソルのいずれかを用いて畳み込まれたカーネルは、単一の出力チャネルを生成する。カーネルが、多様なフィルタを含む場合、各フィルタが入力テンソルに対して適用されて、別個の出力アクティベーションが生成される。
【0085】
第1の次元を処理すると、拡張カーネル生成器126は、カーネルの付加的な次元ごとに、直前の次元のブロックをブロックのセットにグループ化し740、ブロックの各セットは、(付加的な)次元の軸に平行なベクトルに沿ってアラインされる、直前の次元のブロックを含む。次元の軸に平行なベクトルは、現在処理されている次元の軸に平行なベクトルである。したがって、上記の例を使用して、X次元が第1の次元である場合、処理される次の次元は、Y次元(ただし、それはZ次元であってもよい)であってよい。Y次元に沿って、Y軸に平行であり、かつ、先行する次元からのブロックにアラインされる、1つまたは複数のベクトルが描かれてよい。これは、先行する次元(X次元)において4つのブロックが生成され、これらの各々が、それらが生成された同じロケーションに概念的に「配置される」場合、ブロックの2つの「列」を形成するからである。これらの「列」の各々は、Y軸に平行なベクトルにアラインされ、またはY軸に平行なベクトルを通過する。アラインされたブロックは、共にグループ化される。
【0086】
付加的な次元について、拡張カーネル生成器126は、値の1つまたは複数のブロックをさらに生成し750、各ブロックは、直前の次元のブロックのセットの各々内のブロックのすべてのローテーションを含む。したがって、上記の例において、ブロックの各列は、その列内のブロックを回転させて、値の新しい正方形ブロックを生成する。これは、Y次元についての値の2つの正方形ブロックという結果になる。ベクトルまたはブロックのセットを回転させるために、拡張カーネル生成器126は、行内の値を回転させて(例えば、値をバレルシフトさせて)、またはセット内のブロックを回転させて、ローテーションごとに新しいベクトルまたはブロックの順序付けを生成する。一旦すべての可能なローテーションが生成されると、ベクトルまたはブロックの順序付けの生成された組み合わせは、共に「積み重ねられて」、基礎をなすベクトルまたはブロックの基礎をなすセットのすべてのローテーションを含む出力ブロックを生成する。
【0087】
この例を続けると、次の次元、すなわち、Z次元を処理する場合、ベクトルはZ軸に平行である。この場合には、2つのブロック各々の先行する2つの「列」のローテーションから、2つのブロックが生成された。したがって、これらの2つのブロックは、それらがベクトルにアラインされるように「配置される」につれて、回転される。このベクトルを通過しないブロックは他に存在せず、したがって、必要とされるのは1つだけである。しかしながら、カーネルが、より高い次元を有する(すなわち、3次元よりも多い)場合には、このベクトルにアラインしないこととなる付加的なブロックがあってよく、付加的なベクトルは、付加ブロックをグループ化するために必要である。
【0088】
すべての次元が処理された場合、拡張カーネル生成器126は、カーネルの付加的な次元における最後の次元に対応する値のブロックを拡張カーネルとして出力する760。先の例を使用すると、Y次元からの2つのブロックを回転させた後には、単一のブロックが残る。このブロックは、拡張カーネルとして出力される。
【0089】
したがって、例におけるように、3次元カーネルは、第1のベクトルのセットを含む拡張カーネルを有するので、各第1のベクトルは、第1のブロックのグループにおける第1のブロックの回転置換を有する。第1のブロックのグループの各第1のブロックは、第2のベクトルのセットの第2のベクトルに対応し、各第2のベクトルは、第2のブロックのグループの第2のブロックに対応する。第2のブロックのグループの各第2のブロックは、カーネル内のベクトル(カーネルベクトル)に対応し、各第2のブロックは、その第2のブロックの対応するカーネルベクトルのすべての回転置換を表す第3のベクトルのセットを有し、各第3のベクトルは、対応するカーネルベクトルの1つの回転置換を表す。ここで、第2のベクトルの各セットは、第2のブロックの対応するグループにおける第2のブロックのすべての回転置換を含む。また、第1のベクトルのセットは、第1のブロックのグループの第1のブロックのすべての回転置換を含む。
【0090】
1つの実施形態において、例におけるような3次元カーネルとする代わりに、カーネルは、1次元(1D)の行列であり、拡張カーネルは、複数の平行なベクトルを含み、複数の平行なベクトルの各ベクトルは、カーネルの異なる回転置換である。ここで、拡張カーネルは、各次元のサイズがカーネルのサイズに等しい正方行列である。
【0091】
別の実施形態において、カーネルは、2次元(2D)の行列であり、したがって、拡張カーネルは、第1のベクトルのセットを含み、各第1のベクトルは、ブロックのグループ内のブロックの回転置換を有する。ブロックのグループの各ブロックは、カーネル内のベクトル(カーネルベクトル)に対応し、各ブロックは、対応するカーネルベクトルのすべての回転置換を表す第2のベクトルのセットを有する。各第2のベクトルは、対応するカーネルベクトルの1つの回転置換を表し、第1のベクトルのセットは、ブロックのグループのブロックのすべての回転置換を含む。
【0092】
拡張カーネルは、一旦生成されると、拡張カーネルを生成するために使用される、対応するカーネルの次元のサイズの積に等しい長さを有する、2次元の正方行列である。1次元カーネル、2次元カーネル、および3次元カーネルのための拡張カーネルの生成についての付加的な例は、
図8、
図9A~
図9C、および
図10A~
図10Cを参照して後述される。
【0093】
図8は、一実施形態による、1次元カーネルの場合において拡張カーネルを生成する例800を例示する。1つの実施形態において、ここで説明されるプロセスは、拡張カーネル生成器126によって実行されることができる。
【0094】
801において、拡張カーネル生成器126は、カーネル820を受け取る。例示される例において、カーネル820は、3×1のサイズを有する(小文字はカーネル値を表す)。したがって、それは1次元カーネルである。
図7において上述したプロセスに続いて、802において、拡張カーネル生成器126は、カーネル820の各単一次元ベクトルを回転させる。カーネル820は、[a、b、c]という単一のベクトルしか有しないので、このベクトルのみが回転するために使用可能である。このベクトルを回転させることは、合計3つの組み合わせ、すなわち、元のカーネル820において示される組み合わせ([a、b、c])、ならびにローテーション822の組み合わせ([c、a、b]およびローテーション824の組み合わせ[b、c、a])を生成する。ローテーションが生成される方法は、802において示される矢印によって示される。これらの組み合わせは、共にグループ化されて、巡回行列が形成される。803においては、処理するカーネル820の付加的な次元がないので、拡張カーネル生成器126は、ローテーション期間中に生成されたグループ化されたベクトルを拡張カーネル826として出力する。
【0095】
拡張カーネルは、カーネルの様々なローテーションを含むので、拡張カーネルの異なる行は、制御パターン(例えば、制御パターン136)によって選択されるような、平滑化された入力ストリームのタイルに対するドット積において使用されることが可能である。入力における単一の値上で元のカーネルを複数回ストライドさせる代わりに、ここでのカーネルは、カーネル内の要素の数に等しい入力を読み取ることを必要とせずに、それが平滑化された入力ストリームに対して上述した2s-1回適用することができるように拡張される。拡張カーネルは、もっともらしい入力テンソル102よりサイズにおいてはるかに小さいので、入力テンソルの値を複数回読み取るよりも、ここで説明されるプロセスにおいてカーネルを拡張するほうが、はるかに効率的である。
【0096】
図9Aは、一実施形態による、異なる2次元カーネルのための拡張カーネルを生成する例を例示する。
図8と同様に、1つの実施形態において、ここで説明されるプロセスは、拡張カーネル生成器126によって実行されることができる。
【0097】
901において、拡張カーネル生成器126は、カーネルを受け取る。2次元のカーネルの3つの例920A~920Cは、ここでは異なるサイズを有して示されている。カーネル920Aはサイズ3×2であり、カーネル920Bはサイズ2×3であり、カーネル920Cはサイズ3×3である。902Aにおいて、カーネル920の単一次元ベクトルは、行優先順序を使用して、カーネルローテーション922A~922Cにおいて回転され、すなわち、単一次元ベクトルは、回転されるカーネルの行に対応する。図示されるように、カーネルのサイズに応じて、単一次元ベクトルの数は異なる。例えば、3つの行を有するカーネル920Bは、カーネルローテーション922Bにおいて3つのセットのローテーションを有し、一方で、カーネル920Aは、2つのセットのローテーションのみを有する。
【0098】
903Aにおいて、付加的な次元、すなわち、第2の次元が回転される。ここで、
図7において述べたように、第2の次元の軸にアラインするベクトルが選択され、各ベクトルを通過するそれらのブロックは、共に回転される。カーネル920Aの例においては、2つのブロック926A~926Bがカーネルローテーション922Aにおいて生成され、これらは、第2の次元の軸に沿った単一ベクトルにアラインされる。ブロック926Aは、行[a、b、c]のローテーションを組み合わせることから生成され、ブロック926Bは、行[d、e、f]のローテーションを組み合わせることから生成される。これらの2つのブロックは、カーネルローテーション924Aにおいて回転されて、拡張カーネル932Aが生成される。カーネル内にはそれ以上の次元がないので、さらなるローテーションはない。
【0099】
同様のプロセスは、カーネル920Bについて実行される。しかしながら、今回は、3つのブロック928A~928Cがある。したがって、カーネルローテーション924Bにおいて、3つのブロック928A~928Cが回転され、組み合わされて、拡張カーネル932Bが生成される。カーネル920Cの場合には、(カーネル920Cは3つの行を有するので)3つのブロック930A~930Cが、カーネルローテーション922Cにおいても生成された。これらのブロック930A~930Cは、カーネルローテーション924Cにおいて第2の次元において回転されて、拡張カーネル932Cが生成される。各拡張カーネルは、両方の次元(例えば、正方行列)に沿って等しいサイズを有し、各次元に沿ったサイズは、カーネルの次元の各々のサイズの積に等しい。例えば、カーネル920Bは、サイズ3×2を有し、したがって、その拡張カーネル932Bの各次元のサイズは、3*2=6である。
【0100】
図9Bは、一実施形態による、列優先拡張を使用して拡張カーネルを生成する例を例示する。
図9Aのように行優先順序を使用する代わりに、ここで例示される例は、列優先順序を使用する。
【0101】
902Bにおいて、拡張カーネル生成器126は、カーネル920Cを用い、各単一次元ベクトルを回転させる。ただし、代わりに、単一次元ベクトルが、カーネル920Cの列として選択される。したがって、値[a、b、c]を有するベクトルの代わりに、ここで示される第1のベクトルは、値[a、d、g]を有し、図においてラベル付けされているように列1に対応する。残りの2つのベクトルは、ラベル付けされているように列2および3に対応する。
【0102】
903Aにおいて、ブロック938A~938Cに形成される、902Bからの回転されたベクトルは、カーネルローテーション936において回転され、これは、
図9Aに示されるカーネルローテーション924と同様である。これは、拡張カーネル940を生成し、拡張カーネル940は、同じカーネルを使用するにもかかわらず、拡張カーネル932Cと異なる。しかしながら、制御パターンも、この列優先順序を考察して生成される場合、畳み込みが適用された後に、出力値は異ならない。
【0103】
図9Cは、一実施形態による、多様なカーネルフィルタの場合において拡張カーネルを生成する例を例示する。カーネルが、多様なカーネル「フィルタ」を有する場合、各カーネルフィルタは、単一のカーネルについて前述したのと同じ方法で拡張される。各フィルタが、さらなるサブフィルタカーネルを有する場合、これらも同じ方法で拡張される。したがって、カーネルフィルタ942A~942Nは、例示されるような拡張カーネルフィルタ944A~944Nへ拡張される。
【0104】
図10Aは、一実施形態による、3次元カーネルの場合において拡張カーネルを生成する例1000の第1の部分を例示する。
図8および
図9A~
図9Cと同様に、1つの実施形態において、ここで説明されるプロセスは、拡張カーネル生成器126によって実行されることができる。
【0105】
1001において、拡張カーネル生成器126は、カーネル1026を受け取る。図示される分解図において、カーネル1026は、層1028Aおよび層1028Bを有することが分かる。各層は、異なるカーネル値「a」~「h」を有し、2×2×2カーネル1026について8つの値という結果になる。
【0106】
1002において、拡張カーネル生成器126は、(この例では、行優先順序を使用して)カーネル1026のすべての単一次元ベクトルを回転させる。カーネル1026には、各層1028に2つずつ、カーネル1026における4つの行に対応する、これらが4つある。したがって、4セットの回転が、カーネルローテーション1030を生成する[または:???によって生成される]。
【0107】
1003Aにおいて、拡張カーネル生成器126は、カーネルローテーション1030において生成されたブロックをグループ化することによって、第2の次元(すなわち、次の次元)を回転させる。ここで、処理されている現在の次元(すなわち、第2の次元)の軸に平行なベクトルに沿ってアラインする、カーネルローテーション1030からのブロックは、共にグループ化される。ここで、セット1034Aを形成するブロックは、第2の次元軸、すなわち、Y軸1022に平行なベクトル(すなわち、ベクトル1032A)に沿ってアラインする。セット1032A内のそれらからの別個の層上にあった値から形成された、セット1034Bを形成するブロックも、第2の次元軸に平行なベクトル(すなわち、ベクトル1032B)に沿ってアラインされる。
【0108】
2つのベクトルがここでは描かれているが、それらは、どのようにブロックがグループ化されるかの背後にある概念的な理由付けを示すために提示される。実際には、ベクトルは描かれず、拡張カーネル生成器126は、これらのブロックを、それらが生成された次元のインデックスを決定することによってグループ化する。例えば、セット1034Aのブロックは、層1028A(「0」のインデックスを有してよい)から生成され、セット1034Bのブロックは、層1028Bから生成される。したがって、拡張カーネル生成器126は、これらの異なる層から別々に生成されたブロックを回転させることを知っている。このプロセスは、現在の次元のインデックス値を先行する次元において生成されたブロックをグループ化するために使用して、後続の次元で繰り返される。
【0109】
このプロセスは、
図10Bに続き、一実施形態による、3次元カーネルの場合において拡張カーネルを生成する例の第2の部分を例示する。
【0110】
ここで、1003Bにおいて、拡張カーネル生成器126は、セット1034A~1034Bへグループ化された、先行する生成からのブロックのローテーションを生成する。各セットのブロックは、別々に回転される。図示されるように、これは2つのブロック、すなわち、セット1034Aの2つのブロックのローテーションから生成されるブロックと、セット1034Bの2つのブロックから生成されるブロックとを生成する。
【0111】
1004Aにおいて、拡張カーネル生成器126は、次の次元、すなわち、3次元カーネル1026の最後の次元でもある第3の次元を除いて、ステップ1003Aを繰り返す。ここで、拡張カーネル生成器126は、次元の軸にアラインされたベクトルに沿ってブロックをグループ化する。例示されるようなこのベクトルは、ベクトル1040であり、軸は、Z軸1024である。1003Bにおいて生成されたブロックの各々は、カーネルの異なる層上のブロックから生成されたものであり、したがって、1003Bにおいて生成されたブロックも同様に概念的に異なる層上にある。ベクトル1040は、生成された両方のブロックとアラインし(すなわち、両方のブロックを通過することができ)、したがって、これらのブロックは、セット1038Aへグループ化される。他にグループ化するブロックはないので、これは第3の次元についての唯一のセットである。
【0112】
プロセスは、
図10Cに続き、一実施形態による、3次元カーネルの場合において拡張カーネルを生成する例の第3の部分を例示する。ここで、1004Bにおいて、拡張カーネル生成器126は、先行する次元を処理するときに生成されたブロックのセット内のブロックについて、すべてのローテーションを生成する。例示される例においては、1つのセット1038Aのみが存在し、したがって、これはカーネル1026の次元のうちの最後の次元であるので、このセット内のブロックが回転されて、最終的な拡張カーネル1044が生成される。
【0113】
(制御パターン生成)
図11は、一実施形態による、制御パターンを生成する方法を例示するフロー
図1100である。例示されるフロー図は、動作の順序を示してよいが、例示される動作は、任意の順序で実行されてもよく、より多数の動作またはより少数の動作を有してもよい。1つの実施形態において、
図7に示される動作は、制御パターン生成器134によって実行されることができる。
【0114】
制御パターン生成器134は、出力アクティベーションを生成するために入力テンソルを用いて畳み込まれるカーネルの次元の各々の1つまたは複数のサイズを受け取る1110。このカーネルは、
図1におけるカーネル110としてよい。カーネルは、1次元、2次元、3次元、またはそれ以上であってもよい。カーネルの各次元は、サイズを有し、これは、制御パターン生成器134によって受け取られる。
【0115】
1120において、制御パターンの位置ごとに、制御パターン生成器134は、その位置についての、制御パターン内の位置のロケーションと、カーネルの次元の各々の1つまたは複数のサイズとに基づく値を生成する1130。
【0116】
一旦すべての位置における値が生成されると、制御パターン生成器134は、完成した制御パターン正方行列を出力する1140。制御パターンの各次元は、カーネルの幅および高さの積に等しいサイズである。また、制御パターンの各位置の値は、カーネルを用いた畳み込みのために平滑化された入力テンソルからの値にアクセスするロケーションを示す。
【0117】
1つの実施形態において、制御パターンの各位置は、行番号および列番号を有し、各値の生成は、カーネルの次元ごとに、行番号、列番号、およびカーネルの次元の各々の1つまたは複数のサイズに基づいたテストの結果を決定することを含む。各テストは、平滑化された入力ストリームからの値にアクセスする相対的オフセットの量を示すバイナリ出力を生成し、これは、上述したように、入力テンソルのカーネルサイズのタイルを平滑化することによって入力テンソルから生成される。制御パターンのその位置についての値は、カーネルの各次元についてのテストのバイナリ出力の組み合わせとして生成される。各テストは、位置の行番号を使用する第1のモジュロ計算と、位置の列番号を使用する第2のモジュロ計算とを比較する不等式テストであってよい。第1のモジュロ計算は、行番号とカーネルの次元の各々についての1つまたは複数のサイズとの間のモジュロである。第2のモジュロ計算は、列番号とカーネルの次元の各々についての1つまたは複数のサイズとの間のモジュロである。2次元カーネルの場合において、第1のテストは、r mod h<c mod wであり、第2のテストは、floor((r mod(h*w))/h)<floor((c mod(h*w))/w)であり、ただし、rは行番号であり、cは列番号であり、hはカーネルの高さであり、wはカーネルの幅である。
【0118】
1つの実施形態において、制御パターンは、複数のベクトルを含み、複数のベクトルのベクトルの数は、出力アクティベーションのカーネルサイズのタイル内の出力値位置の数に対応する。複数のベクトルの各ベクトル内の値は、遅延値に対応し、各遅延値は、平滑化された入力ストリーム内の個々の入力値にアクセスする遅延の量を示す。上述したように、平滑化された入力ストリームは、入力テンソルから生成される平行なベクトルのセットを含み、遅延の量は、平滑化された入力ストリーム内の平行なベクトルのうちの1つを特定する。
【0119】
1つの実施形態において、遅延値は、生成される出力値に対応する出力値位置ごとに、その出力値位置に対応する制御パターン内のベクトルを選択することによって、出力アクティベーションのカーネルサイズのタイルの出力値位置ごとの出力値を生成するために使用される。制御パターンの選択されたベクトル内の遅延値がアクセスされ、各遅延値は、出力値を生成するために使用される各入力値にアクセスする平滑化された入力ストリームの内の平行なベクトルを示す。アクセスされた入力値と拡張カーネルのベクトルとの間でドット積が実行されて、出力アクティベーションのカーネルサイズのタイル内の出力値位置における出力値が生成される。1つの実施形態において、拡張カーネルは、階層的ブロックのセットを含むようにカーネルを修正することによって生成され、階層的ブロックのセット内の各ブロックは、そのブロックのノードであるブロックのすべての回転置換を含む。階層的ブロックのセットのリーフは、カーネルの個々のベクトルのすべての回転置換を含むブロックであり、階層的ブロックのセット内の各ブロックは、カーネル内のそのブロックによって表される次元の軸に平行なベクトルにアラインされるブロックであるノードを有する。
【0120】
1つの実施形態において、制御パターンは、入力テンソルを畳み込むために使用される、対応するカーネルの次元のサイズの積に等しい長さを有する2次元の正方行列である。
【0121】
1つの実施形態において、制御パターンにおける遅延値が配置される順序は、平滑化された入力ストリームを生成するために入力テンソルのカーネルサイズのタイルがアクセスされる定義された順序に基づく。
【0122】
1つの実施形態において、定義された順序は、行優先順序、列優先順序、またはアイル優先順序である。アイル優先順序は、まず、3Dタイルの深さに対応する軸に沿って、続いて、3Dタイルの幅および高さに対応する軸に沿って、入力テンソルの3次元(3D)のカーネルサイズのタイル内の要素にアクセスする。
【0123】
上記のフロー図は、カーネルの次元のサイズから制御パターンを生成する方法を例示しているが、別の実施形態では、様々なカーネルサイズのための様々な制御パターンが、メモリに記憶され、使用されているカーネルサイズに応じて取得される。制御パターンの生成に関する付加的な詳細は、
図12~
図13を参照して後述される。
【0124】
図12Aは、一実施形態による、制御パターンの生成のための概念的基礎の例の第1の部分1200を例示する。
【0125】
前述したように、制御パターンの目的は、拡張カーネルとの組み合わせのために、平滑化された入力ストリーム内の正確なタイルから値を選択して、出力値を生成することである。カーネルが、畳み込みの素朴な実装において入力値上をストライドするにつれて、入力から異なる値が読み取られ、カーネル内の重みと組み合わされて、出力が生成される。制御パターンは、これがシミュレートされることを、正確な出力値を生成すべく、異なる入力値が位置する異なるタイルを選択することによって可能にする。しかしながら、素朴な実装とは対照的に、入力値は複数回読み取られず、最小限の読み取りが行われる。選択するタイルを示す制御パターンにおけるパターンを決定すべく、下記の方法が使用されてよい。しかしながら、下記の方法は、制御パターンを生成するために使用されることが可能であるが、本明細書で説明される方法は、効率を欠く場合があるので、実際には、ハードウェアは、
図11を参照して上述した方法などの別の方法を使用することになるであろう。したがって、本明細書で説明される方法は、制御パターンの概念的な理解を提供するために、より役立つことができる。
【0126】
1201において、
図4~
図6を参照して上述した方法と同様に、入力が平滑化される。ここでの入力テンソルは、サイズ4×4であり、カーネル1220がサイズ2×2であるので、したがって、各タイルはサイズが2×2であり、全部で4枚のタイルがある(パディングはここでは適用されない)。したがって、平滑化された入力1218は、4つのベクトルを有し、各々がタイルを表す。
図7~
図10を参照して上述したプロセスと同様に、カーネルも拡張されて、拡張カーネル1224が生成される。
【0127】
1202において、平滑化された入力1218における第1のタイル、すなわち、タイル1(1222A)は、拡張カーネルと乗算されて、要素ごとの積1226Aが生成される。したがって、タイル1 1226A内の「1」には、対応する行内の拡張カーネル1224内の4つのカーネル値「a」、「b」、「c」、および「d」の各々が乗算され、4つの積「a1」、「b1」、「c1」、および「d1」が生成される。これは、タイルの残りの値に対して、および、その他のタイル2~4(1222B~1222C)に対して、繰り返される。これは、図示されるように要素ごとの積(1226A~1226D)を作成する。
【0128】
プロセスは、
図12Bに続き、一実施形態による、制御パターンの生成のための概念的基礎の例の第2の部分を例示する。今や要素ごとの積1226A~1226Dが生成されているので、1203において、元の入力単一のタイルに重複するカーネルの位置ごとに、(例示される例では、カーネルの行ごとのストライドを使用して)要素ごとの畳み込み積を生成するために必要なタイル値が決定される。したがって、カーネルの位置が入力の上部左端にある、位置1(1230A)において、カーネル位置境界ボックス1232によって示されるように、入力に対してオーバーレイされたカーネル値「a」、「b」、「c」、および「d」は、カーネル値がオーバーレイする入力の基礎をなす値に対して乗算される。したがって、「a」は入力における「1」と乗算され、「b」は「2」と乗算され、「c」は「3」と乗算され、「d」は「4」と乗算されて、例示されるように、位置1(1234A)について要素ごとの積のペアが生成される。これらの積のペアは、例示される例では、列として示されているが、平滑化された入力ストリームまたは拡張カーネルが、それぞれ行優先フォーマットまたは列優先フォーマットを使用して生成されたかどうかに応じて、行として示されるようにも転換されることが可能である。
【0129】
要素ごとのペア1234Aに基づいて、要素ごとの積1226A~1226Dのうちのいずれから、これらの要素ごとのペアが位置付けられることが可能であるかが決定される。位置1(1230A)の第1の例において、これらのペアはすべて、要素ごとの積1226Aに位置付けられることが可能であり、ラベル「A」を与えられる。したがって、位置1を分析した後の制御パターンは、すべてが「A」の列として1236Aにおいて示されている。ここで、Aは、処理されている現在のタイルを表してよく、現在のタイルは、タイルXとして一般化されてよい。
【0130】
位置2(1230B)では、カーネル位置1232は、右へ1つ移動され、ただし、それは依然として入力における第1のタイル上に重複する。要素ごとの積のペア1234Bは、「a2」、「b5」、「c4」および「d7」である。カーネル内の「d」が、今や入力内の値「7」上にあるので、この「d7」積ペアは、要素ごとの積1226Aにおいては見つけることができないが、要素ごとの積1226Bにおいて見つかり、これは「B」で示される。したがって、1236Bにおいて示される制御パターンの次の列は、要素ごとの積ペア1234Bにおける「d7」の位置に対応する最後の値において「B」を有する。さらに、ここで、Bは、現在のタイルXに1を加えたもの、すなわち、タイルX+1に対応する。
【0131】
位置3では、カーネル位置1232は、下へ1つ、および左へ1つ移動される。カーネルは、さらに右に移動された場合、第1のタイルと重複しなくなるため、さらに右には移動されない。制御パターンは、入力における同じタイル位置に対応する単一のタイル、すなわち、現在のタイル、の出力値を生成するために使用される平滑化された入力ストリームからの値のみを決定するために生成されるので、これは不必要である。付加的なタイルは、別々に計算される。したがって、システムは、タイルごとに出力値を計算するので、ここで説明されるプロセスは、カーネルが問題の単一のタイル上に重複する、カーネルのそれらの位置のみに関係する。また、カーネル1220のフォーカスは、例示される例では、カーネル1220の左上部位置(「a」によって示される)であるので、関心の対象である、現在のタイル上のカーネルの位置1232は、カーネルのフォーカスが現在のタイルの入力値の各々にオーバーレイされる位置である。したがって、位置3は、(行ごとの順序を使用して)カーネルのフォーカスが現在のタイル内の第3の値上にオーバーレイされる位置である。この場合において、カーネルは、現在のタイルから読み取るが、現在のタイルの下にあるタイルからも読み取り、これは、タイルX+Kであり、ただし、Kは、前述したように行(または列)内のタイルの数である。これらの値は、カーネルと組み合わされて、要素ごとの積ペア1234Cが生成される。要素ごとの積ペア1234Cに示されるように、「c9」および「d10」は、現在のタイルの下にあるタイルからの値を含み、要素ごとの積1226Cにおいて見つけることができ、すなわち、「c9」および「d10」は、要素ごとの積1226Cの値のうちの1つに位置付けられることが可能である。最初の2つの積ペア、すなわち、「a3」および「b4」は、それらが現在のタイルからの値のみを含むので、要素ごとの積1226Aにおいて見つけることができる。したがって、1236Cにおいて示されるような位置3の後の制御パターンの次の列は、2つの「A」、および2つの「C」を有し、文字の順序付けは、積ペアの順序に対応する。
【0132】
最後に、位置4(1230D)において、入力に対してオーバーレイされたカーネルの位置1232は、現在のタイルおよび現在のタイルを囲む3枚の他のタイルすべてからの値に触れる。したがって、積ペア1234Dは、「a4」、「b7」、「c10」および「d13」である。これらは、要素ごとの積1226A~1226Dの各々においてそれぞれ識別されることが可能である。したがって、1236Dにおいて示されるような制御パターンの最後の列は、文字「A」~「D」を使用して、要素ごとの積1226A~1226Dの4つすべてをそれぞれ示す。ここで、Dは、現在のタイルXに、行サイズ変数Kを加え、1を加えたもの、すなわち、X+K+1を表し、したがって、現在のタイルの下であって、かつ、右側にあるタイルを参照する。
【0133】
ここで示されるように、制御パターン内の値は、現在のタイルを囲むどのタイルについて、現在のタイル上のカーネルのフォーカス位置についての畳み込みを計算するための値を取得するかを示し、それは、平滑化された入力ストリームから値を選択するためにも使用することが可能であり、それは、次いで、拡張カーネルの対応するベクトルと組み合わされて、出力における対応するフォーカス位置についての出力値が生成される。
【0134】
図13Aは、一実施形態による、2次元カーネルのための制御パターンの値の生成の一部の例1300を例示する。1つの実施形態において、ここで説明されるプロセスは、制御パターン生成器134によって実行される。
【0135】
1131において、制御パターン生成器134は、制御パターン1320についてのすべての値を生成する。ここで、制御パターン1320の値のほとんどが既に生成されているが、残りの値1324は、プロセスを例示するためにまだ生成されていない。この値1324は、図示されるように行0かつ列8にある。制御パターン生成器134は、1312において、位置についてのテスト結果を、その位置についての行番号および列番号/座標を使用して決定する。テスト結果は、不等式テスト1330を参照する。テストの数は、カーネルの次元の数に等しい。カーネルが、ここでは2次元であるので、2つのテストが生成される。各テストは、入力テンソルにおける各次元のタイル化されたサイズを識別するために使用されるシフト変数のうちの1つに対応する。例えば、Kは、第1の次元、すなわち、各行におけるタイルのサイズまたは数を表し、一方で、Mは、第2の次元、すなわち各層におけるタイルの数を表す。あるいは、特定の次元の各シフト変数は、その次元のタイル化されたサイズの積、および任意の先行する次元のタイル化されたサイズの積に等しいものとして定義されることが可能である。ここで、タイル化されたサイズは、入力テンソルにおける次元に平行な長さに広がるタイルの数を示す。
【0136】
また、テストは、第1の次元に対して生成され、これは、シフト変数ではなく、現在のタイルに対応する。したがって、ここで、test_kおよびtest_1が生成される。あるいは、これらは、delay_kおよびdelay_1と称されてもよく、なぜならば、上記のように、シフト変数は、平滑化された入力ストリームにアクセスするための遅延の量を示すために使用されることが可能であるからである。
【0137】
ここで図から分かるように、テスト不等式の生成は、パターンに従う。第1の次元1のためのテスト不等式は、r mod h<c mod wであり、ただし、rは、制御パターン1320において示されるような制御パターンの行番号であり、hは、カーネル1322において示されるようなカーネルの高さであり、cは列番号であり、wはカーネルの幅である(modは、モジュロ演算であり、<は、未満を示す)。K変数に対応する第2のtest_kは、類似しているが、これが第2の次元であるので、エリア、すなわち、計算におけるh*wを含む。したがって、結果として生じるテスト不等式は、floor((r mod(h*w))/h)<floor((c mod(h*w))/w)であり、floorは、フロア演算または(直近の整数への)切り捨て演算である。ここでのカーネル1322は正方形のカーネルであるが、他の場合には、カーネルは正方形ではなくてもよく、したがって、カーネルの高さおよび幅の両方が、テスト不等式において考慮される。
【0138】
両方のテストの結果は、結果表1332において参照される。ここで、各テストの真または偽(すなわち、1または0)の結果に応じて、異なる値(すなわち、インジケータ)が、制御パターン内のその対応する位置に配置される。ここで、2つのテストがあるので、合計4つの可能な値があり、これらは、文字A、B、C、およびDとしてここでは表され、同等に、バイナリ値00、01、10、および11としてそれぞれ表される。本明細書で説明されるように、これらの値は、出力アクティベーションを計算するために値にアクセスする平滑化された入力ストリームのベクトル/タイルを示す。ここで、テスト結果1326において示されるように、行番号を0、列番号を8とすると、両方のテストの結果が真となり、したがって、1324における値は「D」または11であり、これは現在のタイルx+k+1を参照する。行番号および列番号は、図示されるように順序付けられているが、別の実施形態では、順序付けは反対にすることができる。テスト不等式が(例えば、それらを反対にすることによって)修正される限り、ここでの結果は同じになることになる。したがって、ここでのプロセスは、制御パターンの行または列がラベル付けされる特定の方法によって限定されない。
【0139】
図13Bは、一実施形態による、3次元カーネルのための制御パターンの値の生成の一部の例1301を例示する。1つの実施形態において、ここで説明されるプロセスは、制御パターン生成器134によって実行される。
【0140】
ここで、1351において、制御パターン生成器134は、制御パターン1360についての値を生成する。
図13Aの制御パターンとは対照的に、制御パターン1360は、高さ2、幅2、および深さ2(それぞれh、w、およびdとラベル付けされる)を有する3次元カーネル1362に対して生成される。
【0141】
図13Aにおいて前述したように、カーネルの各次元は、テスト不等式に関連付けられる。したがって、ここでは、3つのテスト不等式がテスト表1370において生成される。
図13Aと同様に、それらは、test_m、test_kおよびtest_1の代わりに、それぞれdelay_m、delay_kおよびdelay_1とも称されてよい。test_1とtest_kとの両方は、
図13Aに示されるテスト不等式と同じである。Mシフト変数(すなわち、入力テンソルの層内にどれだけ多くのタイルがあるか)に対応するTest_mは、test_kと同様のパターンに従うが、ここでは、カーネルの深さ(d)を含む。
【0142】
カーネルが付加的な次元を含むとすれば、このテスト不等式は、付加的な次元を含むようにさらに拡大されることになる。例えば、4つの次元では、テスト不等式は、floor((r mod(h*w*d*t))/(h*d*t)<floor((c mod(h*w*d*t))/(w*d*t)であってもよく、tは、「trength」、またはカーネルの第4次元のサイズを表す。このパターンは、より上位の次元に続き、付加的な次元がテスト不等式に追加される。したがって、テスト不等式は、N個の次元を有するカーネルについて、floor((r mod(カーネルの次元のサイズの積))/(h*幅を除いたカーネルの次元のサイズの積)<floor((c mod(カーネルの次元のサイズの積))/(w*高さを除いたカーネルの次元のサイズの積)の形式を取り、そのカーネルについての残りのテスト不等式は、より下位の次元のカーネルN-1、N-2...1についてのテスト不等式であり、1つの次元を有するカーネルについてのテスト不等式は、ここで示されるtest_1と同じである(また、2つの次元を有するカーネルのそれは、ここで示されるtest_kと同じである等)。
【0143】
3次元カーネルに対して3つのテストがあるので、結果表1372に示される、合計8つの組み合わせがある。各組み合わせは、インジケータA~Hまたは3ビットのバイナリ値に対応する。
図13Cを参照して下記でさらに説明されるように、バイナリビットのパターンは、いくつかの実施形態において制御パターンを効率的に記憶するために使用されることが可能である。1352において、制御パターン生成器134は、制御パターン1360について、行0かつ列7における最後の残りの値1364を生成する。テスト結果1366において示されるように、3つのテスト不等式すべてが真という結果になり、この位置についてのインジケータH、またはバイナリ値111に対応する。したがって、Hは、制御パターン1360の行0、列7の位置に記憶されることになる。しかしながら、すべてのテスト不等式が真ではなかった場合、計算されたテスト不等式の結果とマッチングする、3つのテスト不等式結果を示す結果表1372内の行の選択に基づいて、異なるインジケータが選択されることになる。
【0144】
カーネルが付加的な次元を含む場合、結果表1372のサイズは、テスト不等式の数と同様に増加することになる。ただし、結果表内の行の数は、2X行に等しくなり、ただし、Xは、カーネルの次元の数である。図から分かるように、最大次元の結果がバイナリ値の最上位ビットを形成し、最小次元の結果が最下位ビットを形成するように、テスト不等式結果が順序付けられるように体系化される場合、結果の組み合わせの各々は、バイナリ値として考えられることが可能であり、(例えば、上から下へ昇順で)表において連続して順序付けられることが可能である。各組み合わせに関連付けられたインジケータも、連続して増加し、連続して増加する次元サイズのシフト変数の組み合わせにも関連付けられる。例えば、例示される例では、AおよびBは、シフト変数に関連付けられないが、現在のタイル(すなわち、現在のタイルxおよびx+1)のみに関連付けられ、CおよびDは、シフト変数k(すなわち、x+kおよびx+k+1)に関与し、EおよびFは、次に最も高い次元シフト変数m(すなわち、x+mおよびx+m+1)に関与し、GおよびHは、kおよびm(すなわち、x+m+kおよびx+m+k+1)の合計に関与する。カーネルが、付加的な次元のものである場合、これは、サイズをさらに増加させながら、シフト変数の組み合わせに続くことになる。各組み合わせは、2つのインジケータを含み、一方は、組み合わせ自体であり、他方は、組み合わせに1を加えたものである。したがって、4次元カーネルについて、パターンは、IおよびJ(x+tおよびx+t+1)、KおよびL(x+t+kおよびx+t+k+1)、MおよびN(x+t+mおよびx+t+m)、ならびに、OおよびP(x+t+m+kおよびx+t+m+k+1)に続くことになる。これらは、バイナリ値1000から1111(または8から15)に対応し、最上位の数字は、第4の次元についてのテスト不等式(すなわち、「test_t」または「delay_t」)に対応し、残りのビットは、本明細書で例示される同じ3つのテストに対応する。
【0145】
テスト不等式を計算するために、変数rは、値が生成される制御パネルの位置の行番号(ここでは0)に置換され、変数cは、値が生成される制御パネルの位置の列番号(ここでは7)に置換され、変数h、w、およびdは、カーネルの高さ、幅、および深さのサイズ(ここでは、2、2、および2)に置換されることに留意されたい。
【0146】
図13Cは、一実施形態による、異なる次元のカーネルのための制御パターンを生成する例1300を例示する。
図13には、3×1 1Dカーネル1310、3×3 2Dカーネル1314、および2×2×2 3Dカーネル1318が例示されており、3Dカーネル1318は、分かりやすいように分解図で例示されている。対応する制御パターン1312、1316、および1320は、これらのカーネルに対してそれぞれ例示されている。それらは、
図11を参照して上述した方法に従って生成されることができる。1Dカーネルについて、制御パターン1312における識別子「A」は、現在のタイルXを示し、一方で、「B」は、タイルX+1を示す。制御パターン1316について、「A」は、現在のタイルXを示し、「B」は、タイルX+1を示し、「C」は、タイルX+Kを示し、ただし、Kは、前述した行サイズ変数であり、「D」は、タイルX+K+1を示す。制御パターン1320について、「A」から「D」は、制御パターン1316と同じタイルを示す。また、「E」は、タイルX+M(現在のタイルの後ろのタイル)に対応し、Mは、層タイルサイズ(すなわち、層内のタイルの数)である。「F」は、X+M+1、すなわち、現在のタイルの背後のタイルの右側のタイルに対応する。「G」は、タイルX+M+Kであり、現在のタイルの後ろの、かつ、下にあるタイルに対応する。「H」は、タイルX+M+K+1に対応し、現在のタイルの後ろの、かつ、下にある、かつ、右側のタイルに対応する。
【0147】
1つの実施形態において、
図13に示される文字などのインジケータを使用して、またはこれらの文字を表すビットのシーケンスとして、制御パターンを記憶する代わりに、それをより効率的に記憶するために制御パターンのフラクタル性が利用される。制御パターン1312、1316、および1320の各々について、識別子は、上縁および右縁に沿った「A」から始まり、次いで、「A」と「B」との交替パターン、および、最左下端の値が現在のタイルから最も遠い(かつ、例示されるように、アルファベットで最大の文字の)タイルを示す識別子になるまで、さらに分割されたパターンにつながる。このフラクタル性に起因して、各制御パターンは、制御パターン内の一意の識別子の数に応じて、1つまたは複数のレベルに階層的に分割されることが可能である。レベルの数は、制御パターンを生成するために使用されるカーネルの次元の数に対応する。したがって、制御パターン1312は、単一のレベルを有する。制御パターン1316は、2つのレベルを有し、制御パターン1320は、3つのレベルを有する。
【0148】
各レベルは、単一のバイナリ値(すなわち、ビット)を含有する正方行列を含む。各レベルの正方行列の各次元のサイズは、先行するレベルの次元のサイズに、カーネルの最大次元のサイズが乗算されたものに等しい。最小レベルは、カーネルの最大次元のサイズに等しい各次元のサイズを有する正方行列を有する。したがって、例えば、制御パターン1316では、最大のレベルは、サイズ9×9を有するビットの正方行列を有し、一方で、次に最小のレベルは、3×3(すなわち、9を3で除算、これはカーネルの次元のサイズである)である各次元のサイズを有する。
【0149】
最大のレベルでないレベル内の各ビットは、より大きなレベルにおける多様なビットにマッチングさせられる。特に、より大きなレベルは、次に最小のレベルにおけるビットの数に等しい複数の領域に均等に分割され、次に最小のレベルにおけるビットは、より大きなレベルの領域内のビットにマッチングさせられる。次に最小のレベルにおけるビットの中でマッチングさせられたビットの位置は、より大きなレベルの領域のセット内の領域の位置に対応する。多様なレベルにわたってマッチングさせられたビットの組み合わせは、識別子を参照すべく、制御パターン内のすべての位置についてのビットシーケンスを可能にする。したがって、制御パターン1316の例において、3×3行列の各ビットは、9×9のより大きな行列の3×3部分にマッチングさせられる。9×9行列からのビットの組み合わせは、3×3行列からのマッチングさせられたビットと共に、2ビットの値を形成し、これは、制御パターン1316の4つの一意のインジケータのうちの1つを参照するために使用されることが可能である。制御パターン1320の例では、8つの一意の識別子があるので、3つのレベルがあり、最大のレベルは8×8行列であり、2番目に大きいものは4×4行列であり、最小のレベルは2×2行列である。3つのビットは、制御パターン1316における8つの一意の識別子(すなわち、例示されるような文字「A」~「H」)のうちの正確な1つを参照するために使用されてよい。これらのビットも、
図13A~
図13Bの例における結果表において先に例示された。
【0150】
この方法は、制御パターンが効率的に記憶されることを可能にする。様々なレベルから正確なビットシーケンスを抽出するために、乗加算ユニット140は、制御パターン内のインジケータの位置を決定し、次いで、これを、そのインジケータに対応するビットシーケンスを決定すべく、最大のレベルにおける正確な位置、および残りのレベルにおけるマッチングさせられた位置を決定するために使用することができる。
【0151】
(平滑化された入力、拡張カーネル、および制御パターンを使用した出力生成)
図14は、一実施形態による、平滑化された入力、拡張カーネル、および制御パターンを使用して、畳み込みの出力を生成する方法を例示するフロー図である。例示されるフロー図は、動作の順序を示してよいが、例示される動作は、任意の順序で実行されてもよく、より多数の動作またはより少数の動作を有してもよい。1つの実施形態において、
図14に示される動作は、乗加算ユニット140(乗算累積ユニットとしても知られてよい)によって実行されることができる。
【0152】
乗加算ユニット140は、バッファからの、平行なベクトルのセットを含む平滑化された入力ストリームにアクセスし1410、各ベクトルは、出力アクティベーションを生成するためにカーネルによって畳み込まれる入力テンソルの、一意のカーネルサイズのタイルの入力値のセットを表す。この平滑化された入力ストリームは、平滑化された入力ストリーム124であってもよく、上述したように入力ストリーム生成器122によって生成されてもよい。
【0153】
乗加算ユニット140は、カーネルからの値をローテーションで置換することによって生成された拡張カーネルを受け取り1420、拡張カーネルは、各々が出力アクティベーションのカーネルサイズのタイルの出力値位置に対応するベクトルを有する。これは、拡張カーネル128であってもよく、上述したように拡張カーネル生成器126によって生成されてもよい。
【0154】
乗加算ユニット140は、ベクトルのセットを含む制御パターンを受け取り1430、各ベクトルは、出力アクティベーションのカーネルサイズのタイルについての出力値位置に対応し、各ベクトルは、畳み込みのために入力値にアクセスするための、平滑化された入力ストリームの平行なベクトルを示す遅延値を含む。制御パターンは、制御パターン136であってもよく、上述したように制御パターン生成器134を使用して生成されてもよい。
【0155】
乗加算ユニット140は、出力アクティベーションの各カーネルサイズのタイルの出力値位置ごとに、制御パターンの対応するベクトルの遅延値によって選択されるような、平滑化された入力ストリームの値を含む第1のベクトルと、出力値位置に対応する拡張カーネルにおけるベクトルに対応する第2のベクトルとのドット積を生成する1440。乗加算ユニット140は、これをすべての出力値に対して繰り返す。
【0156】
1つの実施形態において、入力テンソルは、複数のチャネルを有し、カーネルは、多様なフィルタを有する。入力テンソルの各チャネルは、カーネルの1つまたは複数のフィルタを用いて畳み込まれて、複数の出力フィーチャを有する出力アクティベーションが生成される。乗加算ユニット140を介した出力値の生成のための付加的な例は、
図15A~
図15C、
図16A~
図16F、および
図17A~
図17Bを参照して後述される。
【0157】
図15Aは、一実施形態による、1次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例1500の第1の部分を例示する。1つの実施形態において、ここで説明されるプロセスは、乗加算ユニット140によって実行されることができる。
【0158】
1501Aにおいて、乗加算ユニット140は、出力アクティベーションの第1のタイル#1(これは入力テンソルにおいて同じタイル位置である)を処理する。これは、処理されている現在のタイルである。乗加算ユニット140は、1502Aにおいて、第1のタイルの3つのうちの出力位置1をさらに処理する(3は、各タイル内の値の数である)。第1の出力位置の処理において、乗加算ユニット140は、1511Aにおいて、その出力位置についての制御パターン1524内のベクトルによって示されるようなタイル位置(例えば、遅延の量)に従って、平滑化された入力1522から値を選択する。位置1について、このベクトルは、制御パターン1524内の最右端の列である。したがって、図示されるように、出力タイル内の位置1についての制御パターンベクトル1528Aは、すべて「A」であり、これは、値を選択する現在のタイルX、すなわちタイル1を示す。平滑化された入力1522内の値は、メモリアドレス、インデックス値を参照することによって選択されてもよく、または、それは、乗加算ユニット140が平滑化された入力1522から読み出すクロックサイクルを遅延させることによって選択されてもよい。ここで、制御パターンベクトル1528Aのすべての値が「A」を示すので、選択された入力値1530Aは、平滑化された入力1522におけるタイル1から選択され、例示されるように[0、1、2]である。
【0159】
1512Aにおいて、乗加算ユニット140は、選択された値1530Aと、出力タイル内の位置1に対応する拡張カーネルベクトル1532Aとを乗算累積し、すなわち、ドット積を実行する。位置1について、拡張カーネルベクトル1532Aは、拡張カーネル1526の最上部の行である。ドット積演算結果は、図示されるように計算a0+b1+c2であり、これは、図示されるように、位置1における出力1534Aを生成する。
【0160】
プロセスは、
図15Bに続き、一実施形態による、1次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第2の部分を例示する。
【0161】
1503Aにおいて、現在のタイルの3つの出力位置のうちの第2の位置が処理される。1511Aと同様に、1513Aにおいて、タイルの位置2に対応する制御パターンベクトル1536Aが選択される。この場合において、このベクトルは、制御パターン1524の中央の列である。この制御パターンベクトル1536は、平滑化された入力1522から対応する値を選択するために使用される。制御パターンベクトル1536内の識別子ごとに、その識別子によって示されるタイルが、平滑化された入力1522から選択され、値は、制御パターンベクトル1536内のインジケータの同じ位置に対応する位置において、そのタイルにおける平滑化された入力1522から選択される。したがって、制御パターンベクトル1536A内の第1の(上部の)位置は、識別子「A」を有し、これは、タイルX(凡例に記載されている通り)、または、今回の例では、平滑化された入力1522内のタイル1に対応する。したがって、同じ第1の位置からの平滑化された入力1522のタイル1内の値が選択される(これは値「0」である)。同じ演算は、制御パターンベクトル1536A内の第2の位置について実行され、平滑化された入力1522の第1のタイルの第2の位置から「1」が選択されることにつながる。制御パターンベクトル1536Aの第3の、かつ、最後の位置について、識別子は、ここでは「B」であり(凡例に記載される通り)、参照されるべきタイルが、タイルX+1、または今回の例ではタイル2であることを示す。したがって、乗加算ユニット140は、タイル2から、同じ第3の位置内の値、すなわち「5」を選択する。したがって、選択された入力値1538Aは、図示されるように[0、1、5]である。
【0162】
1514Aにおいて、1512Aにおける演算と同様に、乗算累積演算が実行される。ただし、拡張カーネル1526から第1の行を選択する代わりに、出力の位置2に対応する行、すなわち、ベクトルが代わりに選択される。これは、今回の例では偶然にも拡張カーネル1526の第2の行である。したがって、位置2についての拡張カーネルベクトル1524Aは、[c、a、b]である。この拡張カーネルベクトル1524Aと、選択された入力値1538Aとのドット積は、c0+a1+b5、または出力タイルの位置2における出力1544Aである。
【0163】
プロセスは、
図15Cに続き、一実施形態による、1次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第3の部分を例示する。
【0164】
1504Aにおいて、出力タイルの最後の位置3が処理される。ここで説明されるプロセスは、1503Aおよび1502Aのプロセスと同様であるが、すべての選択が、第3の位置のための適切にシフトされる。
【0165】
したがって、1515Aにおいて、選択されている制御パターンベクトル1546Aは、ここでは出力タイルの位置3に対応し、したがって、制御パターン1524の最左端の列である。この制御パターンベクトル1546Aは、タイル1に対する1つのインジケータ、およびタイル2に対する2つのインジケータを有する。したがって、選択された入力値1548Aは、タイル1からの「0」、ならびにタイル2からの「4」および「5」を含む。
【0166】
1516Aにおいて、乗算累積演算は、選択された入力値1548Aと、位置3についての拡張カーネルベクトル1552とに対して実行され、位置3についての拡張カーネル1552は、今回の例では、拡張カーネル1526の行3に対応する。このドット積の出力は、位置3についての出力1554Aである。
【0167】
1505において、このプロセスは入力におけるすべてのタイルに対して繰り返されて、出力のための同数のタイルが生成される。したがって、1501Aにおける演算は、今回の例の平滑化された入力1522において、タイル2に対する1501Bから、タイル12に対する1501Lまで繰り返される。平滑化された入力1522が、より多くのタイルを含む場合、1501Aに示されるプロセスは、すべてのタイルが処理されるまで繰り返される。
【0168】
図16Aは、一実施形態による、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例1600の第1の部分を例示する。
図15A~
図15Cとは対照的に、本明細書で説明されるプロセスは、1次元カーネルの代わりに2次元カーネルに対するものである。1つの実施形態において、本明細書で説明されるプロセスは、乗加算ユニット140によって実行される。
【0169】
1601Aにおいて、第1のタイルが、乗加算ユニット140によって処理される。各タイルは9つの位置を有するので、各位置が、その位置についての出力値を生成するために処理される。1602Aにおいて、出力位置1が処理される。1次元カーネルの例と同様に、制御パターンベクトル1628Aは、出力位置値に従って制御パターン1624から選択される。出力位置は1であるので、制御パターン1624の出力位置1とラベル付けされた列が、制御パターンベクトル1628Aとして選択される。この制御パターンベクトル1628Aは、その識別子のすべてが「A」である。したがって、この制御パターンベクトル1628Aは、選択された入力値1630Aがすべて、平滑化された入力1622のタイル1から選択されるべきであることを示す(現在のタイルXがタイル1であるため)。
【0170】
プロセスは、
図16Bに続き、一実施形態による、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第2の部分を例示する。
【0171】
1612Aにおいて、乗算累積演算が、選択された入力値1630Aと、拡張カーネル1626についての
図16Aに示される出力位置ラベルに従って、拡張カーネル1626から選択される拡張カーネルベクトル1632Aとに対して実行される。この場合において、出力位置1は、拡張カーネル1626の最上部の行に対応する。この最上部の行は、乗算累積演算のために選択される。この最上部の行は、したがって、拡張カーネルベクトル1632Aを形成する。乗加算ユニット140によって、選択された入力値1630Aと、拡張カーネルベクトル1632Aとのドット積が実行されて、位置1についての出力1634Aが生成される。
【0172】
1603Aにおいて、出力位置2が処理される。出力位置2は、制御パターン1624の右から2番目の列に対応する(ラベル付けされている通り)。ここでの列の順序付けは、図示される順序に従う必要がないことに留意されたい。代わりに、正確な出力位置に対応する正確な列が選択される限り、列の順序付けは、任意の順序とすることができる。さらに、制御パターン1624は、列によって順序付けられる必要はなく、行によっても順序付けられることが可能である。正確な出力位置に対応する正確な行が参照される限り、出力も同じになることになる。最後に、制御パネル内の識別子の順序も、逆にすることが可能である。識別子が、それらを使用して入力値を選択する場合に正確な順序で参照される限り、出力も同じになることになる。この同じ概念は、拡張カーネル1626に対しても、それがここで説明される順序付けとは異なって順序付けられることが可能であるので、当てはまる。
【0173】
凡例に記載されるように、制御パターン1624内の識別子「A」は、平滑化された入力1622のタイルXを参照し、ただし、Xは現在のタイルであり、一方で、識別子「B」は、タイルX+1を参照する。制御パターンベクトル1636Aは、識別子「A」と識別子「B」との両方を含む。制御パターンベクトル1636A内の各位置について、乗加算ユニット140は、識別子がどのタイルを参照するのかを決定し、平滑化された入力1622におけるその参照されたタイルから、平滑化された入力1622におけるタイルのベクトルにおいて同じ入力位置にある入力値を、制御パターンベクトル1636A内の識別子の位置として選択する。したがって、例えば、制御パターンベクトル1636A内の位置6は、識別子「B」を有し、識別子「B」は、値がタイルX+1から選択されるべきであることを示し、タイルX+1は、平滑化された入力1622のタイル2である(現在のタイル#1+1=タイル2)。乗加算ユニット140は、平滑化された入力1622のタイル2ベクトルから、制御パターンベクトル1636A内の位置6に対応する、入力位置6における値を選択し、これを選択された入力値1638Aの位置6に配置する。残りの値は、同様に選択される。
【0174】
プロセスは、
図16Cに続き、一実施形態による、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第3の部分を例示する。
【0175】
1614Aにおいて、先行する演算において生成された、選択された入力値1638Aは、ドット積において拡張カーネルベクトル1642Aと組み合わされて、位置2についての出力1644Aが生成される。ここで、拡張カーネルベクトル1642Aは、出力位置番号に従って再度選択され、出力位置番号は、この場合には2である。したがって、拡張カーネル1626の第2の行が、拡張カーネルベクトル1642Aとして選択される。
【0176】
乗加算ユニット140は、タイルの残りの出力位置について、上記のプロセスを実行する。一例として、1606Aにおいて、プロセスは、出力位置5について実行される。ここで、1615Aにおいて、制御パターンベクトル1646Aが、
図16Aに示されるような出力位置5列から選択される。ここで、制御パターンベクトル1646Aは、タイルX+KおよびX+K+1にそれぞれ対応する、2つの新しい識別「C」および「D」を含み、ただし、Kは、入力の行内のタイルの数を表す。したがって、図示されるように、制御パターンベクトル1646A内の位置9は、平滑化された入力ストリーム内のタイル6の位置9から選択される。これは、この出力位置についての選択された入力値1648Aという結果になる。
【0177】
プロセスは、
図16Dに続き、一実施形態による、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第4の部分を例示する。
【0178】
1615Aにおいて、乗算累積演算が実行される。乗加算ユニット140は、選択された入力値1648Aと、位置5について選択された拡張カーネルベクトル1652Aとのドット積を実行する。例示される例において、これは、拡張カーネル1626の行5である。ドット積結果は、位置5の出力1654Aである。このプロセスは、現在のタイル内のすべての出力が生成されるまで、1616において繰り返される。さらに、このプロセスは、すべてのタイルが処理されるまで、1617において繰り返される。
【0179】
図16Eは、一実施形態による、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、多様なチャネルを有する出力アクティベーションを生成する例を例示する。
【0180】
前述したように、入力テンソル102は、多様なチャネルを有してもよく、各チャネルは、入力値の別個の行列である。
図5Cを参照して前述したように、入力の多様なチャネルは、平滑化され、互いに「積み重ねられる」。1618において、これらの入力チャネルの各々は、
図4~
図6において説明された方法に従って平滑化され、平滑化された入力チャネル1656からの値は、選択された入力チャネル値1658を生成するために制御パターン1624によって選択される。選択された入力チャネル値1658の新しい行列がここでは示されているが、実際には、新しい行列が生成されなくてもよい。代わりに、乗加算ユニット140は、平滑化された入力チャネル1656から値をオンザフライで選択してもよい。したがって、選択された入力チャネル値1658は、ここでは、概念を概念的に例示するために示されている。
【0181】
プロセスは、
図16Fに続き、一実施形態による、2次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、多様なチャネルを有する出力アクティベーションを生成する例の第2の部分を例示する。
【0182】
1618において、乗加算ユニット140は、選択された入力チャネル値1658とカーネルフィルタ1660A~1660Nとを用いてドット積(すなわち、乗算累積)を実行する1668。選択された入力チャネル値1658内の各入力チャネルは、異なるサブフィルタカーネル1666を用いて畳み込まれ、これらはカーネル自体である。各サブフィルタカーネル1666は、同じ値または異なる値を有してよい。畳み込みプロセスは、
図16A~
図16Dについて上述された畳み込みプロセスと同様であってよい。生成された畳み込み出力1662Aは、単一のカーネルフィルタについて加算されて、出力アクティベーションチャネル1664Aが生成される1670。残りのカーネルフィルタ1660B~1660N各々について、このプロセスが繰り返され、それにより、多様な出力アクティベーション1664B~1664Nが生成される。これらの出力アクティベーション1664A~1664Nは、ニューラルネットワーク内の付加的な畳み込み層への入力としての役割を果たすことができる。
【0183】
図17Aは、一実施形態による、3次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第1の部分を例示する。1つの実施形態において、本明細書で説明されるプロセスは、乗加算ユニット140によって実行されることができる。
【0184】
1701において、入力のタイルXが、乗加算ユニット140によって処理されている。1702において、乗加算ユニット140は、タイルXの8つのうちの出力位置8を処理する。1711において、乗加算ユニット140は、位置8についての選択された制御パターンベクトル1724を使用して、平滑化された入力1722から値を選択する。1次元カーネルおよび2次元カーネルについて上述したプロセスと同様に、出力位置(この場合には位置8)に対応する制御パターンのベクトルが、制御パターンベクトル1724として選択される。制御パネルベクトル1724は、「A」から「H」まで、8つの異なる識別子を有する。
図17Aの凡例において示されるように、各識別子は、平滑化された入力1722の異なるタイルを示す。例えば、識別子「H」は、タイルX+M+K+1に対応し、ただし、Mは、各層内のタイルの数であり、Kは、入力の各行内のタイルの数である。識別子ごとには、乗加算ユニット140は、平滑化された入力1722の示されたタイルから、選択された入力値1726についての識別子の位置に対応する位置における値を選択する。
【0185】
プロセスは、
図17Bに続き、一実施形態による、3次元カーネルの場合において、平滑化された入力、拡張カーネル、および制御パターンを使用して、出力アクティベーションを生成する例の第2の部分を例示する。
【0186】
1712において、乗加算ユニット140は、ドット積において、位置8についての選択された入力値1728と位置8についての拡張カーネルベクトル1730とを組み合わせて、現在のタイルの位置8についての出力1732を生成する。選択されている拡張カーネルベクトル1730は、出力の位置に対応する。
【0187】
1713において、上述したプロセスは、乗加算ユニット140によって、入力における各タイルのすべての出力位置について繰り返されて、出力アクティベーションが生成される。
【0188】
(例示的なプロセッサ構成要素)
図18Aは、一実施形態による、拡張カーネルを生成するための例示的な構成要素についてのハードウェア図を例示する。いくつかの実施形態において、配列(例えば、重みのカーネル)に対応するデータ値1810は、データ記憶回路1801(例えば、メモリ回路)に記憶される。いくつかの実施形態において、配列に対応するデータ値は、シーケンスとして(例えば、単一の列として)記憶される。この例において、データ値1810は、1つまたは複数の入力部でシフター回路1820に結合される。シフター回路は、配列をデータ値のシーケンスとして受け取ることができる。各データ値は、1つまたは複数のバイトのデジタルデータ値を含んでもよく、例えば、これは、整数、浮動小数点数、または、例えば、他のタイプのデータ値であってもよい。したがって、各データ値は、複数個の導体上でシフター回路1802に結合されてもよく(例えば、ワイヤは集積回路上で相互接続する)、ただし、例えば、導体のセットは、1つのデータ値を搬送することができ、導体のグループは、データ値のシーケンスを搬送することができる。1つの実施形態において、データ値は、重みであり、入力データ値は、ニューラルネットワークのためのアクティベーション値である。
【0189】
データ値を搬送する導体は、シフター回路1802の入力部で受け取られることができる。シフター回路1802の入力部は、例えば、シーケンスの一部または全部を搬送するための導体を受け取ることができる。上述したように、配列に対応するデータ値は、シーケンスとして受け取られることができる。1つの実施形態において、シーケンスは、データストレージ1810から並行して受け取られた対応する配列のすべてのデータ値を含む。しかしながら、他の実施形態では、シーケンスは、(例えば、一度に1列ずつ、または一度に1行ずつ、受け取られ、置換された)対応する配列のデータ値の一部を含んでもよい。シフター回路1802は、1つまたは複数の入力からのデータ値を、異なる順序の1つまたは複数の出力へ結合して、置換シーケンスを生み出すことができる。いくつかの実施形態において、各々が1つのシーケンスを搬送する複数の出力は、乗算器1803に結合されることができる。他の実施形態において、第1の入力部で受け取られたシーケンスのデータ値は、異なる位置にシフトされ、1つまたは複数の出力に結合される。下記に示される1つの例示的な実施形態において、シーケンスは、第1の入力部で受け取られ、データ値は、異なる位置にシフトされ、置換シーケンスは、第2の出力部で連続して生成される。
【0190】
いくつかの実施形態において、シフター回路1802によって生み出された置換は、上述したような拡張カーネルに対応することができる。したがって、いくつかの実施形態において、多様な置換シーケンスではなく、1つのシーケンスのみがメモリに記憶されてもよく、その結果、例えば、メモリ使用量が有利に低減される。例えば、データストレージ1801から受け取られたシーケンスは、配列の列または行に基づいた複数のサブシーケンスを含んでよい。シフター回路1802は、シーケンスを下記のように置換することができる。データ値は、シーケンスと同じ順序で、1つまたは複数の入力から、シフター回路1802の1つまたは複数の出力に結合されることができる。したがって、入力シーケンスは、出力によって生み出されるシーケンスのうちの1つを含むことができる。また、各サブシーケンスの位置がシーケンス内で移動される、サブシーケンスのデータ値の複数の置換について、および、データ値が各サブシーケンス内で移動される、各サブシーケンス内のデータ値の複数の置換について、データ値は、異なる順序で、1つまたは複数の入力から1つまたは複数の出力に結合される。異なる配列についてのそのような置換の例は、上記に例示されている。1つの実施形態において、データ値は、シフター回路1802の第1の入力部で受け取られ、データ値は、第1の入力部から第1の出力部に結合されて、第1の出力部での入力シーケンスが生み出される。また、データ値は、異なる順序で、第1の入力部から複数の第2の出力に結合されて、複数の第2の出力部での複数の置換シーケンスが生み出されることができる。このアプローチの例示的な実装例は、
図18Bにおいて下記に例示される。別の実施形態において、データ値は、シフター回路1802の1つまたは複数の入力部で受け取られ、データ値は、入力部と1つまたは複数の出力部との間で異なる位置にシフトされて、入力シーケンスおよび複数の置換シーケンスが生み出される。
【0191】
乗算器回路1803は、シフター回路1802の1つまたは複数の出力部に結合されることができる。したがって、シフター回路1802の1つまたは複数の出力部で生み出されたシーケンスは、乗算器1803内の複数のレジスタ回路内にロードされることができる。乗算器1803は、入力データ値1820をさらに受け取ることができる。入力データ値1820は、複数の第2のレジスタにロードされることができる。したがって、複数の乗算結果1830が生成されることができる。上述したように、拡張カーネルは、例えば、並行して生成される複数の畳み込み結果という結果になってよい。1つの実施形態において、データ値は、M×N配列(例えば、入力データ値1820に適用されるカーネル)に対応する。シフター回路1802は、データストレージ1810から、M*Nの長さのシーケンスを受け取り、各々が長さM*Nである、M*N個の異なるシーケンスを生み出すことができる。シーケンスは、シフター回路1802から結合され、乗算器回路1803に(例えば、並行して)ロードされることができる。
【0192】
図18Bは、一実施形態による、拡張カーネルを生成するために例示的な構成要素において使用される例示的なシフター回路についてのハードウェア図を例示する。
【0193】
この例において、入力シーケンスSEQ1は、M×N配列に対応し、ただし、MおよびNは整数であり、MおよびNのうちの1つまたは複数は、例えば1より大きい。したがって、シーケンスSEQ1は、M*N個のデータ値、すなわち、D0~D(M*N)を含む。シーケンスSEQ1は、入力部から、置換されていないM*N個のデータ値を含む第1の出力(例えば、ストリームS(1))に結合されることができる。また、シーケンスSEQ1は、M*N-1個の異なる経路に沿って、異なるシーケンスSEQ2~SEQM*Nに置換されてもよく、これらは、M*N-1個の出力部(例えば、ストリームS(2)~S(M*N)で提供され、これらは各々、M*N個の置換されたデータ値、例えば、D0~D(M*N)を含む。
【0194】
より詳細には、この例において、複数のデータ値D0~D(M*N)を含むシーケンスSEQ1は、第1の入力ストリームS(1)で受け取られる。シーケンス内の各データ値は、例えば、複数の導体上で搬送される1つまたは複数のバイトを含むことができる。ここで、データ値は、第1の入力部(例えば、ストリームS(1))から、複数の異なる出力部(例えば、ストリームS(1)~S(M*N))へ、異なる導電経路に沿って異なる順序で結合されて、複数の異なる出力部(例えば、ストリームS(1)~S(M*N))で、元のシーケンスSEQ1および複数の置換シーケンスSEQ2~SEQM*Nが生み出される。例えば、入力シーケンス内の各データ値D0~D(M*N)は、複数の導電性ワイヤ上で搬送される1つまたは複数のバイトを含むことができる。異なるデータ値を搬送する導電性ワイヤは、入力部(例えば、ストリームS(1))と、複数の出力部の各々(例えば、ストリームS(2)~S(M*N))との間で異なる方法で並べ替えられて、複数の出力部の各々で、異なる置換シーケンスが生み出される。より詳細には、この例において、入力部S(1)のSEQ1は、複数の回転子1860~1862に結合される。回転子1860~1862は、例えば、データ値を搬送する導体の位置を変化させることによって、各シーケンス内のデータ値の位置を並べ替えられることができる。2つの例示的なローテーションが、1870および1871において例示されている。この例において、ローテーションの後、各置換シーケンスは、マルチプレクサ回路の入力に結合されることができる。本開示の実施形態は、複数のストリームSを備える集積回路を含むことができる。回転子1860~1862を介してSEQ1から生成された置換シーケンスは、例えば、マルチプレクサ1851~1853を使用して、隣接するストリームS(2)~S(M*N)に結合されることができる。例えば、データ値D0~D(M*N)の異なる置換シーケンスSEQ2~SEQM*Nを搬送する、並べ替えられた導電性ワイヤの各々は、各マルチプレクサの入力部に結合されることができる。各マルチプレクサの第2の入力部は、ストリームS(2)~S(M*N)のうちの1つに結合される。したがって、各マルチプレクサの出力部は、置換シーケンスのうちの1つを各ストリームに結合する。また、データ値D0~D(M*N)の元のシーケンスSEQ1を搬送する入力部の導電性ワイヤは、同じ順序で第1の出力(例えば、ストリームS(1))に結合されて、ストリームS(1)を搬送する出力部で元のシーケンスが生み出される。SEQ1~SEQM*Nをそれぞれ搬送するストリームS(1)~S(M*N)は、例えば、乗算器回路に結合されることができる。したがって、この例において、シーケンスSEQ1のすべての置換は、有利には、同じサイクルで並行して生成され、乗算器に並行してロードされることができる。
【0195】
図19は、一実施形態による、制御パターンを生成するための例示的な構成要素についてのハードウェア図を例示する。いくつかの実施形態のフィーチャおよび利点は、制御パターン生成器回路1910を含んでもよく、制御パターン生成器回路1910は、例えば、乗算器配列回路1920と同じ半導体表面上に一体化されてもよい。1つの実施形態において、制御パターン生成器1910は、カーネルの次元、例えば、高さ(H)および幅(W)などを受け取るように(例えば、ソフトウェアを介して)構成される。制御パターン生成器1910は、例えば、乗算器配列1920内の乗算器セル1921~1926の各々に対して、2つのビットを生み出すことができる。一方のビットは、K遅延とK遅延なしとの間を選択してもよく、他方のビットは、単位遅延入力と単位遅延なし入力(例えば、1つの遅延または遅延なし)との間を選択してもよい。各乗算器セルは、例えば、2つのパターンの制御ビットを記憶するための記憶ユニット(例えば、レジスタ)を含むことができる。2つのビットは共に、選択回路構成を使用して、4つのデータ値のうちの1つを選択することができ:x、x+1、x+K、x+K+1、ただし、上述したように、xは、現在のタイルであり、Kは、入力テンソルのタイルサイズの幅を示す変数である。付加的な次元を有するカーネルについて、制御パターン生成器1910は、付加的な次元ごとに付加的なビットを生成し、そのビットが、その付加的な次元についての変数をシフトすることによる付加的な遅延と、付加的な遅延なしとの間を選択する。遅延という用語が、ここで使用されているが、いくつかの場合において、平滑化された入力ストリームのアクセスされる値は、遅延を介してアクセスされず、遅延値をメモリ内のインデックス値として使用することができる相対または絶対アドレッシングシステムを介してアクセスされることに留意されたい。
【0196】
この例において、制御パターン生成器1910は、K遅延論理回路1911と、単位遅延論理回路1912とを備える。K遅延論理回路1911は、例えば、カーネルの単一次元を受け取り、K遅延入力とK遅延なし入力との間を選択するためのH*Hビット値を生み出すことができる。この例において、K遅延論理回路1911は、カーネルの高さHを受け取り、制御パターンのH×H三角配列に対応するH2ビット値を生み出す。この例では、HがK遅延論理回路1911への入力として使用される一方で、他の実施形態は、例えば、幅Wなどの別の次元をK遅延論理回路への入力として使用してよい。さらに、単位遅延論理回路1912は、2つの次元、例えば、高さHおよび幅Wなどを受け取ることができる。単位遅延論理回路1912は、例えば、単位遅延されている(+1)、または単位遅延されていない(例えば、0)入力(例えば、遅延されていないか、またはK遅延されているかのいずれか)間で選択するためのH*Wビット値を生み出す。この例において、単位遅延論理回路1912は、カーネルの高さHおよびカーネルの幅Wを受け取り、H*W三角配列(例えば、
図22の配列2220)に対応するH*Wビット値を生み出す。遅延なし/K遅延および単位遅延/単位遅延なしを選択するためのビット値のペアは、複数の乗算器セル1921~1926に結合され、例えば、各乗算器セルにおけるレジスタなどの記憶回路1930に記憶される。選択は、ここではマルチプレクサ
図1931を用いて例示されているが、複数の異なる選択回路が当業者に知られている。この例において、K遅延論理回路1911からの1つのビット、および単位遅延論理回路1912からの1つのビットは、例えば、遅延なしの入力値、単位遅延された入力値、K遅延された入力値、またはK+1遅延された入力値のうちの1つを選択するために、乗算器セル1921~1926の各々における記憶ユニットに記憶されることができる。
図22に示されるパターン2220と同様のパターンは、乗算器配列1920にわたる記憶回路1930内の第1のビット値に対応することができ、
図22のパターン2210と同様のパターンは、乗算器配列1920にわたり繰り返される記憶回路1930内の第2のビット値に対応して、乗算器配列にわたる入力の選択が制御されることができる。
【0197】
図20は、一実施形態による、乗加算演算を行って出力アクティベーションを生成するための例示的な構成要素についてのハードウェア図を例示する。この例において、拡張カーネル(M*N)からの値は、複数の乗算累積器回路の第1の入力レジスタにロードされ、入力値aijは、複数の乗算累積器回路の第2の入力レジスタにロードされる。例えば、乗算累積器回路は、複数の乗算器2001、2011、2021、2031、2041、および2051を含んでもよく、ただし、複数の乗算器回路には、拡張カーネルから異なる値wijがロードされることができる。各乗算器には、平滑化された入力ストリームの複数のタイルのうちの1つからの入力値がさらにロードされることができる。例えば、a11は、第1のタイルのa11位置(すなわち、タイル内の第1の行かつ第1の列)における値に対応し、これは、選択回路2006(例えば、マルチプレクサ、またはMux)の1つの入力部に結合されることができる。a11入力は、遅延回路2003にさらに結合されて、選択回路2006の第2の入力においてa11の遅延バージョン(例えば、1サイクル遅延)が生み出される。この遅延バージョンは、現在のタイルからタイルに対して1単位を選択する。また、a11は、K遅延回路2004(例えば、バッファまたは先入れ先出しデータ記憶ユニット(「FIFO」)に結合されて、例えば、選択回路2006の別の入力において、Kサイクルだけ遅延されたa11のバージョンが生み出されることができる。これは、現在のタイルの1行下のタイルに対応する。さらに、K遅延回路2004の出力は、別の遅延回路2005の入力において受け取られて、選択回路2006のさらに別の入力において、a11のK+1遅延バージョンが生み出されることができる。同様に、乗算器2011から2021は、例えば、拡張配列の第1の行および入力値a11...aMNに対応する値w12、...、w1(M*N)を受け取る。同じように、拡張配列の他の行に、拡張配列の最後の行まで、入力値a11...aMNが乗算されてもよく、w(M*N)1、...、w(M*N)(M*N)であり、ただし、行は、例えば、上述したような置換された値を含む。乗算器2011、2021、2031、2041、および2051は、遅延2013、2023、2033、2043、および2053、K遅延2014、2024、2034、2044、および2054、遅延2015、2025、2035、2045、および2055、ならびに選択回路2016、2026、2036、2046、および2056をそれぞれ備える。
【0198】
制御パターンは、例えば、a11の様々なバージョン間で選択するために使用されてもよく、その結果、適当なタイルからの入力値には、特定の乗算器に記憶された重みが乗算される。この例において、入力値には、拡張カーネルの第1の行内のシーケンスが乗算され、したがって、a11w11...aMNw1(M*N)は、A(畳み込みを受ける現在のタイル)に対応する制御パターン値を有する。しかしながら、この例において、隣接するタイルに関与する畳み込みを含む、タイル全体にわたる畳み込みを計算することは、隣接するタイル内の入力値が到達するのを待機することを含んでよい。したがって、所与の「現在のタイル」について畳み込みを計算することは、隣接するタイル値が使用可能になるまで、K+1サイクル待機することを含んでよい。付加的な制御パターン値は、カーネルの次元に応じて、上述したように使用されることができる。現在のタイルの畳み込みを計算するために、システムは、例えば、入力値を記憶し、計算を行うために他のタイルからの入力値が使用可能になることを待機することができる。したがって、特定のタイルについての畳み込みは、例えば、特定のタイルについてK+1遅延された入力値、隣接する列タイル内の値としてK遅延された入力値、隣接する行タイル内の入力値として1遅延された値、ならびに、隣接する行タイルおよび隣接する列タイルに隣接するタイル内の入力値として遅延なしの値を使用して、計算されることができる。本明細書は、現在の値(例えば、現在のタイル、または遅延なしの値)、単位(または1)遅延された値、K遅延された値、およびK+1遅延された値を参照するが、そのような遅延は、(例えば、選択回路の入力において)互いに相対的であってよいことを理解されたい。多種多様な他の遅延が、信号経路に存在してよいが、例示の目的のために、ここでは省略されている。さらに、カーネルが付加的な次元を有する場合、M遅延された値などの付加的な遅延値、および対応する回路構成が含まれることになる。
【0199】
入力値a11~aMN(例えば、a11~a33)の配列は、乗算器回路2001、2011、...、2021の配列にロードされてもよく、これらには、各々異なる重みw11、w12、...、w1(M*N)(例えば、w33)もロードされる。上述したように、例えば、各乗算器は、重みを提供する拡張カーネルと同じ次元を有する制御パターン配列から、異なる制御パターン入力を使用して選択された入力を受け取る。各乗算器2001、2011、...、2021の出力は、1つまたは複数の加算器(例えば、加算器2007、2017、2027)に結合されて、積を加算し、畳み込み結果R1を出力することができる。同様に、拡張カーネルの各行は、複数の乗算器にロードされ、制御パターン配列からの対応する行によりマスキングされた入力値のベクトルが乗算されることができる。ここで、値w(M*N)1、w(M*N)2、...、w(M*N)(M*N)を含む拡張カーネルの最後の行は、乗算器2031、2041、および2051の列にロードされ、例えば、ロケーション(M*N、1)、(M*N、2)、...、(M*N、M*N)における値を含む制御パターン配列内の最後の行によって制御される入力値a11、a12、...、aMNと組み合わされる。乗算器の最後の列の出力は、加算器2037、2047、および2057において共に加算されて、例えば、M*N番目の畳み込み結果R(M*N)が生み出される。等価な代替的実施形態において、遅延は、乗算器の出力に結合されてもよい。
【0200】
図21は、一実施形態による、機械学習プロセッサにおいて出力アクティベーションを計算するための例示的な構成要素のレイアウト2100を例示する。例示されるレイアウトは、本明細書で説明される動作を実行するための、機械学習プロセッサ(または他のプロセッサ)内の(論理的および/または物理的)構成要素の1つの可能なレイアウトを表す。レイアウト2100は、ICU2110、複数のMEMタイル2115A~2115N、複数のSXMタイル2120A~2120N、複数のNIMタイル2125A~2125N、およびスーパーセルの配列2130A-Aから2130N-Nを含む。これらの要素は、それらのアルファベットの接尾辞を省略することによって、下記の説明において一般に参照されることができる。
【0201】
ICU2110は、NIMタイル2125に対する命令を出す。これらの命令は、本明細書で説明される畳み込み演算を実行すべく、正確な制御パターン値を用いてスーパーセル2130を構成するようにNIMタイル2125に対して命令する。スーパーセル2130は、正方形グリッド状に配置される。各スーパーセル2130は、サイズを有し、これは、どれだけの値をそれが並行して処理することができるかを示す。スーパーセル2130はすべて、同じサイズを有してよい。例えば、各スーパーセルは、16×16グリッドであってもよく、256個の値を処理することができる。
【0202】
1つの実施形態において、入力チャネルは、2145によって示されるように、スーパーセル2130の中で垂直に分割され、それにより、各入力チャネルは、平滑化された後に、スーパーセル2130の1つまたは複数の層(命名スキームにおける第1の文字によって示される層)によって処理される。1つまたは複数の層は、入力層がスーパーセル2130のサイズより小さいことがあるので、または、入力チャネルの垂直方向の寸法がスーパーセル2130の垂直方向の寸法に均等に分割しない場合には、層のわずかな部分のみを含んでよい。同じ実施形態において、出力フィーチャ(すなわち、異なる出力「チャネル」)は、2155によって示されるように、スーパーセル2130の中で水平に分割される。したがって、スーパーセル2130の1つまたは複数の列(または、わずかな部分)(命名スキームにおける第2の文字によって示される)は、各出力フィーチャを処理するために使用される。
【0203】
スーパーセル2130自体は、上述した乗算累積ユニットと同様であってよい。スーパーセルは、入力値2140に対する畳み込み演算を行った後に、その出力をそれの上のスーパーセル2130に送る。これは、異なる入力層の畳み込みが共に加算されて、多様な入力層からの出力フィーチャ2150が生成されることを可能にする。出力のための多様なチャネルがある場合、上述した(例えば、
図16E~
図16Fにおける)方法を使用して、出力フィーチャ2150の多様なセットが生成される。
【0204】
第1のクロックサイクルで、ICU2110は、第1のNIMタイル2125Aに対して、そのNIMタイル2125Aに関連付けられた1つまたは複数のスーパーセル2130を構成するように命令する。例示される例において、NIMタイル2125Aと同じ層上のスーパーセル2130は、NIMタイル2125Aによって構成される。これらは、スーパーセル2130A-*である(ただし、*は、AからNまでの任意の文字である)。第2のクロックサイクルで、NIMタイル2125Aは、
図13A~
図13Bにおいて説明される方法を使用して、正確な制御パターン値を用いてスーパーセル2130A-Aを構成する。第1のスーパーセル2130A-Aについて、行番号および列番号は、制御パターン値を生成する場合、オフセットを有しない。しかしながら、スーパーセル2130A-A以外の任意の他のスーパーセル2130について、制御パターン値を生成するために使用される行番号および列番号は、付加的なオフセットを有する。列番号について、このオフセットは、構成されているスーパーセル2130の左側(「西」)のスーパーセル2130の数に、スーパーセル2130のセル幅を乗算したものに等しい。行番号について、このオフセットは、構成されているスーパーセル2130の下(「南」)のスーパーセル2130の数に、スーパーセル2130のセル高さを乗算したものに等しい。オフセット値は、スーパーセルのごく一部のうちのどれだけが、先行する入力チャネルまたは出力チャネルの処理で既に使用されているかに従って、付加的にパディングされることができる。このオフセットが使用される理由は、タイル、制御パターン、および拡張カーネルサイズが、スーパーセルのサイズの倍数ではないことがあってよいからであり、したがって、異なるタイルが、異なるスーパーセル2130にわたって広がってよい。これは、制御パターン値も、異なるスーパーセル2130にわたって広がることができることを意味し、したがって、各制御パターン値の計算が、スーパーセル2130の位置によってオフセットされて、スーパーセル2130が処理するタイル、複数のタイル、または複数のタイルのごく一部に対応する正確な制御パターン値が生成されることを必要とする。
【0205】
スーパーセル2130A-Aが制御パターン値を用いて構成されることに並行して(同じクロックサイクルで)、NIMタイル2125Aは、後続のNIMタイル2125B(現在のNIMタイル2125の1つ上、または「北」)に対して、そのスーパーセル2130B-*を構成するための命令により、命令を送る。この命令は、前述したオフセット値を含み、それにより、NIMタイル2125Bは、そのオフセットに相当する正確な制御パターン値を用いてスーパーセル2130B-*を構成する。命令のこの伝播は、入力のサイズに等しい数のスーパーセル2130がNIMタイル2125によって構成されるまで、繰り返される。
【0206】
スーパーレーン内のスーパーセル2130の各構成期間中に、NIMタイル2125は、出力の特定のチャネル(すなわち、出力チャネル)のためのスーパーセル2130のみを構成していてもよい。チャネルは、ICU2110からの命令において指定されることができる。出力の付加的なチャネルのためのスーパーセル2130を構成すべく、ICU2110は、クロックサイクルごとに、NIMタイル2125に対して付加的な命令を出して、出力の付加的なチャネルのためのスーパーセル2130を構成させることができる。これらの命令は、正確なオフセット値を含み、それにより、その出力層を処理するスーパーセル2130は、正確な制御パターン値を生成することができるように、正確な行位置値および列位置値を有する。
【0207】
各クロックサイクルにおいて、ICU2110からの命令は、1つのNIMタイル2125から後続のNIMタイル2125へ「北」に伝播され、一方で、ICU2110は、「東」方向に沿ってスーパーセルに対する命令を出し続ける。したがって、多様なクロックサイクルにわたって、スーパーセル2130は、対角線の「波」において構成される。このようにして、入力チャネルおよび出力チャネルの全セットについての構成は、複数のクロックサイクルの後に構成される。一旦これが完了すると、入力値2140は、ここで説明されたシステムによって受け取られ、出力フィーチャ2150を生成すべく、上述した乗算累積演算と同様のプロセスにおいて、スーパーセル2130によってタイルごとに処理される。
【0208】
図22Aは、一実施形態による例示的な機械学習プロセッサを例示する。本開示のフィーチャおよび利点は、非常に高速に畳み込み演算を実行することができるプロセッサ回路を含む。この例において、サーバコンピュータ2201(またはホスト)は、構成ソフトウェア2210を含んでもよく、構成ソフトウェア2210は、畳み込みを実行するために使用される1つまたは複数のカーネル2213を受け取ることができる。プロセッサ回路2200は、機械学習プロセッサであってもよく、それは、例えば、入力データ(例えば、画像などのアクティベーション)を受け取り、機械学習(人工知能として知られる)アルゴリズムの一部として、入力データにカーネル(例えば、ニューラルネットワーク重み)を適用する回路を指す。この例において、構成ソフトウェア2210(コンパイラと称されることもある)は、ニューラルネットワーク重み2213を受け取る。この例おいて、拡張カーネルまたは制御パターン(または両方)が、ソフトウェアにおいて生成されることができる。例えば、重み2213は、カーネル生成器2212および制御パターン生成器2211によって分析されて、制御パターン2225および拡張カーネル2226が生み出されてもよく、これらは、プロセッサ回路2200内のデータストレージ2220、例えば、メモリまたはレジスタ回路などに記憶されることができる。入力値2280は、例えば、入出力(I/O)回路2222に受け取られ、データバス2224を介して乗算累積器回路2276に結合されることができる。拡張カーネル2226および制御パターン2225も、乗算累積器回路2221に結合されることができる。乗算累積器回路2221は、例えば、上述したように畳み込み結果を生成することができる。いくつかの実施形態において、中間畳み込み結果2227は、データストレージ2220に記憶され、新しいアクティベーション入力2280に対して適用される。他の実施形態において、畳み込み結果2290は、例えば、出力として提供されてもよい。あるいは、畳み込み結果は、他の回路2223、例えば、ベクトルプロセッサ(図示せず)などによって処理されてもよい。
【0209】
図22Aは、別の実施形態による例示的な機械学習プロセッサを例示する。この例において、カーネルは、構成ソフトウェアによって分析されるが、拡張カーネルおよび制御パターンは、ハードウェアにおいて生成されることができる。例えば、1つまたは複数のカーネル(例えば、ニューラルネットワーク重み)2262は、構成ソフトウェア(例えば、コンパイラ)2260において受け取られ、カーネル分析器構成要素2261によって分析されて、値Kを含む拡張カーネルを生成するための構成情報が生み出され、これは、カーネルのサイズおよび他の情報(例えば、処理される入力の次元)から導出されることができる。サーバコンピュータ2251は、構成情報およびKの値をプロセッサ回路2250に送信することができる。この例において、Kは、例えば、入力2285の各行内の数タイルに対応してもよく、ただし、タイルは、カーネルと同じサイズである。構成情報は、制御パターン生成器2277およびシフター回路2278を構成するために使用されることができる。シフター回路2278は、例えば、データストレージ2270に記憶された1つまたは複数のカーネル2275から拡張カーネルを生成するために、カーネルを置換するように構成されることができる。
【0210】
この実施形態において、拡張カーネルは、ハードウェアにおいて生成される。1つまたは複数のカーネル2275は、データストレージ2270に記憶されることができる。例えば、カーネルは、値のシーケンスとしてデータストレージ2270に記憶されてもよく、ただし、シーケンスは、データストレージ2270からアクセスされ、シフト回路構成2278に(例えば、同時に)結合されることができる。上述したように入力シーケンスを置換し、拡張カーネルを生成するために、多種多様なシフト回路が使用されてよい。拡張カーネルを生み出すためにシーケンスを置換するための1つの例示的な回路は、下記でより詳細に説明される。拡張カーネルの値は、例えば、乗算累積器2271内にロードされることができる。ハードウェアにおいてカーネルを拡張することは、必要とされるデータストレージの量を低減することができ、これは、いくつかの実施形態において有利になることができる。
【0211】
本開示の実施形態は、乗算累積器2271と直列にK遅延回路を構成することを含む。この例において、入力値2285は、遅延回路2279に結合されてもよく、遅延回路2279は、例えば、プログラム可能なバッファなどのプログラム可能な遅延回路であってもよい。1つの実施形態において、遅延2279は、例えば、Kの遅延を有するように構成されてもよく、これは、カーネルのサイズ、および入力配列の次元に沿ったタイルの数に応じて異なってよい。1つの実施形態において、遅延2279は、例えば、出力が入力の遅延されたバージョンであり、遅延がKに設定される、先入れ先出し(FIFO)回路であってもよい。入力値はまた、遅延されることなしに、乗算累積器回路2271に直接結合されてもよい。したがって、乗算累積器回路2271は、例えば、現在の入力値と、Kサイクルだけ遅延された入力値とを受け取ることができる。
【0212】
制御パターン生成器2277は、様々な遅延された入力データ値または遅延なしの入力データ値が、上述したように特定の重みと組み合わされるように、制御パターンを実装するための制御信号を生成することができる。特定のパターン制御信号は、例えば、カーネルが各入力タイルに適用される経路、ならびにタイルおよびカーネルを平滑化するために使用される経路に対応することができる。制御パターン生成器2277の出力は、例えば、上述したように入力値の様々な遅延されたバージョンを選択するために使用されることができる。
【0213】
したがって、乗算累積器回路2271は、現在の入力値、K遅延された入力値、拡張カーネル、および異なる入力を選択するための制御信号を受け取る。上述したように、乗算累積器2271は、現在の入力値とK遅延された入力値との両方を遅延させるための付加的な単位遅延回路を含んでもよく、制御パターン生成器2277からの制御信号は、例えば、拡張カーネル内の異なる値に対して乗算される、適当な入力値を選択するために使用されることができる。乗算累積器回路2271の出力は、中間畳み込み2276であってよく、中間畳み込み2276は、例えば、データストレージ2270に記憶され、後続の入力2285により畳み込まれてもよく、または、畳み込み結果は、2295において出力されてもよい。あるいは、畳み込み結果は、他の回路2273、例えば、ベクトルプロセッサ(図示せず)などによって例えば処理されてもよい。
【0214】
(例示的な計算機アーキテクチャ)
図23は、コンピュータ可読媒体からの命令を読み取り、それらをプロセッサ(またはコントローラ)において実行することができる例示的な計算機の構成要素を例示するブロック図である。本明細書で説明されるコンピュータは、
図23に示される単一の計算機、仮想機械、
図23に示される計算機の多様なノードを含む分散計算システム、または計算デバイスの任意の他の適切な構成を含むことができる。本明細書で説明されるコンピュータは、説明される機能を実行するために、先行する図において説明された要素のうちのいずれかによって使用されることができる。
【0215】
例として、
図23は、コンピュータシステム2300の例示的な形態における計算機の図式表現を示し、コンピュータシステム2300内で、命令2324(例えば、ソフトウェア、プログラムコード、またはマシンコード)は、本明細書におけて論じられるプロセスのうちのいずれか1つまたは複数をマシンに実行させるために、コンピュータ可読媒体に記憶されることができる。いくつかの実施形態において、計算機は、スタンドアロンデバイスとして動作し、または他のマシンに接続され(例えば、ネットワーク接続され)てもよい。ネットワーク接続された展開において、機械は、サーバ・クライアントネットワーク環境内のサーバマシンもしくはクライアントマシンとして、またはピア・ツー・ピア(または分散)ネットワーク環境内のピアマシンとして動作することができる。
【0216】
図23において説明される計算機の構造は、上記の図において示される任意のソフトウェア、ハードウェア、または組み合わされた構成要素に対応することができる。
図23は、様々なハードウェア要素およびソフトウェア要素を示しているが、
図1および
図2において説明された構成要素の各々は、付加的な要素またはより少数の要素を含んでもよい。
【0217】
例として、計算機は、パーソナルコンピュータ(PC)、タブレットPC、セットトップボックス(STB)、携帯情報端末(PDA)、携帯電話、スマートフォン、ウェブアプライアンス、ネットワークルータ、モノのインターネット(IoT)デバイス、スイッチもしくはブリッジ、または、そのマシンによって行われるアクションを特定する命令2324を実行することができる任意のマシンであってもよい。さらに、単一の機械のみが例示されているが、「機械」という用語は、本明細書で論じられる方法論のうちのいずれか1つまたは複数を実行するために、個々にまたは共同で命令2324を実行する、機械の任意の集合を含むようにも解釈されるべきである。
【0218】
例示的なコンピュータシステム2300は、1つまたは複数のプロセッサ(一般に、プロセッサ2302)(例えば、中央処理装置(CPU)、グラフィック処理装置(GPU)、デジタル信号プロセッサ(DSP)、1つもしくは複数の特定用途向け集積回路(ASIC)、1つもしくは複数の無線周波数集積回路(RFIC)、または、これらの任意の組み合わせ)、メインメモリ2304、およびスタティックメモリ2306を含み、これらは、バス2308を介して互いに通信するように構成される。コンピュータシステム2300は、グラフィックスディスプレイユニット2310(例えば、プラズマディスプレイパネル(PDP)、液晶ディスプレイ(LCD)、プロジェクター、またはブラウン管(CRT))をさらに含んでよい。コンピュータシステム2300は、英数字入力デバイス2312(例えば、キーボード)、カーソル制御デバイス2314(例えば、マウス、トラックボール、ジョイスティック、モーションセンサ、または他のポインティング機器)、記憶ユニット2316、信号生成デバイス2318(例えば、スピーカ)、および、ネットワークインターフェースデバイス2320も含んでもよく、これらも、バス2308を介して通信するように構成される。
【0219】
記憶ユニット2316は、本明細書で説明される方法論または機能のうちのいずれか1つまたは複数を具現化する命令2324が記憶されたコンピュータ可読媒体2322を含む。命令2324は、コンピュータ可読媒体も構成するコンピュータシステム2300、メインメモリ2304およびプロセッサ2302による、その実行期間中に、メインメモリ2304またはプロセッサ2302内(例えば、プロセッサのキャッシュメモリ内)にも、完全にまたは少なくとも部分的に存在してよい。命令2324は、ネットワークインターフェースデバイス2320を介してネットワーク2326上で送られ、または受け取られることができる。
【0220】
コンピュータ可読媒体2322は、例示的な実施形態において単一の媒体として示されているが、「コンピュータ可読媒体」という用語は、命令(例えば、命令2324)を記憶することができる単一の媒体または多様な媒体(例えば、集中型データベースもしくは分散型データベース、または関連付けられたキャッシュおよびサーバ)を含むように解釈されるべきである。コンピュータ可読媒体は、機械による実行のための命令(例えば、命令2324)を記憶することが可能であり、本明細書で開示される方法論のうちのいずれか1つまたは複数を機械に実行させる、任意の媒体を含むことができる。コンピュータ可読媒体は、ソリッドステートメモリ、光学媒体、および磁気媒体の形態のデータリポジトリを含んでよいが、これらに限定されない。コンピュータ可読媒体は、信号または搬送波などの一時的な媒体を含まない。
【0221】
(付加的な構成考察)
一定の実施形態は、上記の図において例示されるように、例えば、論理または複数の構成要素、エンジン、モジュール、もしくはメカニズムを含むものとして本明細書で説明されている。エンジンは、ソフトウェアモジュール(例えば、コンピュータ可読媒体上で具現されるコード)またはハードウェアモジュールのいずれかを構成することができる。ハードウェアエンジンは、一定の演算を実行することができる有形のユニットであり、一定の手法で構成され、または配置されることができる。例示的な実施形態において、1つもしくは複数のコンピュータシステム(例えば、スタンドアロン、クライアントまたはサーバコンピュータシステム)、またはコンピュータシステム(例えば、プロセッサもしくはプロセッサのグループ)の1つもしくは複数のハードウェアエンジンは、本明細書で説明されるような一定の演算を実行するように動作するハードウェアエンジンとして、ソフトウェア(例えば、アプリケーションまたはアプリケーション部分)によって構成されることができる。
【0222】
様々な実施形態において、ハードウェアエンジンは、機械的にまたは電子的に実装されることができる。例えば、ハードウェアエンジンは、一定の演算を実行するように(例えば、フィールドプログラマブルゲートアレイ(FPGA)または特定用途向け集積回路(ASIC)などの、専用プロセッサとして)恒久的に構成される専用回路構成または論理を含んでもよい。ハードウェアエンジンは、一定の演算を実行するためにソフトウェアによって一時的に構成される(例えば、汎用プロセッサまたは別のプログラム可能なプロセッサ内に包含されるような)プログラム可能な論理または回路構成も含んでもよい。ハードウェアエンジンを機械的に実装するか、専用かつ恒久的に構成される回路構成において実装するか、または一時的に構成される(例えば、ソフトウェアによって構成される)回路構成において実装するかの決定は、コストおよび時間を考慮して駆動されることができると認識されるであろう。
【0223】
本明細書で説明される例示的な方法の様々な動作は、関連する演算を実行するために(例えば、ソフトウェアによって)一時的に構成され、または恒久的に構成される、1つまたは複数のプロセッサ、例えば、プロセッサ202によって、少なくとも部分的に実行されることができる。一時的に構成されるものであれ、恒久的に構成されるものであれ、そのようなプロセッサは、1つまたは複数の演算または機能を実行するように動作するプロセッサ実装エンジンを構成することができる。本明細書で言及されるエンジンは、いくつかの例示的な実施形態において、プロセッサ実装エンジンを含んでもよい。
【0224】
一定の演算の性能は、1つまたは複数のプロセッサ間で分散されてもよく、単一の機械内に存在するだけではなく、複数の機械にわたり展開される。いくつかの例示的な実施形態において、1つまたは複数のプロセッサまたはプロセッサ実装モジュールは、単一の地理的ロケーション(例えば、家庭環境、オフィス環境、またはサーバファーム内)に位置してもよい。他の例示的な実施形態において、1つまたは複数のプロセッサまたはプロセッサ実装モジュールは、複数の地理的ロケーションにわたり分散されてもよい。
【0225】
本開示を読めば、当業者は、本明細書で開示される原理を通じて、同様のシステムまたはプロセスのためのさらに付加的な代替的構造および機能設計を認識するであろう。したがって、特定の実施形態および適用例が例示され、説明されてきたが、開示される実施形態は、本明細書で開示される厳密な構造および構成要素に限定されないことが、理解されたい。当業者には明らかであろう様々な変形、変更、およびバリエーションは、添付の特許請求の範囲において定義される趣旨および範囲から逸脱せずに、本明細書で開示される方法および装置の構成、動作および詳細において行われることができる。