(54)【発明の名称】ニューラルメモリ及びニューラルメモリから受け取られたデータの行のマルチワード距離循環を集合的に行うニューラル処理ユニットのアレイを備えたニューラルネットワークユニット
(58)【調査した分野】(Int.Cl.,DB名)
前記N個のPUのアレイは、W列×H行×Cチャネルの入力にF個のS列×R行×Cチャネルのフィルタを3次元的に畳み込んでF個のP列×Q行の出力を生成するプログラムの命令を実行するように構成され、
前記プログラムは、
(a)S回、前記制御入力に前記第2のデータ入力を選択させ、前記算術ユニットに前記第2の入力と前記第3の入力とを乗算させて積を生成させ、前記積を前記第1の入力と共に累算して前記結果を生成させ、
(b)1回以上、前記制御入力に前記第3又は第4のデータ入力を選択させて、B引くSワードだけの循環を達成させ、Bは、少なくともWと同じ大きさの、Nの最小の因数である
命令を含む、請求項1に記載の装置。
前記第1のメモリにより提供される前記S回のC行の各々が、F個のフィルタブロックとして論理的に区分され、前記F個のフィルタブロックの各フィルタブロックは、前記F個のフィルタのうち対応する1つのフィルタからの異なる重みの、P個のコピーを含む、請求項6に記載の装置。
前記F個のフィルタのうち前記1つのフィルタ内での、前記異なる重みの場所が、前記S回の動作(a)及び(c)のうちどの回が行われるかと、前記少なくともC回の動作(d)のうちどの回が行われるかとによって少なくとも部分的に決定される、請求項7に記載の装置。
前記第1、第2、及び第3の入力に前記演算を行うために、前記算術ユニットは、前記第2の入力と前記第3の入力とを乗算して積を生成し、前記積を前記第1の入力と共に累算して前記結果を生成する、請求項1に記載の装置。
前記N個のPUのアレイの各PUの前記多重化レジスタは第5のデータ入力をさらに有し、前記制御入力は、前記第1、第2、第3、第4、及び第5のデータ入力の選択を制御し、
前記多重化レジスタの前記出力は、
2^L PU離れたPUの前記多重化レジスタの前記第5のデータ入力によりさらに受け取られ、LはKより大きい整数であり、
前記N個のPUの前記多重化レジスタは、前記制御入力が前記第5のデータ入力を指定するとき、2^Lワードだけ循環させるNワード循環器として集合的に動作する、請求項1に記載の装置。
N個の処理ユニット(PU)のアレイを備える装置を動作させる方法であって、各PUは、出力を有する累算器と、第1、第2、及び第3の入力を有し、前記入力に演算を行って前記累算器に記憶する結果を生成する算術ユニットとを備え、前記第1の入力は前記累算器の前記出力を受け取り、前記PUのアレイはさらに、前記算術ユニットへの前記第2の入力により受け取られる重み入力と、第1、第2、第3、及び第4のデータ入力、前記算術ユニットへの前記第3の入力により受け取られる出力、並びに前記第1、第2、第3、及び第4のデータ入力の選択を制御する制御入力を有する多重化レジスタとを有し、前記装置はさらに、N個の重みワードの行を保持し、ある行の前記N個の重みワードを、前記PUアレイの前記N個のPUの、対応する重み入力に提供する第1のメモリと、N個のデータワードの行を保持し、ある行の前記N個のデータワードを、前記PUアレイの前記N個のPUの前記多重化レジスタの、対応する第1のデータ入力に提供する第2のメモリとを備え、前記多重化レジスタの前記出力は、1PU離れたPUの前記多重化レジスタの前記第2のデータ入力と、2^J PU離れたPUの前記多重化レジスタの前記第3のデータ入力と、2^K PU離れたPUの前記多重化レジスタの前記第4のデータ入力と、によりさらに受け取られ、Jは1より大きい整数であり、KはJより大きい整数であり、当該方法は、
前記制御入力が前記第2のデータ入力を指定するとき、前記N個のPUの前記多重化レジスタを、1ワードだけ循環させるNワード循環器として集合的に動作させることと、
前記制御入力が前記第3のデータ入力を指定するとき、前記N個のPUの前記多重化レジスタを、2^Jワードだけ循環させるNワード循環器として集合的に動作させることと、
前記制御入力が前記第4のデータ入力を指定するとき、前記N個のPUの前記多重化レジスタを、2^Kワードだけ循環させるNワード循環器として集合的に動作させることとを含む方法。
W列×H行×Cチャネルの入力にF個のS列×R行×Cチャネルのフィルタを3次元的に畳み込んでF個のP列×Q行の出力を生成するプログラムの命令を、前記N個のPUのアレイによって実行することを含み、
前記プログラムの命令を実行することは、
(a)S回、前記制御入力により前記第2のデータ入力を選択し、前記算術ユニットにより前記第2の入力と前記第3の入力とを乗算して積を生成し、前記積を前記第1の入力と共に累算して前記結果を生成することと、
(b)1回以上、前記制御入力により前記第3又は第4のデータ入力を選択して、B引くSワードだけの循環を達成することであって、Bは、少なくともWと同じ大きさの、Nの最小の因数である、ことと、
を含む、請求項11に記載の方法。
前記第1のメモリにより提供される前記S回のC行の各々が、F個のフィルタブロックとして論理的に区分され、前記F個のフィルタブロックの各フィルタブロックは、前記F個のフィルタのうち対応する1つのフィルタからの異なる重みの、P個のコピーを含む、請求項16に記載の方法。
前記F個のフィルタのうち前記1つのフィルタ内での、前記異なる重みの場所が、前記S回の動作(a)及び(c)のうちどの回が行われるかと、前記少なくともC回の動作(d)のうちどの回が行われるかとによって少なくとも部分的に決定される、請求項17に記載の方法。
前記第1、第2、及び第3の入力に前記演算を行うために、前記算術ユニットは、前記第2の入力と前記第3の入力とを乗算して積を生成し、前記積を前記第1の入力と共に累算して前記結果を生成する、請求項11に記載の方法。
前記N個のPUのアレイの各PUの前記多重化レジスタは第5のデータ入力をさらに有し、前記制御入力は、前記第1、第2、第3、第4、及び第5のデータ入力の選択を制御し、
前記多重化レジスタの前記出力は、
2^L PU離れたPUの前記多重化レジスタの前記第5のデータ入力によりさらに受け取られ、LはKより大きい整数であり、
前記N個のPUの前記多重化レジスタは、前記制御入力が前記第5のデータ入力を指定するとき、2^Lワードだけ循環させるNワード循環器として集合的に動作する、請求項11に記載の方法。
【発明を実施するための形態】
【0007】
アーキテクチャニューラルネットワークユニットを備えたプロセッサ
次いで
図1を参照すると、ニューラルネットワークユニット(NNU)121を含むプロセッサ100を図示するブロック図が示される。プロセッサ100は、命令取出しユニット101、命令キャッシュ102、及び命令トランスレータ104、リネームユニット106、リザベーションステーション108、メディアレジスタ118、汎用レジスタ(GPR)116、NNU121以外の実行ユニット112、並びにメモリサブシステム114を含む。
【0008】
プロセッサ100は、集積回路の中央演算処理装置(CPU)として機能する電子デバイスである。プロセッサ100は、デジタルデータを入力として受け取り、そのデータを、メモリから取り出された命令に従って処理し、命令によって規定される動作の結果を出力として生成する。プロセッサ100は、デスクトップコンピュータ、モバイルコンピュータ、又はタブレットコンピュータで用いられることがあり、計算、テキスト編集、マルチメディアの表示、及びインターネットの閲覧などの用途に用いられる。プロセッサ100は、組み込みシステムの中に配設されて、電気製品、携帯電話、スマートフォン、自動車、及び産業用制御デバイスを含む、幅広い種類のデバイスを制御することもある。CPUは、算術演算、論理演算、及び入出力動作を含む演算をデータに行うことにより、コンピュータプログラム(「コンピュータアプリケーション」又は「アプリケーション」とも呼ばれる)の命令を実行する電子回路(すなわち「ハードウェア」)である。集積回路(IC)は、半導体材料、通例はシリコンの小片上に作製される電子回路の組である。ICは、チップ、マイクロチップ、又はダイとも呼ばれる。
【0009】
命令取出しユニット101は、システムメモリ(図示せず)から命令キャッシュ102へのアーキテクチャ命令103の取り出しを制御する。命令取出しユニット101は、プロセッサ100がアーキテクチャ命令バイトのキャッシュラインをそこから取り出して命令キャッシュ102に入れるメモリアドレスを指定する、命令キャッシュ102へのフェッチアドレスを提供する。フェッチアドレスは、プロセッサ100の命令ポインタ(図示せず)、又はプログラムカウンタの現在の値に基づく。通常、プログラムカウンタは、命令の流れの中で分岐命令、呼び出し命令、若しくは戻り命令などの制御命令に遭遇しない限り、又は、割込み、トラップ、例外、若しくは障害などの例外条件が発生しない限り、命令のサイズずつ連続的に増分されて行き、上記制御命令又は例外条件の場合、プログラムカウンタは、分岐先アドレス、戻りアドレス、又は例外ベクトルなどの非連続的なアドレスで更新される。一般的に言って、プログラムカウンタは、実行ユニット112/121による命令の実行に応答して更新される。プログラムカウンタは、命令トランスレータ104がプロセッサ100の命令セットアーキテクチャで定義されていない命令103に遭遇するなど、例外条件の検出に応答して更新される場合もある。
【0010】
命令キャッシュ102は、プロセッサ100に結合されたシステムメモリから取り出されたアーキテクチャ命令103をキャッシュする。アーキテクチャ命令103は、ニューラルネットワークへ移動(move to neural network:MTNN:)命令及びニューラルネットワークから移動(move from neural network:MFNN)命令を含み、これらについては下記でより詳細に説明する。一実施形態では、アーキテクチャ命令103は、x86命令セットアーキテクチャ(ISA)の命令であり、MTNN及びMFNN命令が追加されている。本開示の文脈では、x86ISAプロセッサは、Intel(登録商標)80386(登録商標)プロセッサが同じ機械言語命令を実行するときに生成する同じ結果を命令セットアーキテクチャレベルで生成するプロセッサである。ただし、他の実施形態は、Advanced RISC Machines(ARM)(登録商標)、Sun SPARC(登録商標)、又はPowerPC(登録商標)などの他の命令セットアーキテクチャを企図する。命令キャッシュ102は、アーキテクチャ命令103を命令トランスレータ104に提供し、命令トランスレータ104は、アーキテクチャ命令103をマイクロ命令105に翻訳する。
【0011】
マイクロ命令105は、リネームユニット106に提供され、最終的に実行ユニット112/121によって実行される。マイクロ命令105は、アーキテクチャ命令を実装する。好ましくは、命令トランスレータ104は、頻繁に実行されるアーキテクチャ命令103及び/又は比較的複雑性の低いアーキテクチャ命令103をマイクロ命令105に翻訳する第1の部分を含んでいる。命令トランスレータ104は、マイクロコードユニット(図示せず)を含む第2の部分も含んでいる。マイクロコードユニットは、アーキテクチャ命令セットのうち複雑な命令及び/又はまれに使用される命令を実装するマイクロコード命令を保持するマイクロコードメモリを備える。マイクロコードユニットは、非アーキテクチャマイクロプログラムカウンタ(マイクロPC)をマイクロコードメモリに提供するマイクロシーケンサも備える。好ましくは、マイクロコード命令は、マイクロトランスレータ(図示せず)によってマイクロ命令105に翻訳される。マイクロコードユニットが現在制御権を有するか否かに依存して、セレクタが、マイクロ命令105を、第1の部分又は第2の部分のどちらかから、リネームユニット106に提供するために選択する。
【0012】
リネームユニット106は、アーキテクチャ命令103の中で指定されるアーキテクチャレジスタを、プロセッサ100の物理レジスタにリネーミングする。好ましくは、プロセッサ100は、リオーダバッファ(図示せず)を備える。リネームユニット106は、プログラムの順序で、リオーダバッファ内のエントリを各マイクロ命令105に割り振る。それにより、プロセッサ100は、マイクロ命令105とそれらに対応するアーキテクチャ命令103をプログラムの順序でリタイアできるようになる。一実施形態では、メディアレジスタ118は256ビット幅であり、GPR116は64ビット幅である。一実施形態では、メディアレジスタ118は、高度ベクトル拡張(Advanced Vector Extensions:AVX)レジスタなどのx86メディアレジスタである。
【0013】
一実施形態では、リオーダバッファの各エントリは、マイクロ命令105の結果のための記憶域を含む。加えて、プロセッサ100はアーキテクチャレジスタファイルを備え、アーキテクチャレジスタファイルは、アーキテクチャレジスタ、例えば、メディアレジスタ118及びGPR116及び他のアーキテクチャレジスタ、の各々に対応する物理レジスタを含む。(好ましくは、例えば、メディアレジスタ118とGPR116はサイズが異なるため、それらに別個のレジスタファイルがある。)アーキテクチャレジスタを指定するマイクロ命令105の各ソースオペランドに対して、リネームユニットは、マイクロ命令105のソースオペランドフィールドに、そのアーキテクチャレジスタに書き込みをする古いマイクロ命令105のうち最も新しいもののリオーダバッファ索引を投入する。実行ユニット112/121がマイクロ命令105の実行を完了すると、実行ユニット112/121は、結果をマイクロ命令105のリオーダバッファエントリに書き込む。マイクロ命令105がリタイアする時、リタイアユニット(図示せず)が、結果を、マイクロ命令のリオーダバッファエントリから、リタイアするマイクロ命令105によって指定されるアーキテクチャ宛先レジスタに関連付けられた物理レジスタファイルのレジスタに書き込む。
【0014】
別の実施形態では、プロセッサ100は、アーキテクチャレジスタの数よりも多い物理レジスタを含む物理レジスタファイルを備えるが、アーキテクチャレジスタファイルを含まず、リオーダバッファエントリは、結果の記憶域を含まない。(好ましくは、例えば、メディアレジスタ118とGPR116はサイズが異なるため、それらに別個の物理レジスタファイルがある。)プロセッサ100は、アーキテクチャレジスタごとに関連付けられたポインタを持つポインタテーブルも備える。アーキテクチャレジスタを指定するマイクロ命令105のオペランドに対して、リネームユニットは、マイクロ命令105中の宛先オペランドフィールドに、物理レジスタファイル内の空きレジスタに対するポインタを投入する。物理レジスタファイルに空いているレジスタがない場合、リネームユニット106はパイプラインをストールする(stalls)。アーキテクチャレジスタを指定するマイクロ命令105の各ソースオペランドについて、リネームユニットは、マイクロ命令105中のソースオペランドフィールドに、そのアーキテクチャレジスタに書き込みをする古いマイクロ命令105のうち最も新しいものに割り当てられた物理レジスタファイル内のレジスタに対するポインタを投入する。実行ユニット112/121がマイクロ命令105の実行を完了すると、実行ユニット112/121は、マイクロ命令105の宛先オペランドフィールドによってポイントされる物理レジスタファイルのレジスタに結果を書き込む。マイクロ命令105がリタイアする時、リタイアユニットは、マイクロ命令105の宛先オペランドフィールド値を、リタイアするマイクロ命令105によって指定されるアーキテクチャ宛先レジスタに関連付けられたポインタテーブル内のポインタにコピーする。
【0015】
リザベーションステーション108は、マイクロ命令105が実行のために実行ユニット112/121に発行できる状態になるまで、マイクロ命令105を保持する。マイクロ命令105が発行できる状態になるのは、そのソースオペランドがすべて利用可能になり、実行のために実行ユニット112/121が利用できるときである。実行ユニット112/121は、上記で説明された第1の実施形態ではリオーダバッファ若しくはアーキテクチャレジスタファイルから、又は第2の実施形態では物理レジスタファイルから、レジスタソースオペランドを受け取る。加えて、実行ユニット112/121は、実行ユニット112/121から直接、結果転送バス(図示せず)を介してレジスタソースオペランドを受け取ることもできる。加えて、実行ユニット112/121は、リザベーションステーション108から、マイクロ命令105によって指定される即値オペランドを受け取ることができる。下記でより詳細に論じるように、MTNN及びMFNNアーキテクチャ命令103は、MTNN及びMFNNアーキテクチャ命令103が翻訳された1つ又は複数のマイクロ命令105の1つで提供される、NNU121によって行われるべき関数を指定する即値オペランドを含む。
【0016】
実行ユニット112は、メモリサブシステム114からデータをロードし及びデータをメモリサブシステム114に記憶する1つ又は複数のロード/記憶ユニット(図示せず)を備える。好ましくは、メモリサブシステム114は、メモリ管理ユニット(図示せず)を備え、メモリ管理ユニットは、例えば、トランスレーションルックアサイドバッファ及びテーブルウォークユニット、レベル1データキャッシュ(及び命令キャッシュ102)、レベル2ユニファイドキャッシュ、並びに、プロセッサ100とシステムメモリとの間のインターフェースをとるバスインターフェースユニットを含むことができる。一実施形態では、
図1のプロセッサ100は、ラストレベルキャッシュメモリを共有するマルチコアプロセッサ内の複数の処理コアの1つである処理コアを表している。実行ユニット112は、整数ユニット、メディアユニット、浮動小数点ユニット、及び分岐ユニットも含むことができる。
【0017】
NNU121は、重みランダムアクセスメモリ(RAM)124、データRAM122、N個のニューラル処理ユニット(NPU)126、プログラムメモリ129、シーケンサ128、並びに制御及び状態レジスタ127を含む。NPU126は、概念的には神経回路網内のニューロンとして機能する。重みRAM124、データRAM122、及びプログラムメモリ129はすべて、MTNN及びMFNNアーキテクチャ命令103を介して、それぞれ、書き込み及び読み出しが可能である。重みRAM124は、N個の重みワードのW個の行として編成され(arranged)、データRAM122はN個のデータワードのD個の行として編成される。各データワード及び各重みワードは、複数ビットであり、好ましくは、8ビット、9ビット、12ビット、又は16ビットである。各データワードは、ネットワーク内の前の層のニューロンの出力値(活性化と呼ばれることもある)として機能し、各重みワードは、ネットワークの当該層のニューロンに入ってくる接続に関連付けられた重みとして機能する。NNU121の使用例の多くでは、重みRAM124に保持されているワード又はオペランドは、実際にニューロンに入ってくる接続に関連付けられた重みであるが、NNU121の他の使用例では、重みRAM124に保持されるワードは重みではなく、それにもかかわらず、重みRAM124に記憶されることから「重みワード」と呼ばれることを理解されたい。例えば、NNU121の使用例によっては、例えば
図24〜
図26Aの畳み込みの例や
図27〜
図28のプーリングの例では、重みRAM124は、データ行列の要素、例えば画像画素データなど、重み以外を保持することもある。同様に、NNU121の使用例の多くでは、データRAM122に保持されるワード又はオペランドは、実際にニューロンの出力値又は活性化であるが、NNU121の他の使用例では、データRAM122に保持されるワードはそのようなものではなく、それにもかかわらず、データRAM122に記憶されることから「データワード」と呼ばれることを理解されたい。例えば、NNU121の使用例によっては、例えば
図24〜
図26Aの畳み込みの例では、データRAM122は、畳み込みカーネルの要素など、ニューロン出力以外を保持することもある。
【0018】
一実施形態では、NPU126及びシーケンサ128は、組み合わせ論理、順序論理、ステートマシン、又はそれらの組み合わせを含む。アーキテクチャ命令(例えば、MFNN命令1500)は、状態レジスタ127の内容をGPR116の1つにロードして、NNU121のステータス、例えば、NNU121がコマンドを完了したこと、若しくはNNU121がプログラムメモリ129から稼働させていたプログラムを完了したこと、又はNNU121が、新しいコマンドを受け取るか若しくは新しいNNUプログラムを開始するのに空いていることを決定する。
【0019】
有利な点として、NPU126の数は必要に応じて増やすことができ、それに応じて、重みRAM124及びデータRAM122のサイズを幅及び深さの両方で拡張することができる。好ましくは、重みRAM124の方が大きい。それは、典型的なニューラルネットワーク層には各ニューロンに関連付けられた多数の接続と、したがって多数の重みがあるためである。データワード及び重みワードのサイズ、並びに重みRAM124及びデータRAM122のサイズ、並びにNPU126の数に関して、様々な実施形態が本明細書に記載される。一実施形態では、64KB(8192ビット×64行)のデータRAM122、2MB(8192ビット×2048行)の重みRAM124、及び512個のNPU126を持つNNU121が、台湾セミコンダクターマニュファクチュアリングカンパニー(Taiwan Semiconductor Manufacturing Company,Limited:TSMC)の16nmプロセスで実装され、約3.3mm
2の面積を占める。
【0020】
シーケンサ128は、プログラムメモリ129から命令を取り出して実行し、これは、とりわけ、データRAM122、重みRAM124及びNPU126に提供するアドレス及び制御信号を生成することを含む。シーケンサ128は、N個のNPU126に対して提供されるN個のデータワードのD個の行のうち1つを選択するための、データRAM122に提供されるメモリアドレス123及び読み出しコマンドを生成する。シーケンサ128は、N個のNPU126に対して提供されるN個の重みワードのW個の行のうち1つを選択するための、重みRAM124に提供されるメモリアドレス125及び読み出しコマンドをさらに生成する。NPU126に対する提供のためにシーケンサ128によって生成されるアドレス123と125の順番が、ニューロン間の「つながり」を決定する。シーケンサ128は、N個のNPU126から書き込みされるN個のデータワードのD個の行のうち1つを選択するための、データRAM122に提供されるメモリアドレス123及び書き込みコマンドをさらに生成する。シーケンサ128は、N個のNPU126から書き込みされるN個の重みワードのW個の行のうち1つを選択するための、重みRAM124に提供されるメモリアドレス125及び書き込みコマンドをさらに生成する。シーケンサ128は、下記で説明するように、シーケンサ128に提供されるNNU命令を選択するための、プログラムメモリ129に対するメモリアドレス131をさらに生成する。メモリアドレス131は、シーケンサ128がループ命令(例えば、
図26Aを参照されたい)などの制御命令に遭遇しない限り、シーケンサ128がプログラムメモリ129の連続した場所を通じて一般に増分するプログラムカウンタ(図示せず)に対応している。制御命令に遭遇した場合、シーケンサ128は、プログラムカウンタを制御命令の目標アドレスに更新する。シーケンサ128は、NPU126に対する制御信号をさらに生成して、各種の動作又は機能を行うようにNPU126に命令し、そのような動作又は機能には、初期化、算術演算/論理演算、循環(rotate)及びシフト演算、活性化関数、並びに書き戻し動作(write back operations)等があり、その例は下記でより詳細に説明する(例えば、
図34のマイクロ操作(micro-operations)3418を参照されたい)。
【0021】
NPU126は、N個の結果ワード133を生成し、それらは、重みRAM124の行又はデータRAM122に書き戻すことができる。好ましくは、重みRAM124及びデータRAM122は、N個のNPU126に直接結合されている。より具体的には、重みRAM124及びデータRAM122は、NPU126に専用であり、プロセッサ100のその他の実行ユニット112によって共有されず、NPU126は、重みRAM124とデータRAM122の一方又は両方の行を、クロックサイクルごとに持続的な形で、好ましくはパイプライン方式で消費することができる。一実施形態では、データRAM122及び重みRAM124は各々、各クロックサイクルに8192ビットをNPU126に提供することができる。8192ビットは、下記でより詳細に説明するように、512個の16ビットワード又は1024個の8ビットワードとして消費されることが可能である。
【0022】
有利な点として、NNU121によって処理できるデータセットのサイズは、重みRAM124及びデータRAM122のサイズに制限されるのではなく、システムメモリのサイズによってのみ制限される。これは、データ及び重みが、MTNN命令及びMFNN命令を使用して(例えば、メディアレジスタ118を通じて)、システムメモリとRAM124及びデータRAM122との間で移動されることがあるためである。一実施形態では、データRAM122はデュアルポートであって、データワードが同時にデータRAM122から読み出され又はデータRAM122に書き込まれる間に、データワードがデータRAM122に書き込まれることを可能にする。さらに、キャッシュメモリを含むメモリサブシステム114の大規模なメモリ階層が、システムメモリとNNU121との間の伝達に非常に高いデータ帯域幅を提供する。さらには、好ましくは、メモリサブシステム114は、ハードウェアデータプリフェッチャを含み、これは、システムメモリからのニューラルデータや重みのロードなどのメモリアクセスパターンを追跡し、キャッシュ階層へのデータのプリフェッチを行って、重みRAM124及びデータRAM122に対する高帯域幅及び低レイテンシ伝達を容易にする。
【0023】
各NPU126に提供されるオペランドの1つが重みメモリから提供され、それが重みと表される実施形態が記載され、これはニューラルネットワークで広く使用されるが、オペランドは、記載される装置によって速度が向上する可能性のある算出に関連する他タイプのデータであってもよいことを理解されたい。
【0024】
次いで
図2を参照すると、
図1のNPU126を図示するブロック図が示される。NPU126は、多くの機能又は演算を行うように動作する。詳細には、有利な点として、NPU126は、人工ニューラルネットワーク内のニューロン又はノードとして動作して、典型的な積和(multiply-accumulate)関数又は演算を行うように構成される。すなわち、一般的に言って、NPU126(ニューロン)は次のように構成される。(1)自身への接続を持つ各ニューロンから、必ずしもそうとは限らないが通例は人工ニューラルネットワークのすぐ前の層から、入力値を受け取り、(2)各入力値を、その接続に関連付けられた対応する重み値で乗算して積を生成し、(3)すべての積を加算して和を生成し、(4)この和に活性化関数を行って、上記ニューロンの出力を生成する。しかし、従来のようにすべての接続入力に関連するすべての乗算を行ってからすべての積を一緒に加算するのではなく、有利な点として、各ニューロンは、所与のクロックサイクルにおいて、接続入力の1つに関連付けられた重みの乗算演算を行ってから、その積を、その時点までの前のクロックサイクル中に処理された接続入力に関連する積の累算値と加算(累算)するように構成される。ニューロンへの接続がM個あると仮定すると、M個の積すべてが累算された後(これは約Mクロックサイクルを要する)、ニューロンが活性化関数を累算された値に行って、出力又は結果を生成する。これには、ニューロン中で、より少ない乗算器と、すべての接続入力に関連付けられた積のすべて又はサブセットさえを加算するのに必要とされるであろう加算器よりもより小さい、より単純な、及びより高速な加算器回路(例えば、2入力の加算器)とで済むという利点がある。このことは、ひいては、NNU121内におけるかなり多くの数(N)のニューロン(NPU126)を容易にするという利点があり、そのため、約Mクロックサイクルの後、NNU121は、多数(N個)のニューロンのすべてに対して出力を生成している。最後に、そのようなニューロンで組織されるNNU121は、多数の異なる接続入力に対する人工ニューラルネットワーク層として効率的に働くという利点がある。すなわち、Mが異なる層について増加又は減少すると、ニューロンの出力を生成するために必要とされるクロックサイクル数がそれに応じて増加又は減少し、リソース(例えば、乗算器や累算器)が最大限に利用される。それに対して、より従来型の設計では、より小さい値のMについて、乗算器のうちいくつかと加算器の一部分とが利用されないことがある。そのため、本明細書に記載される実施形態は、NNU121のニューロンへの接続入力の数に関して柔軟性及び効率の利益を有し、極めて高い性能を提供する。
【0025】
NPU126は、レジスタ205、2入力多重化レジスタ(mux−reg)208、算術論理ユニット(ALU)204、累算器202、及び活性化関数ユニット(AFU)212を備える。レジスタ205は、重みRAM124から重みワード206を受け取り、出力203を後のクロックサイクルで提供する。mux−reg208は、入力207又は211の一方を選択して自身のレジスタに記憶し、それから出力209において後のクロックサイクルで提供する。一方の入力207は、データRAM122からデータワードを受け取る。他方の入力211は、隣接するNPU126の出力209を受け取る。
図2に示すNPU126は、
図1のN個のNPU126のうちのNPU Jと表される。すなわち、NPU Jは、N個のNPU126の代表事例である。好ましくは、NPU Jのmux−reg208の入力211は、NPU126のインスタンスJ−1のmux−reg208の出力209を受け取り、NPU Jのmux−reg208の出力209は、NPU126のインスタンスJ+1のmux−reg208の入力211に提供される。このようにして、N個のNPU126のmux−reg208は、
図3に関して下記でより詳細に説明するように、Nワードの循環器(rotater)又はサーキュラーシフタ(circular shifter)として集合的に動作する。制御入力213は、2つの入力のうちいずれをmux−reg208が選択して自身のレジスタに記憶し、それが後に出力209で提供されるかを、制御する。
【0026】
ALU204は3つの入力を有する。1つの入力は、レジスタ205から重みワード203を受け取る。別の入力は、mux−reg208の出力209を受け取る。もう1つの入力は、累算器202の出力217を受け取る。ALU204は、入力に算術演算及び/又は論理演算を行って、出力で提供される結果を生成する。好ましくは、ALU204によって行われる算術演算及び/又は論理演算は、プログラムメモリ129に記憶された命令によって指定される。例えば、
図4の積和命令は、積和演算を指定し、すなわち、結果215は、累算器202の値217と、重みワード203とmux−reg208の出力209のデータワードとの積と、の和になる。指定されることが可能な他の演算には、これらに限定されないが以下が含まれる。結果215が、mux−reg出力209のパススルーされた値である;結果215が、重みワード203のパススルーされた値である;結果215がゼロである;結果215が、重みワード203のパススルーされた値である;結果215が、累算器202の値217と重みワード203との和である;結果215が、累算器202の値217とmux−reg出力209との和である;結果215が、累算器202の値217と重みワード203とのうちの最大値である;結果215が、累算器202の値217とmux−reg出力209とのうちの最大値である。
【0027】
ALU204は、出力215を、累算器202における記憶のために累算器202に提供する。ALU204は、乗算器242を含み、乗算器242は、重みワード203とmux−reg208の出力209のデータワードとを乗算して積246を生成する。一実施形態では、乗算器242は、2つの16ビットオペランドを乗算して32ビットの結果を生成する。ALU204は、加算器244をさらに含み、加算器244は、積246を累算器202の出力217に加算して和を生成する。この和は、累算器202に記憶するために累算器202に累算される結果215である。一実施形態では、加算器244は、乗算器242の32ビットの結果を累算器202の41ビット値217に加算して41ビットの結果を生成する。このようにして、複数のクロックサイクルの経過にわたってmux−reg208の循環器態様を使用して、NPU126は、ニューラルネットワークにより必要とされるとおり、ニューロンについての積の総計を達成する。ALU204は、上記のような他の算術演算/論理演算を行う他の回路要素も含むことができる。一実施形態では、第2の加算器が、mux−reg208の出力209のデータワードから重みワード203を引いて差を生成し、次いで、この差を加算器244が累算器202の出力217に加算して和215を生成し、この和215が累算器202に累算される結果である。このようにして、複数のクロックサイクルの経過にわたり、NPU126は差の総計を達成することができる。好ましくは、重みワード203とデータワード209とは(ビット単位で)同じサイズであるが、下記でより詳細に説明するように、これらは異なる2進小数点の場所を有することができる。好ましくは、乗算器242及び加算器244は、下記でより詳細に説明するように整数乗算器及び整数加算器であって、浮動小数点の乗算器や加算器よりもあまり複雑でない、より小さい、より高速な、及びより低電力消費のALU204を有利に達成する。ただし、他の実施形態ではALU204は浮動小数点演算を行うことを理解されたい。
【0028】
図2は、ALU204の中に乗算器242及び加算器244のみを示しているが、好ましくは、ALU204は、上記の他の演算を行う他の要素を含む。例えば、好ましくは、ALU204は、累算器202をデータワード/重みワードと比較する比較器(図示せず)、及び、比較器によって指示される2つの値のうち大きい方の値(最大値)を累算器202に記憶するために選択するmux(図示せず)を含む。別の例として、好ましくは、ALU204は選択論理(図示せず)を含み、この選択論理は、データワード/重みワードに関して乗算器242を迂回して、加算器244がそのデータワード/重みワードを累算器202の値217に加算して、累算器202に記憶するための和を生成できるようにする。そのような追加的な動作については下記で例えば
図18〜
図29Aに関連してより詳細に説明され、例えば畳み込み演算及びプーリング演算を行うために有用である可能性がある。
【0029】
AFU212は、累算器202の出力217を受け取る。AFU212は、累算器202の出力217に活性化関数を行って、
図1の結果133を生成する。一般的に言って、人工ニューラルネットワークの中間層のニューロン内の活性化関数は、累算された積の和を、好ましくは非線形的に、基準化する(normalize)働きをすることができる。累算された和を「基準化」するために、当該ニューロンの活性化関数は、当該ニューロンに接続されたニューロンが入力として受け取ることを予期する値の範囲内で結果値を作り出す。(基準化された結果は「活性化」と呼ばれることがあり、活性化は、本明細書に記載されるように、当該ノードの出力であり、その出力を、受信側ノードが、出力側ノードと受信側ノードとの間の接続に関連付けられた重みで乗算して積を生成し、その積が、受信側ノードへのその他の入力接続に関連する他の積と共に累算される。)例えば、受信するニューロン/接続されたニューロンは、入力として0と1の間の値を受け取ることを予期する場合があり、その場合、出力側のニューロンは、0から1の範囲の外側にある累算された和を、予期される範囲内の値に、非線形的に押し込め及び/又は調節する必要があり得る(例えば、負の値を正の値に変容させる上方シフト)。そのため、AFU212は、累算器202の値217に演算を行って、結果133を既知の範囲内にする。N個のNPU126すべての結果133が、同時にデータRAM122又は重みRAM124のどちらかに書き戻されることが可能である。好ましくは、AFU212は、複数の活性化関数を行うように構成され、入力、例えば制御レジスタ127からのものが、累算器202の出力217に行うべき活性化関数のうち1つを選択する。活性化関数には、これらに限定されないが、ステップ関数、正規化関数(rectify function)、シグモイド関数、ハイパーボリックタンジェント(tanh)関数、及びソフトプラス関数(平滑正規化とも呼ばれる)が含まれる可能性がある。ソフトプラス関数は、分析関数f(x)=ln(1+e
x)であり、すなわち、1とe
xとの和の自然対数であり、「e」はオイラー数であり、xはこの関数への入力217である。好ましくは、活性化関数は、下記でより詳細に説明するように、累算器202の値217又はその一部分をパススルーするパススルー関数をさらに含む場合がある。一実施形態では、AFU212の回路は、1クロックサイクル内に活性化関数を行う。一実施形態では、AFU212は表を備え、これらの表は、累算された値を受け取り、活性化関数のうちいくつか、例えばシグモイド、ハイパーボリックタンジェント、ソフトプラスについて、本物の活性化関数が提供するであろう値に密接に近似した値を出力する。
【0030】
好ましくは、累算器202の幅(ビット単位)は、AFU212の出力133の幅より大きい。例えば、一実施形態では、累算器は41ビット幅であって、最大で512個の32ビット積の累算における精度の損失を回避し(下記で例えば
図30に関連してより詳細に説明する)、結果133は16ビット幅である。
図8に関連して下記でより詳細にその一例が説明される一実施形態では、連続するクロックサイクル中に、「未処理の(raw)」累算器202の出力217値の種々の部分が、AFU212をパススルーされ、データRAM122又は重みRAM124に書き戻される。これにより、未処理の累算器202値が、MFNN命令を介してメディアレジスタ118に再びロードされることが可能になり、そのため、プロセッサ100の他の実行ユニット112で実行される命令が、AFU212が行うことのできない複雑な活性化関数を行うことができ、そのような活性化関数には、基準化指数関数とも呼ばれる、よく知られたソフトマックス活性化関数などがある。一実施形態では、プロセッサ100の命令セットアーキテクチャは、一般にe
x又はexp(x)と呼ばれる指数関数を行う命令を含み、これを使用してプロセッサ100の他の実行ユニット112によるソフトマックス活性化関数の実行の速度を上げることができる。
【0031】
一実施形態では、NPU126はパイプライン化される。例えば、NPU126は、ALU204の乗算器及び加算器及び/又は他の回路の間のレジスタなどの、ALU204のレジスタと、AFU212の出力を保持するレジスタとを含むことができる。NPU126の他の実施形態は、下記で説明する。
【0032】
次いで
図3を参照すると、
図1のNNU121のN個のNPU126のN個のmux−reg208の編成(arrangement)の実施形態を図示するブロック図が示され、これは、
図1のデータRAM122から受け取られるデータワード207の行に対する、Nワード循環器又はサーキュラーシフタとしてのmux−reg208の動作を図示している。
図3の実施形態では、Nは512であり、そのため、NNU121は、示されるように、512個のNPU126に対応する、0〜511と表される512個のmux−reg208を有する。各mux−reg208は、データRAM122のD個の行のうち1つの行からなる、自身の対応するデータワード207を受け取る。すなわち、mux−reg0は、データRAM122の行のデータワード0を受け取り、mux−reg1は、データRAM122の行のデータワード1を受け取り、mux−reg2は、データRAM122の行のデータワード2を受け取り、以下同様に続き、mux−reg511は、データRAM122の行のデータワード511を受け取る。さらに、mux−reg1は、他の入力211上でmux−reg0の出力209を受け取り、mux−reg2は、他の入力211上でmux−reg1の出力209を受け取り、mux−reg3は、他の入力211上でmux−reg2の出力209を受け取り、以下同様に続き、mux−reg511は、他の入力211上でmux−reg510の出力209を受け取り、mux−reg0は、他の入力211上でmux−reg511の出力209を受け取る。mux−reg208の各々は、データワード207を選択するか循環された入力211を選択するかを制御する制御入力213を受け取る。下記でより詳細に説明するように、ある動作モードでは、最初のクロックサイクルで、制御入力213は、レジスタ内における記憶のため及びALU204に対する後の提供のためにデータワード207を選択するようにmux−reg208の各々を制御し、後のクロックサイクル(例えば、上記のようにM−1のクロックサイクル)中は、制御入力213は、レジスタ内における記憶のため及びALU204に対する後の提供のために、循環された入力211を選択するようにmux−reg208の各々を制御する。
【0033】
図3(並びに下記の
図7及び
図19)は、NPU126がmux−reg208/705の値を右に、すなわちNPU JからNPU J+1に循環させるように構成される実施形態を説明しているが、NPU126がmux−reg208/705の値を左に、すなわちNPU JからNPU J−1に循環させるように構成される実施形態(
図24〜
図26の実施形態に関するものなど)が企図される。さらに、NPU126が、例えばNNU命令の命令により指定されるとおり、mux−reg208/705の値を選択的に左又は右に循環させるように構成される実施形態が企図される。
【0034】
次いで
図4を参照すると、
図1のNNU121のプログラムメモリ129に記憶されてNNU121によって実行されるプログラムを図示する表が示される。この例示的プログラムは、上記のような人工ニューラルネットワークの層に関連する算出を行う。
図4の表には、4つの行及び3つの列が示される。各行は、第1の列に表されるプログラムメモリ129のアドレスに対応している。第2の列は命令を指定し、第3の列は、その命令に伴うクロックサイクル数を指示する。好ましくは、クロックサイクル数は、命令のレイテンシではなく、パイプライン化された実施形態における命令当たりクロック(clocks-per-instruction)型の値で有効クロック数を指示する。図示されるように、命令の各々は、NNU121のパイプライン化された性質に起因して、関連付けられた1クロックサイクルを有し、アドレス2における命令は例外であり、この命令は、下記でより詳細に説明するように、該命令が自身を実際上511回繰り返すため、511クロックを必要とする。
【0035】
プログラムの各命令について、NPU126のすべてが該命令を並列に行う。すなわち、すべてのN個のNPU126が、同じクロックサイクルに1番目の行の命令を行い、すべてのN個のNPU126が同じクロックサイクルに2番目の行の命令を行い、以下同様に続く。ただし、命令の一部が部分的に並列で部分的に順次なやり方で行われる他の実施形態が下記に記載され、例えば、NPU126が活性化関数ユニットを共有する実施形態におけるアドレス3及び4の活性化関数及び出力命令であり、例えば
図11の実施形態に関連する。
図4の例は、1つの層に512個のニューロン(NPU126)があり、各々が、前の層の512個のニューロンからの512個の接続入力を有し、合計で256K個の接続があると仮定している。各ニューロンは、各接続入力から16ビットのデータ値を受け取り、その16ビットのデータ値に適切な16ビットの重み値を乗算する。
【0036】
アドレス0(ただし他のアドレスが指定されることもある)にある1番目の行は、NPU初期化命令を指定する。初期化命令は、累算器202の値をゼロにクリアする。一実施形態では、初期化命令は、この命令によってアドレスが指定されるデータRAM122又は重みRAM124の行の対応するワードを、累算器202にロードすることを指定することもできる。初期化命令は、
図29A及び
図29Bに関して下記でより詳細に説明するように、構成値を制御レジスタ127にさらにロードする。例えば、データワード207と重みワード209の幅をロードすることができ、その幅がALU204によって使用されて、回路によって行われる演算のサイズを決定することができ、また、この幅は、累算器202に記憶される結果215に影響する可能性がある。一実施形態では、NPU126は、累算器202に記憶される前にALU204の出力215を飽和させる回路を含み、初期化命令が構成値を回路にロードしてその飽和に影響を与える。一実施形態では、累算器202は、ALU関数命令(例えば、アドレス1の積和命令)、又はアドレス4のAFU出力書き出し命令などの出力命令の中でその旨を指定することにより、ゼロ値にクリアされることも可能である。
【0037】
アドレス1にある2番目の行は、積和命令を指定し、この命令は、512個のNPU126に対して、データRAM122の行からそれぞれのデータワードをロードし、重みRAM124の行からそれぞれの重みワードをロードし、データワード入力207及び重みワード入力206に第1の積和演算を行うように命令し、この積和は、初期化された累算器202のゼロ値と共に累算される。より具体的には、上記命令は、シーケンサ128に対して、データワード入力207を選択するための制御入力213上の値を生成するように命令する。
図4の例では、指定されるデータRAM122の行は行17であり、指定される重みRAM124の行は行0であり、このことは、シーケンサ128に、17のデータRAMアドレス123値を出力し、0の重みRAMアドレス125値を出力するように命令する。その結果、データRAM122の行17にあった512個のデータワードが、512個のNPU126の対応するデータ入力207に提供され、重みRAM124の行0にあった512個の重みワードが、512個のNPU126の対応する重み入力206に提供される。
【0038】
アドレス2にある3番目の行は、511のカウントを持つ積和循環命令を指定し、これは、512個のNPU126の各々に、511回の積和演算を行うように命令する。この命令は、512個のNPU126に、511回の積和演算の各々についてALU204に入力されるデータワード209が隣接のNPU126からの循環された値211であるように命令する。すなわち、この命令は、シーケンサ128に、上記循環値211を選択するための制御入力213上の値を生成するように命令する。加えて、この命令は、512個のNPU126に、511回の積和演算の各々についてのそれぞれの重みワードを、重みRAM124の「次の」行からロードするように命令する。すなわち、この命令は、シーケンサ128に、前のクロックサイクルにおけるその値に対して1だけ重みRAMのアドレス125を増分するように命令し、これは、この例では、命令の最初のクロックサイクルでは行1、次のクロックサイクルでは行2、その次のクロックサイクルでは行3となり、以下同様に続き、511回目のクロックサイクルでは行511となる。511回の積和演算の各々について、循環された入力211と重みワード入力206との積が、前の値と共に累算器202に累算される。512個のNPU126は、511回の積和演算を511クロックサイクルで行い、ここで、各NPU126は、データRAM122の行17からの異なるデータワード、すなわち、前のサイクルで隣接NPU126によって操作されたデータワードと、そのデータワードに関連付けられた異なる重みワードとに積和演算を行い、重みワードは、概念的には、そのニューロンへの異なる接続入力である。この例では、各NPU126(ニューロン)への接続入力の数は512であると仮定され、したがって、512個のデータワード及び512個の重みワードを伴う。行2の積和循環命令の最後の反復が行われると、累算器202は、512個の接続入力すべてについての積の和を含んでいる。一実施形態では、ALU演算の各タイプ(例えば、上記のように積和、累算器と重みワードとの最大値など)について別個の命令があるのではなく、NPU126の命令セットは、
図29AのALU関数2926で指定されるものなど、NPU初期化命令によって指定されるALU演算を行うようにALU204に命令する「実行」命令を含む。
【0039】
アドレス3にある4番目の行は、活性化関数命令を指定する。活性化関数命令は、AFU212に、指定された活性化関数を累算器202の値217に行って結果133を生成するように命令する。一実施形態による活性化関数については下記でより詳細に説明する。
【0040】
アドレス4にある5番目の行は、AFU出力書き出し命令を指定し、これは、512個のNPU126に、各自のAFU212の出力を結果133として、データRAM122の行、この例では行16に書き戻すように命令する。すなわち、この命令は、16のデータRAMアドレス123値と書き込みコマンドとを出力するようにシーケンサ128に命令する(アドレス1の積和命令の場合における読み出しコマンドとは対照的に)。好ましくは、AFU出力書き出し命令の実行は、パイプライン化された性質で他の命令の実行に重ねられることができ、AFU出力書き出し命令は、1クロックサイクルで効果的に実行される。
【0041】
好ましくは、各NPU126は、各種の機能要素、例えば、mux−reg208(及び
図7のmux−reg705)、ALU204、累算器202、AFU212、(
図8の)mux802、(
図11の)行バッファ1104及びAFU1112などを含むパイプラインとして構成され、これらのうちいくつかはそれ自体がパイプライン化される場合もある。データワード207及び重みワード206に加えて、パイプラインは、プログラムメモリ129から命令を受け取る。命令は、パイプラインを流れて行き、各種の機能ユニットを制御する。代替的な一実施形態では、活性化関数命令は、プログラムに含まれない。代わりに、NPU初期化命令が、累算器202の値217に行われる活性化関数を指定し、その指定された活性化関数を指示する値が構成レジスタに保存され、後に、最終的な累算器202の値217が生成されると、すなわち、アドレス2にある積和循環命令の最後の反復が完了すると、パイプラインのAFU212部分によって使用される。好ましくは、電力節減の目的で、パイプラインのAFU212部分は、AFU出力書き出し命令がその部分に達するまで非アクティブであり、命令が達した時にAFU212が電源投入され、初期化命令によって指定される累算器202の出力217に活性化関数を行う。
【0042】
次いで
図5を参照すると、NNU121による
図4のプログラムの実行を図示するタイミング図が示される。タイミング図の各行は、1番目の列に指示される連続したクロックサイクルに対応している。その他の列は各々、512個のNPU126のうち異なる1つに対応し、そのNPUの動作を指示する。図示を簡略且つ明瞭にするために、NPU0、1、及び511についてのみ動作を示している。
【0043】
クロック0に、512個のNPU126の各々が、
図4の初期化命令を行い、これは
図5では累算器202へのゼロ値の代入によって図示されている。
【0044】
クロック1に、512個のNPU126の各々が、
図4のアドレス1にある積和命令を行う。示されるように、NPU0は、累算器202の値(ゼロである)を、データRAM122の行17のワード0と重みRAM124の行0のワード0との積と共に累算し、NPU1は、累算器202の値(ゼロである)を、データRAM122の行17のワード1と重みRAM124の行0のワード1との積と共に累算し、以下同様に続き、NPU511は、累算器202の値(ゼロである)を、データRAM122の行17のワード511と重みRAM124の行0のワード511との積と共に累算する。
【0045】
クロック2に、512個のNPU126の各々は、
図4のアドレス2にある積和循環命令の1回目の反復を行う。示されるように、NPU0は、累算器202の値を、NPU511のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード511であった)と重みRAM124の行1のワード0との積と共に累算し、NPU1は、累算器202の値を、NPU0のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード0であった)と重みRAM124の行1のワード1との積と共に累算し、以下同様に続き、NPU511は、累算器202の値を、NPU510のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード510であった)と重みRAM124の行1のワード511との積と共に累算する。
【0046】
クロック3に、512個のNPU126の各々は、
図4のアドレス2にある積和循環命令の2回目の反復を行う。示されるように、NPU0は、累算器202の値を、NPU511のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード510であった)と重みRAM124の行2のワード0との積と共に累算し、NPU1は、累算器202の値を、NPU0のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード511であった)と重みRAM124の行2のワード1との積と共に累算し、以下同様に続き、NPU511は、累算器202の値を、NPU510のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード509であった)と重みRAM124の行2のワード511との積と共に累算する。
図5の省略記号によって指示されるように、これは、・・・に至るまで、続く509クロックサイクルの各々について継続する。
【0047】
クロック512に、512個のNPU126の各々は、
図4のアドレス2にある積和循環命令の511回目の反復を行う。示されるように、NPU0は、累算器202の値を、NPU511のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード1であった)と重みRAM124の行511のワード0との積と共に累算し、NPU1は、累算器202の値を、NPU0のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード2であった)と重みRAM124の行511のワード1との積と共に累算し、以下同様に続き、NPU511は、累算器202の値を、NPU510のmux−reg208の出力209から受け取られた循環データワード211(データRAM122から受け取られたデータワード0であった)と重みRAM124の行511のワード511との積と共に累算する。一実施形態では、データワード及び重みワードをデータRAM122及び重みRAM124から読み込んで
図4のアドレス1の積和命令を行うために複数のクロックサイクルが必要とされる。しかしながら、データRAM122及び重みRAM124並びにNPU126はパイプライン化されており、そのため、最初の積和演算が開始されると(例えば、
図5のクロック1中に示されるように)、後続の積和演算(例えばクロック2〜512中に示される)は、続くクロックサイクルで開始される。好ましくは、NPU126は、アーキテクチャ命令、例えばMTNN若しくはMFNN命令(
図14及び
図15に関連して下記で説明する)、又はアーキテクチャ命令が翻訳されたマイクロ命令による、データRAM122及び/又は重みRAM124のアクセスに応答して、短時間ストールすることができる。
【0048】
クロック513に、512個のNPU126各々のAFU212が、
図4のアドレス3にある活性化関数命令を行う。最後、クロック514に、512個のNPU126の各々は、各自の結果133を、データRAM122の行16の自身の対応するワードに書き戻すことにより、
図4のアドレス4におけるAFU出力書き出し命令を行い、すなわち、NPU0の結果133は、データRAM122のワード0に書き込まれ、NPU1の結果133は、データRAM122のワード1に書き込まれ、以下同様に続き、NPU511の結果133は、データRAM122のワード511に書き込まれる。上記で
図5に関して説明した動作は、ブロック図の形態で
図6Aにも示している。
【0049】
次いで
図6Aを参照すると、
図4のプログラムを実行する
図1のNNU121を図示するブロック図が示される。NNU121は、512個のNPU126、アドレス入力123を受け取るデータRAM122、及び、アドレス入力125を受け取る重みRAM124を含む。示されていないが、クロック0に、512個のNPU126は、初期化命令を行う。示されるように、クロック1に、行17の512個の16ビットのデータワードが、データRAM122から読み出され、512個のNPU126に提供される。クロック1〜512に、行0〜511の512の16ビット重みワードが、それぞれ、重みRAM124から読み出され、512個のNPU126に提供される。示されていないが、クロック1に、512個のNPU126は、ロードしたデータワード及び重みワードにそれぞれの積和演算を行う。クロック2〜512に、512個のNPU126のmux−reg208は、512個の16ビットワードの循環器として動作して、直前にロードされたデータRAM122の行17のデータワードを、隣接するNPU126に循環させ、NPU126は、それぞれの循環データワードと重みRAM124からロードされたそれぞれの重みワードとに積和演算を行う。図示されていないが、クロック513に、512個のAFU212は活性化命令を行う。クロック514に、512個のNPU126は、それぞれの512個の16ビットの結果133を、データRAM122の行16に書き戻す。
【0050】
観察できるように、作り出されてデータRAM122又は重みRAM124に書き戻される結果ワード(ニューロン出力)を生成するために必要なクロック数は、およそ、ニューラルネットワークの現在の層に受け取られるデータ入力(接続)の数の平方根である。例えば、現在の層が512個のニューロンを有し、各々が前の層からの512個の接続を有する場合には、接続の総数は256K個であり、現在の層についての結果を生成するために必要なクロック数は512をわずかに上回る。したがって、NNU121は、ニューラルネットワークの計算に極めて高い性能を提供する。
【0051】
次いで
図6Bを参照すると、
図1のプロセッサ100がアーキテクチャプログラムを行う動作を図示するフローチャートが示され、このアーキテクチャプログラムは、NNU121を使用して、例えば
図4のプログラムによって行われるような、従来は人工ニューラルネットワークの隠れ層のニューロンに関連する積和活性化関数の計算を行う。
図6Bの例は、4つの隠れ層(ブロック602のNUM_LAYERS変数の初期化で表される)についての計算を仮定し、各層は512個のニューロンを有し、各ニューロンは、(
図4のプログラムを使用することによって)前の層の512個のニューロンと完全に接続されている。ただし、これらの層及びニューロンの数は説明の目的で選択されたものであり、NNU121を用いて、異なる数の隠れ層及び異なる数の層当たりのニューロンに、また非完全に接続されたニューロンに、同様の計算を行うことが可能であることを理解されたい。一実施形態では、重み値は、層内にニューロンの存在しないことに対して、又はニューロンへの接続の存在しないことに対して、ゼロに設定されてもよい。好ましくは、アーキテクチャプログラムは、第1の重みのセットを重みRAM124に書き込み、NNU121を開始し、NNU121が第1の層に関連する計算を行っている間に、アーキテクチャプログラムは、第2の重みのセットを重みRAM124に書き込み、そのため、NNU121が第1の隠れ層についての計算を完了すると、NNU121は直ちに第2の層についての計算を開始することができる。このようにして、アーキテクチャプログラムは、重みRAM124の2つの領域の間を行き来して、NNU121を最大限に利用された状態に保つ。フローはブロック602で開始する。
【0052】
ブロック602で、プロセッサ100、すなわちプロセッサ100で稼働しているアーキテクチャプログラムが、ニューロンの現在の隠れ層への入力値をデータRAM122に、例えば、
図6Aに関して示し説明するようにデータRAM122の行17に、書き込む。或いは、この値は、前の層(例えば、畳み込み層、プーリング層、又は入力層)についてのNNU121の演算の結果133として、データRAM122の行17にすでに存在している場合もある。加えて、アーキテクチャプログラムは、変数Nを1の値に初期化する。変数Nは、隠れ層のうち、NNU121によって処理されている現在の層を表す。加えて、この例では4つの隠れ層があるため、アーキテクチャプログラムは、変数NUM_LAYERSを4の値に初期化する。フローはブロック604に進む。
【0053】
ブロック604で、プロセッサ100は、層1の重みワードを重みRAM124に、例えば、
図6Aに示すように行0〜511に、書き込む。フローはブロック606に進む。
【0054】
ブロック606で、プロセッサ100は、プログラムメモリ129に書き込みをする関数1432を指定するMTNN1400命令を使用して、積和活性化関数プログラム(例えば
図4の)をNNU121のプログラムメモリ129に書き込む。プロセッサ100は、次いで、プログラムの実行を開始する関数1432を指定するMTNN1400命令を使用して、NNUプログラムを開始する。フローは判定ブロック608に進む。
【0055】
判定ブロック608で、アーキテクチャプログラムは、変数Nの値がNUM_LAYERSより小さいかどうかを決定する。小さい場合、フローはブロック612に進み、それ以外の場合、フローはブロック614に進む。
【0056】
ブロック612で、プロセッサ100は、層N+1の重みワードを重みRAM124に、例えば、行512〜1023に書き込む。したがって、有利な点として、アーキテクチャプログラムは、NNU121が現在の層について隠れ層の計算を行っている間に、次の層の重みワードを重みRAM124に書き込み、そのため、NNU121は、現在の層についての計算が完了する、すなわちデータRAM122に書き込まれると、直ちに次の層について隠れ層の計算の実行を開始することができる。フローはブロック614に進む。
【0057】
ブロック614で、プロセッサ100は、現在稼働しているNNUプログラム(層1の場合はブロック606で開始され、層2〜4の場合はブロック618で開始されたもの)が完了したと決定する。好ましくは、プロセッサ100は、MFNN1500命令を実行してNNU121の状態レジスタ127を読み出すことによってこれを判定する。代替的な一実施形態では、NNU121は、割込みを生成して、積和活性化関数層のプログラムを完了したことを示す。フローは判定ブロック616に進む。
【0058】
判定ブロック616で、アーキテクチャプログラムは、変数Nの値がNUM_LAYERSより小さいかどうかを決定する。小さい場合、フローはブロック618に進み、それ以外の場合、フローはブロック622に進む。
【0059】
ブロック618で、プロセッサ100は、積和活性化関数プログラムを更新し、それにより、プロセッサ100は層N+1についての隠れ層の計算を行えるようになる。より具体的には、プロセッサ100は、
図4のアドレス1における積和命令のデータRAM122の行値を、前の層が結果を書き込んだデータRAM122の行に(例えば、行16に)更新し、さらに、出力行を(例えば、行15に)更新する。プロセッサ100は、次いで、更新されたNNUプログラムを開始する。或いは、
図4のプログラムは、アドレス1の積和命令で指定される行(すなわちデータRAM122から読み出された行)と同じ行を、アドレス4の出力命令中で指定する。この実施形態では、入力されたデータワードの現在の行が上書きされる(このことは、データワードのその行が何らかの他の目的に必要とされない限り許容できる。その理由は、データワードのその行はすでにmux−reg208に読み込まれており、Nワード循環器を介してNPU126間で現在循環されているためである)。この場合は、ブロック618でNNUプログラムの更新は必要なく、NNUプログラムを再開するだけでよい。フローはブロック622に進む。
【0060】
ブロック622で、プロセッサ100は、層Nについて、NNUプログラムの結果をデータRAM122から読み出す。ただし、結果がその後単に次の層によって使用されるだけの場合は、アーキテクチャプログラムは、結果をデータRAM122から読み出す必要はない場合もあり、しかし代わりに、次の隠れ層の計算のために結果をデータRAM122に残しておくことができる。フローは判定ブロック624に進む。
【0061】
判定ブロック624で、アーキテクチャプログラムは、変数Nの値がNUM_LAYERSより小さいかどうかを決定する。小さい場合、フローはブロック626に進み、それ以外の場合、フローは終了する。
【0062】
ブロック626で、アーキテクチャプログラムは、Nを1だけ増分する。フローは判定ブロック608に戻る。
【0063】
図6Bの例から判断できるように、約512クロックサイクルごとに、NPU126はデータRAM122から一度読み出し、データRAM122に一度書き込む(
図4のNNUプログラムの動作により)。加えて、NPU126は、およそ毎クロックサイクルごとに重みRAM124を読み出して、重みワードの行を読み出す。したがって、重みRAM124の帯域幅全体が、NNU121が隠れ層の演算を行うハイブリッド方式によって消費される。加えて、
図17のバッファ1704のような書き込み及び読み出しバッファを含んでいる実施形態を仮定すると、NPU126の読み出しと同時に、プロセッサ100が重みRAM124に書き込みをし、そのため、バッファ1704は、約16クロックサイクルごとに1回の書き込みを重みRAM124に対して行って、重みワードを書き込む。したがって、重みRAM124がシングルポートである実施形態(
図17に関して説明するものなど)では、約16クロックサイクルごとに、バッファ1704が重みRAM124に書き込めるように、NPU126が重みRAM124を読み出すことをストールされなければならない。しかし、重みRAM124がデュアルポートである実施形態では、NPU126をストールさせる必要はない。
【0064】
次いで
図7を参照すると、代替的な一実施形態による
図1のNPU126を図示するブロック図が示される。
図7のNPU126は、多くの点で
図2のNPU126に似ている。ただし、
図7のNPU126は、第2の2入力mux−reg705を追加的に含む。mux−reg705は、入力206又は711の一方を選択して自身のレジスタに記憶し、それから出力203において後のクロックサイクルで提供する。入力206は、重みRAM124から重みワードを受け取る。他方の入力711は、隣接するNPU126の第2のmux−reg705の出力203を受け取る。好ましくは、NPU Jのmux−reg705の入力711は、NPU126のインスタンスJ−1のmux−reg705の出力203を受け取り、NPU Jの出力は、NPU126のインスタンスJ+1のmux−reg705の入力711に提供される。このようにして、N個のNPU126のmux−reg705は、上記で
図3に関して説明した仕方と同じように、しかしデータワードに対してではなく重みワードに対して、Nワード循環器として集合的に動作する。制御入力713が、2つの入力のうちいずれをmux−reg705が選択してそのレジスタに記憶し、それが後に出力203で提供されるかを、制御する。
【0065】
mux−reg208及び/又はmux−reg705(並びに
図18及び
図23の実施形態などの他の実施形態のmux−reg)を含めて、データRAM122及び/又は重みRAM124から受け取られる行のデータ/重みを循環させる大きな循環器を効果的に形成することには、さもなければ必要なデータワード/重みワードを適切なNNU121に提供するためにデータRAM122及び/又は重みRAM124の間で必要となるであろう極めて大きなmuxを、NNU121が必要としないという利点がある。
【0066】
活性化関数の結果に加えた累算値の書き戻し
応用例によっては、プロセッサ100が未処理の累算器202の値217を(例えば、
図15のMFNN命令を介してメディアレジスタ118に)再び受け取り、その値に、他の実行ユニット112で実行されている命令が計算を行えると有用である。例えば、一実施形態では、AFU212の複雑性を低減するために、AFU212はソフトマックス活性化関数を行うように構成されない。したがって、NNU121は、未処理の累算器202の値217又はそのサブセットを、データRAM122又は重みRAM124に出力することができ、それを後にアーキテクチャプログラムがデータRAM122又は重みRAM124から読み出して、その未処理値に計算を行う。ただし、未処理の累算器202の値217の使用は、ソフトマックスの実行に限定されず、他の使用例が企図される。
【0067】
次いで
図8を参照すると、代替的な一実施形態による
図1のNPU126を図示するブロック図が示される。
図8のNPU126は、多くの点で
図2のNPU126に似ている。ただし、
図8のNPU126は、制御入力803を有する多重化器(mux)802をAFU212に含んでいる。累算器202の幅(ビット単位)は、データワードの幅より大きい。mux802は、累算器202の出力217のデータワード幅分を受け取る複数の入力を有する。一実施形態では、累算器202の幅は41ビットであり、NPU126は、16ビットの結果ワード133を出力するように構成され、したがって、例えば、mux802(又は
図30のmux3032及び/若しくはmux3037)は、累算器202の出力217のビット[15:0]、ビット[31:16]、及びビット[47:32]をそれぞれ受け取る3つの入力を備える。好ましくは、累算器202から提供されるのでない出力ビット(例えば、ビット[47:41])は、ゼロ値ビットに強制される。
【0068】
シーケンサ128は、下記の
図9のアドレス3〜5のACC書き出し命令などのACC書き出し命令に応答して、制御入力803に値を生成して、累算器202のワード(例えば、16ビット)のうち1つを選択するようにmux802を制御する。好ましくは、mux802は、データワードの幅である出力を生成する活性化関数回路(例えば、
図30の要素3022、3024、3026、3018、3014、及び3016)の出力を受け取る1つ又は複数の入力をさらに有する。シーケンサ128は、
図4のアドレス4におけるAFU出力書き出し命令などの命令に応答して、制御入力803に値を生成して、累算器202のワードのうち1つではなく活性化関数回路の出力のうち1つを選択するようにmux802を制御する。
【0069】
次いで
図9を参照すると、
図1のプログラムメモリ129に記憶され、NNU121によって実行されるプログラムを図示する表が示される。
図9の例示的プログラムは、多くの点で
図4のプログラムに似ている。具体的には、アドレス0〜2の命令は同一である。しかし、
図4のアドレス3及び4における命令が、
図9ではACC書き出し命令に置き換えられており、この命令は、512個のNPU126に各自の累算器202の出力217を結果133として、データRAM122の3つの行に書き戻すように命令し、3つの行はこの例では行16〜18である。すなわち、ACC書き出し命令は、シーケンサ128に命令して、最初のクロックサイクルに16のデータRAMアドレス123値と書き込みコマンドとを出力させ、2番目のクロックサイクルに17のデータRAMアドレス123値と書き込みコマンドとを出力させ、3番目のクロックサイクルに18のデータRAMアドレス123値と書き込みコマンドとを出力させる。好ましくは、ACC書き出し命令の実行は、他の命令の実行に重ねられることができ、ACC書き出し命令は、データRAM122内で書き込まれる行ごとに1クロックサイクルずつ、3クロックサイクルで効果的に実行される。一実施形態では、ユーザが、活性化関数2934及び出力コマンド2956フィールドの値を制御レジスタ127(
図29Aの)内で指定して、累算器202の所望部分の、データRAM122又は重みRAM124への書き込みを達成する。或いは、累算器202の内容全体を書き戻すのではなく、ACC書き出し命令は、任意で、累算器202のサブセットを書き戻してもよい。一実施形態では、
図29〜
図31に関連して下記でより詳細に説明するように、累算器202の基準形式(canonical form)を書き戻すことができる。
【0070】
次いで
図10を参照すると、NNU121による
図9のプログラムの実行を図示するタイミング図が示される。
図10のタイミング図は
図5のタイミング図と似ており、クロック0〜512は同じである。ただし、クロック513〜515に、512個のNPU126の各々のAFU212が、
図9のアドレス3〜5におけるACC書き出し命令のうち1つを行う。具体的には、クロック513に、512個のNPU126の各々が、各自の結果133として、データRAM122の行16の自身の対応するワードに、累算器202の出力217のビット[15:0]を書き戻し、クロック514に、512個のNPU126の各々が、各自の結果133として、データRAM122の行17の自身の対応するワードに、累算器202の出力217のビット[31:16]を書き戻し、クロック515に、512個のNPU126の各々が、各自の結果133として、データRAM122の行18の自身の対応するワードに、累算器202の出力217のビット[40:32]を書き込む。好ましくは、ビット[47:41]はゼロ値に強制される。
【0071】
共有AFU
次いで
図11を参照すると、
図1のNNU121の一実施形態を図示するブロック図が示される。
図11の実施形態では、ニューロンが、活性化関数ユニット部分とALU部分(シフトレジスタ部分も含む)との2つの部分に分割され、各活性化関数ユニット部分は、複数のALU部分により共有される。
図11では、ALU部分は、NPU126として参照され、共有される活性化関数ユニット部分は、AFU1112として参照される。このことは、例えば、各ニューロンが専用のAFU212を備える
図2の実施形態と対照的である。したがって、例えば、一実施形態では、
図11の実施形態のNPU126(ALU部分)は、
図2の累算器202、ALU204、mux−reg208、及びレジスタ205を含むが、AFU212を含まない。
図11の実施形態では、NNU121は、512個のNPU126を一例として含むが、他の数のNPU126を持つ他の実施形態が企図される。
図11の例では、512個のNPU126は、各々8つのNPU126からなる64個のグループにグループ化され、
図11においてグループ0〜63として参照される。
【0072】
NNU121は、行バッファ1104と、NPU126と行バッファ1104との間に結合された複数の共有AFU1112とをさらに含む。行バッファ1104は、データRAM122又は重みRAM124の行と同じ幅(ビット単位)であり、例えば512ワードである。1つのNPU126グループにつき1つのAFU1112があり、すなわち、各AFU1112が、対応するNPU126グループを有する。したがって、
図11の実施形態では、64個のNPU126グループに対応する64個のAFU1112がある。1つのグループ内の8つのNPU126の各々が、対応するAFU1112を共有する。グループ当たりに異なる数のAFU1112及びNPU126を有する他の実施形態が企図される。例えば、1つのグループ内の2個、4個、又は16個のNPU126がAFU1112を共有する他の実施形態が企図される。
【0073】
AFU1112を共有する動機は、NNU121のサイズを低減することである。サイズの低減は、性能の低下という犠牲を払って得られる。すなわち、例えば下記の
図12で実証されるとおり、共有比に依存して、NPU126のアレイ全体の結果133を生成するのに数クロック長くかかる可能性があり、
図12の場合には、8:1の共有比のため、7のさらなるクロックサイクルが必要とされる。ただし、一般的に言って、この追加的なクロック数(例えば7)は、累算和を生成するために必要とされるクロック数(例えば、1ニューロン当たり512個の接続がある層では512クロック)と比べて、比較的少ない。したがって、この比較的小さな性能への影響(例えば、計算時間の1%の増加)は、NNU121の低減されたサイズに対して、価値のあるトレードオフであり得る。
【0074】
一実施形態では、NPU126の各々は、比較的単純な活性化関数を行うAFU212を含み、それにより、上記単純なAFU212が比較的小さくあり、したがって各NPU126に含まれることを可能にしている。それに対して、共有される、又は複雑なAFU1112は、比較的複雑な活性化関数を行い、したがって、単純なAFU212よりも比較的大幅に大きい。そのような実施形態では、追加的なクロックサイクルは、複雑なAFU1112の共有を必要とする複雑な活性化関数が指定されるときのみ必要とされ、単純なAFU212が行うように構成された活性化関数が指定されるときには必要とされない。
【0075】
次いで
図12及び
図13を参照すると、
図11のNNU121による
図4のプログラムの実行を図示する2つのタイミング図が示される。
図12のタイミング図は、
図5タイミング図と似ており、クロック0〜512は同じである。ただし、クロック513において、動作が
図5のタイミング図に記載される動作と異なり、なぜならば、
図11のNPU126はAFU1112を共有するからである。すなわち、1つのグループのNPU126は、そのグループに関連付けられたAFU1112を共有し、
図11はこの共有を図示している。
【0076】
図13のタイミング図の各行は、1番目の列に指示される連続したクロックサイクルに対応している。その他の列はそれぞれ、64個のAFU1112のうち異なる1つに対応し、そのAFUの動作を指示する。図示を簡略且つ明瞭にするために、AFU0、1、及び63のみの動作を示している。
図13のクロックサイクルは、
図12のクロックサイクルに対応しているが、異なる仕方でNPU126によるAFU1112の共有を図示している。
図13に示されるように、クロック0〜512において、64個のAFU1112の各々は非アクティブであり、一方、NPU126は、NPU初期化並びに積和及び積和循環命令を行う。
【0077】
図12と
図13の両方に示されるように、クロック513において、AFU0(グループ0に関連付けられたAFU1112)が、グループ0の1番目のNPU126であるNPU0の累算器202の値217に、指定された活性化関数の実行を開始する。AFU0の出力は、行バッファ1104のワード0に記憶されることになる。さらに、クロック513において、AFU1112の各々が、自身の対応するNPU126のグループ内の1番目のNPU126の累算器202に、指定された活性化関数の実行を開始する。したがって、クロック513には、
図13に示されるように、AFU0は、NPU0の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード0に記憶されることになる結果を生成し、AFU1は、NPU8の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード8に記憶されることになる結果を生成し、以下同様に続き、AFU63は、NPU504の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード504に記憶されることになる結果を生成する。
【0078】
示されるように、クロック514において、AFU0(グループ0に関連付けられたAFU1112)が、グループ0の2番目のNPU126であるNPU1の累算器202の値217に、指定された活性化関数の実行を開始し、AFU0の出力は、行バッファ1104のワード1に記憶されることになる。さらに、クロック514において、AFU1112の各々が、自身の対応するNPU126のグループ内の2番目のNPU126の累算器202に、指定された活性化関数の実行を開始する。したがって、クロック514には、
図13に示されるように、AFU0は、NPU1の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード1に記憶されることになる結果を生成し、AFU1は、NPU9の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード9に記憶されることになる結果を生成し、以下同様に続き、AFU63は、NPU505の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード505に記憶されることになる結果を生成する。このパターンは、示されるように、クロックサイクル520において、AFU0(グループ0に関連付けられたAFU1112)が、グループ0内の8番目(最後)のNPU126であるNPU7の累算器202の値217に指定された活性化関数の実行を開始するまで続き、AFU0の出力は、行バッファ1104のワード7に記憶されることになる。さらに、クロック520において、AFU1112の各々が、自身の対応するNPU126のグループ内の8番目のNPU126の累算器202に、指定された活性化関数の実行を開始する。したがって、クロック520には、
図13に示されるように、AFU0は、NPU7の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード7に記憶されることになる結果を生成し、AFU1は、NPU15の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード15に記憶されることになる結果を生成し、以下同様に続き、AFU63は、NPU511の累算器202に指定された活性化関数を実行し始めて、行バッファ1104のワード511に記憶されることになる結果を生成する。
【0079】
512個のNPU126に関連するすべての512個の結果が生成され、行バッファ1104に書き込まれると、クロック521において、行バッファ1104は、その内容の、データRAM122又は重みRAM124に対する書き出しを開始する。このようにして、NPU126の64個のグループの各々のAFU1112は、
図4のアドレス3にある活性化関数命令の一部分を行う。
【0080】
ALU204のグループ間でAFU1112を共有する
図11のような実施形態は、例えば下記で
図29A〜
図33との関連でより詳細に説明する、整数ALU204との関連で特に有利である可能性がある。
【0081】
MTNN及びMFNNアーキテクチャ命令
次いで
図14を参照すると、
図1のNNU121の一部分に関する、ニューラルネットワークへ移動(MTNN)アーキテクチャ命令1400とその動作を図示するブロック図が示される。MTNN命令1400は、オペコードフィールド1402、src1フィールド1404、src2フィールド1406、gprフィールド1408、及び即値フィールド1412を含む。MTNN命令1400は、アーキテクチャ命令であり、すなわちプロセッサ100の命令セットアーキテクチャに含まれている。好ましくは、命令セットアーキテクチャは、オペコードフィールド1402の所定の値をMTNN命令1400に関連付けて、MTNN命令1400を命令セットアーキテクチャ中の他の命令から区別する。MTNN命令1400のオペコード1402は、例えばx86アーキテクチャで一般的であるプレフィクスを含む場合も含まない場合もある。
【0082】
即値フィールド1412は、関数1432を指定する値を、NNU121の制御論理1434に提供する。好ましくは、関数1432は、
図1のマイクロ命令105の即値オペランドとして提供される。NNU121によって行われることが可能な関数1432には、これらに限定されないが、データRAM122への書き込み、重みRAM124への書き込み、プログラムメモリ129への書き込み、制御レジスタ127への書き込み、プログラムメモリ129にあるプログラムの実行の開始、プログラムメモリ129にあるプログラムの実行の一時停止、プログラムメモリ129にあるプログラムの実行の完了の通知(例えば、割込み)の要求、及びNNU121のリセット、が含まれる。好ましくは、NNU命令セットは、その結果がNNUプログラムの完了を示す命令を含む。或いは、NNU命令セットは、明示的な割込み生成命令を含む。好ましくは、NNU121をリセットすることは、データRAM122、重みRAM124、プログラムメモリ129の内容がそのままに保たれる以外は、NNU121をリセット状態に効果的に強制して戻すことを含む(例えば、内部のステートマシンがクリアされ、アイドル状態に設定される)。加えて、累算器202などの内部レジスタは、リセット関数には影響されず、例えば
図4のアドレス0にあるNPU初期化命令などによって、明示的にクリアされなければならない。一実施形態では、関数1432は、第1のソースレジスタがマイクロ操作(例えば、
図34のマイクロ操作3418を参照されたい)を含んでいる、直接実行関数を含むことができる。直接実行関数は、NNU121に、指定されるマイクロ操作を直接実行するように命令する。このようにして、アーキテクチャプログラムは、命令をプログラムメモリ129に書き込んでからNNU121にプログラムメモリ内のその命令を実行するように命令すること、又はMTNN命令1400(若しくは
図15のMFNN命令1500)を実行することによってでなく、直接NNU121を制御して動作を行わせることができる。
図14は、データRAM122に書き込む関数1432の一例を図示する。
【0083】
gprフィールド1408は、汎用レジスタファイル116内のGPRの1つを指定する。一実施形態では、各GPRは64ビットである。示されるように、汎用レジスタファイル116は、選択されたGPRからの値をNNU121に提供し、NNU121は、その値をアドレス1422として使用する。アドレス1422は、関数1432中で指定されるメモリの行を選択する。データRAM122又は重みRAM124の場合、アドレス1422は追加的に、選択された行の中で、メディアレジスタの場所のサイズの2倍であるチャンク(例えば、512ビット)を選択する。好ましくは、その場所は512ビットの境界上である。一実施形態では、多重化器が、アドレス1422(若しくは下記のMFNN命令1400の場合におけるアドレス1422)、又は、データRAM122/重みRAM124/プログラムメモリ129に対する提供のためのシーケンサ128からのアドレス123/125/131の、いずれかを選択する。一実施形態では、下記でより詳細に説明するように、データRAM122はデュアルポートであって、メディアレジスタ118がデータRAM122の読み出し/書き込みを行うのと同時に、NPU126がデータRAM122の読み出し/書き込みを行うことができる。一実施形態では、重みRAM124もまた、同様の目的のためにデュアルポートである。
【0084】
src1フィールド1404及びsrc2フィールド1406は各々、メディアレジスタファイル118内のメディアレジスタを指定する。一実施形態では、各メディアレジスタ118は256ビットである。メディアレジスタファイル118は、示されるように、選択されたメディアレジスタからの連結されたデータ(例えば、512ビット)を、データRAM122(又は重みRAM124又はプログラムメモリ129)に提供して、アドレス1422で指定される選択された行1428に、及び、選択された行1428の中のアドレス1422で指定される場所に書き込む。有利な点として、一連のMTNN命令1400(及び下記のMFNN命令1400)を実行することにより、プロセッサ100で実行されているアーキテクチャプログラムは、データRAM122の行及び重みRAM124の行を埋めると共に、本明細書に記載される(例えば、
図4及び
図9の)プログラムなどのプログラムをプログラムメモリ129に書き込んで、NNU121に極めて高速にデータ及び重みに対する演算を行わせて、人工ニューラルネットワークを達成することができる。一実施形態では、アーキテクチャプログラムは、プログラムをプログラムメモリ129に書き込むのではなく、直接NNU121を制御する。
【0085】
一実施形態では、2つのソースレジスタ(例えば、1404及び1406)を指定するのではなく、MTNN命令1400は、開始ソースレジスタとソースレジスタの数Qとを指定する。この形式のMTNN命令1400は、プロセッサ100に、開始ソースレジスタとして指定されるメディアレジスタ118と次のQ−1個の連続したメディアレジスタ118とを、NNU121に、すなわち、指定されたデータRAM122又は重みRAM124に書き込むように命令する。好ましくは、命令トランスレータ104は、MTNN命令1400を、Q個の指定されたメディアレジスタ118すべてに書き込むために必要とされるだけの数のマイクロ命令に翻訳する。例えば、一実施形態では、MTNN命令1400が開始ソースレジスタをMR4と指定し、Qが8である場合、命令トランスレータ104は、MTNN命令1400を4つのマイクロ命令に翻訳し、4つのうち第1の命令はMR4及びMR5に書き込み、第2の命令はMR6及びMR7に書き込み、第3の命令はMR8及びMR9に書き込み、第4の命令はMR10及びMR11に書き込みをする。メディアレジスタ118からNNU121へのデータ経路が512ビットではなく1024ビットである代替的な一実施形態では、命令トランスレータ104は、MTNN命令1400を2つのマイクロ命令に翻訳し、そのうち第1の命令はMR4〜MR7に書き込み、第2の命令はMR8〜MR11に書き込みをする。MFNN命令1500が開始宛先レジスタ及び宛先レジスタの数を指定する同様の実施形態が企図され、それにより、単一のメディアレジスタ118よりも、1つのMFNN命令1500当たり、データRAM122又は重みRAM124の行のより大きなチャンクを読み出すことができる。
【0086】
次いで
図15を参照すると、
図1のNNU121の一部に関連するニューラルネットワークから移動(MFNN)アーキテクチャ命令1500とその動作を図示するブロック図が示される。MFNN命令1500は、オペコードフィールド1502、dstフィールド1504、gprフィールド1508、及び即値フィールド1512を含む。MFNN命令1500は、アーキテクチャ命令であり、すなわちプロセッサ100の命令セットアーキテクチャに含まれている。好ましくは、命令セットアーキテクチャは、オペコードフィールド1502の所定の値をMFNN命令1500に関連付けて、MFNN命令1500を命令セットアーキテクチャ中の他の命令から区別する。MFNN命令1500のオペコード1502は、例えばx86アーキテクチャで一般的であるプレフィクスを含む場合も含まない場合もある。
【0087】
即値フィールド1512は、関数1532を指定する値を、NNU121の制御論理1434に提供する。好ましくは、関数1532は、
図1のマイクロ命令105の即値オペランドとして提供される。NNU121によって行われることが可能な関数1532には、これらに限定されないが、データRAM122からの読み出し、重みRAM124からの読み出し、プログラムメモリ129からの読み出し、及び状態レジスタ127からの読み出しが含まれる。
図15は、データRAM122から読み出す関数1532の一例を図示する。
【0088】
gprフィールド1508は、汎用レジスタファイル116内のGPRの1つを指定する。汎用レジスタファイル116は、示されるように、選択されたGPRからの値をNNU121に提供し、NNU121はその値を、
図14のアドレス1422と同じように動作するアドレス1522として使用して、関数1532で指定されるメモリの行を選択する。データRAM122又は重みRAM124の場合、アドレス1522は追加的に、選択された行の中で、メディアレジスタの場所のサイズであるチャンク(例えば、256ビット)を選択する。好ましくは、その場所は256ビットの境界上である。
【0089】
dstフィールド1504は、メディアレジスタファイル118内のメディアレジスタを指定する。示されるように、メディアレジスタファイル118は、データ(例えば、256ビット)を、データRAM122(又は重みRAM124又はプログラムメモリ129)から、選択されたメディアレジスタに受け取り、上記データは、アドレス1522によって指定される選択された行1528から、及び、選択された行1528の中のアドレス1522で指定される場所から読み出される。
【0090】
NNU内部RAMのポート構成
次いで
図16を参照すると、
図1のデータRAM122の実施形態を図示するブロック図が示される。データRAM122は、メモリアレイ1606、読み出しポート1602、及び書き込みポート1604を備える。メモリアレイ1606は、データワードを保持し、好ましくは、上記のようにN個のワードのD個の行として編成される。一実施形態では、メモリアレイ1606は、64個の水平方向に編成された静的RAMセルの配列からなり、各セルは128ビットの幅及び64ビットの高さであり、それにより、8192ビット幅で64個の行を有する64KBのデータRAM122を提供し、データRAM122は、約0.2平方ミリメートルのダイ面積を占める。ただし、他の実施形態が企図される。
【0091】
読み出しポート1602は、好ましくは多重化されるやり方で、NPU126に及びメディアレジスタ118に結合される。(より正確には、メディアレジスタ118は、リオーダバッファにデータを提供することも可能な結果バス、及び/又は他の実行ユニット112への結果転送バスを介して、読み出しポート1602に結合可能である。)NPU126及びメディアレジスタ118は、読み出しポート1602を共有してデータRAM122を読み出す。書き込みポート1604もまた、好ましくは多重化されるやり方で、NPU126に及びメディアレジスタ118に結合される。NPU126及びメディアレジスタ118は、書き込みポート1604を共有してデータRAM122に書き込む。したがって、有利な点として、メディアレジスタ118は、NPU126がさらにデータRAM122から読み出している間に、同時にデータRAM122に書き込むことができ、又は、NPU126は、メディアレジスタ118がデータRAM122から読み出している間に、同時にデータRAM122に書き込むことができる。これは、有利に、向上した性能をもたらすことができる。例えば、NPU126は、メディアレジスタ118がさらなるデータワードをデータRAM122に書き込む間に、データRAM122を(例えば、算出の実行を続けるために)読み出すことができる。別の例として、NPU126は、メディアレジスタ118が算出結果をデータRAM122から読み出す間に、算出結果をデータRAM122に書き込むことができる。一実施形態では、NPU126は、NPU126がデータRAM122からデータワードの行を読み出す間にも、算出結果の行をデータRAM122に書き込むことができる。一実施形態では、メモリアレイ1606は、バンクにおいて構成される。NPU126がデータRAM122にアクセスする時、すべてのバンクがアクティブにされてメモリアレイ1606の一行全体にアクセスする。これに対し、メディアレジスタ118がデータRAM122にアクセスする時、指定されたバンクだけがアクティブにされる。一実施形態では、例えば、各バンクは128ビット幅であり、メディアレジスタ118は256ビット幅であり、したがって、メディアレジスタ118のアクセスにつき、2つのバンクがアクティブにされる。一実施形態では、ポート1602/1604の一方が、読み出し/書き込みポートである。一実施形態では、ポート1602及び1604の双方が読み出し/書き込みポートである。
【0092】
本明細書に記載されるNPU126の循環器能力の利点は、そうでない場合にNPU126が高度に利用されることを保証するために必要とされ得る場合と比べて、データRAM122のメモリアレイ1606が大幅により少ない行を有し、したがって相対的にはるかにより小さくなる能力を容易にする点である。NPU126が高度に利用されるためには、NPU126が計算を行っている間に、アーキテクチャプログラムが(メディアレジスタ118を介して)データRAM122にデータを提供し続け、またデータRAM122から結果を引き出し続けられることが必要となる。
【0093】
内部RAMバッファ
次いで
図17を参照すると、
図1の重みRAM124及びバッファ1704の実施形態を図示するブロック図が示される。重みRAM124は、メモリアレイ1706及びポート1702を含む。メモリアレイ1706は、重みワードを保持し、好ましくは、上記のようにN個のワードのW個の列として編成される。一実施形態では、メモリアレイ1706は、128個の水平方向に編成された静的RAMセルの配列からなり、各セルは64ビットの幅及び2048ビットの高さであり、それにより、8192ビット幅で2048個の行を有する2MBの重みRAM124を提供し、重みRAM124は、約2.4平方ミリメートルのダイ面積を占める。ただし、他の実施形態が企図される。
【0094】
ポート1702は、好ましくは多重化されるやり方に、NPU126に及びバッファ1704に結合される。NPU126及びバッファ1704は、ポート1702を介して、重みRAM124の読み出し及び書き込みを行う。バッファ1704は、
図1のメディアレジスタ118にさらに結合され、その結果メディアレジスタ118は、バッファ1704を通して重みRAM124の読み出し及び書き込みを行う。したがって、有利な点として、メディアレジスタ118は、NPU126がさらに重みRAM124の読み出し又は書き込みを行っている間に、同時にバッファ1704の読み出し又は書き込みを行うことができる(ただし、好ましくは、NPU126が現在実行中である場合、NPU126がストールして、バッファ1704が重みRAM124にアクセスしている間に重みRAM124にアクセスすることを回避する)。これは、有利に、向上した性能をもたらすことができ、それは、特にメディアレジスタ118による重みRAM124の読み出し/書き込みは、NPU126による重みRAM124の読み出し/書き込みよりも比較的はるかにより小さいためである。例えば、一実施形態では、NPU126は一度に8192ビット(1行)の読み出し/書き込みをし、これに対しメディアレジスタ118は256ビット幅であり、各MTNN命令1400は2つのメディアレジスタ118、すなわち512ビットを書き込む。したがって、アーキテクチャプログラムが16回のMTNN命令1400を実行してバッファ1704を埋める場合に、重みRAM124に対するアクセスについて、NPU126とアーキテクチャプログラムとの間で、その時間のわずか約6パーセント未満で衝突が発生する。代替的な一実施形態では、命令トランスレータ104は、MTNN命令1400を2つのマイクロ命令105に翻訳し、該マイクロ命令の各々は、1つのメディアレジスタ118をバッファ1704に書き込み、この場合、重みRAM124に対するアクセスについて、NPU126とアーキテクチャプログラムとの間で、さらに少ない頻度で衝突が発生する。
【0095】
バッファ1704を含んでいる一実施形態では、アーキテクチャプログラムによる重みRAM124への書き込みが、複数のMTNN命令1400を必要とする。1つ又は複数のMTNN命令1400が、バッファ1704の指定されたチャンクに書き込むための関数1432を指定し、続いて、MTNN命令1400が、NNU121にバッファ1704の内容を重みRAM124の指定された行に書き込むように命令する関数1432を指定し、ここで、チャンクのサイズは、メディアレジスタ118のビット数の2倍であり、チャンクはバッファ1704内で当然位置合わせされる。一実施形態では、バッファ1704の指定されたチャンクに書き込む関数1432を指定するMTNN命令1400の各々に、バッファ1704の各チャンクに対応するビットを持つビットマスクが含められる。2つの指定されたソースレジスタ118からのデータが、ビットマスク中で対応するビットが設定されているバッファ1704の各チャンクに書き込まれる。これは、重みRAM124の行の中で繰り返されるデータ値に有用である可能性がある。例えば、バッファ1704(及び、その後RAM124の行)をゼロアウトするために、プログラマは、ソースレジスタにゼロをロードし、ビットマスクのすべてのビットを設定することができる。加えて、ビットマスクは、プログラマがバッファ1704の選択されたチャンクだけに書き込みをし、それによりその他のチャンク内の以前のデータを保有しておくことを可能にする。
【0096】
バッファ1704を含んでいる一実施形態では、アーキテクチャプログラムによる重みRAM124からの読み出しが、複数のMFNN命令1500を必要とする。初期MFNN命令1500が、重みRAM124の指定された行からバッファ1704にロードする関数1532を指定し、続いて、1つ又は複数のMFNN命令1500が、バッファ1704の指定されたチャンクを宛先レジスタに読み込む関数1532を指定し、ここで、チャンクのサイズはメディアレジスタ118のビット数であり、チャンクはバッファ1704内で当然位置合わせされる。他の実施形態が企図され、それらの実施形態では、重みRAM124が複数のバッファ1704を含んで、NPU126の実行中にアーキテクチャプログラムが行えるアクセス数を増やすことにより、重みRAM124にアクセスするためのNPU126とアーキテクチャプログラムとの間の競合をさらに減らし、このことは、NPU126が重みRAM124にアクセスする必要がないクロックサイクル中に、バッファ1704によるアクセスを行える見込みを増やす可能性がある。
【0097】
図16は、デュアルポートのデータRAM122を説明するが、重みRAM124がさらにデュアルポートである他の実施形態が企図される。さらに、
図17は、重みRAM124と共に使用するためのバッファを説明するが、データRAM122がバッファ1704と同様の関連付けられたバッファをさらに有する他の実施形態が企図される。
【0098】
動的に構成可能なNPU
次いで
図18を参照すると、
図1の動的に構成可能なNPU126を図示するブロック図が示される。
図18のNPU126は、多くの点で
図2のNPU126に似ている。ただし、
図18のNPU126は、2つの異なる構成の一方で動作するように動的に構成可能である。第1の構成では、
図18のNPU126は、
図2のNPU126と同様に動作する。すなわち、本明細書で「ワイド」構成又は「シングル」構成と呼ばれる第1の構成では、NPU126のALU204は、1つの幅広の(wide)データワードと1つの幅広の重みワード(例えば、16ビット)に動作を行って、1つの幅広の結果を生成する。対照的に、本明細書で「ナロー」構成又は「デュアル」構成と呼ばれる第2の構成では、NPU126は、2つの幅狭の(narrow)データワード及び2つのそれぞれの幅狭の重みワード(例えば、8ビット)に動作を行って、2つのそれぞれの幅狭の結果を生成する。一実施形態では、NPU126の構成(ワイド又はナロー)は、NPU初期化命令(例えば、下記の
図20のアドレス0におけるもの)によってなされる。或いは、構成は、命令の関数1432がNPU126を構成(ワイド又はナロー)に構成することを指定するMTNN命令によってなされる。好ましくは、構成レジスタがプログラムメモリ129命令又はMTNN命令によって埋められ、構成(ワイド又はナロー)を決定する。例えば、構成レジスタの出力が、ALU204と、AFU212と、mux−reg制御信号213を生成する論理とに提供される。一般的に言って、
図18のNPU126の要素は、
図2の同様の参照符号が付された要素と同様の機能を行い、
図18の理解のためには
図2を参照されたい。ただし、次いで、
図2との違いを含めて、
図18の実施形態について説明する。
【0099】
図18のNPU126は、2つのレジスタ205A及び205B、2つの3入力mux−reg208A及び208B、ALU204、2つの累算器202A及び202B、並びに2つのAFU212A及び212Bを備える。レジスタ205A/205Bの各々は別個に、
図2のレジスタ205の幅の半分(例えば、8ビット)である。レジスタ205A/205Bの各々は、それぞれのナロー重みワード206A/206B(例えば、8ビット)を重みRAM124から受け取り、それぞれの出力203A/203Bを、後のクロックサイクルで、ALU204のオペランド選択論理1898に提供する。NPU126がワイド構成であるとき、レジスタ205A/205Bは、効果的に共に機能して、
図2の実施形態のレジスタ205と同様にして、ワイド重みワード206A/206B(例えば、16ビット)を重みRAM124から受け取る。NPU126がナロー構成であるとき、レジスタ205A/205Bは、効果的に個々に機能して、ナロー重みワード206A/206B(例えば、8ビット)を重みRAM124から各々受け取り、NPU126は効果的に2つの別個のナローNPUであるようになる。それにも関わらず、NPU126の構成に関係なく、重みRAM124の同じ出力ビットがレジスタ205A/205Bに結合され、提供される。例えば、NPU0のレジスタ205Aはバイト0を受け取り、NPU0のレジスタ205Bはバイト1を受け取り、NPU1のレジスタ205Aはバイト2を受け取り、NPU1のレジスタ205Aはバイト3を受け取り、以下同様に続き、NPU511のレジスタ205Bはバイト1023を受け取る。
【0100】
mux−reg208A/208Bの各々は、別個に、
図2のレジスタ208の幅の半分(例えば、8ビット)である。mux−reg208Aは、入力207A又は211A又は1811Aのうち1つを選択して自身のレジスタに記憶し、次いで、出力209Aで、後のクロックサイクルにおいて出力し、mux−reg208Bは、入力207B又は211B又は1811Bのうち1つを選択して自身のレジスタに記憶し、次いで、出力209Bで、後のクロックサイクルにおいて、オペランド選択論理1898に提供する。入力207Aは、データRAM122からナローデータワード(例えば、8ビット)を受け取り、入力207Bは、データRAM122からナローデータワードを受け取る。NPU126がワイド構成であるとき、mux−reg208A/208Bは効果的に共に機能して、
図2の実施形態のmux−reg208と同様にして、ワイドデータワード207A/207B(例えば、16ビット)をデータRAM122から受け取る。NPU126がナロー構成であるとき、mux−reg208A/208Bは、効果的に個々に機能して、ナローデータワード207A/207B(例えば、8ビット)をデータRAM122から各々受け取り、NPU126は効果的に2つの別個のナローNPUであるようになる。それにも関わらず、NPU126の構成に関係なく、データRAM122の同じ出力ビットがmux−reg208A/208Bに結合され、提供される。例えば、NPU0のmux−reg208Aはバイト0を受け取り、NPU0のmux−reg208Bはバイト1を受け取り、NPU1のmux−reg208Aはバイト2を受け取り、NPU1のmux−reg208Aはバイト3を受け取り、以下同様に続き、NPU511のmux−reg208Bはバイト1023を受け取る。
【0101】
入力211Aは、隣接するNPU126のmux−reg208Aの出力209Aを受け取り、入力211Bは、隣接するNPU126のmux−reg208Bの出力209Bを受け取る。示されるように、入力1811Aは、隣接するNPU126のmux−reg208Bの出力209Bを受け取り、入力1811Bは、当該NPU126のmux−reg208Aの出力209Aを受け取る。
図18に示されるNPU126は、
図1のN個のNPU126のうちのNPU Jと表される。すなわち、NPU Jは、N個のNPU126の代表事例である。好ましくは、NPU Jのmux−reg208Aの入力211Aは、NPU126のインスタンスJ−1のmux−reg208Aの出力209Aを受け取り、NPU Jのmux−reg208Aの入力1811Aは、NPU126のインスタンスJ−1のmux−reg208Bの出力209Bを受け取り、NPU Jのmux−reg208Aの出力209Aは、NPU126のインスタンスJ+1のmux−reg208Aの入力211Aと、NPU126のインスタンスJのmux−reg208Bの入力211Bとの双方に提供される。NPU Jのmux−reg208Bの入力211Bは、NPU126のインスタンスJ−1のmux−reg208Bの出力209Bを受け取り、NPU Jのmux−reg208Bの入力1811Bは、NPU126のインスタンスJのmux−reg208Aの出力209Aを受け取り、NPU Jのmux−reg208Bの出力209Bは、NPU126のインスタンスJ+1のmux−reg208Aの入力1811と、NPU126のインスタンスJ+1のmux−reg208Bの入力211Bとの双方に提供される。
【0102】
制御入力213は、3つの入力のうちいずれをmux−reg208A/208Bの各々が選択して各自のレジスタに記憶し、それが後にそれぞれの出力209A/209Bで提供されるかを、制御する。NPU126が、データRAM122から行をロードするように命令されるとき(例えば、下記の
図20のアドレス1の積和命令により)、NPU126がワイド構成であるかナロー構成であるかに関係なく、制御入力213は、mux−reg208A/208Bの各々を制御して、データRAM122の選択された行の対応するナローワードから、各自のナローデータワード207A/207B(例えば、8ビット)を選択させる。
【0103】
NPU126が、前に受け取られたデータ行値を循環させるように命令されるとき(例えば、下記の
図20のアドレス2にある積和循環命令により)、NPU126が、ナロー構成である場合、制御入力213は、mux−reg208A/208Bの各々を制御して、それぞれの入力1811A/1811Bを選択させる。この場合、mux−reg208A/208Bは個々に効果的に機能し、NPU126は効果的に2つの別個のナローNPUであるようになる。このようにして、
図19に関連して下記でより詳細に説明するように、N個のNPU126のmux−reg208A及び208Bが、2Nナローワード循環器として集合的に動作する。
【0104】
NPU126が、前に受け取られたデータ行値を循環させるように命令されるとき、NPU126が、ワイド構成である場合、制御入力213は、mux−reg208A/208Bの各々を制御して、それぞれの入力211A/211Bを選択させる。この場合、mux−reg208A/208Bは、NPU126が単一のワイドNPU126であるかのように、共に効果的に機能する。このようにして、
図3に関連して説明したのと同様にして、N個のNPU126のmux−reg208A及び208Bが、Nワイドワード循環器として集合的に動作する。
【0105】
ALU204は、オペランド選択論理1898、ワイド乗算器242A、ナロー乗算器242B、ワイド2入力mux1896A、ナロー2入力mux1896B、ワイド加算器244A、及びナロー加算器244Bを備える。効果的に、ALU204は、オペランド選択論理1898、ワイドALU204A(ワイド乗算器242A、ワイドmux1896A、及びワイド加算器244Aを備える)、並びにナローALU204B(ナロー乗算器242B、ナローmux1896B、及びナロー加算器244Bを備える)を備える。好ましくは、ワイド乗算器242Aは、2つのワイドワードを乗算し、
図2の乗算器242と似ており、例えば16ビット×16ビット乗算器である。ナロー乗算器242Bは、2つのナローワードを乗算し、例えば、16ビットの結果を生成する8ビット×8ビット乗算器である。NPU126がナロー構成であるとき、ワイド乗算器242Aは、オペランド選択論理1898の助けを借りて、2つのナローワードを乗算するナロー乗算器として効果的に使用され、そのためNPU126は効果的に2つのナローNPUとして機能する。好ましくは、ワイド加算器244Aは、ワイドmux1896Aの出力とワイド累算器202Aの出力217Aとを加算して、ワイド累算器202Aに提供される和215Aを生成し、
図2の加算器244と似ている。ナロー加算器244Bは、ナローmux1896Bの出力とナロー累算器202Bの出力217Bとを加算して、ナロー累算器202Bに提供される和215Bを生成する。一実施形態では、ナロー累算器202Bは28ビット幅であって、最大で1024個の16ビット積の累算における精度の損失を回避する。NPU126がワイド構成であるとき、ナロー乗算器242B、ナローmux1896B、ナロー加算器244B、ナロー累算器202B、及びナローAFU212Bは、好ましくは、電力消費を減らすように非アクティブである。
【0106】
オペランド選択論理1898は、下記でより詳細に説明するように、209A、209B、203A、及び203Bからオペランドを選択して、ALU204のその他の要素に提供する。好ましくは、オペランド選択論理1898は、符号付き値のデータワード及び重みワードの符号拡張を行うなど、他の機能も行う。例えば、NPU126がナロー構成である場合、オペランド選択論理1898は、ナローデータワード及び重みワードを、これらをワイド乗算器242Aに提供する前に、ワイドワードの幅に符号拡張する。同様に、ALU204が、ナローデータ/重みワードをパススルーする(ワイドmux1896Aを介してワイド乗算器242Aを迂回する)ように命令される場合、オペランド選択論理1898は、ナローデータ/重みワードを、これをワイド加算器244Aに提供する前に、ワイドワードの幅に符号拡張する。好ましくは、
図2のNPU126のALU204に、符号拡張機能を行うように論理がさらに存在する。
【0107】
ワイドmux1896Aは、ワイド乗算器242Aの出力とオペランド選択論理1898からのオペランドとを受け取り、これら入力のうち一方を、ワイド加算器244Aに対する提供のために選択する。ナローmux1896Bは、ナロー乗算器242Bの出力とオペランド選択論理1898からのオペランドとを受け取り、これら入力のうち一方を、ナロー加算器244Bに対する提供のために選択する。
【0108】
オペランド選択論理1898によって提供されるオペランドは、NPU126の構成と、NPU126によって実行されている命令で指定される関数に基づいてALU204によって行われることになる算術演算及び/又は論理演算とに依存する。例えば、命令が積和を行うようにALU204に命令し、NPU126がワイド構成である場合、オペランド選択論理1898は、ワイド乗算器242Aに対して、一方の入力で、出力209Aと209Bとの連結であるワイドワードを、もう一方の入力で、出力203Aと203Bとの連結であるワイドワードを提供し、ナロー乗算器242Bは非アクティブであり、その結果、NPU126は、
図2のNPU126と同様の単一のワイドNPU126として機能する。これに対し、命令が積和を行うようにALU204に命令し、NPU126がナロー構成である場合、オペランド選択論理1898は、ワイド乗算器242Aに対して、一方の入力で、ナローデータワード209Aの拡張された、又は幅を広くされたバージョンを、もう一方の入力で、ナロー重みワード203Aの拡張されたバージョンを提供する。加えて、オペランド選択論理1898は、ナロー乗算器242Bに対して、一方の入力でナローデータワード209Bを、もう一方の入力でナロー重みワード203Bを提供する。ナローワードを拡張、すなわち幅を広くするために、ナローワードが符号付きである場合、オペランド選択論理1898はナローワードを符号拡張する。これに対し、ナローワードが符号なしである場合、オペランド選択論理1898は、ナローワードを、ゼロ値の上位ビットでパディングする。
【0109】
別の例として、NPU126がワイド構成であり、命令がALU204に重みワードの累算を行うように命令する場合、ワイド乗算器242Aは迂回され、オペランド選択論理1898は、出力203Aと203Bとの連結を、ワイド加算器244Aに対する提供のためにワイドmux1896Aに提供する。これに対し、NPU126がナロー構成であり、命令がALU204に重みワードの累算を行うように命令する場合、ワイド乗算器242Aは迂回され、オペランド選択論理1898は、出力203Aの拡張されたバージョンを、ワイド加算器244Aに対する提供のためにワイドmux1896Aに提供し、ナロー乗算器242Bは迂回され、オペランド選択論理1898は、出力203Bの拡張されたバージョンを、ナロー加算器244Bに対する提供のためにナローmux1896Bに提供する。
【0110】
別の例として、NPU126がワイド構成であり、命令がALU204にデータワードの累算を行うように命令する場合、ワイド乗算器242Aは迂回され、オペランド選択論理1898は、出力209Aと209Bとの連結を、ワイド加算器244Aに対する提供のためにワイドmux1896Aに提供する。これに対し、NPU126がナロー構成であり、命令がALU204にデータワードの累算を行うように命令する場合、ワイド乗算器242Aは迂回され、オペランド選択論理1898は、出力209Aの拡張されたバージョンを、ワイド加算器244Aに対する提供のためにワイドmux1896Aに提供し、ナロー乗算器242Bは迂回され、オペランド選択論理1898は、出力209Bの拡張したバージョンを、ナロー加算器244Bに対する提供のためにナローmux1896Bに提供する。重みワード/データワードの累算は、画像処理など、一部の人工ニューラルネットワークの応用例のプーリング層で使用される平均演算を行うために有用である可能性がある。
【0111】
好ましくは、NPU126は、ワイド加算器244Aを迂回してワイド構成におけるワイドデータワード/重みワード又はナロー構成における拡張されたナローデータワード/重みワードをワイド累算器202Aにロードすることを容易にする第2のワイドmux(図示せず)と、ナロー加算器244Bを迂回してナロー構成におけるナローデータワード/重みワードをナロー累算器202Bにロードすることを容易にする第2のナローmux(図示せず)と、をさらに含む。好ましくは、ALU204は、ワイド及びナロー比較器/muxの組み合わせ(図示せず)をさらに含み、これは、それぞれの累算器の値217A/217B及びそれぞれのmux1896A/1896Bの出力を受け取って、累算器値217A/217Bとデータワード/重みワード209A/B/203A/Bとの間で最大値を選択し、これは、例えば
図27及び
図28に関連して下記でより詳細に説明するように、一部の人工ニューラルネットワークの応用例のプーリング層で使用される演算である。加えて、オペランド選択論理1898は、ゼロ値のオペランドを提供し(ゼロで加算するため、又は累算器をクリアするため)、及び1の値のオペランドを提供する(1で乗算するため)ように構成される。
【0112】
ナローAFU212Bは、ナロー累算器202Bの出力217Bを受け取り、それに活性化関数を行ってナロー結果133Bを生成し、ワイドAFU212Aは、ワイド累算器202Aの出力217Aを受け取り、それに活性化関数を行ってワイド結果133Aを生成する。NPU126がナロー構成であるとき、例えば
図29A〜
図30に関連して下記でより詳細に説明するように、ワイドAFU212Aは、それに応じてワイド累算器202Aの出力217Aを考慮し、その出力に活性化関数を行って、例えば8ビットのナロー結果を生成する。
【0113】
上記の説明から観察できるように、有利な点として、ナロー構成であるとき、単一のNPU126が効果的に2つのナローNPUとして動作し、それにより、より小さいワードについて、最大で、ワイド構成であるときの約2倍のスループットをもたらす。例えば、1024個のニューロンを持ち、各々が前の層から1024個のナロー入力を受け取る(及び、ナロー重みワードを有する)ニューラルネットワーク層を仮定すると、その結果、1メガの接続がもたらされる。ワイド構成において512個のNPU126を有するNNU121と比べて、ナロー構成において512個のNPU126(1024個のナローNPU)を有するNNU121は、ワイドワードではなくナローワードであるが、約半分の時間で(およそ1026クロック対514クロック)、4倍の接続数(1メガの接続対256Kの接続)を処理することができる。
【0114】
一実施形態では、
図18の動的に構成可能なNPU126は、レジスタ205A及び205Bの代わりに、mux−reg208A及び208Bと同様の3入力多重化レジスタを含み、
図7の実施形態に関連して説明した仕方といくらか似た、しかし
図18に関連して説明した動的に構成可能なやり方で、重みRAM124から受け取られる重みワードの行のための循環器を実現する。
【0115】
次いで
図19を参照すると、
図18の実施形態による
図1のNNU121のN個のNPU126の2N個のmux−reg208A/208Bの編成の一実施形態を図示するブロック図が示され、
図1のデータRAM122から受け取られるデータワード207の行に対する循環器としてのmux−regの動作を図示している。
図19の実施形態では、Nは512であり、そのため、示されるように、NNU121は、512個のNPU126、及び効果的に1024個のナローNPUに対応する、0〜511と表される1024個のmux−reg208A/208Bを有する。NPU126内の2つのナローNPUをA及びBと表し、mux−reg208の各々の中に、対応するナローNPUの呼称が示されている。より具体的には、NPU126 0のmux−reg208Aを0−Aと呼び、NPU126 0のmux−reg208Bを0−Bと呼び、NPU126 1のmux−reg208Aを1−Aと呼び、NPU126 1のmux−reg208Bを1−Bと呼び、NPU126 511のmux−reg208Aを511−Aと呼び、NPU126 511のmux−reg208Bを511−Bと呼び、これらの値は、下記で説明する
図21のナローNPUにさらに対応している。
【0116】
各mux−reg208Aは、データRAM122のD個の行のうちの1行の、自身の対応するナローデータワード207Aを受け取り、各mux−reg208Bは、データRAM122のD個の行のうちの1行の、自身の対応するナローデータワード207Bを受け取る。すなわち、mux−reg0Aは、データRAM122の行のナローデータワード0を受け取り、mux−reg0Bは、データRAM122の行のナローデータワード1を受け取り、mux−reg1Aは、データRAM122の行のナローデータワード2を受け取り、mux−reg1Bは、データRAM122の行のナローデータワード3を受け取り、以下同様に続き、mux−reg511Aは、データRAM122の行のナローデータワード1022を受け取り、mux−reg511Bは、データRAM122の行のナローデータワード1023を受け取る。加えて、mux−reg1Aは、入力211Aで、mux−reg0Aの出力209Aを受け取り、mux−reg1Bは、入力211Bで、mux−reg0Bの出力209Bを受け取り、以下同様に続き、mux−reg511Aは、入力211Aで、mux−reg510Aの出力209Aを受け取り、mux−reg511Bは、入力211Bで、mux−reg510Bの出力209Bを受け取り、mux−reg0Aは、入力211Aで、mux−reg511Aの出力209Aを受け取り、mux−reg0Bは、入力211Bでmux−reg511Bの出力209Bを受け取る。mux−reg208A/208Bの各々は、データワード207A/207Bを選択するか、又は循環された入力211A/211Bを選択するか、又は循環された入力1811A/1811Bを選択するかを制御する制御入力213を受け取る。最後、mux−reg1Aは、入力1811Aでmux−reg0Bの出力209Bを受け取り、mux−reg1Bは、入力1811Bでmux−reg1Aの出力209Aを受け取り、以下同様に続き、mux−reg511Aは、入力1811Aでmux−reg510Bの出力209Bを受け取り、mux−reg511Bは、入力1811Bでmux−reg511Aの出力209Aを受け取り、mux−reg0Aは、入力1811Aでmux−reg511Bの出力209Bを受け取り、mux−reg0Bは、入力1811Bでmux−reg0Aの出力209Aを受け取る。mux−reg208A/208Bの各々は、データワード207A/207Bを選択するか、又は循環された入力211A/211Bを選択するか、又は循環された入力1811A/1811Bを選択するかを制御する制御入力213を受け取る。下記でより詳細に説明するように、ある動作モードにおいて、最初のクロックサイクルに、制御入力213は、レジスタ内における記憶のため及びALU204に対する後の提供のためにデータワード207A/207Bを選択するようにmux−reg208A/208Bの各々を制御し、後のクロックサイクル(例えば、上記のようにM−1のクロックサイクル)中、制御入力213は、レジスタ内における記憶のため及びALU204に対する後の提供のために、循環された入力1811A/1811Bを選択するようにmux−reg208A/208Bの各々を制御する。
【0117】
次いで
図20を参照すると、
図18の実施形態によるNPU126を有する
図1のNNU121のプログラムメモリ129に記憶され、該NNU121により実行されるプログラムを図示する表が示される。
図20の例示的プログラムは、多くの点で
図4のプログラムと似ている。ただし、以下では違いを説明する。アドレス0におけるNPU初期化命令は、NPU126がナロー構成であるように指定する。加えて、アドレス2における積和循環命令は、示されるように、1023のカウントを指定し、1023クロックサイクルを必要とする。この理由は、
図20の例は、一層について効果的に1024個のナロー(例えば、8ビット)のニューロン(NPU)であり、各々が、1024個のニューロンからなる前の層からの1024個の接続入力を有し、合計で1024K個の接続であることを仮定しているためである。各ニューロンは、各接続入力から8ビットのデータ値を受け取り、その8ビットのデータ値に適切な8ビットの重み値を乗算する。
【0118】
次いで
図21を参照すると、ナロー構成において動作する
図18のNPU126を含むNNU121による
図20のプログラムの実行を図示するタイミング図が示される。
図21のタイミング図は多くの点で
図5のタイミング図に似ているが、以下では違いを説明する。
【0119】
図21のタイミング図では、アドレス0のNPU初期化命令がNPU126をナロー構成に初期化するため、NPU126はナロー構成にある。その結果、512個のNPU126は、1024個のナローNPU(又はニューロン)として効果的に動作し、これらNPUを、列の中で、NPU0−A及びNPU0−B(NPU126 0の2つのナローNPU)、NPU1−A及びNPU1−B(NPU126 1の2つのナローNPU)、以下同様に続き、NPU511−A及びNPU511−B(NPU126 511の2つのナローNPU)と呼ぶ。図示を簡略且つ明瞭にするために、ナローNPU0−A、0−B、及び511−Bのみについての動作を示している。アドレス2の積和循環が1023のカウントを指定し、これが1023クロックを必要とする事実に起因して、
図21のタイミング図の行は、クロックサイクル1026まで含んでいる。
【0120】
クロック0に、1024個のNPUの各々が
図4の初期化命令を行い、これは
図5では累算器202へのゼロ値の代入によって図示されている。
【0121】
クロック1に、1024個のナローNPUの各々が、
図20のアドレス1の積和命令を行う。示されるように、ナローNPU0−Aは、累算器202Aの値(ゼロである)を、データRAM122の行17のナローワード0と重みRAM124の行0のナローワード0との積と共に累算し、ナローNPU0−Bは、累算器202Bの値(ゼロである)を、データRAM122の行17のナローワード1と重みRAM124の行0のナローワード1との積と共に累算し、以下同様に続き、ナローNPU511−Bは、累算器202Bの値(ゼロである)を、データRAM122の行17のナローワード1023と重みRAM124の行0のナローワード1023との積と共に累算する。
【0122】
クロック2に、1024個のナローNPUの各々が、
図20のアドレス2の積和循環命令の1回目の反復を行う。示されるように、ナローNPU0−Aは、累算器202Aの値217Aを、ナローNPU511−Bのmux−reg208Bの出力209Bから受け取られた循環されたナローデータワード1811A(データRAM122から受け取られたナローデータワード1023であった)と重みRAM124の行1のナローワード0との積と共に累算し、ナローNPU0−Bは、累算器202Bの値217Bを、ナローNPU0−Aのmux−reg208Aの出力209Aから受け取られた循環されたナローデータワード1811B(データRAM122から受け取られたナローデータワード0であった)と重みRAM124の行1のナローワード1との積と共に累算し、以下同様に続き、ナローNPU511−Bは、累算器202Bの値217Bを、ナローNPU511−Aのmux−reg208Aの出力209Aから受け取られた循環されたナローデータワード1811B(データRAM122から受け取られたナローデータワード1022であった)と重みRAM124の行1のナローワード1023との積と共に累算する。
【0123】
クロック3に、1024個のナローNPUの各々は、
図20のアドレス2の積和循環命令の2回目の反復を行う。示されるように、ナローNPU0−Aは、累算器202Aの値217Aを、ナローNPU511−Bのmux−reg208Bの出力209Bから受け取られた循環されたナローデータワード1811A(データRAM122から受け取られたナローデータワード1022であった)と重みRAM124の行2のナローワード0との積と共に累算し、ナローNPU0−Bは、累算器202Bの値217Bを、ナローNPU0−Aのmux−reg208Aの出力209Aから受け取られた循環されたナローデータワード1811B(データRAM122から受け取られたナローデータワード1023であった)と重みRAM124の行2のナローワード1との積と共に累算し、以下同様に続き、ナローNPU511−Bは、累算器202Bの値217Bを、ナローNPU511−Aのmux−reg208Aの出力209Aから受け取られた循環されたナローデータワード1811B(データRAM122から受け取られたナローデータワード1021であった)と重みRAM124の行2のナローワード1023との積と共に累算する。
図21の省略記号によって指示されるように、これは、・・・に至るまで、続く1021クロックサイクルの各々について継続する。
【0124】
クロック1024に、1024個のナローNPUの各々が、
図20のアドレス2の積和循環命令の1023回目の反復を行う。示されるように、ナローNPU0−Aは、累算器202Aの値217Aを、ナローNPU511−Bのmux−reg208Bの出力209Bから受け取られた循環されたナローデータワード1811A(データRAM122から受け取られたナローデータワード1であった)と重みRAM124の行1023のナローワード0との積と共に累算し、NPU0−Bは、累算器202Bの値217Bを、NPU0−Aのmux−reg208Aの出力209Aから受け取られた循環されたナローデータワード1811B(データRAM122から受け取られたナローデータワード2であった)と重みRAM124の行1023のナローワード1との積と共に累算し、以下同様に続き、NPU511−Bは、累算器202Bの値を、NPU511−Aのmux−reg208Aの出力209Aから受け取られた循環されたナローデータワード1811B(データRAM122から受け取られたナローデータワード0であった)と重みRAM124の行1023のナローワード1023との積と共に累算する。
【0125】
クロック1025に、1024個のナローNPUの各々のAFU212A/212Bが、
図20のアドレス3の活性化関数命令を行う。最後、クロック1026に、1024個のナローNPUの各々は、各自の結果133A/133Bを、データRAM122の行16の自身の対応するナローワードに書き戻すことにより、
図20のアドレス4におけるAFU出力書き出し命令を行い、すなわち、NPU0−Aのナロー結果133Aは、データRAM122のナローワード0に書き込まれ、NPU0−Bのナロー結果133Bは、データRAM122のナローワード1に書き込まれ、以下同様に続き、NPU511−Bのナロー結果133は、データRAM122のナローワード1023に書き込まれる。
図21に関連して上記で説明した動作は、ブロック図の形態で
図22にさらに示される。
【0126】
次いで
図22を参照すると、
図18のNPU126を含んで
図20のプログラムを実行する
図1のNNU121を図示するブロック図が示される。NNU121は、512個のNPU126、すなわち1024個のナローNPU、アドレス入力123を受け取るデータRAM122、及びアドレス入力125を受け取る重みRAM124を含む。示されていないが、クロック0に、1024個のナローNPUは、
図20の初期化命令を行う。示されるように、クロック1に、行17の1024個の8ビットのデータワードがデータRAM122から読み出され、1024個のナローNPUに提供される。クロック1〜1024に、行0〜1023の1024個の8ビット重みワードが、それぞれ、重みRAM124から読み出され、1024個のナローNPUに提供される。示されていないが、クロック1に、1024個のナローNPUが、ロードされたデータワード及び重みワードにそれぞれの積和演算を行う。クロック2〜1024に、1024個のナローNPUのmux−reg208A/208Bが、1024個の8ビットワードの循環器として動作して、前にロードされたデータRAM122の行17のデータワードを、隣接するナローNPUに循環させ、ナローNPUは、それぞれの循環されたナローデータワードと重みRAM124からロードされたそれぞれのナロー重みワードとに積和演算を行う。図示されていないが、クロック1025に、1024個のナローAFU212A/212Bが活性化命令を行う。クロック1026に、1024個のナローNPUが、それぞれの1024個の8ビットの結果133A/133Bを、データRAM122の行16に書き戻す。
【0127】
観察できるように、
図18の実施形態は、例えば
図2の実施形態よりも有利である可能性があり、これは、なぜならば、モデル化される特定の応用例によってワイドのデータ及び重みワード(例えば、16ビット)の量の精度が必要とされるときにそうしたワードを、応用例によってナローのデータ及び重みワード(例えば、8ビット)の量の精度が必要とされるときにそうしたワードを使用して、計算を実行する柔軟性をプログラマに提供するからである。ある観点から見ると、
図18の実施形態は、ナローデータの応用例について、追加のナロー要素(例えば、mux−reg208B、reg205B、ナローALU204B、ナロー累算器202B、ナローAFU212B)という犠牲を払って、
図2の実施形態を上回って2倍のスループットを提供し、上記追加のナロー要素は、NPU126の面積において約50%の増大である。
【0128】
3モードNPU
次いで
図23を参照すると、代替的な一実施形態による、
図1の動的に構成可能なNPU126を図示するブロック図が示される。
図23のNPU126は、ワイド構成及びナロー構成においてだけでなく、さらに、本明細書で「じょうご(funnel)」構成と呼ぶ第3の構成において構成可能である。
図23のNPU126は、多くの点で
図18のNPU126に似ている。ただし、
図18のワイド加算器244Aが、
図23のNPU126では、ナローmux1896Bの出力の拡張されたバージョンである第3の加数2399を受け取る3入力ワイド加算器2344Aに置き換えられている。
図23のNPU126を有するNNU121を動作させるためのプログラムは、大半の点で
図20のプログラムと似ている。ただし、アドレス0のNPU初期化命令は、NPU126を、ナロー構成ではなくじょうご構成に初期化する。加えて、アドレス2の積和循環命令のカウントは、1023ではなく511である。
【0129】
じょうご構成にあるとき、NPU126は、
図20のアドレス1などにおける積和命令を行うとき、2つのナローデータワード207A/207B及び2つのナロー重みワード206A/206Bを受け取るという点で、ナロー構成にあるときと同様に動作する。ワイド乗算器242Aは、データワード209Aと重みワード203Aとを乗算して積246Aを生成し、その積をワイドmux1896Aが選択する。ナロー乗算器242Bは、データワード209Bと重みワード203Bとを乗算して積246Bを生成し、その積をナローmux1896Bが選択する。ただし、ワイド加算器2344Aは、積246A(ワイドmux1896Aによって選択される)と積246B/2399(ワイドmux1896Bによって選択される)との双方をワイド累算器202Aの値217Aに加算し、ナロー加算器244B及びナロー累算器202Bは非アクティブである。さらに、じょうご構成にあるとき、
図20のアドレス2におけるものなどの積和循環命令を実行するときに、制御入力213は、mux−reg208A/208Bに、2つのナローワード(例えば、16ビット)ずつ循環させ、すなわち、mux−reg208A/208Bは、ワイド構成にあるかのように、それぞれの211A/211Bの入力を選択する。ただし、ワイド乗算器242Aは、データワード209Aと重みワード203Aとを乗算して積246Aを生成し、それをワイドmux1896Aが選択し、ナロー乗算器242Bは、データワード209Bと重みワード203Bとを乗算して積246Bを生成し、それをナローmux1896Bが選択し、ワイド加算器2344Aは、積246A(ワイドmux1896Aによって選択される)と積246B/2399(ワイドmux1896Bによって選択される)との双方をワイド累算器202Aの値217Aに加算し、ナロー加算器244B及びナロー累算器202Bは、上記のように非アクティブである。最後、じょうご構成にあるとき、
図20のアドレス3におけるものなどの活性化関数命令を実行するときに、ワイドAFU212Aは、結果として生じる和215Aに活性化関数を行ってナロー結果133Aを生成し、ナローAFU212Bは非アクティブである。したがって、AのナローNPUだけがナロー結果133Aを生成し、BのナローNPUによって生成されたナロー結果133Bは無効である。その結果、書き戻される結果の行(例えば、
図20のアドレス4にある命令のように行16)は、穴を含んでいる。これは、ナロー結果133Aだけが有効であり、ナロー結果133Bは無効であるためである。したがって、概念的には、各クロックサイクルに、各ニューロン(
図23のNPU126)は、2つの接続データ入力を処理し、すなわち2つのナローデータワードにそれぞれの重みを乗算し、2つの積を累算する。このことは、1クロックサイクルにつき1つのみの接続データ入力を各々処理する
図2及び
図18の実施形態と対照的である。
【0130】
図23の実施形態に関連して観察できるように、作り出され、データRAM122又は重みRAM124に書き戻される結果ワード(ニューロン出力)の数は、受け取られるデータ入力(接続)の数の平方根の半分になり、書き戻された結果の行は穴を有し、すなわち1つおきのナローワード結果が無効であり、より具体的にはBのナローNPUの結果は有意でない。そのため、
図23の実施形態は、2つの連続した層を持ち、例えば第1の層が第2の層の2倍の数のニューロンを有する(例えば、第1の層が、512個のニューロンからなる第2の層に完全に接続された1024個のニューロンを持つ)ニューラルネットワークにおいて特に効率的である可能性がある。さらに、他の実行ユニット112(例えば、x86 AVXユニットなどのメディアユニット)は、NNU121がデータRAM122及び/又は重みRAM124の他の行に関連する他の計算を行っている間、必要であれば、後の計算で使用するために、散在した結果の行(すなわち穴がある)にパック動作を行ってそれをコンパクトにする(すなわち穴をなくす)ことができる。
【0131】
ハイブリッドのNNU動作、畳み込み及びプーリング機能
本明細書に記載される実施形態によるNNU121の利点は、NNU121が、同時に、独自の内部プログラムを実行する点でコプロセッサに似たやり方で動作し、自身に対して発行されたアーキテクチャ命令(又はそれから翻訳されたマイクロ命令)を実行する点でプロセッサの実行ユニットに似たやり方で動作することができる点である。アーキテクチャ命令は、NNU121を含むプロセッサによって行われているアーキテクチャプログラムの命令である。このようにして、NNU121は、ハイブリッド式に動作し、このことは、NNU121の高度の利用を維持する能力を提供するため、有利である。例えば、
図24〜
図26は、NNU121が高度に利用される畳み込み演算を行うNNU121の動作を図示し、
図27〜
図28は、プーリング演算を行うNNU121の動作を図示し、これらは、畳み込み層及びプーリング層、並びに画像処理(例えば、エッジ検出、鮮明化、ぼかし処理、認識/分類)などの他のデジタルデータ演算の応用例に必要とされる。ただし、NNU121のハイブリッド動作は、畳み込み又はプーリング演算を行うことに限定されず、このハイブリッドな特徴を使用して、上記で
図4〜
図13に関連して説明したような典型的なニューラルネットワークの積和や活性化関数演算などの他の演算を行うことができる。すなわち、プロセッサ100(より具体的には、リザベーションステーション108)が、MTNN1400及びMFNN1500命令をNNU121に発行し、このことに応答して、NNU121は、データをメモリ122/124/129に書き込み、NNU121によりメモリ122/124に書き込まれた結果をメモリ122/124から読み出し、一方で、同時に、NNU121は、(MTNN1400命令を介して)プロセッサ100によってプログラムメモリ129に書き込まれたプログラムの実行に応答して、メモリ122/124/129の読み出し及び書き込みを行う。
【0132】
次いで
図24を参照すると、畳み込み演算を行うために
図1のNNU121によって使用されるデータ構造の例を図示するブロック図が示される。このブロック図は、畳み込みカーネル2402、データ配列2404、並びに
図1のデータRAM122及び重みRAM124を含んでいる。好ましくは、データ配列2404(例えば、画像画素の)は、プロセッサ100に取り付けられたシステムメモリ(図示せず)に保持され、プロセッサ100がMTNN命令1400を実行することにより、NNU121の重みRAM124にロードされる。畳み込み演算は、第1の行列を第2の行列で畳み込む演算であり、第2の行列を本明細書では畳み込みカーネルと呼ぶ。本開示の文脈において理解されるように、畳み込みカーネルは係数の行列であり、係数は、重み、パラメータ、要素、又は値と呼ばれることもある。好ましくは、畳み込みカーネル2042は、プロセッサ100によって実行されているアーキテクチャプログラムの静的なデータである。
【0133】
データ配列2404は、データ値の2次元配列であり、各データ値(例えば、画像画素値)は、データRAM122又は重みRAM124のワードのサイズ(例えば、16ビット又は8ビット)である。この例では、データ値は16ビットワードであり、NNU121は、512個のワイド構成のNPU126として構成されている。加えて、この実施形態では、NPU126は、下記でより詳細に説明するように、重みRAM124から重みワード206を受け取るmux−reg、例えば
図7のmux−reg705などを備えて、重みRAM124から受け取られたデータ値の行の、集合的な循環器動作を行う。この例では、データ配列2404は、2560列×1600行の画素配列である。アーキテクチャプログラムがデータ配列2404を畳み込みカーネル2402で畳み込むとき、アーキテクチャプログラムは、示されるように、データ配列2404を20個のチャンクに分け、各チャンクは、512×400のデータ行列2406である。
【0134】
畳み込みカーネル2042は、この例では、係数、又は重み、又はパラメータ、又は要素の3×3行列である。係数の1番目の行を、C0,0;C0,1;及びC0,2と表し、係数の2番目の行を、C1,0;C1,1;及びC1,2と表し、係数の3番目の行を、C2,0;C2,1;及びC2,2と表す。例えば、エッジ検出を行うために使用され得る畳み込みカーネルは、0、1、0、1、−4、1、0、1、0、の係数を有する。別の例として、画像のガウスぼかしに使用され得る畳み込みカーネルは、1、2、1、2、4、2、1、2、1、の係数を有する。この場合、通例は除算が最終的な累算値に行われ、除数は、畳み込みカーネル2042の要素の絶対値の和であり、この例では16である。別の例として、除数は、畳み込みカーネル2042の要素の数である。別の例として、除数は、畳み込みを圧縮して所望の値の範囲内に戻す値であり、除数は、畳み込みカーネル2042の要素の値と、上記所望の範囲と、畳み込み対象の行列の入力値の範囲とから決定される。
【0135】
図24に示し、下記で
図25との関連でより詳細に説明するように、アーキテクチャプログラムは、データRAM122に、畳み込みカーネル2042の係数を書き込む。好ましくは、データRAM122の9つ(畳み込みカーネル2402の要素の数)の連続する行の各々のすべてのワードが、行優先の順序で、畳み込みカーネル2402の異なる要素を書き込まれる。すなわち、示されるように、ある行の各ワードが第1の係数C0,0を書き込まれ、次の行が第2の係数C0,1を書き込まれ、その次の行が第3の係数C0,2を書き込まれ、その次の行が第4の係数C1,0を書き込まれ、以下同様に続き、最後、9番目の行の各ワードが、第9の係数C2,2を書き込まれる。特に
図26Aとの関連で下記でより詳細に説明するように、データ配列2404のチャンクのデータ行列2406を畳み込むために、NPU126は、畳み込みカーネル2042の係数を保持しているデータRAM122の9行を、順に、繰り返し読み出す。
【0136】
図24に示し、
図25に関連してより詳細に説明するように、アーキテクチャプログラムは、重みRAM124に、データ行列2406の値を書き込む。NNUプログラムが、畳み込みを行うとき、NNUプログラムは、結果として生じる行列を重みRAM124に書き戻す。好ましくは、
図25に関連して下記でより詳細に説明するように、アーキテクチャプログラムは、第1のデータ行列2406を重みRAM124に書き込み、NNU121を開始し、NNU121が第1のデータ行列2406を畳み込みカーネル2042で畳み込んでいる間、アーキテクチャプログラムは、第2のデータ行列2406を重みRAM124に書き込む。そのため、NNU121が第1のデータ行列2406の畳み込みを完了すると、NNU121は直ちに第2のデータ行列2406の畳み込みを開始することができる。このように、アーキテクチャプログラムは、NNU121を最大限に利用された状態に保つために、重みRAM124の2つの領域の間を行き来する。したがって、
図24の例は、重みRAM124の行0〜399を占めている第1のチャンクに対応する第1のデータ行列2406A、及び、重みRAM124の行500〜899を占めている第2のチャンクに対応する第2のデータ行列2406Bを示している。さらに、示されるように、NNU121は、畳み込みの結果を、重みRAM124の行900〜1299及び1300〜1699に書き戻し、これをアーキテクチャプログラムが後に重みRAM124から読み出す。重みRAM124に保持されているデータ行列2406のデータ値を「Dx,y」と表し、「x」は重みRAM124の行番号であり、「y」は重みRAM124のワード又は列番号である。したがって、例えば、行399のデータワード511は、
図24でD399,511と表されており、これは、NPU511のmux−reg705によって受け取られる。
【0137】
次いで
図25を参照すると、
図1のプロセッサ100が、NNU121を使用するアーキテクチャプログラムを行って、
図24の畳み込みカーネル2042とデータ配列2404との畳み込みを行う動作を図示するフローチャートが示される。フローはブロック2502で開始する。
【0138】
ブロック2502で、プロセッサ100、すなわちプロセッサ100で稼働しているアーキテクチャプログラムが、
図24の畳み込みカーネル2042を、
図24に示し
図24に関連して説明したようにデータRAM122に書き込む。加えて、アーキテクチャプログラムは、変数Nを1の値に初期化する。変数Nは、NNU121によって処理されているデータ配列2404の現在のチャンクを表す。加えて、アーキテクチャプログラムは、変数NUM_CHUNKSを20の値に初期化する。フローはブロック2504に進む。
【0139】
ブロック2504で、プロセッサ100は、
図24に示すように、チャンク1のデータ行列2406を重みRAM124に書き込む(例えば、チャンク1のデータ行列2406A)。フローはブロック2506に進む。
【0140】
ブロック2506で、プロセッサ100は、プログラムメモリ129に書き込む関数1432を指定するMTNN1400命令を使用して、畳み込みプログラムをNNU121のプログラムメモリ129に書き込む。次いで、プロセッサ100は、プログラムの実行を開始する関数1432を指定するMTNN1400命令を使用して、NNU畳み込みプログラムを開始する。NNU畳み込みプログラムの一例は、
図26Aに関連してより詳細に説明する。フローは判定ブロック2508に進む。
【0141】
判定ブロック2508で、アーキテクチャプログラムは、変数Nの値がNUM_CHUNKSより小さいかどうかを決定する。小さい場合、フローはブロック2512に進み、そうでない場合、フローはブロック2514に進む。
【0142】
ブロック2512で、プロセッサ100は、
図24に示すように、チャンクN+1についてのデータ行列2406を重みRAM124に書き込む(例えば、チャンク2のデータ行列2406B)。このように、有利な点として、アーキテクチャプログラムは、NNU121が現在のチャンクに畳み込みを行っている間に、次のチャンクのデータ行列2406を重みRAM124に書き込み、そのため、NNU121は、現在のチャンクの畳み込みが完了する、すなわち重みRAM124に書き込まれると、直ちに次のチャンクに畳み込みの実行を開始することができる。フローはブロック2514に進む。
【0143】
ブロック2514で、プロセッサ100は、現在稼働しているNNUプログラム(チャンク1の場合はブロック2506で開始され、チャンク2〜20の場合はブロック2518で開始されたもの)が完了したことを決定する。好ましくは、プロセッサ100は、MFNN1500命令を実行してNNU121の状態レジスタ127を読み出すことにより、これを決定する。代替的な一実施形態では、NNU121は、畳み込みプログラムを完了したことを示す割込みを生成する。フローは判定ブロック2516に進む。
【0144】
判定ブロック2516で、アーキテクチャプログラムは、変数Nの値がNUM_CHUNKSより小さいかどうかを決定する。小さい場合、フローはブロック2518に進み、そうでない場合、フローはブロック2522に進む。
【0145】
ブロック2518で、プロセッサ100は、畳み込みプログラムを更新して、チャンクN+1の畳み込みを行えるようにする。より具体的には、プロセッサ100は、アドレス0におけるNPU初期化命令の重みRAM124の行値を、データ行列2406の1番目の行(例えば、データ行列2406Aについて、行0、又は、データ行列2406Bについて、行500)に更新し、出力行を(例えば、900又は1300に)更新する。プロセッサ100は、次いで、更新されたNNU畳み込みプログラムを開始する。フローはブロック2522に進む。
【0146】
ブロック2522で、プロセッサ100は、チャンクNについてNNU畳み込みプログラムの結果を、重みRAM124から読み出す。フローは判定ブロック2524に進む。
【0147】
判定ブロック2524で、アーキテクチャプログラムは、変数Nの値がNUM_CHUNKSより小さいかどうかを決定する。小さい場合、フローはブロック2526に進み、そうでない場合、フローは終了する。
【0148】
ブロック2526で、アーキテクチャプログラムは、Nを1だけ増分する。フローは判定ブロック2508に戻る。
【0149】
次いで
図26Aを参照すると、
図24のデータ行列2406と畳み込みカーネル2042との畳み込みを行い、それを重みRAM124に書き戻すNNUプログラムのプログラムリストが示される。このプログラムは、アドレス1〜9の命令のループ本体を通じて複数回ループする。アドレス0のNPU初期化命令は、各NPU126がループ本体を実行する回数を指定し、ループ本体は、
図26Aの例では、
図24のデータ行列2406内の行の数に対応する400のループカウント値を有し、ループの最後(アドレス10)におけるループ命令は、現在のループカウント値を減分し、その結果が非ゼロである場合、ループ本体の先頭に(すなわちアドレス1の命令に)制御を戻す。NPU初期化命令はさらに、累算器202をゼロにクリアする。好ましくは、アドレス10のループ命令がさらに、累算器202をゼロにクリアする。或いは、上記のように、アドレス1の積和命令が、累算器202をゼロにクリアすることを指定してもよい。
【0150】
プログラムのループ本体が実行されるたび、512個のNPU126が、3×3の畳み込みカーネル2402と、データ行列2406の512個それぞれの3×3部分行列との、512の畳み込みを同時に行う。畳み込みは、畳み込みカーネル2042の要素と、上記それぞれの部分行列のうちその対応する要素との、9つの積の和である。
図26Aの実施形態では、512個それぞれの3×3部分行列各々の原点(中央の要素)が、
図24のデータワードDx+1、y+1であり、ここで、y(列番号)はNPU126の番号であり、x(行番号)は、
図26Aのプログラムのアドレス1における積和命令によって読み出される現在の重みRAM124の行番号である(また、行番号は、アドレス0のNPU初期化命令によって初期化され、アドレス3及び5の積和命令の各々で増分され、アドレス9の減分命令によって更新される)。したがって、プログラムの各ループについて、512個のNPU126が512個の畳み込みを計算し、512個の畳み込み結果を、重みRAM124の指定された行に書き戻す。この説明では、簡略のためにエッジ処理は無視するが、NPU126の集合的循環機能の使用は、列のうち2つをデータ行列2406(例えば、画像処理の場合は画像の)の一方の縦方向のエッジからもう一方の縦方向のエッジに(例えば、左のエッジから右のエッジへ、又はその逆)送ること(wrapping)を引き起こすことに留意されたい。次いでループ本体について説明する。
【0151】
アドレス1にあるのは、データRAM122の行0を指定し、現在の重みRAM124の行を暗黙的に使用する積和命令であり、上記現在の行は、好ましくは、シーケンサ128に保持される(また、ループ本体の最初の通過のために、アドレス0の命令によってゼロに初期化される)。すなわち、アドレス1の命令は、NPU126の各々に、各自の対応するワードをデータRAM122の行0から読み出させ、各自の対応するワードを現在の重みRAM124の行から読み出させ、その2つのワードに対する積和演算を行わせる。したがって、例えば、NPU5は、C0,0とDx,5とを乗算し(「x」は現在の重みRAM124の行)、その結果を累算器202の値217に加算し、その和を累算器202に書き戻す。
【0152】
アドレス2にあるのは、データRAM122の行を増分(すなわち、行1に増分)してから、増分されたアドレスにおける行をデータRAM122から読み出すように指定する積和命令である。この命令はさらに、各NPU126のmux−reg705内の値を隣接するNPU126に循環させることを指定し、これは、この場合、アドレス1の命令に応答して重みRAM124から読み出されたばかりのデータ行列2406の値の行である。
図24〜
図26の実施形態では、NPU126は、
図3、
図7、及び
図19に関連して上記で説明したように、mux−reg705の値を左に、すなわち、NPU JからNPU J+1へではなくNPU JからNPU J−1に循環させるように構成される。NPU126が右に循環するように構成される実施形態では、同様の畳み込み結果を達成するために、アーキテクチャプログラムは、畳み込みカーネル2042の係数値をデータRAM122に、異なる順序で(例えば、中央の列を中心に循環させる)書き込むことができることを理解されたい。さらに、アーキテクチャプログラムは、必要に応じて、畳み込みカーネル2042の追加的な事前処理(例えば、互換)を行ってもよい。加えて、命令は、2のカウント値を指定する。したがって、アドレス2の命令は、NPU126の各々に、各自の対応するワードをデータRAM122の行1から読み出させ、循環されたワードをmux−reg705へと受け取らせ、その2つのワードに対する積和演算を行わせる。カウント値が2であるために、命令はさらに、NPU126の各々にすぐ上記で説明した動作を繰り返させる。すなわち、シーケンサ128は、データRAM122の行アドレス123を増分(すなわち行2に増分)し、各NPU126は、各自の対応するワードをデータRAM122の行2から読み出し、循環されたワードをmux−reg705へと受け取り、その2つのワードに積和演算を行う。したがって、例えば、現在の重みRAM124の行が27であると仮定すると、アドレス2の命令を実行した後、NPU5は、自身の累算器202の中に、C0,1とD27,6との積、及びC0,2とD27,7との積を累算していることになる。したがって、アドレス1及び2における命令の完了後、C0,0とD27,5との積、C0,1とD27,6との積、及びC0,2とD27,7との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器202に累算されていることになる。
【0153】
アドレス3及び4の命令は、アドレス1及び2の命令と同様の動作を行うが、重みRAM124の行増分インディケータがあるために、重みRAM124の次の行に対して動作を行い、またデータRAM122の次の3つの行、すなわち行3〜5に対して動作を行う。すなわち、例えばNPU5に関しては、アドレス1〜4の命令の完了後、C0,0とD27,5との積、C0,1とD27,6との積、C0,2とD27,7との積、C1,0とD28,5との積、C1,1とD28,6との積、及びC1,2とD28,7との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器202に累算されていることになる。
【0154】
アドレス5及びの6命令は、アドレス3及び4の命令と同様の動作を行うが、重みRAM124の次の行、及びデータRAM122の次の3つの行、すなわち行6〜8について行う。すなわち、例えばNPU5に関しては、アドレス1〜6の命令の完了後、C0,0とD27,5との積、C0,1とD27,6との積、C0,2とD27,7との積、C1,0とD28,5との積、C1,1とD28,6との積、C1,2とD28,7との積、C2,0とD29,5との積、C2,1とD29,6との積、及びC2,2とD29,7との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器202に累算されていることになる。すなわち、アドレス1〜6の命令の完了後、そしてループ本体の開始時の重みRAM124の行が27であったと仮定すると、例えばNPU5は、畳み込みカーネル2042を使用して、以下の3×3の部分行列の畳み込みを行っていることになる。
(外1)
より一般的には、アドレス1〜6の命令の完了後、512個のNPU126の各々は、畳み込みカーネル2042を使用して、以下の3×3の部分行列の畳み込みを行っていることになる。
(外2)
ここで、rはループ本体の開始時の重みRAM124の行アドレス値であり、nはNPU126の番号である。
【0155】
アドレス7の命令は、AFU212を通じて、累算器202の値217をパススルーする。このパススルー関数は、データRAM122及び重みRAM124から読み出されるワードのサイズ(ビット単位)(すなわち、本例では16ビット)であるワードをパススルーする。好ましくは、下記でより詳細に説明するように、ユーザが、出力の形式、例えば、出力ビットのうちいくつが小数ビットであるかを指定することができる。或いは、パススルー活性化関数を指定するのではなく、除算活性化関数が指定され、これは、例えば
図29A及び
図30に関連して本明細書に記載されるように、例えば
図30の「除算器」3014/3016の1つを使用して累算器202の値217を除数で割る。例えば、上記のガウスぼかしカーネルの16分の1係数などの係数を伴う畳み込みカーネル2042の場合、パススルー関数ではなく、アドレス7の活性化関数命令が、除算(例えば、16で割る)活性化関数を指定することができる。或いは、アーキテクチャプログラムは、データRAM122に畳み込みカーネル2042の係数を書き込む前に、これらに16による除算を行い、このことに応じて畳み込みカーネル2402の値について、例えば下記の
図29のデータの2進小数点2922を使用して、2進小数点の場所を調節することができる。
【0156】
アドレス8の命令は、AFU212の出力を、出力行レジスタの現在の値で指定される重みRAM124の行に書き込む。上記出力行レジスタは、アドレス0の命令で初期化されており、この命令中に増分インディケータがあるため、ループを通過するたびに増分される。
【0157】
3×3の畳み込みカーネル2402を有する
図24〜
図26の例から判断できるように、NPU126は、約3クロックサイクルごとに重みRAM124を読み出してデータ行列2406の行を読み出し、畳み込み結果行列を書き込むためにおよそ12クロックサイクルごとに重みRAM124に書き込みをする。加えて、
図17のバッファ1704など、読み出し及び書き込みバッファを含んでいる実施形態を仮定すると、NPU126が読み出し及び書き込みを行うのと同時に、プロセッサ100が重みRAM124の読み出し及び書き込みを行い、その結果、バッファ1704は、約16クロックサイクルごとに重みRAM124の1回の書き込みと1回の読み出しとを行って、それぞれ、データ行列2406を書き込み、畳み込みの結果行列を読み出す。したがって、重みRAM124の帯域幅の約半分が、NNU121が畳み込み演算を行うハイブリッドな仕方によって消費される。この例は3×3の畳み込みカーネル2042を含むが、2×2、4×4、5×5、6×6、7×7、8×8等の行列など、他のサイズの畳み込みカーネルが用いられることも可能であり、その場合はNNUプログラムが変化する。より大きな畳み込みカーネルの場合、より小さいパーセンテージの重みRAM124の帯域幅が、消費される。これは、NPU126がより小さいパーセンテージの時間、重みRAMを読み出すためであり、なぜならば、積和命令の循環バージョンにおけるカウントが(例えば、
図26Aのプログラムのアドレス2、4、及び6、並びにより大きい畳み込みカーネルの場合に必要となるであろう追加的な同様の命令において)より大きいからである。
【0158】
或いは、畳み込みの結果を重みRAM124の異なる行(例えば、900〜1299及び1300〜1699)に書き戻すのではなく、アーキテクチャプログラムは、入力データ行列2406の行を、それらの行が必要でなくなった後に上書きするようにNNUプログラムを構成する。例えば、3×3の畳み込みカーネルの場合、データ行列2406を重みRAM124の行0〜399に書き込むのではなく、アーキテクチャプログラムは、データ行列2406を行2〜401に書き込み、NNUプログラムは、畳み込みの結果を、重みRAM124の行0から始めてループ本体を通過するたびに増分する行に書き込むように構成される。このようにして、NNUプログラムは、もう必要でなくなった行だけを上書きする。例えば、ループ本体の1回目の通過の後(より具体的には、重みRAM124の行0にロードするアドレス1の命令の実行後)、行0にあるデータは上書きできるようになるが、行1〜3にあるデータは、ループ本体を2回目に通過する際に必要になり、したがってループ本体の1回目の通過では上書きされない。同様に、ループ本体の2回目の通過後には、行1にあるデータが上書きできるようになるが、行2〜4にあるデータは、ループ本体を2回目に通過する際に必要となり、したがってループ本体の2回目の通過では上書きされず、以下同様に続く。そのような実施形態では、各データ行列2406(チャンク)の高さは、より大きくてよく(例えば、800行)、結果として、より少ないチャンク数がもたらされる。
【0159】
或いは、畳み込みの結果を重みRAM124に書き戻すのではなく、アーキテクチャプログラムは、畳み込みの結果を畳み込みカーネル2402より上の(例えば、行8より上の)データRAM122の行に書き戻すようにNNUプログラムを構成し、アーキテクチャプログラムは、NNU121が結果を書き込むとき、それをデータRAM122から読み出す(例えば、下記の
図26Bの一番最近書き込まれたデータRAM122の行2606のアドレスを使用する)。この代替法は、重みRAM124がシングルポートでありデータRAM122がデュアルポートである実施形態で有利である可能性がある。
【0160】
図24〜
図26Aの実施形態によるNNU121の動作から観察できるように、
図26Aのプログラムの各実行は、約5000クロックサイクルを要し、その結果、
図24の2560×1600のデータ配列2404全体を畳み込むには、約100,000クロックサイクルを要し、これは、同様の作業を従来の方法で行うために必要なクロックサイクル数よりもかなり少ない可能性がある。
【0161】
次いで
図26Bを参照すると、一実施形態による
図1のNNU121の制御レジスタ127の特定のフィールドを図示するブロック図が示される。状態レジスタ127は、NPU126によって書き込まれた重みRAM124の一番最近の行のアドレスを指示するフィールド2602、NPU126によって書き込まれたデータRAM122の一番最近の行のアドレスを指示するフィールド2606、NPU126によって読み出された重みRAM124の一番最近の行のアドレスを指示するフィールド2604、及び、NPU126によって読み出されたデータRAM122の一番最近の行のアドレスを指示するフィールド2608を含む。これにより、プロセッサ100で実行されているアーキテクチャプログラムは、NNU121がデータRAM122及び/又は重みRAM124の読み出し及び/又は書き込みを進めるとき、NNU121の進捗を決定することができる。上記のように入力データ行列を上書きする(又は上述のようにデータRAM122に結果を書き込む)選択肢と併せてこの能力を用いると、
図24のデータ配列2404は、以下のように、例えば、20個の512×400チャンクではなく、5個の512×1600チャンクとして処理することができる。プロセッサ100は、最初の512×1600のチャンクを重みRAM124の行2から書き込み、NNUプログラム(1600回のループカウント、及び初期化された0の重みRAM124の出力行を有する)を開始する。NNU121がNNUプログラムを実行するとき、プロセッサ100は、重みRAM124の出力の場所/アドレスを監視して、(1)NNU121によって書き込まれた有効な畳み込み結果を持つ重みRAM124の行(行0から開始する)を(MFNN1500命令を使用して)読み出し、(2)有効な畳み込み結果がすでに読み出された後、該畳み込み結果の上に2番目の512×1600のデータ行列2406を書き込む(行2から開始する)。それにより、NNU121が最初の512×1600チャンクに対してNNUプログラムを完了するとき、プロセッサ100は必要に応じて直ちにNNUプログラムを更新し、NNUプログラムを再度開始して2番目の512×1600チャンクを処理することができる。このプロセスは、残りの3つの512×1600のチャンクに対してもう3回繰り返されて、NNU121の高い利用率を達成する。
【0162】
有利な点として、一実施形態では、特に
図29A及び
図29B及び
図30に関連して下記でより詳細に説明するように、AFU212は、累算器202の値217の有効な除算を効率的に行う能力を備える。例えば、累算器202の値217を16で割る活性化関数NNU命令が、上記のガウスぼかし行列に使用できる。
【0163】
図24の例で使用される畳み込みカーネル2402は、データ配列2404全体に適用される小さい静的な畳み込みカーネルであるが、他の実施形態では、畳み込みカーネルは、畳み込みニューラルネットワークに一般的に見られるような、データ配列2404の異なるデータ値に関連付けられた固有の重みを有する大きな行列であってもよい。NNU121がそのようにして使用される場合、アーキテクチャプログラムは、データ行列の場所と畳み込みカーネルの場所とを入れ替えることができ、すなわち、データRAM122にデータ行列を、重みRAM124に畳み込みカーネルを置いてもよく、NNUプログラムの所与の実行で処理できる行の数は、相対的により少なくなる可能性がある。
【0164】
次いで
図27を参照すると、
図1のNNU121によってプーリング演算が行われる入力データが投入された、
図1の重みRAM124の一例を図示するブロック図が示される。人工ニューラルネットワークのプーリング層によって行われるプーリング演算は、入力行列の部分領域又は部分行列を取り出すことと、その部分行列の最大値又は平均値のどちらかを計算することとにより、入力データ(例えば、画像又は畳み込み画像)の行列の次元数を減らし、上記最大値又は平均値は、結果得られる行列、すなわちプーリングされた行列になる。
図27及び
図28の例では、プーリング演算は、各部分行列の最大値を計算する。プーリング演算は、例えばオブジェクト分類や検出を行う人工ニューラルネットワークで特に有用である。一般に、プーリング演算は、調べる部分行列内の要素数の因数によって(by a factor of)、演算の入力行列のサイズを効果的に減らし、特に、各次元の入力行列を、部分行列の対応する次元にある要素数だけ減らす。
図27の例では、入力データは、重みRAM124の行0〜1599に記憶された、ワイドワード(例えば、16ビット)の512×1600行列である。
図27では、ワードは、各自の行、列の場所で表され、例えば、行0及び列0にあるワードはD0,0と表され、行0及び列1にあるワードはD0,1と表され、行0及び列2にあるワードはD0,2と表され、以下同様に続き、行0及び列511にあるワードはD0,511と表される。同様に、行1及び列0にあるワードはD1,0と表され、行1及び列1にあるワードはD1,1と表され、行1及び列2にあるワードはD1,2と表され、以下同様に続き、行1及び列511にあるワードはD1,511と表され、以下同様に続き、行1599及び列0にあるワードはD1599,0と表され、行1599及び列1にあるワードはD1599,1と表され、行1599及び列2にあるワードはD1599,2と表され、以下同様に続き、行1599及び列511にあるワードはD1599,511と表される。
【0165】
次いで
図28を参照すると、
図27の入力データ行列のプーリング演算を行い、それを重みRAM124に書き戻すNNUプログラムのプログラムリストが示される。
図28の例では、プーリング演算は、入力データ行列の部分行列のそれぞれの4×4部分行列の最大値を計算する。プログラムは、アドレス1〜10の命令のループ本体を複数回ループする。アドレス0にあるNPU初期化命令が、各NPU126がループ本体を実行する回数を指定し、ループ本体は、
図28の例では400のループカウント値を有し、ループの最後(アドレス11)にあるループ命令は、現在のループカウント値を減分し、その結果が非ゼロである場合、ループ本体の先頭に(すなわちアドレス1の命令に)制御を戻す。重みRAM124内の入力データ行列は、NNUプログラムにより、4つの隣接する行、すなわち行0〜3、行4〜7、行8〜11、及び以下同様に行1596〜1599までの400個の相互に排他的なグループとして、効果的に扱われる。4つの隣接する行からなる各グループは、128個の4×4部分行列、すなわち、あるグループの4つの行と、それに隣接する4つの列、すなわち列0〜3、4〜7、8〜11、及び以下同様に列508〜511との、交差によって形成される要素の4×4部分行列を含む。512個のNPU126のうち、512個のNPU126の4つごとのNPU126(すなわち128個)が、それぞれの4×4部分行列にプーリング演算を行い、NPU126の他の4分の3は使用されない。より具体的には、NPU0、4、8、及び以下同様にNPU508までが各々、そのそれぞれの4×4部分行列にプーリング演算を行い、該部分行列の一番左の列番号がNPU番号に対応し、該部分行列の下側の行が現在の重みRAM124の行値に対応する。上記現在の重みRAM124の行値は、下記でより詳細に説明するように、アドレス0の初期化命令によってゼロに初期化され、ループ本体が反復されるたびに4だけ増分される。ループ本体の400回の反復は、
図27の入力データ行列の4×4部分行列からなるグループの数に対応している(入力データ行列の1600行÷4)。NPU初期化命令はさらに、累算器202をゼロにクリアする。好ましくは、アドレス11のループ命令がさらに、累算器202をゼロにクリアする。或いは、アドレス1のmaxwacc命令が累算器202をゼロにクリアすることを指定する。
【0166】
プログラムのループ本体が反復されるたびに、128個の使用されるNPU126が同時に、入力データ行列の現在の4行グループの128個のそれぞれの4×4部分行列の、128のプーリング演算を行う。より具体的には、プーリング演算は、4×4部分行列の16個の要素のうち、最大値の要素を決定する。
図28の実施形態では、使用される128個のNPU126の各NPU yについて、4×4部分行列の左下の要素が、
図27の要素Dx,yであり、xは、ループ本体の開始時における現在の重みRAM124の行番号であり、これが、
図28のプログラムのアドレス1にあるmaxwacc命令によって読み出される(さらに、行番号は、アドレス0のNPU初期化命令によって初期化され、アドレス3、5、及び7のmaxwacc命令の各々で増分される)。プログラムのループごとに、使用される128個のNPU126は、現在の行のグループのそれぞれの128個の4×4部分行列のうち、その対応する最大値の要素を、重みRAM124の指定された行に書き戻す。次いでループ本体について説明する。
【0167】
アドレス1にあるのは、現在の重みRAM124の行を暗黙的に使用するmaxwacc命令であり、現在の重みRAM124の行は、好ましくは、シーケンサ128に保持される(また、ループ本体の最初の通過のために、アドレス0の命令によってゼロに初期化される)。アドレス1の命令は、NPU126の各々に、その対応するワードを重みRAM124の現在の行から読み出させ、該ワードを累算器202の値217と比較させ、累算器202に2つの値のうち最大値を記憶させる。したがって、例えば、NPU8は、累算器202の値217とデータワードDx,8(「x」は現在の重みRAM124の行)とのうち最大値を決定し、その最大値を累算器202に書き戻す。
【0168】
アドレス2にあるのは、各NPU126のmux−reg705にある値を隣接するNPU126に循環させるように指定するmaxwacc命令であり、これは、この場合、アドレス1の命令に応答して重みRAM124から読み出されたばかりの入力データ行列値の行である。
図27〜
図28の実施形態では、NPU126は、上記で
図24〜
図26に関連して説明したように、mux−reg705の値を左に、すなわちNPU JからNPU J−1に循環させるように構成される。加えて、命令は、3のカウント値を指定する。したがって、アドレス2の命令は、NPU126各々に、循環されたワードをmux−reg705に受け取らせ、循環されたワードと累算器202の値217とのうち最大値を決定させ、次いでその動作をもう2回繰り返させる。すなわち、各NPU126は、3回、循環されたワードをmux−reg705中に受け取り、循環されたワードと累算器202の値217とのうちの最大値を決定する。したがって、例えば、ループ本体の開始時における現在の重みRAM124の行が36であると仮定すると、アドレス1及び2の命令を実行した後、例えばNPU8は、自身の累算器202の中に、ループ本体の開始時の累算器202と、4つの重みRAM124ワード、D36,8及びD36,9及びD36,10及びD36,11とのうちの、最大値を記憶していることになる。
【0169】
アドレス3及び4のmaxwacc命令は、アドレス1及び2の命令と同様の動作を行うが、重みRAM124の行増分インディケータがあるために、重みRAM124の次の行について動作を行う。すなわち、ループ本体の開始時における現在の重みRAM124の行が36であると仮定すると、アドレス1〜4の命令の完了後、例えばNPU8は、自身の累算器202の中に、ループ本体の開始時の累算器202と、8つの重みRAM124ワード、D36,8及びD36,9及びD36,10及びD36,11及びD37,8及びD37,9及びD37,10及びD37,11とのうちの、最大値を記憶していることになる。
【0170】
アドレス5〜8のmaxwacc命令は、アドレス3及び4の命令と同様の動作を行うが、重みRAM124の次の2つの行について動作を行う。すなわち、ループ本体の開始時における現在の重みRAM124の行が36であると仮定すると、アドレス1〜8の命令の完了後、例えばNPU8は、自身の累算器202の中に、ループ本体の開始時の累算器202と、16個の重みRAM124ワード、D36,8及びD36,9及びD36,10及びD36,11及びD37,8及びD37,9及びD37,10及びD37,11及びD38,8及びD38,9及びD38,10及びD38,11及びD39,8及びD39,9及びD39,10及びD39,11とのうちの、最大値を記憶していることになる。すなわち、アドレス1〜8の命令の完了後、そしてループ本体の開始時の重みRAM124の行が36であったと仮定すると、例えばNPU8は、次の4×4部分行列の最大値を決定していることになる。
(外3)
より一般的には、アドレス1〜8の命令の完了後、使用される128個のNPU126の各々は、次の4×4部分行列の最大値を決定していることになる。
(外4)
ここで、rはループ本体の開始時の重みRAM124の行アドレス値であり、nはNPU126の番号である。
【0171】
アドレス9の命令は、累算器202の値217を、AFU212を通じてパススルーする。このパススルー関数は、重みRAM124から読み出されるワードのサイズ(ビット単位)(すなわち、本例では16ビット)であるワードをパススルーする。好ましくは、下記でより詳細に説明するように、ユーザが、出力の形式、例えば、出力ビットのうちいくつが小数ビットであるかを指定することができる。
【0172】
アドレス10の命令は、累算器202の値217を、出力行レジスタの現在の値で指定される重みRAM124の行に書き込む。上記出力行レジスタは、アドレス0の命令で初期化されており、この命令中に増分インディケータがあるために、ループを通過するたびに増分される。より具体的には、アドレス10の命令は、累算器202のワイドワード(例えば、16ビット)を重みRAM124に書き込む。好ましくは、下記の
図29A及び
図29Bに関連して下記でより詳細に説明するように、この命令は、出力2進小数点2916で指定されるように16ビットを書き込む。
【0173】
観察できるように、ループ本体の反復によって重みRAM124に書き込まれる各行は、無効なデータを有する穴を含んでいる。すなわち、結果的に得られる133個のワイドワード、1〜3、5〜7、9〜11、及び以下同様にワイドワード509〜511は、無効であり、すなわち使用されない。一実施形態では、AFU212は、出力重みRAM124の行に書き戻すために、
図11の行バッファ1104などの行バッファの隣接するワードに結果をパックできるようにするmuxを含む。好ましくは、活性化関数命令が各穴にあるワードの数を指定し、穴内のワード数が使用されて、muxを制御して結果をパックする。一実施形態では、穴の数は、プーリングの3×3、4×4、5×5、6×6、又は7×7の部分行列の出力をパックするために、2から6の値として指定することができる。或いは、プロセッサ100で実行されているアーキテクチャプログラムが、結果として生じる疎な(すなわち穴を含んでいる)結果行を重みRAM124から読み出し、例えばx86 SSE命令などのアーキテクチャパック命令を使用するメディアユニットなどの他の実行ユニット112を使用して、パック関数を行う。有利な点として、上記の仕方に似ると共にNNU121のハイブリッド的な性質を利用する同時的な仕方で、プロセッサ100で実行されているアーキテクチャプログラムは、状態レジスタ127を読み出して、重みRAM124の一番最近書き込まれた行を監視し(例えば、
図26Bのフィールド2602)て、結果として生じる疎な行を読み出し、その行をパックし、これを重みRAM124の同じ行に書き戻すことができる。その結果、上記行は、畳み込み層や典型的なニューラルネットワーク層(すなわち積和層)など、ニューラルネットワークの次の層のための入力データ行列として使用できる状態になる。さらに、プーリング演算を4×4の部分行列に行う実施形態が記載されるが、
図28のNNUプログラムは、3×3、5×5、6×6、又は7×7の部分行列など、他のサイズの部分行列にプーリング演算を行うように変更を加えられてもよい。
【0174】
さらに観察されるように、重みRAM124に書き込まれる結果行の数は、入力データ行列の行の数の4分の1である。最後、この例では、データRAM122は使用されない。しかし、別法として、重みRAM124ではなく、データRAM122がプーリング演算を行うために使用されてもよい。
【0175】
図27及び
図28の例では、プーリング演算は、部分領域の最大値を計算する。しかし、
図28のプログラムは、例えば、maxwacc命令をsumwacc命令(重みワードを累算器202の値217に足す)に置き換えることと、アドレス9の活性化関数命令を変更して、累算されている結果を、この例では16である各部分領域の要素数で(好ましくは下記のように逆数乗算を介して)割ることとにより、部分領域の平均値を計算するように変更を加えられてもよい。
【0176】
図27及び
図28の実施形態によるNNU121の動作から観察できるように、
図28のプログラムの各実行は、
図27の512×1600のデータ行列全体のプーリング演算を行うために約6000クロックサイクルを要し、これは、同様の作業を従来の方法で行うために必要なクロックサイクル数よりもかなり少ない可能性がある。
【0177】
或いは、プーリング演算の結果を重みRAM124に書き戻すのではなく、アーキテクチャプログラムは、結果をデータRAM122の行に書き戻すようにNNUプログラムを構成し、アーキテクチャプログラムは、NNU121が結果を書き込むとき、その結果をデータRAM122から読み出す(例えば、
図26Bの一番最近書き込まれたデータRAM122の行2606のアドレスを使用して)。この代替法は、重みRAM124がシングルポートでありデータRAM122がデュアルポートである実施形態で有利である可能性がある。
【0178】
ユーザ供給の2進小数点による固定小数点算術、最大精度の固定小数点累算、ユーザ指定の逆数値、累算器値の確率的丸め、及び選択可能な活性化/出力関数
一般的に言って、デジタルコンピューティングデバイス内で算術を行うハードウェアユニットは、それぞれ整数及び浮動小数点数に算術演算を行うことから一般に「整数」ユニット及び「浮動小数点」ユニットと呼ばれるものに分けることができる。浮動小数点数は、大きさ(又は仮数)及び指数、並びに通例は符号を有する。指数は、大きさに対する小数点(通例は2進小数点)の場所を示すものである。対して、整数は指数を持たず、大きさのみを持ち、しばしば符号を有する。浮動小数点ユニットの利点の1つは、プログラマが、極めて大きな範囲内の異なる値をとり得る数を扱えることであり、ハードウェアが、必要に応じて数の指数値の調節を担い、プログラマは調節を行う必要がない。例えば、2つの浮動小数点数、0.111×10
29と0.81×10
31が乗算されると仮定する。(ここでは10進、すなわち10を底とする例が使用されるが、浮動小数点ユニットは、最も一般的には2を底とする浮動小数点数を扱う。)浮動小数点ユニットは、仮数を乗算し、指数を加算し、次いで結果を基準化して.8991×10
59の値に戻すことを自動的に担う。別の例として、上記の同じ2つの浮動小数点数が加算されると仮定する。浮動小数点ユニットは、これらを加算する前に仮数の2進小数点を位置合わせして、結果として得られる和の.81111×10
31の値を生成することを自動的に担う。
【0179】
しかし、浮動小数点ユニットに伴う複雑性とその結果生じるサイズ、電力消費、命令当たりのクロック数の増大及び/又はサイクル時間の延長はよく知られている。実際、この理由のために、多くのデバイス(例えば、組み込みプロセッサ、マイクロコントローラ、並びに、比較的低コスト及び/又は低電力のマイクロプロセッサ)は、浮動小数点ユニットを含んでいない。上記の例から観察できるように、浮動小数点ユニットの複雑性の一部には、浮動小数点の加算及び乗算/除算に関連する指数算出を行う論理(オペランドの指数を加算/減算して、結果得られる浮動小数点乗算/除算の指数値を生成する加算器、オペランドの減算指数を決定して、浮動小数点加算のための2進小数点位置合わせシフト量を決定する減算器)、浮動小数点加算のために仮数の2進小数点位置合わせを達成するシフタ、浮動小数点の結果を基準化するシフタが含まれる。加えて、ブロックユニットに対するフロー進行は、通例、浮動小数点結果の丸めを行う論理、整数形式と浮動小数点形式との間、又は異なる浮動小数点精度形式(例えば、拡張精度、倍精度、単精度、半精度)間の変換を行う論理、先行ゼロ及び先行1の検出器、並びに、非正規化数、NAN、及び無限大などの特殊な浮動小数点数を扱う論理を必要とする。
【0180】
さらに、浮動小数点ユニットの正確さを検証する際の複雑性が著しいという不都合があり、これは主として、設計を検証しなければならない数空間が増大するためであり、それにより、製品の開発サイクルと市場で販売するまでの時間が長くなる可能性がある。さらには、上記のように、浮動小数点算術は、計算に関係する浮動小数点数ごとに別個の仮数フィールドと指数フィールドを記憶及び使用することを示唆し、それにより、必要とされる記憶域の量が増大する、且つ/又は、整数を記憶するために等しい量の記憶域を想定したときに精度が低下する可能性がある。これらの不都合点の多くは、整数に算術演算を行う整数ユニットの使用によって回避される。
【0181】
しばしば、プログラマは、小数、すなわち自然数でない数を処理するプログラムを書く。そのプログラムは、浮動小数点ユニットを備えないプロセッサで稼働する可能性もあり、又は、備えている場合でも、プロセッサの整数ユニットによって実行される整数命令の方がより速い可能性がある。整数ユニットに伴う潜在的な性能の利点を活用するために、プログラマは、一般に固定小数点算術として知られるものを固定小数点数に用いる。そのようなプログラムは、整数ユニットに実行されて整数又は整数データを処理する命令を含んでいる。ソフトウェアは、データが小数であることを認識しており、また、整数データに例えば位置合わせシフトなどの演算を行って、データが実際には小数である事実に対処する命令を含んでいる。基本的に、固定小数点ソフトウェアは、浮動小数点ユニットが行う機能の一部又はすべてを手動で行う。
【0182】
本開示で使用される場合、「固定小数点」数(又は値又はオペランド又は入力又は出力)は、その記憶のビットが、本明細書で「小数ビット」と呼ばれる、当該固定小数点数の小数部分を表すビットを含んでいると理解される数である。固定小数点数の記憶のビットは、メモリ又はレジスタに含まれ、例えば、メモリ又はレジスタ内の8ビット又は16ビットのワードである。さらに、固定小数点数の記憶のビットはすべて、大きさを表すために使用され、場合によっては、1ビットが符号を表すために使用されるが、固定小数点数の記憶ビットのうち、その数の指数を表すために使用される記憶ビットはない。さらに、固定小数点数の小数ビットの数又は2進小数点の場所は、固定小数点数の記憶ビットとは別個の記憶域において指定され、この記憶域は、固定小数点数が属する固定小数点数のセット、例えば、処理ユニットのアレイの入力オペランド、累算値、又は出力結果のセットなどについて、小数ビットの数又は2進小数点の場所を、共有されたやり方又は大域的なやり方で指示する。
【0183】
有利な点として、ALUは整数ユニットであるが、活性化関数ユニットが固定小数点算術のハードウェア支援又は加速を含む実施形態が、本明細書に記載される。これにより、ALU部分を小型化及び高速化することができ、それにより、ダイ上の所与の空間内により多くのALUを持つことが容易になる。これは、ダイ空間当たりのニューロン数が増えることを示唆し、これは特にニューラルネットワークユニットで有利である。
【0184】
さらに有利な点として、浮動小数点数ごとに指数記憶ビットを必要とする浮動小数点数と対照的に、記載される実施形態では、固定小数点数が、数のセット全体について、小数ビットである記憶のビット数の指示を用いて表され、ただしこの指示は、セット全体のすべての数について小数ビットの数を大域的に指示する、単一の共有された記憶域に置かれる。上記数のセットは、例えば、一連の演算への入力のセット、その一連の演算の累算値のセット、出力のセットである。好ましくは、NNUのユーザが、数のセットに対して小数記憶ビットの数を指定できるようにされる。したがって、多くの文脈(例えば、一般の数学)では、用語「整数」は符号付きの自然数、すなわち小数部分を持たない数を指すが、本開示の文脈における用語「整数」は、小数部分を持つ数を指す場合もあることを理解されたい。さらに、本開示の文脈における用語「整数」は、個々の記憶のビットの一部が浮動小数点数の指数を表すために使用される浮動小数点数から区別することが意図される。同様に、整数ユニットによって行われる整数の乗算又は加算又は比較などの整数算術演算は、オペランドが指数を持たないことを仮定し、したがって、整数ユニットの整数要素、例えば整数乗算器、整数加算器、整数比較器は、指数を扱う論理を含んでおらず、例えば、加算又は比較演算のために仮数をシフトして2進小数点を位置合わせすることをせず、乗算演算のために指数を加算することをしない。
【0185】
加えて、精度の低下なく大きな一続きの整数演算(例えば、1000回前後の積和)を累算する大きなハードウェア整数累算器を含む実施形態が、本明細書に記載される。それにより、NNUが浮動小数点数を扱うことを回避できるようになり、同時に、累算された値の最大精度を維持することができ、累算値を飽和させる必要がなく、又はオーバーフローが原因となって不正確な結果を招くことがない。一続きの整数演算が結果を最大精度の累算器に累算すると、固定小数点ハードウェア支援が、下記でより詳細に説明するように、ユーザによって指定された、累算値の小数ビット数の指示と、望まれる出力値中の小数ビット数とを使用して、必要なスケーリング及び飽和を行って最大精度の累算値を出力値に変換する。
【0186】
下記でより詳細に説明するように、好ましくは、活性化関数ユニットは、活性化関数への入力として使用するため又はパススルーのために、累算器値を最大精度の形式から圧縮するときに、選択的に累算器値に確率的丸めを行うことができる。最後、NPUは、ニューラルネットワークの所与の層の種々の必要性により指示されるとおり、異なる活性化関数を適用するように、且つ/又は各種の異なる形式の累算器値を出力するように、選択的に命令されることができる。
【0187】
次いで
図29Aを参照すると、
図1の制御レジスタ127の一実施形態を図示するブロック図が示される。制御レジスタ127は、複数の制御レジスタ127を含むことができる。制御レジスタ127は、示されるように、以下のフィールド、構成2902、符号付きデータ2912、符号付き重み2914、データ2進小数点2922、重み2進小数点2924、ALU関数2926、丸め制御2932、活性化関数2934、逆数2942、シフト量2944、出力RAM2952、出力の2進小数点2954、及び出力コマンド2956を含む。制御レジスタ127値は、MTNN命令1400と、開始命令などのNNUプログラムの命令との両方によって書き込まれる可能性がある。
【0188】
構成2902値は、上記のようにNNU121がナロー構成であるか、ワイド構成であるか、又はじょうご構成であるかを指定する。構成2902は、データRAM122及び重みRAM124から受け取られる入力ワードのサイズを示唆する。ナロー構成及びじょうご構成では、入力ワードのサイズはナローであり(例えば、8ビット又は9ビット)、対してワイド構成では、入力ワードのサイズはワイドである(例えば、12ビット又は16ビット)。さらに、構成2902は、入力ワードのサイズと同じである出力結果133のサイズを示唆する。
【0189】
符号付きデータ値2912は、真の場合は、データRAM122から受け取られるデータワードが符号付きの値であることを指示し、偽の場合は、符号なしの値であることを指示する。符号付きの重み値2914は、真の場合は、重みRAM124から受け取られる重みワードが符号付きの値であることを指示し、偽の場合は、符号なしの値であることを指示する。
【0190】
データ2進小数点2922の値は、データRAM122から受け取られるデータワードについて、2進小数点の場所を指示する。好ましくは、データ2進小数点2922値は、2進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、データ2進小数点2922は、データワードの最下位(least significant)ビットのうちいくつが小数ビットであるか、すなわち2進小数点の右側にあるかを指示する。同様に、重み2進小数点2924値は、重みRAM124から受け取られる重みワードについて、2進小数点の場所を指示する。好ましくは、ALU関数2926が積和又は累算器出力である場合、NPU126は、累算器202に保持されている値について、2進小数点の右側にあるビットの数を、データ2進小数点2922と重み2進小数点2924との和として判定する。したがって、例えば、データ2進小数点2922の値が5で、重み2進小数点2924の値が3である場合には、累算器202内の値は、2進小数点の右側に8ビットを有する。ALU関数2926が、累算器とデータワード/重みワードとの和/最大値、又はデータワード/重みワードのパススルーである場合、NPU126は、累算器202に保持されている値について、2進小数点の右側にあるビットの数を、それぞれデータ/重みの2進小数点2922/2924として判定する。下記で
図29Bに関連して説明する代替実施形態では、個々のデータ2進小数点2922及び重み2進小数点2924を指定するのではなく、単一の累算器2進小数点2923が指定される。
【0191】
ALU関数2926は、NPU126のALU204によって行われる関数を指定する。上記のように、ALU関数2926は、これらに限定されないが、データワード209と重みワード203とを乗算して積を累算器202と累算すること、累算器202と重みワード203とを足すこと、累算器202とデータワード209とを足すこと、累算器202とデータワード209とのうちの最大値、累算器202と重みワード203とのうちの最大値、累算器202を出力すること、データワード209をパススルーすること、重みワード203をパススルーすること、ゼロを出力すること、を含むことができる。一実施形態では、ALU関数2926は、NNU開始命令によって指定され、実行命令(図示せず)に応答してALU204によって使用される。一実施形態では、ALU関数2926は、上記の積和命令やmaxwacc命令などの個々のNNU命令によって指定される。
【0192】
丸め制御2932は、(
図30の)丸め器3004によって使用されるべき丸めの形式を指定する。一実施形態では、指定されることが可能な丸めモードは、これらに限定されないが、丸めなし、最近接丸め、及び確率的丸めを含む。好ましくは、プロセッサ100は、(
図30の)ランダムビットソース3003を含み、ランダムビットソース3003は、サンプリングされ、確率的丸めを行うのに使用されるランダムビット3005を生成して、丸めバイアスの可能性を低減する。一実施形態では、丸めビット3005が1で、スティッキービットがゼロの場合、NPU126は、サンプリングされたランダムビット3005が真であれば切り上げ、ランダムビット3005が偽であれば切り上げない。一実施形態では、ランダムビットソース3003は、半導体ダイオード又はレジスタ中の熱雑音など、プロセッサ100のランダムな電気的特性のサンプリングに基づいてランダムビット3005を生成するが、他の実施形態が企図される。
【0193】
活性化関数2934は、NPU126の出力133を生成するために累算器202の値217に適用される関数を指定する。上記で説明し、下記でより詳細に説明するように、活性化関数2934には、これらに限定されないが、シグモイド、ハイパーボリックタンジェント、ソフトプラス、正規化、指定された2の累乗による除算、有効な除算を達成するためのユーザ指定の逆数値による乗算、全累算器のパススルー、及び、下記で詳細に説明する基準サイズとしての累算器のパススルーが含まれる。一実施形態では、活性化関数は、NNU活性化関数命令によって指定される。或いは、活性化関数は、開始命令によって指定され、出力命令、例えば
図4のアドレス4にあるAFU出力書き出し命令に応答して適用され、そのような実施形態では、
図4のアドレス3の活性化関数命令は、出力命令に包含される。
【0194】
逆数2942値は、累算器202の値217の除算を達成するために、累算器202の値217で乗算される値を指定する。すなわち、ユーザは、実際の所望される除数の逆数として、逆数2942値を指定する。これは、例えば、本明細書に記載されるように畳み込み演算及びプーリング演算に関連して有用である。好ましくは、下記で
図29Cに関連してより詳細に説明するように、ユーザは、逆数2942値を2つの部分で指定する。一実施形態では、制御レジスタ127は、複数の組み込み除数値の1つによる除算をユーザが指定できるフィールド(図示せず)を含み、上記組み込み除数値は、一般に使用される畳み込みカーネルのサイズ、例えば9、25、36、又は49である。そのような実施形態では、AFU212は、累算器202の値217で乗算するために組み込み除数の逆数を記憶することができる。
【0195】
シフト量2944は、2の累乗による除算を達成するために、AFU212のシフタが累算器202の値217を右にシフトするビット数を指定する。このこともまた、サイズが2の累乗である畳み込みカーネルに関連して有用である可能性がある。
【0196】
出力RAM2952値は、データRAM122と重みRAM124のどちらが出力結果133を受け取るかを指定する。
【0197】
出力2進小数点2954値は、出力結果133について2進小数点の場所を指示する。好ましくは、出力2進小数点2954は、出力結果133の2進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、出力2進小数点2954は、出力結果133の最下位ビットのうちいくつが小数ビットであるか、すなわち2進小数点の右にあるかを指示する。AFU212は、出力2進小数点2954の値に基づいて(並びに、大半の場合は、データ2進小数点2922、重み2進小数点2924、活性化関数2934、及び/又は構成2902の値に基づいて)、丸め、圧縮、飽和、及びサイズコンバージョンを行う。
【0198】
出力コマンド2956は、出力結果133の諸面を制御する。一実施形態では、AFU212は、基準サイズの概念を用い、これは、構成2902で指定される幅のサイズ(ビット単位)の2倍である。したがって、例えば、構成2902が、データRAM122及び重みRAM124から受け取られる入力ワードのサイズが8ビットであると示唆する場合、基準サイズは16ビットである。別の例として、構成2902が、データRAM122及び重みRAM124から受け取られる入力ワードのサイズが16ビットであると示唆する場合、基準サイズは32ビットである。本明細書に記載されるように、中間計算、例えばそれぞれ1024回及び512回のNNU積和命令の最大精度を保つために、累算器202のサイズは大きい(例えば、ナロー累算器202Bは28ビットであり、ワイド累算器202Aは41ビットである)。その結果、累算器202の値217は、基準サイズよりも大きく(ビット単位で)、AFU212(例えば、下記で
図30に関連して説明するCCS3008)は、活性化関数2934の大半の値について(全累算器のパススルーを除く)、累算器202の値217を、基準サイズの値まで圧縮する。出力コマンド2956の第1の所定の値は、指定された活性化関数2934を行って、元の入力ワードと同じサイズ、すなわち基準サイズの半分である内部結果を生成し、その内部結果を出力結果133として出力するようにAFU212に命令する。出力コマンド2956の第2の所定の値は、指定された活性化関数2934を行って、元の入力ワードの2倍のサイズ、すなわち基準サイズである内部結果を生成し、その内部結果の下位半分を出力結果133として出力するようにAFU212に命令する。出力コマンド2956の第3の所定の値は、基準サイズの内部結果の上位半分を出力結果133として出力するようにAFU212に命令する。
図8〜
図10に関連して上記で説明したように、出力コマンド2956の第4の所定の値は、累算器202の未処理最下位ワード(その幅は構成2902で指定される)を出力結果133として出力するようにAFU212に命令し、第5の所定の値は、累算器202の未処理中位(middle-significant)ワードを出力結果133として出力するようにAFU212に命令し、第6の所定の値は、累算器202の未処理最上位(most-significant)ワードを出力結果133として出力するようにAFU212に命令する。上記のように、全累算器202のサイズ又は基準サイズの内部結果を出力することは、例えば、プロセッサ100の他の実行ユニット112がソフトマックス活性化関数などの活性化関数を行えるようにするために有利である可能性がある。
【0199】
図29A(及び
図29B及び
図29C)のフィールドは、制御レジスタ127に存在するものと記載されるが、他の実施形態では、それらのフィールドの1つ又は複数は、NNU121の他の部分に存在してもよい。好ましくは、フィールドの多くは、NNU命令自体に含められ、シーケンサ128によって復号されて、ALU204及び/又はAFU212を制御する(
図34の)マイクロ操作3416を生成する。加えて、フィールドは、ALU204及び/又はAFU212メディアレジスタ118を制御するメディアレジスタ118に記憶される(
図34の)マイクロ操作3414に含まれてもよい。そのような実施形態では、NNU初期化命令の使用が最小になり、他の実施形態では、NNU初期化命令が除去される。
【0200】
上記のように、NNU命令は、メモリオペランド(例えば、データRAM122及び/若しくは重みRAM124にあるワード)、又は循環されたオペランド(例えば、mux−reg208/705にあるもの)へのALU演算を実行するよう指定することができる。一実施形態では、NNU命令はさらに、オペランドを、活性化関数のレジスタからの出力として指定することができる(例えば、
図30のレジスタ3038の出力)。加えて、上記のように、NNU命令は、データRAM122又は重みRAM124の現在の行アドレスを増分するよう指定することができる。一実施形態では、NNU命令は、1以外の値による増分又は減分を達成するために現在の行に加算される即値符号付き整数差分値を指定することができる。
【0201】
次いで
図29Bを参照すると、代替的な一実施形態による、
図1の制御レジスタ127の実施形態を図示するブロック図が示される。
図29Bの制御レジスタ127は、
図29Aの制御レジスタ127に似ているが、
図29Bの制御レジスタ127は、累算器2進小数点2923を含んでいる。累算器2進小数点2923は、累算器202について2進小数点の場所を指示する。好ましくは、累算器2進小数点2923値は、2進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、累算器2進小数点2923は、累算器202の最下位ビットのうちいくつが小数ビットであるか、すなわち2進小数点の右であるかを指示する。この実施形態では、上記で
図29Aの実施形態に関連して説明したように、累算器2進小数点2923は、暗黙的に決定されるのではなく、明示的に指定される。
【0202】
次いで
図29Cを参照すると、一実施形態による、2つの部分として記憶される
図29Aの逆数2942の実施形態を図示するブロック図が示される。第1の部分2962は、ユーザが累算器202の値217で乗算することを望む真の逆数値の中の、抑制された先行ゼロの数2962を指示するシフト値である。先行ゼロの数は、2進小数点のすぐ右側にある連続したゼロの数である。第2の部分2694は、先行ゼロを抑制された逆数2964値、すなわち、すべての先行ゼロが除去された真の逆数値である。一実施形態では、抑制された先行ゼロの数2962は4ビットとして記憶され、先行ゼロを抑制された逆数2964値は、8ビットの符号なしの値として記憶される。
【0203】
例による説明として、ユーザが、累算器202の値217を49の逆数で乗算したいと仮定する。13個の小数ビットで表された49の逆数の2進表現は、0.0000010100111であり、5個の先行ゼロがある。この場合、ユーザは、抑制された先行ゼロの数2962に5の値を入れ、先行ゼロを抑制された逆数2964に10100111の値を入れる。逆数乗算器の「除算器A」3014(
図30の)が、累算器202の値217と、先行ゼロを抑制された逆数2964の値とを乗算した後、除算器Aは、得られた積を、抑制された先行ゼロの数2962だけ右シフトする。そのような実施形態は、有利に、逆数2942値を表すために使用されるビット数を比較的少なくして、高い精度を達成することができる。
【0204】
次いで
図30を参照すると、
図2のAFU212の実施形態をより詳細に図示するブロック図が示される。AFU212は、
図1の制御レジスタ127;累算器202の値217を受け取る正形式変換器(positive form converter:PFC)及び出力2進小数点位置合わせ器(output binary point aligner:OBPA)3002;累算器202の値217とOBPA3002によって外へシフトされたビット数の指示とを受け取る丸め器3004;上記のようにランダムビット3005を生成するランダムビットソース3003;PFC及びOBPA3002の出力と丸め器3004の出力とを受け取る第1のmux3006;第1のmux3006の出力を受け取る、基準サイズへの圧縮器(compressor to canonical size:CCS)及び飽和器3008;CCS及び飽和器3008の出力を受け取る、ビット選択器及び飽和器3012;CCS及び飽和器3008の出力を受け取る正規化器(rectifier)3018;CCS及び飽和器3008の出力を受け取る逆数乗算器3014;CCS及び飽和器3008の出力を受け取る右シフタ3016;ビット選択器及び飽和器3012の出力を受け取るハイパーボリックタンジェント(tanh)モジュール3022;ビット選択器及び飽和器3012の出力を受け取るシグモイドモジュール3024;ビット選択器及び飽和器3012の出力を受け取るソフトプラスモジュール3026;tanhモジュール3022、シグモイドモジュール3024、ソフトプラスモジュール3026、正規化器3108、逆数乗算器3014、及び右シフタ3016の出力と、CCS及び飽和器3008のパススルーされた基準サイズ出力3028と、を受け取る第2のmux3032;第2のmux3032の出力を受け取る符号復元器3034;符号復元器3034の出力を受け取る、サイズ変換器及び飽和器3036;サイズ変換器及び飽和器3036の出力と累算器の出力217とを受け取る第3のmux3037;並びに、mux3037の出力を受け取り、出力が
図1の結果133である出力レジスタ3038、を含む。
【0205】
PFC及びOBPA3002は、累算器202の値217を受け取る。好ましくは、累算器202の値217は、上記のように最大精度値である。すなわち、累算器202は、整数乗算器242によって生成された一連の積の、整数加算器244によって生成される和である累算値を保持するのに十分なビット数の記憶を有し、乗算器242の個々の積又は加算器244の和のビットのうちいずれも破棄することがなく、よって精度の低下がない。好ましくは、累算器202は、少なくとも、NNU121が行うようにプログラムされることが可能な最大数の積の累算を保持するのに十分なビット数を有する。例えば、
図4のプログラムを参照して説明すると、ワイド構成のときにNNU121が行うようにプログラム可能な積の累算の最大数は512であり、累算器202のビット幅は41である。別の例として、
図20のプログラムを参照して説明すると、ナロー構成のときにNNU121が行うようにプログラム可能な積累算の最大数は1024であり、累算器202のビット幅は28である。一般化すると、最大精度の累算器202は少なくともQビットを含み、Qは、Mとlog
2Pとの和であり、Mは、乗算器242の整数積のビット幅であり(例えば、ナロー乗算器242では16ビット、又はワイド乗算器242では32ビット)、Pは、累算器202中に累算されることが可能な整数積の最大許容数である。好ましくは、積累算の最大数は、NNU121のプログラマへのプログラミングの仕様を介して指定される。一実施形態では、シーケンサ128は、データワード/重みワード206/207の行をデータRAM/重みRAM122/124からロードする、1つの前の積和命令(例えば、
図4のアドレス1にある命令)を仮定して、積和NNU命令(例えば、
図4のアドレス2にある命令)のカウントの最大値、例えば511を強制する。
【0206】
有利な点として、許容される累算の最大数に対して最大精度値を累算するのに十分に大きいビット幅を持つ累算器202を含めることにより、NPU126のALU204部分の設計が簡略化される。詳細には、それにより、整数加算器244によって生成される和を飽和させる論理の必要性が緩和され、上記生成される和は、より小さい累算器であればオーバーフローを生じさせる可能性があり、また、累算器の2進小数点の場所を追跡して、オーバーフローが発生したかどうかを決定して、飽和が必要であったかを知ることを必要とする可能性がある。非最大精度の累算器を含んでいたが、代わりに非最大精度の累算器のオーバーフローに対処する飽和論理を含んでいる設計の問題を、例として説明するために、以下を仮定する。
(1)データワード値の範囲は0と1の間であり、すべての記憶ビットを使用して小数ビットを記憶する。重みワードの範囲は−8と+8の間であり、記憶ビットのうち3ビットを除くすべてのビットを使用して小数ビットを記憶する。そして、ハイパーボリックタンジェント活性化関数に入力するための累算値の範囲は−8と+8の間であり、記憶ビットのうち3ビットを除くすべてのビットを使用して小数ビットを記憶する。
(2)累算器のビット幅は、非最大精度である(例えば、積のビット幅のみ)。
(3)累算器が最大精度であったと仮定すると、最終的な累算値は、−8と+8の間のいずれかの値(例えば、+4.2)になるが、列中の「点A」よりも前の積は、より高頻度に正になる傾向があり、対して点Aより後の積はより高頻度に負になる傾向がある。
このような状況では、不正確な結果(すなわち+4.2以外の結果)が得られる可能性がある。その理由は、点Aより前のいずれかの点で、累算器が、例えば+8.2のようなより大きな値でなければならないときに最大の+8の値に飽和される可能性があり、それにより、残りの+0.2の損失を引き起こす可能性があるためである。累算器は、より多くの積の累算について飽和値のままになる可能性すらあり、その結果、さらに多くの正の値が失われる可能性がある。そのため、累算器の最終値は、累算器が最大精度のビット幅を持っていた場合になるはずよりも小さな数(すなわち、+4.2未満)になる可能性がある。
【0207】
PFC3002は、累算器202の値217が負である場合には、値を正形式に変換し、元の値が正であったか又は負であったかを指示する付加ビットを生成し、そのビットは、値と共にAFU212のパイプラインで渡される。正形式に変換することで、AFU212による後の動作を簡略化する。例えば、それにより、正の値だけがtanh3022及びシグモイド3024モジュールに入力されることが可能になり、したがって、それらのモジュールを簡略化することができる。加えて、このことは、丸め器3004及び飽和器3008を簡略化する。
【0208】
OBPA3002は、正形式の値を右にシフト又はスケーリングして、制御レジスタ127中で指定される出力2進小数点2954と位置合わせする。好ましくは、OBPA3002は、出力の小数ビットの数(例えば、出力2進小数点2954によって指定される)を、累算器202の値217の小数ビットの数(例えば、累算器2進小数点2923によって指定されるか、又はデータ2進小数点2922と重み2進小数点2924との和)から引いた差として、シフト量を算出する。したがって、例えば、累算器202の2進小数点2923が8で(上記の例のように)、出力の2進小数点2954が3である場合には、OBPA3002は、正形式の値を右に5ビットシフトして、mux3006及び丸め器3004に提供される結果を生成する。
【0209】
丸め器3004は、累算器202の値217を丸める。好ましくは、丸め器3004は、PFC及びOBPA3002によって生成された正形式の値を丸めたバージョンを生成し、その丸められたバージョンをmux3006に提供する。丸め器3004は、上記の丸め制御2932に従って丸めを行い、この丸めは、上記及び下記で説明するように、ランダムビット3005を使用した確率的丸めを含むことができる。mux3006は、丸め制御2932(本明細書に記載されるように確率的丸めを含み得る)に基づいて、自身の入力のうち1つ、すなわち、PFC及びOBPA3002からの正形式の値か、又は丸め器3004からのその値の丸められたバージョンかのどちらかを選択し、選択した値をCCS及び飽和器3008に提供する。好ましくは、丸め制御2932が丸めなしを指定する場合、mux3006は、PFC及びOBPA3002の出力を選択し、それ以外の場合、丸め器3004の出力を選択する。AFU212が追加的な丸めを行う他の実施形態が企図される。例えば、一実施形態では、ビット選択器3012が、CCS及び飽和器3008の出力のビットを圧縮するときに、失われた低次ビットに基づいて丸めを行う(下記で説明する)。別の例として、一実施形態では、逆数乗算器3014(下記で説明する)の積が丸められる。さらに別の例として、一実施形態では、サイズ変換器3036が、適正な出力サイズに変換するときに丸めを行い(下記で説明する)、これは、丸めの決定で使用された低次ビットを失うことを伴う場合もある。
【0210】
CCS3008は、mux3006の出力値を基準サイズに圧縮する。したがって、例えば、NPU126がナロー構成又はじょうご構成2902である場合、CCS3008は、28ビットのmux3006の出力値を16ビットに圧縮し、NPU126がワイド構成2902である場合、CCS3008は、41ビットのmux3006の出力値を32ビットに圧縮する。ただし、基準サイズに圧縮する前に、事前に圧縮された値が、基準形式で表すことが可能な最大値よりも大きい場合、飽和器3008が、事前に圧縮された値を飽和させて、基準形式で表すことが可能な最大値にする。例えば、最上位の基準形式ビットの左側にある事前に圧縮された値のビットのいずれかが1の値を有する場合には、飽和器3008は、最大値に(例えば、すべて1に)飽和させる。
【0211】
好ましくは、tanh3022、シグモイド3024、及びソフトプラス3026モジュールは、参照表、例えば、プログラム可能ロジックアレイ(PLA)、読み出し専用メモリ(ROM)、組み合わせ論理ゲートなどを備える。一実施形態では、モジュール3022/3024/3026を簡略化してサイズを減らすために、それらには、3.4の形式、すなわち3つの整数ビットと4つの小数ビットを持つ入力値が提供され、すなわち、入力値は、2進小数点の右側に4ビット、及び2進小数点の左側に3ビットを有する。それらの値が選択される理由は、3.4形式の入力値範囲(−8、+8)の極値では、出力値が、その最小値/最大値に漸近的に近づくためである。ただし、2進小数点を異なる場所に置く、例えば4.3形式又は2.5形式の他の実施形態が企図される。ビット選択器3012は、3.4形式の基準を満たすCCS及び飽和器3008の出力のビットを選択し、このことは圧縮を含み、すなわち一部のビットが失われる。これは、基準形式の方がビット数が多いためである。ただし、CCS及び飽和器3008の出力値を選択/圧縮する前に、事前に圧縮された値が3.4形式で表すことが可能な最大値よりも大きい場合、飽和器3012が、事前に圧縮された値を、3.4形式で表すことが可能な最大値に飽和させる。例えば、3.4形式の最上位ビットの左側にある事前に圧縮された値のビットのいずれかが1の値を有する場合、飽和器3012は、最大値に(例えば、すべて1に)飽和させる。
【0212】
tanh3022、シグモイド3024、及びソフトプラス3026モジュールは、各自の活性化関数(上記で説明した)を、CCS及び飽和器3008から出力された3.4形式の値に行って、結果を生成する。好ましくは、tanh3022及びシグモイド3024モジュールの結果は、0.7形式の7ビットの結果であり、すなわち、ゼロ個の整数ビット及び7つの小数ビットがあり、すなわち、入力値は2進小数点の右側に7ビットを有する。好ましくは、ソフトプラスモジュール3026の結果は、3.4形式の7ビットの結果であり、例えば、モジュール3026への入力と同じ形式である。好ましくは、tanh3022、シグモイド3024、及びソフトプラス3026モジュールの出力は、基準形式に合わせて拡張され(例えば、必要に応じて先行ゼロが追加され)、出力2進小数点2954の値によって指定される2進小数点を持つように位置合わせされる。
【0213】
正規化器3018は、CCS及び飽和器3008の出力値の正規化バージョンを生成する。すなわち、CCS及び飽和器3008の出力値(その符号は上記のようにして渡される)が負である場合、正規化器3018はゼロの値を出力し、それ以外の場合、正規化器3018は自身の入力値を出力する。好ましくは、正規化器3018の出力は、基準形式であり、出力2進小数点2954値によって指定される2進小数点を有する。
【0214】
逆数乗算器3014は、CCS及び飽和器3008の出力に、逆数値2942で指定されるユーザ指定の逆数値を乗算して基準サイズの積を生成し、これは、効果的に、CCS及び飽和器3008の出力と、逆数2942値の逆数である除数との商である。好ましくは、逆数乗算器3014の出力は、基準形式であり、出力2進小数点2954値によって指定される2進小数点を有する。
【0215】
右シフタ3016は、CCS及び飽和器3008の出力を、シフト量の値2944で指定される、ユーザ指定のビット数だけシフトして、基準サイズの商を生成する。好ましくは、右シフタ3016の出力は、基準形式であり、出力2進小数点2954値によって指定される2進小数点を有する。
【0216】
mux3032は、活性化関数2934値によって指定される適切な入力を選択し、選択したものを符号復元器3034に提供し、符号復元器3034は、元の累算器202の値217が負値であった場合、mux3032の正形式の出力を負形式に、例えば2の補数の形式に変換する。
【0217】
サイズ変換器3036は、出力コマンド2956の値に基づいて、符号復元器3034の出力を適切なサイズに変換する。出力コマンド2956の値については、上記で
図29Aに関連して説明している。好ましくは、符号復元器3034の出力は、出力2進小数点2954値によって指定される2進小数点を有する。好ましくは、出力コマンド2956の第1の所定の値について、サイズ変換器3036は、符号復元器3034の出力の上位半分のビットを破棄する。さらに、符号復元器3034の出力が正で、且つ構成2902で指定されるワードサイズで表すことが可能な最大値を超えているか、又は、負で、且つそのワードサイズで表すことが可能な最小値未満である場合、飽和器3036は、出力を、当該ワードサイズで表すことが可能なそれぞれの最大値又は最小値に飽和させる。第2及び第3の所定の値の場合、サイズ変換器3036は、符号復元器3034の出力をパススルーする。
【0218】
mux3037は、出力コマンド2956に基づいて、サイズ変換器及び飽和器3036の出力か、又は累算器202の出力217かのどちらかを、出力レジスタ3038に提供するために選択する。より具体的には、出力コマンド2956の第1及び第2の所定の値について、mux3037は、サイズ変換器及び飽和器3036の出力の下位ワード(そのサイズは構成2902によって指定される)を選択する。第3の所定の値について、mux3037は、サイズ変換器及び飽和器3036の出力の上位ワードを選択する。第4の所定の値について、mux3037は、未処理の累算器202の値217の下位ワードを選択し、第5の所定の値について、mux3037は、未処理の累算器202の値217の中位ワードを選択し、第6の所定の値について、mux3037は、未処理の累算器202の値217の上位ワードを選択する。上記のように、好ましくは、AFU212は、未処理の累算器202の値217の上位ワードの上位ビットをパディングしてゼロにする。
【0219】
次いで
図31を参照すると、
図30のAFU212の動作の例が示される。示されるように、構成2902は、NPU126のナロー構成に設定されている。加えて、符号付きデータ2912及び符号付き重み2914値は真である。加えて、データ2進小数点2922値は、データRAM122ワードの2進小数点が、2進小数点の右に7ビットがあるように配置されることを指示し、NPU126の1つによって受け取られた第1のデータワードの例示的な値が、0.1001110と示されている。さらには、重み2進小数点2924値は、重みRAM124のワードの2進小数点が、2進小数点の右に3ビットがあるように配置されることを指示し、NPU126の1つによって受け取られた第1のデータワードの例示的な値が、00001.010と示されている。
【0220】
第1のデータワードと重みワードとの16ビットの積(累算器202の初期ゼロ値と共に累算されている)は、000000.1100001100と示されている。データ2進小数点2912が7であり、重み2進小数点2914が3であるため、示唆される累算器202の2進小数点は、2進小数点の右に10ビットがあるように配置される。ナロー構成の場合、累算器202は、この例示的実施形態では、28ビット幅である。この例では、すべてのALU演算(例えば、
図20の1024回の積和すべて)が行われた後の累算器202の000000000000000001.1101010100という値217が示されている。
【0221】
出力2進小数点2954値は、出力の2進小数点が、2進小数点の右に7ビットがあるように配置されることを指示している。したがって、OBPA3002及びCCS3008を通過した後に、累算器202の値217は、スケーリングされ、丸められ、及び圧縮されて、000000001.1101011の基準形式値にされる。この例では、出力2進小数点の場所は7つの小数ビットを指示し、累算器202の2進小数点の場所は10個の小数ビットを指示する。したがって、OBPA3002は、3の差を算出し、累算器202の値217を、右に3ビットシフトすることによってスケーリングする。これは、
図31では、累算器202の値217の最下位3ビット(2進の100)が失われることによって示されている。さらにこの例では、丸め制御2932値は、確率的丸めを使用することを指示しており、この例では、サンプリングされたランダムビット3005が真であると仮定される。その結果最下位ビットが切り上げられたが、これは、上記の説明によれば、累算器202の値217の丸めビット(累算器202の値217のスケーリングによってシフトされて消えた3ビットの最上位ビット)が1であり、スティッキービット(累算器202の値217のスケーリングによってシフトされて消えた3ビットのうち最下位2ビットのブールOR)がゼロであったためである。
【0222】
活性化関数2934は、この例ではシグモイド関数の使用を指示している。その結果、ビット選択器3012は、基準形式値のビットを選択し、そのため、上記のようにシグモイドモジュール3024への入力が3つの整数ビット及び4つの小数ビットを持つようになり、すなわち、示されるように001.1101の値となる。シグモイドモジュール3024は、示されるように、000000000.1101110の基準形式にされた値を出力する。
【0223】
この例における出力コマンド2956は、第1の所定の値を指定し、すなわち構成2902によって指示されるワードサイズを出力することを指定し、この場合のワードサイズはナローワード(8ビット)である。その結果、サイズ変換器3036は、基準シグモイド出力値を、2進小数点の右側に7ビットがあるように配置された、示唆される2進小数点を持つ8ビット量に変換して、示されるように01101110の出力をもたらす。
【0224】
次いで
図32を参照すると、
図30のAFU212の動作の第2の例が示される。
図32の例は、活性化関数2934が累算器202の値217を基準サイズでパススルーすることを指示する場合のAFU212の動作を図示している。示されるように、構成2902は、NPU126のナロー構成に設定されている。
【0225】
この例では、累算器202は28ビット幅であり、累算器202の2進小数点は、2進小数点の右側に10ビットがあるように配置される(この理由は、上記のように、一実施形態によれば、データ2進小数点2912と重み2進小数点2914との和が10であるためか、又は、代替実施形態によれば、累算器の2進小数点2923が10の値を持つように明示的に指定されるためか、のどちらかである)。この例では、
図32は、すべてのALU演算が行われた後の累算器202の000001100000011011.1101111010という値217を示している。
【0226】
この例では、出力2進小数点2954値は、出力の2進小数点が、2進小数点の右側に4ビットがあるように配置されることを指示している。したがって、OBPA3002及びCCS3008を通過した後、示されるように、累算器202の値217が飽和及び圧縮されて111111111111.1111の基準形式値にされ、これが、mux3032によって基準サイズのパススルー値3028として受け取られる。
【0227】
この例では、2つの出力コマンド2956が示されている。第1の出力コマンド2956は、第2の所定の値を指定し、すなわち基準形式サイズの下位ワードを出力することを指定している。構成2902によって指示されるサイズはナローワード(8ビット)であり、これは16ビットの基準サイズを示唆することから、サイズ変換器3036は、示されるように、基準サイズのパススルー値3028の下位8ビットを選択して、11111111の8ビット値を生じる。第2の出力コマンド2956は、第3の所定の値を指定し、すなわち基準形式サイズの上位ワードを出力することを指定している。その結果、サイズ変換器3036は、示されるように、基準サイズのパススルー値3028の上位8ビットを選択して、11111111の8ビット値を生じる。
【0228】
次いで
図33を参照すると、
図30のAFU212の動作の第3の例が示される。
図33の例は、活性化関数2934が、未処理の累算器202の値217をすべてパススルーすることを指示する場合のAFU212の動作を図示している。示されるように、構成2902は、NPU126のワイド構成(例えば、16ビットの入力ワード)に設定されている。
【0229】
この例では、累算器202は41ビット幅であり、累算器202の2進小数点は、2進小数点の右に8ビットがあるように配置されている(この理由は、上記のように、一実施形態によれば、データ2進小数点2912と重み2進小数点2914との和が8であるためか、又は代替実施形態によれば、累算器の2進小数点2923が8の値を持つように明示的に指定されるためか、のどちらかである)。この例では、
図33は、すべてのALU演算が行われた後の累算器202の001000000000000000001100000011011.11011110という値217を示している。
【0230】
この例では、3つの出力コマンド2956が示されている。第1の出力コマンド2956は、第4の所定の値を指定し、すなわち未処理累算器202値の下位ワードを出力することを指定し、第2の出力コマンド2956は、第5の所定の値を指定し、すなわち未処理累算器202値の中位ワードを出力することを指定し、第3の出力コマンド2956は、第6の所定の値を指定し、すなわち未処理累算器202値の上位ワードを出力することを指定している。構成2902で指示されるサイズがワイドワード(16ビット)であるため、
図33は、第1の出力コマンド2956に応答して、mux3037が0001101111011110の16ビット値を選択し、第2の出力コマンド2956に応答して、mux3037が0000000000011000の16ビット値を選択し、第3の出力コマンド2956に応答して、mux3037が、0000000001000000の16ビット値を選択することを示している。
【0231】
上述のように、有利な点として、NNU121は、浮動小数点データではなく、整数データに演算する。これには、各NPU126、又は少なくともALU204部分を簡略化するという利点がある。例えば、ALU204は、浮動小数点実装であれば乗算器242について被乗数の指数を加算するために必要とされるであろう加算器を、含む必要がない。同様に、ALU204は、浮動小数点実装であれば加算器234について加数の2進小数点を位置合わせするために必要とされるであろうシフタを、含む必要がない。当業者が理解するように、浮動小数点ユニットは一般に非常に複雑である。そのため、上記はALU204の簡略化の例に過ぎず、関連する2進小数点をユーザが指定できるようにするハードウェアの固定小数点支援を用いるこの整数実施形態によって、他の簡略化が享受される。ALU204が整数ユニットであることの結果、有利な点として、浮動小数点の実施形態に比べてNPU126がより小さく(且つより高速に)なる可能性があり、それにより、さらに、有利な点として、NPU126の大きなアレイをNNU121に組み込むことが容易になる。AFU212部分は、好ましくは、累算値中で望まれるユーザ指定の小数ビットの数と、出力値中で望まれる小数ビットの数とに基づいて、累算器202の値217のスケーリング及び飽和を扱う。有利な点として、AFU212の固定小数点ハードウェア支援の追加的な複雑性と、それに伴うサイズ、電力消費、及び/又は時間の増大は、生じた場合には、例えば
図11の実施形態に関連して説明するように、AFU212をALU204部分間で共有することによって償却される可能性がある。これは、AFU1112の数は、共有実施形態では減らすことができるためである。
【0232】
有利な点として、本明細書に記載される実施形態は、浮動小数点の算術ユニットと比べて、ハードウェアの整数算術ユニットの複雑性が低減することに伴う利益の多くを享受することができ、一方で、小数、すなわち2進小数点を持つ数に対する算術演算を依然として提供する。浮動小数点算術の利点は、個々の値が非常に広い値の範囲(効果的に、非常に大きい可能性のある指数範囲のサイズによってのみ制限される)内のいずれかの値であり得るデータへの算術演算に対応できることである。すなわち、各浮動小数点数は、その独自の、可能性として固有の指数値を有する。ただし、本明細書に記載される実施形態は、入力データが高度に並列化されており、それらの値が比較的狭い範囲内にあって、すべての並列化された値の「指数」が同じである場合がある特定の応用例が存在する、という事実を認識し、活用する。したがって、そのような実施形態は、ユーザが、すべての入力値及び/又は累算値に対して2進小数点の場所を一回指定することを可能にする。同様に、そのような実施形態は、並列化された出力の類似する範囲特性を認識及び活用して、ユーザが、すべての出力値に対して2進小数点の場所を一回指定することを可能にする。人工ニューラルネットワークはそのような応用例の一例であるが、それらの実施形態を用いて他の応用例のための計算を行うことができる。個々の各入力数に対してではなく、入力に対して2進小数点の場所を一回指定することにより、それらの実施形態は、浮動小数点実装と比べてメモリ空間のより効率的な使用をもたらし(例えば、必要とするメモリの減少)、且つ/又は、ほぼ同じ量のメモリに対して精度の向上をもたらす。これは、浮動小数点実装であれば指数に使用されることになるビットが、より高い大きさの精度を指定するために使用できるためである。
【0233】
さらに有利な点として、上記実施形態は、整数演算の大きな連続の累算中に経験し得る潜在的な精度の低下(例えば、より低い有意性(significance)の小数ビットのオーバーフロー又は損失)を認識し、主として、精度の低下を回避するのに十分に大きい累算器の形で解決法を提供する。
【0234】
NNUマイクロ操作の直接実行
次いで
図34を参照すると、
図1のプロセッサ100、及び
図1のNNU121のより詳細な部分を図示するブロック図が示される。NNU121は、NPU126のパイプラインステージ3401を含んでいる。パイプラインステージ3401は、ステージングレジスタによって分離され、ブール論理ゲート、多重化器、加算器、乗算器、比較器など、本明細書に記載されるNPU126の演算を達成する組み合わせ論理を含んでいる。パイプラインステージ3401は、mux3402からマイクロ操作3418を受け取る。マイクロ操作3418は、パイプラインステージ3401を流れて行き、それらステージの組み合わせ論理を制御する。マイクロ操作3418は、ビットの集まりである。好ましくは、マイクロ操作3418は、例えば、とりわけ、データRAM122のメモリアドレス123、重みRAM124のメモリアドレス125、プログラムメモリ129のメモリアドレス131、mux−reg208/705の制御信号213/713、mux802の制御信号803、及び制御レジスタ127のフィールドのうち(例えば、
図29A〜
図29Cのうち)多く、のビットを含む。一実施形態では、マイクロ操作3418は約120ビットからなる。mux3402は、3つの異なるソースからマイクロ操作を受け取り、これらのうち1つを、パイプラインステージ3401に提供するためのマイクロ操作3418として選択する。
【0235】
mux3402へのマイクロ操作ソースの1つは、
図1のシーケンサ128である。シーケンサ128は、プログラムメモリ129から受け取られたNNU命令を復号し、それに応答して、mux3402の第1の入力に提供されるマイクロ操作3416を生成する。
【0236】
mux3402への第2のマイクロ操作ソースは、
図1のリザベーションステーション108からのマイクロ命令105を、GPR116及びメディアレジスタ118からのオペランドと共に受け取る復号器3404である。好ましくは、マイクロ命令105は、上記のように、MTNN命令1400及びMFNN命令1500を翻訳するのに応答して、命令トランスレータ104によって生成される。マイクロ命令105は、即値フィールドを含むことができ、このフィールドは、特定の関数(MTNN命令1400又はMFNN命令1500によって指定された関数)を指定し、この特定の関数は、上記のように、プログラムメモリ129内のプログラムの実行を開始及び停止すること、メディアレジスタ118からマイクロ操作を直接実行すること、又はNNU121のメモリの読み出し/書き込みなどである。復号器3404は、マイクロ命令105を復号し、それに応答して、mux3402の第2の入力に提供されるマイクロ操作3412を生成する。好ましくは、MTNN/MFNN1400/1500命令のいくつかの関数1432/1532に応答して、復号器3404は、パイプライン3401に送り出すマイクロ操作3412を生成する必要がなく、例えば、制御レジスタ127への書き込み、プログラムメモリ129にあるプログラムの実行の開始、プログラムメモリ129にあるプログラムの実行の一時停止、プログラムメモリ129内のプログラムの実行の完了の待機、状態レジスタ127からの読み出し、及び、NNU121のリセットである。
【0237】
mux3402への第3のマイクロ操作ソースは、メディアレジスタ118自体である。好ましくは、上記で
図14に関連して説明したように、MTNN命令1400は、メディアレジスタ118からmux3402の第3の入力に提供されるマイクロ操作3414を直接実行するようにNNU121に命令する関数を指定することができる。アーキテクチャメディアレジスタ118から提供されるマイクロ操作3414の直接の実行は、検査、例えばNNU121の組み込み自己テスト(BIST)やデバッグに特に有用である可能性がある。
【0238】
好ましくは、復号器3404は、mux3402の選択を制御するモードインディケータ3422を生成する。MTNN命令1400が、プログラムメモリ129からのプログラムの稼働を開始する関数を指定するとき、復号器3404は、エラーが発生するまで、又は、復号器3404が、プログラムメモリ129からのプログラムの実行を停止する関数を指定するMTNN命令1400に遭遇するまで、mux3402にシーケンサ128からのマイクロ操作3416を選択させるモードインディケータ3422値を生成する。MTNN命令1400が、メディアレジスタ118から提供されるマイクロ操作3414を直接実行するようにNNU121に命令する関数を指定するとき、復号器3404は、mux3402に、指定されたメディアレジスタ118からのマイクロ操作3414を選択させるモードインディケータ3422値を生成する。それ以外の場合、復号器3404は、mux3402に復号器3404からのマイクロ操作3412を選択させるモードインディケータ3422値を生成する。
【0239】
可変レートのニューラルネットワークユニット
NNU121がプログラムを稼働させ、その後、次のプログラムを稼働できるようになる前、NNU121が必要とする何らかのことをプロセッサ100が行うのを待って、アイドル状態になる状況があり得る。例えば、
図3〜
図6Aに関連して記載した状況と似た、NNU121が、積和活性化関数プログラム(フィードフォワードニューラルネットワーク層プログラムと呼ばれる場合もある)の2つ以上の連続したインスタンスを稼働させる状況を仮定する。プロセッサ100が、NNUプログラムの次の稼働で使用されることになる512KB分の重み値を重みRAM124に書き込むには、NNU121がそのプログラムを稼働させるためにかかる時間よりも、大幅に長い時間がかかる可能性がある。別の表現をすると、NNU121はプログラムを比較的短い時間量で稼働させ、その後、プロセッサ100がそのプログラムの次の稼働のために次の重み値を重みRAM124に書き込み終える間、アイドル状態になる可能性がある。この状況を
図36Aに視覚的に図示しており、これについては下記でより詳細に説明する。そのような状況では、NNU121をより遅いレートで稼働させ、より長い時間をかけてプログラムを実行し、それにより、NNU121がプログラムを稼働させるために必要とされるエネルギー消費をより長い時間にわたって分散させると有利である可能性があり、そのようにすると、一般に、NNU121及び恐らくはプロセッサ100の温度をより低く保つ傾向がある可能性がある。この状況を緩和モードと呼び、
図36Bに視覚的に図示している。これについては下記でより詳細に説明する。
【0240】
次いで
図35を参照すると、可変レートのNNU121を含むプロセッサ100を図示するブロック図が示される。プロセッサ100は、
図1のプロセッサ100と多くの点で似ており、同様の参照符号を付した要素は類似する。
図35のプロセッサ100は、クロック生成論理3502をさらに含み、これは、プロセッサ100の機能ユニット、すなわち、命令取出しユニット101、命令キャッシュ102、命令トランスレータ104、リネームユニット106、リザベーションステーション108、NNU121、その他の実行ユニット112、メモリサブシステム114、汎用レジスタ116、及びメディアレジスタ118に結合されている。クロック生成論理3502は、基本クロック(primary clock)レート又はクロック周波数を有するクロック信号を生成する、位相ロックループ(PLL)などのクロック生成器を含む。例えば、基本クロックレートは、1GHz、1.5GHz、2GHzなどであり得る。クロックレートは、1秒当たりのクロック信号のサイクル数、例えばハイ状態とロー状態との間の振動数を指示する。好ましくは、クロック信号は、均衡のとれたデューティサイクルを有する、すなわちサイクルの半分がハイでサイクルのもう半分がローであるか、或いは、クロック信号は、クロック信号がロー状態よりも長くハイ状態にあるか又はその逆である不均衡なデューティサイクルを有する。好ましくは、PLLは、複数のクロックレートで基本クロック信号を生成するように構成可能である。好ましくは、プロセッサ100は、各種の要因に基づいて自動的に基本クロックレートを調節する電力管理モジュールを含み、そのような要因には、動的に検出されるプロセッサ100の動作温度、利用率、並びに、要求される性能及び/又は電力節減指標を指示するシステムソフトウェア(例えば、オペレーティングシステム、BIOS)からのコマンドが含まれる。一実施形態では、電力管理モジュールは、プロセッサ100のマイクロコードを含む。
【0241】
クロック生成論理3502は、クロック分配ネットワーク、又はクロックツリーをさらに含む。クロックツリーは、基本クロック信号をプロセッサ100の機能ユニットに分配し(distributes)、これは
図35では、命令取出しユニット101へのクロック信号3506−1、命令キャッシュ102へのクロック信号3506−2、命令トランスレータ104へのクロック信号3506−10、リネームユニット106へのクロック信号3506−9、リザベーションステーション108へのクロック信号3506−8、NNU121へのクロック信号3506−7、他の実行ユニット112へのクロック信号3506−4、メモリサブシステム114へのクロック信号3506−3、汎用レジスタ116へのクロック信号3506−5、及び、メディアレジスタ118へのクロック信号3506−6として示され、これらを集合的にクロック信号3506と呼ぶ。クロックツリーは、基本クロック信号3506をそれぞれの機能ユニットに送信するノード、又は配線を含んでいる。加えて、好ましくは、クロック生成論理3502は、クロックバッファを含み、これは、特に長いノードの場合に、必要に応じて基本クロック信号を再生成してよりクリーンなクロック信号を提供する、且つ/又は基本クロック信号の電圧レベルを昇圧する。加えて、各機能ユニットが、必要に応じて、各々が受け取るそれぞれの基本クロック信号3506を再生成及び/又は昇圧する、独自の部分クロックツリーをさらに含むことが可能である。
【0242】
NNU121は、クロック低減論理3504を含み、クロック低減論理3504は、緩和インディケータ3512を受け取り、基本クロック信号3506−7を受け取り、それに応答して副クロック(secondary clock)信号を生成する。副クロック信号は、基本クロックレートと同じクロックレートであるクロックレートを有するか、又は、緩和モード時には、基本クロックレートに対して、緩和インディケータ3512中にプログラムされた量だけ低減させたクロックレートを有し、これは熱に関する利益をもたらす可能性がある。クロック低減論理3504は、副クロック信号をNNU121の様々なブロックに分配するクロック分配ネットワーク、又はクロックツリーを含んでいる点で、多くの点でクロック生成論理3502に似ており、この副クロック信号は、NPU126のアレイへのクロック信号3508−1、シーケンサ128へのクロック信号3508−2、及びインターフェース論理3514へのクロック信号3508−3として示されており、これらを集合的に又は個々に、副クロック信号3508と呼ぶ。好ましくは、NPU126は、
図34に関連して説明するように複数のパイプラインステージ3401を含み、これは、クロック低減論理3504から副クロック信号3508−1を受け取るパイプラインステージングレジスタを含んでいる。
【0243】
NNU121は、基本クロック信号3506−7及び副クロック信号3508−3を受け取るインターフェース論理3514をさらに含んでいる。インターフェース論理3514は、プロセッサ100のフロントエンドの下方部分(例えば、リザベーションステーション108、メディアレジスタ118、及び汎用レジスタ116)と、NNU121の様々なブロック、すなわち、クロック低減論理3504、データRAM122、重みRAM124、プログラムメモリ129、及びシーケンサ128との間に結合される。インターフェース論理3514は、データRAMバッファ3522、重みRAMバッファ3524、
図34の復号器3404、及び緩和インディケータ3512を含む。緩和インディケータ3512は、そのようにさせる場合に、NPU126のアレイがNNUプログラム命令をどれほどゆっくり実行するかを指定する値を保持する。好ましくは、緩和インディケータ3512は、除数値Nを指定し、クロック低減論理3504は、その除数値で基本クロック信号3506−7を割って副クロック信号3508を生成し、副クロック信号3508が1/Nであるレートを持つようにする。好ましくは、Nの値は、複数の異なる所定の値のいずれか1つにプログラムされて、クロック低減論理3504に、基本クロックレートよりも小さい、対応する複数の異なるレートで副クロック信号3508を生成させることができる。
【0244】
一実施形態では、クロック低減論理3504は、基本クロック信号3506−7を緩和インディケータ3512の値で割るクロック分周回路を備える。一実施形態では、クロック低減論理3504は、基本クロック信号3506−7を、基本クロック信号3506−7のN回のサイクルごとに一回だけ真になるイネーブル信号でゲートするクロックゲート(例えば、ANDゲート)を備える。例えば、Nまでカウントするカウンタを含んだ回路が使用されて、イネーブル信号を生成することができる。付随する論理が、カウンタの出力がNと一致することを検出すると、その論理は、副クロック信号3508に真のパルスを生成し、カウンタをリセットする。好ましくは、緩和インディケータ3512の値は、
図14のMTNN1400命令などのアーキテクチャ命令によってプログラム可能である。好ましくは、
図37に関してより詳細に説明するように、プロセッサ100で稼働しているアーキテクチャプログラムが、NNUプログラムの稼働を開始するようにNNU121に命令する直前に、緩和値を緩和インディケータ3512にプログラムする。
【0245】
重みRAMバッファ3524は、重みRAM124とメディアレジスタ118との間に結合されて、それらの間のデータの伝達をバッファリングする。好ましくは、重みRAMバッファ3524は、
図17のバッファ1704の実施形態の1つ又は複数に似ている。好ましくは、メディアレジスタ118からデータを受け取る重みRAMバッファ3524の部分は、基本クロックレートの基本クロック信号3506−7によってクロック制御され、重みRAM124からデータを受け取る重みRAMバッファ3524の部分は、副クロックレートの副クロック信号3508−3によってクロック制御され、副クロックレートは、緩和インディケータ3512にプログラムされた値に依存して、すなわちNNU121が緩和モードで動作しているか又は通常モードで動作しているかに依存して、基本クロックレートに対して低減される場合も低減されない場合もある。一実施形態では、重みRAM124は、
図17に関連して上記で説明したようにシングルポートであり、重みRAMバッファ3524を介してメディアレジスタ118によって、及び
図11のNPU126又は行バッファ1104によっての双方で、調停されるやり方でアクセス可能である。代替的な一実施形態では、重みRAM124は、
図16に関連して上記で説明したようにデュアルポートであり、各ポートは、重みRAMバッファ3524を介してメディアレジスタ118によって、及びNPU126又は行バッファ1104によっての双方で、同時的なやり方でアクセス可能である。
【0246】
同様に、データRAMバッファ3522は、データRAM122とメディアレジスタ118との間に結合されて、それらの間のデータの伝達をバッファリングする。好ましくは、データRAMバッファ3522は、
図17のバッファ1704の実施形態の1つ又は複数に似ている。好ましくは、メディアレジスタ118からデータを受け取るデータRAMバッファ3522の部分は、基本クロックレートの基本クロック信号3506−7でクロック制御され、データRAM122からデータを受け取るデータRAMバッファ3522の部分は、副クロックレートの副クロック信号3508−3でクロック制御され、副クロックレートは、緩和インディケータ3512にプログラムされた値に依存して、すなわちNNU121が緩和モードで動作しているか又は通常モードで動作しているかに依存して、基本クロックレートに対して低減される場合もされない場合もある。一実施形態では、データRAM122は、
図17に関連して上記で説明したようにシングルポートであり、データRAMバッファ3522を介してメディアレジスタ118によって、及び
図11のNPU126又は行バッファ1104によっての双方で、調停されるやり方でアクセス可能である。代替的な一実施形態では、データRAM122は、上記で
図16に関連して説明したようにデュアルポートであり、各ポートは、データRAMバッファ3522を介してメディアレジスタ118によって、及びNPU126又は行バッファ1104によっての双方で、同時的なやり方でアクセス可能である。
【0247】
好ましくは、インターフェース論理3514は、基本クロックドメインと副クロックドメインとの間の同期をもたらすために、データRAM122及び/又は重みRAM124がシングルポートであるか又はデュアルポートであるかに関係なく、データRAMバッファ3522及び重みRAMバッファ3524を含む。好ましくは、データRAM122、重みRAM124、及びプログラムメモリ129の各々は、それぞれの読み出しイネーブル信号、書き込みイネーブル信号、及びメモリ選択信号を含む静的RAM(SRAM)を含む。
【0248】
上記のように、NNU121は、プロセッサ100の実行ユニットである。実行ユニットは、
図1のアーキテクチャ命令103が翻訳されたマイクロ命令105など、アーキテクチャ命令が翻訳されたマイクロ命令を実行するか、又はアーキテクチャ命令103自体を実行する、プロセッサの機能ユニットである。実行ユニットは、GPR116やメディアレジスタ118など、プロセッサの汎用レジスタからオペランドを受け取る。実行ユニットは、マイクロ命令又はアーキテクチャ命令を実行するのに応答して、汎用レジスタに書き込まれ得る結果を生成することができる。アーキテクチャ命令103の例は、それぞれ
図14及び
図15に関連して説明した、MTNN命令1400及びMFNN命令1500である。マイクロ命令は、アーキテクチャ命令を実装する。より具体的には、アーキテクチャ命令が翻訳された1つ又は複数のマイクロ命令の実行ユニットによる集合的な実行は、そのアーキテクチャ命令で指定される入力に、アーキテクチャ命令で指定される演算を行って、アーキテクチャ命令によって定義される結果を作り出す。
【0249】
次いで
図36Aを参照すると、NNU121が通常モード、すなわち基本クロックレートで動作している、プロセッサ100の動作の例を図示するタイミング図が示される。時間は、タイミング図中の左から右へと進行する。プロセッサ100は、アーキテクチャプログラムを基本クロックレートで稼働させている。より具体的には、プロセッサ100のフロントエンド(例えば、命令取出しユニット101、命令キャッシュ102、命令トランスレータ104、リネームユニット106、リザベーションステーション108)が、基本クロックレートで、アーキテクチャ命令を取り出し、復号し、NNU121及び他の実行ユニット112に発行する。
【0250】
最初、アーキテクチャプログラムは、フロントエンド100がNNU121に対して発行するアーキテクチャ命令(例えば、MTNN命令1400)を実行し、この命令は、NNU121に、そのプログラムメモリ129内のNNUプログラムの稼働を開始するように命令する。それに先立って、アーキテクチャプログラムは、アーキテクチャ命令を実行して、緩和インディケータ3512に、基本クロックレートを指定する値、すなわちNNU121を通常モードにする値を書き込んでいる。より具体的には、緩和インディケータ3512にプログラムされた値により、クロック低減論理3504は、副クロック信号3508を、基本クロック信号3506の基本クロックレートで生成する。好ましくは、この場合、クロック低減論理3504のクロックバッファは、単に基本クロック信号3506を昇圧する。また、先立って、アーキテクチャプログラムは、アーキテクチャ命令を実行して、データRAM122及び重みRAM124に書き込みをし、NNUプログラムをプログラムメモリ129に書き込んでいる。NNUプログラム開始のMTNN命令1400に応答して、NNU121は、NNUプログラムを基本クロックレートで稼働させ始める。これは、緩和インディケータ3512が基本レート値でプログラムされたためである。NNU121の稼働を開始した後、アーキテクチャプログラムは、アーキテクチャ命令を基本クロックレートで実行し続け、このアーキテクチャ命令は、主として、NNUプログラムの次のインスタンス、又はNNUプログラムの呼び出し若しくは稼働の準備として、データRAM122及び重みRAM124の書き込み及び/又は読み出しを行うMTNN命令1400を含む。
【0251】
図36Aの例に示されるように、NNU121は、アーキテクチャプログラムがデータRAM122及び重みRAM124の書き込み/読み出しを終えるために要するよりも大幅に少ない時間(例えば、その時間の4分の1)で、NNUプログラムの稼働を終了する。例えば、NNU121は、NNUプログラムを稼働させるのに約1000クロックサイクルを要する可能性があるのに対して、アーキテクチャプログラムは、稼働に約4000クロックサイクルを要し、両方とも基本クロックレートである。その結果、NNU121は、その時間の残りはアイドル状態になり、これはこの例では大幅に長い時間であり、例えば、約3000基本クロックレートサイクルである。
図36Aの例に示されるように、このパターンはもう1回継続し、また、ニューラルネットワークのサイズ及び構成に依存して、もう数回継続する可能性がある。NNU121は、プロセッサ100のうち比較的大きくトランジスタ密度が高い機能ユニットである可能性があるため、特に基本クロックレートで稼働している時に、著しい量の熱を発生する可能性がある。
【0252】
次いで
図36Bを参照すると、NNU121が緩和モード、すなわち基本クロックレート未満のレートで動作している、プロセッサ100の動作の例を図示するタイミング図が示される。
図36Bのタイミング図は、プロセッサ100がアーキテクチャプログラムを基本クロックレートで稼働させている点において、多くの点で
図36Aのタイミング図に似ている。そして、この例では、
図36Bのアーキテクチャプログラム及びNNUプログラムが、
図36Aと同じであると仮定される。ただし、NNUプログラムを開始する前に、アーキテクチャプログラムは、MTNN命令1400を実行し、その命令で、クロック低減論理3504に基本クロックレート未満の副クロックレートの副クロック信号3508を生成させる値を、緩和インディケータ3512にプログラムしている。すなわち、アーキテクチャプログラムは、NNU121を、
図36Aのように通常モードにするのではなく、
図36Bでは緩和モードにする。その結果、NPU126は、NNUプログラムを副クロックレートで実行し、副クロックレートは、緩和モードでは基本クロックレート未満である。この例では、緩和インディケータ3512には、副クロックレートが基本クロックレートの4分の1であることを指定する値がプログラムされると仮定する。その結果、
図36Aと
図36Bを比較することで分かるように、NNU121は、NNUプログラムを緩和モードで稼働させるには、NNUプログラムを通常モードで稼働させる場合に比べて約4倍長い時間を要し、NNU121がアイドルになる時間量が比較的短くなる。したがって、NNUプログラムを稼働させるために使用されるエネルギーは、NNU121が
図36Aでプログラムを通常モードで稼働させた場合と比べて約4倍長い期間にわたって、
図36BのNNU121によって消費される。そのため、NNU121がNNUプログラムを稼働させるために発生させる熱が
図36Bでは
図36Aのおよそ4分の1の割合になり、これは、本明細書に記載されるように熱に関する利益を有する可能性がある。
【0253】
次いで
図37を参照すると、
図35のプロセッサ100の動作を図示するフローチャートが示される。このフローチャートは、多くの点で、上記で
図35、
図36A、及び
図36Bに関連して説明した動作に似ている動作を図示している。フローはブロック3702で開始する。
【0254】
ブロック3702で、プロセッサ100が、MTNN命令1400を実行して、重みRAM124に重みを書き込み、データRAM122にデータを書き込む。フローはブロック3704に進む。
【0255】
ブロック3704で、プロセッサ100が、MTNN命令1400を実行して、緩和インディケータ3512に、基本クロックレートよりも低いレートを指定する値をプログラムし、すなわちNNU121を緩和モードにする。フローはブロック3706に進む。
【0256】
ブロック3706で、プロセッサ100は、MTNN命令1400を実行して、NNU121に、
図36Bに視覚化されたのと同様にしてNNUプログラムの稼働を開始するように命令する。フローはブロック3708に進む。
【0257】
ブロック3708で、NNU121が、NNUプログラムの稼働を開始する。並行して、プロセッサ100は、MTNN命令1400を実行して、重みRAM124に新しい重みを書き込み(且つ、場合によってはデータRAM122に新しいデータを書き込み)、且つ/又はMFNN命令1500を実行して、データRAM122から(及び場合によっては重みRAM124から)結果を読み出す。フローはブロック3712に進む。
【0258】
ブロック3712で、プロセッサ100は、MFNN命令1500(例えば、状態レジスタ127の読み出し)を実行して、NNU121がそのプログラムの稼働を終えたことを検出する。アーキテクチャプログラムが緩和インディケータ3512の適切な値を選択したと仮定すると、
図36Bに視覚化されるように、NNU121がNNUプログラムを実行するには、プロセッサ100が重みRAM124及び/又はデータRAM122にアクセスするアーキテクチャプログラムの部分を実行するためにかかる時間量とおよそ同じ時間量を要するはずである。フローはブロック3714に進む。
【0259】
ブロック3714で、プロセッサ100は、MTNN命令1400を実行して、緩和インディケータ3512に、基本クロックレートを指定する値をプログラムし、すなわちNNU12を通常モードにする。フローはブロック3716に進む。
【0260】
ブロック3716で、プロセッサ100は、MTNN命令1400を実行して、NNU121に、
図36Aに視覚化されたのと同様にしてNNUプログラムの稼働を開始するように命令する。フローはブロック3718に進む。
【0261】
ブロック3718で、NNU121は、NNUプログラムを通常モードで稼働させ始める。フローはブロック3718で終了する。
【0262】
上記のように、NNUプログラムを緩和モードで稼働させると、NNUがプログラムを稼働させる時間が、NNUがプログラムを通常モードで(すなわち、プロセッサの基本クロックレートで)稼働させる時間と比べて延び、これは熱に関する利益をもたらす可能性がある。より具体的には、デバイス(例えば、トランジスタ、キャパシタ、配線)は、NNUがプログラムを緩和モードで稼働させている間は、より低い温度で動作する可能性が高い。これは、NNUが、NNU(例えば、半導体素子、金属層、下にある基板)並びに周辺パッケージ及び冷却対策(例えば、ヒートシンク、ファン)によって放散される熱を発生させるレートがよりゆっくりになるためである。これにより、一般には、プロセッサダイの他の部分にあるデバイスの温度も下げることができる。デバイスの動作温度、特にデバイスの接合部の温度の低下は、漏洩電流の減少という利益も有する可能性がある。さらに、単位時間当たりに消費される電流の量が減るため、誘導雑音及びIR低下雑音を低減させることができる。さらには、より低い温度は、プロセッサのMOSFETの負バイアス温度不安定性(NBTI)及び正バイアス温度不安定性(PBTI)に好影響を与える可能性があり、それにより、デバイス及びその結果プロセッサ部分の信頼性及び/又は寿命を向上させる。温度の低下は、プロセッサの金属層におけるジュール加熱及びエレクトロマイグレーションも低減することができる。
【0263】
NNUの共有リソースに関するアーキテクチャプログラムと非アーキテクチャプログラムとの間の通信機構
例えば
図24〜
図28及び
図35〜
図37に関連して上記で説明したように、データRAM122及び重みRAM124は、共有リソースである。NPU126とプロセッサ100のフロントエンドとの両方が、データRAM122及び重みRAM124を共有する。より具体的には、NPU126と、プロセッサ100のフロントエンド、例えばメディアレジスタ118との両方が、データRAM122及び重みRAM124の書き込み及び読み出しを行う。別の表現をすると、プロセッサ100で稼働しているアーキテクチャプログラムは、データRAM122及び重みRAM124を、NNU121で稼働しているNNUプログラムと共有し、状況によっては、これは、上記のようにアーキテクチャプログラムとNNUプログラムとの間のフローの制御を必要とする。このリソース共有は、プログラムメモリ129にもある程度当てはまる。なぜならば、アーキテクチャプログラムがプログラムメモリ129に書き込み、シーケンサ128がプログラムメモリ129を読み出すためである。アーキテクチャプログラムとNNUプログラムの間の共有リソースへのアクセスのフローを制御する、高性能の解決法を提供する実施形態が上記及び下記に記載される。
【0264】
NNUプログラムが非アーキテクチャプログラムとも呼ばれ、NNU命令が非アーキテクチャ命令とも呼ばれ、NNU命令セット(上記ではNPU命令セットとも呼んでいる)が非アーキテクチャ命令セットとも呼ばれる実施形態が記載される。非アーキテクチャ命令セットは、アーキテクチャ命令セットとは別のものである。プロセッサ100がアーキテクチャ命令をマイクロ命令に翻訳する命令トランスレータ104を含んでいる実施形態では、非アーキテクチャ命令セットは、マイクロ命令セットとも別のものである。
【0265】
次いで
図38を参照すると、NNU121のシーケンサ128をより詳細に図示するブロック図が示される。シーケンサ128は、上記のように、メモリアドレス131をプログラムメモリ129に提供して、シーケンサ128に提供される非アーキテクチャ命令を選択する。メモリアドレス131は、
図38に示されるように、シーケンサ128のプログラムカウンタ3802に保持される。シーケンサ128は、一般に、シーケンサ128がループ命令や分岐命令などの非アーキテクチャ制御命令に遭遇しない限り、プログラムメモリ129の順次アドレスを通じて増分して行き、非アーキテクチャ制御命令に遭遇した場合、シーケンサ128は、プログラムカウンタ3802を、制御命令の目標アドレス、すなわち制御命令のターゲットにある非アーキテクチャ命令のアドレスに更新する。したがって、プログラムカウンタ3802に保持されているアドレス131は、NPU126による実行のために現在取り出されている非アーキテクチャプログラムの非アーキテクチャ命令の、プログラムメモリ129内のアドレスを指定する。有利な点として、プログラムカウンタ3802の値は、
図39に関連して下記で説明するように、状態レジスタ127のNNUプログラムカウンタフィールド3912を介して、アーキテクチャプログラムによって取得されることが可能である。これにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データRAM122及び/又は重みRAM124のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。
【0266】
シーケンサ128は、ループカウンタ3804をさらに含み、これは、例えば、
図26Aのアドレス10にあるLOOP TO 1命令や、
図28のアドレス11にあるLOOP TO 1命令などの非アーキテクチャループ命令との関係で使用される。
図26A及び
図28の例では、ループカウンタ3804には、アドレス0の非アーキテクチャ初期化命令で指定される値、例えば400の値がロードされる。シーケンサ128がループ命令に遭遇して目標命令(例えば、
図26Aのアドレス1の積和命令、又は
図28のアドレス1のmaxwacc命令)にジャンプするたびに、シーケンサ128はループカウンタ3804を減分する。ループカウンタ3804がゼロに達すると、シーケンサ128は、次の順次非アーキテクチャ命令に進む。代替的な一実施形態では、ループ命令に最初に遭遇した時に、ループカウンタ3804は、そのループ命令で指定されるループカウント値をロードされ、非アーキテクチャ初期化命令を介してループカウンタ3804を初期化する必要がなくされる。したがって、ループカウンタ3804の値は、非アーキテクチャプログラムのループ本体があと何回実行されることになるかを指示する。有利な点として、ループカウンタ3804の値は、
図39に関連して下記で説明するように、状態レジスタ127のループカウント3914フィールドを介して、アーキテクチャプログラムによって取得されることが可能である。それにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データRAM122及び/又は重みRAM124のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。一実施形態では、シーケンサ128は、非アーキテクチャプログラム中の入れ子構造のループに対応するための3つの追加的なループカウンタを含み、これら他の3つのループカウンタの値も、状態レジスタ127を介して読み出すことが可能である。ループ命令中の1ビットが、4つのループカウンタのうちどれが当該ループ命令に使用されるかを指示する。
【0267】
シーケンサ128は、反復カウンタ3806をさらに含む。反復カウンタ3806は、例えば、
図4、
図9、
図20、及び
図26Aのアドレス2の積和命令や、
図28アドレス2のmaxwacc命令などの非アーキテクチャ命令との関連で使用され、これらを以後「実行」命令と呼ぶ。上記の例では、実行命令の各々は、それぞれ511、511、1023、2、及び3の反復回数を指定する。シーケンサ128が、非ゼロの反復回数を指定する実行命令に遭遇すると、シーケンサ128は、反復カウンタ3806に、指定される値をロードする。加えて、シーケンサ128は、適切なマイクロ操作3418を生成して、
図34のNPU126のパイプラインステージ3401中の論理を実行のために制御し、反復カウンタ3806を減分する。反復カウンタ3806がゼロより大きい場合、シーケンサ128は、再度適切なマイクロ操作3418を生成して、NPU126内の論理を制御し、反復カウンタ3806を減分する。シーケンサ128は、反復カウンタ3806がゼロに達するまで、このようにして継続する。したがって、反復カウンタ3806の値は、非アーキテクチャ実行命令の中で指定される演算(例えば、累算器及びデータワード/重みワードの、積和、最大値、和)があと何回行われることになるかを指示する。有利な点として、反復カウンタ3806の値は、
図39に関連して下記で説明するように、状態レジスタ127の反復カウント3916フィールドを介して、アーキテクチャプログラムによって取得されることが可能である。それにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データRAM122及び/又は重みRAM124のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。
【0268】
次いで
図39を参照すると、NNU121の制御及び状態レジスタ127の特定のフィールドを図示するブロック図が示される。それらのフィールドが含むのは、非アーキテクチャプログラムを実行しているNPU126によって一番最近書き込まれた重みRAM行2602のアドレス、非アーキテクチャプログラムを実行しているNPU126によって一番最近読み出された重みRAM行2604のアドレス、非アーキテクチャプログラムを実行しているNPU126によって一番最近書き込まれたデータRAM行2606のアドレス、及び、非アーキテクチャプログラムを実行しているNPU126によって一番最近読み出されたデータRAM行2604のアドレス、であり、これらについては上記で26Bに関連して説明した。加えて、これらのフィールドは、NNUプログラムカウンタ3912、ループカウント3914、及び反復カウント3916をさらに含んでいる。上記のように、状態レジスタ127は、アーキテクチャプログラムによって、例えばMFNN命令1500で、NNUプログラムカウンタ3912、ループカウント3914、及び反復カウント3916フィールド値を含めて、メディアレジスタ118及び/又は汎用レジスタ116へと読み出すことができる。プログラムカウンタ3912値は、
図38のプログラムカウンタ3802の値を反映する。ループカウント3914値は、ループカウンタ3804の値を反映する。反復カウント3916値は、反復カウンタ3806の値を反映する。一実施形態では、シーケンサ128は、プログラムカウンタ3802、ループカウンタ3804、又は反復カウンタ3806に変更を加えるたびに、プログラムカウンタ3912、ループカウント3914、及び反復カウント3916フィールドの値を更新して、アーキテクチャプログラムが読み出す時にそれらのフィールド値が現在の値であるようにする。別の実施形態では、NNU121が、状態レジスタ127を読み出すアーキテクチャ命令を実行する時、NNU121は、単に、プログラムカウンタ3802、ループカウンタ3804、及び反復カウンタ3806の値を取得し、それらをアーキテクチャ命令に(例えば、メディアレジスタ118又は汎用レジスタ116に)返す。
【0269】
前述から観察できるように、
図39の状態レジスタ127のフィールドの値は、NNU121によって実行されている間の非アーキテクチャプログラムの進捗を指示する情報と特徴づけることができる。非アーキテクチャプログラムの進捗の特定の態様について上記で説明したが、それらは、プログラムカウンタ3802値、ループカウンタ3804値、反復カウンタ3806値、重みRAM124のアドレス125のうち一番最近書き込まれた/読み出されたアドレス2602/2604、及びデータRAM122のアドレス123のうち一番最近書き込まれた/読み出されたアドレス2606/2608などである。プロセッサ100で実行されているアーキテクチャプログラムは、
図39の非アーキテクチャプログラムの進捗値を状態レジスタ127から読み出し、その情報を使用して、例えば比較及び分岐命令などのアーキテクチャ命令によって決定を行うことができる。例えば、アーキテクチャプログラムは、データ/重みをデータRAM122及び/又は重みRAM124に書き込む行、又は読み出す行を決定して、特に大きなデータセットについて及び/又は異なる非アーキテクチャプログラムの重なった実行インスタンスについて、データRAM122又は重みRAM124に出入りするデータのフローを制御する。アーキテクチャプログラムによってなされる決定の例については、上記及び下記で説明している。
【0270】
例えば、上記で
図26Aに関連して説明したように、アーキテクチャプログラムは、畳み込みの結果を畳み込みカーネル2402より上の(例えば、行8より上)データRAM122の行に書き戻すように非アーキテクチャプログラムを構成し、アーキテクチャプログラムは、NNU121が結果を書き込むと、一番最近書き込まれたデータRAM122の行2606のアドレスを使用して、その結果をデータRAM122から読み出す。
【0271】
別の例として、上記で
図26Bに関連して説明したように、アーキテクチャプログラムは、
図38の状態レジスタ127のフィールドからの情報を使用して、非アーキテクチャプログラムの進捗を決定して、
図24のデータ配列2404の畳み込みを、5つの512×1600のチャンクで行う。アーキテクチャプログラムは、2560×1600のデータ配列2404のうち最初の512×1600チャンクを重みRAM124に書き込み、非アーキテクチャプログラムを開始し、このプログラムは、1600のループカウント、及び初期化された重みRAM124の0の出力行を有する。NNU121が非アーキテクチャプログラムを実行するとき、アーキテクチャプログラムは、状態レジスタ127を読み出して、一番最近書き込みがされた重みRAMの行2602を決定し、そのため、非アーキテクチャプログラムによって書き込まれた有効な畳み込み結果を読み出し、アーキテクチャプログラムがその畳み込み結果を読み出した後に、次の512×1600チャンクをその有効な畳み込み結果の上に書き込むことができる。それにより、NNU121が、最初の512×1600チャンクへの非アーキテクチャプログラムを完了すると、プロセッサ100は直ちに、必要に応じて非アーキテクチャプログラムを更新し、そのプログラムを再度開始して、次の512×1600チャンクを処理することができる。
【0272】
別の例として、アーキテクチャプログラムが、重みが重みRAM124に記憶され、結果がデータRAM122に書き戻される一続きの典型的なニューラルネットワーク積和活性化関数演算を、NNU121に行わせていると仮定する。その場合、非アーキテクチャプログラムが重みRAM124のある行を読み出すと、そのプログラムはその行を再び読み出すことはない。そのため、アーキテクチャプログラムは、現在の重みが非アーキテクチャプログラムによって読み出される/使用されると、重みRAM124にある重みを、非アーキテクチャプログラムの次の実行インスタンスのための(例えば、次のニューラルネットワーク層に関する)新しい重みで上書きし始めるように構成することができる。その場合、アーキテクチャプログラムは、状態レジスタ127を読み出して、一番最近読み出された重みRAM行2604のアドレスを取得して、新しい重みのセットを重みRAM124内でどこに書き込めるかを決定する。
【0273】
別の例として、アーキテクチャプログラムが、非アーキテクチャプログラムの中に、
図20のアドレス2の非アーキテクチャ積和命令など、大きな反復回数を有する実行命令が含まれていることを知っていると仮定する。そのような場合、アーキテクチャプログラムは、その非アーキテクチャ命令を完了するのにあと約何回のクロックサイクルを要するかを知って、アーキテクチャプログラムが2つ以上の動作のどちらを行うかを決定できるようにするために、反復カウント3916を知る必要がある可能性がある。例えば、アーキテクチャプログラムは、その時間が長い場合は、オペレーティングシステムなどの別のアーキテクチャプログラムに制御を引き渡すことがある。同様に、アーキテクチャプログラムが、
図28の非アーキテクチャプログラムなど、非アーキテクチャプログラムの中に比較的大きいループ回数を持つループ本体が含まれることを知っていると仮定する。そのような場合、アーキテクチャプログラムは、その非アーキテクチャプログラムを完了するのにあと約何回のクロックサイクルを要するかを知って、アーキテクチャプログラムが2つ以上の動作のどちらを行うかを決定できるようにするために、ループカウント3914を知る必要がある可能性がある。
【0274】
別の例として、アーキテクチャプログラムNNU121が、プーリング対象のデータが重みRAM124に記憶され、結果が重みRAM124に書き戻される、
図27及び
図28に関連して説明したのと同様のプーリング演算をNNU121に行わせていると仮定する。ただし、
図27及び
図28の例とは異なり、結果が重みRAM124の先頭の400行、例えば、行1600から1999に書き戻されると仮定する。この場合、非アーキテクチャプログラムが、自身がプールする重みRAM124の4つの行を読み出すと、その非アーキテクチャプログラムはその行を再び読み出すことはない。そのため、アーキテクチャプログラムは、現在の4つの行が非アーキテクチャプログラムによって読み出される/使用されると、重みRAM124にあるデータを、新しいデータ(例えば、プーリングされたデータに典型的な積和活性化関数演算を行うための、例えば、非アーキテクチャプログラムの次の実行インスタンスのための重み)で上書きし始めるように構成することができる。その場合、アーキテクチャプログラムは、状態レジスタ127を読み出して、一番最近読み出された重みRAM行2604のアドレスを取得して、新しい重みのセットを重みRAM124内でどこに書き込めるかを決定する。
【0275】
リカレントニューラルネットワークの加速
伝統的なフィードフォワードニューラルネットワークは、ネットワークへの以前の入力の記憶を含まない。フィードフォワードニューラルネットワークは、一般に、時間の経過に伴うネットワークへの様々な入力が、出力と同様に、互いから独立している作業を行うために使用される。それに対して、リカレントニューラルネットワーク(RNN)は、一般に、時間の経過に伴うネットワークへの入力の順番に重要性がある作業を行うのに役立つ。(この順番は、普通、時間ステップと呼ばれる。)その結果、RNNは、順番において前の入力に応答してネットワークによって行われる算出に基づく情報を保持する、記憶又は内部ステートの概念を備え、RNNの出力は、内部ステート並びに次の時間ステップの入力に依存する。音声認識、言語のモデル化、テキスト生成、言語翻訳、画像記述の生成、及びある種の形態の手書き認識は、RNNによって上手く行える傾向のある作業の例である。
【0276】
3つのよく知られている例は、Elman RNN、Jordan RNN、及びロングショートタームメモリ(Long Short Term Memory:LSTM)ネットワークである。Elman RNNは、現在の時間ステップについてRNNの隠れ層のステートを覚えておくコンテキストノードを含み、そのステートは、次の時間ステップについての隠れ層に入力として提供される。Jordan RNNは、コンテキストノードが隠れ層ではなくRNNの出力層のステートを覚えておくことを除いて同様である。LSTMネットワークは、LSTMセルのLSTM層を含んでいる。各LSTMセルは、現在の時間ステップの現在のステート及び現在の出力と、新しい、すなわち次の時間ステップの新しいステート及び新しい出力とを有する。LSTMセルは、入力ゲート及び出力ゲート、並びにセルにそのセルが覚えているステートを忘れさせる忘却ゲートを含んでいる。これら3種類のRNNについて下記でより詳細に説明する。
【0277】
本開示の文脈では、ElmanやJordan RNNなどのリカレントニューラルネットワーク(RNN)に関して、NNUは、そのインスタンスごとに入力層ノード値のセットを取り出す時間ステップを行い、それらの値をRNNを通じて伝搬させて出力層ノード値並びに隠れ層及びコンテキスト層ノード値を生成するために必要な計算を行う。したがって、入力層ノード値は、それらが隠れ層、出力層、及びコンテキスト層のノード値を計算するために使用される時間ステップに関連付けられ、隠れ層、出力層、及びコンテキスト層のノード値は、それらが生成される時間ステップに関連付けられる。入力層ノード値は、RNNによってモデル化しようとするシステムのサンプリングされた値、例えば、画像、音声サンプル、金融市場データのスナップショットである。LSTMネットワークに関連して、NNUは、そのインスタンスごとにメモリセル入力値のセットを取り出す時間ステップを行い、メモリセル出力値(並びにセル状態及び入力ゲート、忘却ゲート及び出力ゲート値)を生成するために必要な計算を行い、これは、セル入力値を、LSTM層のセルを通じて伝搬させる、と表現されることもある。したがって、セル入力値は、それらがセル状態並びに入力ゲート、忘却ゲート、及び出力ゲート値を計算するために使用される時間ステップに関連付けられ、セル状態並びに入力ゲート、忘却ゲート、及び出力ゲート値は、それらが生成される時間ステップに関連付けられる。
【0278】
コンテキスト層ノード値は、状態ノードとも呼ばれ、ニューラルネットワークの状態であり、この状態は、現在の時間ステップに関連付けられた入力層ノード値だけでなく、前の時間ステップに関連付けられた入力層ノード値に基づく。ある時間ステップについてNNUによって行われる計算(例えば、Elman又はJordan RNNの隠れ層ノード値の計算)は、その前の時間ステップに生成されたコンテキスト層ノード値の関数である。したがって、ある時間ステップの開始時におけるネットワークの状態(コンテキストノード値)は、その時間ステップ中に生成される出力層ノード値に影響する。さらに、その時間ステップの終了時におけるネットワークの状態は、その時間ステップの入力ノード値と、その時間ステップの開始時におけるネットワークの状態との両方に影響される。同様に、LSTMセルに関して、セル状態値は、現在の時間ステップに関連付けられたメモリセル入力値だけでなく、前の時間ステップに関連付けられたメモリセル入力値に基づく。ある時間ステップについてNNUによって行われる計算(例えば、次のセル状態)は、前の時間ステップに生成されたセル状態値の関数であるので、その時間ステップの開始時におけるネットワークの状態(セル状態値)は、その時間ステップ中に生成されるセル出力値に影響し、時間ステップの終了時におけるネットワークの状態は、その時間ステップのセル入力値と、前のネットワークの状態との両方に影響される。
【0279】
次いで
図40を参照すると、Elman RNNの例を図示するブロック図が示される。
図40のElman RNNは、D0、D1〜Dnと表され、集合的には入力層ノードDと呼ばれ、個々には総称して入力層ノードDと呼ばれる入力層ノード又はニューロンと、Z0、Z1〜Znと表され、集合的には隠れ層ノードZと呼ばれ、個々には総称して隠れ層ノードZと呼ばれる隠れ層ノード/ニューロンと、Y0、Y1〜Ynと表され、集合的には出力層ノードYと呼ばれ、個々には総称して出力層ノードYと呼ばれる出力層ノード/ニューロンと、C0、C1〜Cnと表され、集合的にはコンテキスト層ノードCと呼ばれ、個々には総称してコンテキスト層ノードCと呼ばれるコンテキスト層ノード/ニューロンとを含んでいる。
図40の例示的なElman RNNでは、隠れ層ノードZの各々は、入力層ノードDの各々の出力との間に入力接続を有し、また、コンテキスト層ノードCの各々の出力との間に入力接続を有する。出力層ノードYの各々は、隠れ層ノードZの各々の出力との間に入力接続を有する。コンテキスト層ノードCの各々は、対応する隠れ層ノードZの出力との間に入力接続を有する。
【0280】
多くの点で、Elman RNNは、伝統的なフィードフォワード人工ニューラルネットワークと同じように動作する。すなわち、所与のノードには、そのノードへの各入力接続に関連付けられた重みがあり、ある入力接続でノードによって受け取られた値が、そのノードに関連付けられた重みで乗算されて積を生成し、ノードは、すべての入力接続に関連付けられた積を加算して和を生成する(和に含められるバイアス項が存在する場合もある)。通例は、活性化関数がその和に行われてノードの出力値を生成し、これは時にノードの活性化と呼ばれる。伝統的なフィードフォワードネットワークの場合、データは常に一方向に、すなわち入力層から出力層へと流れる。すなわち、入力層は値を隠れ層(通例は複数の隠れ層)に提供し、隠れ層は出力値を生成し、それが出力層に提供され、出力層は、捕捉されることが可能な出力を生成する。
【0281】
ただし、伝統的なフィードフォワードネットワークと対照的に、Elman RNNは、後ろにフィードバックするいくつかの接続、すなわち、
図40の隠れ層ノードZからコンテキスト層ノードCへの接続を含んでいる。Elman RNNは、入力層ノードDが新しい時間ステップに入力値を隠れ層ノードZに提供するとき、コンテキストノードCが、前の入力に応答して隠れ層ノードZの出力値であった値を隠れ層Zに提供するように動作し、これが現在の時間ステップと呼ばれる。この意味で、Elman RNNのコンテキストノードCは、前の時間ステップの入力値に基づくメモリである。
図40のElman RNNに関連する計算を行うためのNNU121の実施形態の動作について、次いで
図41及び
図42との関連で説明する。
【0282】
本開示の目的には、Elman RNNは、少なくとも、入力ノード層、隠れノード層、出力ノード層、及びコンテキストノード層を備えたリカレントニューラルネットワークである。所与の時間ステップについて、コンテキストノード層は、隠れノード層によってコンテキストノード層にフィードバックされた、隠れノード層が前の時間ステップに生成した結果を記憶する。コンテキスト層にフィードバックされる結果は、活性化関数の結果である場合も、又は、活性化関数を実行せずに隠れノード層によって行われた累算の結果である場合もある。
【0283】
次いで
図41を参照すると、NNU121が
図40のElman RNNに関連する算出を行う際のNNU121のデータRAM122及び重みRAM124内のデータのレイアウトの例を図示するブロック図が示される。
図41の例では、
図40のElman RNNが、512個の入力ノードD、512個の隠れノードZ、512個のコンテキストノードC、及び512個の出力ノードYを有すると仮定される。さらに、Elman RNNは完全に接続されていると仮定され、すなわち512個の入力ノードDすべてが、隠れノードZの各々への入力として接続され、512個のコンテキストノードCすべてが、隠れノードZの各々への入力として接続され、512個の隠れノードZのすべてが、出力ノードYの各々への入力として接続されている。加えて、NNU121は、例えばワイド構成において、512個のNPU126、又はニューロンとして構成される。最後に、コンテキストノードCから隠れノードZへの接続に関連付けられた重みはすべて1の値を持つと仮定され、したがって、それらの単位的な(unitary)重み値を記憶する必要はない。
【0284】
重みRAM124の下512行(行0〜511)は、示されるように、入力ノードDと隠れノードZとの間の接続に関連付けられた重み値を保持する。より具体的には、示されるように、行0は、入力ノードD0から隠れノードZへの入力接続に関連付けられた重みを保持し、すなわちワード0は、入力ノードD0と隠れノードZ0との間の接続に関連付けられた重みを保持し、ワード1は、入力ノードD0と隠れノードZ1との間の接続に関連付けられた重みを保持し、ワード2は、入力ノードD0と隠れノードZ2との間の接続に関連付けられた重みを保持し、以下同様に続き、ワード511は、入力ノードD0と隠れノードZ511との間の接続に関連付けられた重みを保持する。行1は、入力ノードD1から隠れノードZへの入力接続に関連付けられた重みを保持し、すなわち、ワード0は、入力ノードD1と隠れノードZ0との間の接続に関連付けられた重みを保持し、ワード1は、入力ノードD1と隠れノードZ1との間の接続に関連付けられた重みを保持し、ワード2は、入力ノードD1と隠れノードZ2との間の接続に関連付けられた重みを保持し、以下同様に続き、ワード511は、入力ノードD1と隠れノードZ511との間の接続に関連付けられた重みを保持する。最後、行511は、入力ノードD511から隠れノードZへの入力接続に関連付けられた重みを保持し、すなわち、ワード0は、入力ノードD511と隠れノードZ0との間の接続に関連付けられた重みを保持し、ワード1は、入力ノードD511と隠れノードZ1との間の接続に関連付けられた重みを保持し、ワード2は、入力ノードD511と隠れノードZ2との間の接続に関連付けられた重みを保持し、以下同様に続き、ワード511は、入力ノードD511と隠れノードZ511との間の接続に関連付けられた重みを保持する。これは、上記で
図4〜
図6Aに関して説明したレイアウト及び使用と同様である。
【0285】
同様にして、図示されるように、重みRAM124の次の512行(行512〜1023)は、隠れノードZと出力ノードYとの間の接続に関連付けられた重み値を保持する。
【0286】
データRAM122は、時間ステップの連続についてElman RNNのノード値を保持する。より具体的には、3行からなる三つ組が、所与の時間ステップについてのノード値を保持する。データRAM122が64行を有する一実施形態では、データRAM122は、示されるように、20個の異なる時間ステップについてノード値を保持することができる。
図41の例では、行0〜2は時間ステップ0のノード値を保持し、行3〜5は時間ステップ1のノード値を保持し、以下同様に続き、行57〜59は時間ステップ19のノード値を保持する。三つ組のうち第1の行は、その時間ステップの入力ノードD値を保持する。三つ組のうち第2の行は、その時間ステップの隠れノードZ値を保持する。三つ組のうち第3の行は、その時間ステップの出力ノードY値を保持する。示されるように、データRAM122の各列は、その対応するニューロン、又はNPU126のノード値を保持する。すなわち、下記で
図42に関連してより詳細に説明するように、列0は、その計算がNPU0によって行われるノードD0、Z0、及びY0に関連付けられたノード値を保持し、列1は、その計算がNPU1によって行われるノードD1、Z1、及びY1に関連付けられたノード値を保持し、以下同様に続き、列511は、その計算がNPU511によって行われるノードD511、Z511、及びY511に関連付けられたノード値を保持する。
【0287】
図41に示されるように、所与の時間ステップに関連付けられた三つ組の第2の行にある隠れノードZ値は、次の時間ステップのコンテキストノードC値である。すなわち、NPU126がその時間ステップ中に計算して書き込むZ値は、次の時間ステップ中にZ値を計算するために(次の時間ステップの入力ノードD値と併せて)NPU126によって使用されるC値になる。コンテキストノードCの初期値(すなわち、時間ステップ0の行1のZ値を計算するために使用されるC値)は、ゼロであると仮定する。これについては、
図42の非アーキテクチャプログラムに関連して、下記でより詳細に説明する。
【0288】
好ましくは、入力ノードD値(
図41の例における、行0、3、及び以下同様に57まで)は、プロセッサ100で稼働しているアーキテクチャプログラムにより、MTNN命令1400を介してデータRAM122に書き込まれ/投入され、
図42の非アーキテクチャプログラムなど、NNU121で稼働している非アーキテクチャプログラムによって読み出される/使用される。逆に、隠れノード/出力ノードZ/Y値(
図41の例における行1及び2、4及び5、並びに以下同様に58及び59まで)は、NNU121で稼働している非アーキテクチャプログラムにより、データRAM122に書き込まれ/投入され、プロセッサ100で稼働しているアーキテクチャプログラムにより、MFNN命令1500を介して読み出される/使用される。
図41の例は、アーキテクチャプログラムが、(1)データRAM122に、20個の異なる時間ステップについての入力ノードD値を投入し(行0、3、及び以下同様に57まで)、(2)
図42の非アーキテクチャプログラムを開始し、(3)非アーキテクチャプログラムが完了したことを検出し、(4)データRAM122から出力ノードY値(行2、5、及び以下同様に59まで)を読み出し、(5)作業、例えば携帯電話のユーザによってなされた発話の認識を行うために使用される計算を完了するのに必要とされる回数だけステップ(1)〜(4)を繰り返す、と仮定する。
【0289】
代替の一手法では、アーキテクチャプログラムは、(1)データRAM122に、単一の時間ステップについての入力ノードD値を投入し(例えば、行0)、(2)非アーキテクチャプログラム(ループを必要とせず、データRAM122の行の単一の三つ組にアクセスする、
図42の変更を加えられたバージョン)を開始し、(3)非アーキテクチャプログラムが完了したことを検出し、(4)データRAM122から出力ノードのY値(例えば、行2)を読み出し、(5)作業を完了するのに必要とされる回数だけステップ(1)〜(4)を繰り返す。RNNへの入力値がサンプリングされる仕方に依存して、上記2つの手法のうちいずれかがより好ましい可能性がある。例えば、作業が、入力を複数の時間ステップ(例えば、20前後)にわたってサンプリングし、計算を行うことを許容する場合、第1の手法が好ましい可能性がある。それは、その方が計算リソースが効率的で、且つ/又は性能が高い可能性が高いためである。対して、作業が単一の時間ステップでのサンプリングしか許容できない場合は、第2の手法が要求される可能性がある。
【0290】
第3の実施形態が企図され、これは第2の手法に似るが、データRAM122の行の三つ組を1つだけ使用するのではなく、非アーキテクチャプログラムが、行の三つ組を複数個使用し、すなわち、第1の手法と同様に時間ステップごとに異なる三つ組を使用する。第3の実施形態では、好ましくは、アーキテクチャプログラムは、ステップ(2)の前に、例えば、アドレス1の命令内のデータRAM122の行を、次の三つ組をポイントするように更新することにより、非アーキテクチャプログラムを開始する前にそれを更新するステップを含む。
【0291】
次いで
図42を参照すると、NNU121のプログラムメモリ129に記憶され、NNU121によって実行されてElman RNNを達成し、
図41の編成によるデータ及び重みを使用するプログラムを図示する表が示される。
図42(並びに
図45、
図48、
図51、
図54、及び
図57)の非アーキテクチャプログラムの命令のいくつかについては、上記で詳細に説明しており(例えば、MULT−ACCUM、LOOP、INITIALIZE命令)、断らない限りそれらの説明を以下の説明で仮定する。
【0292】
図42の例示的プログラムは、アドレス0〜12に13個の非アーキテクチャ命令を含んでいる。アドレス0の命令(INITIALIZE NPU,LOOPCNT=20)は、累算器202をクリアし、ループカウンタ3804を20の値に初期化して、ループ本体(アドレス4〜11の命令)を20回行わせる。好ましくは、この初期化命令はさらに、NNU121をワイド構成にして、NNU121が512個のNPU126として構成されるようにする。下記の説明から観察できるように、512個のNPU126は、アドレス1〜3及び7〜11の命令の実行中は、512個の隠れ層ノードZに対応し、512個の隠れ層ノードZとして動作し、アドレス4〜6の命令の実行中は、512個の出力層ノードYに対応し、512個の出力層ノードYとして動作する。
【0293】
アドレス1〜3の命令は、プログラムのループ本体の外側であり、一度だけ実行される。それらの命令は、隠れ層ノードZの初期値を計算し、それらをデータRAM122の行1に書き込み、それらの初期値は、第1の時間ステップ(時間ステップ0)の出力層ノードYを算出するために、アドレス4〜6の命令の1回目の実行インスタンスによって使用される。加えて、アドレス1〜3の命令によって計算されてデータRAM122の行1に書き込まれた隠れ層ノードZ値は、第2の時間ステップ(時間ステップ1)の隠れ層ノードZ値の算出において、アドレス7及び8の命令の1回目の実行インスタンスによって使用されるコンテキスト層ノードC値になる。
【0294】
アドレス1及び2の命令の実行中、512個のNPU126の各NPU126は、データRAM122の行0にある512個の入力ノードD値と、重みRAM124の行0〜511からのNPU126それぞれの重みの列との512回の乗算演算を行って、それぞれのNPU126の累算器202に累算される512個の積を生成する。アドレス3の命令の実行中、512個のNPU126の512個の累算器202値がパススルーされ、データRAM122の行1に書き込まれる。すなわち、アドレス3の出力命令は、データRAM122の行1に、初期隠れ層Z値である512個のNPU126各々の累算器202値を書き込み、その後累算器202をクリアする。
【0295】
図42の非アーキテクチャプログラムのアドレス1〜2にある命令によって行われる動作は、多くの点で、
図4の非アーキテクチャプログラムのアドレス1〜2にある命令によって行われる動作と似ている。より具体的には、アドレス1の命令(MULT−ACCUM DR ROW0)は、512個のNPU126各々に、各自のmux−reg208にデータRAM122の行0の各自のワードを読み込み、各自のmux−reg705に重みRAM124の行0の各自のワードを読み込み、そのデータワードと重みワードとを乗算して積を生成し、その積を累算器202に加算するように命令する。アドレス2の命令(MULT−ACCUM ROTATE,WR ROW+1,COUNT=511)は、512個のNPU126各々に、各自のmux−reg208に、隣接するNPU126からのワードを循環させ(直前にデータRAM122の行がアドレス1の命令によって読み込まれた、NNU121の512個のmux−reg208の集合的な動作によって形成される512ワード循環器を使用する)、各自のmux−reg705に、重みRAM124の次の行の各自のワードを読み込み、そのデータワードと重みワードとを乗算して積を生成し、その積を累算器202に加算し、この動作を511回行うように命令する。
【0296】
さらに、
図42のアドレス3の単一の非アーキテクチャ出力命令(OUTPUT PASSTHRU,DR OUT ROW 1,CLR ACC)は、
図4のアドレス3及び4の活性化関数命令と出力書き出し命令の動作を組み合わせたものである(ただし、
図42のプログラムでは、累算器202の値がパススルーされるのに対し、
図4のプログラムでは活性化関数が累算器202の値に行われる。)すなわち、
図42のプログラムでは、存在する場合には、累算器202値に行われる活性化関数が、
図4のプログラムのように別個の非アーキテクチャ活性化関数命令内ではなく、出力命令内で(またアドレス6及び11の出力命令でも)指定される。
図4(並びに
図20、
図26A、及び
図28)の非アーキテクチャプログラムの代替実施形態が企図され、ここでは、活性化関数命令と出力書き出し命令(例えば、
図4のアドレス3及び4)の動作が組み合わせられて、
図42のように単一の非アーキテクチャ出力命令とされる。
図42の例は、隠れ層(Z)のノードは累算器値に活性化関数を行わないと仮定する。ただし、隠れ層(Z)が累算器値に活性化関数を行う他の実施形態が企図され、その場合はアドレス3及び11の命令がそのように、例えばシグモイド、tanh、正規化を行う。
【0297】
アドレス1〜3の命令の実行インスタンスが1回であるのと対照的に、アドレス4〜11の命令は、プログラムのループ本体の内側であり、ループカウントで指示される回数(例えば、20回)実行される。アドレス7〜11の命令の最初の19回の実行インスタンスは、隠れ層ノードZの値を計算し、それらをデータRAM122に書き込み、それらの値は、残りの時間ステップ(時間ステップ1〜19)の出力層ノードYを計算するためにアドレス4〜6の命令の2回目〜20回目の実行インスタンスによって使用される。(アドレス7〜11の命令の最後/20回目の実行インスタンスは、隠れ層ノードZの値を計算し、それらをデータRAM122の行61に書き込むが、それらの値は使用されない。)
【0298】
アドレス4及び5の命令(MULT−ACCUM DR ROW+1,WR ROW 512、及び、MULT−ACCUM ROTATE,WR ROW+1,COUNT=511)の1回目の実行インスタンス中(時間ステップ0について)、512個のNPU126の各NPU126は、データRAM122の行1にある512個の隠れノードZ値(アドレス1〜3の命令の1回の実行インスタンスで生成され、書き込まれたもの)と、重みRAM124の行512〜1023からのNPU126それぞれの重みの列との512回の乗算演算を行って、それぞれのNPU126の累算器202に累算される512個の積を生成する。アドレス6の命令(OUTPUT ACTIVATION FUNCTION,DR OUT ROW+1,CLR ACC)の1回目の実行インスタンス中に、活性化関数(例えば、シグモイド、tanh、正規化)が512個の累算値に行われて出力ノードY層の値を計算し、その結果がデータRAM122の行2に書き込まれる。
【0299】
アドレス4及び5の命令の2回目の実行インスタンス中(時間ステップ1について)、512個のNPU126の各NPU126は、データRAM122の行4にある512個の隠れノードZ値(アドレス7〜11の命令の1回目の実行インスタンスで生成され、書き込まれたもの)と、重みRAM124の行512〜1023からのNPU126それぞれの重みの列との512回の乗算演算を行って、それぞれのNPU126の累算器202に累算される512個の積を生成する。アドレス6の命令の2回目の実行インスタンス中に、活性化関数が512個の累算値に行われて、出力ノードY層値を計算し、それらがデータRAM122の行5に書き込まれる。アドレス4及び5の命令の3回目の実行インスタンス中(時間ステップ2について)、512個のNPU126の各NPU126は、データRAM122の行7にある512個の隠れノードZ値(アドレス7〜11の命令の2回目の実行インスタンスで生成され、書き込まれたもの)と、重みRAM124の行512〜1023からのNPU126それぞれの重みの列との512回の乗算演算を行って、それぞれのNPU126の累算器202に累算される512個の積を生成する。アドレス6の命令の3回目の実行インスタンス中に、活性化関数が512個の累算値に行われて、出力ノードY層値を計算し、それらがデータRAM122の行8に書き込まれる。以下同様に続き、最後、アドレス4及び5の命令の20回目の実行インスタンス中(時間ステップ19について)、512個のNPU126の各NPU126は、データRAM122の行58にある512個の隠れノードZ値(アドレス7〜11の命令の19回目の実行インスタンスで生成され、書き込まれたもの)と、重みRAM124の行512〜1023からのNPU126それぞれの重みの列との512回の乗算演算を行って、それぞれのNPU126の累算器202に累算される512個の積を生成する。アドレス6の命令の20回目の実行インスタンス中に、活性化関数が512個の累算値に行われて、出力ノードY層値を計算し、その結果がデータRAM122の行59に書き込まれる。
【0300】
アドレス7及び8の命令の1回目の実行インスタンス中に、512個のNPU126の各々は、各自の累算器202に、アドレス1〜3の命令の1回の実行インスタンスで生成された、データRAM122の行1にある512個のコンテキストノードC値を累算する。より具体的には、アドレス7の命令(ADD_D_ACC DR ROW+0)は、512個のNPU126各々に、各自のmux−reg208に、データRAM122の現在の行(1回目の実行インスタンスの間は行0)のそれぞれのワードを読み込み、そのワードを累算器202に加算するように命令する。アドレス8の命令(ADD_D_ACC ROTATE,COUNT=511)は、512個のNPU126各々に、各自のmux−reg208に、隣接するNPU126からのワードを循環させ(データRAM122の行が直前にアドレス7の命令によって読み込まれた、NNU121の512個のmux−reg208の集合的な動作によって形成される512ワード循環器を使用する)、そのワードを累算器202に加算し、この動作を511回行うように命令する。
【0301】
アドレス7及び8の命令の2回目の実行インスタンス中に、512個のNPU126の各NPU126は、各自の累算器202に、データRAM122の行4の512個のコンテキストノードC値を累算し、それらの値は、アドレス9〜11の命令の1回目の実行インスタンスによって生成されて書き込まれたものである。アドレス7及び8の命令の3回目の実行インスタンス中に、512個のNPU126の各NPU126は、各自の累算器202に、データRAM122の行7の512個のコンテキストノードC値を累算し、それらの値は、アドレス9〜11の命令の2回目の実行インスタンスによって生成されて書き込まれたものである。以下同様に続き、最後、アドレス7及び8の命令の20回目の実行インスタンス中に、512個のNPU126の各NPU126は、各自の累算器202に、データRAM122の行58の512個のコンテキストノードC値を累算し、それらの値は、アドレス9〜11の命令の19回目の実行インスタンスによって生成されて書き込まれたものである。
【0302】
上記で述べたように、
図42の例は、コンテキストノードCから隠れ層ノードZへの接続に関連付けられた重みがすべて、単位的な値を有すると仮定している。ただし、それらの接続が非ゼロの重み値を有する代替実施形態のElman RNNでは、重みは、
図42のプログラムの実行前に重みRAM124に入れられ(例えば、行1024〜1535)、アドレス7のプログラム命令は、MULT−ACCUM DR ROW+0,WR ROW 1024であり、アドレス8のプログラム命令は、MULT−ACCUM ROTATE,WR ROW+1,COUNT=511である。好ましくは、アドレス8の命令は、重みRAM124にアクセスするのではなく、代わりに、アドレス7の命令によって重みRAM124からmux−reg705に読み込まれた値を循環させる。アドレス8の命令の実行の511回のクロックサイクル中に重みRAM124にアクセスしないことは、アーキテクチャプログラムが重みRAM124にアクセスするための帯域幅をより多く残すことから、有利である可能性がある。
【0303】
アドレス9及び10の命令(MULT−ACCUM DR ROW+2,WR ROW 0、及びMULT−ACCUM ROTATE,WR ROW +1,COUNT=511)の1回目の実行インスタンス中(時間ステップ1について)、512個のNPU126の各NPU126は、データRAM122の行3にある512個の入力ノードD値と、重みRAM124の行0〜511からのNPU126それぞれの重みの列との512回の乗算演算を行って512個の積を生成し、それらの積は、アドレス7及び8の命令によって行われる512個のコンテキストCノード値の累算と併せて、それぞれのNPU126の累算器202に累算されて、隠れノードZ層値を計算する。アドレス11の命令(OUTPUT PASSTHRU,DR OUT ROW +2,CLR ACC)の1回目の実行中に、512個のNPU126の512個の累算器202値がパススルーされ、データRAM122の行4に書き込まれ、累算器202がクリアされる。アドレス9及び10の命令の2回目の実行インスタンス中(時間ステップ2について)、512個のNPU126の各NPU126は、データRAM122の行6にある512個の入力ノードD値と、重みRAM124の行0〜511からのNPU126それぞれの重みの列との512回の乗算演算を行って512個の積を生成し、それらの積は、アドレス7及び8の命令によって行われる512個のコンテキストCノード値の累算と併せて、それぞれのNPU126の累算器202に累算されて、隠れノードZ層値を計算する。アドレス11の命令の2回目の実行中に、512個のNPU126の512個の累算器202値がパススルーされ、データRAM122の行7に書き込まれ、累算器202がクリアされる。以下同様に続き、最後、アドレス9及び10の命令の19回目の実行インスタンス中(時間ステップ19について)、512個のNPU126の各NPU126は、データRAM122の行57にある512個の入力ノードD値と、重みRAM124の行0〜511からのNPU126個々の重みの列との512回の乗算演算を行って512個の積を生成し、それらの積は、アドレス7及び8の命令によって行われる512個のコンテキストCノード値の累算と併せて、それぞれのNPU126の累算器202に累算されて、隠れノードZ層値を計算する。アドレス11の命令の19回目の実行中に、512個のNPU126の512個の累算器202値がパススルーされ、データRAM122の行58に書き込まれ、累算器202がクリアされる。上記で暗に触れたように、アドレス9及び10の命令の20回目の実行インスタンス中に生成されて、データRAM122の行61に書き込まれる隠れノードZ層値は、使用されない。
【0304】
アドレス12の命令(LOOP 4)は、ループカウンタ3804を減分し、新しいループカウンタ3804値がゼロより大きければアドレス4の命令にループバックする。
【0305】
次いで
図43を参照すると、Jordan RNNの例を図示するブロック図が示される。
図43のJordan RNNは、入力層ノード/ニューロンD、隠れ層ノード/ニューロンZ、出力層ノード/ニューロンY、及びコンテキスト層ノード/ニューロンCを含む点において、多くの点で
図40のElman RNNに似ている。ただし、
図43のJordan RNNでは、コンテキスト層ノードCは、
図40のElman RNNのように隠れ層ノードZの出力からではなく、対応する出力層ノードYの出力から後ろにフィードバックする入力接続を有する。
【0306】
本開示の目的には、Jordan RNNは、少なくとも、入力ノード層、隠れノード層、出力ノード層、及びコンテキストノード層を備えるリカレントニューラルネットワークである。所与の時間ステップの開始時に、コンテキストノード層は、出力ノード層が前の時間ステップに生成した、出力ノード層からコンテキストノード層にフィードバックされた結果を含んでいる。コンテキスト層にフィードバックされる結果は、活性化関数の結果である場合も、又は、活性化関数を実行せずに出力ノード層によって行われた累算の結果である場合もある。
【0307】
次いで
図44を参照すると、NNU121が
図43のJordan RNNに関連する算出を行う際の、NNU121のデータRAM122及び重みRAM124内のデータのレイアウトの例を図示するブロック図が示される。
図44の例では、
図43のJordan RNNは、512個の入力ノードD、512個の隠れノードZ、512個のコンテキストノードC、及び512個の出力ノードYを有すると仮定される。さらに、このJordan RNNは完全に接続されていると仮定され、すなわち、512個の入力ノードDすべてが、隠れノードZ各々への入力として接続され、512個のコンテキストノードCすべてが隠れノードZ各々への入力として接続され、512個の隠れノードZすべてが出力ノードY各々への入力として接続されている。
図44の例示的なJordan RNNでは、活性化関数が累算器202値に適用されて出力層ノードY値を生成するが、実際の出力層ノードY値ではなく、活性化関数を適用する前の累算器202値が、コンテキスト層ノードCにパススルーされると仮定される。加えて、NNU121は、例えばワイド構成において、512個のNPU126、又はニューロンとして構成される。最後、コンテキストノードCから隠れノードZへの接続に関連付けられた重みはすべて1の値を持つと仮定され、したがって、それらの単位的な重み値を記憶する必要はない。
【0308】
図41の例と同様に、示されるように、重みRAM124の下512行(行0〜511)は、入力ノードDと隠れノードZとの間の接続に関連付けられた重み値を保持し、重みRAM124の次の512行(行512〜1023)は、隠れノードZと出力ノードYとの間の接続に関連付けられた重み値を保持する。
【0309】
データRAM122は、
図41の例と同様に、時間ステップの連続についてJordan RNNのノード値を保持するが、
図44の例では、4行からなる四つ組が、所与の時間ステップについてのノード値を保持する。データRAM122が64行を持つ実施形態では、示されるように、データRAM122は、15個の異なる時間ステップについてノード値を保持することができる。
図44の例では、行0〜3は時間ステップ0のノード値を保持し、行4〜7は時間ステップ1のノード値を保持し、以下同様に続き、行60〜63は時間ステップ15のノード値を保持する。四つ組のうち第1の行は、その時間ステップの入力ノードD値を保持する。四つ組のうち第2の行は、その時間ステップの隠れノードZ値を保持する。四つ組のうち第3の行は、その時間ステップのコンテキストノードC値を保持する。四つ組のうち第4の行は、その時間ステップの出力ノードY値を保持する。示されるように、データRAM122の各列は、それに対応するニューロン、又はNPU126のノード値を保持する。すなわち、下記で
図44に関連してより詳細に説明するように、列0は、その計算がNPU0によって行われるノードD0、Z0、C0、及びY0に関連付けられたノード値を保持し、列1は、その計算がNPU1によって行われるノードD1、Z1、C1、及びY1に関連付けられたノード値を保持し、以下同様に続き、列511は、その計算がNPU511によって行われるノードD511、Z511、C511、及びY511に関連付けられたノード値を保持する。
【0310】
所与の時間ステップについて
図44に示されるコンテキストノードC値は、その時間ステップに生成され、次の時間ステップに入力として使用される。すなわち、NPU126がその時間ステップ中に計算して書き込むC値は、次の時間ステップ中にZ値を計算するために(次の時間ステップの入力ノードD値と併せて)NPU126によって使用されるC値になる。コンテキストノードCの初期値(すなわち、時間ステップ0の行1のZ値を計算するために使用されるC値)は、ゼロであると仮定する。これについては、
図45の非アーキテクチャプログラムに関連して、下記でより詳細に説明する。
【0311】
上記で
図41に関連して説明したように、好ましくは、入力ノードD値(
図44の例では、行0、4、及び以下同様に60まで)は、プロセッサ100で稼働しているアーキテクチャプログラムにより、MTNN命令1400を介してデータRAM122に書き込まれ/投入され、
図45の非アーキテクチャプログラムなど、NNU121で稼働している非アーキテクチャプログラムによって読み出される/使用される。逆に、隠れノード/コンテキストノード/出力ノードZ/C/Y値(
図44の例では、行1/2/3、4/5/6、及び以下同様に60/61/62まで)は、NNU121で稼働している非アーキテクチャプログラムによって、データRAM122に書き込まれ/投入され、プロセッサ100で稼働しているアーキテクチャプログラムにより、MFNN命令1500を介して読み出される/使用される。
図44の例は、アーキテクチャプログラムが、(1)データRAM122に、15個の異なる時間ステップについての入力ノードD値を投入し(行0、4、及び以下同様に60まで)、(2)
図45の非アーキテクチャプログラムを開始し、(3)非アーキテクチャプログラムが完了したことを検出し、(4)データRAM122から、出力ノードY値(行3、7、及び以下同様に63まで)を読み出し、(5)作業、例えば携帯電話のユーザによってなされた発話の認識を行うために使用される計算を完了するのに必要とされる回数だけステップ(1)〜(4)を繰り返す、と仮定する。
【0312】
代替の一手法では、アーキテクチャプログラムは、(1)データRAM122に、単一の時間ステップの入力ノードD値を投入し(例えば、行0)、(2)非アーキテクチャプログラム(ループを必要とせず、データRAM122の行の単一の四つ組にアクセスする、
図45の変更を加えられたバージョン)を開始し、(3)非アーキテクチャプログラムが完了したことを検出し、(4)データRAM122から出力ノードY値(例えば、行3)を読み出し、(5)作業を完了するのに必要とされる回数だけステップ(1)〜(4)を繰り返す。RNNへの入力値がサンプリングされる仕方に依存して、上記2つの手法のうちいずれかがより好ましい可能性がある。例えば、作業が、入力を複数の時間ステップ(例えば、15前後)にわたってサンプリングし、計算を行うことを許容する場合には、第1の手法の方が好ましい可能性がある。それは、その方が計算リソースが効率的で、且つ/又は性能が高い可能性が高いためである。対して、作業が単一の時間ステップでのサンプリングしか許容できない場合は、第2の手法が要求される可能性がある。
【0313】
第3の実施形態が企図され、これは第2の手法に似るが、データRAM122の行の四つ組を1つだけ使用するのではなく、非アーキテクチャプログラムが、行の四つ組を複数個使用し、すなわち第1の手法と同様に時間ステップごとに異なる四つ組を使用する。第3の実施形態では、好ましくは、アーキテクチャプログラムは、ステップ(2)の前に、例えば、アドレス1の命令内のデータRAM122の行を、次の四つ組をポイントするように更新することにより、非アーキテクチャプログラムを開始する前にそれを更新するステップを含む。
【0314】
次いで
図45を参照すると、NNU121のプログラムメモリ129に記憶され、NNU121によって実行されてJordan RNNを達成し、
図44の編成によるデータ及び重みを使用するプログラムを図示する表が示される。違いを説明するが、
図45の非アーキテクチャプログラムは、多くの点で
図42の非アーキテクチャプログラムに似ている。
【0315】
図45の例示的プログラムは、アドレス0〜13に14個の非アーキテクチャ命令を含んでいる。アドレス0の命令は、累算器202をクリアし、ループカウンタ3804を15の値に初期化して、ループ本体(アドレス4〜12の命令)を15回行わせる初期化命令である。好ましくは、この初期化命令はさらに、NNU121をワイド構成にして、NNU121が512個のNPU126として構成されるようにする。観察できるように、512個のNPU126は、アドレス1〜3及び8〜12の命令の実行中は、512個の隠れ層ノードZに対応すると共に512個の隠れ層ノードZとして動作し、アドレス4、5、及び7の命令の実行中は、512個の出力層ノードYに対応すると共に512個の出力層ノードYとして動作する。
【0316】
アドレス1〜5及び7の命令は、
図42のアドレス1〜6の命令と同じであり、同じ関数を行う。アドレス1〜3の命令は、隠れ層ノードZの初期値を計算し、それらをデータRAM122の行1に書き込み、それらの初期値は、第1の時間ステップ(時間ステップ0)の出力層ノードYを算出するために、アドレス4、5、及び7の命令の1回目の実行インスタンスによって使用される。
【0317】
アドレス6の出力命令の1回目の実行インスタンス中に、アドレス4及び5の命令によって累算された512個の累算器202値(後に、出力ノードY層値を計算して書き込むアドレス7の命令によって使用される)は、パススルーされ、データRAM22の行2に書き込まれ、それらは、第1の時間ステップ(時間ステップ0)に作り出され、第2の時間ステップ(時間ステップ1)中に使用されるコンテキスト層ノードC値である。アドレス6の出力命令の2回目の実行インスタンス中に、アドレス4及び5の命令によって累算された512個の累算器202値(後に、出力ノードY層値を計算して書き込むアドレス7の命令によって使用される)は、パススルーされ、データRAM22の行6に書き込まれ、それらは、第2の時間ステップ(時間ステップ1)に生成され、第3の時間ステップ(時間ステップ2)中に使用されるコンテキスト層ノードC値である。以下同様に続き、最後、アドレス6の出力命令の15回目の実行インスタンス中に、アドレス4及び5の命令によって累算された512個の累算器202値(後に、出力ノードY層値を計算して書き込むアドレス7の命令によって使用される)は、パススルーされ、データRAM22の行58に書き込まれ、それらは、第15の時間ステップ(時間ステップ14)に作り出される(また、アドレス8の命令によって読み出されるが、使用されない)コンテキスト層ノードC値である。
【0318】
アドレス8〜12の命令は、
図42のアドレス7〜11の命令と同じであるが、1つの違いがあり、同じ関数を行う。違いは、
図45のアドレス8にある命令では、データRAM122の行が1だけ増分される(ADD_D_ACC DR ROW+1)のに対して、
図42のアドレス7の命令では、データRAM122の行がゼロ増分されることである(ADD_D_ACC DR ROW+0)。これは、データRAM122内のデータのレイアウトの差に起因するものであり、具体的には、
図44のレイアウトは、コンテキスト層ノードC値の四つ組に別個の行(例えば、行2、6、10など)を含むのに対し、
図41のレイアウトは、コンテキスト層ノードC値の三つ組に別個の行を含んでおらず、代わりに、コンテキスト層ノードC値は、隠れ層ノードZ値と行を共有する(例えば、行1、4、7など)。アドレス8〜12の命令の15回の実行インスタンスは、隠れ層ノードZの値を計算し、それらの値をデータRAM122に(行5、9、13、及び以下同様に57に)書き込み、それらは、第2〜第15の時間ステップ(時間ステップ1〜14)の出力層ノードYを算出するために、アドレス4、5、及び7の命令の2回目〜16回目の実行インスタンスによって使用される。(アドレス8〜12の命令の最後/15回目の実行インスタンスは、隠れ層ノードZの値を計算し、それらの値をデータRAM122の行61に書き込むが、それらの値は使用されない。)
【0319】
アドレス13のループ命令は、ループカウンタ3804を減分し、新しいループカウンタ3804値がゼロより大きければアドレス4の命令にループバックする。
【0320】
代替的な一実施形態では、Jordan RNNは、コンテキストノードCが、出力ノードYの活性化関数値、すなわち活性化関数が行われた累算値を保持するように設計される。そのような実施形態では、アドレス6の非アーキテクチャ命令は、非アーキテクチャプログラムに含まれない。それは、出力ノードYの値がコンテキストノードCの値と同じであるためである。したがって、消費されるデータRAM122の行がより少なくなる。より正確には、コンテキストノードC値を保持する
図44の各行(例えば、2、6、59)が存在しない。加えて、各時間ステップは、データRAM122の行を3行しか必要とせず、そのため、15個ではなく20個の時間ステップに対応でき、
図45の非アーキテクチャプログラムの命令のアドレス指定が適宜変更を加えられる。
【0321】
LSTMセル
リカレントニューラルネットワークで使用するためのロングショートタームメモリ(LSTM)セルの概念は、長年知られている。例えば、共にMIT Press Journalsから入手可能な、Long Short−Term Memory, Sepp Hochreiter and Jurgen Schmidhuber, Neural Computation, November 15,1997, Vol.9, No.8, Pages 1735−1780;Learning to Forget: Continual Prediction with LSTM, Felix A. Gers, Jurgen Schmidhuber,and Fred Cummins,Neural Computation,October 2000,Vol.12,No.10,Pages 2451−2471を参照されたい。LSTMセルは、様々な形態に構築可能である。下記で
図46に関連して説明するLSTMセル4600は、LSTM Networks for Sentiment Analysisと題された、http://deeplearning.net/tutorial/lstm.htmlで得られる指導書に記載されるLSTMセルの後を追って、モデル化されたものである。この文献のコピーは、2015年10月19日にダウンロードされ(以降「LSTM指導書」)、本明細書と共に提供される情報開示陳述書(IDS)に提供されている。LSTMセル4600は、LSTMに一般に関連する計算を効率的に行う、本明細書に記載されるNNU121の実施形態の能力を例証する手段として提供される。
図49に関連して説明される実施形態を含むNNU121を用いて、
図46に記載される計算以外のLSTMセルに関連する計算を効率的に行うことが可能であることを理解されたい。
【0322】
好ましくは、NNU121を用いて、他の層に接続されたLSTMセルの層を含むリカレントニューラルネットワークのための計算を行うことができる。例えば、LSTM指導書では、ネットワークは、LSTM層のLSTMセルの出力(H)を受け取る中間プーリング層(mean pooling layer)と、中間プーリング層の出力を受け取るロジスティック回帰層(logistic regression layer)とを含んでいる。
【0323】
次いで
図46を参照すると、LSTMセル4600の実施形態を図示するブロック図が示される。
【0324】
LSTMセル4600は、示されるように、メモリセル入力(X)、メモリセル出力(H)、入力ゲート(I)、出力ゲート(O)、忘却ゲート(F)、セル状態(C)、及び候補セル状態(C’)を含む。入力ゲート(I)は、メモリセル入力(X)をセル状態(C)にゲートし、出力ゲート(O)は、セル状態(C)をメモリセル出力(H)にゲートする。セル状態(C)は、時間ステップの候補セル状態(C’)としてフィードバックされる。忘却ゲート(F)は、フィードバックされた候補セル状態(C’)をゲートし、それが次の時間ステップのセル状態(C)になる。
【0325】
図46の実施形態では、以下の式が、上記で指定された様々な値を計算するために使用される。
【0326】
(1)I=SIGMOID(Wi*X+Ui*H+Bi)
【0327】
(2)F=SIGMOID(Wf*X+Uf*H+Bf)
【0328】
(3)C’=TANH(Wc*X+Uc*H+Bc)
【0330】
(5)O=SIGMOID(Wo*X+Uo*H+Bo)
【0332】
Wi及びUiは、入力ゲート(I)に関連付けられた重み値であり、Biは、入力ゲート(I)に関連付けられたバイアス値である。Wf及びUfは、忘却ゲート(F)に関連付けられた重み値であり、Bfは、忘却ゲート(F)に関連付けられたバイアス値である。Wo及びUoは、出力ゲート(O)に関連付けられた重み値であり、Boは、出力ゲート(O)に関連付けられたバイアス値である。示されるように、式(1)、(2)、及び(5)は、それぞれ入力ゲート(I)、忘却ゲート(F)、及び出力ゲート(O)を計算する。式(3)は、候補セル状態(C’)を計算し、式(4)は、現在のセル状態(C)を入力として使用して、すなわち現在の時間ステップのセル状態(C)を使用して、候補セル状態(C’)を計算する。式(6)は、セル出力(H)を計算する。入力ゲート、忘却ゲート、出力ゲート、候補セル状態、セル状態、及びセル出力に異なる計算を用いるLSTMセルの他の実施形態が企図される。
【0333】
本開示の目的には、LSTMセルは、メモリセル入力、メモリセル出力、セル状態、候補セル状態、入力ゲート、出力ゲート、及び忘却ゲートを備える。時間ステップごとに、入力ゲート、出力ゲート、忘却ゲート、及び候補セル状態は、現在の時間ステップのメモリセル入力及び前の時間ステップのメモリセル出力、並びに関連する重みの関数である。時間ステップのセル状態は、前の時間ステップのセル状態、候補セル状態、入力ゲート、及び忘却ゲートの関数である。この意味で、セル状態は、フィードバックされ、次の時間ステップのセル状態の算出で使用される。時間ステップのメモリセル出力は、その時間ステップに対して計算されるセル状態及び出力ゲートの関数である。LSTMネットワークは、LSTMセルの層を含んでいるニューラルネットワークである。
【0334】
次いで
図47を参照すると、NNU121が
図46の128個のLSTMセル4600の層に関連する算出を行う際の、NNU121のデータRAM122及び重みRAM124内のデータのレイアウトの例を図示するブロック図が示される。
図47の例では、NNU121は、例えばワイド構成において、512個のNPU126又はニューロンとして構成されるが、128個のNPU126(例えば、NPU0〜127)のみによって生成される値が使用される。これは、この例では、LSTM層には128個のLSTMセル4600しかないためである。
【0335】
示されるように、重みRAM124は、NNU121の対応するNPU0〜127についての重み、バイアス、及び中間値を保持する。重みRAM124の列0〜127は、NNU121の対応するNPU0〜127についての重み、バイアス、及び中間値を保持する。行0〜14は各々、NPU0〜127に提供するための上記の式(1)〜(6)の以下のそれぞれの値、すなわち、Wi、Ui、Bi、Wf、Uf、Bf、Wc、Uc、Bc、C’、TANH(C)、C、Wo、Uo、Boを128個保持する。好ましくは、重み及びバイアス値、すなわち、Wi、Ui、Bi、Wf、Uf、Bf、Wc、Uc、Bc、Wo、Uo、Bo(行0〜8及び12〜14)は、プロセッサ100で稼働しているアーキテクチャプログラムによりMTNN命令1400を介して重みRAM124に書き込まれ/投入され、
図48の非アーキテクチャプログラムなど、NNU121で稼働している非アーキテクチャプログラムによって読み出される/使用される。好ましくは、下記でより詳細に説明するように、中間値、すなわちC’、TANH(C)、C(行9〜11)は、重みRAM124に書き込まれ/投入され、また、NNU121で稼働している非アーキテクチャプログラムによって読み出される/使用される。
【0336】
示されるように、データRAM122は、時間ステップの連続について、入力(X)、出力(H)、入力ゲート(I)、忘却ゲート(F)、及び出力ゲート(O)の値を保持する。より具体的には、5つの行からなる五つ組が、所与の時間ステップについてのX、H、I、F、及びO値を保持する。データRAM122が64行を有する一実施形態では、データRAM122は、示されるように、12個の異なる時間ステップについてのセル値を保持することができる。
図47の例では、行0〜4は、時間ステップ0のセル値を保持し、行5〜9は時間ステップ1のセル値を保持し、以下同様に続き、行55〜59は時間ステップ11のセル値を保持する。五つ組のうち第1の行は、その時間ステップのX値を保持する。五つ組のうち第2の行は、その時間ステップのH値を保持する。五つ組のうち第3の行は、その時間ステップのI値を保持する。五つ組のうち第4の行は、その時間ステップのF値を保持する。五つ組のうち第5の行は、その時間ステップのO値を保持する。示されるように、データRAM122の各列は、それに対応するニューロン、又はNPU126の値を保持する。すなわち、下記で
図48に関連してより詳細に説明するように、列0は、計算がNPU0によって行われるLSTMセル0に関連付けられた値を保持し、列1は、計算がNPU1によって行われるLSTMセル1に関連付けられた値を保持し、以下同様に続き、列127は、計算がNPU127によって行われるLSTMセル127に関連付けられた値を保持する。
【0337】
好ましくは、X値(行0、5、9、及び以下同様に55まで)は、プロセッサ100で稼働しているアーキテクチャプログラムにより、MTNN命令1400を介してデータRAM122に書き込まれ/投入され、
図48の非アーキテクチャプログラムなど、NNU121で稼働している非アーキテクチャプログラムによって読み出される/使用される。好ましくは、下記でより詳細に説明するように、I、F、及びO値(行2/3/4、7/8/9、12/13/14、及び以下同様に57/58/59まで)は、データRAM122に書き込まれ/投入され、また、NNU121で稼働している非アーキテクチャプログラムにより、読み出される/使用される。好ましくは、H値(行1、6、10、及び以下同様に56まで)は、データRAM122に書き込まれ/投入され、また、NNU121で稼働している非アーキテクチャプログラムによって読み出され/使用され、プロセッサ100で稼働しているアーキテクチャプログラムにより、MFNN命令1500を介して読み出される。
【0338】
図47の例は、アーキテクチャプログラムが、(1)データRAM122に、12個の異なる時間ステップについての入力X値を投入し(行0、5、及び以下同様に55まで)、(2)
図48の非アーキテクチャプログラムを開始し、(3)非アーキテクチャプログラムが完了したことを検出し、(4)データRAM122から出力H値(行1、6、及び以下同様に59まで)を読み出し、(5)作業、例えば携帯電話のユーザによってなされた発話の認識を行うために使用される計算を完了するのに必要とされる回数だけステップ(1)〜(4)を繰り返す、と仮定する。
【0339】
代替の一手法では、アーキテクチャプログラムは、(1)データRAM122に、単一の時間ステップの入力X値を投入し(例えば、行0)、(2)非アーキテクチャプログラム(ループを必要とせず、データRAM122の行の単一の五つ組にアクセスする、
図48の変更を加えられたバージョン)を開始し、(3)非アーキテクチャプログラムが完了したことを検出し、(4)データRAM122から出力H値(例えば、行1)を読み出し、(5)作業を完了するのに必要とされる回数だけステップ(1)〜(4)を繰り返す。LSTM層への入力X値がサンプリングされる仕方に依存して、上記2つの手法のうちいずれかがより好ましい可能性がある。例えば、作業が、入力を複数の時間ステップ(例えば、12前後)にわたってサンプリングし、計算を行うことを許容する場合には、第1の手法が好ましい可能性がある。それは、その方が計算リソースが効率的で、且つ/又は性能が高い可能性が高いためである。対して、作業が単一の時間ステップでのサンプリングしか許容できない場合は、第2の手法が要求される可能性がある。
【0340】
第3の実施形態が企図され、これは第2の手法に似るが、データRAM122の行の五つ組を1つだけ使用するのではなく、非アーキテクチャプログラムが、行の五つ組を複数個使用し、すなわち第1の手法と同様に時間ステップごとに異なる五つ組を使用する。第3の実施形態では、好ましくは、アーキテクチャプログラムは、ステップ(2)の前に、例えば、アドレス0の命令内のデータRAM122の行を、次の五つ組をポイントするように更新することにより、非アーキテクチャプログラムを開始する前にそれを更新するステップを含む。
【0341】
次いで
図48を参照すると、NNU121のプログラムメモリ129に記憶されNNU121によって実行されて、LSTMセル層に関連し、
図47の編成によるデータ及び重みを使用する計算を達成するプログラムを図示する表が示される。
図48の例示的プログラムは、アドレス0〜23に24個の非アーキテクチャ命令を含んでいる。アドレス0の命令(INITIALIZE NPU,CLR ACC,LOOPCNT=12,DR IN ROW=−1,DR OUT ROW=2)は、累算器202をクリアし、ループカウンタ3804を12の値に初期化して、ループ本体(アドレス1〜22の命令)を12回行わせる。この初期化命令はさらに、読み出されるデータRAM122行(例えば、
図26/39のレジスタ2608)を−1の値に初期化し、この値は、アドレス1の命令の1回目の実行インスタンスによってゼロに増分されることになる。初期化命令はさらに、書き込まれるデータRAM122行(例えば、
図26/39のレジスタ2606)を行2に初期化する。好ましくは、初期化命令はさらに、NNU121をワイド構成にして、NNU121が512個のNPU126として構成されるようにする。下記の説明から観察できるように、512個のNPU126のうち128個が、アドレス0〜23の命令の実行中に、128個のLSTMセル4600に対応し、128個のLSTMセル4600として動作する。
【0342】
図47に示されるように、アドレス1〜4の命令の1回目の実行インスタンス中、128個のNPU126(すなわち、NPU126 0〜127)の各々は、第1の時間ステップ(時間ステップ0)についての各自の対応するLSTMセル4600の入力ゲート(I)値を計算し、そのI値を、データRAM122の行2の対応するワードに書き込む。アドレス1〜4の命令の2回目の実行インスタンス中、128個のNPU126の各々は、第2の時間ステップ(時間ステップ1)についての各自の対応するLSTMセル4600のI値を計算し、そのI値を、データRAM122の行7の対応するワードに書き込む。以下同様に続き、最後、アドレス1〜4の命令の12回目の実行インスタンス中、128個のNPU126の各々は、第12の時間ステップ(時間ステップ11)について各自の対応するLSTMセル4600のI値を計算し、そのI値を、データRAM122の行57の対応するワードに書き込む。
【0343】
より具体的には、アドレス1の積和命令は、現在の時間ステップに関連付けられたセル入力(X)値を含んでいる現在のデータRAM122行の後の次の行(1回目の実行インスタンス時は行0、2回目の実行インスタンス時は行5、及び以下同様に12回目の実行インスタンス時は行55)を読み出し、Wi値を含んでいる重みRAM124の行0を読み出し、それらを乗算して、累算器202に累算される第1の積を生成し、累算器202は、アドレス0の初期化命令又はアドレス22の命令のどちらかによってちょうどクリアされている。次に、アドレス2の積和命令が、現在の時間ステップに関連付けられたセル出力(H)値を含んでいる次のデータRAM122行(1回目の実行インスタンス時は行1、2回目の実行インスタンス時は行6、及び以下同様に12回目の実行インスタンスの行56)を読み出し、Ui値を含んでいる重みRAM124の行1を読み出し、それらを乗算して、累算器202に加算される第2の積を生成する。アドレス2の命令(並びにアドレス6、10、及び18の命令)によってデータRAM122から読み出される現在の時間ステップに関連付けられているH値は、前の時間ステップの間に生成され、アドレス22の出力命令によってデータRAM122に書き込まれたものであるが、アドレス2の命令の1回目の実行インスタンス時の場合には、データRAM122の行1にあるH値には初期値が書き込まれている。好ましくは、アーキテクチャプログラムは、
図48の非アーキテクチャプログラムを開始する前に、(例えば、MTNN命令1400を使用して)初期H値をデータRAM122の行1に書き込む。ただし、非アーキテクチャプログラムが初期H値をデータRAM122の行1に書き込む初期命令を含んでいる他の実施形態が企図される。一実施形態では、初期H値はゼロである。次に、アドレス3の重みワードを累算器に加算する命令(ADD_W_ACC WR ROW 2)が、Bi値を含んでいる重みRAM124の行2を読み出し、それらを累算器202に加算する。最後、アドレス4の出力命令(OUTPUT SIGMOID,DR OUT ROW+0,CLR ACC)がシグモイド活性化関数を累算器202値に行い、その結果を現在のデータRAM122の出力行(1回目の実行インスタンスでは行2、2回目の実行インスタンスでは行7、及び以下同様に12回目の実行インスタンスでは行57)に書き込み、累算器202をクリアする。
【0344】
図47に示されるように、アドレス5〜8の命令の1回目の実行インスタンス中、128個のNPU126の各々は、第1の時間ステップ(時間ステップ0)についての各自の対応するLSTMセル4600の忘却ゲート(F)値を計算し、そのF値を、データRAM122の行3の対応するワードに書き込む。アドレス5〜8の命令の2回目の実行インスタンス中、128個のNPU126の各々は、第2の時間ステップ(時間ステップ1)についての各自の対応するLSTMセル4600のF値を計算し、そのF値を、データRAM122の行8の対応するワードに書き込む。以下同様に続き、最後、アドレス5〜8の命令の12回目の実行インスタンス中、128個のNPU126の各々は、第12の時間ステップ(時間ステップ11)についての各自の対応するLSTMセル4600のF値を計算し、そのF値を、データRAM122の行58の対応するワードに書き込む。アドレス5〜8の命令は、上記のアドレス1〜4の命令と同じようにしてF値を計算するが、アドレス5〜7の命令は、Wf、Uf、及びBf値を、重みRAM124のそれぞれ行3、4、及び5から読み出して、乗算及び/又は加算演算を行う。
【0345】
アドレス9〜12の命令の12回の実行インスタンス中、128個のNPU126の各々は、対応する時間ステップについての各自の対応するLSTMセル4600の候補セル状態(C’)値を計算し、そのC’値を、重みRAM124の行9の対応するワードに書き込む。アドレス9〜12の命令は、上記のアドレス1〜4の命令と同じようにしてC’値を計算するが、アドレス9〜11の命令は、Wc、Uc、及びBc値を、重みRAM124のそれぞれ行6、7、及び8から読み出して乗算及び/又は加算演算を行う。加えて、アドレス12の出力命令は、シグモイド活性化関数(アドレス4の出力命令が行うように)ではなく、tanh活性化関数を行う。
【0346】
より具体的には、アドレス9の積和命令は、現在の時間ステップに関連付けられたセル入力(X)値を含んでいる現在のデータRAM122行(1回目の実行インスタンス時は行0、2回目の実行インスタンス時は行5、及び以下同様に12回目の実行インスタンス時の行55)を読み出し、Wc値を含んでいる重みRAM124の行6を読み出し、それらを乗算して、累算器202に累算される第1の積を生成し、累算器202は、アドレス8の命令によってちょうどクリアされている。次に、アドレス10の積和命令は、現在の時間ステップに関連付けられたセル出力(H)値を含んでいる次のデータRAM122行(1回目の実行インスタンス時は行1、2回目の実行インスタンス時は行6、及び以下同様に12回目の実行インスタンスの行56)を読み出し、Uc値を含んでいる重みRAM124の行7を読み出し、それらを乗算して、累算器202に加算される第2の積を生成する。次に、アドレス11の重みワードを累算器に加算する命令が、Bc値を含んでいる重みRAM124の行8を読み出し、それらを累算器202に加算する。最後、アドレス12の出力命令(OUTPUT TANH,WR OUT ROW 9,CLR ACC)がtanh活性化関数を累算器202値に行い、その結果を重みRAM124の行9に書き込み、累算器202をクリアする。
【0347】
アドレス13〜16の命令の12回の実行インスタンス中、128個のNPU126の各々は、対応する時間ステップについての各自の対応するLSTMセル4600の新しいセル状態(C)値を計算し、新しいC値を、重みRAM124の行11の対応するワードに書き込み、tanh(C)を計算し、それを重みRAM124の行10の対応するワードに書き込む。より具体的には、アドレス13の積和命令は、現在の時間ステップに関連付けられた入力ゲート(I)値を含んでいる現在のデータRAM122行の後の次の行(1回目の実行インスタンス時は行2、2回目の実行インスタンス時は行7、及び以下同様に12回目の実行インスタンスの行57)を読み出し、候補セル状態(C’)値(アドレス12の命令によって直前に書き込まれた)を含んでいる重みRAM124の行9を読み出し、それらを乗算して、累算器202に累算される第1の積を生成し、累算器202は、アドレス12の命令によってちょうどクリアされている。次に、アドレス14の積和命令が、現在の時間ステップに関連付けられた忘却ゲート(F)値を含んでいる次のデータRAM122行(1回目の実行インスタンス時は行3、2回目の実行インスタンス時は行8、及び以下同様に12回目の実行インスタンスの行58)を読み出し、前の時間ステップに計算された現在のセル状態(C)値(アドレス15の命令の一番最近の実行インスタンスによって書き込まれた)を含んでいる重みRAM124の行11を読み出し、それらを乗算して、累算器202に加算される第2の積を生成する。次に、アドレス15の出力命令(OUTPUT PASSTHRU,WR OUT ROW11)が、累算器202値をパススルーし、それらを重みRAM124の行11に書き込む。アドレス14の命令によってデータRAM122の行11から読み出されるC値は、アドレス13〜15の命令の一番最近の実行インスタンスによって生成され、書き込まれたC値であることを理解されたい。アドレス15の出力命令は、累算器202をクリアせず、そのため、累算器202の値はアドレス16の命令により使用することができる。最後、アドレス16の出力命令(OUTPUT TANH,WR OUT ROW 10,CLR ACC)は、tanh活性化関数を累算器202値に行い、その結果を、セル出力(H)値を計算するアドレス21の命令による使用のために、重みRAM124の行10に書き込む。アドレス16の命令は、累算器202をクリアする。
【0348】
図47に示されるように、アドレス17〜20の命令の1回目の実行インスタンス中、128個のNPU126の各々は、第1の時間ステップ(時間ステップ0)についての各自の対応するLSTMセル4600の出力ゲート(O)値を計算し、そのO値を、データRAM122の行4の対応するワードに書き込む。アドレス17〜20の命令の2回目の実行インスタンス中、128個のNPU126の各々は、第2の時間ステップ(時間ステップ1)についての各自の対応するLSTMセル4600のO値を計算し、そのO値を、データRAM122の行9の対応するワードに書き込む。以下同様に続き、最後、アドレス17〜20の命令の12回目の実行インスタンス中、128個のNPU126の各々は、第12の時間ステップ(時間ステップ11)についての各自の対応するLSTMセル4600のO値を計算し、そのO値を、データRAM122の行58の対応するワードに書き込む。アドレス17〜20の命令は、上記のアドレス1〜4の命令と同じようにしてO値を計算するが、アドレス17〜19の命令は、Wo、Uo、及びBo値を、重みRAM124のそれぞれ行12、13、及び14から読み出して乗算及び/又は加算演算を行う。
【0349】
図47に示されるように、アドレス21〜22の命令の1回目の実行インスタンス中、128個のNPU126の各々は、第1の時間ステップ(時間ステップ0)についての各自の対応するLSTMセル4600のセル出力(H)値を計算し、そのH値を、データRAM122の行6の対応するワードに書き込む。アドレス21〜22の命令の2回目の実行インスタンス中、128個のNPU126の各々は、第2の時間ステップ(時間ステップ1)についての各自の対応するLSTMセル4600のH値を計算し、そのH値を、データRAM122の行11の対応するワードに書き込む。以下同様に続き、最後、アドレス21〜22の命令の12回目の実行インスタンス中、128個のNPU126の各々は、第12の時間ステップ(時間ステップ11)についての各自の対応するLSTMセル4600のH値を計算し、そのH値を、データRAM122の行60の対応するワードに書き込む。
【0350】
より具体的には、アドレス21の積和命令は、現在の時間ステップに関連付けられた出力ゲート(O)値を含んでいる現在のデータRAM122行の3つ後の行(1回目の実行インスタンス時は行4、2回目の実行インスタンス時は行9、及び以下同様に12回目の実行インスタンス時は行59)を読み出し、tanh(C)値(アドレス16の命令によって書き込まれた)を含んでいる重みRAM124の行10を読み出し、それらを乗算して、累算器202に累算される積を生成し、累算器202は、アドレス20の命令によってちょうどクリアされている。そして、アドレス22の出力命令が、累算器202値をパススルーし、それらをデータRAM122の2つ後の出力行11(1回目の実行インスタンス時は行6、2回目の実行インスタンス時は行11、及び以下同様に12回目の実行インスタンス時は行61)に書き込み、累算器202をクリアする。アドレス22の命令によってデータRAM122の行(1回目の実行インスタンス時は行6、2回目の実行インスタンス時は行11、及び以下同様に12回目の実行インスタンスの行61)に書き込まれるH値は、アドレス2、6、10、及び18の命令の次の実行インスタンスによって消費される/読み出されるH値であることを理解されたい。ただし、12回目の実行インスタンスの行61に書き込まれるH値は、アドレス2、6、10、及び18の命令の実行インスタンスによって消費されず/読み出されず、むしろ、好ましくはアーキテクチャプログラムによって消費される/読み出される。
【0351】
アドレス23の命令(LOOP 1)は、ループカウンタ3804を減分し、新しいループカウンタ3804値がゼロより大きい場合には、アドレス1の命令にループバックする。
【0352】
次いで
図49を参照すると、出力バッファのマスキングとNPUグループ内のフィードバック能力を伴うNNU121の一実施形態を図示するブロック図が示される。
図49は、4つのNPU126からなる単一のNPUグループ4901を図示している。
図49は、単一のNPUグループ4901を図示するが、NNU121のNPU126各々はNPUグループ4901に含まれており、そのためN/J個のNPUグループ4901があり、NはNPU126の数であり(例えば、ワイド構成では512、又はナロー構成では1024)、Jは、グループ4901中のNPU126の数(例えば、
図49の実施形態では4)であることを理解されたい。
図49は、NPUグループ4901の4つのNPU126を、NPU0、NPU1、NPU2、及びNPU3として参照している。
【0353】
図49の実施形態における各NPU126は、上記で
図7に関連して説明したNPU126と似ており、同様の参照符号を付した要素は類似する。ただし、mux−reg208は、4つの追加的な入力4905を含むように変更を加えられ、mux−reg705は、4つの追加的な入力4907を含むように変更を加えられ、選択入力213は、出力209での提供について元の入力211及び207並びに追加的な入力4905の中から選択するように変更を加えられ、選択入力713は、出力203での提供について元の入力711及び206並びに追加的な入力4907の中から選択するように変更を加えられている。
【0354】
図49で出力バッファ1104として参照される、
図11の行バッファ1104の一部が示されている。より具体的には、出力バッファ1104のワード0、1、2、及び3が示されており、これらは、NPU0、1、2、及び3に関連付けられた4つのAFU212のそれぞれの出力を受け取る。NPUグループ4901に対応するN個のワードを含む出力バッファ1104の部分を、出力バッファワードグループと呼ぶ。
図49の実施形態では、Nは4である。出力バッファ1104の4つのワードは、mux−reg208への4つの追加的な入力4905として、及びmux−reg705への4つの追加的な入力4907として、フィードバックされ、受け取られる。出力バッファワードグループをそれぞれのNPUグループ4901にフィードバックすることにより、非アーキテクチャプログラムの算術命令が、自身の入力として、NPUグループ4901に関連付けられた出力バッファ1104の(すなわち出力バッファワードグループの)ワードのうち1つ又は2つを選択する能力がもたらされ、その例は、下記で
図51の例えばアドレス4、8、11、12、及び15にある非アーキテクチャプログラムとの関連で説明する。すなわち、非アーキテクチャ命令内で指定される出力バッファ1104のワードが、選択入力213/713に生成される値を決定する。この能力により、効果的に出力バッファ1104がいわばスクラッチパッドメモリの役割を果たすことができ、それにより、非アーキテクチャプログラムが、例えば中間的に生成され使用される値の、データRAM122及び/又は重みRAM124への書き込みと、その後行われるそれらからの読み出しの回数を減らせる可能性がある。好ましくは、出力バッファ1104、又は行バッファ1104が、1024個のナローワード又は512個のワイドワードのどちらかを記憶するように構成できるレジスタの1次元アレイを備える。好ましくは、出力バッファ1104は、1クロックサイクルで読み出され、1クロックサイクルで書き込まれることが可能である。アーキテクチャプログラムと非アーキテクチャプログラムの両方からアクセスできるデータRAM122及び重みRAM124と異なり、出力バッファ1104は、アーキテクチャプログラムによってアクセス可能でなく、代わりに、非アーキテクチャプログラムによってのみアクセス可能である。
【0355】
出力バッファ1104は、マスク入力4903を受け取るように変更を加えられている。好ましくは、マスク入力4903は、NPUグループ4901の4つのNPU126に関連付けられた出力バッファ1104の4つのワードに対応する4ビットを含む。好ましくは、出力バッファ1104のワードに対応するマスク入力4903のビットが真である場合、出力バッファ1104の該ワードは現在の値を保有し、そうでない場合、出力バッファ1104の該ワードは、AFU212の出力で更新される。すなわち、出力バッファ1104のワードに対応するマスク入力4903のビットが偽である場合は、AFU212の出力が、出力バッファ1104の該ワードに書き込まれる。これは、非アーキテクチャプログラムの出力命令が、AFU212の出力を出力バッファ1104のいくつかのワードに選択的に書き込みをし、出力バッファ1104の他のワードの現在の値を保有する能力をもたらす。この例については、下記で、
図51の非アーキテクチャプログラムの、例えばアドレス6、10、13、及び14の命令に関連して説明する。すなわち、非アーキテクチャ命令で指定される出力バッファ1104のワードが、マスク入力4903に生成される値を決定する。
【0356】
簡潔のために、
図49は、mux−reg208/705への入力1811(例えば、
図18、
図19、及び
図23の)は示していない。しかし、動的に構成可能なNPU126及び出力バッファ1104のフィードバック/マスキングの両方をサポートする実施形態が企図される。好ましくは、そのような実施形態では、出力バッファワードグループはそれに応じて動的に構成可能である。
【0357】
NPUグループ4901内のNPU126の数が4である実施形態を説明するが、この数がそれより多い又は少ない他の実施形態が企図されることを理解されたい。さらに、
図52に示すような共有AFU1112を含んでいる実施形態では、NPUグループ4901内のNPU126の数と、AFU212グループ内のNPU126の数との間に相乗作用的な関係があってよい。出力バッファ1104のマスキング及びNPUグループ内のフィードバック能力は、
図50及び
図51に関連してより詳細に説明するように、LSTMセル4600に関連する計算を効率的に行うために特に有益である。
【0358】
次いで
図50を参照すると、
図49のNNU121が
図46の128個のLSTMセル4600の層に関連する算出を行う際の、NNU121のデータRAM122、重みRAM124、及び出力バッファ1104内のデータのレイアウトの例を図示するブロック図が示される。
図50の例では、NNU121は、例えばワイド構成において、512個のNPU126、又はニューロンとして構成されている。
図47及び
図48の例と同じように、
図50及び
図51の例ではLSTM層に128個のLSTMセル4600しかない。ただし、
図50の例では、512個のNPU126(例えば、NPU0〜127)のすべてによって生成された値が使用される。有利な点として、各NPUグループ4901は、
図51の非アーキテクチャプログラムを実行するとき、集合的にLSTMセル4600として動作する。
【0359】
示されるように、データRAM122は、時間ステップの連続について、セル入力(X)値及び出力(H)値を保持する。より具体的には、2つの行からなるペアが、所与の時間ステップについてのX及びH値を保持する。データRAM122が64個の行を有する一実施形態では、データRAM122は、示されるように、31個の異なる時間ステップについてのセル値を保持することができる。
図50の例では、行2及び3が時間ステップ0の値を保持し、行4及び5が時間ステップ1のセル値を保持し、以下同様に続き、行62及び63が時間ステップ30のセル値を保持する。ペアのうち第1の行が当該時間ステップのX値を保持し、ペアのうち第2の行が当該時間ステップのH値を保持する。示されるように、データRAM122内のNPUグループ4901に対応する4つの列からなる各グループは、そのグループの対応するLSTMセル4600についての値を保持する。すなわち、下記で
図51との関連でより詳細に説明するように、列0〜3は、計算がNPU0〜3、すなわちNPUグループ0によって行われるLSTMセル0に関連付けられた値を保持し、列4〜7は、計算がNPU4〜7、すなわちNPUグループ1によって行われるLSTMセル1に関連付けられた値を保持し、以下同様に続き、列508〜511は、計算がNPU508〜511、すなわちNPUグループ127によって行われるLSTMセル127に関連付けられた値を保持する。示されるように、行1は使用されず、行0は、好ましくはアーキテクチャプログラムによってゼロ値が投入された初期セル出力(H)値を保持するが、非アーキテクチャプログラムの初期命令が行0の初期セル出力(H)値を投入する実施形態が企図される。
【0360】
好ましくは、X値(行2、4、6、及び以下同様に62まで)は、プロセッサ100で稼働しているアーキテクチャプログラムにより、MTNN命令1400を介してデータRAM122に書き込まれ/投入され、
図50の非アーキテクチャプログラムなど、NNU121で稼働している非アーキテクチャプログラムによって読み出される/使用される。好ましくは、H値(行3、5、7、及び以下同様に63まで)は、下記でより詳細に説明するように、NNU121で稼働している非アーキテクチャプログラムによって、データRAM122に書き込まれ/投入され、さらに読み出される/使用される。好ましくは、H値はさらに、プロセッサ100で稼働しているアーキテクチャプログラムによって、MFNN命令1500を介して読み出される。
図51の非アーキテクチャプログラムは、NPUグループ4901に対応する4つの列からなる各グループ(例えば、列0〜3、4〜7、5〜8、及び以下同様に508〜511まで)内で、所与の行の4つのX値が(例えば、アーキテクチャプログラムによって)同じ値を投入されると仮定していることに留意されたい。同様に、
図51の非アーキテクチャプログラムは、所与の行のNPUグループ4901に対応する4つの列からなる各グループ内で、4つのH値に対して同じ値を計算し、書き込む。
【0361】
示されるように、重みRAM124は、NNU121のNPUについての、重み、バイアス、及びセル状態(C)値を保持する。NPUグループ4901に対応する4つの列からなる各グループ(例えば、列0〜3、4〜7、5〜8、及び以下同様に508〜511まで)内で、(1)索引mod4が3に等しい列が、それぞれ行0、1、2、及び6にWc、Uc、Bc、及びC値を保持し、(2)索引mod4が2に等しい列が、それぞれ行3、4、及び5にWo、Uo、及びBo値を保持し、(3)索引mod4が1に等しい列が、それぞれ行3、4、及び5にWf、Uf、及びBf値を保持し、(4)索引mod4が0に等しい列が、それぞれ行3、4、及び5にWi、Ui、及びBi値を保持する。好ましくは、重み及びバイアス値、すなわち、Wi、Ui、Bi、Wf、Uf、Bf、Wc、Uc、Bc、Wo、Uo、Bo(行0〜5)は、プロセッサ100で稼働しているアーキテクチャプログラムにより、MTNN命令1400を介して重みRAM124に書き込まれ/投入され、
図51の非アーキテクチャプログラムなど、NNU121で稼働している非アーキテクチャプログラムによって読み出される/使用される。好ましくは、下記でより詳細に説明するように、中間C値は、NNU121で稼働している非アーキテクチャプログラムにより重みRAM124に書き込まれ/投入され、そのプログラムによって読み出される/使用される。
【0362】
図50の例は、アーキテクチャプログラムが、(1)データRAM122に31個の異なる時間ステップについての入力X値を投入し(行2、4、及び以下同様に62まで)、(2)
図51の非アーキテクチャプログラムを開始し、(3)非アーキテクチャプログラムが完了したことを検出し、(4)データRAM122から出力H値(行3、5、及び以下同様に63まで)を読み出し、(5)作業、例えば携帯電話のユーザによってなされた発話の認識を行うために使用される計算を完了するのに必要とされる回数だけステップ(1)〜(4)を繰り返す、と仮定している。
【0363】
代替の一手法では、アーキテクチャプログラムは、(1)データRAM122に単一の時間ステップの入力X値を投入し(例えば、行2)、(2)非アーキテクチャプログラム(ループを必要とせず、データRAM122行の単一のペアにアクセスする、
図51の変更を加えられたバージョン)を開始し、(3)非アーキテクチャプログラムが完了したことを検出し、(4)データRAM122から出力H値(例えば、行3)を読み出し、(5)作業を完了するのに必要とされる回数だけステップ(1)〜(4)を繰り返す。LSTM層への入力X値がサンプリングされる仕方に応じて、上記2つの手法のうちいずれかがより好ましい可能性がある。例えば、作業が、入力を複数の時間ステップ(例えば、31前後)にわたってサンプリングし、計算を行うことを許容する場合には、第1の手法が好ましい可能性がある。それは、その方が計算リソースが効率的で、且つ/又は性能が高い可能性が高いためである。対して、作業が単一の時間ステップでのサンプリングしか許容できない場合は、第2の手法が要求される可能性がある。
【0364】
第3の実施形態が企図され、これは第2の手法に似るが、データRAM122行のペアを1つだけ使用するのではなく、非アーキテクチャプログラムが行のペアを複数個使用し、すなわち第1の手法と同様に時間ステップごとに異なるペアを使用する。第3の実施形態では、好ましくは、アーキテクチャプログラムは、ステップ(2)の前に、例えば、アドレス1の命令内のデータRAM122行を、次のペアをポイントするように更新することにより、非アーキテクチャプログラムを開始する前にそれを更新するステップを含む。
【0365】
示されるように、出力バッファ1104は、示されるように、
図51の非アーキテクチャプログラムの種々のアドレスにある命令の実行後、NNU121の対応するNPU0〜511について、セル出力(H)、候補セル状態(C’)、入力ゲート(I)、忘却ゲート(F)、出力ゲート(O)、セル状態(C)、及びtanh(C)の中間値を保持している。各出力バッファワードグループ(例えば、NPUグループ4901に対応する出力バッファ1104の4つのワードからなるグループ、例えば、ワード0〜3、4〜7、5〜8、及び以下同様に508〜511)の中で、索引mod4が3に等しいワードをOUTBUF[3]と参照し、索引mod4が2に等しいワードをOUTBUF[2]と参照し、索引mod4が1に等しいワードをOUTBUF[1]と参照し、索引mod4が0に等しいワードをOUTBUF[0]と参照する。
【0366】
示されるように、
図51の非アーキテクチャプログラムのアドレス2の命令の実行後、各NPUグループ4901について、出力バッファ1104の4つのワードすべてが、対応するLSTMセル4600の初期セル出力(H)値を書き込まれている。アドレス6の命令の実行後、各NPUグループ4901について、OUTBUF[3]は、対応するLSTMセル4600の候補セル状態(C’)値を書き込まれており、出力バッファ1104のその他の3つのワードは各自の以前の値を保有している。アドレス10の命令の実行後、各NPUグループ4901について、対応するLSTMセル4600について、OUTBUF[0]は入力ゲート(I)値を書き込まれ、OUTBUF[1]は忘却ゲート(F)値を書き込まれ、OUTBUF[2]は出力ゲート(O)値を書き込まれており、OUTBUF[3]は、以前の値を保有している。アドレス13の命令の実行後、各NPUグループ4901について、OUTBUF[3]は、対応するLSTMセル4600の新しいセル状態(C)値を書き込まれており(スロット3にC値を含んでいる出力バッファ1104は、重みRAM124の行6に書き込まれるため。これについては
図51に関連して下記でより詳細に説明する)、出力バッファ1104のその他の3つのワードは各自の以前の値を保有している。アドレス14の命令の実行後、各NPUグループ4901について、OUTBUF[3]は、対応するLSTMセル4600のtanh(C)値を書き込まれており、出力バッファ1104のその他の3つのワードは各自の以前の値を保有している。アドレス16の命令の実行後、各NPUグループ4901について、出力バッファ1104の4つのワードすべてが、対応するLSTMセル4600の新しいセル出力(H)値を書き込まれている。このパターンは、プログラムがアドレス17でアドレス3にループバックするのに伴って、アドレス6からアドレス16まで(すなわち、プログラムループの外側にあるためアドレス2における実行を除く)、もう30回繰り返す。
【0367】
次いで
図51を参照すると、
図49のNNU121のプログラムメモリ129に記憶され、NNU121によって実行されて、LSTMセル層に関連し、
図50の編成によるデータ及び重みを使用する計算を達成するプログラムを図示する表が示される。
図51の例示的プログラムは、アドレス0〜17に18個の非アーキテクチャ命令を含んでいる。アドレス0の命令は、累算器202をクリアし、ループカウンタ3804を31の値に初期化して、ループ本体(アドレス1〜17の命令)を31回行わせる初期化命令である。この初期化命令はさらに、書き込まれるデータRAM122の行(例えば、
図26/39のレジスタ2606)を1の値に初期化し、この値は、アドレス16の命令の1回目の実行インスタンスで3に増分されることになる。好ましくは、初期化命令はさらに、NNU121をワイド構成にして、NNU121が512個のNPU126として構成されるようにする。下記の説明から観察できるように、512個のNPU126の128個のNPUグループ4901の各々は、アドレス0〜17の命令の実行中、128個のLSTMセル4600の1つに対応し、128個のLSTMセル4600の1つとして動作する。
【0368】
アドレス1及び2の命令はループ本体の外側であり、一度だけ実行される。それらの命令は、初期セル出力(H)値(例えば、ゼロ値)を生成し、それを出力バッファ1104のすべてのワードに書き込む。アドレス1の命令は、データRAM122の行0から初期H値を読み出し、それを累算器202に入れ、累算器202は、アドレス0の命令によってクリアされている。アドレス2の命令(OUTPUT PASSTHRU,NOP,CLR ACC)は、
図50に示されるように、累算器202値を出力バッファ1104にパススルーする。アドレス2の出力命令(及び
図51の他の出力命令)中の「NOP」の表記は、出力される値が出力バッファ1104だけに書き込まれ、メモリには書き込まれず、すなわちデータRAM122にも重みRAM124にも書き込まれないことを意味する。アドレス2の命令はさらに、累算器202をクリアする。
【0369】
アドレス3〜17の命令はループ本体の内側であり、ループカウントの回数(例えば、31)だけ実行される。
【0370】
アドレス3〜6の命令の各実行インスタンスは、現在の時間ステップのtanh(C’)値を計算し、OUTBUF[3]に書き込み、この値は、アドレス11の命令によって使用されることになる。より具体的には、アドレス3の積和命令は、当該時間ステップに関連付けられたセル入力(X)値を、現在のデータRAM122の読み出し行(例えば、2、4、6及び以下同様に62まで)から読み出し、Wc値を重みRAM124の行0から読み出し、それらを乗算して、累算器202に加算される積を生成し、累算器202は、アドレス2の命令でクリアされている。
【0371】
アドレス4の積和命令(MULT−ACCUM OUTBUF[0],WR ROW 1)は、OUTBUF[0]からH値を読み出し(すなわちNPUグループ4901の4つのNPU126すべて)、重みRAM124の行1からUc値を読み出し、それらを乗算して、累算器202に加算される第2の積を生成する。
【0372】
アドレス5の重みワードを累算器に加算する命令(ADD_W_ACC WR ROW2)は、重みRAM124の行2からBc値を読み出し、それらを累算器202に加算する。
【0373】
アドレス6の出力命令(OUTPUT TANH、NOP,MASK[0:2],CLR ACC)は、tanh活性化関数を累算器202値に行い、その結果は、OUTBUF[3]だけに書き込まれ(すなわち、NPUグループ4901の中で索引mod4が3に等しいNPU126だけが結果を書き込む)、累算器202がクリアされる。すなわち、アドレス6の出力命令は、
図50に示されるように、OUTBUF[0]、OUTBUF[1]、及びOUTBUF[2]をマスクして(MASK[0:2]の表記法で示されるように)、それらに各自の現在の値を保有させる。加えて、アドレス6の出力命令は、メモリへの書き込みをしない(NOPの表記法で示されるように)。
【0374】
アドレス7〜10の命令の各実行インスタンスは、現在の時間ステップの入力ゲート(I)、忘却ゲート(F)、及び出力ゲート(O)値を計算して、それぞれOUTBUF[0]、OUTBUF[1]、OUTBUF[2]に書き込み、それらの値は、それぞれアドレス11、12、及び15の命令によって使用されることになる。より具体的には、アドレス7の積和命令は、当該時間ステップに関連付けられたセル入力(X)値を現在のデータRAM122の読み出し行(例えば、2、4、6、及び以下同様に62まで)から読み出し、重みRAM124の行3からWi、Wf、及びWo値を読み出し、それらを乗算して、累算器202に加算される積を生成し、累算器202は、アドレス6の命令によってクリアされている。より具体的には、NPUグループ4901の中で、索引mod4が0に等しいNPU126がXとWiの積を計算し、索引mod4が1に等しいNPU126がXとWfの積を計算し、索引mod4が2に等しいNPU126がXとWoの積を計算する。
【0375】
アドレス8の積和命令は、OUTBUF[0]からH値を読み出し(すなわちNPUグループ4901の4つのNPU126すべて)、重みRAM124の行4からUi、Uf、及びUo値を読み出し、それらを乗算して、累算器202に加算される第2の積を生成する。より具体的には、NPUグループ4901の中で、索引mod4が0に等しいNPU126がHとUiの積を計算し、索引mod4が1に等しいNPU126がHとUfの積を計算し、索引mod4が2に等しいNPU126がHとUoの積を計算する。
【0376】
アドレス9の重みワードを累算器に加算する命令は、重みRAM124の行5からBi、Bf、及びBo値を読み出し、それらを累算器202に加算する。より具体的には、NPUグループ4901の中で、索引mod4が0に等しいNPU126がBi値を加算し、索引mod4が1に等しいNPU126がBf値を加算し、索引mod4が2に等しいNPU126がBo値を加算する。
【0377】
アドレス10の出力命令(OUTPUT SIGMOID,NOP,MASK[3],CLR ACC)は、シグモイド活性化関数を累算器202値に行い、計算されたI、F、及びO値をそれぞれOUTBUF[0]、OUTBUF[1]、及びOUTBUF[2]に書き込み、メモリには書き込まずに累算器202をクリアする。すなわち、アドレス10の出力命令は、
図50に示されるように、OUTBUF[3]をマスクして(MASK[3]の表記法で示されるように)、それに現在の値(C’である)を保有させる。
【0378】
アドレス11〜13の命令の各実行インスタンスは、現在の時間ステップで生成された新しいセル状態(C)値を計算し、重みRAM124の行6、より具体的には、NPUグループ4901に対応する4つの列のうち索引mod4が3に等しい行6のワードに書き込み、それは次の時間ステップに(すなわち、次のループ反復中にアドレス12の命令によって)使用される。加えて、アドレス14の命令の各実行インスタンスは、tanh(C)値をOUTBUF[3]に書き込み、これはアドレス15の命令によって使用されることになる。
【0379】
より具体的には、アドレス11の積和命令(MULT−ACCUM OUTBUF[0],OUTBUF[3])は、OUTBUF[0]から入力ゲート(I)値を読み出し、OUTBUF[3]から候補セル状態(C’)値を読み出し、それらを乗算して、累算器202に加算される第1の積を生成し、累算器202は、アドレス10の命令によってクリアされている。より具体的には、NPUグループ4901内の4つのNPU126の各々が、IとC’の第1の積を計算する。
【0380】
アドレス12の積和命令(MULT−ACCUM OUTBUF[1],WR ROW 6)は、NPU126に命令して、OUTBUF[1]から忘却ゲート(F)値を読み出させ、各自のワードを重みRAM124の行6から読み出させ、それらを乗算して、アドレス11の命令で生成された累算器202内の第1の積に加算される第2の積を生成する。より具体的には、行6から読み出されるワードは、NPUグループ4901の中で索引mod4が3に等しいNPU126の場合には、前の時間ステップに計算された現在のセル状態(C)値であり、そのため第1の積と第2の積との和が新しいセル状態(C)になる。しかし、行6から読み出されるワードは、NPUグループ4901中の他の3つのNPU126にとっては無関係値(don’t-care values)である。なぜならば、それらから得られる累算値はその後使用されないためであり、すなわち、アドレス13及び14の命令によって出力バッファ1104に入れられず、またアドレス14の命令によってクリアされることになるためである。すなわち、NPUグループ4901の中で索引mod4が3に等しいNPU126によって生成された、結果得られた新しいセル状態(C)値だけが、使用され、すなわちアドレス13及び14の命令を通じて使用される。アドレス12の命令の2回目〜31回目の実行インスタンスの場合は、重みRAM124の行6から読み出されるC値は、ループ本体の前の反復中にアドレス13の命令によって書き込まれたものである。しかし、アドレス12の命令の1回目の実行インスタンスでは、行6のC値は、
図51の非アーキテクチャプログラムを開始する前のアーキテクチャプログラム、又は変更を加えられたバージョンの非アーキテクチャプログラムのいずれかによって、初期値を書き込まれている。
【0381】
アドレス13の出力命令(OUTPUT PASSTHRU,WR ROW 6,MASK[0:2])は、
図50に示されるように、累算器202値、すなわち計算されたC値を、OUTBUF[3]だけにパススルーし(すなわちNPUグループ4901の中で索引mod4が3に等しいNPU126だけが計算したC値を出力バッファ1104に書き込む)、重みRAM124の行6は、更新された出力バッファ1104を書き込まれる。すなわち、アドレス13の出力命令は、OUTBUF[0]、OUTBUF[1]、及びOUTBUF[2]をマスクして、それらに各自の現在の値(I、F、及びOである)を保有させる。上記のように、NPUグループ4901に対応する4つの列からなる各グループの中で、索引mod4が3に等しい行6のワードにあるC値だけが使用され、すなわちアドレス12の命令によって使用される。したがって、非アーキテクチャプログラムは、
図50に示されるように、重みRAM124の行6の列0〜2、4〜6、及び以下同様に508〜510にある値(I、F、及びO値である)には関心を持たない。
【0382】
アドレス14の出力命令(OUTPUT TANH,NOP,MASK[0:2],CLR ACC)は、tanh活性化関数を累算器202値に行い、計算されたtanh(C)値をOUTBUF[3]に書き込み、メモリには書き込まずに累算器202をクリアする。アドレス14の出力命令は、アドレス13の出力命令と同じように、
図50に示されるように、OUTBUF[0]、OUTBUF[1]、及びOUTBUF[2]をマスクして、それらに各自の現在の値を保有させる。
【0383】
アドレス15〜16の命令の各実行インスタンスは、現在の時間ステップで生成されたセル出力(H)値を計算し、それをデータRAM122の現在の出力行の後の2つ後の行に書き込み、その値は、アーキテクチャプログラムによって読み出され、次の時間ステップで(すなわち次のループ反復時にアドレス3及び7の命令により)使用されることになる。より具体的には、アドレス15の積和命令は、OUTBUF[2]から出力ゲート(O)値を読み出し、OUTBUF[3]からtanh(C)値を読み出し、それらを乗算して、累算器202に加算される積を生成し、累算器202は、アドレス14の命令によってクリアされている。より具体的には、NPUグループ4901内の4つのNPU126の各々がOとtanh(C)の積を計算する。
【0384】
アドレス16の出力命令は、
図50に示されるように、累算器202値をパススルーし、計算されたH値を1回目の実行インスタンス中には行3に、2回目の実行インスタンス中には行5に、以下同様に続き、31回目の実行インスタンス中には行63に書き込み、それらはその後アドレス4及び8の命令によって使用される。加えて、
図50に示されるように、計算されたH値は、後でアドレス4及び8の命令で使用するために出力バッファ1104に入れられる。アドレス16の出力命令はさらに、累算器202をクリアする。一実施形態では、LSTMセル4600は、アドレス16の出力命令(及び/又は
図48のアドレス22の出力命令)が累算器202値をパススルーするのではなく、活性化関数、例えばシグモイド又はtanhを有するように設計される。
【0385】
アドレス17のループ命令は、ループカウンタ3804を減分し、新しいループカウンタ3804値がゼロより大きければアドレス3の命令にループバックする。
【0386】
観察できるように、
図51の非アーキテクチャプログラムのループ本体内の命令の数は、
図48の非アーキテクチャよりも約34%少なく、これは、
図49のNNU121の実施形態の出力バッファ1104のフィードバック及びマスキング能力によって容易になる。加えて、
図51の非アーキテクチャプログラムのデータRAM122のメモリレイアウトは、
図48の約3倍の数の時間ステップに対応することができ、これも、
図49のNNU121の実施形態の出力バッファ1104のフィードバック及びマスキング能力によって容易になる。NNU121を用いてLSTMセル層の計算を行う特定のアーキテクチャプログラムアプリケーションに依存して、これらの向上が有用である場合があり、特にLSTM層のLSTMセル4600の数が128より小さいか又は等しいアプリケーションでそうである。
【0387】
図47〜
図51の実施形態では、重み及びバイアス値が複数時間ステップにわたり同じままであると仮定している。ただし、重み及びバイアス値が複数時間ステップにわたり変化する他の実施形態が企図され、その場合は、
図47及び
図50に示されるように重みRAM124が重み及びバイアス値の単一のセットを投入されるのではなく、重みRAM124は、時間ステップごとに重み及びバイアス値の異なるセットを投入され、
図48及び
図51の非アーキテクチャプログラムの重みRAM124のアドレスはそれに応じて変更を加えられる。
【0388】
図47〜
図51の実施形態が説明され、これらの実施形態では、一般的に言って、重み、バイアス、及び中間値(例えば、C、C’)が重みRAM124に記憶され、入力値及び出力値(例えば、X、H)がデータRAM122に記憶される。これは、データRAM122がデュアルポートで重みRAM124がシングルポートである実施形態に有利である可能性がある。なぜならば、非アーキテクチャ及びアーキテクチャプログラムからデータRAM122へ、より多くのトラフィックがあるためである。しかし、重みRAM124がより大きいため、それらの値が記憶されるメモリ(すなわちデータRAM122及び重みRAM124)を入れ替えるように非アーキテクチャプログラム及びアーキテクチャプログラムが書かれる実施形態が企図される。すなわち、W、U、B、C’、tanh(C)、及びC値がデータRAM122に記憶され、X、H、I、F、及びO値が重みRAM124に記憶される(
図47の変更を加えられた実施形態)。また、W、U、B、C値がデータRAM122に記憶され、X及びH値が重みRAM124に記憶される(
図50の変更を加えられた実施形態)。そのような実施形態の場合は、重みRAM124がより大きいため、より多くの数の時間ステップを一括して共に処理することができる。これは、より多い数の時間ステップから利益が得られ、且つシングルポートメモリ(例えば、重みRAM124)で十分な帯域幅が得られる計算を、NNU121を利用して行う任意のアーキテクチャプログラムアプリケーションに有利である可能性がある。
【0389】
次いで
図52を参照すると、出力バッファマスキングとNPUグループ内のフィードバック能力とを伴い、共有AFU1112を用いるNNU121の実施形態を図示するブロック図が示される。
図52のNNU121は、多くの点で
図49のNNU121に似ており、同様の参照符号を付した要素は類似する。しかし、
図49の4つのAFU212が単一の共有AFU1112に置き換えられており、このAFU1112は、4つの累算器202の4つの出力217を受け取り、OUTBUF[0]、OUTBUF[1]、OUTBUF[2]、及びOUTBUF[3]への4つの出力を生成する。
図52のNNU121は、共有AFU1112の動作に関しては、
図49〜
図51に関連して上記で説明した仕方と同様に、また
図11〜
図13に関連して上記で説明した仕方と同様に動作する。
【0390】
次いで
図53を参照すると、代替的な一実施形態による、
図46の128個のLSTMセル4600の層に関連する算出を行う際の、
図49のNNU121のデータRAM122、重みRAM124、及び出力バッファ1104内のデータのレイアウトの例を図示するブロック図が示される。
図53の例は、多くの点で
図50の例に似ている。ただし、
図53では、Wi、Wf、及びWo値は行0にあり(
図50のように行3ではなく)、Ui、Uf、及びUo値は行1にあり(
図50のように行4ではなく)、Bi、Bf、及びBo値は行2にあり(
図50のように行5ではなく)、C値は行3にある(
図50のように行6ではなく)。加えて、出力バッファ1104の内容は、
図53では
図50と同じであるが、第3の行の内容(すなわちI、F、O、及びC’値)が、7にある命令(
図50の10ではなく)の実行後に出力バッファ1104に存在し、第4の行の内容(すなわちI、F、O、及びC値)が、10にある命令(
図50の13ではなく)の実行後に出力バッファ1104に存在し、第5の行の内容(すなわちI、F、O、及びtanh(C)値)が、11にある命令(
図50の14ではなく)の実行後に出力バッファ1104に存在し、第6の行の内容(すなわちH値)が、13にある命令(
図50の16ではなく)の実行後に出力バッファ1104に存在する。これは、
図54の非アーキテクチャプログラムと
図51のそれとの違いに起因し、これについては下記でより詳細に説明する。
【0391】
次いで
図54を参照すると、
図49のNNU121のプログラムメモリ129に記憶され、NNU121によって実行されて、LSTMセル層に関連し、
図53の編成によるデータ及び重みを使用する計算を達成するプログラムを図示する表が示される。
図54の例示的プログラムは、多くの点で
図51のプログラムに似ている。より具体的には、アドレス0〜5の命令は
図54と
図51で同じである。
図54のアドレス7及び8の命令は、
図51のアドレス10及び11の命令と同じであり、
図54のアドレス10〜14の命令は、
図51のアドレス13〜17の命令と同じである。
【0392】
ただし、
図54のアドレス6の命令は累算器202をクリアしない(それに対して、
図51のアドレス6の命令はクリアする)。さらに、アドレス7〜9の命令は、
図54の非アーキテクチャプログラムには存在しない。最後、
図54のアドレス9の命令は、
図54のアドレス9の命令は重みRAM124の行3から読み出すのに対して
図51のアドレス12の命令は重みRAM124の行6から読み出す点を除いては、
図51のアドレス12の命令と同じである。
【0393】
図54と
図51の非アーキテクチャプログラム間の違いの結果、
図53のレイアウトは、使用する重みRAM124の行が3行少なく、プログラムループ中に含む命令が3つ少ない。実際、
図54の非アーキテクチャプログラムのループ本体のサイズは、本質的に
図48の非アーキテクチャプログラムのループ本体のサイズの半分であり、
図51の非アーキテクチャプログラムのループ本体のサイズの約80%である。
【0394】
次いで
図55を参照すると、代替的な一実施形態によるNPU126の部分を図示するブロック図が示される。より具体的には、
図49のNPU126のうち単一のNPU126について、mux−reg208とその関連付けられた入力207、211、及び4905、並びにmux−reg705とその関連付けられた入力206、711、及び4907が示されている。
図49の入力に加えて、NPU126のmux−reg208及びmux−reg705は各々、index_within_group入力5599を受け取る。index_within_group入力5599は、そのNPUグループ4901内での特定のNPU126の索引を指示する。したがって、例えば、各NPUグループ4901に4つのNPU126がある実施形態では、各NPUグループ4901の中で、NPU126の1つがそのindex_within_group入力5599でゼロの値を受け取り、NPU126の1つがそのindex_within_group入力5599で1の値を受け取り、NPU126の1つがそのindex_within_group入力5599で2の値を受け取り、NPU126の1つがそのindex_within_group入力5599で3の値を受け取る。別の表現をすると、NPU126によって受け取られるindex_within_group入力5599の値は、NNU121内でのそのNPU126の索引modJであり、Jは、NPUグループ4901中のNPU126の数である。したがって、例えば、NPU73はindex_within_group入力5599で1の値を受け取り、NPU353はindex_within_group入力5599で3の値を受け取り、NPU6はindex_within_group入力5599で2の値を受け取る。
【0395】
加えて、制御入力213が本明細書で「SELF」と呼ばれる所定の値を指定するとき、mux−reg208は、index_within_group入力5599の値に対応する出力バッファ1104の入力4905を選択する。したがって、有利な点として、非アーキテクチャ命令が、SELFの値を持つ出力バッファ1104からデータを受け取ることを指定するとき(
図57のアドレス2及び7の命令中のOUTBUF[SELF]で表される)、各NPU126のmux−reg208は、その対応するワードを出力バッファ1104から受け取る。したがって、例えば、NNU121が
図57のアドレス2及び7の非アーキテクチャ命令を実行するとき、NPU73のmux−reg208は、4つの入力4905のうち2番目(索引1)を選択して出力バッファ1104からワード73を受け取り、NPU353のmux−reg208は、4つの入力4905のうち4番目(索引3)を選択して出力バッファ1104からワード353を受け取り、NPU6のmux−reg208は、4つの入力4905のうち3番目(索引2)を選択して出力バッファ1104からワード6を受け取る。
図57の非アーキテクチャプログラムでは用いられないが、非アーキテクチャ命令が、SELFの値を持つ出力バッファ1104(OUTBUF[SELF])からデータを受け取ることを指定して、制御入力713に所定の値を指定させて、各NPU126のmux−reg705に、その対応するワードを出力バッファ1104から受け取らせることができる。
【0396】
次いで
図56を参照すると、
図43のJordan RNNに関連する算出を行う際の、ただし
図55の実施形態によって得られる利益を用いるNNU121のデータRAM122及び重みRAM124内のデータのレイアウトの例を図示するブロック図が示される。重みRAM124内の重みのレイアウトは
図44と同じである。データRAM122内の値のレイアウトは、各時間ステップが、
図44のように行の四つ組ではなく、入力層ノードD値及び出力層ノードY値を保持する関連付けられた行のペアを持つ点を除いて
図44と似ている。すなわち、隠れ層Z及びコンテキスト層C値は、データRAM122に書き込まれない。代わりに、出力バッファ1104が、隠れ層Z及びコンテキスト層C値のためのスクラッチパッドとして使用される。これについては、
図57の非アーキテクチャプログラムとの関連でより詳細に説明する。有利な点として、OUTBUF[SELF]の出力バッファ1104のフィードバック機能により、場合によっては、非アーキテクチャプログラムをより高速にすることができ(データRAM122の2回の書き込みと2回の読み出しを、出力バッファ1104の2回の書き込みと2回の読み出しに置き換えるため)、各時間ステップが使用するデータRAM122空間を減らすことができ、それにより、示されるように、データRAM122が、
図44及び
図45の実施形態の約2倍の数の時間ステップ、詳細には32個の時間ステップを保持できるようになる。
【0397】
次いで
図57を参照すると、NNU121のプログラムメモリ129に記憶され、NNU121によって実行されてJordan RNNを達成し、
図56の編成によるデータ及び重みを使用するプログラムを図示する表が示される。
図57の非アーキテクチャプログラムは、いくつかの点で
図45の非アーキテクチャプログラムに似ており、違いを説明する。
【0398】
図57の例示的プログラムは、アドレス0〜11に12個の非アーキテクチャ命令を含んでいる。アドレス0の初期化命令は、累算器202をクリアし、ループカウンタ3804を32の値に初期化して、ループ本体(アドレス2〜11の命令)を32回行わせる。アドレス1の出力命令は、累算器202のゼロ値(アドレス0の初期化命令によってクリアされた)を出力バッファ1104に入れる。観察できるように、512個のNPU126は、アドレス2〜6の命令の実行中、512個の隠れ層ノードZに対応し、512個の隠れ層ノードZとして動作し、アドレス7〜10の命令の実行中、512個の出力層ノードYに対応し、512個の出力層ノードYとして動作する。すなわち、アドレス2〜6の命令の32回の実行インスタンスは、32個の対応する時間ステップについての隠れ層ノードZの値を計算し、該値を出力バッファ1104に入れ、それらは、対応するアドレス7〜9の命令の32回の実行インスタンスによって使用されて、32個の対応する時間ステップについての出力層ノードYが算出され、データRAM122に書き込まれ、それらは、アドレス10の命令の対応する32回の実行インスタンスによって使用されて、対応する32個の時間ステップのコンテキスト層ノードCが出力バッファ1104に入れられる。(出力バッファ1104に入れられた32回目の時間ステップのコンテキスト層ノードCは使用されない。)
【0399】
アドレス2及び3の命令(ADD_D_ACC OUTBUF[SELF]、及びADD_D_ACC ROTATE,COUNT=511)の1回目の実行インスタンス中、512個のNPU126の各々は、その累算器202に、出力バッファ1104の512個のコンテキストノードC値を累算し、それらの値は、アドレス0〜1の命令の実行によって生成され、書き込まれたものである。アドレス2及び3の命令の2回目及びそれ以降の実行インスタンス中、512個のNPU126の各々は、その累算器202に、出力バッファ1104の512個のコンテキストノードC値を累算し、それらの値は、アドレス7〜8及び10の命令の実行によって生成され、書き込まれたものである。より具体的には、アドレス2の命令は、上記のように、各NPU126のmux−reg208に、その対応する出力バッファ1104のワードを選択して、それを累算器202に加算するように命令する。アドレス3の命令は、NPU126に、512個のNPU126の接続されたmux−reg208によって集合的に形成される512個のワード循環器内で、コンテキストノードC値を512個のNPU126間で循環させるように命令して、各NPU126がその累算器202に512個のコンテキストノードC値を累算できるようにする。アドレス3の命令は累算器202をクリアせず、そのため、アドレス4及び5の命令は、入力層ノードD(各自の対応する重みが乗算された)を、アドレス2及び3の命令の実行で累算されたコンテキストノードC値と共に累算することができる。
【0400】
アドレス4及び5の命令(MULT−ACCUM DR ROW+2,WR ROW0、及びMULT−ACCUM ROTATE,WR ROW+1,COUNT=511)の各実行インスタンス中、512個のNPU126の各NPU126は、現在の時間ステップに関連付けられているデータRAM122の行(例えば、時間ステップ0では行0、時間ステップ1では行2、及び以下同様に時間ステップ31では行62)にある512個の入力ノードD値と、重みRAM124の行0〜511からのNPU126それぞれの重みの列との512回の乗算演算を行って、512個の積を生成し、それらの積は、アドレス2及び3の命令によって行われた512個のコンテキストCノード値の累算と併せて、それぞれのNPU126の累算器202に累算されて、隠れノードZ層値を計算する。
【0401】
アドレス6の命令(OUTPUT PASSTHRU,NOP,CLR ACC)の各実行中、512個のNPU126の512個の累算器202値はパススルーされ、出力バッファ1104のそれぞれのワードに書き込まれ、累算器202がクリアされる。
【0402】
アドレス7及び8の命令(MULT−ACCUM OUTBUF[SELF],WR ROW512、及びMULT−ACCUM ROTATE,WR ROW+1,COUNT=511)の各実行インスタンス中、512個のNPU126の各NPU126は、出力バッファ1104にある512個の隠れノードZ値(アドレス2〜6の命令の対応する実行インスタンスで生成され、書き込まれたもの)と、重みRAM124の行512〜1023からのNPU126それぞれの重みの列との512回の乗算演算を行って512個の積を生成し、それらの積は、それぞれのNPU126の累算器202に累算される。
【0403】
アドレス9の命令(OUTPUT ACTIVATION FUNCTION,DR OUT ROW+2)の各実行インスタンス中、活性化関数(例えば、tanh、シグモイド、正規化)が512個の累算値に行われて出力ノードY層値を計算し、その値は、現在の時間ステップに関連付けられたデータRAM122の行(例えば、時間ステップ0では行1、時間ステップ1では行3、及び以下同様に時間ステップ31では行63)に書き込まれる。アドレス9の出力命令は累算器202をクリアしない。
【0404】
アドレス10の命令(OUTPUT PASSTHRU,NOP,CLR ACC)の各実行インスタンス中、アドレス7及び8の命令によって累算された512個の値が、アドレス2及び3の命令の次の実行インスタンスで使用するために出力バッファ1104に入れられ、累算器202がクリアされる。
【0405】
アドレス11のループ命令は、ループカウンタ3804を減分し、新しいループカウンタ3804値がゼロより大きければアドレス2の命令にループバックする。
【0406】
図44に関連して説明したように、
図57の非アーキテクチャプログラムによって行われる例示的なJordan RNNでは、活性化関数を累算器202値に適用して出力層ノードY値を生成するが、実際の出力層ノードY値ではなく、活性化関数を適用する前の累算器202値がコンテキスト層ノードCにパススルーされると仮定している。ただし、活性化関数が累算器202値に適用されてコンテキスト層ノードCを生成するJordan RNNの場合には、アドレス10の命令が
図57の非アーキテクチャプログラムから除去されることになる。Elman又はJordan RNNが単一の隠れノード層を含んでいる実施形態(例えば、
図40及び
図42)を説明してきたが、プロセッサ100及びNNU121の実施形態は、本明細書に記載されるのと同様の仕方で複数の隠れ層を含んでいるRNNに関連する計算を効率的に行うように構成されることを理解されたい。
【0407】
上記で
図2との関連で説明したように、有利な点として、各NPU126が、人工ニューラルネットワーク内のニューロンとして動作するように構成され、NNU121のすべてのNPU126が大規模に並列したやり方で動作して、ネットワークの層についてのニューロン出力値を効率的に計算する。特に集合的なNPUのmux−reg循環器を用いてNNUが動作するこの並列方式は、恐らくは、ニューロン層の出力値を計算する従来の仕方と直感的に反している。より具体的には、従来の方法は、通例、単一のニューロン、又はニューロンの比較的小さなサブセットに関連する計算を行い(例えば、並列の算術ユニットを使用して乗算及び加算を行う)、次いで層内の次のニューロンに関連する計算に移り、以下同様に層内のすべてのニューロンについて計算が行われるまで直列方式で計算を行うことを伴う。それと対照的に、各クロックサイクルに、NNU121のすべてのNPU126(ニューロン)が、すべてのニューロン出力の生成に関連する計算の小さなサブセット(例えば、1回の積和)を並列して行う。有利な点として、約Mクロックサイクルの終わりまでに、NNU121は全ニューロンの出力を計算しており、Mは現在の層に接続されたノードの数である。多くの人工ニューラルネットワーク構成に対しては、NPU126の数が多いために、NNU121は、Mクロックサイクルの終わりまでに層全体の全ニューロンのニューロン出力値を計算できる可能性がある。本明細書における説明から観察できるように、この計算効率はあらゆる種類の人工ニューラルネットワーク計算に有用であり、そのようなニューラルネットワークには、これらに限定されないが、Elman、Jordan、及びLSTMネットワークなどのフィードフォワード及びリカレントニューラルネットワークが含まれる。最後、NNU121が512個のNPU126として(例えば、ワイドワード構成において)構成されてリカレントニューラルネットワーク計算を行う実施形態を説明したが、NNU121が1024個のNPU126として(例えば、ナローワード構成において)構成されてリカレントニューラルネットワーク計算を行う他の実施形態が企図され、また、上記のように、512又は1024個とは異なる数のNPU126を有するNNU121の実施形態が企図される。
【0408】
3次元畳み込みニューラルネットワーク
畳み込みニューラルネットワークは、ディープラーニングの分野で普及しつつあり、画像認識の領域で優れた結果を生んでおり、自然言語処理、推薦システム、及びゲームプレーなどの他の領域における結果を約束している。畳み込みニューラルネットワークは、入力にフィルタを畳み込んで出力を作り出す畳み込み層を少なくとも1つ含んでいる。通例、畳み込みニューラルネットワークは、一続きのそのような畳み込み層を含んでおり、その中では、ある畳み込み層の出力が後続の畳み込み層への入力として提供され、恐らくはその間にプーリング層がある。
【0409】
畳み込みニューラルネットワークの着想は、動物の視覚皮質の性質の研究にあるとされており、個々のニューロンが動物の眼の視野の部分領域内で受け取られる光に対して反応する。この部分領域はニューロンの受容野と呼ばれる。視覚皮質のニューロンの重なり合った受容野が、視野を構成する。より具体的には、ニューロンは、受容野の中で、例えば特定の向きを持つ直線状のエッジや特定の色のかたまりなど、特定の形状を検出することができる。視野にわたり同様のニューロンが並ぶことに起因して、動物の脳は、視野内での形状の場所に関係なく、特定の形状を検出することができる。この現象は並進不変性と呼ばれることがある。多くの畳み込みニューラルネットワークは、入力データが並進不変であるときに特に有用であるように思われる。なぜならば、フィルタ重みが入力全体(例えば、画像全体)に関係するためである。並進不変特性は、フィルタを入力全体にわたって再使用することを可能にし、それにより、上記では典型的なニューラルネットワーク層又は積和層とも呼んでいる、例えば完全に接続された層と比べて、必要とされる重みの数が激減する。本明細書に記載されるのは、上記のNNU121の実施形態における畳み込みニューラルネットワークに関連する計算の実行を加速する方法の実施形態、並びに追加的な実施形態である。
【0410】
上記で述べたように、畳み込み演算は、第1の行列に第2の行列を畳み込む演算である。上記では、第2の行列を畳み込みカーネルと呼んでいるが、以下で説明する図との関連では、第2の行列を、通例、重み、パラメータ、要素、又は値のフィルタと呼ぶ。加えて、上記で
図24〜
図26との関連で説明した第1及び第2の行列は2次元(2D)行列であるが、以下では第1及び第2の行列が3次元(3D)行列である畳み込み演算を説明する。これは、3D畳み込みは畳み込みニューラルネットワークで頻繁に用いられるためである。すなわち、次いで
図58との関連で説明するように、入力は3D行列であり、フィルタは複数の3D行列である。
【0411】
次いで
図58を参照すると、畳み込みニューラルネットワークなどによって広く行われる、3次元(3D)畳み込み計算作業を図示するブロック図が示される。より具体的には、3D入力5802に複数のフィルタ5804を畳み込んで、出力5808を生成する。一般に、入力5802は、W個の列、H個の行、及びC個のチャネルを有する。F個のフィルタ5804があり、各フィルタは、S個の列、R個の行、及びC個のチャネル(入力5802のC個のチャネルに対応する)を有する。そして、F個の出力5808があり(F個のフィルタ5804に対応する)、各出力は、P個の列及びQ個の行を有する。W、H、C、F、S、R、Q、及びPは、NNU121のハードウェアによって実行されている特定のニューラルネットワークのハイパーパラメータである。ニューラルネットワークのハイパーパラメータは、それらを実行するハードウェアに対して動的である。というのは、ハードウェアの特性は静的である(例えば、算術論理ユニットの数、メモリ幅)が、ハイパーパラメータは、NNU121が実行する種々のニューラルネットワークごとに異なり得るためである。例えば、あるニューラルネットワークは画像認識を行うように設計される場合があるのに対し、別のニューラルネットワークは碁を打つために設計される場合がある。さらに、画像認識/碁のネットワークのうちでも、各ネットワークは異なるハイパーパラメータを有する可能性があり、それらには、層の数、層の大きさ(ノード及び相互接続の数)、並びに層のタイプ(例えば、完全接続、畳み込み、プーリング、LSTM)、が含まれる。
【0412】
説明のための例として、入力5802は、W=12列、H=12行、及びC=20チャネルを含むことができ、50個のフィルタ5804があってよく、各フィルタがS=5列及びR=5行を有し、50個の出力5808があってよく、各出力はP=8列及びQ=8行を有する。これらは、手書きの数字を分類するために設計された、よく知られているニューラルネットワークの畳み込み層の入力、フィルタ、及び出力のハイパーパラメータあり、そのようなニューラルネットワークは、よく知られているMNISTデータベース、すなわち、LeCun,Y.,Bottou,L.,Bengio,Y.,and Haffner,P.(1998),Gradient−based learning applied to document recognition,Proceedings of the IEEE,86(11),2278−2324に記載されるLeNet 5の変形例などを使用してトレーニングできる。以下で
図59〜
図69との関連で、NNU121が畳み込み計算を行って12×12×20の入力5802に50個の5×5フィルタ5804を畳み込んで50個の8×8出力5808を生成する方法の実施形態を説明して、NNU121により3D入力に3Dフィルタを畳み込んで出力を生成するより一般的な方法を、例としてさらに説明する。NNU121は、特に、本明細書に記載されるように、データRAM122から受け取られた入力データの行を、NPU126のアレイを回って循環させる能力を提供するように構成されたmux−reg(例えば208)を備えているNPU126のアレイを有するニューラルネットワークユニットである。ただし、次いで、解くべき一般的な問題、すなわち、W×H×Cの入力5802にF個のS×R×Cフィルタ5804を畳み込んで、F個のP×Q出力5808を生成する数学的処理を
図58との関連で説明する。より具体的には、W×H×Cの入力5802に単一のS×R×Cフィルタ5804を畳み込んで、単一のP×Q出力5808を生成する数学的処理を次いで説明する。
【0413】
図24〜
図26の文脈では、畳み込みは、3×3の畳み込みカーネルのうちの要素と、その対応する、それぞれの部分行列のうちの要素との、9つの積の和であった。同様に、
図58の文脈では、畳み込みは、S×R×Cフィルタ5804のうちの要素と、その対応する、入力5802のそれぞれのS×R×C部分行列のうちの要素との、S×R×C個の積の和である。その結果得られる和、すなわち畳み込みは、出力5808のP×Q個の値のうちの1つである。より具体的には、フィルタ5804のS個の列及びR個の行のゼロ基準の索引値を仮定すると、結果得られる畳み込みは、出力5808の場所[s,r]にあり、sは列の索引であり、rは、畳み込まれる入力5802のS×R×C部分行列の左上の要素の行の索引である。そのため、例えば、Y[s,r]を出力5808の要素として表し、X[i,j,k]を入力5802の要素として表し、F[m,n,k]をフィルタ5804の要素として表す。ここで、iは入力5802の列の索引であり、jは行の索引であり、mはフィルタ5804の列の索引であり、nは行の索引であり、kはチャネルの索引である。すると以下になる。
(外5)
したがって、例えば、S=R=5且つC=20の場合、出力5808のP×Q個の値の各値は、5×5×20=500個の積の和になる。
【0414】
上記の説明は、入力5802の境界周囲のパディングは使用されないことを仮定しており、これは、一般に「有効」な畳み込み(「同一サイズ」の畳み込みに対して)と呼ばれる。その結果、出力5808の大きさは、入力5802の列及び行の大きさよりも小さくなる。より具体的には、P=W−S+1、且つQ=H−R+1である。同一サイズの畳み込みの場合は、パディングを使用して(例えば、ゼロパディング)、出力5808の大きさを入力5802の列及び行の大きさと同じにし、すなわちP=W且つQ=Hにする。
【0415】
次いで
図59を参照すると、入力ブロック5902へのデータRAM122行の区分、フィルタブロック5904への重みRAM124行の区分、NPUブロック5906へのNPUアレイ126の区分、及び出力ブロック5908へのデータRAM122行の区分を図示するブロック図が示される。
図59の実施形態では、NNU121にあるNPU126の数をNと表記し、それに対応して、データRAM122の一行から受け取られるワードの数はNであり、重みRAM124の一行から受け取られるワードの数はNである。N個のNPU126、及びデータRAM122/重みRAM124から受け取られるN個のワードは、示されるように0〜N−1と表記する。
【0416】
示されるように、ブロック5902/5904/5906/5908の数をGと表記し、G個のブロックは0〜G−1と表記する。Gは、NとBとの商として計算される。Bはブロックサイズである。Bは、少なくともWと同じ大きさの、Nの最小の因数であり、Wは、
図58の入力5802の列の数である。例えば、Nが1024でWが12である場合には、Bは16になる。これは、16が、12よりも大きい1024の最小の因数であるためである。そして、G=1024/16=64となる。
【0417】
図59に示されるように、データRAM122/重みRAM124の行のN個のワードは、G個のブロックのうち1番目のブロックでは0、1、2〜B−1と表記され、G個のブロックのうち2番目のブロックではB、B+1〜2B−1と表記され、以下同様に続き、ブロックG−1では、N−B、N−B+1〜N−1と表記される。様々な番号が振られたブロックは、互いに対応する。すなわち、NPUブロック0は、データRAM122からの入力ブロック0と、重みRAM124からのフィルタブロック0とを受け取り、出力ブロック0を生成する。NPUブロック1は、データRAM122からの入力ブロック1と、重みRAM124からのフィルタブロック1とを受け取り、出力ブロック1を生成する。以下同様に続き、NPUブロックN−1は、データRAM122からの入力ブロックN−1と、重みRAM124からのフィルタブロックN−1とを受け取り、出力ブロックN−1を生成する。NPUブロック5906内の個々のNPU126による出力ブロック5908の結果の生成については、以下で説明する。
【0418】
NPU126のアレイ、データRAM122の行、重みRAM124の行、及びデータRAM122の行を、それぞれサイズがBである、それぞれのG個のNPUブロック5906、入力ブロック5902、フィルタブロック5904、及び出力ブロック5908に区分すると、NNU121が効率的な仕方で入力5802にフィルタ5804を畳み込んで出力5808を生成することが容易になる。詳細には、データRAM122及び重みRAM124内の入力データ及びフィルタ重みのレイアウトと併せて区分を行うと、固有の入れ子ループ構造が容易になり、このループ構造は、有利な点として、NNU121の循環器mux−reg208構造を使用して、入力5802のC個のチャネルすべてに関連付けられた入力ブロック5902を循環させ、その結果、F個のフィルタ5804に関連付けられたG個のNPUブロック5906のうちF個の各々は、その対応するフィルタ5804を畳み込むための入力5802のC個のチャネルすべてが「見える」(すなわち受け取る)。より具体的には、NNU121は、データRAM122の行の入力ブロック5902をmux−reg208の中に読み込んでから、mux−reg208によって形成される循環器を使用して、入力ブロック5902を、少なくともC個の隣接するNPUブロック5906を通して循環させる。これにより、各NPU126は、その対応するフィルタ5804の一行のチャネルすべてと、入力5802の行のチャネルすべてとの積和演算を行うことができ(例えば、下記で
図60との関連で説明するように、列チャネル和を行う)、その後、入力5802の別の行がmux−reg208に読み込まれる。これについては、
図60の疑似コードとの関連でより詳細に説明する。NNU121の使用は、上記の式(7)の考察に基づいて適用される可能性のある、より直感的な従来の方法に対して、固有であり、また効率的である。
【0419】
上述から、Nは静的であるが、B、及びしたがってGは動的であることが観察できよう。これは、B及びGが、NだけでなくWの関数でもあるためであり、Wは、NNU121に実行される特定のニューラルネットワークのハイパーパラメータである。G及びBの値は、下記でより詳細に説明するように、NNU121で実行されて畳み込み演算を行う非アーキテクチャプログラムに組み込まれる。
【0420】
次いで
図60を参照すると、NNU121で実行されている非アーキテクチャプログラムによって行われて、
図58に示されるような3D畳み込み作業を行う計算を図示する疑似コードが示される。この疑似コードリストは、説明を容易にするためにライン番号を含んでいる。
図60では、ライン番号は2で始まり、ライン番号4、16、18、21〜22、及び25はスキップされている。それにより
図60の疑似コードを
図63、
図67、及び
図69の疑似コードと比較しやすくしており、
図63、
図67、及び
図69では、疑似コードの同様の命令は対応するライン番号を持つ。また、
図67及び
図69ではライン18及び22をスキップしているのに対し、
図63及び
図65にはライン1〜26のすべてが含まれていることに留意されたい。
【0421】
図60の疑似コードを考察しながら、例えば上記で
図1〜
図48との関連で説明したように、同じ命令又は演算がNNU121のNPU126のすべてによって同時に行われることを念頭に置かれたい。したがって、
図60の一部については、畳み込みニューラルネットワーク層の単一のニューロンとして機能して出力5808の単一の要素すなわち畳み込み結果を生成する単一のNPU126に関連して説明する場合があるが、
図60の疑似コードに従ってすべてのNPU126が同時に動作して結果を生成することを理解されたい。ただし、多くの場合には、畳み込みニューラルネットワーク層のハイパーパラメータに依存して、NPUブロック5906内のNPU126の一部が、使用されない結果を生成する場合もあることも念頭に置かれたい。さらに、所与の出力ブロック5908における出力5808のQ行のうちの行のP個の畳み込み結果は共にパックされるが、出力ブロック5908の境界に、使用されない結果がいくつか存在する場合もある。その結果、N個の結果が書き込まれるデータRAM122(又は重みRAM124)の行(例えば、
図60のライン24)の中では、F×P個の畳み込み結果は、通例、すべてが共にパックされる訳ではない。好ましくは、別の非アーキテクチャプログラム(又は同じ非アーキテクチャプログラムの追加的な部分)が、ニューラルネットワークの次の層に入力するために、パックされない畳み込み結果を集めてまとめる。最後、
図60は、データRAM122内の入力5802のレイアウト、及び重みRAM124内のフィルタ5804のレイアウトの文脈でより完全に理解することができ、その4つの実施形態を下記で
図61〜
図69との関連で説明する。
【0422】
疑似コードは4つの入れ子ループを含んでおり、それらは、ループ1、ループ2、ループ3、及びループ4と表される。ループ1が外側ループであり、ループ4が内側ループである。ループ1は、出力5808のQ個の出力行の各々について反復する。ループ2は、フィルタ5804のR個のフィルタ行の各々について反復する。ループ3は、少なくとも、入力5802のC個のチャネルの各々について反復する。下記でより詳細に説明するように、ループ3は、C個のチャネルに加えて、存在する場合にはギャップ入力ブロックグループ(例えば
図61Bの6103を参照)の数だけ反復する。ループ4は、フィルタ5804のS個のフィルタ列の各々について反復する。S列、R行、Cチャネルのフィルタ5804を、入力5802のボリュームのうち対応するサイズの部分の上に空間的に重ねて視覚化した場合、4つのループは、次の段落で一般化することができ、それに続いて各ループをより詳細に解説する。非アーキテクチャプログラムは、
図26A、
図28、
図42、
図45、
図48、
図51、
図54、又は
図57のINITIALIZE及びLOOP命令など、INITIALIZE命令と併せてLOOP命令を使用することによりループを達成することができる。ループ1は、LOOPCNTをQに代入することによって達成することができる。好ましくは、3つの外側ループ(ループ1、2、及び3)は、INITIALIZE及びLOOP命令を使用して達成できるのに対し、内側ループ(ループ4)は、
図4、
図9、
図20、
図26A、
図42、
図45、又は
図57のMULT−ACCUM命令などの積和命令に関連付けられたCOUNT値を使用して達成することができる。
【0423】
内側ループであるループ4に従い、各NPU126は、各自の累算器202に、各自の対応するフィルタ5804の行のS個の重みと、S個のオーバーレイされた入力5804要素との、S個の積の和を累算し、その和をここでは列和(column-sum)と呼ぶことにする。ループ3に従い、ループ4は、累算器202に、C個のチャネルのうち第1のチャネルについての第1の列和を累算し、次いで、累算器202に、第2のチャネルについての第2の列和を、第1の列和と共に累算し、以下同様に続き、最終的には、フィルタ5804のC個のチャネルすべてについてのC個の列和を累算している。場合によっては、ハイパーパラメータに依存して、ループ3は、累算器202に、ギャップ入力ブロックグループ6103及びギャップフィルタブロックグループ6104に関連付けられた追加的なゼロ値の列和を累算する場合もある(
図61を参照)。(チャネルが処理される順序は、NPUブロック5906の中でのそのフィルタのNPUブロック5906の場所に依存して、詳細には、そのフィルタのNPUブロック5906の索引とチャネルの数Cとのモジュロに依存して、フィルタ5804ごとに変化する。これについては下記でより詳細に説明する。)したがって、ループ3の一インスタンスの完了時に、NNU121は、フィルタ5804の水平方向の(horizontal)2Dスライスと、それに対応する入力5802の2Dのオーバーレイされた水平方向の2Dスライスとの、S×C個の積の和を累算していることになり、この和をここでは列チャネル和(column-channel-sum)と呼ぶことにする。ループ2に従い、ループ3は、累算器202に、フィルタ5804の行0についての第1の列チャネル和を累算し、次いで、累算器202に、フィルタ5804の行1についての第2の列チャネル和を累算し、以下同様に続き、最終的には、フィルタ5804のR個の行すべてについてのR個の列チャネル和を累算している。したがって、ループ2の一インスタンスの完了時に、NNU121は、フィルタ5804と、それに対応する入力5802のオーバーレイされたボリュームとについての、S×C×R個の積の和を累算していることになり、この和をここでは列チャネル行和(column-channel-row-sums)と呼ぶことにし、これが、出力5806のQ行のうち1つの行の最終的な畳み込み結果である。ループ2の終わりに、NPU126は、F個の列チャネル行和をデータRAM122の行に書き込む。観察できるように、この列チャネル行和は、従来の列−行−チャネルの順序に対して、列−チャネル−行の順に計算される。これは、NNU121の幅Nのmux−reg208循環器能力を活用できるため有利である。ループ1に従い、ループ2は、累算器202に、出力5806の行0についての第1の列チャネル行和を累算し、次いで出力5806の行1についての第2の列チャネル行和を累算し、以下同様に続き、最終的に出力5806のQ行すべてについての列チャネル行和を生成し、データRAM122に出力している。
【0424】
図60の非アーキテクチャプログラムについては、一般に外から中へ、すなわち外側ループに関して、次いでそれに続く内側ループに関して説明するが、理解を助けるために、最も内側のループであるループ4を最初に説明する。
【0425】
ループ4は、各NPU126の乗算器242に、S回の乗算を行わせてS個の積を生成させる。S個の積の各々が作り出されるとき、その積は累算器202に累算される。したがって、ループ4の完了時に、累算器202は、ループ4の開始前に保持していたよりもS個多い積の中間和を保持しており、すなわち、別の列和を保持している。各NPU126によるループ4のS回の乗算の各々は、第1のオペランドとして、入力5802のW列のうちの各自の列とCチャネルのうちのチャネルとH行のうちの行との中の入力5802の要素を取り出す。W個の列のうちの列は、ループ4のどの回の反復が行われているかと、NPUブロック5906内でのNPU126の場所とに依存する。C個のチャネルのうちのチャネル(存在する場合にはギャップ入力ブロックグループの数を含む)は、ループ3のどの回の反復が行われているかと、そのNPU126を含むNPUブロック5906の場所とに依存する。H個の行のうちの行は、ループ1のどの回の反復が行われているかとループ2のどの回の反復が行われているかとの組み合わせに依存する。第1のオペランドである入力5802の要素は、データRAM122からmux−reg208に読み込まれるか(例えば
図60のライン8)、又は、隣接するNPU126からmux−reg208に循環されるか(例えば
図60のライン15若しくはライン19)のいずれかである。S回の乗算の各々は、第2のオペランドとして、そのNPU126を含んでいるNPUブロック5906に対応するフィルタブロック5904に関連付けられたフィルタ5804のS個の列のうちの各自の列とC個のチャネルのうちのチャネルとR個の行のうちの行との中の重みを取り出す。S個の列のうちの列は、ループ4のどの回の反復が行われているかに依存する。C個のチャネルのうちのチャネル(存在する場合にはギャップ入力ブロックグループの数を含む)は、ループ3のどの回の反復が行われているかと、そのNPU126を含むNPUブロック5906の場所とに依存する。R個の行のうちの行は、ループ2のどの回の反復が行われているかに依存する。第2のオペランドである重みは、重みRAM124からレジスタ205(又はmux−reg705)に読み込まれる(例えば
図60のライン13)。
【0426】
一実施形態では、ループ4の実行インスタンスは、Sのカウントを指定し、mux−reg208への入力211(すなわち隣接するNPU126のmux−reg208からの循環された入力5802要素のワード)を第1の乗算器242入力として指定し、重みワードを重みRAM124からレジスタ205に第2の乗算器242入力として読み込むことを指定する、単一のMULT−ACCUM/実行非アーキテクチャ命令によって達成することができる。或いは、非アーキテクチャプログラムは、MULT−ACCUM/実行の非アーキテクチャ命令のペアを含んで、ループ4の実行インスタンスを達成してもよい。例えば、第1の1つ又は複数の命令が、1のカウントを指定し、mux−reg208への入力211−2、211−4、及び/又は211−8(すなわち、それぞれ2つ、4つ、及び/又は8つ離れたNPU126のmux−reg208からの循環された入力5802要素のワードであり、それにより、
図70及び
図71のマルチワード(multi-word)距離循環動作に関連してより詳細に説明するように、マルチワード循環を達成する)を第1の乗算器242入力として指定し、重みRAM124からワードを第2の乗算器242入力としてレジスタ205に読み込むことを指定する。第2の命令は、S−1のカウントを指定し、mux−reg208への入力211を第1の乗算器242入力として指定し、重みRAM124からワードを第2の乗算器242入力としてレジスタ205に読み込むことを指定する。第1の命令は、1よりも大きい循環を指定することにより、ループ3の1回目の反復を除くすべての反復について、
図60のライン19に記載されるブロックの位置合わせを効果的に達成するのに使用することができる。次いで外側ループについて説明する。
【0427】
ループ1の各反復は、N個のNPU126のN個の累算器202をクリアする。非アーキテクチャプログラムは、上記で(例えば
図4との関連で)説明したようなINITIALIZE命令又は「実行」命令を使用して累算器202をクリアすることができる。そして、ループ1の各反復がループ2を行い、それにより、N個の累算器202に結果を累算する。最後、ループ1の各反復が、ループ2で生成された列チャネル行和を、N個の累算器202からデータRAM122の行に(又は、それに代えて重みRAM124の行に)書き込む。ループ2の一回の実行インスタンスが完了した時の累算器202内の列チャネル行和は、上記の式(7)で説明した畳み込みと数学的に同等の畳み込みを含んでいる。累算器202内の畳み込み列チャネル行和は、F個の出力5808のQ行のうちの一行である。より具体的には、G個のNPUブロック5906のうちF個が、F個の対応する出力ブロック5908を作り出し、F個の出力ブロック5908の各々は、F個の出力5808のうちの対応する出力5808に関して、その対応する出力5808のQ行のうちの行を含んでいる。FがG未満である場合には、NPUブロック5906のうちG−F個の累算器202の結果は使用されない。Q行のうちの行のP個の畳み込み列チャネル行和は、関連するNPUブロック5906のB個のNPU126の累算器202のサブセットから提供され、その他の累算器202は使用されない。ループ1の各反復は、出力5808のQ行のうち異なる行を作り出し、F個のNPUブロック5906の各々は、F個のNPUブロック5906に対応するG個の出力ブロック5908のうちF個の対応するもの内の、F個の出力5808のうち異なるものを作り出す。
【0428】
NPUブロック5906内の累算器202の有効な/使用されるサブセットは、特に、ブロックサイズBと入力列の数Wとの間に差がある場合にはその差、及び、「有効」な畳み込み出力が生成されるか又は「同一サイズ」の畳み込み出力が生成されるかに依存する。WがBに等しく、同一サイズの畳み込みが要求される場合には、サブセットは、NPUブロック5906の累算器202のうちB個すべてを含み、この場合はPもまたB及びWに等しくなる。累算器202のサブセットについては、下記で
図62の実施形態との関連でより詳細に説明するが、出力5808の各個々の要素、すなわち畳み込み列チャネル行和は、単一のNPU126によってその累算器202内で生成されることを覚えておかれたい。
【0429】
さらに、好ましくは、個々の畳み込み列チャネル行和は、NPU126の累算器202の中で完全に生成され、データRAM122(又は重みRAM124)に中間の部分和を書き込んで後にそれらを読み出すことはない。これは、有利な点として、畳み込み列チャネル行和の精度を損なうことを回避する。上記のように、好ましくは、累算器202の幅は、データRAM122及び/又は重みRAM124から入力される、且つ/又はそれらに書き込まれる個々のワードの幅よりも大幅に広い。好ましくは、累算器202値は、データRAM122に書き込まれる前に、データRAM122/重みRAM124のワードのサイズに変換され、飽和され、且つ/又は圧縮される。例えば、28ビットであり得る累算器202値が、上記で例えば
図30〜
図33との関連で説明したように、データRAM122に書き込まれる前に、8ビットワードに変換され、飽和され、且つ/又は圧縮されることができる。
【0430】
ループ2の各反復は、N個のmux−reg208に、データRAM122の一行を読み込む。より具体的には、G個のNPUブロック5906は、各自のmux−reg208に、データRAM122の行が区分されたG個の入力ブロック5902のうち各自の入力ブロックを読み込む。G個の入力ブロック5902は、NNU121を回って、mux−reg208の循環器を使用して、ループ3によって異なるNPUブロック2906へと循環される。非アーキテクチャプログラムは、上記のようなMULT−ACCUM命令又は「実行」命令を使用して、データRAM122行をmux−reg208に読み出すことができる。MULT−ACCUM/実行命令は、ループ4との関連でより詳細に説明するように、重みRAM124から行を読み出すことをさらに指定することができる。データRAM122行を読み出した後、次いでループ2の各反復がループ3を行う。
【0431】
ループ3の各反復はループ4を行ってから、mux−reg208を循環させて、入力ブロック5902を次の隣接するNPUブロック5906と位置合わせする。有利な点として、これにより、各NPU126ブロックが、C個のチャネルのうち異なるチャネルについての、すなわち、NPUブロック5906との位置合わせへと今回循環された入力ブロック5902に関連付けられたチャネルについての、新たな列和を累算することができる。好ましくは、ループ4の完了時、mux−reg208内の入力ブロック5902は、下記でさらに説明するように、Sワードだけ循環されたことになる。したがって、入力ブロック5902を次の隣接するNPUブロック5906に位置合わせするために、非アーキテクチャプログラムは、好ましくは、mux−reg208を、B−Sワードだけ循環させる。ただし、非アーキテクチャプログラムの実装に依存して、また特にループ4で、位置合わせする循環は、mux−reg208を、B−S+1ワードだけ循環させることを必要とする場合もある。非アーキテクチャプログラムは、上記のような1つ又は複数のMULT−ACCUM命令又は「実行」命令を使用してmux−reg208を循環させて、入力ブロック5902を次の隣接するNPUブロック5906に位置合わせすることができる。下記で
図70及び
図71との関連で説明するように、1つ又は複数の非アーキテクチャ命令は、マルチワード距離循環を含むことができる。したがって、観察できるように、ループ2の各反復は、F個の列チャネル行和、すなわち畳み込みを作り出し、それらをデータRAM122の行に書き込む。
【0432】
「有効な」畳み込みが行われる実施形態が説明されるが、「同一サイズ」の畳み込みが行われる他の実施形態が企図される。有効な畳み込みと同一サイズの畳み込みとの違いは、入力5802の端がどのように扱われるかに関係し、それはひいては出力5808のサイズに影響する。有効な畳み込みは、入力5802よりもより少ない数の行及び列を持つ出力5808を作り出すのに対し、同一サイズの畳み込みは、入力5802と同じ数の行及び列を持つ出力5808を作り出す。例えば、12×12の入力と5×5のフィルタとの有効な畳み込みを行うと8×8の出力が生成されるのに対し、12×12の入力と5×5のフィルタとの同一サイズの畳み込みを行うと12×12の出力が生成される。これを達成するために、有効な畳み込み演算は、入力のうち実際に存在する値、すなわち「有効な」値だけに積和を行い、対して、同一サイズの畳み込み演算は、入力に実際には存在しない4行及び4列の値、すなわち「無効な」値を仮定しなければならない。同一サイズの畳み込み演算は、いくつかの無効な値(例えば、通例はゼロ)を仮定しなければならない。これは、5×5のフィルタが12×12の入力にかけられる時、乗算される対応する入力5802の要素がない4つの行が右端(若しくは左端又はそれらの組み合わせ)に存在するためである。
【0433】
次いでまとめて
図61と参照される
図61A及び
図61Bを参照すると、12×12×20の入力5802に50個の5×5フィルタ5804を畳み込んで50個の8×8出力5808を生成する一実施形態による、データRAM122内の入力ブロック5902のグループのレイアウト6101、及び重みRAM124内のフィルタブロック5904のグループのレイアウト6102を図示するブロック図が示される。
図61の例は、1024個のNPU126を持つNNU121を仮定しており、すなわちN=1024である(
図59参照)。その結果、ハイパーパラメータW=12であるので、B=16になり、これはすなわち、少なくともWと同じ大きさの、Nの最小の因数である。また、B=16であるので、G=1024/16=64となる。したがって、64個のNPUブロック5906があり、データRAM122の行当たり64個の入力ブロック5902があり、重みRAM124の行当たり64個のフィルタブロック5904がある。
図61は、ゼロ基準の入力ブロック索引0〜63及びフィルタブロック索引0〜63を示しており、これらは、
図59に関連して上記で説明したように、NPUブロック索引0〜63に対応している。すなわち、0の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引0を持つNPUブロック5906によって受け取られ、1の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引1を持つNPUブロック5906によって受け取られ、以下同様に続き、63の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引63を持つNPUブロック5906によって受け取られる。
図61の実施形態では、索引0にある入力ブロックは、データRAM122のワード0〜15を含んでおり、索引1にある入力ブロックは、データRAM122のワード16〜31を含んでおり、以下同様に続き、索引63にある入力ブロックは、データRAM122のワード1008〜1023を含んでいる。同様に、索引0にあるフィルタブロックは、重みRAM124のワード0〜15を含んでおり、索引1にあるフィルタブロックは、重みRAM124のワード16〜31を含んでおり、以下同様に続き、索引63にあるフィルタブロックは、重みRAM124のワード1008〜1023を含んでいる。
【0434】
図61は、64個の入力ブロックグループを示している。入力ブロックグループのうち60個は、入力ブロック索引0〜59にあり、総称してI[c]と表され、cは、C=20個のチャネルのチャネル索引を表す。C=20個のチャネルに関連付けられた20個の入力ブロックグループ、すなわちI[0]〜I[19]の、3つのインスタンス又はコピーが、下記でより詳細に説明するように、入力ブロック索引0〜59にわたって並べられている。入力ブロックグループのうち4つは、ギャップ入力ブロックグループ6103と呼ばれ、I[G]と表され、入力ブロック索引60〜63にある。好ましくは、ギャップ入力ブロックグループ6103はゼロ値を含んでいる。入力ブロックグループI[c]は、データRAM122のH個の異なる行にあるH個の入力ブロック5902からなるグループであり、すべて、データRAM122内で同じ入力/フィルタ/NPUブロック索引に配置される。したがって、ある入力ブロックグループのすべての入力ブロック5902は、同じNPUブロック5906に提供される。さらに、各入力ブロックグループI[c]は、下記で説明するように、入力5802のチャネルcについてのH×Wの縦方向(vertical)スライスの要素を保持するか、又は、ギャップ入力ブロックグループ6103の場合はゼロを保持する。より具体的には、入力ブロックグループI[c]のH個の入力ブロック5902の各入力ブロック5902は、入力5802のチャネルcのH×W縦方向スライスの要素の各自の行を保持する。
【0435】
図61の文脈では、入力ブロックグループI[c]は、データRAM122の12個の異なる行にある12個の入力ブロック5902からなるグループである。(
図61の実施形態では、12個の行はデータRAM122内で隣接しており、すなわち行0〜11にあるが、それらの行が隣接しておらず、非アーキテクチャプログラムがそれに応じて、入力ブロック5902があるデータRAM122の行をアドレス指定するように変更を加えられる他の実施形態が企図される。)したがって、各入力ブロックグループは、入力ブロック当たり16ワード×12行=データRAM122の192ワードを有する。ただし、
図62に示されるように、各入力ブロック5902は、入力5802のうち各自の行h及びチャネルcのW=12個の要素だけを保持し、入力ブロック5902のうち残りのB−W=16−12=4ワードは使用されない(且つ一実施形態ではゼロである)。より具体的には、各入力ブロックグループI[c]は、入力5802のチャネルcについての12×12縦方向スライスの要素(
図62の6215参照)、又はギャップ入力ブロックグループ6103の場合はゼロを保持する。
図61の入力ブロックグループI[c]の12個の入力ブロック5902の各々は、入力5802のチャネルcの12×12縦方向スライス6215の要素の各自の行を保持する。入力ブロックグループI[c]については、
図62との関連でより詳細に説明する。
図61及び
図62の例は、データRAM122の行0〜11に記憶された入力ブロックグループを示しているが、入力ブロックグループは他の行に記憶されてもよい。すなわち、
図61では、入力ブロックグループI[c]を保持するデータRAM122の行の行番号は、入力5802の行番号に対応しているが、これは偶然であり、他のデータRAM122行が入力ブロックグループを記憶する場合もあり、また上述のように、データRAM122行は、実施形態によっては隣接しない場合もある。
【0436】
図61の例では、データRAM122は、64個の入力ブロックグループを保持しており、各グループに12個の入力ブロック5902があり、
図61の例では合計で768個の入力ブロック5902があり、それが、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで50個の8×8出力5806を作り出す。しかし、64個の入力ブロック索引があり、チャネルは20個だけなので、20個のチャネルは、入力ブロック索引0〜59にわたって3回並べられ、入力ブロック索引60〜63の入力ブロックグループは、入力5802からの要素ではなく、ゼロ値を保持する。すなわち、示されるように、入力ブロックグループI[0]が入力ブロック索引0にあり、入力ブロックグループI[1]が入力ブロック索引1にあり、以下同様に続き、入力ブロックグループI[19]が入力ブロック索引19にある。次いで、このパターンが繰り返され、すなわち、入力ブロックグループI[0]が入力ブロック索引20にあり、入力ブロックグループI[1]が入力ブロック索引21にあり、以下同様に続き、入力ブロックグループI[19]が入力ブロック索引39にある。次いで、このパターンがもう1回繰り返され、すなわち、入力ブロックグループI[0]が入力ブロック索引40にあり、入力ブロックグループI[1]が入力ブロック索引41にあり、以下同様に続き、入力ブロックグループI[19]が入力ブロック索引59にある。入力ブロック索引60〜63にあるギャップ入力ブロックグループ6103はゼロを投入され、そのため、それらから生成される列和はゼロになり、したがって、累算器202内で累算された時に、最終的な列チャネル行和に寄与しない。
【0437】
ハイパーパラメータによって必要とされる場合には、下記でより詳細に説明するように、ギャップ入力ブロックグループ6103及びギャップフィルタブロックグループ6104が存在し、N個のmux−reg208からなる循環器を使用した、NNU121を回る入力ブロック5902の循環を容易にする。
【0438】
図61は、64×24=1536個のフィルタブロックグループを示しており、これは総称してF[f,c]と表され、ここでfは、F個のフィルタ5804のうちのフィルタを表し、cは、C=20個のチャネルのチャネル索引を表し、又は、F[G]と表され、F[G]は、ギャップフィルタブロックグループ6104を表す。好ましくは、ギャップフィルタブロックグループ6104はゼロ値を含んでいる。ギャップフィルタブロックグループF[G]の目的は、それにギャップ入力ブロックグループI[G]を畳み込むことである。フィルタブロックグループF[f,c]は、重みRAM124のR×S個の異なる行にあるR×S個のフィルタブロック5904からなるグループであり、すべてが、重みRAM124内で同じ入力/フィルタ/NPUブロック索引内に配置される。したがって、フィルタfのすべてのフィルタブロックグループのすべてのフィルタブロック5904が、同じNPUブロック5906に提供される。さらに、各フィルタブロックグループF[f,c]は、フィルタ5804、fのチャネルcについてのR×S縦方向スライスの重み(
図62の6209参照)か、又はギャップフィルタブロックグループF[G]の場合はゼロを保持する。より具体的には、
図62との関連でより詳細に説明するように、フィルタブロックグループF[f,c]のR×S個のフィルタブロック5904の各フィルタブロック5904は、フィルタ5804、fのチャネルcのR×S縦方向スライス6209の異なる重みのP個のコピーを保持する。
【0439】
図61の文脈では、フィルタブロックグループF[f,c]は、重みRAM124の25個の異なる行にある25個のフィルタブロック5904からなるグループである。(
図61の実施形態では、25個の行は、重みRAM124内で隣接しており、すなわち0〜24、25〜49などにあるが、それらの行が隣接しておらず、非アーキテクチャプログラムがそれに応じて、フィルタブロック5904がある重みRAM124の行をアドレス指定するように変更を加えられる他の実施形態が企図される。)
図66及び
図68は、フィルタブロックグループ及びフィルタブロックグループ内でのフィルタブロック5904の編成が異なる実施形態を説明している。したがって、
図61の各フィルタブロックグループF[f,c]は、フィルタブロック当たり16ワード×フィルタブロックグループ当たり25個のフィルタブロック5904(重みRAM124の25行にある)=重みRAM124の400ワードを有する。ただし、
図62に示されるように、各フィルタブロック5904は、フィルタ5804、fのうち各自の列s、各自の行r、及びチャネルcの重みのコピーをP=8個のみ保持しており、フィルタブロック5904の残りのB−P=16−8=8個のワードは使用されない(且つ一実施形態ではゼロである)。より具体的には、各フィルタブロックグループF[f,c]は、フィルタ5804、fのチャネルcについての5×5縦方向スライス6209の重み、又はギャップフィルタブロックグループ6104の場合はゼロを保持する。より具体的には、
図62との関連でより詳細に説明するように、フィルタブロックグループF[f,c]の25個のフィルタブロック5904の各フィルタブロック5904は、フィルタ5804、fのチャネルcの5×5縦方向スライス6209のうち異なる重みのコピーを8つ保持する。
【0440】
図61の例では、重みRAM124は、64×24=1536個のフィルタブロックグループを保持しており、各グループに25個のフィルタブロック5904があり、
図61の例では合計で38,400個のフィルタブロック5904があり、それが、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで50個の8×8出力5806を作り出す。しかし、フィルタ5804は50個しかないので、64−50=14個のNPUブロック5906は、使用されない畳み込みを作り出し、したがって、示されるように、フィルタブロック索引50〜63のフィルタブロックグループは、無関係値を含んでいる。示されるように、フィルタブロックグループF[0,0]〜F[0,19]及び4つのギャップフィルタブロックグループF[G]がフィルタブロック索引0にあり、フィルタブロックグループF[1,0]〜F[1,19]及び4つのギャップフィルタブロックグループF[G]がフィルタブロック索引1にあり、以下同様に続き、フィルタブロックグループF[49,0]〜F[49,19]及び4つのギャップフィルタブロックグループF[G]がフィルタブロック索引49にある。そして、フィルタブロック索引50〜63にあるフィルタブロックグループは無関係値である。
【0441】
上述のように、入れ子ループ構造は、有利な点として、NNU121の循環器mux−reg208構造を使用して、入力5802のC個のチャネルすべてに関連付けられた入力ブロック5902を循環させ、その結果、F個のフィルタ5804に関連付けられたG個のNPUブロック5906のうちF個の各々は、自身の対応するフィルタ5804を畳み込む入力5802のC個のチャネルすべてが見える。ただし、ブロックの数G=64がチャネルの数C=20で割り切れないことから、ギャップ入力ブロックグループI[G]の存在の必要性と、非アーキテクチャプログラムのループ3が、C=20個のチャネルに対する20回を超えて4回多く(64%20=4。これがギャップ入力ブロックグループI[G]の数である)反復する必要性が生じる。より具体的には、右への循環を仮定すると、索引19〜49にあるNPUブロック5906には、チャネル0〜19の入力ブロック5902がすべて見えるのに対し、索引0〜18にあるNPUブロック5906には見えないことになる。例えば、索引18にあるNPUブロック5906にはチャネル0〜18は見えるが、チャネル19は、チャネル19が入力ブロック索引60〜63の1つに含まれているのでない限り、見えないことになる。別の例として、索引0にあるNPUブロック5906にはチャネル0及び5〜19は見えるが、チャネル1〜4は、チャネル1〜4が入力ブロック索引60〜63に含まれているのでない限り、見えないことになり、その場合、チャネル19を入力ブロック索引60〜63の1つに含めて索引18のNPUブロック5906を満足させることはできない。
【0442】
この問題に対処するために、ギャップ入力ブロックグループI[G]を導入して、それらを使用して生成される列和がゼロ値を有する(ギャップ入力ブロックグループI[G]内のゼロ値及び/又はそれらに対応するギャップフィルタブロックグループF[G]内のゼロ値のために)ことを保証し、よって、結果得られるゼロ値の列チャネル和が、最終的な列チャネル行和には寄与しないものの、ギャップ入力ブロックグループI[G]の数の追加的なループ3の反復の結果、十分な回数の循環を可能にして、すべてのNPUブロック5906が20個のチャネルすべてを見えるようにする。したがって、
図63のループ3の反復カウントがC=20ではなく24であるために、各NPU126は、1つの列チャネル行和当たり、すなわち畳み込み結果当たり、ギャップがない場合(例えば
図64〜
図65及び
図68〜
図69の実施形態)に必要となるのに比べて、5×4×5=100個の追加的な列和を生成する。ただし、有利な点として、ギャップ入力ブロックグループI[G]及び/又はギャップフィルタブロックグループF[G]のゼロ値は、NPU126に、列チャネル行和当たりの追加的な100個の列和について、ゼロ値を生成させる。
【0443】
非アーキテクチャプログラムは、入力5802の対応する要素がNPU126のmux−reg208に存在するときには、該当するフィルタ5804の適切な重みをレジスタ705に読み出すように、重みRAM124をアドレス指定する。非アーキテクチャプログラムによる重みRAM124のアドレス指定は、重みRAM124内のフィルタ5804の重みのレイアウトと連携される。非アーキテクチャプログラムによる重みRAM124のアドレス指定及びそれに連携した重みのレイアウトの様々な実施形態が企図され、
図61及び
図66は、ギャップが含まれる2つの異なる実施形態を記載しており、
図64及び
図68は、ギャップが含まれない2つの異なる実施形態を記載している。
【0444】
図61の例に示されるように、フィルタブロック索引0については、F[0,0]が重みRAM124の行0〜24を占め、ギャップフィルタブロックグループF[G]が行25〜124を占め、F[0,19]が行125〜149を占め、F[0,18]が行150〜174を占め、以下同様に続き、F[0,1]が行575〜599を占める。フィルタブロック索引1については、F[1,1]が行0〜24を占め、F[1,0]が行25〜49を占め、ギャップフィルタブロックグループF[G]が行50〜149を占め、F[1,19]が行150〜174を占め、F[1,18]が行175〜199を占め、以下同様に続き、F[1,2]が行575〜599を占める。以下同様に続き、フィルタブロック索引19については、F[19,19]が行0〜24を占め、F[19,18]が行25〜49を占め、F[19,17]が行50〜74を占め、以下同様に続き、F[19,00]が行475〜499を占め、ギャップフィルタブロックグループF[G]が行500〜599を占める。フィルタブロック索引20については、F[20,0]が行0〜24を占め、F[20,19]が行25〜49を占め、F[20,1]が行50〜74を占め、以下同様に続き、F[20,1]が行475〜499を占め、ギャップフィルタブロックグループF[G]が行500〜599を占める。フィルタブロック索引21については、F[21,1]が行0〜24を占め、F[21,00]が行25〜49を占め、F[21,19]が行50〜74を占め、以下同様に続き、F[21,2]が行475〜499を占め、ギャップフィルタブロックグループF[G]が行500〜599を占める。以下同様に続き、フィルタブロック索引39については、F[39,19]が行0〜24を占め、F[39,18]が行25〜49を占め、F[39,17]が行50〜74を占め、以下同様に続き、F[39,00]が行475〜499を占め、ギャップフィルタブロックグループF[G]が行500〜599を占める。フィルタブロック索引40については、F[40,0]が行0〜24を占め、F[40,19]が行25〜49を占め、F[40,1]が行50〜74を占め、以下同様に続き、F[40,1]が行475〜499を占め、ギャップフィルタブロックグループF[G]が行500〜599を占める。フィルタブロック索引41については、F[41,1]が行0〜24を占め、F[41,00]が行25〜49を占め、F[41,19]が行50〜74を占め、以下同様に続き、F[41,2]が行475〜499を占め、ギャップフィルタブロックグループF[G]が行500〜599を占める。以下同様に続き、フィルタブロック索引49については、F[49,09]が行0〜24を占め、F[49,08]が行25〜49を占め、F[49,07]が行50〜74を占め、以下同様に続き、F[49,10]が行475〜499を占め、ギャップフィルタブロックグループF[G]が行500〜599を占める。フィルタブロック索引50〜63のフィルタブロックグループ内の値は、無関係である。
図61の例は、重みRAM124の行0〜599に記憶されたフィルタブロックグループを示しているが、フィルタブロックグループF[f,c]が他の行に記憶される他の実施形態が企図される。
【0445】
NPU126に
図61の様々なフィルタブロックグループの重みを読み込むための重みRAM124のアドレス指定については、
図63との関連でより詳細に説明する。一般に、所与のフィルタブロック索引のフィルタブロックグループF[f,c]のチャネルcの値を上から下へと見たときに、列値cの順序(ギャップを考慮に入れる)が、入力ブロックグループがNNU121を回って循環される時に、索引がフィルタブロック索引に対応するNPUブロック5906によって、入力ブロックグループのチャネルc(ギャップを考慮に入れる)が見られる順序であることが観察できよう。さらに、入力ブロック5902の循環と、
図63の疑似コードに従って非アーキテクチャプログラムによって行われる重みRAM124のアドレス指定とにより、ギャップフィルタブロックグループF[G]とギャップ入力ブロックグループI[G]を同時にNPU126内に存在させ、したがってゼロ値の列和を生成させる。
【0446】
ゼロと任意の値との積はゼロであるので、ギャップ入力ブロック6103とギャップフィルタブロック6104の両方ではなく、一方だけがゼロを含んでいることが必要である。したがって、フィルタ5804の重みは事前に決定されるが、入力5802はネットワークの前の層によって動的にサンプリング又は生成される実施形態では、ギャップフィルタブロックグループ6104にゼロ値を持たせて、ギャップ入力ブロックグループ6103をゼロアウトする必要を回避すると有利である可能性がある。ただし、ギャップ入力ブロックグループ6103がゼロである他の実施形態が企図される。
【0447】
次いで
図62を参照すると、
図61の入力ブロックグループI[c]、フィルタ5804、f、及びチャネルcの5×5縦方向スライス6209、
図61のフィルタブロックグループF[f,c]、並びに
図59の出力ブロック5908を図示するブロック図が示される。
【0448】
図62に示される入力ブロックグループI[c]は、12個の行及び16個の列を含んでいる。16個の列は、0〜15と索引が付けられ、入力ブロック5902の16ワードに対応する。
図62に示されるように、各列索引値は、B=16を法とした(modulo)データRAM122の列番号である。したがって、例えば、
図62の入力ブロックグループI[c]が、入力ブロック索引21にある
図61の入力ブロックグループI[01]のコピーに対応すると仮定する。入力ブロック索引21にある入力ブロック5902は、データRAM122の列336〜351にある。したがって、列339の入力ブロック索引21にある入力ブロックグループI[01]のワードは、入力ブロックグループ索引339%16=3にある。
図62の例では、入力ブロックグループI[c]の12個の行は、データRAM122の行0〜11にあるものと示されているが、データRAM122の他の行にあってもよい。入力ブロックグループI[c]の12個の行及び列0〜11から構成される2D行列は、チャネルcに対応する入力5802の12×12縦方向スライス6215を投入される。縦方向スライス6215は、所与のチャネルcにおける入力5802の12個の行及び12個の列の要素である。
【0449】
入力ブロックグループI[c]の列12〜15は使用されない。ただし、ハイパーパラメータWが12より大きいネットワークでは、それらの列のいくつか又はすべてが使用される可能性があることに留意されたい。例えば、Wが14である場合は、列12及び13が使用されることになる。加えて、ネットワークが有効な畳み込みではなく同一サイズの畳み込みを行う場合には、パディング要素(例えばゼロ)を列12〜15並びに行12〜15に含めることができるが、パディング要素を、例えば実際の入力5802要素の端にある異なる行及び/又は列に入れる他のパディング実施形態が企図され、その場合、パディング要素は、入力ブロックグループI[c]の左右及び上下の端に沿って比較的均等に分散される。
【0450】
所与のチャネルcにおけるフィルタ5804、fの5×5縦方向スライス6209は、チャネルcにおけるフィルタ5804の5個の行及び5個の列の重みから構成される。フィルタブロックグループの説明で使用するために、5×5縦方向スライス6209の25個の要素の各々を0〜24と標記する。より具体的には、左から右へと、行0の要素は0〜4と標記され、行1の要素は5〜9と標記され、行2の要素は10〜14と標記され、行3の要素は15〜19と標記され、行4の要素は20〜24と標記される。
【0451】
図62のフィルタブロックグループF[f,c]は、25個の行及び16個の列を含んでいる。16個の列は、0〜15の索引が付けられ、フィルタブロック5904の16ワードに対応する。
図62に示されるように、各列索引値は、B=16を法とした重みRAM124の列番号である。したがって、例えば、
図62のフィルタブロックグループF[f,c]が、フィルタブロック索引21にある
図61のフィルタブロックグループF[21,17]に対応すると仮定する。フィルタブロック索引21にあるフィルタブロック5904は、重みRAM124の列336〜351にある。したがって、列339のフィルタブロック索引21にあるフィルタブロックグループF[21,17]のワードは、フィルタブロックグループ索引339%16=3にある。
図62の例では、フィルタブロックグループF[f,c]の25個の行は、重みRAM124の行0〜24にあるものと示されているが、重みRAM124の他の行にあってもよい。
【0452】
フィルタブロックグループF[f,c]の25個の行の各行は、フィルタブロック索引4〜11に、5×5縦方向スライス6209の25個の重みのそれぞれの重みのコピーをP=8個含んでいる。行0〜24を順に取り上げると、それぞれの重みは行0及び列4で開始して列0を通り、次いで行1及び列4から列0を通り、以下同様に続き、行4及び列4から列0を通る。したがって、行0は重み4の8個のコピーを含み、行1は重み3の8個のコピーを含み、以下同様に続き、行4は重み0の8個のコピーを含んでいる。行5は重み9の8個のコピーを含み、行6は重み8の8個のコピーを含み、以下同様に続き、行9は重み5の8個のコピーを含んでいる。行10は重み14の8個のコピーを含み、行11は重み13の8個のコピーを含み、以下同様に続き、行14は重み10の8個のコピーを含んでいる。行15は重み19の8個のコピーを含み、行16は重み18の8個のコピーを含み、以下同様に続き、行19は重み15の8個のコピーを含んでいる。そして、行20は重み24の8個のコピーを含み、行21は重み23の8個のコピーを含み、以下同様に続き、行24は重み20の8個のコピーを含んでいる。入力ブロックグループI[c]内での入力5802の要素の編成と併せた、フィルタブロックグループF[f,c]内の縦方向スライス6209の重みのこの編成は、入力ブロック5902の入力5802要素が内側ループ4に従ってNPUブロック5906をとおして循環されるとき、5×5縦方向スライス6209の対応する重みが、縦方向スライス6209によりオーバーレイされる入力5802の5×5部分行列の対応する要素によって乗算されることをもたらす。
【0453】
フィルタブロックグループF[f,c]の列0〜3及び12〜15は、有効な畳み込みが行われる実施形態では使用されない。ただし、ハイパーパラメータWが12より大きいネットワークでは、それらの列のいくつか又はすべてが使用される可能性があることに留意されたい。例えば、Wが14である場合は、列12及び13も重みのコピーを含むことになる。加えて、ネットワークが有効な畳み込みではなく同一サイズの畳み込みを行う場合には、重みのコピーを列0〜3及び12〜15の1つ又は複数に含めて、パディング要素で乗算することができる。
【0454】
図62の出力ブロック5908は、1つの行及び16個の列を含んでいる。16個の列は0〜15の索引が付けられ、出力ブロック5908の16ワードに対応する。
図62に示されるように、各列索引値は、B=16を法としたNPU126の番号又はデータRAM122(若しくは重みRAM124)の列番号である。したがって、例えば、
図62の出力ブロック5908が出力ブロック索引21に対応すると仮定する。出力ブロック索引21にある出力ブロック5908は、データRAM122(又は重みRAM124)の列336〜351にある。したがって、列339の出力ブロック索引21にある出力ブロック5908のワードは、出力ブロックグループ索引339%16=3にある。出力ブロック5908のワードは、列4〜11に、8個の畳み込み結果、すなわち列チャネル行和として示されており、それらはR0〜R7と表され、それぞれ出力5806のP=8個の列の列0〜7に対応する。すなわち、各NPUブロック5906内で、NPU4が、出力ブロック5908の列4に対応する出力5806の列0についての畳み込み結果、すなわち列チャネル行和を生成し、NPU5が、出力ブロック5908の列5に対応する出力5806の列1についての畳み込み結果を生成し、以下同様に続き、NPU11は、出力ブロック5908の列5に対応する出力5806の列7についての畳み込み結果を生成し、NPU0〜3及び12〜15は、使用されない結果を生成する。上記の入力ブロックグループI[c]及びフィルタブロックグループF[f,c]と同じように、ネットワークのハイパーパラメータが異なる場合、且つ/又は有効な畳み込みではなく同一サイズの畳み込みが生成される場合には、列0〜3及び12〜15が使用されることもある。
【0455】
次いで
図63を参照すると、N=1024個のNPU126を有するNNU121で実行される非アーキテクチャプログラムによって行われて、
図61のデータRAM122及び重みRAM124のレイアウトを併用して、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで50個の8×8出力5806を生成する計算を図示する疑似コードが示される。
図63の疑似コードは、多くの点で
図60の疑似コードに似ているが、少なくとも3つの点が異なる。第1に、
図63の疑似コードは、
図61に示されるように、4つのギャップ入力ブロックグループI[G]を仮定している。第2に、
図63の疑似コードは、
図61のメモリレイアウトを仮定したデータRAM122及び重みRAM124のアドレス指定の仕様を含んでいる。第3に、
図63の疑似コードは、上述のハイパーパラメータ及びNの値を仮定している。したがって、ライン2ではQ=8であり、ライン6ではR=5であり、ライン9ではC=20であり、ギャップの数=4であり、合計で24回の反復があり、ライン11ではS=5であり、ライン19では位置合わせ循環量が11である。
図60については上記で広範に説明したため、
図63のラインのうち
図60と異なるラインのみを説明する。
【0456】
ライン1で、すなわち疑似コードの開始時に、データRAM122行がゼロに初期化され、ライン4で重みRAM124行がゼロに初期化される。
【0457】
ライン9で、ループ3の反復回数は24回である。これは、24が、C=20個のチャネルと、4であるギャップ数との和であるためである。24の反復カウントにより、すべてのNPUブロック5906、詳細には例えば索引0〜18にあるものが、20個のチャネルすべてについて入力ブロックグループI[c]を見えるようになる。
【0458】
ライン16で、重みRAM124行が1だけ増分され、そのため、ループ4の次の反復では、重みRAM124の次の行がレジスタ705に読み出され、この行は、
図62のフィルタブロックグループF[f,c]の次の行の重みのコピーを8個含んでいる。ループ4の1回の実行インスタンスにつき、フィルタブロックグループF[f,c]の25行のうち5行だけが、現在のチャネルcについてレジスタ705に読み込まれる。
【0459】
ライン18で、重みRAM124行が20だけ増分され、20は、R=5とS=5との積からS=5を引いたものである。このことは、重みRAM124行を、次のチャネルcについての次のフィルタブロックグループF[f,c]に向け、そのため、ループ3の次の反復(ループ4の次の実行インスタンス)で、フィルタブロックグループF[f,c]の25行のうちもう5行が、次のチャネルcのためにレジスタ705に読み込まれる。この理由は、各フィルタブロックグループF[f,c]はその上にあるフィルタブロックグループF[f,c]から重みRAM124の25行分だけオフセットしているものの、ループ4の実行インスタンスが、ループ4によるライン16の5回の実行インスタンスに従って重みRAM124行を5だけ増分したためである。したがって、ループ4の実行インスタンスごとに、フィルタブロックグループF[f,c]の行のうち5分の1(一般には、1/R)だけが読み出され、使用される。フィルタブロックグループF[f,c]の残りの行は、ループ2についての後の反復で読み出され、使用される。
【0460】
ライン19で、mux−reg208が11だけ循環され、11は、B=16とS=5とにおける差である。このことは、入力ブロック5902を次の隣接するNPUブロック5906に位置合わせする。この理由は、NPUブロック5906の幅はN=16であるが、入力ブロック5902は、ループ4によるライン15の5回の実行インスタンスに従って、すでに5だけ循環されているためである。上述のように、11の循環は、ROTATE by 8命令、ROTATE by 2命令、及びROTATE by 1命令の組み合わせによって達成することができる。ループ4及び/又はループ3の1回の反復を展開してライン19で12の循環が行われるようにする実施形態が企図され、これはROTATE by 8命令とROTATE by 4命令の組み合わせによって達成することができる。
【0461】
ライン21で、データRAM122行が1だけ増分され、そのため、ループ2の次の反復で、ライン13においてデータRAM122の次の行がmux−reg208に読み出され、この行は、
図61に示されるように、入力5802の次の行、すなわち各入力ブロック索引にある入力ブロックグループI[c]の次の入力ブロック5902を含んでいる。
【0462】
ライン22で、重みRAM124行が575だけ減分され、575は25と23との積である。値25はR=5とS=5との積であり、25は、各フィルタブロックグループF[f,c]の行の数である。より具体的には、ループ3の各反復は、重みRAM124行を25だけ増分し、それによりループ3の次の反復を、フィルタブロックグループF[f,c]の先頭に向ける。値23は、C=20と4つのギャップとの和から1を引いたものである。この理由は、ループ2の実行インスタンスごとに、ループ3が、24個のフィルタブロックグループすべてを通って反復するためである。575の減分により、重みRAM124行が、各フィルタブロック索引内で先頭のフィルタブロックグループF[f,c]をポイントするようになり、フィルタブロックグループF[f,c]の中で、ループ2の現在の反復が始まった行から5行下の行をポイントするようになる。
【0463】
ライン25で、データRAM122行が4だけ減分され、4はR=5から1を引いたものである。このことは、データRAM122行を、ループ1の現在の反復で畳み込まれる入力5802の1番目の行の後の、入力5802の次の行に向け、そのため、ループ1の次の反復中に、入力5802のうち次の下にある部分行列を畳み込むために、3Dフィルタ5804が効果的に入力5802の1行分だけ下にずらされる。例えば、ループ1の現在の反復が入力5802の行3〜7にフィルタ5804を畳み込んで累算器202を出力ブロック5908に書き込んだ場合、ライン25は、ループ1の次の反復に、入力5802の行4〜8にフィルタ5804を畳み込ませるように動作する。
【0464】
次いで、まとめて
図64と参照される
図64A及び
図64Bを参照すると、ギャップ入力/フィルタブロックグループを含まずに、12×12×20入力5802に50個の5×5フィルタ5804を畳み込んで50個の8×8出力5808を生成するための代替的な一実施形態による、データRAM122内の入力ブロック5902のグループのレイアウト6401、及び重みRAM124内のフィルタブロックのグループ5904のレイアウト6402を図示するブロックが示される。
図64の例は、多くの点で
図61と似ているが、違いを説明する。
【0465】
図64の例は、2048個のNPU126を有するNNU121を仮定しており、すなわちN=2048である。その結果、ハイパーパラメータがW=12であるので、B=16となり、これはすなわち、少なくともWと同じ大きさの、Nの最小の因数である。またB=16であるので、G=2048/16=128となる。したがって、128個のNPUブロック5906があり、データRAM122の行当たり128個の入力ブロック5902があり、重みRAM124の行当たり128個のフィルタブロック5904がある。
図64は、ゼロ基準の入力ブロック索引0〜127及びフィルタブロック索引0〜127を示しており、これらは、上記で
図59との関連で説明したように、NPUブロック索引0〜127に対応している。すなわち、0の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引0を持つNPUブロック5906によって受け取られ、1の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引1を持つNPUブロック5906によって受け取られ、以下同様に続き、127の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引127を持つNPUブロック5906によって受け取られる。
図64の実施形態では、索引0にある入力ブロックは、データRAM122のワード0〜15を含んでおり、索引1にある入力ブロックは、データRAM122のワード16〜31を含んでおり、以下同様に続き、索引127にある入力ブロックは、データRAM122のワード2032〜2047を含んでいる。同様に、索引0にあるフィルタブロックは、重みRAM124のワード0〜15を含んでおり、索引1にあるフィルタブロックは、重みRAM124のワード16〜31を含んでおり、以下同様に続き、索引127にあるフィルタブロックは、重みRAM124のワード2032〜2047を含んでいる。
【0466】
図64は、69個の入力ブロックグループを示している。69個の入力ブロックグループは、入力ブロック索引0〜49及び109〜127にあり、総称してI[c]と表され、cは、C=20個のチャネルのチャネル索引を表す。20個の入力ブロックグループI[0]〜I[19]が、入力ブロック索引0〜19にある。加えて、20個の入力ブロックグループI[0]〜I[19]が、入力ブロック索引20〜39にある。さらに、10個の入力ブロックグループI[0]〜I[9]が、入力ブロック索引40〜49にある。最後に、19個の入力ブロックグループI[1]〜I[19]が、入力ブロック索引109〜127にある。入力ブロック索引50〜108にある入力ブロック5902は使用されない。ギャップ入力ブロックグループ6103は、
図64の実施形態には含まれない。
【0467】
図64は、50×20=1000個のフィルタブロックグループを示し、これを総称してF[f,c]と表し、fは、F個のフィルタ5804のうちのフィルタを表し、cは、C=20個のチャネルのチャネル索引を表す。ギャップフィルタブロックグループ6104は、
図64の実施形態には含まれない。
図64の例では、重みRAM124は128×20=2560個のフィルタブロックグループを保持し、各グループに25個のフィルタブロック5904があり、
図64の例では合計で64,000個のフィルタブロック5904があり、それが、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで50個の8×8出力5806を作り出す。しかし、フィルタ5804は50個しかないので、128−50=78個のNPUブロック5906は、使用されない畳み込みを作り出し、したがって、示されるように、フィルタブロック索引50〜127のフィルタブロックグループは無関係値を含んでいる。示されるように、フィルタブロックグループF[0,0]〜F[0,19]はフィルタブロック索引0にあり、フィルタブロックグループF[1,0]〜F[1,19]はフィルタブロック索引1にあり、以下同様に続き、フィルタブロックグループF[49,0]〜F[49,19]はフィルタブロック索引49にあり、フィルタブロック索引50〜127にあるフィルタブロックグループは、無関係値である。あるフィルタブロック索引にあるフィルタブロックグループの縦方向の順序付けは、ギャップフィルタブロックグループがない場合の
図61の順序付けと同じである。したがって、
図61で100行を占める4つのギャップフィルタブロックグループが存在しないことに起因して、行0〜499だけが使用される。
【0468】
上述のように、入れ子ループ構造は、有利な点として、NNU121の循環器mux−reg208構造を使用して、入力5802のC個のチャネルすべてに関連付けられた入力ブロック5902を循環させ、その結果、F個のフィルタ5804に関連付けられたG個のNPUブロック5906のうちF個の各々は、自身の対応するフィルタ5804を畳み込む入力5802のC個のチャネルすべてが見える。有利な点として、上記のように、入力ブロックグループI[1]〜I[19]は、入力ブロック索引109〜127にあり、そのため、入力ブロックグループI[0](すなわちチャネル0の入力5802)に加えて、索引0のNPUブロック5906は、入力ブロックグループI[1]〜I[19]をさらに見ることができる。なぜならば、それらがNPUブロック0まで循環されるためである。同様に、入力ブロックグループI[2]〜I[19]は、入力ブロック索引110〜127にあり、そのため、入力ブロックグループI[0]及びI[1]に加えて、索引1のNPUブロック5906は、入力ブロックグループI[2]〜I[19]をさらに見ることができる。なぜならば、それらがNPUブロック1まで循環されるためである。以下同様に続き、入力ブロックグループI[19]は、入力ブロック索引127にあり、そのため、入力ブロックグループI[0]〜I[18]に加えて、索引18のNPUブロック5906は、入力ブロックグループI[19]をさらに見ることができる。なぜならば、それがNPUブロック18まで循環されるためである。したがって、ブロックの数G=128がチャネルの数C=20で割り切れないことによって、ギャップ入力ブロックグループI[G]の存在の必要性も、また、非アーキテクチャプログラムのループ3がC=20個のチャネルに対応する20回より多く反復する必要性も生じない。その理由は、ハイパーパラメータが、入力ブロック索引109〜127に追加的な入力ブロックグループI[1]〜I[19]があってもよいようなものであるためである。
図64の例では、F=50、C=20、N=2048、且つW=12であり、そのためB=16且つG=128となるが、十分な余裕が存在して追加的な入力ブロックグループが高い値の入力ブロック索引にあることができ、そのためギャップ入力/フィルタブロックグループを含める必要がなく、またループ3の追加的な反復を行う必要がないようなニューラルネットワークの他の例が存在し得ることを理解されたい。例えばF=40、C=20、N=1024、且つW=12であるNNU121では、入力ブロックグループI[1]〜I[19]が入力ブロック索引45〜63にあることが可能になるため、ギャップ入力/フィルタブロックグループは必要ないことになる。言い換えると、
図64の例には
図61の例よりも多くの数のNPU126(N)があるという事実から、ギャップ入力/フィルタブロックグループを回避するにはより多くの数のNPU126が必要になると推論すべきではなく、むしろ、N並びに関係するニューラルネットワークのハイパーパラメータを検討しなければならない。
【0469】
NPU126に
図64の様々なフィルタブロックグループの重みを読み込むための重みRAM124のアドレス指定については、
図65との関連でより詳細に説明する。所与のフィルタブロック索引のフィルタブロックグループF[f,c]のチャネルcの値を上から下へと見たときに、列値cの順序が、入力ブロックグループがNNU121を回って循環されるときに、索引がフィルタブロック索引に対応するNPUブロック5906によって、入力ブロックグループのチャネルcが見られる順序であることが観察できよう。
【0470】
次いで
図65を参照すると、N=2048個のNPU126を有するNNU121で実行される非アーキテクチャプログラムによって行われて、
図64のデータRAM122及び重みRAM124のレイアウトを併用して、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで、50個の8×8出力5806を作り出す計算を図示する疑似コードが示される。
図65の疑似コードは、多くの点で
図63の疑似コードに似ているが、
図65の疑似コードは、
図64に示されるようにギャップ入力/フィルタブロックグループがないことを仮定している点が異なる。したがって、ライン9ではC=20回の反復になる(
図63のライン9における24回に対して)。加えて、ライン22で、重みRAM124行が475だけ減分され、475は25と19との積である(
図63の575に対して)。
図63と同様に、値25はR=5とS=5との積であり、これは、各フィルタブロックグループF[f,c]の行の数である。値19は、C=20−1である。この理由は、ループ2の実行インスタンスごとに、ループ3が、20個のフィルタブロックグループすべてを通って反復するためである。475の減分により、重みRAM124行が、各フィルタブロック索引内で先頭のフィルタブロックグループF[f,c]をポイントするようになり、フィルタブロックグループF[f,c]の中で、ループ2の現在の反復が始まった行の5行下にある行をポイントするようになる。
【0471】
次いで、まとめて
図66と参照される
図66A及び
図66Bを参照すると、12×12×20の入力5802に50個の5×5フィルタ5804を畳み込んで50個の8×8出力5808を生成するための代替的な一実施形態による、重みRAM124内のフィルタブロック5904のグループのレイアウト6602を図示するブロック図が示される。
図66の実施形態は、
図61の入力ブロックグループのレイアウトを仮定している。
図66の例は、多くの点で
図61の例に似ているが、違いを説明する。一般的に言って、
図66の実施形態と
図61の実施形態との主要な違いは、
図63及び
図67の疑似コードを具現化する非アーキテクチャプログラムが、重みRAM124を異なるやり方でアドレス指定する点である。
【0472】
より具体的には、
図66の実施形態では、各フィルタグループF[f,c,r]は、フィルタ5804の各自のフィルタf、各自のチャネルc、及びR行のうちの各自の行rによって決定され、S=5個のフィルタブロック5904を有する(重みRAM124のそれぞれの5行にある)。それに対して、
図61の実施形態では、各フィルタグループF[f,c]は、各自のフィルタf及び各自のチャネルcによって決定され、R×S=5×5=25個のフィルタブロック5904を有する(重みRAM124のそれぞれの25行にある)。
図61のレイアウト6102にある同じフィルタブロック5904は、
図66のレイアウト6602にあるが、それらは、重みRAM124の異なるアドレス、すなわち行に編成されている。別の表現をすると、同じフィルタブロック5904が各フィルタブロック索引にあるが、それらは、異なる順序で縦方向に編成され、
図63及び
図67の疑似コードは、それらを別様にアドレス指定する。したがって、
図61及び
図66両方のフィルタブロックグループは、重みRAM124の600行を占める。
図61と同様に、ギャップフィルタブロックは
図66ではF[G]と表されるが、フィルタブロック5904を5つしか有さない(重みRAM124のそれぞれの5行にある)。
【0473】
図66は、64×120=7680個のフィルタブロックグループを示しており、これは総称してF[f,c,r]と表され、fは、F個のフィルタ5804のうちのフィルタを表し、cは、C=20個のチャネルのチャネル索引を表し、rは、フィルタ5804の行を表し、又は、F[G]と表され、F[G]は、ギャップフィルタブロックグループを表す。
図66(及び
図68)の文脈におけるフィルタブロックグループF[f,c,r]は、重みRAM124のS個の異なる行にあるS個のフィルタブロック5904からなるグループであり、すべてが、重みRAM124内で同じ入力/フィルタ/NPUブロック索引内に配置される。したがって、フィルタfのすべてのフィルタブロックグループのすべてのフィルタブロック5904が、同じNPUブロック5906に提供される。さらに、各フィルタブロックグループF[f,c,r]は、フィルタ5804、fのチャネルcについてのR×S縦方向スライスの行の重み(例えば、
図62の縦方向スライス6209の行)か、又は、ギャップフィルタブロックグループF[G]の場合はゼロを保持する。より具体的には、フィルタブロックグループF[f,c,r]のS個のフィルタブロック5904の各フィルタブロック5904は、フィルタ5804、fのチャネルcのR×S縦方向スライス6209の行rにある異なる重みのP個のコピーを保持する。
【0474】
図66の文脈では、フィルタブロックグループF[f,c,r]は、重みRAM124の5つの異なる行にある5個のフィルタブロック5904からなるグループである。(
図66の実施形態では、5つの行は、重みRAM124内で隣接しており、すなわち0〜4、5〜9などにあるが、それらの行が隣接しておらず、非アーキテクチャプログラムがそれに応じて、フィルタブロック5904がある重みRAM124の行をアドレス指定するように変更を加えられる他の実施形態が企図される。)したがって、
図66の各フィルタブロックグループF[f,c,r]は、フィルタブロック当たり16ワード×フィルタブロックグループ当たり5つのフィルタブロック5904(重みRAM124の5行にある)=重みRAM124の80ワードを有する。
図61と同様に、各フィルタブロック5904は、フィルタ5804、fの各自の列s、各自の行r、及びチャネルcの重みのコピーをP=8個保持し、フィルタブロック5904のうち残りのB−P=16−8=8個のワードは使用されない(且つ一実施形態ではゼロである)。より具体的には、各フィルタブロックグループF[f,c,r]は、フィルタ5804、fのチャネルcについての5×5縦方向スライス6209の行rの重み、又はギャップフィルタブロックグループの場合はゼロを保持する。より具体的には、フィルタブロックグループF[f,c,r]の5個のフィルタブロック5904の各フィルタブロック5904は、フィルタ5804、fのチャネルcの5×5縦方向スライス6209の行rにある異なる重みのコピーを8個保持する。すなわち、各フィルタブロックグループF[f,c,r]は、
図62に示される5セットの隣接した5行のうちの1つである。例えば、フィルタブロックグループF[f,c,0]は、
図62のフィルタブロックグループF[f,c]の行0〜4に対応し、フィルタブロックグループF[f,c,1]は行5〜9に対応し、フィルタブロックグループF[f,c,2]は行10〜14に対応し、フィルタブロックグループF[f,c,3]は行15〜19に対応し、フィルタブロックグループF[f,c,4]は行20〜24に対応する。ただし、
図66に示されるように、それらは、重みRAM124の隣接した25行にあるのではなく、代わりに、隣接した5行からなる、5つの異なる離間したグループにある。より具体的には、R=5個の行のうち所与の行rについての5行フィルタブロックグループF[f,c,r]は、隣接してグループにされ、C=20個のチャネルcは、その所与の行についてインターリーブされる。さらに、当該所与の行について、フィルタブロックグループF[f,c,r]内でのチャネルの順序は、
図61と同じである。
【0475】
図66の例では、重みRAM124は、64×120=7680個のフィルタブロックグループを保持し、各グループに5個のフィルタブロック5904があり、
図66の例では合計で38,400個のフィルタブロック5904があり、それが、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで50個の8×8出力5806を作り出す。しかし、フィルタ5804は50個しかないので、64−50=14個のNPUブロック5906は、使用されない畳み込みを作り出し、したがって、示されるように、フィルタブロック索引50〜63のフィルタブロックグループは無関係値を含んでいる。示されるように、フィルタブロック索引0にあるのは、フィルタブロックグループF[0,0,0]〜F[0,19,0]及び4つのギャップフィルタブロックグループF[G]、フィルタブロックグループF[0,0,1]〜F[0,19,1]及び4つのギャップフィルタブロックグループF[G]、並びに以下同様にフィルタブロックグループF[0,0,4]〜F[0,19,4]及び4つのギャップフィルタブロックグループF[G]である。フィルタブロック索引1にあるのは、フィルタブロックグループF[1,0,0]〜F[1,19,0]及び4つのギャップフィルタブロックグループF[G]、フィルタブロックグループF[1,0,1]〜F[1,19,1]及び4つのギャップフィルタブロックグループF[G]、並びに以下同様にフィルタブロックグループF[1,0,4]〜F[1,19,4]及び4つのギャップフィルタブロックグループF[G]である。以下同様に続き、フィルタブロック索引49にあるのは、フィルタブロックグループF[49,0,0]〜F[49,19,0]及び4つのギャップフィルタブロックグループF[G]、フィルタブロックグループF[49,0,1]〜F[49,19,1]及び4つのギャップフィルタブロックグループF[G]、並びに以下同様にフィルタブロックグループF[49,0,4]〜F[49,19,4]及び4つのギャップフィルタブロックグループF[G]である。そして、フィルタブロック索引50〜63にあるフィルタブロックグループは無関係値である。
【0476】
ギャップフィルタブロックグループF[f,c,r]を置くことは、それらを使用して生成される列和がゼロ値を有する(ギャップフィルタブロックグループF[G]のゼロ値、及び/又はそれらに対応するギャップ入力ブロックグループI[G]のゼロ値のために)との保証に一致し、そのため、結果得られるゼロ値の列チャネル和が、最終的な列チャネル行和には寄与しないものの、ギャップ入力ブロックグループI[G]の数の追加的なループ3の反復の結果、十分な回数の循環を可能にして、すべてのNPUブロック5906が20個のチャネルすべてを見えるようにする。
【0477】
図66の例に示されるように、フィルタブロック索引0については、F[0,0,0]が重みRAM124の行0〜4を占め、4つのギャップフィルタブロックグループF[G]が行5〜24を占め、F[0,19,0]が行25〜29を占め、F[0,18,0]が行30〜34を占め、以下同様に続き、F[0,1,0]が行115〜119を占める。F[0,0,1]が行120〜124を占め、4つのギャップフィルタブロックグループF[G]が行125〜144を占め、F[0,19,1]が行145〜149を占め、F[0,18,1]が行150〜154を占め、以下同様に続き、F[0,1,1]が行235〜239を占める。F[0,0,2]が行240〜244を占め、4つのギャップフィルタブロックグループF[G]が行245〜264を占め、F[0,19,2]が行265〜269を占め、F[0,18,2]が行270〜274を占め、以下同様に続き、F[0,1,2]が行355〜359を占める。F[0,0,3]が行360〜364を占め、4つのギャップフィルタブロックグループF[G]が行365〜384を占め、F[0,19,3]が行385〜389を占め、F[0,18,3]が行390〜394を占め、以下同様に続き、F[0,1,3]が行475〜479を占める。そして、F[0,0,4]が行480〜484を占め、4つのギャップフィルタブロックグループF[G]が行485〜504を占め、F[0,19,4]が行505〜509を占め、F[0,18,4]が行510〜514を占め、以下同様に続き、F[0,1,4]が行595〜599を占める。フィルタブロック索引1については、F[1,1,0]が行0〜4を占め、F[1,0,0]が行5〜9を占め、4つのギャップフィルタブロックグループF[G]が行10〜29を占め、F[1,19,0]が行30〜34を占め、以下同様に続き、F[1,2,0]が行115〜119を占める。F[1,1,1]が行120〜124を占め、F[1,0,1]が行125〜129を占め、4つのギャップフィルタブロックグループF[G]が行130〜149を占め、F[1,19,1]が行150〜154を占め、以下同様に続き、F[1,2,1]が行235〜239を占める。F[1,1,2]が行240〜244を占め、F[1,0,2]が行245〜249を占め、4つのギャップフィルタブロックグループF[G]が行250〜269を占め、F[1,19,2]が行270〜274を占め、以下同様に続き、F[1,2,2]が行355〜359を占める。F[1,1,3]が行360〜364を占め、F[1,0,3]が行365〜369を占め、4つのギャップフィルタブロックグループF[G]が行370〜389を占め、F[1,19,3]が行390〜394を占め、以下同様に続き、F[1,2,3]が行475〜479を占める。F[1,1,4]が行480〜484を占め、F[1,0,4]が行485〜489を占め、4つのギャップフィルタブロックグループF[G]が行490〜509を占め、F[1,19,4]が行510〜514を占め、以下同様に続き、F[1,2,4]が行595〜599を占める。このパターンは、フィルタブロック索引19まで続き、F[19,19,0]が行0〜4を占め、F[19,18,0]が行5〜9を占め、以下同様に続き、F[19,0,0]が行95〜99を占め、4つのギャップフィルタブロックグループF[G]が行100〜119を占める。F[19,19,1]が行120〜124を占め、F[19,18,1]が行125〜129を占め、以下同様に続き、F[19,0,1]が行215〜219を占め、4つのギャップフィルタブロックグループF[G]が行220〜239を占める。F[19,19,2]が行240〜244を占め、F[19,18,2]が行245〜249を占め、以下同様に続き、F[19,0,2]が行335〜339を占め、4つのギャップフィルタブロックグループF[G]が行340〜359を占める。F[19,19,3]が行360〜364を占め、F[19,18,3]が行365〜369を占め、以下同様に続き、F[19,0,3]が行475〜479を占め、4つのギャップフィルタブロックグループF[G]が行460〜479を占める。F[19,19,4]が行480〜484を占め、F[19,18,4]が行485〜489を占め、以下同様に続き、F[19,0,4]が行595〜599を占め、4つのギャップフィルタブロックグループF[G]が行580〜599を占める。F[20,0,0]が行0〜4を占め、F[20,19,0]が行5〜9を占め、以下同様に続き、F[20,1,0]が行95〜99を占め、4つのギャップフィルタブロックグループF[G]が行100〜119を占める。F[20,0,1]が行120〜124を占め、F[20,19,1]が行125〜129を占め、以下同様に続き、F[20,1,1]が行215〜219を占め、4つのギャップフィルタブロックグループF[G]が行220〜239を占める。F[20,0,2]が行240〜244を占め、F[20,19,2]が行245〜249を占め、以下同様に続き、F[20,1,2]が行335〜339を占め、4つのギャップフィルタブロックグループF[G]が行340〜359を占める。F[20,0,3]が行360〜364を占め、F[20,19,3]が行365〜369を占め、以下同様に続き、F[20,1,3]が行475〜479を占め、4つのギャップフィルタブロックグループF[G]が行460〜479を占める。F[20,0,4]が行480〜484を占め、F[20,19,4]が行485〜489を占め、以下同様に続き、F[20,1,4]が行595〜599を占め、4つのギャップフィルタブロックグループF[G]が行580〜599を占める。このパターンは、フィルタブロック索引49まで続き、F[49、9,0]が行0〜4を占め、F[49,8,0]が行5〜9を占め、以下同様に続き、F[49,10,0]が行95〜99を占め、4つのギャップフィルタブロックグループF[G]が行100〜119を占める。F[49,9,1]が行120〜124を占め、F[49,8,1]が行125〜129を占め、以下同様に続き、F[49,10,1]が行215〜219を占め、4つのギャップフィルタブロックグループF[G]が行220〜239を占める。F[49,9,2]が行240〜244を占め、F[49,8,2]が行245〜249を占め、以下同様に続き、F[49,10,2]が行335〜339を占め、4つのギャップフィルタブロックグループF[G]が行340〜359を占める。F[49,9,3]が行360〜364を占め、F[49,8,3]が行365〜369を占め、以下同様に続き、F[49,10,3]が行475〜479を占め、4つのギャップフィルタブロックグループF[G]が行460〜479を占める。F[49,9,4]が行480〜484を占め、F[49,8,4]が行485〜489を占め、以下同様に続き、F[49,10,4]が行595〜599を占め、4つのギャップフィルタブロックグループF[G]が行580〜599を占める。フィルタブロック索引50〜63のフィルタブロックグループ内の値は無関係である。
図66の例は、重みRAM124の行0〜599に記憶されたフィルタブロックグループを示しているが、フィルタブロックグループF[f,c,r]が他の行に記憶される、他の実施形態が企図される。
【0478】
NPU126に
図66の様々なフィルタブロックグループの重みを読み込むための重みRAM124のアドレス指定については、
図67との関連でより詳細に説明する。一般に、所与のフィルタブロック索引のフィルタブロックグループF[f,c,r]のチャネルcの値を上から下へと見たときに、列値cの順序(ギャップを考慮に入れる)が、入力ブロックグループがNNU121を回って循環されるときに、索引がフィルタブロック索引に対応するNPUブロック5906によって、入力ブロックグループのチャネルc(ギャップを考慮に入れる)が見られる順序であることが観察できよう。さらに、入力ブロック5902の循環と、
図67の疑似コードに従って非アーキテクチャプログラムによって行われる重みRAM124のアドレス指定とにより、ギャップフィルタブロックグループF[G]とギャップ入力ブロックグループI[G]を同時にNPU126内に存在させ、したがってゼロ値の列和を生成させる。
【0479】
次いで
図67を参照すると、N=1024個のNPU126を有するNNU121で実行される非アーキテクチャプログラムによって行われて、
図61のデータRAM122のレイアウト6101及び
図66の重みRAM124のレイアウト6602を併用して、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで50個の8×8出力5806を生成する計算を図示する疑似コードが示される。
図67の疑似コードは、多くの点で
図65の疑似コードに似ているが、
図67の疑似コードは、
図61及び
図66に示されるようにギャップ入力/フィルタブロックグループを仮定しており、また
図66のレイアウト6602と連携するために異なった重みRAM124のアドレス指定を有する点が異なる。したがって、ライン9で、C=20+4つのギャップ=24回の反復になる(
図65のライン9における20回に対して)。加えて、
図67にはライン18及び22が存在しない。これは、フィルタブロック5904が、
図66のフィルタブロックグループF[f,c,r]の中で、ライン16で重みRAM124行を1だけ増分すれば正しい行をアドレス指定するのに足りるようにレイアウトされているためであり、それにより、重みRAM124行を(例えば、
図65のライン18で)増分し、重みRAM124行を(例えば、
図65のライン22で)減分する必要性を緩和する。
【0480】
次いで、まとめて
図68と参照される
図68A及び
図68Bを参照すると、ギャップ入力/フィルタブロックグループを含まずに、12×12×20の入力5802に50個の5×5フィルタ5804を畳み込んで50個の8×8出力5808を生成するための代替的な一実施形態による、重みRAM124内のフィルタブロック5904のグループのレイアウト6802を図示するブロック図が示される。
図68の実施形態は、
図64の入力ブロックグループのレイアウトを仮定している。
図68の例は、多くの点で
図64の例に似ているが、違いを説明する。一般的に言って、
図68の実施形態と
図64の実施形態との主要な違いは、
図69及び
図65の疑似コードを具現化する非アーキテクチャプログラムが、重みRAM124を異なるやり方でアドレス指定する点である。
【0481】
図64の例と同じように、
図68の例は、2048個のNPU126を有するNNU121を仮定し、すなわちN=2048である。その結果、ハイパーパラメータW=12であるので、B=16となり、これはすなわち、少なくともWと同じ大きさの、Nの最小の因数である。またB=16であるので、G=2048/16=128となる。したがって、128個のNPUブロック5906があり、データRAM122の行当たり128個の入力ブロック5902があり、重みRAM124の行当たり128個のフィルタブロック5904がある。
図68は、ゼロ基準のフィルタブロック索引0〜127を示しており、これらは、上記で
図59との関連で説明したように、NPUブロック索引0〜127に対応している。すなわち、0の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引0を持つNPUブロック5906によって受け取られ、1の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引1を持つNPUブロック5906によって受け取られ、以下同様に続き、127の索引を持つ各入力ブロック5902及びフィルタブロック5904は、索引127を持つNPUブロック5906によって受け取られる。
図68の実施形態では、索引0にある入力ブロックは、データRAM122のワード0〜15を含んでおり、索引1にある入力ブロックは、データRAM122のワード16〜31を含んでおり、以下同様に続き、索引127にある入力ブロックは、データRAM122のワード2032〜2047を含んでいる。同様に、索引0にあるフィルタブロックは、重みRAM124のワード0〜15を含んでおり、索引1にあるフィルタブロックは、重みRAM124のワード16〜31を含んでおり、以下同様に続き、索引127にあるフィルタブロックは、重みRAM124のワード2032〜2047を含んでいる。
【0482】
図68の実施形態では、
図66の実施形態と同様に、各フィルタグループF[f,c,r]は、フィルタ5804のうち各自のフィルタf、各自のチャネルc、及びR行のうちの各自の行rによって決定され、S=5個のフィルタブロック5904を有する(重みRAM124のそれぞれの5行にある)。
図64のレイアウト6402にある同じフィルタブロック5904は、
図68のレイアウト6802にあるが、それらは、重みRAM124の異なるアドレス、又は行に編成されている。別の表現をすると、同じフィルタブロック5904は、各フィルタブロック索引にあるが、それらは、異なる順序で縦方向に編成され、
図65及び
図69の疑似コードはそれらを別様にアドレス指定する。したがって、
図64及び
図68両方のフィルタブロックグループは、重みRAM124の500行を占める。
図68のレイアウトは、
図64のレイアウトと同様に、ギャップフィルタブロックが存在しない。したがって、
図69の疑似コードによる重みRAM124内のレイアウト6802のアドレス指定は、多くの点で
図67の疑似コードによる重みRAM124内のレイアウト6602のアドレス指定と似るが、
図69の疑似コードは、ギャップフィルタ/入力ブロックグループがないことを考慮に入れるように変更を加えられている。
【0483】
図68の文脈では、
図66と同様に、フィルタブロックグループF[f,c,r]は、重みRAM124の5つの異なる行にある5つのフィルタブロック5904からなるグループであり、各フィルタブロックグループF[f,c,r]は、フィルタブロック当たり16ワード×フィルタブロックグループ当たり5つのフィルタブロック5904(重みRAM124の5行にある)=重みRAM124の80ワードを有する。各フィルタブロック5904は、フィルタ5804、fの各自の列s、各自の行r、及びチャネルcの重みのコピーをP=8個保持し、フィルタブロック5904のうち残りのB−P=16−8=8個のワードは使用されない(且つ一実施形態ではゼロである)。そして、各フィルタブロックグループF[f,c,r]は、フィルタ5804、fのチャネルcについての5×5縦方向スライス6209の行rの重み、又はギャップフィルタブロックグループの場合はゼロを保持する。
【0484】
図68の例では、重みRAM124は、128×100=12,800個のフィルタブロックグループを保持し、各グループに5つのフィルタブロック5904があり、
図68の例では合計で64,000個のフィルタブロック5904があり、それが、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで、50個の8×8出力5806を作り出す。しかし、フィルタ5804は50個しかないので、128−50=78個のNPUブロック5906は、使用されない畳み込みを作り出し、したがって、示されるように、フィルタブロック索引50〜127のフィルタブロックグループは無関係値を含んでいる。示されるように、フィルタブロック索引0にあるのは、フィルタブロックグループF[0,0,0]〜F[0,19,0]、フィルタブロックグループF[0,0,1]〜F[0,19,1]、及び以下同様にフィルタブロックグループF[0,0,4]〜F[0,19,4]である。フィルタブロック索引1にあるのは、フィルタブロックグループF[1,0,0]〜F[1,19,0]、フィルタブロックグループF[1,0,1]〜F[1,19,1]、及び以下同様にフィルタブロックグループF[1,0,4]〜F[1,19,4]である。以下同様に続き、フィルタブロック索引49にあるのは、フィルタブロックグループF[49,0,0]〜F[49,19,0]、フィルタブロックグループF[49,0,1]〜F[49,19,1]、及び以下同様にフィルタブロックグループF[49,0,4]〜F[49,19,4]である。そして、ギャップフィルタブロックグループF[G]はなく、フィルタブロック索引50〜127にあるフィルタブロックグループは無関係値である。
【0485】
図68の例に示されるように、フィルタブロック索引に関しては、
図66のギャップフィルタブロックグループが存在せず、また
図66でギャップフィルタブロックグループの下にあったフィルタブロックグループがいずれも上にずらされて、存在しないギャップフィルタブロックグループによって空いた重みRAM124行を占めている。その結果、
図68のフィルタブロックグループは、重みRAM124の500行を占め、これは、同じくギャップ入力/フィルタブロックグループがない
図64の実施形態と同様である。
図68の例は、重みRAM124の行0〜499に記憶されたフィルタブロックグループを示しているが、フィルタブロックグループF[f,c,r]が他の行に記憶される他の実施形態が企図される。NPU126に
図68の様々なフィルタブロックグループの重みを読み込むための重みRAM124のアドレス指定については、
図69との関連でより詳細に説明する。
【0486】
次いで
図69を参照すると、N=2048個のNPU126を有するNNU121で実行される非アーキテクチャプログラムによって行われて、
図64のデータRAM122のレイアウト6401及び
図68の重みRAM124のレイアウト6802を併用して、12×12×20の入力5802に50個の5×5×20フィルタ5804を畳み込んで、50個の8×8出力5806を作り出す計算を図示する疑似コードが示される。
図69の疑似コードは、多くの点で
図67の疑似コードに似ているが、
図67の疑似コードは
図61及び
図66に示されるようにギャップ入力/フィルタブロックグループを仮定するのに対して、
図69の疑似コードはギャップを仮定しない点が異なる。したがって、ライン9ではC=20回の反復になる(
図67のライン9における24回に対して)。
【0487】
好ましくは、アーキテクチャプログラムは、重みを重みRAM124(例えば、フィルタブロック5904として論理的に区分されている)にロードし、入力データをデータRAM122(例えば入力ブロック5902として論理的に区分されている)にロードする。アーキテクチャプログラムは、例えば上記で
図25との関連で説明したのと同様にして重み及びデータをRAM122/124にロードすることができるが、
図25の説明では、データRAM122が重みを保持し、重みRAM124が入力データ及び結果データを保持するのに対し、3D畳み込みを行うために記載される実施形態では、データRAM122が入力及び出力データを保持し、重みRAM124が重みを保持する。
【0488】
入力ブロック5902の入力データは動的であるのに対し、フィルタブロック5904の重みは静的であることが観察できよう。すなわち、入力データは、ニューラルネットワークが実行されるたび、例えば、新しい画像又は新しい画像のセットがNNU121に入力され、処理されるたびに、変わる可能性がある。それに対して、重みは、ニューラルネットワークの開発(例えば、トレーニング)時に生成され、ニューラルネットワークの各実行インスタンスについて同じままである。したがって、所望されるようにフィルタブロック5904内に重みを編成するコストは一度のみ発生し、あらかじめオフラインで編成することができる。そのため、入力にフィルタを畳み込んで出力を生成することを達成するために必要な実行を非アーキテクチャプログラムが行うのにかかる時間を最小にするように、重みをフィルタブロック5904内に編成すると有利である可能性がある。さらに、
図64〜
図65及び
図68〜
図69の実施形態(すなわちギャップがない)の非アーキテクチャプログラムは、行うべき循環動作及び積和演算がより少ないため、より少ないクロックサイクルで実行することができるが、(例えばアーキテクチャプログラムにより)入力ブロック5902内に入力データを適切に編成するために追加的な時間を要する可能性があり、入力にフィルタを畳み込んで出力を生成するのにかかる合計時間は、ギャップを用いる実施形態よりも少ない可能性がある。どちらの方法がより速いかは複数の要因に依存する可能性があり、そのような要因には、ギャップのサイズ、ニューラルネットワークのハイパーパラメータ、アーキテクチャプロセッサの可用性、及びメモリサブシステムの特性が含まれる。
【0489】
C(チャネルの数)がG(ブロックの数)の因数であるとき、ギャップ入力/フィルタブロックグループ(ギャップ)は必要でないことが観察できよう。さらに、CがGの因数ではないとき、G−Fの差がC−1以上である場合はギャップは必要でなく、そのためチャネル0を除く入力5802の全チャネルのコピーを、データRAM122行の最後にある不使用ブロックに置くことができる。
【0490】
データRAM122の一行にわたって含まれる入力5802のC個のチャネルのコピーの数、すなわち、データRAM122行に含まれるC個のチャネル各々に対応する入力ブロック5902のコピーの数に関する、動的なハイパーパラメータ及び静的なNNU121のハードウェア構成に関連する様々な状況に関して、以下のことも観察できよう。例えば、
図61及び
図64の実施形態では、データRAM122の一行にわたって含まれる入力5802のC個のチャネルのコピーの数は3つである。また、必要とされるギャップの数、及びそれに付随するループ3の反復カウントに対する影響、すなわち上記で疑似コードに関連して説明したチャネル反復ループに関して、以下のことも観察できる。
【0491】
第1の状況では、CはGの2分の1未満であり、FはG未満である。データRAM122の一行にわたって含まれる入力5802のC個のチャネルのコピーの数は、G÷Cの床関数である。したがって、
図61及び
図64の例では、C=20且つG=64且つF=50であり、これは第1の状況の基準を満たし、G÷Cの床関数=floor(64/20)=3になり、これが、データRAM122の一行にわたって含まれる入力5802のC個のチャネルのコピーの数である。ギャップの数はG modulo Cであり、例えば
図61及び
図66の例では64%20=4である。さらに、不使用のNPUブロック5906の数はG−Fである。これは、それらを使用するフィルタがないためであり、例えば
図61及び
図66の例では、64−50=14となる。
【0492】
第2の状況では、Cは、Gの2分の1とGの間にあり、FはG未満である。入力5802のC個のチャネルのコピーは1つのみが、データRAM122の一行にわたって含まれる。第1の状況と同様に、ギャップの数は、第2の状況ではG modulo Cである。
【0493】
第3の状況では、CはGより大きく、FはG未満である。入力5802のH行の各行についてのC個のチャネルが、データRAM122のN行にわたって分割され、Nは2以上である。すなわち、各々の水平方向2D入力スライス(すなわち、入力5802のH行のうち所与の行のC個のチャネルすべて)について、データRAM122のN行が使用されて、その所与の入力5802行のC個のチャネルについての入力ブロック5902を保持し、C個のチャネルは、データRAM122のN行に振り分けられる。C個のチャネルが分割されるデータRAM122の行の数であるNは、C÷Gの天井関数である。例えば、C=200及びG=64と仮定すると、N=ceiling(200/64)=データRAM122の4つの異なる行が使用されて、入力5802のH行のうち所与の行に関連付けられた所与の水平方向2DスライスのC=200個のチャネルすべてについての入力ブロック5902を保持し、合計でデータRAM122のH×N個の行が使用されて、入力5802のH個の行の全行のC=200個のチャネルすべてについての入力ブロック5902を保持する。これは、C=20がG=64未満であるためにデータRAM122の行が1行で済む
図61及び
図64の例と対照的である。最初のN−1行の各々については、ギャップがなく、すべてのNPUブロック5906が使用されて畳み込み結果を生成する。しかし、データRAM122のN行のうち最後の行に関しては、CがGの因数でない場合、データRAM122の最後の行に保持すべきチャネルの残りの数はG未満になり、その場合、N行の最後の行は、上記で説明した第1又は第2の状況と同じように扱われる。第3の状況では、
図60の疑似コードが変更を加えられて、ループ2の内部に入れ子になった第5のループを追加する。すなわち、第5のループは、ループ3と、ループ3の前のライン8におけるmux−regs208へのデータRAM122行の読み込みとを包含する。第5のループはN回反復し、そのため、データRAM122のN行の各行について、その行がmux−reg208に読み込まれ、ループ3の実行インスタンスがその行に行われる。第5のループの最初のN−1回の反復では、ループ3の反復カウントはGであり、第5のループのN回の反復のうち最後の反復では、ループ3の反復カウントは、C modulo Gに、存在する場合にはギャップの数を足した数となる。したがって、第5のループの実行インスタンスの完了時に(例えば、ループ2の反復ごとに)、各NPU126の累算器202は、新たな列チャネル和を累算していることになる。別の表現をすると、ループ2の各反復は、水平方向の2D入力スライス(すなわち、入力5802のH行のうち所与の行のC個のチャネルすべて)と、水平方向の2Dフィルタスライス(すなわち、フィルタ5804のR行のうち所与の行のC個のチャネルすべて)とに関与する。列チャネル和は、C個のチャネルすべての各チャネルについて、関与する水平方向の2D入力スライスのうちそのチャネルの部分と、関与する水平方向の2Dフィルタスライスのうちそのチャネルの部分とを畳み込んで列和を生成し、継続的にC個のチャネルの列和すべてを累算して列チャネル和を作り出した結果である。
【0494】
第4の状況では、FがGより大きい。F個のフィルタは、G個のフィルタのN−1個のグループと、F modulo G個のフィルタの最後のN番目のグループとに分割され、G(又はF%G)個のフィルタの各グループは、チャネルの数に依存して、3つの状況のうち該当するものに従って上記のように処理される。第1の実施形態では、フィルタのN個のグループのうち所与のグループについて、Q個の出力行すべて(すなわち、Q個の列チャネル行和、又は畳み込み結果のすべて)が計算され、データRAM122に書き込まれた後に、次のフィルタのグループに移る。すなわち、疑似コードの1回目の実行インスタンスは、N個のグループのうち1番目のグループに対して行われ、次いで、疑似コードの2回目の実行インスタンスがN個のグループのうち2番目のグループに対して行われ、以下同様に続き、最後には、疑似コードの実行インスタンスが、F個のフィルタのN個のグループすべてに行われる。第2の実施形態では、フィルタのN個のグループすべてについてのQ個の出力行の1つが、計算され、書き込まれた後に、Q個の出力行の次の行に移る。すなわち、ループ1の1回目の反復は、F個のフィルタのN個のグループの各々について、Q個の出力行のうち第1の出力行を生成し、次いで、ループ1の2回目の反復が、F個のフィルタのN個のグループの各々について、Q個の出力行の第2の出力行を生成し、以下同様に続き、最後には、ループ1の反復が、F個のフィルタのN個のグループの各々について、Q個の出力行すべての出力行を生成する。2つの実施形態のうちどちらが好ましいかは様々な要因に依存する可能性があり、それらの要因には、非アーキテクチャプログラム及び/又はアーキテクチャプログラムによるデータRAM122及び重みRAM124へのアクセスの量が含まれる。ただし、好ましくは、上記のように、個々の畳み込み列チャネル行和は、NPU126の累算器202の内部で完全に生成され、データRAM122(又は重みRAM124)に中間の部分和を書き込み、後でそれを読み出すことはしない。これにより、有利な点として、畳み込み列チャネル行和の精度の損失を回避することができる。また、有利な点として、データRAM122及び/又は重みRAM124へのアクセスは高コストであり得るため、時間を節減することもできる。
【0495】
観察できるように、列−チャネル−行の順序で畳み込みを行い、mux−reg208の循環器を使用して異なる入力ブロック5902をNPUブロック5906間で循環させる本明細書に記載される実施形態は、mux−reg208の循環器の利益を受けずに列−行−チャネルの順序で畳み込みを行う従来の方法を上回る利点を有する可能性がある。潜在的な利点の1つは、それらの実施形態では、入力5802データを読み出すためのメモリへのアクセス回数がより少なくて済む可能性があることである。
図60の疑似コードを参照すると、S×C回の積和演算は、データRAM122からの1回の読み出しの入力5802データを使用して行うことができ、これは、例えば
図64の実施形態では5×20=100回の積和演算になる。別の潜在的な利点は、それらの実施形態が、入力5802データを記憶するために必要とされるメモリの量を減らせることである。なぜならば、従来の方法では、列−行−チャネルの順序の畳み込みに対応するために入力5802データの複製を必要とし得るためである。従来の方法で必要とされる入力5802データの複製は、アーキテクチャプログラムからの追加的な帯域幅を必要とし、より多くのメモリ帯域幅を消費する可能性もある。
【0496】
NNU121が重みRAM124及びデータRAM122を別個のメモリとして含んでいる実施形態を記載したが、重みと入力データがNNU121の単一のメモリに記憶される他の実施形態が企図される。この実施形態はよりコスト効果が高い可能性があるが、別個の重みRAM124及びデータRAM122を含む実施形態で2つのメモリに並列してアクセスできる能力と比較して、単一のメモリに関する競合とそのメモリへのアクセスの直列化に起因して性能の低下が生じる可能性がある。さらに、ニューラルネットワークがハイパーパラメータの特定のセット(例えば、H=W=12、C=20、F=50、R=S=5、P=Q=8、有効な畳み込み)を持ち、特定のNNU121構成(例えば、1024個又は2048個のNPU126)に実行される実施形態を説明したが、それらの実施形態の説明は、説明の目的で提供されるものであり、異なるハイパーパラメータのセット及び異なるNNU121のハードウェア構成を備える他の実施形態が企図され、この実施形態はそれでも、列−チャネル−行のループ順序を併用して、NPU/入力/フィルタブロック及びmux−reg208の循環器動作を効率的に用いて、入力ブロック5902をNNU121内で循環させて、列チャネル行和、すなわち畳み込み結果を生成する。
【0497】
マルチワード距離循環
次いで
図70を参照すると、マルチワード距離循環動作を支援する代替的な一実施形態によるNPU126の一部を図示するブロック図が示される。
図70は、NPU126のmux−reg208を含んでいる。NPU126は、NPU Jと表され、NNU121のN個のNPU126のアレイの1つである。多くの点で、
図70のmux−reg208は
図7のmux−reg208に似ており、データRAM122からデータワードを受け取る入力207を備え、制御入力213及び出力209を有する。ただし、
図7の実施形態のように隣接するNPU126から受け取られる単一の入力211を有するのではなく、
図70の実施形態のmux−reg208は、5つの異なる隣接するNPU126からの5つの入力を有する。第1の入力211−1は、
図7の実施形態の入力211のように、NPU J−1、すなわち当該NPU126から1つ離れたNPU126の出力209からである。第2の入力211−2は、NPU J−2、すなわち当該NPU126から2つ離れたNPU126の出力209からである。第3の入力211−4は、NPU J−4、すなわち当該NPU126から4つ離れたNPU126の出力209からである。第4の入力211−8は、NPU J−8、すなわち当該NPU126から8つ離れたNPU126の出力209からである。第5の入力211−16は、NPU J−16、すなわち当該NPU126から16個離れたNPU126の出力209からである。制御入力213は、入力207、211−1、211−2、211−4、211−8、又は211−16の1つを、出力209で提供するために選択するように動作する。それにより、有利な点として、NNU121によって実行される非アーキテクチャ命令がマルチワード距離循環動作を達成することができ、すなわち、制御入力が入力211−2、211−4、211−8、又は211−16の1つを出力209で提供するために選択するときである。これは、
図60、
図63、
図65、
図67、及び
図69のライン19における位置合わせのための循環動作など、上記で説明したような3D畳み込みを行う非アーキテクチャプログラムのサイズを減少させ、効率を増大させるために特に有益である可能性がある。
【0498】
図70の実施形態では、mux−reg208は、1、2、4、8、及び16個離れた、5つの異なる隣接するNPU126からの出力209を受け取る5つの入力を有するが、mux−reg208が、異なる数の隣接するNPU126からの出力209を受け取り、異なる距離のNPU126だけ離れた、より多くの又はより少ない入力(例えば、3つ、4つ、6つ、7つ)を有する他の実施形態が企図される。例えば、一実施形態では、mux−reg208は、入力211−2も211−16も備えない。さらに、
図70の実施形態における距離は2の累乗であるが、距離のいくつかが2の累乗ではない他の実施形態が企図される。
【0499】
他の実施形態では、mux−reg208は、
図23の隣接するナローワード入力1811を受け取り、選択して、ナロー/じょうご構成機能をサポートするか、且つ/又は
図49の出力バッファ1104の入力4905を受け取り、選択して、出力バッファ1104のフィードバック機能をサポートするようにさらに構成されるが、それらの入力は簡潔のために
図70には示していない。さらには、図示していないが、重みmux−reg705は、
図70のmux−reg208と同様に、すなわち、マルチワード離れた隣接するNPU126の出力203を受け取り、選択するように構成されてもよい。
【0500】
次いで
図71を参照すると、
図70のようなmux−reg208を有するNPU126を含むNNU121のマルチワード距離循環機能を図示する4つの命令が示される。4つの命令の各々は積和ALU演算を指定し、その演算は、その演算の重みワードを現在の重みRAM124行の後の重みRAM124の次の行から受け取り、その演算のデータワードを、それぞれ2、4、8、又は16の距離だけ離れたところにある隣接するNPU126から、
図70のmux−reg208を介して受け取る。すなわち、4つの命令のうち第1の命令は、N個のNPU126の各々に、それぞれ入力211−2、211−4、211−8、又は211−16を(例えば、制御入力213を介して)選択するように命令する。こうした命令の1つ又は複数を、上記のような
図60、
図63、
図65、
図67、及び
図69の疑似コードなどの疑似コードを実装する非アーキテクチャプログラムに含めて、ライン19の位置合わせする循環を行うことができる。非アーキテクチャ命令は、積和に加えて他のALU演算を行ってもよく、上記で説明したような例えば加算、乗算、最大値、最小値、ノーオペレーションを行うことができる。詳細には、ノーオペレーションALU演算を使用して、累算器202に影響を与えることなく、N個のNPU126間でデータRAM122からの行の読み出しを単純に循環させることができ、これは、位置合わせ循環(例えばライン19の)の循環量(すなわち循環させるワード数)がmux−reg208によって直接はサポートされない場合に特に有用である可能性がある。例えば、循環量が11である場合には、1のノーオペレーション循環を行った後に2のノーオペレーション循環を行い、その後8の積和循環を行うことが必要となり得る。加えて、NPU126の重みワードが、
図7のmux−reg705などのmux−regに保持される実施形態が企図され、mux−regは、重みRAM124から受け取られる重みの行を循環させるためのNワード循環器に含めることができ、
図70のmux−reg208と同様に、複数距離(例えば、1、2、4、8、及び16)離れた複数の異なる隣接するNPU126からの出力209から入力を受け取る様に強化される。さらに、マルチワード距離循環動作を指定する非アーキテクチャ命令は、
図4のアドレス2の非アーキテクチャ命令で指定されるCOUNT=511など、1より大きいカウントを指定することができる。
【0501】
本発明の様々な実施形態を本明細書に記載したが、それらは例として提示されたものであり、制限ではないことを理解されたい。関連するコンピュータ技術の当業者には、本発明の範囲から逸脱することなく、本発明の形態及び詳細に様々な変更をなすことが可能であることが明らかであろう。例えば、ソフトウェアが、例えば、本明細書に記載される装置及び方法の機能、製造、モデリング、シミュレーション、記述、及び/又は試験を可能にすることができる。これは、一般的なプログラミング言語(例えば、C、C++)、Verilog HDL、VHDLなどを含むハードウェア記述言語(HDL)、又は他の利用可能なプログラムの使用を通じて達成することができる。そのようなソフトウェアは、磁気テープ、半導体、磁気ディスク、若しくは光学ディスク(例えば、CD−ROM、DVD−ROM等)、ネットワーク、有線、又は他の通信媒体など、任意の知られているコンピュータ使用可能媒体の中に配置することができる。本明細書に記載される装置及び方法の実施形態は、プロセッサコア(例えば、HDLで具現化又は規定された)などの半導体の知的財産権コアに含めて、集積回路の作製時にハードウェアに変容させることができる。加えて、本明細書に記載される装置及び方法は、ハードウェアとソフトウェアの組み合わせとして具現化することができる。したがって、本発明は、本明細書に記載される例示的実施形態のいずれによっても制限されるべきではなく、下記の特許請求の範囲とその均等物のみに従って定義されるべきである。具体的には、本発明は、汎用コンピュータで使用されることが可能なプロセッサデバイス中に実装することができる。最後に、当業者は、開示される概念と特定の実施形態を、添付の特許請求の範囲によって定義される本発明の範囲から逸脱することなく、本発明と同じ目的を遂行するための他の構造を設計するための、又はそれに変更を加えるための基礎として容易に使用できることを認識されよう。