アーキテクチャニューラルネットワークユニットを備えたプロセッサ
次いで図1を参照すると、ニューラルネットワークユニット(NNU)121を含むプロセッサ100を図示するブロック図が示される。プロセッサ100は、命令取出しユニット101、命令キャッシュ102、及び命令トランスレータ104、リネームユニット106、リザベーションステーション108、メディアレジスタ118、汎用レジスタ(GPR)116、NNU121以外の実行ユニット112、並びにメモリサブシステム114を含む。
プロセッサ100は、集積回路の中央演算処理装置(CPU)として機能する電子デバイスである。プロセッサ100は、デジタルデータを入力として受け取り、そのデータを、メモリから取り出された命令に従って処理し、命令によって規定される動作の結果を出力として生成する。プロセッサ100は、デスクトップコンピュータ、モバイルコンピュータ、又はタブレットコンピュータで用いられることがあり、計算、テキスト編集、マルチメディアの表示、及びインターネットの閲覧などの用途に用いられる。プロセッサ100は、組み込みシステムの中に配設されて、電気製品、携帯電話、スマートフォン、自動車、及び産業用制御デバイスを含む、幅広い種類のデバイスを制御することもある。CPUは、算術演算、論理演算、及び入出力動作を含む演算をデータに行うことにより、コンピュータプログラム(「コンピュータアプリケーション」又は「アプリケーション」とも呼ばれる)の命令を実行する電子回路(すなわち「ハードウェア」)である。集積回路(IC)は、半導体材料、通例はシリコンの小片上に作製される電子回路の組である。ICは、チップ、マイクロチップ、又はダイとも呼ばれる。
命令取出しユニット101は、システムメモリ(図示せず)から命令キャッシュ102へのアーキテクチャ命令103の取り出しを制御する。命令取出しユニット101は、プロセッサ100がアーキテクチャ命令バイトのキャッシュラインをそこから取り出して命令キャッシュ102に入れるメモリアドレスを指定する、命令キャッシュ102へのフェッチアドレスを提供する。フェッチアドレスは、プロセッサ100の命令ポインタ(図示せず)、又はプログラムカウンタの現在の値に基づく。通常、プログラムカウンタは、命令の流れの中で分岐命令、呼び出し命令、若しくは戻り命令などの制御命令に遭遇しない限り、又は、割込み、トラップ、例外、若しくは障害などの例外条件が発生しない限り、命令のサイズずつ連続的に増分されて行き、上記制御命令又は例外条件の場合、プログラムカウンタは、分岐先アドレス、戻りアドレス、又は例外ベクトルなどの非連続的なアドレスで更新される。一般的に言って、プログラムカウンタは、実行ユニット112/121による命令の実行に応答して更新される。プログラムカウンタは、命令トランスレータ104がプロセッサ100の命令セットアーキテクチャで定義されていない命令103に遭遇するなど、例外条件の検出に応答して更新される場合もある。
命令キャッシュ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に翻訳する。
マイクロ命令105は、リネームユニット106に提供され、最終的に実行ユニット112/121によって実行される。マイクロ命令105は、アーキテクチャ命令を実装する。好ましくは、命令トランスレータ104は、頻繁に実行されるアーキテクチャ命令103及び/又は比較的複雑性の低いアーキテクチャ命令103をマイクロ命令105に翻訳する第1の部分を含んでいる。命令トランスレータ104は、マイクロコードユニット(図示せず)を含む第2の部分も含んでいる。マイクロコードユニットは、アーキテクチャ命令セットのうち複雑な命令及び/又はまれに使用される命令を実装するマイクロコード命令を保持するマイクロコードメモリを備える。マイクロコードユニットは、非アーキテクチャマイクロプログラムカウンタ(マイクロPC)をマイクロコードメモリに提供するマイクロシーケンサも備える。好ましくは、マイクロコード命令は、マイクロトランスレータ(図示せず)によってマイクロ命令105に翻訳される。マイクロコードユニットが現在制御権を有するか否かに依存して、セレクタが、マイクロ命令105を、第1の部分又は第2の部分のどちらかから、リネームユニット106に提供するために選択する。
リネームユニット106は、アーキテクチャ命令103の中で指定されるアーキテクチャレジスタを、プロセッサ100の物理レジスタにリネーミングする。好ましくは、プロセッサ100は、リオーダバッファ(図示せず)を備える。リネームユニット106は、プログラムの順序で、リオーダバッファ内のエントリを各マイクロ命令105に割り振る。それにより、プロセッサ100は、マイクロ命令105とそれらに対応するアーキテクチャ命令103をプログラムの順序でリタイアできるようになる。一実施形態では、メディアレジスタ118は256ビット幅であり、GPR116は64ビット幅である。一実施形態では、メディアレジスタ118は、高度ベクトル拡張(Advanced Vector Extensions:AVX)レジスタなどのx86メディアレジスタである。
一実施形態では、リオーダバッファの各エントリは、マイクロ命令105の結果のための記憶域を含む。加えて、プロセッサ100はアーキテクチャレジスタファイルを備え、アーキテクチャレジスタファイルは、アーキテクチャレジスタ、例えば、メディアレジスタ118及びGPR116及び他のアーキテクチャレジスタ、の各々に対応する物理レジスタを含む。(好ましくは、例えば、メディアレジスタ118とGPR116はサイズが異なるため、それらに別個のレジスタファイルがある。)アーキテクチャレジスタを指定するマイクロ命令105の各ソースオペランドに対して、リネームユニットは、マイクロ命令105のソースオペランドフィールドに、そのアーキテクチャレジスタに書き込みをする古いマイクロ命令105のうち最も新しいもののリオーダバッファ索引を投入する。実行ユニット112/121がマイクロ命令105の実行を完了すると、実行ユニット112/121は、結果をマイクロ命令105のリオーダバッファエントリに書き込む。マイクロ命令105がリタイアする時、リタイアユニット(図示せず)が、結果を、マイクロ命令のリオーダバッファエントリから、リタイアするマイクロ命令105によって指定されるアーキテクチャ宛先レジスタに関連付けられた物理レジスタファイルのレジスタに書き込む。
別の実施形態では、プロセッサ100は、アーキテクチャレジスタの数よりも多い物理レジスタを含む物理レジスタファイルを備えるが、アーキテクチャレジスタファイルを含まず、リオーダバッファエントリは、結果の記憶域を含まない。(好ましくは、例えば、メディアレジスタ118とGPR116はサイズが異なるため、それらに別個の物理レジスタファイルがある。)プロセッサ100は、アーキテクチャレジスタごとに関連付けられたポインタを持つポインタテーブルも備える。アーキテクチャレジスタを指定するマイクロ命令105のオペランドに対して、リネームユニットは、マイクロ命令105中の宛先オペランドフィールドに、物理レジスタファイル内の空きレジスタに対するポインタを投入する。物理レジスタファイルに空いているレジスタがない場合、リネームユニット106はパイプラインをストールする(stalls)。アーキテクチャレジスタを指定するマイクロ命令105の各ソースオペランドについて、リネームユニットは、マイクロ命令105中のソースオペランドフィールドに、そのアーキテクチャレジスタに書き込みをする古いマイクロ命令105のうち最も新しいものに割り当てられた物理レジスタファイル内のレジスタに対するポインタを投入する。実行ユニット112/121がマイクロ命令105の実行を完了すると、実行ユニット112/121は、マイクロ命令105の宛先オペランドフィールドによってポイントされる物理レジスタファイルのレジスタに結果を書き込む。マイクロ命令105がリタイアする時、リタイアユニットは、マイクロ命令105の宛先オペランドフィールド値を、リタイアするマイクロ命令105によって指定されるアーキテクチャ宛先レジスタに関連付けられたポインタテーブル内のポインタにコピーする。
リザベーションステーション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によって行われるべき関数を指定する即値オペランドを含む。
実行ユニット112は、メモリサブシステム114からデータをロードし及びデータをメモリサブシステム114に記憶する1つ又は複数のロード/記憶ユニット(図示せず)を備える。好ましくは、メモリサブシステム114は、メモリ管理ユニット(図示せず)を備え、メモリ管理ユニットは、例えば、トランスレーションルックアサイドバッファ及びテーブルウォークユニット、レベル1データキャッシュ(及び命令キャッシュ102)、レベル2ユニファイドキャッシュ、並びに、プロセッサ100とシステムメモリとの間のインターフェースをとるバスインターフェースユニットを含むことができる。一実施形態では、図1のプロセッサ100は、ラストレベルキャッシュメモリを共有するマルチコアプロセッサ内の複数の処理コアの1つである処理コアを表している。実行ユニット112は、整数ユニット、メディアユニット、浮動小数点ユニット、及び分岐ユニットも含むことができる。
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は、畳み込みカーネルの要素など、ニューロン出力以外を保持することもある。
一実施形態では、NPU126及びシーケンサ128は、組み合わせ論理、順序論理、ステートマシン、又はそれらの組み合わせを含む。アーキテクチャ命令(例えば、MFNN命令1500)は、状態レジスタ127の内容をGPR116の1つにロードして、NNU121のステータス、例えば、NNU121がコマンドを完了したこと、若しくはNNU121がプログラムメモリ129から稼働させていたプログラムを完了したこと、又はNNU121が、新しいコマンドを受け取るか若しくは新しいNNUプログラムを開始するのに空いていることを決定する。
有利な点として、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.3mm2の面積を占める。
シーケンサ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を参照されたい)。
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ビットワードとして消費されることが可能である。
有利な点として、NNU121によって処理できるデータセットのサイズは、重みRAM124及びデータRAM122のサイズに制限されるのではなく、システムメモリのサイズによってのみ制限される。これは、データ及び重みが、MTNN命令及びMFNN命令を使用して(例えば、メディアレジスタ118を通じて)、システムメモリとRAM124及びデータRAM122との間で移動されることがあるためである。一実施形態では、データRAM122はデュアルポートであって、データワードが同時にデータRAM122から読み出され又はデータRAM122に書き込まれる間に、データワードがデータRAM122に書き込まれることを可能にする。さらに、キャッシュメモリを含むメモリサブシステム114の大規模なメモリ階層が、システムメモリとNNU121との間の伝達に非常に高いデータ帯域幅を提供する。さらには、好ましくは、メモリサブシステム114は、ハードウェアデータプリフェッチャを含み、これは、システムメモリからのニューラルデータや重みのロードなどのメモリアクセスパターンを追跡し、キャッシュ階層へのデータのプリフェッチを行って、重みRAM124及びデータRAM122に対する高帯域幅及び低レイテンシ伝達を容易にする。
各NPU126に提供されるオペランドの1つが重みメモリから提供され、それが重みと表される実施形態が記載され、これはニューラルネットワークで広く使用されるが、オペランドは、記載される装置によって速度が向上する可能性のある算出に関連する他タイプのデータであってもよいことを理解されたい。
次いで図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のニューロンへの接続入力の数に関して柔軟性及び効率の利益を有し、極めて高い性能を提供する。
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で提供されるかを、制御する。
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とのうちの最大値である。
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は浮動小数点演算を行うことを理解されたい。
図2は、ALU204の中に乗算器242及び加算器244のみを示しているが、好ましくは、ALU204は、上記の他の演算を行う他の要素を含む。例えば、好ましくは、ALU204は、累算器202をデータワード/重みワードと比較する比較器(図示せず)、及び、比較器によって指示される2つの値のうち大きい方の値(最大値)を累算器202に記憶するために選択するmux(図示せず)を含む。別の例として、好ましくは、ALU204は選択論理(図示せず)を含み、この選択論理は、データワード/重みワードに関して乗算器242を迂回して、加算器244がそのデータワード/重みワードを累算器202の値217に加算して、累算器202に記憶するための和を生成できるようにする。そのような追加的な動作については下記で例えば図18〜図29Aに関連してより詳細に説明され、例えば畳み込み演算及びプーリング演算を行うために有用である可能性がある。
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+ex)であり、すなわち、1とexとの和の自然対数であり、「e」はオイラー数であり、xはこの関数への入力217である。好ましくは、活性化関数は、下記でより詳細に説明するように、累算器202の値217又はその一部分をパススルーするパススルー関数をさらに含む場合がある。一実施形態では、AFU212の回路は、1クロックサイクル内に活性化関数を行う。一実施形態では、AFU212は表を備え、これらの表は、累算された値を受け取り、活性化関数のうちいくつか、例えばシグモイド、ハイパーボリックタンジェント、ソフトプラスについて、本物の活性化関数が提供するであろう値に密接に近似した値を出力する。
好ましくは、累算器202の幅(ビット単位)は、AFU212の出力133の幅より大きい。例えば、一実施形態では、累算器は41ビット幅であって、最大で512個の32ビット積の累算における精度の損失を回避し(下記で例えば図30に関連してより詳細に説明する)、結果133は16ビット幅である。図8に関連して下記でより詳細にその一例が説明される一実施形態では、連続するクロックサイクル中に、「未処理の(raw)」累算器202の出力217値の種々の部分が、AFU212をパススルーされ、データRAM122又は重みRAM124に書き戻される。これにより、未処理の累算器202値が、MFNN命令を介してメディアレジスタ118に再びロードされることが可能になり、そのため、プロセッサ100の他の実行ユニット112で実行される命令が、AFU212が行うことのできない複雑な活性化関数を行うことができ、そのような活性化関数には、基準化指数関数とも呼ばれる、よく知られたソフトマックス活性化関数などがある。一実施形態では、プロセッサ100の命令セットアーキテクチャは、一般にex又はexp(x)と呼ばれる指数関数を行う命令を含み、これを使用してプロセッサ100の他の実行ユニット112によるソフトマックス活性化関数の実行の速度を上げることができる。
一実施形態では、NPU126はパイプライン化される。例えば、NPU126は、ALU204の乗算器及び加算器及び/又は他の回路の間のレジスタなどの、ALU204のレジスタと、AFU212の出力を保持するレジスタとを含むことができる。NPU126の他の実施形態は、下記で説明する。
次いで図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の各々を制御する。
図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の値を選択的に左又は右に循環させるように構成される実施形態が企図される。
次いで図4を参照すると、図1のNNU121のプログラムメモリ129に記憶されてNNU121によって実行されるプログラムを図示する表が示される。この例示的プログラムは、上記のような人工ニューラルネットワークの層に関連する算出を行う。図4の表には、4つの行及び3つの列が示される。各行は、第1の列に表されるプログラムメモリ129のアドレスに対応している。第2の列は命令を指定し、第3の列は、その命令に伴うクロックサイクル数を指示する。好ましくは、クロックサイクル数は、命令のレイテンシではなく、パイプライン化された実施形態における命令当たりクロック(clocks-per-instruction)型の値で有効クロック数を指示する。図示されるように、命令の各々は、NNU121のパイプライン化された性質に起因して、関連付けられた1クロックサイクルを有し、アドレス2における命令は例外であり、この命令は、下記でより詳細に説明するように、該命令が自身を実際上511回繰り返すため、511クロックを必要とする。
プログラムの各命令について、NPU126のすべてが該命令を並列に行う。すなわち、すべてのN個のNPU126が、同じクロックサイクルに1番目の行の命令を行い、すべてのN個のNPU126が同じクロックサイクルに2番目の行の命令を行い、以下同様に続く。ただし、命令の一部が部分的に並列で部分的に順次なやり方で行われる他の実施形態が下記に記載され、例えば、NPU126が活性化関数ユニットを共有する実施形態におけるアドレス3及び4の活性化関数及び出力命令であり、例えば図11の実施形態に関連する。図4の例は、1つの層に512個のニューロン(NPU126)があり、各々が、前の層の512個のニューロンからの512個の接続入力を有し、合計で256K個の接続があると仮定している。各ニューロンは、各接続入力から16ビットのデータ値を受け取り、その16ビットのデータ値に適切な16ビットの重み値を乗算する。
アドレス0(ただし他のアドレスが指定されることもある)にある1番目の行は、NPU初期化命令を指定する。初期化命令は、累算器202の値をゼロにクリアする。一実施形態では、初期化命令は、この命令によってアドレスが指定されるデータRAM122又は重みRAM124の行の対応するワードを、累算器202にロードすることを指定することもできる。初期化命令は、図29A及び図29Bに関して下記でより詳細に説明するように、構成値を制御レジスタ127にさらにロードする。例えば、データワード207と重みワード209の幅をロードすることができ、その幅がALU204によって使用されて、回路によって行われる演算のサイズを決定することができ、また、この幅は、累算器202に記憶される結果215に影響する可能性がある。一実施形態では、NPU126は、累算器202に記憶される前にALU204の出力215を飽和させる回路を含み、初期化命令が構成値を回路にロードしてその飽和に影響を与える。一実施形態では、累算器202は、ALU関数命令(例えば、アドレス1の積和命令)、又はアドレス4のAFU出力書き出し命令などの出力命令の中でその旨を指定することにより、ゼロ値にクリアされることも可能である。
アドレス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に提供される。
アドレス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に命令する「実行」命令を含む。
アドレス3にある4番目の行は、活性化関数命令を指定する。活性化関数命令は、AFU212に、指定された活性化関数を累算器202の値217に行って結果133を生成するように命令する。一実施形態による活性化関数については下記でより詳細に説明する。
アドレス4にある5番目の行は、AFU出力書き出し命令を指定し、これは、512個のNPU126に、各自のAFU212の出力を結果133として、データRAM122の行、この例では行16に書き戻すように命令する。すなわち、この命令は、16のデータRAMアドレス123値と書き込みコマンドとを出力するようにシーケンサ128に命令する(アドレス1の積和命令の場合における読み出しコマンドとは対照的に)。好ましくは、AFU出力書き出し命令の実行は、パイプライン化された性質で他の命令の実行に重ねられることができ、AFU出力書き出し命令は、1クロックサイクルで効果的に実行される。
好ましくは、各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に活性化関数を行う。
次いで図5を参照すると、NNU121による図4のプログラムの実行を図示するタイミング図が示される。タイミング図の各行は、1番目の列に指示される連続したクロックサイクルに対応している。その他の列は各々、512個のNPU126のうち異なる1つに対応し、そのNPUの動作を指示する。図示を簡略且つ明瞭にするために、NPU0、1、及び511についてのみ動作を示している。
クロック0に、512個のNPU126の各々が、図4の初期化命令を行い、これは図5では累算器202へのゼロ値の代入によって図示されている。
クロック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との積と共に累算する。
クロック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との積と共に累算する。
クロック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クロックサイクルの各々について継続する。
クロック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のアクセスに応答して、短時間ストールすることができる。
クロック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にも示している。
次いで図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に書き戻す。
観察できるように、作り出されてデータRAM122又は重みRAM124に書き戻される結果ワード(ニューロン出力)を生成するために必要なクロック数は、およそ、ニューラルネットワークの現在の層に受け取られるデータ入力(接続)の数の平方根である。例えば、現在の層が512個のニューロンを有し、各々が前の層からの512個の接続を有する場合には、接続の総数は256K個であり、現在の層についての結果を生成するために必要なクロック数は512をわずかに上回る。したがって、NNU121は、ニューラルネットワークの計算に極めて高い性能を提供する。
次いで図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で開始する。
ブロック602で、プロセッサ100、すなわちプロセッサ100で稼働しているアーキテクチャプログラムが、ニューロンの現在の隠れ層への入力値をデータRAM122に、例えば、図6Aに関して示し説明するようにデータRAM122の行17に、書き込む。或いは、この値は、前の層(例えば、畳み込み層、プーリング層、又は入力層)についてのNNU121の演算の結果133として、データRAM122の行17にすでに存在している場合もある。加えて、アーキテクチャプログラムは、変数Nを1の値に初期化する。変数Nは、隠れ層のうち、NNU121によって処理されている現在の層を表す。加えて、この例では4つの隠れ層があるため、アーキテクチャプログラムは、変数NUM_LAYERSを4の値に初期化する。フローはブロック604に進む。
ブロック604で、プロセッサ100は、層1の重みワードを重みRAM124に、例えば、図6Aに示すように行0〜511に、書き込む。フローはブロック606に進む。
ブロック606で、プロセッサ100は、プログラムメモリ129に書き込みをする関数1432を指定するMTNN1400命令を使用して、積和活性化関数プログラム(例えば図4の)をNNU121のプログラムメモリ129に書き込む。プロセッサ100は、次いで、プログラムの実行を開始する関数1432を指定するMTNN1400命令を使用して、NNUプログラムを開始する。フローは判定ブロック608に進む。
判定ブロック608で、アーキテクチャプログラムは、変数Nの値がNUM_LAYERSより小さいかどうかを決定する。小さい場合、フローはブロック612に進み、それ以外の場合、フローはブロック614に進む。
ブロック612で、プロセッサ100は、層N+1の重みワードを重みRAM124に、例えば、行512〜1023に書き込む。したがって、有利な点として、アーキテクチャプログラムは、NNU121が現在の層について隠れ層の計算を行っている間に、次の層の重みワードを重みRAM124に書き込み、そのため、NNU121は、現在の層についての計算が完了する、すなわちデータRAM122に書き込まれると、直ちに次の層について隠れ層の計算の実行を開始することができる。フローはブロック614に進む。
ブロック614で、プロセッサ100は、現在稼働しているNNUプログラム(層1の場合はブロック606で開始され、層2〜4の場合はブロック618で開始されたもの)が完了したと決定する。好ましくは、プロセッサ100は、MFNN1500命令を実行してNNU121の状態レジスタ127を読み出すことによってこれを判定する。代替的な一実施形態では、NNU121は、割込みを生成して、積和活性化関数層のプログラムを完了したことを示す。フローは判定ブロック616に進む。
判定ブロック616で、アーキテクチャプログラムは、変数Nの値がNUM_LAYERSより小さいかどうかを決定する。小さい場合、フローはブロック618に進み、それ以外の場合、フローはブロック622に進む。
ブロック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に進む。
ブロック622で、プロセッサ100は、層Nについて、NNUプログラムの結果をデータRAM122から読み出す。ただし、結果がその後単に次の層によって使用されるだけの場合は、アーキテクチャプログラムは、結果をデータRAM122から読み出す必要はない場合もあり、しかし代わりに、次の隠れ層の計算のために結果をデータRAM122に残しておくことができる。フローは判定ブロック624に進む。
判定ブロック624で、アーキテクチャプログラムは、変数Nの値がNUM_LAYERSより小さいかどうかを決定する。小さい場合、フローはブロック626に進み、それ以外の場合、フローは終了する。
ブロック626で、アーキテクチャプログラムは、Nを1だけ増分する。フローは判定ブロック608に戻る。
図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をストールさせる必要はない。
次いで図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で提供されるかを、制御する。
mux−reg208及び/又はmux−reg705(並びに図18及び図23の実施形態などの他の実施形態のmux−reg)を含めて、データRAM122及び/又は重みRAM124から受け取られる行のデータ/重みを循環させる大きな循環器を効果的に形成することには、さもなければ必要なデータワード/重みワードを適切なNNU121に提供するためにデータRAM122及び/又は重みRAM124の間で必要となるであろう極めて大きなmuxを、NNU121が必要としないという利点がある。
活性化関数の結果に加えた累算値の書き戻し
応用例によっては、プロセッサ100が未処理の累算器202の値217を(例えば、図15のMFNN命令を介してメディアレジスタ118に)再び受け取り、その値に、他の実行ユニット112で実行されている命令が計算を行えると有用である。例えば、一実施形態では、AFU212の複雑性を低減するために、AFU212はソフトマックス活性化関数を行うように構成されない。したがって、NNU121は、未処理の累算器202の値217又はそのサブセットを、データRAM122又は重みRAM124に出力することができ、それを後にアーキテクチャプログラムがデータRAM122又は重みRAM124から読み出して、その未処理値に計算を行う。ただし、未処理の累算器202の値217の使用は、ソフトマックスの実行に限定されず、他の使用例が企図される。
次いで図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])は、ゼロ値ビットに強制される。
シーケンサ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を制御する。
次いで図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)を書き戻すことができる。
次いで図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]はゼロ値に強制される。
共有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として参照される。
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を共有する他の実施形態が企図される。
AFU1112を共有する動機は、NNU121のサイズを低減することである。サイズの低減は、性能の低下という犠牲を払って得られる。すなわち、例えば下記の図12で実証されるとおり、共有比に依存して、NPU126のアレイ全体の結果133を生成するのに数クロック長くかかる可能性があり、図12の場合には、8:1の共有比のため、7のさらなるクロックサイクルが必要とされる。ただし、一般的に言って、この追加的なクロック数(例えば7)は、累算和を生成するために必要とされるクロック数(例えば、1ニューロン当たり512個の接続がある層では512クロック)と比べて、比較的少ない。したがって、この比較的小さな性能への影響(例えば、計算時間の1%の増加)は、NNU121の低減されたサイズに対して、価値のあるトレードオフであり得る。
一実施形態では、NPU126の各々は、比較的単純な活性化関数を行うAFU212を含み、それにより、上記単純なAFU212が比較的小さくあり、したがって各NPU126に含まれることを可能にしている。それに対して、共有される、又は複雑なAFU1112は、比較的複雑な活性化関数を行い、したがって、単純なAFU212よりも比較的大幅に大きい。そのような実施形態では、追加的なクロックサイクルは、複雑なAFU1112の共有を必要とする複雑な活性化関数が指定されるときのみ必要とされ、単純なAFU212が行うように構成された活性化関数が指定されるときには必要とされない。
次いで図12及び図13を参照すると、図11のNNU121による図4のプログラムの実行を図示する2つのタイミング図が示される。図12のタイミング図は、図5タイミング図と似ており、クロック0〜512は同じである。ただし、クロック513において、動作が図5のタイミング図に記載される動作と異なり、なぜならば、図11のNPU126はAFU1112を共有するからである。すなわち、1つのグループのNPU126は、そのグループに関連付けられたAFU1112を共有し、図11はこの共有を図示している。
図13のタイミング図の各行は、1番目の列に指示される連続したクロックサイクルに対応している。その他の列はそれぞれ、64個のAFU1112のうち異なる1つに対応し、そのAFUの動作を指示する。図示を簡略且つ明瞭にするために、AFU0、1、及び63のみの動作を示している。図13のクロックサイクルは、図12のクロックサイクルに対応しているが、異なる仕方でNPU126によるAFU1112の共有を図示している。図13に示されるように、クロック0〜512において、64個のAFU1112の各々は非アクティブであり、一方、NPU126は、NPU初期化並びに積和及び積和循環命令を行う。
図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に記憶されることになる結果を生成する。
示されるように、クロック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に記憶されることになる結果を生成する。
512個のNPU126に関連するすべての512個の結果が生成され、行バッファ1104に書き込まれると、クロック521において、行バッファ1104は、その内容の、データRAM122又は重みRAM124に対する書き出しを開始する。このようにして、NPU126の64個のグループの各々のAFU1112は、図4のアドレス3にある活性化関数命令の一部分を行う。
ALU204のグループ間でAFU1112を共有する図11のような実施形態は、例えば下記で図29A〜図33との関連でより詳細に説明する、整数ALU204との関連で特に有利である可能性がある。
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アーキテクチャで一般的であるプレフィクスを含む場合も含まない場合もある。
即値フィールド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の一例を図示する。
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もまた、同様の目的のためにデュアルポートである。
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を制御する。
一実施形態では、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の行のより大きなチャンクを読み出すことができる。
次いで図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アーキテクチャで一般的であるプレフィクスを含む場合も含まない場合もある。
即値フィールド1512は、関数1532を指定する値を、NNU121の制御論理1434に提供する。好ましくは、関数1532は、図1のマイクロ命令105の即値オペランドとして提供される。NNU121によって行われることが可能な関数1532には、これらに限定されないが、データRAM122からの読み出し、重みRAM124からの読み出し、プログラムメモリ129からの読み出し、及び状態レジスタ127からの読み出しが含まれる。図15は、データRAM122から読み出す関数1532の一例を図示する。
gprフィールド1508は、汎用レジスタファイル116内のGPRの1つを指定する。汎用レジスタファイル116は、示されるように、選択されたGPRからの値をNNU121に提供し、NNU121はその値を、図14のアドレス1422と同じように動作するアドレス1522として使用して、関数1532で指定されるメモリの行を選択する。データRAM122又は重みRAM124の場合、アドレス1522は追加的に、選択された行の中で、メディアレジスタの場所のサイズであるチャンク(例えば、256ビット)を選択する。好ましくは、その場所は256ビットの境界上である。
dstフィールド1504は、メディアレジスタファイル118内のメディアレジスタを指定する。示されるように、メディアレジスタファイル118は、データ(例えば、256ビット)を、データRAM122(又は重みRAM124又はプログラムメモリ129)から、選択されたメディアレジスタに受け取り、上記データは、アドレス1522によって指定される選択された行1528から、及び、選択された行1528の中のアドレス1522で指定される場所から読み出される。
NNU内部RAMのポート構成
次いで図16を参照すると、図1のデータRAM122の実施形態を図示するブロック図が示される。データRAM122は、メモリアレイ1606、読み出しポート1602、及び書き込みポート1604を備える。メモリアレイ1606は、データワードを保持し、好ましくは、上記のようにN個のワードのD個の行として編成される。一実施形態では、メモリアレイ1606は、64個の水平方向に編成された静的RAMセルの配列からなり、各セルは128ビットの幅及び64ビットの高さであり、それにより、8192ビット幅で64個の行を有する64KBのデータRAM122を提供し、データRAM122は、約0.2平方ミリメートルのダイ面積を占める。ただし、他の実施形態が企図される。
読み出しポート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の双方が読み出し/書き込みポートである。
本明細書に記載されるNPU126の循環器能力の利点は、そうでない場合にNPU126が高度に利用されることを保証するために必要とされ得る場合と比べて、データRAM122のメモリアレイ1606が大幅により少ない行を有し、したがって相対的にはるかにより小さくなる能力を容易にする点である。NPU126が高度に利用されるためには、NPU126が計算を行っている間に、アーキテクチャプログラムが(メディアレジスタ118を介して)データRAM122にデータを提供し続け、またデータRAM122から結果を引き出し続けられることが必要となる。
内部RAMバッファ
次いで図17を参照すると、図1の重みRAM124及びバッファ1704の実施形態を図示するブロック図が示される。重みRAM124は、メモリアレイ1706及びポート1702を含む。メモリアレイ1706は、重みワードを保持し、好ましくは、上記のようにN個のワードのW個の列として編成される。一実施形態では、メモリアレイ1706は、128個の水平方向に編成された静的RAMセルの配列からなり、各セルは64ビットの幅及び2048ビットの高さであり、それにより、8192ビット幅で2048個の行を有する2MBの重みRAM124を提供し、重みRAM124は、約2.4平方ミリメートルのダイ面積を占める。ただし、他の実施形態が企図される。
ポート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とアーキテクチャプログラムとの間で、さらに少ない頻度で衝突が発生する。
バッファ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の選択されたチャンクだけに書き込みをし、それによりその他のチャンク内の以前のデータを保有しておくことを可能にする。
バッファ1704を含んでいる一実施形態では、アーキテクチャプログラムによる重みRAM124からの読み出しが、複数のMFNN命令1500を必要とする。初期MFNN命令1500が、重みRAM124の指定された行からバッファ1704にロードする関数1532を指定し、続いて、1つ又は複数のMFNN命令1500が、バッファ1704の指定されたチャンクを宛先レジスタに読み込む関数1532を指定し、ここで、チャンクのサイズはメディアレジスタ118のビット数であり、チャンクはバッファ1704内で当然位置合わせされる。他の実施形態が企図され、それらの実施形態では、重みRAM124が複数のバッファ1704を含んで、NPU126の実行中にアーキテクチャプログラムが行えるアクセス数を増やすことにより、重みRAM124にアクセスするためのNPU126とアーキテクチャプログラムとの間の競合をさらに減らし、このことは、NPU126が重みRAM124にアクセスする必要がないクロックサイクル中に、バッファ1704によるアクセスを行える見込みを増やす可能性がある。
図16は、デュアルポートのデータRAM122を説明するが、重みRAM124がさらにデュアルポートである他の実施形態が企図される。さらに、図17は、重みRAM124と共に使用するためのバッファを説明するが、データRAM122がバッファ1704と同様の関連付けられたバッファをさらに有する他の実施形態が企図される。
動的に構成可能な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の実施形態について説明する。
図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を受け取る。
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を受け取る。
入力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との双方に提供される。
制御入力213は、3つの入力のうちいずれをmux−reg208A/208Bの各々が選択して各自のレジスタに記憶し、それが後にそれぞれの出力209A/209Bで提供されるかを、制御する。NPU126が、データRAM122から行をロードするように命令されるとき(例えば、下記の図20のアドレス1の積和命令により)、NPU126がワイド構成であるかナロー構成であるかに関係なく、制御入力213は、mux−reg208A/208Bの各々を制御して、データRAM122の選択された行の対応するナローワードから、各自のナローデータワード207A/207B(例えば、8ビット)を選択させる。
NPU126が、前に受け取られたデータ行値を循環させるように命令されるとき(例えば、下記の図20のアドレス2にある積和循環命令により)、NPU126が、ナロー構成である場合、制御入力213は、mux−reg208A/208Bの各々を制御して、それぞれの入力1811A/1811Bを選択させる。この場合、mux−reg208A/208Bは個々に効果的に機能し、NPU126は効果的に2つの別個のナローNPUであるようになる。このようにして、図19に関連して下記でより詳細に説明するように、N個のNPU126のmux−reg208A及び208Bが、2Nナローワード循環器として集合的に動作する。
NPU126が、前に受け取られたデータ行値を循環させるように命令されるとき、NPU126が、ワイド構成である場合、制御入力213は、mux−reg208A/208Bの各々を制御して、それぞれの入力211A/211Bを選択させる。この場合、mux−reg208A/208Bは、NPU126が単一のワイドNPU126であるかのように、共に効果的に機能する。このようにして、図3に関連して説明したのと同様にして、N個のNPU126のmux−reg208A及び208Bが、Nワイドワード循環器として集合的に動作する。
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は、好ましくは、電力消費を減らすように非アクティブである。
オペランド選択論理1898は、下記でより詳細に説明するように、209A、209B、203A、及び203Bからオペランドを選択して、ALU204のその他の要素に提供する。好ましくは、オペランド選択論理1898は、符号付き値のデータワード及び重みワードの符号拡張を行うなど、他の機能も行う。例えば、NPU126がナロー構成である場合、オペランド選択論理1898は、ナローデータワード及び重みワードを、これらをワイド乗算器242Aに提供する前に、ワイドワードの幅に符号拡張する。同様に、ALU204が、ナローデータ/重みワードをパススルーする(ワイドmux1896Aを介してワイド乗算器242Aを迂回する)ように命令される場合、オペランド選択論理1898は、ナローデータ/重みワードを、これをワイド加算器244Aに提供する前に、ワイドワードの幅に符号拡張する。好ましくは、図2のNPU126のALU204に、符号拡張機能を行うように論理がさらに存在する。
ワイドmux1896Aは、ワイド乗算器242Aの出力とオペランド選択論理1898からのオペランドとを受け取り、これら入力のうち一方を、ワイド加算器244Aに対する提供のために選択する。ナローmux1896Bは、ナロー乗算器242Bの出力とオペランド選択論理1898からのオペランドとを受け取り、これら入力のうち一方を、ナロー加算器244Bに対する提供のために選択する。
オペランド選択論理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は、ナローワードを、ゼロ値の上位ビットでパディングする。
別の例として、NPU126がワイド構成であり、命令がALU204に重みワードの累算を行うように命令する場合、ワイド乗算器242Aは迂回され、オペランド選択論理1898は、出力203Aと203Bとの連結を、ワイド加算器244Aに対する提供のためにワイドmux1896Aに提供する。これに対し、NPU126がナロー構成であり、命令がALU204に重みワードの累算を行うように命令する場合、ワイド乗算器242Aは迂回され、オペランド選択論理1898は、出力203Aの拡張されたバージョンを、ワイド加算器244Aに対する提供のためにワイドmux1896Aに提供し、ナロー乗算器242Bは迂回され、オペランド選択論理1898は、出力203Bの拡張されたバージョンを、ナロー加算器244Bに対する提供のためにナローmux1896Bに提供する。
別の例として、NPU126がワイド構成であり、命令がALU204にデータワードの累算を行うように命令する場合、ワイド乗算器242Aは迂回され、オペランド選択論理1898は、出力209Aと209Bとの連結を、ワイド加算器244Aに対する提供のためにワイドmux1896Aに提供する。これに対し、NPU126がナロー構成であり、命令がALU204にデータワードの累算を行うように命令する場合、ワイド乗算器242Aは迂回され、オペランド選択論理1898は、出力209Aの拡張されたバージョンを、ワイド加算器244Aに対する提供のためにワイドmux1896Aに提供し、ナロー乗算器242Bは迂回され、オペランド選択論理1898は、出力209Bの拡張したバージョンを、ナロー加算器244Bに対する提供のためにナローmux1896Bに提供する。重みワード/データワードの累算は、画像処理など、一部の人工ニューラルネットワークの応用例のプーリング層で使用される平均演算を行うために有用である可能性がある。
好ましくは、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で乗算するため)ように構成される。
ナローAFU212Bは、ナロー累算器202Bの出力217Bを受け取り、それに活性化関数を行ってナロー結果133Bを生成し、ワイドAFU212Aは、ワイド累算器202Aの出力217Aを受け取り、それに活性化関数を行ってワイド結果133Aを生成する。NPU126がナロー構成であるとき、例えば図29A〜図30に関連して下記でより詳細に説明するように、ワイドAFU212Aは、それに応じてワイド累算器202Aの出力217Aを考慮し、その出力に活性化関数を行って、例えば8ビットのナロー結果を生成する。
上記の説明から観察できるように、有利な点として、ナロー構成であるとき、単一のNPU126が効果的に2つのナローNPUとして動作し、それにより、より小さいワードについて、最大で、ワイド構成であるときの約2倍のスループットをもたらす。例えば、1024個のニューロンを持ち、各々が前の層から1024個のナロー入力を受け取る(及び、ナロー重みワードを有する)ニューラルネットワーク層を仮定すると、その結果、1メガの接続がもたらされる。ワイド構成において512個のNPU126を有するNNU121と比べて、ナロー構成において512個のNPU126(1024個のナローNPU)を有するNNU121は、ワイドワードではなくナローワードであるが、約半分の時間で(およそ1026クロック対514クロック)、4倍の接続数(1メガの接続対256Kの接続)を処理することができる。
一実施形態では、図18の動的に構成可能なNPU126は、レジスタ205A及び205Bの代わりに、mux−reg208A及び208Bと同様の3入力多重化レジスタを含み、図7の実施形態に関連して説明した仕方といくらか似た、しかし図18に関連して説明した動的に構成可能なやり方で、重みRAM124から受け取られる重みワードの行のための循環器を実現する。
次いで図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にさらに対応している。
各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の各々を制御する。
次いで図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ビットの重み値を乗算する。
次いで図21を参照すると、ナロー構成において動作する図18のNPU126を含むNNU121による図20のプログラムの実行を図示するタイミング図が示される。図21のタイミング図は多くの点で図5のタイミング図に似ているが、以下では違いを説明する。
図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まで含んでいる。
クロック0に、1024個のNPUの各々が図4の初期化命令を行い、これは図5では累算器202へのゼロ値の代入によって図示されている。
クロック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との積と共に累算する。
クロック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との積と共に累算する。
クロック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クロックサイクルの各々について継続する。
クロック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との積と共に累算する。
クロック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にさらに示される。
次いで図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に書き戻す。
観察できるように、図18の実施形態は、例えば図2の実施形態よりも有利である可能性があり、これは、なぜならば、モデル化される特定の応用例によってワイドのデータ及び重みワード(例えば、16ビット)の量の精度が必要とされるときにそうしたワードを、応用例によってナローのデータ及び重みワード(例えば、8ビット)の量の精度が必要とされるときにそうしたワードを使用して、計算を実行する柔軟性をプログラマに提供するからである。ある観点から見ると、図18の実施形態は、ナローデータの応用例について、追加のナロー要素(例えば、mux−reg208B、reg205B、ナローALU204B、ナロー累算器202B、ナローAFU212B)という犠牲を払って、図2の実施形態を上回って2倍のスループットを提供し、上記追加のナロー要素は、NPU126の面積において約50%の増大である。
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である。
じょうご構成にあるとき、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の実施形態と対照的である。
図23の実施形態に関連して観察できるように、作り出され、データRAM122又は重みRAM124に書き戻される結果ワード(ニューロン出力)の数は、受け取られるデータ入力(接続)の数の平方根の半分になり、書き戻された結果の行は穴を有し、すなわち1つおきのナローワード結果が無効であり、より具体的にはBのナローNPUの結果は有意でない。そのため、図23の実施形態は、2つの連続した層を持ち、例えば第1の層が第2の層の2倍の数のニューロンを有する(例えば、第1の層が、512個のニューロンからなる第2の層に完全に接続された1024個のニューロンを持つ)ニューラルネットワークにおいて特に効率的である可能性がある。さらに、他の実行ユニット112(例えば、x86 AVXユニットなどのメディアユニット)は、NNU121がデータRAM122及び/又は重みRAM124の他の行に関連する他の計算を行っている間、必要であれば、後の計算で使用するために、散在した結果の行(すなわち穴がある)にパック動作を行ってそれをコンパクトにする(すなわち穴をなくす)ことができる。
ハイブリッドの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の読み出し及び書き込みを行う。
次いで図24を参照すると、畳み込み演算を行うために図1のNNU121によって使用されるデータ構造の例を図示するブロック図が示される。このブロック図は、畳み込みカーネル2402、データ配列2404、並びに図1のデータRAM122及び重みRAM124を含んでいる。好ましくは、データ配列2404(例えば、画像画素の)は、プロセッサ100に取り付けられたシステムメモリ(図示せず)に保持され、プロセッサ100がMTNN命令1400を実行することにより、NNU121の重みRAM124にロードされる。畳み込み演算は、第1の行列を第2の行列で畳み込む演算であり、第2の行列を本明細書では畳み込みカーネルと呼ぶ。本開示の文脈において理解されるように、畳み込みカーネルは係数の行列であり、係数は、重み、パラメータ、要素、又は値と呼ばれることもある。好ましくは、畳み込みカーネル2042は、プロセッサ100によって実行されているアーキテクチャプログラムの静的なデータである。
データ配列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である。
畳み込みカーネル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の要素の値と、上記所望の範囲と、畳み込み対象の行列の入力値の範囲とから決定される。
図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行を、順に、繰り返し読み出す。
図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によって受け取られる。
次いで図25を参照すると、図1のプロセッサ100が、NNU121を使用するアーキテクチャプログラムを行って、図24の畳み込みカーネル2042とデータ配列2404との畳み込みを行う動作を図示するフローチャートが示される。フローはブロック2502で開始する。
ブロック2502で、プロセッサ100、すなわちプロセッサ100で稼働しているアーキテクチャプログラムが、図24の畳み込みカーネル2042を、図24に示し図24に関連して説明したようにデータRAM122に書き込む。加えて、アーキテクチャプログラムは、変数Nを1の値に初期化する。変数Nは、NNU121によって処理されているデータ配列2404の現在のチャンクを表す。加えて、アーキテクチャプログラムは、変数NUM_CHUNKSを20の値に初期化する。フローはブロック2504に進む。
ブロック2504で、プロセッサ100は、図24に示すように、チャンク1のデータ行列2406を重みRAM124に書き込む(例えば、チャンク1のデータ行列2406A)。フローはブロック2506に進む。
ブロック2506で、プロセッサ100は、プログラムメモリ129に書き込む関数1432を指定するMTNN1400命令を使用して、畳み込みプログラムをNNU121のプログラムメモリ129に書き込む。次いで、プロセッサ100は、プログラムの実行を開始する関数1432を指定するMTNN1400命令を使用して、NNU畳み込みプログラムを開始する。NNU畳み込みプログラムの一例は、図26Aに関連してより詳細に説明する。フローは判定ブロック2508に進む。
判定ブロック2508で、アーキテクチャプログラムは、変数Nの値がNUM_CHUNKSより小さいかどうかを決定する。小さい場合、フローはブロック2512に進み、そうでない場合、フローはブロック2514に進む。
ブロック2512で、プロセッサ100は、図24に示すように、チャンクN+1についてのデータ行列2406を重みRAM124に書き込む(例えば、チャンク2のデータ行列2406B)。このように、有利な点として、アーキテクチャプログラムは、NNU121が現在のチャンクに畳み込みを行っている間に、次のチャンクのデータ行列2406を重みRAM124に書き込み、そのため、NNU121は、現在のチャンクの畳み込みが完了する、すなわち重みRAM124に書き込まれると、直ちに次のチャンクに畳み込みの実行を開始することができる。フローはブロック2514に進む。
ブロック2514で、プロセッサ100は、現在稼働しているNNUプログラム(チャンク1の場合はブロック2506で開始され、チャンク2〜20の場合はブロック2518で開始されたもの)が完了したことを決定する。好ましくは、プロセッサ100は、MFNN1500命令を実行してNNU121の状態レジスタ127を読み出すことにより、これを決定する。代替的な一実施形態では、NNU121は、畳み込みプログラムを完了したことを示す割込みを生成する。フローは判定ブロック2516に進む。
判定ブロック2516で、アーキテクチャプログラムは、変数Nの値がNUM_CHUNKSより小さいかどうかを決定する。小さい場合、フローはブロック2518に進み、そうでない場合、フローはブロック2522に進む。
ブロック2518で、プロセッサ100は、畳み込みプログラムを更新して、チャンクN+1の畳み込みを行えるようにする。より具体的には、プロセッサ100は、アドレス0におけるNPU初期化命令の重みRAM124の行値を、データ行列2406の1番目の行(例えば、データ行列2406Aについて、行0、又は、データ行列2406Bについて、行500)に更新し、出力行を(例えば、900又は1300に)更新する。プロセッサ100は、次いで、更新されたNNU畳み込みプログラムを開始する。フローはブロック2522に進む。
ブロック2522で、プロセッサ100は、チャンクNについてNNU畳み込みプログラムの結果を、重みRAM124から読み出す。フローは判定ブロック2524に進む。
判定ブロック2524で、アーキテクチャプログラムは、変数Nの値がNUM_CHUNKSより小さいかどうかを決定する。小さい場合、フローはブロック2526に進み、そうでない場合、フローは終了する。
ブロック2526で、アーキテクチャプログラムは、Nを1だけ増分する。フローは判定ブロック2508に戻る。
次いで図26Aを参照すると、図24のデータ行列2406と畳み込みカーネル2042との畳み込みを行い、それを重みRAM124に書き戻すNNUプログラムのプログラムリストが示される。このプログラムは、アドレス1〜9の命令のループ本体を通じて複数回ループする。アドレス0のNPU初期化命令は、各NPU126がループ本体を実行する回数を指定し、ループ本体は、図26Aの例では、図24のデータ行列2406内の行の数に対応する400のループカウント値を有し、ループの最後(アドレス10)におけるループ命令は、現在のループカウント値を減分し、その結果が非ゼロである場合、ループ本体の先頭に(すなわちアドレス1の命令に)制御を戻す。NPU初期化命令はさらに、累算器202をゼロにクリアする。好ましくは、アドレス10のループ命令がさらに、累算器202をゼロにクリアする。或いは、上記のように、アドレス1の積和命令が、累算器202をゼロにクリアすることを指定してもよい。
プログラムのループ本体が実行されるたび、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)を引き起こすことに留意されたい。次いでループ本体について説明する。
アドレス1にあるのは、データRAM122の行0を指定し、現在の重みRAM124の行を暗黙的に使用する積和命令であり、上記現在の行は、好ましくは、シーケンサ128に保持される(また、ループ本体の最初の通過のために、アドレス0の命令によってゼロに初期化される)。すなわち、アドレス1の命令は、NPU126の各々に、各自の対応するワードをデータRAM122の行0から読み出させ、各自の対応するワードを現在の重みRAM124の行から読み出させ、その2つのワードに対する積和演算を行わせる。したがって、例えば、NPU5は、C0,0とDx,5とを乗算し(「x」は現在の重みRAM124の行)、その結果を累算器202の値217に加算し、その和を累算器202に書き戻す。
アドレス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に累算されていることになる。
アドレス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に累算されていることになる。
アドレス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の番号である。
アドレス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進小数点の場所を調節することができる。
アドレス8の命令は、AFU212の出力を、出力行レジスタの現在の値で指定される重みRAM124の行に書き込む。上記出力行レジスタは、アドレス0の命令で初期化されており、この命令中に増分インディケータがあるため、ループを通過するたびに増分される。
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、並びにより大きい畳み込みカーネルの場合に必要となるであろう追加的な同様の命令において)より大きいからである。
或いは、畳み込みの結果を重み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行)、結果として、より少ないチャンク数がもたらされる。
或いは、畳み込みの結果を重みRAM124に書き戻すのではなく、アーキテクチャプログラムは、畳み込みの結果を畳み込みカーネル2402より上の(例えば、行8より上の)データRAM122の行に書き戻すようにNNUプログラムを構成し、アーキテクチャプログラムは、NNU121が結果を書き込むとき、それをデータRAM122から読み出す(例えば、下記の図26Bの一番最近書き込まれたデータRAM122の行2606のアドレスを使用する)。この代替法は、重みRAM124がシングルポートでありデータRAM122がデュアルポートである実施形態で有利である可能性がある。
図24〜図26Aの実施形態によるNNU121の動作から観察できるように、図26Aのプログラムの各実行は、約5000クロックサイクルを要し、その結果、図24の2560×1600のデータ配列2404全体を畳み込むには、約100,000クロックサイクルを要し、これは、同様の作業を従来の方法で行うために必要なクロックサイクル数よりもかなり少ない可能性がある。
次いで図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の高い利用率を達成する。
有利な点として、一実施形態では、特に図29A及び図29B及び図30に関連して下記でより詳細に説明するように、AFU212は、累算器202の値217の有効な除算を効率的に行う能力を備える。例えば、累算器202の値217を16で割る活性化関数NNU命令が、上記のガウスぼかし行列に使用できる。
図24の例で使用される畳み込みカーネル2402は、データ配列2404全体に適用される小さい静的な畳み込みカーネルであるが、他の実施形態では、畳み込みカーネルは、畳み込みニューラルネットワークに一般的に見られるような、データ配列2404の異なるデータ値に関連付けられた固有の重みを有する大きな行列であってもよい。NNU121がそのようにして使用される場合、アーキテクチャプログラムは、データ行列の場所と畳み込みカーネルの場所とを入れ替えることができ、すなわち、データRAM122にデータ行列を、重みRAM124に畳み込みカーネルを置いてもよく、NNUプログラムの所与の実行で処理できる行の数は、相対的により少なくなる可能性がある。
次いで図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と表される。
次いで図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をゼロにクリアすることを指定する。
プログラムのループ本体が反復されるたびに、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の指定された行に書き戻す。次いでループ本体について説明する。
アドレス1にあるのは、現在の重みRAM124の行を暗黙的に使用するmaxwacc命令であり、現在の重みRAM124の行は、好ましくは、シーケンサ128に保持される(また、ループ本体の最初の通過のために、アドレス0の命令によってゼロに初期化される)。アドレス1の命令は、NPU126の各々に、その対応するワードを重みRAM124の現在の行から読み出させ、該ワードを累算器202の値217と比較させ、累算器202に2つの値のうち最大値を記憶させる。したがって、例えば、NPU8は、累算器202の値217とデータワードDx,8(「x」は現在の重みRAM124の行)とのうち最大値を決定し、その最大値を累算器202に書き戻す。
アドレス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とのうちの、最大値を記憶していることになる。
アドレス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とのうちの、最大値を記憶していることになる。
アドレス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の番号である。
アドレス9の命令は、累算器202の値217を、AFU212を通じてパススルーする。このパススルー関数は、重みRAM124から読み出されるワードのサイズ(ビット単位)(すなわち、本例では16ビット)であるワードをパススルーする。好ましくは、下記でより詳細に説明するように、ユーザが、出力の形式、例えば、出力ビットのうちいくつが小数ビットであるかを指定することができる。
アドレス10の命令は、累算器202の値217を、出力行レジスタの現在の値で指定される重みRAM124の行に書き込む。上記出力行レジスタは、アドレス0の命令で初期化されており、この命令中に増分インディケータがあるために、ループを通過するたびに増分される。より具体的には、アドレス10の命令は、累算器202のワイドワード(例えば、16ビット)を重みRAM124に書き込む。好ましくは、下記の図29A及び図29Bに関連して下記でより詳細に説明するように、この命令は、出力2進小数点2916で指定されるように16ビットを書き込む。
観察できるように、ループ本体の反復によって重み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の部分行列など、他のサイズの部分行列にプーリング演算を行うように変更を加えられてもよい。
さらに観察されるように、重みRAM124に書き込まれる結果行の数は、入力データ行列の行の数の4分の1である。最後、この例では、データRAM122は使用されない。しかし、別法として、重みRAM124ではなく、データRAM122がプーリング演算を行うために使用されてもよい。
図27及び図28の例では、プーリング演算は、部分領域の最大値を計算する。しかし、図28のプログラムは、例えば、maxwacc命令をsumwacc命令(重みワードを累算器202の値217に足す)に置き換えることと、アドレス9の活性化関数命令を変更して、累算されている結果を、この例では16である各部分領域の要素数で(好ましくは下記のように逆数乗算を介して)割ることとにより、部分領域の平均値を計算するように変更を加えられてもよい。
図27及び図28の実施形態によるNNU121の動作から観察できるように、図28のプログラムの各実行は、図27の512×1600のデータ行列全体のプーリング演算を行うために約6000クロックサイクルを要し、これは、同様の作業を従来の方法で行うために必要なクロックサイクル数よりもかなり少ない可能性がある。
或いは、プーリング演算の結果を重みRAM124に書き戻すのではなく、アーキテクチャプログラムは、結果をデータRAM122の行に書き戻すようにNNUプログラムを構成し、アーキテクチャプログラムは、NNU121が結果を書き込むとき、その結果をデータRAM122から読み出す(例えば、図26Bの一番最近書き込まれたデータRAM122の行2606のアドレスを使用して)。この代替法は、重みRAM124がシングルポートでありデータRAM122がデュアルポートである実施形態で有利である可能性がある。
ユーザ供給の2進小数点による固定小数点算術、最大精度の固定小数点累算、ユーザ指定の逆数値、累算器値の確率的丸め、及び選択可能な活性化/出力関数
一般的に言って、デジタルコンピューティングデバイス内で算術を行うハードウェアユニットは、それぞれ整数及び浮動小数点数に算術演算を行うことから一般に「整数」ユニット及び「浮動小数点」ユニットと呼ばれるものに分けることができる。浮動小数点数は、大きさ(又は仮数)及び指数、並びに通例は符号を有する。指数は、大きさに対する小数点(通例は2進小数点)の場所を示すものである。対して、整数は指数を持たず、大きさのみを持ち、しばしば符号を有する。浮動小数点ユニットの利点の1つは、プログラマが、極めて大きな範囲内の異なる値をとり得る数を扱えることであり、ハードウェアが、必要に応じて数の指数値の調節を担い、プログラマは調節を行う必要がない。例えば、2つの浮動小数点数、0.111×1029と0.81×1031が乗算されると仮定する。(ここでは10進、すなわち10を底とする例が使用されるが、浮動小数点ユニットは、最も一般的には2を底とする浮動小数点数を扱う。)浮動小数点ユニットは、仮数を乗算し、指数を加算し、次いで結果を基準化して.8991×1059の値に戻すことを自動的に担う。別の例として、上記の同じ2つの浮動小数点数が加算されると仮定する。浮動小数点ユニットは、これらを加算する前に仮数の2進小数点を位置合わせして、結果として得られる和の.81111×1031の値を生成することを自動的に担う。
しかし、浮動小数点ユニットに伴う複雑性とその結果生じるサイズ、電力消費、命令当たりのクロック数の増大及び/又はサイクル時間の延長はよく知られている。実際、この理由のために、多くのデバイス(例えば、組み込みプロセッサ、マイクロコントローラ、並びに、比較的低コスト及び/又は低電力のマイクロプロセッサ)は、浮動小数点ユニットを含んでいない。上記の例から観察できるように、浮動小数点ユニットの複雑性の一部には、浮動小数点の加算及び乗算/除算に関連する指数算出を行う論理(オペランドの指数を加算/減算して、結果得られる浮動小数点乗算/除算の指数値を生成する加算器、オペランドの減算指数を決定して、浮動小数点加算のための2進小数点位置合わせシフト量を決定する減算器)、浮動小数点加算のために仮数の2進小数点位置合わせを達成するシフタ、浮動小数点の結果を基準化するシフタが含まれる。加えて、ブロックユニットに対するフロー進行は、通例、浮動小数点結果の丸めを行う論理、整数形式と浮動小数点形式との間、又は異なる浮動小数点精度形式(例えば、拡張精度、倍精度、単精度、半精度)間の変換を行う論理、先行ゼロ及び先行1の検出器、並びに、非正規化数、NAN、及び無限大などの特殊な浮動小数点数を扱う論理を必要とする。
さらに、浮動小数点ユニットの正確さを検証する際の複雑性が著しいという不都合があり、これは主として、設計を検証しなければならない数空間が増大するためであり、それにより、製品の開発サイクルと市場で販売するまでの時間が長くなる可能性がある。さらには、上記のように、浮動小数点算術は、計算に関係する浮動小数点数ごとに別個の仮数フィールドと指数フィールドを記憶及び使用することを示唆し、それにより、必要とされる記憶域の量が増大する、且つ/又は、整数を記憶するために等しい量の記憶域を想定したときに精度が低下する可能性がある。これらの不都合点の多くは、整数に算術演算を行う整数ユニットの使用によって回避される。
しばしば、プログラマは、小数、すなわち自然数でない数を処理するプログラムを書く。そのプログラムは、浮動小数点ユニットを備えないプロセッサで稼働する可能性もあり、又は、備えている場合でも、プロセッサの整数ユニットによって実行される整数命令の方がより速い可能性がある。整数ユニットに伴う潜在的な性能の利点を活用するために、プログラマは、一般に固定小数点算術として知られるものを固定小数点数に用いる。そのようなプログラムは、整数ユニットに実行されて整数又は整数データを処理する命令を含んでいる。ソフトウェアは、データが小数であることを認識しており、また、整数データに例えば位置合わせシフトなどの演算を行って、データが実際には小数である事実に対処する命令を含んでいる。基本的に、固定小数点ソフトウェアは、浮動小数点ユニットが行う機能の一部又はすべてを手動で行う。
本開示で使用される場合、「固定小数点」数(又は値又はオペランド又は入力又は出力)は、その記憶のビットが、本明細書で「小数ビット」と呼ばれる、当該固定小数点数の小数部分を表すビットを含んでいると理解される数である。固定小数点数の記憶のビットは、メモリ又はレジスタに含まれ、例えば、メモリ又はレジスタ内の8ビット又は16ビットのワードである。さらに、固定小数点数の記憶のビットはすべて、大きさを表すために使用され、場合によっては、1ビットが符号を表すために使用されるが、固定小数点数の記憶ビットのうち、その数の指数を表すために使用される記憶ビットはない。さらに、固定小数点数の小数ビットの数又は2進小数点の場所は、固定小数点数の記憶ビットとは別個の記憶域において指定され、この記憶域は、固定小数点数が属する固定小数点数のセット、例えば、処理ユニットのアレイの入力オペランド、累算値、又は出力結果のセットなどについて、小数ビットの数又は2進小数点の場所を、共有されたやり方又は大域的なやり方で指示する。
有利な点として、ALUは整数ユニットであるが、活性化関数ユニットが固定小数点算術のハードウェア支援又は加速を含む実施形態が、本明細書に記載される。これにより、ALU部分を小型化及び高速化することができ、それにより、ダイ上の所与の空間内により多くのALUを持つことが容易になる。これは、ダイ空間当たりのニューロン数が増えることを示唆し、これは特にニューラルネットワークユニットで有利である。
さらに有利な点として、浮動小数点数ごとに指数記憶ビットを必要とする浮動小数点数と対照的に、記載される実施形態では、固定小数点数が、数のセット全体について、小数ビットである記憶のビット数の指示を用いて表され、ただしこの指示は、セット全体のすべての数について小数ビットの数を大域的に指示する、単一の共有された記憶域に置かれる。上記数のセットは、例えば、一連の演算への入力のセット、その一連の演算の累算値のセット、出力のセットである。好ましくは、NNUのユーザが、数のセットに対して小数記憶ビットの数を指定できるようにされる。したがって、多くの文脈(例えば、一般の数学)では、用語「整数」は符号付きの自然数、すなわち小数部分を持たない数を指すが、本開示の文脈における用語「整数」は、小数部分を持つ数を指す場合もあることを理解されたい。さらに、本開示の文脈における用語「整数」は、個々の記憶のビットの一部が浮動小数点数の指数を表すために使用される浮動小数点数から区別することが意図される。同様に、整数ユニットによって行われる整数の乗算又は加算又は比較などの整数算術演算は、オペランドが指数を持たないことを仮定し、したがって、整数ユニットの整数要素、例えば整数乗算器、整数加算器、整数比較器は、指数を扱う論理を含んでおらず、例えば、加算又は比較演算のために仮数をシフトして2進小数点を位置合わせすることをせず、乗算演算のために指数を加算することをしない。
加えて、精度の低下なく大きな一続きの整数演算(例えば、1000回前後の積和)を累算する大きなハードウェア整数累算器を含む実施形態が、本明細書に記載される。それにより、NNUが浮動小数点数を扱うことを回避できるようになり、同時に、累算された値の最大精度を維持することができ、累算値を飽和させる必要がなく、又はオーバーフローが原因となって不正確な結果を招くことがない。一続きの整数演算が結果を最大精度の累算器に累算すると、固定小数点ハードウェア支援が、下記でより詳細に説明するように、ユーザによって指定された、累算値の小数ビット数の指示と、望まれる出力値中の小数ビット数とを使用して、必要なスケーリング及び飽和を行って最大精度の累算値を出力値に変換する。
下記でより詳細に説明するように、好ましくは、活性化関数ユニットは、活性化関数への入力として使用するため又はパススルーのために、累算器値を最大精度の形式から圧縮するときに、選択的に累算器値に確率的丸めを行うことができる。最後、NPUは、ニューラルネットワークの所与の層の種々の必要性により指示されるとおり、異なる活性化関数を適用するように、且つ/又は各種の異なる形式の累算器値を出力するように、選択的に命令されることができる。
次いで図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プログラムの命令との両方によって書き込まれる可能性がある。
構成2902値は、上記のようにNNU121がナロー構成であるか、ワイド構成であるか、又はじょうご構成であるかを指定する。構成2902は、データRAM122及び重みRAM124から受け取られる入力ワードのサイズを示唆する。ナロー構成及びじょうご構成では、入力ワードのサイズはナローであり(例えば、8ビット又は9ビット)、対してワイド構成では、入力ワードのサイズはワイドである(例えば、12ビット又は16ビット)。さらに、構成2902は、入力ワードのサイズと同じである出力結果133のサイズを示唆する。
符号付きデータ値2912は、真の場合は、データRAM122から受け取られるデータワードが符号付きの値であることを指示し、偽の場合は、符号なしの値であることを指示する。符号付きの重み値2914は、真の場合は、重みRAM124から受け取られる重みワードが符号付きの値であることを指示し、偽の場合は、符号なしの値であることを指示する。
データ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が指定される。
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命令によって指定される。
丸め制御2932は、(図30の)丸め器3004によって使用されるべき丸めの形式を指定する。一実施形態では、指定されることが可能な丸めモードは、これらに限定されないが、丸めなし、最近接丸め、及び確率的丸めを含む。好ましくは、プロセッサ100は、(図30の)ランダムビットソース3003を含み、ランダムビットソース3003は、サンプリングされ、確率的丸めを行うのに使用されるランダムビット3005を生成して、丸めバイアスの可能性を低減する。一実施形態では、丸めビット3005が1で、スティッキービットがゼロの場合、NPU126は、サンプリングされたランダムビット3005が真であれば切り上げ、ランダムビット3005が偽であれば切り上げない。一実施形態では、ランダムビットソース3003は、半導体ダイオード又はレジスタ中の熱雑音など、プロセッサ100のランダムな電気的特性のサンプリングに基づいてランダムビット3005を生成するが、他の実施形態が企図される。
活性化関数2934は、NPU126の出力133を生成するために累算器202の値217に適用される関数を指定する。上記で説明し、下記でより詳細に説明するように、活性化関数2934には、これらに限定されないが、シグモイド、ハイパーボリックタンジェント、ソフトプラス、正規化、指定された2の累乗による除算、有効な除算を達成するためのユーザ指定の逆数値による乗算、全累算器のパススルー、及び、下記で詳細に説明する基準サイズとしての累算器のパススルーが含まれる。一実施形態では、活性化関数は、NNU活性化関数命令によって指定される。或いは、活性化関数は、開始命令によって指定され、出力命令、例えば図4のアドレス4にあるAFU出力書き出し命令に応答して適用され、そのような実施形態では、図4のアドレス3の活性化関数命令は、出力命令に包含される。
逆数2942値は、累算器202の値217の除算を達成するために、累算器202の値217で乗算される値を指定する。すなわち、ユーザは、実際の所望される除数の逆数として、逆数2942値を指定する。これは、例えば、本明細書に記載されるように畳み込み演算及びプーリング演算に関連して有用である。好ましくは、下記で図29Cに関連してより詳細に説明するように、ユーザは、逆数2942値を2つの部分で指定する。一実施形態では、制御レジスタ127は、複数の組み込み除数値の1つによる除算をユーザが指定できるフィールド(図示せず)を含み、上記組み込み除数値は、一般に使用される畳み込みカーネルのサイズ、例えば9、25、36、又は49である。そのような実施形態では、AFU212は、累算器202の値217で乗算するために組み込み除数の逆数を記憶することができる。
シフト量2944は、2の累乗による除算を達成するために、AFU212のシフタが累算器202の値217を右にシフトするビット数を指定する。このこともまた、サイズが2の累乗である畳み込みカーネルに関連して有用である可能性がある。
出力RAM2952値は、データRAM122と重みRAM124のどちらが出力結果133を受け取るかを指定する。
出力2進小数点2954値は、出力結果133について2進小数点の場所を指示する。好ましくは、出力2進小数点2954は、出力結果133の2進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、出力2進小数点2954は、出力結果133の最下位ビットのうちいくつが小数ビットであるか、すなわち2進小数点の右にあるかを指示する。AFU212は、出力2進小数点2954の値に基づいて(並びに、大半の場合は、データ2進小数点2922、重み2進小数点2924、活性化関数2934、及び/又は構成2902の値に基づいて)、丸め、圧縮、飽和、及びサイズコンバージョンを行う。
出力コマンド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がソフトマックス活性化関数などの活性化関数を行えるようにするために有利である可能性がある。
図29A(及び図29B及び図29C)のフィールドは、制御レジスタ127に存在するものと記載されるが、他の実施形態では、それらのフィールドの1つ又は複数は、NNU121の他の部分に存在してもよい。好ましくは、フィールドの多くは、NNU命令自体に含められ、シーケンサ128によって復号されて、ALU204及び/又はAFU212を制御する(図34の)マイクロ操作3416を生成する。加えて、フィールドは、ALU204及び/又はAFU212メディアレジスタ118を制御するメディアレジスタ118に記憶される(図34の)マイクロ操作3414に含まれてもよい。そのような実施形態では、NNU初期化命令の使用が最小になり、他の実施形態では、NNU初期化命令が除去される。
上記のように、NNU命令は、メモリオペランド(例えば、データRAM122及び/若しくは重みRAM124にあるワード)、又は循環されたオペランド(例えば、mux−reg208/705にあるもの)へのALU演算を実行するよう指定することができる。一実施形態では、NNU命令はさらに、オペランドを、活性化関数のレジスタからの出力として指定することができる(例えば、図30のレジスタ3038の出力)。加えて、上記のように、NNU命令は、データRAM122又は重みRAM124の現在の行アドレスを増分するよう指定することができる。一実施形態では、NNU命令は、1以外の値による増分又は減分を達成するために現在の行に加算される即値符号付き整数差分値を指定することができる。
次いで図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は、暗黙的に決定されるのではなく、明示的に指定される。
次いで図29Cを参照すると、一実施形態による、2つの部分として記憶される図29Aの逆数2942の実施形態を図示するブロック図が示される。第1の部分2962は、ユーザが累算器202の値217で乗算することを望む真の逆数値の中の、抑制された先行ゼロの数2962を指示するシフト値である。先行ゼロの数は、2進小数点のすぐ右側にある連続したゼロの数である。第2の部分2694は、先行ゼロを抑制された逆数2964値、すなわち、すべての先行ゼロが除去された真の逆数値である。一実施形態では、抑制された先行ゼロの数2962は4ビットとして記憶され、先行ゼロを抑制された逆数2964値は、8ビットの符号なしの値として記憶される。
例による説明として、ユーザが、累算器202の値217を49の逆数で乗算したいと仮定する。13個の小数ビットで表された49の逆数の2進表現は、0.0000010100111であり、5個の先行ゼロがある。この場合、ユーザは、抑制された先行ゼロの数2962に5の値を入れ、先行ゼロを抑制された逆数2964に10100111の値を入れる。逆数乗算器の「除算器A」3014(図30の)が、累算器202の値217と、先行ゼロを抑制された逆数2964の値とを乗算した後、除算器Aは、得られた積を、抑制された先行ゼロの数2962だけ右シフトする。そのような実施形態は、有利に、逆数2942値を表すために使用されるビット数を比較的少なくして、高い精度を達成することができる。
次いで図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、を含む。
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とlog2Pとの和であり、Mは、乗算器242の整数積のビット幅であり(例えば、ナロー乗算器242では16ビット、又はワイド乗算器242では32ビット)、Pは、累算器202中に累算されることが可能な整数積の最大許容数である。好ましくは、積累算の最大数は、NNU121のプログラマへのプログラミングの仕様を介して指定される。一実施形態では、シーケンサ128は、データワード/重みワード206/207の行をデータRAM/重みRAM122/124からロードする、1つの前の積和命令(例えば、図4のアドレス1にある命令)を仮定して、積和NNU命令(例えば、図4のアドレス2にある命令)のカウントの最大値、例えば511を強制する。
有利な点として、許容される累算の最大数に対して最大精度値を累算するのに十分に大きいビット幅を持つ累算器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未満)になる可能性がある。
PFC3002は、累算器202の値217が負である場合には、値を正形式に変換し、元の値が正であったか又は負であったかを指示する付加ビットを生成し、そのビットは、値と共にAFU212のパイプラインで渡される。正形式に変換することで、AFU212による後の動作を簡略化する。例えば、それにより、正の値だけがtanh3022及びシグモイド3024モジュールに入力されることが可能になり、したがって、それらのモジュールを簡略化することができる。加えて、このことは、丸め器3004及び飽和器3008を簡略化する。
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に提供される結果を生成する。
丸め器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が、適正な出力サイズに変換するときに丸めを行い(下記で説明する)、これは、丸めの決定で使用された低次ビットを失うことを伴う場合もある。
CCS3008は、mux3006の出力値を基準サイズに圧縮する。したがって、例えば、NPU126がナロー構成又はじょうご構成2902である場合、CCS3008は、28ビットのmux3006の出力値を16ビットに圧縮し、NPU126がワイド構成2902である場合、CCS3008は、41ビットのmux3006の出力値を32ビットに圧縮する。ただし、基準サイズに圧縮する前に、事前に圧縮された値が、基準形式で表すことが可能な最大値よりも大きい場合、飽和器3008が、事前に圧縮された値を飽和させて、基準形式で表すことが可能な最大値にする。例えば、最上位の基準形式ビットの左側にある事前に圧縮された値のビットのいずれかが1の値を有する場合には、飽和器3008は、最大値に(例えば、すべて1に)飽和させる。
好ましくは、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に)飽和させる。
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進小数点を持つように位置合わせされる。
正規化器3018は、CCS及び飽和器3008の出力値の正規化バージョンを生成する。すなわち、CCS及び飽和器3008の出力値(その符号は上記のようにして渡される)が負である場合、正規化器3018はゼロの値を出力し、それ以外の場合、正規化器3018は自身の入力値を出力する。好ましくは、正規化器3018の出力は、基準形式であり、出力2進小数点2954値によって指定される2進小数点を有する。
逆数乗算器3014は、CCS及び飽和器3008の出力に、逆数値2942で指定されるユーザ指定の逆数値を乗算して基準サイズの積を生成し、これは、効果的に、CCS及び飽和器3008の出力と、逆数2942値の逆数である除数との商である。好ましくは、逆数乗算器3014の出力は、基準形式であり、出力2進小数点2954値によって指定される2進小数点を有する。
右シフタ3016は、CCS及び飽和器3008の出力を、シフト量の値2944で指定される、ユーザ指定のビット数だけシフトして、基準サイズの商を生成する。好ましくは、右シフタ3016の出力は、基準形式であり、出力2進小数点2954値によって指定される2進小数点を有する。
mux3032は、活性化関数2934値によって指定される適切な入力を選択し、選択したものを符号復元器3034に提供し、符号復元器3034は、元の累算器202の値217が負値であった場合、mux3032の正形式の出力を負形式に、例えば2の補数の形式に変換する。
サイズ変換器3036は、出力コマンド2956の値に基づいて、符号復元器3034の出力を適切なサイズに変換する。出力コマンド2956の値については、上記で図29Aに関連して説明している。好ましくは、符号復元器3034の出力は、出力2進小数点2954値によって指定される2進小数点を有する。好ましくは、出力コマンド2956の第1の所定の値について、サイズ変換器3036は、符号復元器3034の出力の上位半分のビットを破棄する。さらに、符号復元器3034の出力が正で、且つ構成2902で指定されるワードサイズで表すことが可能な最大値を超えているか、又は、負で、且つそのワードサイズで表すことが可能な最小値未満である場合、飽和器3036は、出力を、当該ワードサイズで表すことが可能なそれぞれの最大値又は最小値に飽和させる。第2及び第3の所定の値の場合、サイズ変換器3036は、符号復元器3034の出力をパススルーする。
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の上位ワードの上位ビットをパディングしてゼロにする。
次いで図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と示されている。
第1のデータワードと重みワードとの16ビットの積(累算器202の初期ゼロ値と共に累算されている)は、000000.1100001100と示されている。データ2進小数点2912が7であり、重み2進小数点2914が3であるため、示唆される累算器202の2進小数点は、2進小数点の右に10ビットがあるように配置される。ナロー構成の場合、累算器202は、この例示的実施形態では、28ビット幅である。この例では、すべてのALU演算(例えば、図20の1024回の積和すべて)が行われた後の累算器202の000000000000000001.1101010100という値217が示されている。
出力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)がゼロであったためである。
活性化関数2934は、この例ではシグモイド関数の使用を指示している。その結果、ビット選択器3012は、基準形式値のビットを選択し、そのため、上記のようにシグモイドモジュール3024への入力が3つの整数ビット及び4つの小数ビットを持つようになり、すなわち、示されるように001.1101の値となる。シグモイドモジュール3024は、示されるように、000000000.1101110の基準形式にされた値を出力する。
この例における出力コマンド2956は、第1の所定の値を指定し、すなわち構成2902によって指示されるワードサイズを出力することを指定し、この場合のワードサイズはナローワード(8ビット)である。その結果、サイズ変換器3036は、基準シグモイド出力値を、2進小数点の右側に7ビットがあるように配置された、示唆される2進小数点を持つ8ビット量に変換して、示されるように01101110の出力をもたらす。
次いで図32を参照すると、図30のAFU212の動作の第2の例が示される。図32の例は、活性化関数2934が累算器202の値217を基準サイズでパススルーすることを指示する場合のAFU212の動作を図示している。示されるように、構成2902は、NPU126のナロー構成に設定されている。
この例では、累算器202は28ビット幅であり、累算器202の2進小数点は、2進小数点の右側に10ビットがあるように配置される(この理由は、上記のように、一実施形態によれば、データ2進小数点2912と重み2進小数点2914との和が10であるためか、又は、代替実施形態によれば、累算器の2進小数点2923が10の値を持つように明示的に指定されるためか、のどちらかである)。この例では、図32は、すべてのALU演算が行われた後の累算器202の000001100000011011.1101111010という値217を示している。
この例では、出力2進小数点2954値は、出力の2進小数点が、2進小数点の右側に4ビットがあるように配置されることを指示している。したがって、OBPA3002及びCCS3008を通過した後、示されるように、累算器202の値217が飽和及び圧縮されて111111111111.1111の基準形式値にされ、これが、mux3032によって基準サイズのパススルー値3028として受け取られる。
この例では、2つの出力コマンド2956が示されている。第1の出力コマンド2956は、第2の所定の値を指定し、すなわち基準形式サイズの下位ワードを出力することを指定している。構成2902によって指示されるサイズはナローワード(8ビット)であり、これは16ビットの基準サイズを示唆することから、サイズ変換器3036は、示されるように、基準サイズのパススルー値3028の下位8ビットを選択して、11111111の8ビット値を生じる。第2の出力コマンド2956は、第3の所定の値を指定し、すなわち基準形式サイズの上位ワードを出力することを指定している。その結果、サイズ変換器3036は、示されるように、基準サイズのパススルー値3028の上位8ビットを選択して、11111111の8ビット値を生じる。
次いで図33を参照すると、図30のAFU212の動作の第3の例が示される。図33の例は、活性化関数2934が、未処理の累算器202の値217をすべてパススルーすることを指示する場合のAFU212の動作を図示している。示されるように、構成2902は、NPU126のワイド構成(例えば、16ビットの入力ワード)に設定されている。
この例では、累算器202は41ビット幅であり、累算器202の2進小数点は、2進小数点の右に8ビットがあるように配置されている(この理由は、上記のように、一実施形態によれば、データ2進小数点2912と重み2進小数点2914との和が8であるためか、又は代替実施形態によれば、累算器の2進小数点2923が8の値を持つように明示的に指定されるためか、のどちらかである)。この例では、図33は、すべてのALU演算が行われた後の累算器202の001000000000000000001100000011011.11011110という値217を示している。
この例では、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ビット値を選択することを示している。
上述のように、有利な点として、NNU121は、浮動小数点データではなく、整数データに演算する。これには、各NPU126、又は少なくともALU204部分を簡略化するという利点がある。例えば、ALU204は、浮動小数点実装であれば乗算器242について被乗数の指数を加算するために必要とされるであろう加算器を、含む必要がない。同様に、ALU204は、浮動小数点実装であれば加算器234について加数の2進小数点を位置合わせするために必要とされるであろうシフタを、含む必要がない。当業者が理解するように、浮動小数点ユニットは一般に非常に複雑である。そのため、上記はALU204の簡略化の例に過ぎず、関連する2進小数点をユーザが指定できるようにするハードウェアの固定小数点支援を用いるこの整数実施形態によって、他の簡略化が享受される。ALU204が整数ユニットであることの結果、有利な点として、浮動小数点の実施形態に比べてNPU126がより小さく(且つより高速に)なる可能性があり、それにより、さらに、有利な点として、NPU126の大きなアレイをNNU121に組み込むことが容易になる。AFU212部分は、好ましくは、累算値中で望まれるユーザ指定の小数ビットの数と、出力値中で望まれる小数ビットの数とに基づいて、累算器202の値217のスケーリング及び飽和を扱う。有利な点として、AFU212の固定小数点ハードウェア支援の追加的な複雑性と、それに伴うサイズ、電力消費、及び/又は時間の増大は、生じた場合には、例えば図11の実施形態に関連して説明するように、AFU212をALU204部分間で共有することによって償却される可能性がある。これは、AFU1112の数は、共有実施形態では減らすことができるためである。
有利な点として、本明細書に記載される実施形態は、浮動小数点の算術ユニットと比べて、ハードウェアの整数算術ユニットの複雑性が低減することに伴う利益の多くを享受することができ、一方で、小数、すなわち2進小数点を持つ数に対する算術演算を依然として提供する。浮動小数点算術の利点は、個々の値が非常に広い値の範囲(効果的に、非常に大きい可能性のある指数範囲のサイズによってのみ制限される)内のいずれかの値であり得るデータへの算術演算に対応できることである。すなわち、各浮動小数点数は、その独自の、可能性として固有の指数値を有する。ただし、本明細書に記載される実施形態は、入力データが高度に並列化されており、それらの値が比較的狭い範囲内にあって、すべての並列化された値の「指数」が同じである場合がある特定の応用例が存在する、という事実を認識し、活用する。したがって、そのような実施形態は、ユーザが、すべての入力値及び/又は累算値に対して2進小数点の場所を一回指定することを可能にする。同様に、そのような実施形態は、並列化された出力の類似する範囲特性を認識及び活用して、ユーザが、すべての出力値に対して2進小数点の場所を一回指定することを可能にする。人工ニューラルネットワークはそのような応用例の一例であるが、それらの実施形態を用いて他の応用例のための計算を行うことができる。個々の各入力数に対してではなく、入力に対して2進小数点の場所を一回指定することにより、それらの実施形態は、浮動小数点実装と比べてメモリ空間のより効率的な使用をもたらし(例えば、必要とするメモリの減少)、且つ/又は、ほぼ同じ量のメモリに対して精度の向上をもたらす。これは、浮動小数点実装であれば指数に使用されることになるビットが、より高い大きさの精度を指定するために使用できるためである。
さらに有利な点として、上記実施形態は、整数演算の大きな連続の累算中に経験し得る潜在的な精度の低下(例えば、より低い有意性(significance)の小数ビットのオーバーフロー又は損失)を認識し、主として、精度の低下を回避するのに十分に大きい累算器の形で解決法を提供する。
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として選択する。
mux3402へのマイクロ操作ソースの1つは、図1のシーケンサ128である。シーケンサ128は、プログラムメモリ129から受け取られたNNU命令を復号し、それに応答して、mux3402の第1の入力に提供されるマイクロ操作3416を生成する。
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のリセットである。
mux3402への第3のマイクロ操作ソースは、メディアレジスタ118自体である。好ましくは、上記で図14に関連して説明したように、MTNN命令1400は、メディアレジスタ118からmux3402の第3の入力に提供されるマイクロ操作3414を直接実行するようにNNU121に命令する関数を指定することができる。アーキテクチャメディアレジスタ118から提供されるマイクロ操作3414の直接の実行は、検査、例えばNNU121の組み込み自己テスト(BIST)やデバッグに特に有用である可能性がある。
好ましくは、復号器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値を生成する。
可変レートのニューラルネットワークユニット
NNU121がプログラムを稼働させ、その後、次のプログラムを稼働できるようになる前、NNU121が必要とする何らかのことをプロセッサ100が行うのを待って、アイドル状態になる状況があり得る。例えば、図3〜図6Aに関連して記載した状況と似た、NNU121が、積和活性化関数プログラム(フィードフォワードニューラルネットワーク層プログラムと呼ばれる場合もある)の2つ以上の連続したインスタンスを稼働させる状況を仮定する。プロセッサ100が、NNUプログラムの次の稼働で使用されることになる512KB分の重み値を重みRAM124に書き込むには、NNU121がそのプログラムを稼働させるためにかかる時間よりも、大幅に長い時間がかかる可能性がある。別の表現をすると、NNU121はプログラムを比較的短い時間量で稼働させ、その後、プロセッサ100がそのプログラムの次の稼働のために次の重み値を重みRAM124に書き込み終える間、アイドル状態になる可能性がある。この状況を図36Aに視覚的に図示しており、これについては下記でより詳細に説明する。そのような状況では、NNU121をより遅いレートで稼働させ、より長い時間をかけてプログラムを実行し、それにより、NNU121がプログラムを稼働させるために必要とされるエネルギー消費をより長い時間にわたって分散させると有利である可能性があり、そのようにすると、一般に、NNU121及び恐らくはプロセッサ100の温度をより低く保つ傾向がある可能性がある。この状況を緩和モードと呼び、図36Bに視覚的に図示している。これについては下記でより詳細に説明する。
次いで図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のマイクロコードを含む。
クロック生成論理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を再生成及び/又は昇圧する、独自の部分クロックツリーをさらに含むことが可能である。
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を受け取るパイプラインステージングレジスタを含んでいる。
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を生成させることができる。
一実施形態では、クロック低減論理3504は、基本クロック信号3506−7を緩和インディケータ3512の値で割るクロック分周回路を備える。一実施形態では、クロック低減論理3504は、基本クロック信号3506−7を、基本クロック信号3506−7のN回のサイクルごとに一回だけ真になるイネーブル信号でゲートするクロックゲート(例えば、ANDゲート)を備える。例えば、Nまでカウントするカウンタを含んだ回路が使用されて、イネーブル信号を生成することができる。付随する論理が、カウンタの出力がNと一致することを検出すると、その論理は、副クロック信号3508に真のパルスを生成し、カウンタをリセットする。好ましくは、緩和インディケータ3512の値は、図14のMTNN1400命令などのアーキテクチャ命令によってプログラム可能である。好ましくは、図37に関してより詳細に説明するように、プロセッサ100で稼働しているアーキテクチャプログラムが、NNUプログラムの稼働を開始するようにNNU121に命令する直前に、緩和値を緩和インディケータ3512にプログラムする。
重み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によっての双方で、同時的なやり方でアクセス可能である。
同様に、データ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によっての双方で、同時的なやり方でアクセス可能である。
好ましくは、インターフェース論理3514は、基本クロックドメインと副クロックドメインとの間の同期をもたらすために、データRAM122及び/又は重みRAM124がシングルポートであるか又はデュアルポートであるかに関係なく、データRAMバッファ3522及び重みRAMバッファ3524を含む。好ましくは、データRAM122、重みRAM124、及びプログラムメモリ129の各々は、それぞれの読み出しイネーブル信号、書き込みイネーブル信号、及びメモリ選択信号を含む静的RAM(SRAM)を含む。
上記のように、NNU121は、プロセッサ100の実行ユニットである。実行ユニットは、図1のアーキテクチャ命令103が翻訳されたマイクロ命令105など、アーキテクチャ命令が翻訳されたマイクロ命令を実行するか、又はアーキテクチャ命令103自体を実行する、プロセッサの機能ユニットである。実行ユニットは、GPR116やメディアレジスタ118など、プロセッサの汎用レジスタからオペランドを受け取る。実行ユニットは、マイクロ命令又はアーキテクチャ命令を実行するのに応答して、汎用レジスタに書き込まれ得る結果を生成することができる。アーキテクチャ命令103の例は、それぞれ図14及び図15に関連して説明した、MTNN命令1400及びMFNN命令1500である。マイクロ命令は、アーキテクチャ命令を実装する。より具体的には、アーキテクチャ命令が翻訳された1つ又は複数のマイクロ命令の実行ユニットによる集合的な実行は、そのアーキテクチャ命令で指定される入力に、アーキテクチャ命令で指定される演算を行って、アーキテクチャ命令によって定義される結果を作り出す。
次いで図36Aを参照すると、NNU121が通常モード、すなわち基本クロックレートで動作している、プロセッサ100の動作の例を図示するタイミング図が示される。時間は、タイミング図中の左から右へと進行する。プロセッサ100は、アーキテクチャプログラムを基本クロックレートで稼働させている。より具体的には、プロセッサ100のフロントエンド(例えば、命令取出しユニット101、命令キャッシュ102、命令トランスレータ104、リネームユニット106、リザベーションステーション108)が、基本クロックレートで、アーキテクチャ命令を取り出し、復号し、NNU121及び他の実行ユニット112に発行する。
最初、アーキテクチャプログラムは、フロントエンド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を含む。
図36Aの例に示されるように、NNU121は、アーキテクチャプログラムがデータRAM122及び重みRAM124の書き込み/読み出しを終えるために要するよりも大幅に少ない時間(例えば、その時間の4分の1)で、NNUプログラムの稼働を終了する。例えば、NNU121は、NNUプログラムを稼働させるのに約1000クロックサイクルを要する可能性があるのに対して、アーキテクチャプログラムは、稼働に約4000クロックサイクルを要し、両方とも基本クロックレートである。その結果、NNU121は、その時間の残りはアイドル状態になり、これはこの例では大幅に長い時間であり、例えば、約3000基本クロックレートサイクルである。図36Aの例に示されるように、このパターンはもう1回継続し、また、ニューラルネットワークのサイズ及び構成に依存して、もう数回継続する可能性がある。NNU121は、プロセッサ100のうち比較的大きくトランジスタ密度が高い機能ユニットである可能性があるため、特に基本クロックレートで稼働している時に、著しい量の熱を発生する可能性がある。
次いで図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の割合になり、これは、本明細書に記載されるように熱に関する利益を有する可能性がある。
次いで図37を参照すると、図35のプロセッサ100の動作を図示するフローチャートが示される。このフローチャートは、多くの点で、上記で図35、図36A、及び図36Bに関連して説明した動作に似ている動作を図示している。フローはブロック3702で開始する。
ブロック3702で、プロセッサ100が、MTNN命令1400を実行して、重みRAM124に重みを書き込み、データRAM122にデータを書き込む。フローはブロック3704に進む。
ブロック3704で、プロセッサ100が、MTNN命令1400を実行して、緩和インディケータ3512に、基本クロックレートよりも低いレートを指定する値をプログラムし、すなわちNNU121を緩和モードにする。フローはブロック3706に進む。
ブロック3706で、プロセッサ100は、MTNN命令1400を実行して、NNU121に、図36Bに視覚化されたのと同様にしてNNUプログラムの稼働を開始するように命令する。フローはブロック3708に進む。
ブロック3708で、NNU121が、NNUプログラムの稼働を開始する。並行して、プロセッサ100は、MTNN命令1400を実行して、重みRAM124に新しい重みを書き込み(且つ、場合によってはデータRAM122に新しいデータを書き込み)、且つ/又はMFNN命令1500を実行して、データRAM122から(及び場合によっては重みRAM124から)結果を読み出す。フローはブロック3712に進む。
ブロック3712で、プロセッサ100は、MFNN命令1500(例えば、状態レジスタ127の読み出し)を実行して、NNU121がそのプログラムの稼働を終えたことを検出する。アーキテクチャプログラムが緩和インディケータ3512の適切な値を選択したと仮定すると、図36Bに視覚化されるように、NNU121がNNUプログラムを実行するには、プロセッサ100が重みRAM124及び/又はデータRAM122にアクセスするアーキテクチャプログラムの部分を実行するためにかかる時間量とおよそ同じ時間量を要するはずである。フローはブロック3714に進む。
ブロック3714で、プロセッサ100は、MTNN命令1400を実行して、緩和インディケータ3512に、基本クロックレートを指定する値をプログラムし、すなわちNNU12を通常モードにする。フローはブロック3716に進む。
ブロック3716で、プロセッサ100は、MTNN命令1400を実行して、NNU121に、図36Aに視覚化されたのと同様にしてNNUプログラムの稼働を開始するように命令する。フローはブロック3718に進む。
ブロック3718で、NNU121は、NNUプログラムを通常モードで稼働させ始める。フローはブロック3718で終了する。
上記のように、NNUプログラムを緩和モードで稼働させると、NNUがプログラムを稼働させる時間が、NNUがプログラムを通常モードで(すなわち、プロセッサの基本クロックレートで)稼働させる時間と比べて延び、これは熱に関する利益をもたらす可能性がある。より具体的には、デバイス(例えば、トランジスタ、キャパシタ、配線)は、NNUがプログラムを緩和モードで稼働させている間は、より低い温度で動作する可能性が高い。これは、NNUが、NNU(例えば、半導体素子、金属層、下にある基板)並びに周辺パッケージ及び冷却対策(例えば、ヒートシンク、ファン)によって放散される熱を発生させるレートがよりゆっくりになるためである。これにより、一般には、プロセッサダイの他の部分にあるデバイスの温度も下げることができる。デバイスの動作温度、特にデバイスの接合部の温度の低下は、漏洩電流の減少という利益も有する可能性がある。さらに、単位時間当たりに消費される電流の量が減るため、誘導雑音及びIR低下雑音を低減させることができる。さらには、より低い温度は、プロセッサのMOSFETの負バイアス温度不安定性(NBTI)及び正バイアス温度不安定性(PBTI)に好影響を与える可能性があり、それにより、デバイス及びその結果プロセッサ部分の信頼性及び/又は寿命を向上させる。温度の低下は、プロセッサの金属層におけるジュール加熱及びエレクトロマイグレーションも低減することができる。
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プログラムの間の共有リソースへのアクセスのフローを制御する、高性能の解決法を提供する実施形態が上記及び下記に記載される。
NNUプログラムが非アーキテクチャプログラムとも呼ばれ、NNU命令が非アーキテクチャ命令とも呼ばれ、NNU命令セット(上記ではNPU命令セットとも呼んでいる)が非アーキテクチャ命令セットとも呼ばれる実施形態が記載される。非アーキテクチャ命令セットは、アーキテクチャ命令セットとは別のものである。プロセッサ100がアーキテクチャ命令をマイクロ命令に翻訳する命令トランスレータ104を含んでいる実施形態では、非アーキテクチャ命令セットは、マイクロ命令セットとも別のものである。
次いで図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のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。
シーケンサ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つのループカウンタのうちどれが当該ループ命令に使用されるかを指示する。
シーケンサ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のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。
次いで図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に)返す。
前述から観察できるように、図39の状態レジスタ127のフィールドの値は、NNU121によって実行されている間の非アーキテクチャプログラムの進捗を指示する情報と特徴づけることができる。非アーキテクチャプログラムの進捗の特定の態様について上記で説明したが、それらは、プログラムカウンタ3802値、ループカウンタ3804値、反復カウンタ3806値、重みRAM124のアドレス125のうち一番最近書き込まれた/読み出されたアドレス2602/2604、及びデータRAM122のアドレス123のうち一番最近書き込まれた/読み出されたアドレス2606/2608などである。プロセッサ100で実行されているアーキテクチャプログラムは、図39の非アーキテクチャプログラムの進捗値を状態レジスタ127から読み出し、その情報を使用して、例えば比較及び分岐命令などのアーキテクチャ命令によって決定を行うことができる。例えば、アーキテクチャプログラムは、データ/重みをデータRAM122及び/又は重みRAM124に書き込む行、又は読み出す行を決定して、特に大きなデータセットについて及び/又は異なる非アーキテクチャプログラムの重なった実行インスタンスについて、データRAM122又は重みRAM124に出入りするデータのフローを制御する。アーキテクチャプログラムによってなされる決定の例については、上記及び下記で説明している。
例えば、上記で図26Aに関連して説明したように、アーキテクチャプログラムは、畳み込みの結果を畳み込みカーネル2402より上の(例えば、行8より上)データRAM122の行に書き戻すように非アーキテクチャプログラムを構成し、アーキテクチャプログラムは、NNU121が結果を書き込むと、一番最近書き込まれたデータRAM122の行2606のアドレスを使用して、その結果をデータRAM122から読み出す。
別の例として、上記で図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チャンクを処理することができる。
別の例として、アーキテクチャプログラムが、重みが重みRAM124に記憶され、結果がデータRAM122に書き戻される一続きの典型的なニューラルネットワーク積和活性化関数演算を、NNU121に行わせていると仮定する。その場合、非アーキテクチャプログラムが重みRAM124のある行を読み出すと、そのプログラムはその行を再び読み出すことはない。そのため、アーキテクチャプログラムは、現在の重みが非アーキテクチャプログラムによって読み出される/使用されると、重みRAM124にある重みを、非アーキテクチャプログラムの次の実行インスタンスのための(例えば、次のニューラルネットワーク層に関する)新しい重みで上書きし始めるように構成することができる。その場合、アーキテクチャプログラムは、状態レジスタ127を読み出して、一番最近読み出された重みRAM行2604のアドレスを取得して、新しい重みのセットを重みRAM124内でどこに書き込めるかを決定する。
別の例として、アーキテクチャプログラムが、非アーキテクチャプログラムの中に、図20のアドレス2の非アーキテクチャ積和命令など、大きな反復回数を有する実行命令が含まれていることを知っていると仮定する。そのような場合、アーキテクチャプログラムは、その非アーキテクチャ命令を完了するのにあと約何回のクロックサイクルを要するかを知って、アーキテクチャプログラムが2つ以上の動作のどちらを行うかを決定できるようにするために、反復カウント3916を知る必要がある可能性がある。例えば、アーキテクチャプログラムは、その時間が長い場合は、オペレーティングシステムなどの別のアーキテクチャプログラムに制御を引き渡すことがある。同様に、アーキテクチャプログラムが、図28の非アーキテクチャプログラムなど、非アーキテクチャプログラムの中に比較的大きいループ回数を持つループ本体が含まれることを知っていると仮定する。そのような場合、アーキテクチャプログラムは、その非アーキテクチャプログラムを完了するのにあと約何回のクロックサイクルを要するかを知って、アーキテクチャプログラムが2つ以上の動作のどちらを行うかを決定できるようにするために、ループカウント3914を知る必要がある可能性がある。
別の例として、アーキテクチャプログラムNNU121が、プーリング対象のデータが重みRAM124に記憶され、結果が重みRAM124に書き戻される、図27及び図28に関連して説明したのと同様のプーリング演算をNNU121に行わせていると仮定する。ただし、図27及び図28の例とは異なり、結果が重みRAM124の先頭の400行、例えば、行1600から1999に書き戻されると仮定する。この場合、非アーキテクチャプログラムが、自身がプールする重みRAM124の4つの行を読み出すと、その非アーキテクチャプログラムはその行を再び読み出すことはない。そのため、アーキテクチャプログラムは、現在の4つの行が非アーキテクチャプログラムによって読み出される/使用されると、重みRAM124にあるデータを、新しいデータ(例えば、プーリングされたデータに典型的な積和活性化関数演算を行うための、例えば、非アーキテクチャプログラムの次の実行インスタンスのための重み)で上書きし始めるように構成することができる。その場合、アーキテクチャプログラムは、状態レジスタ127を読み出して、一番最近読み出された重みRAM行2604のアドレスを取得して、新しい重みのセットを重みRAM124内でどこに書き込めるかを決定する。
NNUメモリ及びキャッシュメモリとしてのメモリアレイのデュアル使用
次に図40を参照すると、プロセッサ4000を図示するブロック図が示される。プロセッサ4000は、双方向の方式で互いに接続された複数のリングストップ4004を含んで、リングバス4024を形成している。図40の実施形態は、6つのリングストップを含み、4004−0、4004−1、4004−2、4004−3、4004−M、及び4004−Uと表される。プロセッサ4000は、4つのコア複合体(core complexes)4012を含み、個々にコア複合体0 4012−0、コア複合体1 4012−1、コア複合体2 4012−2、及びコア複合体3 4012−3と呼ばれ、これらは、コア複合体4012をリングバス4024に結合する4つのリングストップ4004−0、4004−1、4004−2、及び4004−3をそれぞれ含む。プロセッサ4000は、アンコア部分4016をさらに含み、アンコア部分4016は、アンコア4016をリングバス4024に結合するリングストップ4004−Uを含む。最後、プロセッサ400は、リングストップ4004−Mによりリングバス4024に結合されたダイナミックランダムアクセスメモリ(DRAM)コントローラ4018及びNNU121を含む。NNU121は、メモリアレイ4152を含み(図41を参照)、メモリアレイ4152は、NNU121のNPU126のアレイにより使用されるメモリ(例えば、図1の重みRAM124)としてか、又は、コア複合体4012により共有されるキャッシュメモリとして、例えばビクティムキャッシュ(victim cache)若しくはラストレベルキャッシュ(LLC)のスライスとしてかのいずれかで用いられることができ、このことは下記でより詳細に説明される。図40の例は4つのコア複合体4012を含むが、異なる数のコア複合体4012を用いた他の実施形態が企図される。
アンコア4016は、バスコントローラ4014を含み、バスコントローラ4014は、周辺デバイスが結合され得るシステムバス4022に対してのプロセッサ4000によるアクセスを制御し、周辺デバイスは、例えば、ビデオコントローラ、ディスクコントローラ、ペリフェラルバスコントローラ(例えば、PCI−E)等である。一実施形態では、システムバス4022は、良く知られるV4バスである。アンコア4016は、他の機能ユニット、例えば、電力管理ユニット及びプライベートRAM(例えば、コア4002のマイクロコードにより使用される非アーキテクチャメモリ)などをさらに含んでもよい。
DRAMコントローラは、システムメモリであるDRAM(例えば、非同期DRAM、又は同期DRAM(SDRAM)、例えば、ダブルデータレート同期DRAM、ダイレクトRambus DRAM、又はレイテンシ低減DRAMなど)を制御する。コア複合体4012、アンコア4016、及びNNU121が、リングバス4024を介してシステムメモリにアクセスする。より詳細には、NNU121はリングバス4024を介して、ニューラルネットワーク重み及びデータをシステムメモリからメモリアレイ4152に読み出し、ニューラルネットワーク結果をメモリアレイ4152からシステムメモリに書き込む。さらに、ビクティムキャッシュとして動作するとき(図41の4006−4を参照)、メモリアレイ4152は、キャッシュ制御論理4108の制御下で(図41を参照)、キャッシュラインをシステムメモリに追い出す(evicts)。さらに、LLCスライスとして動作するとき(図41の4006−4を参照)、メモリアレイ4152及びキャッシュ制御論理4108は、システムメモリからキャッシュラインをフィルし(fill)、キャッシュラインをシステムメモリに書き戻し、追い出す。
4つのコア複合体4012は、それぞれのLLCスライス4012−0、4012−1、4012−2、及び4012−3を含み、LLCスライスの各々がリングストップ4004に結合され、LLCスライスは個々に総称的にLLCスライス4006と呼ばれ、集合的にLLCスライス4006と呼ばれる。各コア4002は、キャッシュメモリ、例えば、リングストップ4004に結合されたレベル2(L2)キャッシュ4008などを含む。各コア4002は、レベル1キャッシュ(図示せず)をさらに含んでもよい。一実施形態では、コア4002はx86命令セットアーキテクチャ(ISA)コアであるが、コア4002が別のISAのもの、例えば、ARM、SPARC、MIPSのものである他の実施形態が企図される。
LLCスライス4006−0、4006−1、4006−2、及び4006−3は、図40に示されるとおり、コア複合体4012により共有されるプロセッサ4000のLLC4005を集合的に形成する。各LLCスライス4006は、図41のメモリアレイ4152及びキャッシュ制御論理4108と同様のメモリアレイ及びキャッシュ制御論理を含む。NNU121のメモリアレイ4152がLLC4005の追加的な(例えば、第5の又は第9の)スライス4006−4として動作するように、モードインディケータ(例えば、図41のモード入力4199)が設定されることができ、このことは下記でより詳細に説明される。追加的なLLCスライス4006−4を選択的に作り上げるメモリアレイ4152(及び、図41のキャッシュ制御論理4108)は、NNU LLCスライス4006−4とさらに呼ばれる。一実施形態では、メモリアレイ4152及び各LLCスライス4006は2MBのメモリアレイからなるが、異なるサイズを用いた他の実施形態が企図される。さらに、メモリアレイ4152のサイズとLLCスライス4006のサイズとが異なる実施形態が企図される。好ましくは、LLC4005は、L2キャッシュ4008と、キャッシュ階層内の任意の他のキャッシュ(例えば、L1キャッシュ)とについてインクルーシブで(inclusive of)ある。
リングバス4024、又はリング4024は、スケーラブルな双方向のインターコネクトであり、DRAMコントローラ4018とアンコア4016とLLCスライス4006とを含むコヒーレントなコンポーネント間における通信を容易にする。リング4024は2つの単方向リングを含み、該リングの各々が5つのサブリング(sub-rings)をさらに含み、すなわち、ロードを含む大抵のタイプの要求パケットを移送するためのRequestと、スヌープ要求パケットを移送するためのSnoopと、応答パケットを移送するためのAcknowledgeと、データパケット及び書き込みを含む特定の要求アイテムを移送するためのDataと、リモートのキュー内のクレジットを放出し及び取得するためのCreditである。リング4024に取り付けられる各ノードは、リングストップ4004を介して接続され、リングストップ4004は、リング4024上でパケットを送信し及び受信するためのキューを含む。キューは、リング4024上で、取り付けられたコンポーネントの代わりに、リモートのキュー内で受信されることになる要求を開始する出口キューか、又は、リング4024からの、取り付けられたコンポーネントに転送されることになる要求を受信する入口キューかのいずれかである。出口キューは、リング上で要求を開始する前、リモートの宛先入口キューからのCreditリング上のクレジットを最初取得する。このことは、リモートの入口キューが要求の到着においてその要求を処理するのに利用可能なリソースを有することを確保する。出口キューは、リング4024上でトランザクションパケットを送りたいとき、リモートノードへ最終的に仕向けられた到来パケットに優先し(preempt)ない場合に限りそのようにすることができる。到来パケットがいずれかの方向からリングストップ4004に到着するとき、そのパケットの宛先IDが調査されて、このリングストップ4004がパケットの最終的な宛先であるかを決定する。宛先IDがリングストップ4004のノードIDに等しくない場合、パケットは後のクロックにおいて次のリングストップ4004に継続する。そうでない場合、パケットは同じクロック内でリング4024を去って、パケットのトランザクションタイプにより暗に示されるいずれかの入口キューによって消費されることになる。
一般に、LLC4005はN個のLLCスライス4006を含み、N個のスライス4006の各々は、ハッシングアルゴリズム、又はハッシュアルゴリズム、又は簡素にハッシュによって決定されるプロセッサ4000の物理アドレス空間のうち区別可能な約1/Nをキャッシュすることについて責任を負う。ハッシュは、入力として物理アドレスをとり、この物理アドレスをキャッシュすることについて責任を負う適切なLLCスライスを選択する関数である。コア4002又はスヌーピングエージェントのいずれかから、LLC4005に対して要求が行われなければならないとき、この要求は、要求の物理アドレスをキャッシュすることについて責任を負う適切なLLCスライス4006に送られなければならない。適切なLLCスライス4006は、要求の物理アドレスにハッシュを適用することによって決定される。
ハッシュアルゴリズムは全射的関数(surjective function)であり、そのドメインは、物理アドレスのセット又はそのサブセットであり、その範囲は、現在含まれるLLCスライス4006の数である。より詳細には、範囲は、LLCスライス4006の索引のセットであり、例えば、8個のLLCスライス4006の場合には0〜7である。上記関数は、物理アドレスビットの適切なサブセットを調べることによって計算されることができる。例えば、8個のLLCスライス4006を有するシステムにおいて、ハッシングアルゴリズムの出力は単純にPA[10:8]であってもよく、これは、物理アドレスビットのうちの3ビット、すなわちビット8〜10である。LLCスライス4006の数が8である別の実施形態において、ハッシュの出力は、他のアドレスビット、例えば、{PA[17],PA[14],PA[12]^PA[10]^PA[9]}として生成される3ビットの論理関数である。
LLC4005のすべての要求元は、いかなるLLC4005キャッシングも行われる前に、同じハッシュアルゴリズムを有さなければならない。ハッシュが、アドレスがどこにキャッシュされるかと動作中にスヌープがどこに送られることになるかとを指示するため、ハッシュは、すべてのコア4002とLLCスライス4006とスヌーピングエージェントとの間における協調をとおしてのみ変更される。下記で図42及び図43を参照してより詳細に説明されるとおり、ハッシュアルゴリズムを更新することは本質的に下記を含む:(1)すべてのコア4002を同期させて新しいキャッシュ可能アクセスを防止すること、(2)LLC4005に現在含まれるすべてのLLCスライス4006のライトバック無効化(write-back-invalidate)を行い、それにより、変更を加えられた(modified)キャッシュラインがシステムメモリに書き戻され、すべてのキャッシュラインが無効にされるようにすること(ライトバック無効化は、下記に説明される選択的なライトバック無効化であってもよく、その場合、新しいハッシュアルゴリズムが古いハッシュアルゴリズムとは異なるスライスに対してそのアドレスをハッシュすることになるキャッシュラインだけが追い出され、すなわち無効にされ、変更を加えられている場合は、無効にされる前に書き戻される)、(3)ハッシュ更新メッセージを各コア4002及びスヌープソースにブロードキャストし、これにより、新しいハッシュに(下記で説明されるとおり、インクルーシブハッシュ(inclusive hash)からエクスクルーシブハッシュ(exclusive hash)へか、又はその逆かのいずれか)変更するように各コア4002及びスヌープソースに命じること、(4)メモリアレイ4152に対するアクセスを制御する選択論理4158(図41を参照)へのモード入力4199を更新すること、及び(5)新しいハッシュアルゴリズムで実行を再開すること。
上記で説明されたハッシュアルゴリズムは、LLCスライス4006の数Nが、2の累乗である8であるときに有用であり、上記アルゴリズムは、他の2の累乗に容易に対応するように変更を加えられることができ、例えば、4つのスライスについてPA[9:8]、又は16個のスライスについてPA[11:8]である。しかしながら、NNU LLCスライス4006−4がLLC4005に含まれるかどうか(及び、コア複合体4012の数)に依存して、Nは2の累乗である場合も又はそうでない場合もある。ゆえに、下記で図42及び図43を参照して説明されるとおり、LLCスライス4006の数に依存して、少なくとも2つの異なるハッシュが使用される。すなわち、インクルーシブハッシュと呼ばれる第1のハッシュが、NNU LLCスライス4006−4がLLC4005に含まれるときに使用され、エクスクルーシブハッシュと呼ばれる第2のハッシュが、NNU LLCスライス4006−4がLLC4005から除外されるときに使用される。
あるハッシュアルゴリズムは、PA[45:6] mod Nを出力する。このハッシュは、Nの値が2の累乗でないときでさえ、(物理アドレスの比較的均一な分散を仮定して)N個のLLCスライス4006にわたり本質的に均衡のとれたやり方で物理アドレスを分散させる(distributing)という利点を有する。Nが2の累乗であるとき、上記mod演算は、PA[45:6]の下位N−1ビットを単に出力することによって行うことができる。しかしながら、Nが2の累乗でないとき、このmod演算は不利なことに整数除算を必要とする。
PA mod Nのハッシュを近似し、しかし物理アドレスのより小さいサブセットのための別のハッシュが、Nが2の累乗でないときにハードウェア内により効率的に実装されることができ、N=9の場合、
def calc_hash(PA):
if (PA[11:8] == 0xF)
return 8
else
return PA[10:8]
として定義される。
calc_hash()では、ハッシュに対してPA[11:8]が使用され、しかしPA[11:8]>8の場合、PA[10:8]が使用され、これは、範囲[0,7]内であることを保証される。観察できるように、calc_hash()は、(物理アドレスの比較的均一な分散を再度仮定して)PA[45:6] mod Nよりも比較的あまり均衡のとれないやり方でLLCスライス4006間で物理アドレスを分散させ得る。すなわち、スライス0〜6は約8分の1の確率を有し、これに対し、スライス7及び8は、約16分の1の確率を有する。しかしながら、PA[45:6] mod Nのハッシュアルゴリズムでさえ、完全に均一に均衡のとれた分散を生成しないことが留意されるべきであり、なぜならば、PA[45:6]は2の累乗である要素数を有するドメインを表現し、しかしNは2の累乗でないからである。
一般に、Nが2の累乗でないとき、ハッシュアルゴリズムは、2^Pのとり得る結果の範囲に対して物理アドレスを最初ハッシュし、ここでP=ceiling(log2(N))であり、それから、Nより大きいか又は等しい最初のハッシュの結果(すなわち、既存のスライス4006に対応しない結果)を、Nより小さい出力に(すなわち、既存のスライス4006に)マッピングする。
ハードウェアに比較的効率良く実装される別のハッシュアルゴリズムが、
def calc_hash_2(PA):
if (PA[13:11] == 0x7)
return 8
else
return PA[10:8]
として定義される。
Calc_hash_2()は、(物理アドレスの比較的均一な分散を再度仮定して)calc_hash()よりも比較的より均衡のとれたやり方でLLCスライス4006間で物理アドレスを分散させ得る。すなわち、スライス0〜7は約7/64の確率を有し、これに対し、スライス8は約8/64、すなわち1/8の確率を有する。他の実施形態において、calc_hash()及びcalc_hash_2()のアルゴリズムは、さらに多数の物理アドレスビットを使用することによってさらに比較的より均衡のとれたやり方で物理アドレスを分散させるように変更を加えられてもよい。
上述のとおり、有利なことに実施形態は2つの異なるハッシュアルゴリズムを採用する。1つは、LLCスライス4006としてメモリアレイ4152を除外し、1つは、LLCスライス4006としてメモリアレイ4152を含む。例えば、コア複合体4012とその対応するLLCスライス4006との数が8であるプロセッサ4000において、メモリアレイ4152を除外するハッシュがPA[10:8]であってもよく、メモリアレイ4152を含むハッシュが上述のcalc_hash_2(PA)であってもよく、このハッシュは9つの異なるスライスにマッピングする。一実施形態では、2つのハッシュアルゴリズムは、最適化として選択的である、すなわち、インクルーシブ及びエクスクルーシブハッシュアルゴリズムが異なるスライスに対してハッシュすることになるキャッシュラインのみ追い出す(すなわち、ライトバック無効にする(write-back-invalidates))ライトバック無効化をサポートするように有利に設計されることができる。いくつかの実施形態では、インクルーシブハッシュからエクスクルーシブハッシュへの移行において、上記のことは、NNU LLCスライス4006−4のみがライトバック無効にされることを要し(すなわち、非NNU LLCスライス4006は、ライトバック無効にされる必要がない)、エクスクルーシブハッシュからインクルーシブハッシュへの移行においては、インクルーシブ及びエクスクルーシブハッシュアルゴリズムが異なるスライスに対してそのアドレスをハッシュすることになる非NNU LLCスライス4006のキャッシュラインのみが、追い出される必要がある。このことは下記で図42及び図43を参照してより詳細に説明される。エクスクルーシブハッシュがPA[10:8]又は同様のものであり、インクルーシブハッシュがcalc_hash_2又は同様のものである実施形態が、そのような一実施形態である。
次に図41を参照すると、より詳細な図40のNNU121と図40のリングストップ4004−Mとを例示するブロック図が示される。図41のNNU121は、多くの点で上述のNNU121の実施形態と同様であるが、キャッシュ制御論理4108、選択論理4158、及びメモリアレイ4152をさらに含み、これらは、NNU121の重みRAM124又はデータRAM122によって含まれてもよい。図41には図示されていないが、NNU121は、図1のプログラムメモリ129、シーケンサ128、データRAM122、及び重みRAM124をさらに含む。NNU121は、図41に示されるとおり、図1のNPU126のアレイと制御/状態レジスタ127とをさらに含む。上記で例えば図34を参照して説明されたとおり、アレイのNPU126の各々は、上記で詳細に説明されたとおり、命令及びデータを処理するステージのパイプラインを含む。NPUパイプライン126の第1のステージは、メモリアレイ4152に書き込まれることになるデータを選択論理4158に提供し、第2のステージは、メモリアレイ4152からデータを受け取る。一実施形態では、パイプライン126は10個のステージを含み、第6のステージがメモリアレイ4152からデータを受け取り、第9のステージがメモリアレイ4152に書き込むためのデータを選択論理4158に提供する。
メモリアレイ4152は、NPUアレイパイプライン126に結合される。選択論理4158は、メモリアレイ4152に入力を提供する。選択論理4158は、モードを指定するモード入力4199によって制御される。好ましくは、モード4199入力は、モード4199をキャッシュメモリモードからNNUモードに変更するのに書き込まれる制御/状態レジスタ127内のビットの出力である。モードは、メモリアレイ4152がNNUモード又はキャッシュメモリモードにおいて動作していることを示す。NNUモードにおいて動作するとき、メモリアレイ4152はNNU121の重みRAM124として動作する。(メモリアレイ4152が重みAM124として機能するという参照が全体をとおして行われるが、別法として、メモリアレイ4152はデータRAM122として動作してもよい。)しかしながら、キャッシュメモリモードにおいて動作するとき、メモリアレイ4152はキャッシュメモリとして動作する。キャッシュメモリモードの2つの実施形態が説明される。メモリアレイ4152が、コア複合体4012により共有されるLLC4005のスライス4006として動作する第1の実施形態と、メモリアレイ4152が、コア複合体4012により共有されるビクティムキャッシュとして動作する第2の実施形態である。モード制御4199がNNUモードを指示するとき、選択論理4158は、NPUアレイパイプライン126により提供されるデータを選択し、メモリアレイ4152は、NPUアレイパイプライン126にデータを書き込み、そのため、メモリアレイ4152はNNU121の重みRAM124として機能する。対照的に、モード制御4199がキャッシュメモリモードを指示するとき、選択論理4158は、キャッシュ制御論理4108のデータパイプライン4146により提供されるデータを選択し、メモリアレイ4152は、キャッシュ制御論理4108のデータパイプライン4146にデータを書き込む。こうして、メモリアレイ4152は、コア4002により共有されるキャッシュメモリとして、例えば、ビクティムキャッシュ又はLLCスライス4006−4として機能する。好ましくは、2つのRAM122/124のうちより大きい方のメモリアレイが、キャッシュメモリモードにおいて使用される。さらに、重みRAM124とデータRAM122との双方のメモリアレイがコア4002により共有されるキャッシュメモリとして採用される実施形態が企図される。
好ましくは、データパイプライン4146からメモリアレイ4152にデータを提供するデータバスは、64バイト幅(例えば、キャッシュラインのサイズ)であり、メモリアレイ4152からNPUアレイパイプライン126にデータを提供するデータバスは、アレイのNPU126の数に等しいワードの数、例えば、1024ワードである。反対に、NPUアレイパイプライン126からメモリアレイ4152にデータを提供するデータバスは、アレイのNPU126の数に等しいワードの数である。好ましくは、選択論理4158とメモリアレイ4152との間のバスは、アドレスバス、データ書き込みバス、RD/WR制御、及び、(例えば、1024バイト幅のメモリアレイと64バイトのキャッシュラインを仮定して)16個のキャッシュラインのうちいずれのキャッシュラインがアクセスされているかを示すキャッシュラインイネーブル(cache line enables)(CLE)を含む。NPUアレイパイプライン126からメモリアレイ4152への書き込みの場合、典型的にすべてのCLEが真であることになり、なぜならば、典型的にすべてのNPU126が重みRAM124の行に書き込みをするからである。選択論理(図示せず)が、データがメモリアレイ4152に書き込まれているときにCLEを使用して、メモリアレイ4152の正しい1つ又は複数のバンクを選択して、読み出し又は書き込みを可能にする。
図41の実施形態では、NNUモードにおいて動作するとき、好ましくは、コア4002上で実行されるアーキテクチャプログラムは、NNU121が例えば上記で図1〜図35を参照して説明された実施形態などのコアの実行ユニットであるというよりも、NNU121に周辺デバイスとしてリングバス4024を通じてアクセスする。好ましくは、図35のインターフェース論理3514(図41には図示せず)及び制御/状態レジスタ127がリングストップ4004−Mに結合され、このことは、コア4002がインターフェース論理3514を介して、(図14及び図15のMTNN1400及びMFNN1500命令ではなく)アーキテクチャのロード/記憶命令を使用して、制御/状態レジスタ127に読み出し及び書き込みをし、データRAM122、重みRAM124、及びプログラムメモリ129に読み出し及び書き込みをすることを可能にする。さらに、データ/重みワードが、ダイレクトメモリアクセス(DMA)トランスファーを介してシステムメモリとデータRAM122/重みRAM124との間で伝達され(transferred)てもよい。最後、NNU121自体がロード/記憶命令を実行してシステムメモリとデータRAM122/重みRAM124との間でデータ/重みを伝達する実施形態が企図される。好ましくは、オペレーティングシステムが、NNU121を、異なるコア4002上で稼働するシステムの様々なプロセスにより共有される大域的リソースとして管理し、オペレーティングシステムは、プロセスに、NNU121を使用する前にNNU121の所有権を取得するように求める。好ましくは、オペレーティングシステムは、NNU121が動作するモード4199を、より詳細にはメモリアレイ4152が機能する方法を制御する。このことは下記で図42〜図45を参照してより詳細に説明される。一実施形態では、メモリアレイ4152は2MBのスタティックRAMアレイであるが、そのサイズがより大きい又はより小さい他の実施形態が企図される。
キャッシュ制御論理4108は、リングストップ4004−Mに、及び、選択論理4158及びメモリアレイ4152に結合される。キャッシュ制御論理4108は、リングストップ4004−Mに結合されたタグパイプライン4144と、リングストップ4004−Mに結合されたデータパイプライン4146と、タグパイプライン4144に結合されたタグ/MESI/LRUアレイ4142とを含む。キャッシュ制御論理4108は外部インターフェース4147をさらに含み、外部インターフェース4147は、フィルキュー4122と、スヌープキュー4124と、タグパイプライン4144及びデータパイプライン4146に対するアクセスについてフィルキュー4122及びスヌープキュー4124の間で調停するアービタ(arbiter)4136とを含む。キャッシュ制御論理4108はコアインターフェース4148をさらに含み、コアインターフェース4148は、ロードキュー4112と、追い出しキュー4114と、問い合わせキュー4116と、タグパイプライン4136及びデータパイプライン4146に対するアクセスについてロードキュー4112、追い出しキュー4114、及び問い合わせキュー4116の間で調停するアービタ4138とを含む。アービタ4132が、タグパイプライン4144に対するアクセスについて外部インターフェース4147とコアインターフェース4148との間で調停し、アービタ4134が、データパイプライン4146に対するアクセスについて外部インターフェース4147とコアインターフェース4148との間で調停する。一実施形態において、キャッシュ制御論理4108は、メモリアレイ4152のライトバック無効化動作を、そうするための要求に応答して、例えばコア4002からのライトバック無効化要求に応答して行うステートマシンをさらに含む。さらに、ステートマシンは、メモリアレイ4152の無効化動作を、そうするための要求に応答して、例えばコア4002からの無効化要求に応答して行う。無効化動作を行うために、ステートマシンは、メモリアレイ4152における各キャッシュラインのタグ/MESIアレイ4142内のステートを無効ステータスに更新し、メモリアレイ4152の各セットについてのLRUアレイ4142内の置き換え情報をリセットする。
タグパイプライン4144は、要求及びタグ更新をアービタ4132から受け取り、キャッシュラインステータス及び応答をリングストップ4004−M並びに外部インターフェース4147及びコアインターフェース4148に提供する。データパイプライン4146は、要求及びデータをアービタ4134から受け取り、データを選択論理4158及びリングストップ4004−Mに提供する。キャッシュメモリモードにあるとき、タグ/MESIアレイ4142は、メモリアレイ4152内に記憶されたキャッシュラインについてのタグ及びステータスを記憶する。好ましくは、メモリアレイ4152は、キャッシュメモリモードにあるときにセットアソシアティブメモリとして動作し、LRUアレイ4142は、選択されたセットのうちいずれのウェイ(way)を置き換えるかを決定するためのキャッシュライン置き換え情報を記憶する。
フィルキュー4122は、メモリアレイ4152への新しい割り振り(リロード要求)とメモリアレイ4152からの追い出し(ビクティム要求)とを扱う。ビクティム要求の場合、フィルキュー4122は、タグパイプライン4144へのアクセスを要求して、もしある場合はいずれのキャッシュラインが追い出される必要があるかを決定し、データパイプライン4146へのアクセスを要求して、メモリアレイ4152から外へ変更を加えられたデータを読み出して、システムメモリに書き込む。リロード要求の場合、フィルキュー4122は、タグパイプライン4144へのアクセスを要求して、新たに割り振られたキャッシュラインのアドレスをタグアレイ4142に書き込み、MESIアレイ4142内に初期MESIステートを設定し、データパイプライン4146へのアクセスを要求して、新しいデータをメモリアレイ4152に書き込む。スヌープキュー4124は、システムバス4022に由来するスヌープを扱う。スヌープキュー4124は、タグパイプライン4144へのアクセスを要求して、スヌープ要求内で指定されるキャッシュラインのステータスを決定し、データパイプライン4146へのアクセスを要求して、存在する場合にメモリアレイ4152から外へ変更を加えられたデータを読み出して、スヌープ要求に応答する。ロードキュー4112は、ロードがすべての下位レベルキャッシュ(下記でより詳細に説明されるとおり、メモリアレイ4152及びキャッシュ制御論理4108がビクティムキャッシュ4006−4として動作しているときのL3キャッシュ4005を含む)においてミスするとき、コア4002のL2キャッシュ4008からの(及び、他のキャッシュ、例えば、L2キャッシュ4008がL1データ及びL1命令についてインクルーシブでない実施形態におけるL1データ及びL1命令からの)ロードを扱う。ロードキュー4112は、タグパイプライン4144へのアクセスを要求して、指定されたキャッシュラインがメモリアレイ4152内に存在するかどうかを決定し、データパイプライン4146へのアクセスを要求して、メモリアレイ4152から外へ指定されたデータを読み出して、リングバス4024を介して要求しているコア4002に書き込む。追い出しキュー4114は、コアのL2キャッシュ4008からの追い出しを扱う。ビクティムキャッシュ5806−4として動作するとき、追い出しキュー4114は、タグパイプライン4114へのアクセスを要求して、下位レベルキャッシュメモリから追い出されるキャッシュラインのアドレスをタグアレイ4142に書き込み、MESIアレイ4142内に初期MESIステートを設定する。LLC5805のスライスとして動作するとき、追い出しキュー4114は、追い出されるキャッシュラインが変更を加えられている場合、タグパイプライン4144へのアクセスを要求してMESIアレイ4142内のMESIステートを更新する。追い出しキュー4144は、さらに、データパイプライン4146へのアクセスを要求して、追い出されるキャッシュラインをメモリアレイ4152に書き込む。問い合わせキュー4116は、コアのL2キャッシュ4008に対するスヌープを扱う。問い合わせキュー4116は、コア4002がModifiedをスヌープに応答した後、タグパイプライン4144へのアクセスを要求してMESIステートをModifiedに更新し、データパイプライン4146へのアクセスを要求して、スヌープ応答からの変更を加えられたキャッシュラインをメモリアレイ4152に書き込む。一実施形態では、キャッシュ制御論理4108は、コア4002ごとにコアインターフェース4148を含む。一実施形態では、各コアインターフェース4148が、ロード、追い出し、及びスヌープをそれぞれ扱う別個のデータ/命令ロードキュー4112、追い出しキュー4114、及び問い合わせキュー4116を、コア4002の別個のデータ/命令キャッシュと共に含む。
次に図42を参照すると、図41のメモリアレイ4152がLLCスライス4006として使用されるときのキャッシュメモリモードからNNU121の重み/データRAM124/122として使用されるときのNNUモードに移行される場合の図40のプロセッサ4000の動作を例示する一フローチャートが示される。上記で説明されたとおり、NNU121は大量のメモリを有し、例えば、重みRAM124は一実施形態において2MBである。図42及び図43は、メモリアレイ4152が追加的なLLCスライス4006として動作することを可能にする一実施形態を説明し、ゆえに有利なことに、システム上で稼働するプロセスのいずれによってもNNU121がニューラルネットワークユニットとして使用されていないとき、LLC4005のサイズを大幅に(例えば、25%まで)増加させることができる。より詳細には、図42は、メモリアレイ4152をLLCスライス4006として動作するものからNNU121の重みRAM124として動作するものに移行する方法を説明する。有利なことに、図41のキャッシュ制御論理4108並びにメモリアレイ4152及び選択論理4158は、モード4199がキャッシュメモリモードに設定されるとき、図42及び図43の実施形態においてLLCスライス4006として集合的に動作する。フローはブロック4202で始まる。
ブロック4202において、メモリアレイ4152をLLC4005のスライス4006として使用することからメモリアレイ4152をNNU121の重みRAM124として使用することへ移行するための要求が行われる。好ましくは、移行は、プロセッサ4000上で稼働するオペレーティングシステムによって制御される。例えば、プロセッサ4000上で稼働するアプリケーションプログラムが、NNU121を使用することをオペレーティングシステムに要求し、オペレーティングシステムは、メモリアレイ4152がLLCスライス4006として現在使用されていることを検出し、ゆえに、キャッシュメモリモードからNNUモードへの移行を必要とする。フローはブロック4204に進む。
ブロック4204において、ブロック4202における移行要求に応答して、オペレーティングシステムは、すべてのコア4202に、それらコア自身を同期させるようにする。すなわち、オペレーティングシステムは、コア4002に、アーキテクチャ命令を取り出すことを停止させ、メモリにアクセスすることを停止させる。より詳細には、上記のことは、LLC4005に対するアクセスを一時停止し、LLC4005は現在、メモリアレイ4152を含んでいる。一実施形態において、オペレーティングシステムは、各コア4002上で、コア4002に同期するように命令するアーキテクチャ命令(例えば、x86WRMSR)を実行する。代替的な一実施形態において、オペレーティングシステムは、コア4002のうち1つにおいて命令を実行し、応答において、上記1つのコア4002が、例えばマイクロコードを介して、他のコア4002の各々に信号伝達して同期させる。フローはブロック4206に進む。
ブロック4206において、ライトバック無効化がLLC4005上で行われる。一実施形態において、コア4002のマイクロコードが、好ましくはオペレーティングシステムのアーキテクチャ命令の実行に応答して、ライトバック無効化を要求する。ライトバック無効化は、(もしあれば)変更を加えられたキャッシュラインを書き戻し、NNU LLCスライス4006−4を含むすべてのLLCスライス4006のすべてのキャッシュラインを無効にする。代替的な一実施形態において、ライトバック無効化は選択的である。一般に、選択的なライトバック無効化は、下記の疑似コードに従って動作することを意味する:
for each slice: // 0〜N−1、ここでNは現在のスライス数である(NNUスライスを含む)
for each cacheline in slice:
if exclusive_hash(cacheline address) != slice:
evict cacheline
当然ながら、スライスがNNUスライスであるとき(例えば、8つの非NNUスライス4006プラス1つのNNU LLCスライス4006−4の場合における、スライス=8)、exclusive_hash(cacheline address)は、スライスに等しくないことになる。これは、エクスクルーシブハッシュがNNU LLCスライス4006−4の索引を返さないからであり、ゆえに、NNU LLCスライス4006−4内のすべてのキャッシュラインが追い出され、すなわち、変更を加えられている場合は書き戻され、それから、無効化される。採用されるインクルーシブハッシュ及びエクスクルーシブハッシュに依存して、非NNU LLCスライス4006からの追い出しを必要とするキャッシュラインの数は変動する。例えば、エクスクルーシブハッシュ及びインクルーシブハッシュが双方、PA[45:6]%Nであると仮定し、ただし、Nは各々について異なり、すなわちNはインクルーシブハッシュについてよりもエクスクルーシブハッシュについての方が1少なく、Nがインクルーシブハッシュについて9、及びエクスクルーシブハッシュについて8であると仮定する。この場合、非NNU LLCスライス4006内のキャッシュラインのうち大幅に大きい部分が追い出しを必要とし、例えば、約88%である。この場合、すべてのLLCスライス4006のすべてのキャッシュラインを単にライトバック無効にすることと同様の効率であるか、又はその方がより効率的であり得る。対照的に、別の例として、エクスクルーシブハッシュがPA[10:8]であり、インクルーシブハッシュが上記で説明されたcalc_hash_2であると仮定する。この場合、非NNU LLCスライス4006内のキャッシュラインのうちいずれも、インクルーシブハッシュからエクスクルーシブハッシュへの移行において追い出しを必要とせず、これは図42において行われる移行である。フローはブロック4208に進む。
ブロック4208において、キャッシュラインの物理アドレスをLLCスライス4006にハッシュするのに使用されるハッシングアルゴリズムが、上記で説明されたとおり、LLCスライス4005のスライス4006としてメモリアレイ4152を除外するように更新される。好ましくは、ハッシュ更新メッセージが各コア4002及びスヌープソースに対してブロードキャストされて、そのハッシュアルゴリズムをエクスクルーシブハッシュに、すなわち、NNU LLCスライス4006−4を除外するハッシュに変更させる。フローはブロック4212に進む。
ブロック4212において、モード4199が、NNUモードを指示するように更新されて、選択論理4158に、メモリアレイ4152を重みRAM124としての使用に利用可能にするようにさせ、メモリアレイ4152は、NPU126のパイプライン124とコア4002上で実行されるアーキテクチャプログラムとによってアクセスされることになる。一実施形態において、オペレーティングシステム(例えば、デバイスドライバ)は、コア4002のうち1つにおいてNNU121の制御/状態レジスタ127に書き込みをするアーキテクチャ命令を実行して、モード4199を制御するビットを更新して、モード4199をキャッシュメモリモードからNNUモードに変更する。アーキテクチャ命令は、制御/状態レジスタ127に対してメモリマップドI/O書き込みを行う、I/O空間への書き込み又はメモリストア命令であり得る。フローはブロック4214に進む。
ブロック4214において、コア4002が動作を再開する。すなわち、コア4002はもはや同期させられず、代わって、アーキテクチャ命令の取り出し及び実行を開始し、このことは、メモリにアクセスすることを含み得る。一実施形態において、オペレーティングシステムは、各コア4002上で、動作を再開するようにコア4002に命令するアーキテクチャ命令を実行する。代替的な一実施形態において、オペレーティングシステムは、コア4002のうち1つにおいて命令を実行し、応答において、上記1つのコア4002が、例えばマイクロコードを介して、他のコア4002の各々に信号伝達して動作を再開させる。フローはブロック4214において終了する。
次に図43を参照すると、図41のメモリアレイ4152がNNU121の重み/データRAM124/122として使用されるときのNNUモードからLLCスライス4006として使用されるときのキャッシュメモリモードに移行される場合の図40のプロセッサ4000の動作を例示する一フローチャートが示される。フローはブロック4302において始まる。
ブロック4302において、メモリアレイ4152をNNU121の重みRAM124として使用することからメモリアレイ4152をLLC4005のスライス4006として使用することへ移行するための要求が行われる。好ましくは、移行は、プロセッサ4000上で稼働するオペレーティングシステムによって制御される。例えば、プロセッサ4000上で稼働するアプリケーションプログラムが、オペレーティングシステムに、NNU121をもはや使用していないことを知らせ、オペレーティングシステムは、メモリアレイ4152が重みRAM124として現在使用されていることを検出し、ゆえに、NNUモードからキャッシュメモリモードへの移行を必要とする。フローはブロック4304に進む。
ブロック4304において、ブロック4302における移行要求に応答して、オペレーティングシステムは、ブロック4204に関して説明されたように、すべてのコア4202に、それらコア自身を同期させるようにする。より詳細には、上記のことは、LLC4005に対するアクセスを一時停止し、LLC4005は現在、メモリアレイ4152を除外している。フローはブロック4306に進む。
ブロック4306において、ライトバック無効化がLLC4005上で行われる。ライトバック無効化は、(もしあれば)変更を加えられたキャッシュラインを書き戻し、すべてのLLCスライス4006(NNU LLCスライス4006−4を除く。なぜならば、それはLLC4005に現在含まれていないため)のすべてのキャッシュラインを無効にする。代替的な一実施形態において、ライトバック無効化は選択的である。一般に、選択的なライトバック無効化は、下記の疑似コードに従って動作することを意味する:
for each slice: // 0〜N−1、ここでNは現在のスライス数である(NNUスライスを除く)
for each cacheline in slice:
if inclusive_hash(cacheline address) != slice:
evict cacheline
図43のエクスクルーシブハッシュからインクルーシブハッシュへの移行において、スライスはNNUスライスでなく、ゆえに、NNU LLCスライス4006−4内のキャッシュラインは追い出されないことになる。採用されるインクルーシブハッシュ及びエクスクルーシブハッシュに依存して、非NNU LLCスライス4006からの追い出しを必要とするキャッシュラインの数は変動する。例えば、エクスクルーシブハッシュ及びインクルーシブハッシュが双方、PA[45:6]%Nであると仮定し、ただし、Nは各々について異なり、すなわちNはインクルーシブハッシュについてよりもエクスクルーシブハッシュについての方が1少なく、Nがインクルーシブハッシュについて9、及びエクスクルーシブハッシュについて8であると仮定する。この場合、非NNU LLCスライス4006内のキャッシュラインのうち大幅に大きい部分が追い出しを必要とし、例えば、約88%である。この場合、すべてのLLCスライス4006のすべてのキャッシュラインを単にライトバック無効にすることと同様の効率であるか、又はその方がより効率的であり得る。対照的に、別の例として、エクスクルーシブハッシュがPA[10:8]であり、インクルーシブハッシュが上記で説明されたcalc_hash_2であると仮定する。この場合、非NNU LLCスライス4006内のキャッシュラインのうち比較的小さい部分が追い出しを必要とし、例えば、約12%である。フローはブロック4308に進む。
ブロック4308において、キャッシュラインの物理アドレスをLLCスライス4006にハッシュするのに使用されるハッシングアルゴリズムが、上記で説明されたとおり、LLCスライス4005のスライス4006としてメモリアレイ4152を含めるように更新される。すなわち、ハッシュ更新メッセージが各コア4002及びスヌープソースに対してブロードキャストされて、そのハッシュアルゴリズムをインクルーシブハッシュに、すなわち、NNU LLCスライス4006−4を含むハッシュに変更させる。フローはブロック4311に進む。
ブロック4311において、キャッシュ制御論理4108は、上記で説明されたとおり、MESIアレイ4142内のステータスをすべてのキャッシュラインについてInvalidに更新することによって、メモリアレイ4152に対する無効化動作を行う。好ましくは、キャッシュ制御論理4108は、LRUアレイ4142内の置き換え情報をさらにリセットする。一実施形態において、コア4002のマイクロコードが、無効化要求を行うようにNNU LLCスライス4006−4に要求し、応答的にキャッシュ制御論理4108がそれを行う。フローはブロック4312に進む。
ブロック4312において、モード4199が、キャッシュメモリモードを指示するように更新されて、選択論理4158に、メモリアレイ4152をLLCスライス4006としての使用に利用可能にするようにさせる。フローはブロック4314に進む。
ブロック4314において、コア4002が動作を再開する。すなわち、ブロック4214に関して説明されたように、コア4002はもはや同期させられず、代わって、アーキテクチャ命令の取り出し及び実行を開始し、このことは、メモリにアクセスすることを含み得る。フローはブロック4314において終了する。
次に図44を参照すると、図41のメモリアレイ4152がNNU121の重み/データRAM124/122として使用されるときのNNUモードからビクティムキャッシュ4006−4として使用されるときのキャッシュメモリモードに移行される場合の図40のプロセッサ4000の動作を例示する一フローチャートが示される。ビクティムキャッシュは、プロセッサ4000のキャッシュ階層内でより下位のキャッシュメモリによって追い出されたキャッシュラインのみ保持するキャッシュメモリである。例えば、L2キャッシュ4008、及び/又はL1データ/命令キャッシュが、より下位のレベルのキャッシュである。さらに、メモリアレイ4152がビクティムキャッシュ4006−4として動作し得る実施形態において、LLC4005は、レベル3(L3)キャッシュと考えられ、ビクティムキャッシュ4006−4に対してより下位のレベルのキャッシュと考えられ、L3キャッシュ4005は、ビクティムキャッシュ4006−4にキャッシュラインを追い出す。ビクティムキャッシュは、例えばロード要求又はスヌープ要求に応答して、アドレスがビクティムキャッシュ内でヒットするとき、データを提供する。一実施形態において、L3キャッシュ4005は、コア複合体4012のL2キャッシュ4008と下位レベルキャッシュとについてインクルーシブであり、ビクティムキャッシュは、ヒットしたデータをL3キャッシュ4005に割り振るように提供し、ひいてはL3キャッシュ4005が、データをL2キャッシュ4008に提供し、ひいてはL2キャッシュ4008が、データをその下位のレベルのキャッシュに提供する。別の実施形態において、コア複合体4012のL3キャッシュ4005、L2キャッシュ4008、及び下位レベルキャッシュは、インクルーシブでなく、ビクティムキャッシュは、ヒットしたデータを、キャッシュの各レベルに直接割り振るように提供する。有利なことに、図41のキャッシュ制御論理4108並びにメモリアレイ4152及び選択論理4158は、モード4199がNNUモードに設定されるとき、図44及び図45の実施形態においてビクティムキャッシュ4006−4として集合的に動作する。一実施形態において、ビクティムキャッシュ4006−4は、ライトバックキャッシュとして動作することができ、該ビクティムキャッシュ4006−4へ追い出された、変更を加えられたキャッシュラインをキャッシュする。さらに、ビクティムキャッシュ4006−4は、ライトスルーキャッシュとして動作することができ、該ビクティムキャッシュ4006−4へ追い出された、変更を加えられたキャッシュラインをキャッシュすることはしないが、代わって、変更を加えられたキャッシュラインをシステムメモリに転送する(forwards)。ライトスルービクティムキャッシュ4006−4は、図45(より詳細には、ブロック4506、4508、及び4512)の説明から観察できるとおり、NNUモードにおいて重みRAM124としてメモリアレイ4152を使用することへのより速い移行という利点を有する。これに対し、ライトバックビクティムキャッシュ4006−4は、プロセッサ4000についてのより大きい全体キャッシュ効率という利点を有し得る。好ましくは、ビクティムキャッシュ4006−4は、ライトバックモード又はライトスルーモードのいずれかで構成可能である。フローはブロック4402において始まる。
ブロック4402において、メモリアレイ4152をNNU121の重みRAM124として使用することからメモリアレイ4152をコア複合体4012により共有されるビクティムキャッシュ4006−4として使用することへ移行するための要求が行われる。好ましくは、移行は、上記でブロック4302に関して説明されたように、プロセッサ4000上で稼働するオペレーティングシステムによって制御される。フローはブロック4404に進む。
ブロック4404において、モード4199が、キャッシュメモリモードを指示するように更新されて、選択論理4158に、メモリアレイ4152をビクティムキャッシュ4006−4としての使用に利用可能にするようにさせる。フローはブロック4406に進む。
ブロック4406において、バスコントローラ4014が、スヌープをビクティムキャッシュ4006−4に向けることを開始するように命じられ、下位レベルキャッシュが、ロード要求及び追い出し要求をビクティムキャッシュ4006−4に向けることを開始するように命じられる。フローはブロック4408に進む。
ブロック4408において、ビクティムキャッシュ4006−4は、ビクティムデータをキャッシュすることを開始する。図41の実施形態において、追い出しキュー4114が、要求、例えばキャストアウト(castouts)を受け取って、下位レベルキャッシュ、例えば、L3キャッシュ4005、L2キャッシュ4008、及び/又はL1D/L1Iキャッシュから、キャッシュラインを追い出す。応答において、ビクティムキャッシュ4006−4は、追い出されたキャッシュラインをメモリアレイ4152に割り振る。フローはブロック4412に進む。
ブロック4412において、ビクティムキャッシュ4006−4は、要求を受け取ってデータにアクセスし、要求のアドレスがビクティムキャッシュ4006−4内でヒットする場合、データと共に応答する。図41の実施形態において、スヌープキュー4124及びロードキュー4112が要求を受け取る。より詳細には、ビクティムキャッシュ4006−4がスヌープされて、別のキャッシングエージェントが読み出しているキャッシュラインをライトバック無効にする。さらに、ビクティムキャッシュ4006−4は、下位レベルキャッシュ内でミスするロードについて、下位レベルキャッシュからロード要求を受け取る。要求がビクティムキャッシュ4006−4内でヒットする場合、ビクティムキャッシュ4006−4はヒットしたデータを要求元に提供する。フローはブロック4412において終了する。
次に図45を参照すると、図41のメモリアレイ4152がビクティムキャッシュ4006−4として使用されるときのキャッシュメモリモードからNNU121の重み/データRAM124/122として使用されるときのNNUモードに移行される場合の図40のプロセッサ4000の動作を例示する一フローチャートが示される。上述されたとおり、ビクティムキャッシュ4006−4は、ライトスルータイプキャッシュとしてか又はライトバックタイプキャッシュとして動作することができる。フローはブロック4502において始まる。
ブロック4502において、メモリアレイ4152をビクティムキャッシュ4006−4として使用することからメモリアレイ4152をNNU121の重みRAM124として使用することに移行するための要求が行われる。好ましくは、移行は、プロセッサ4000上で稼働するオペレーティングシステムによって制御される。例えば、プロセッサ4000上で稼働するアプリケーションプログラムが、NNU121を使用することをオペレーティングシステムに要求し、オペレーティングシステムは、メモリアレイ4152がビクティムキャッシュ4006−4として現在使用されていることを検出し、ゆえに、キャッシュメモリモードからNNUモードへの移行を必要とする。フローはブロック4504に進む。
ブロック4504において、バスコントローラ4014が、スヌープをビクティムキャッシュ4006−4に向けることを停止するように命じられる。フローは判定ブロック4506に進む。
判定ブロック4506において、ビクティムキャッシュ4006−4がライトスルータイプキャッシュとして動作している場合、フローはブロック4512に進み、そうでない場合、フローはブロック4508に進む。
ブロック4508において、キャッシュ制御論理4108は、ビクティムキャッシュ4006−4に対してライトバック無効化を行う。すなわち、ビクティムキャッシュ4006−4が、その変更を加えられたキャッシュラインをすべてシステムメモリに書き戻し、それから、そのキャッシュラインをすべて無効にする(すべてのキャッシュラインについて、MESIアレイ4142内のステータスをInvalidに更新することによる。好ましくは、キャッシュ制御論理4108は、LRUアレイ4142内の置き換え情報をさらにリセットする。)。好ましくは、キャッシュ制御論理4108は、ライトバック無効化を行う間、ロード要求及びスヌープ要求に応答し続ける。フローはブロック4514に進む。
ブロック4512において、キャッシュ制御論理4108は、メモリアレイ4152に対して無効化動作を行う。すなわち、キャッシュ制御論理4108は、メモリアレイ4152のすべてのキャッシュラインを無効にする。観察できるように、ビクティムキャッシュ4006−4がライトスルータイプキャッシュとして動作している場合、メモリアレイ4152を重みRAM124として使用することへの移行は、有利なことに、ビクティムキャッシュ4006−4がライトバックタイプキャッシュとして動作していたときよりもより速い可能性があり、なぜならば、ブロック4508におけるModifiedキャッシュラインのライトバックが、行われる必要がないからである(すなわち、ここのブロック4512における無効化のみが行われる必要がある)。このことは、ビクティムキャッシュ4006−4が比較的大きいとき、実質的な節減であり得る。フローはブロック4514に進む。
ブロック4514において、下位レベルキャッシュは、ロード要求をビクティムキャッシュ4006−4に向けることを停止するように命じられ、バスコントローラ4014は、スヌープをビクティムキャッシュ4006−4に向けることを停止するように命じられる。フローはブロック4516に進む。
ブロック4516において、ブロック4212に関して説明されたように、モード4199が、NNUモードを指示するように更新されて、選択論理4158に、メモリアレイ4152を重みRAM124としての使用に利用可能にするようにさせ、メモリアレイ4152は、NPU126のパイプライン124とコア4002上で実行されるアーキテクチャプログラムとによってアクセスされることになる。フローはブロック4518に進む。
ブロック4518において、キャッシュ制御論理4108は、ビクティムデータをキャッシュすることを停止する(このことは、キャッシュ制御論理4108がブロック4408において行い始めた)。さらに、キャッシュ制御論理4108は、自身が受け取るいかなる後のロード、追い出し、又はスヌープ要求も、バスコントローラ4014に転送する。最後、コア4002上で実行されるアーキテクチャプログラムが、NPU126のパイプライン124によりアクセスされる重みRAM124として使用することができる。フローはブロック4518において終了する。
本発明の様々な実施形態を本明細書に記載したが、それらは例として提示されたものであり、制限ではない。関連するコンピュータ技術の当業者には、本発明の範囲から逸脱することなく、本発明の形態及び詳細に様々な変更をなすことが可能であることが明らかであろう。例えば、ソフトウェアが、例えば、本明細書に記載される装置及び方法の機能、製造、モデリング、シミュレーション、記述、及び/又は試験を可能にすることができる。これは、一般的なプログラミング言語(例えば、C、C++)、Verilog HDL、VHDLなどを含むハードウェア記述言語(HDL)、又は他の利用可能なプログラムの使用を通じて達成することができる。そのようなソフトウェアは、磁気テープ、半導体、磁気ディスク、若しくは光学ディスク(例えば、CD−ROM、DVD−ROM等)、ネットワーク、有線、又は他の通信媒体など、任意の知られているコンピュータ使用可能媒体の中に配置することができる。本明細書に記載される装置及び方法の実施形態は、プロセッサコア(例えば、HDLで具現化又は規定された)などの半導体の知的財産権コアに含めて、集積回路の作製時にハードウェアに変容させることができる。加えて、本明細書に記載される装置及び方法は、ハードウェアとソフトウェアの組み合わせとして具現化することができる。したがって、本発明は、本明細書に記載される例示的実施形態のいずれによっても制限されるべきではなく、下記の特許請求の範囲とその均等物のみに従って定義されるべきである。具体的には、本発明は、汎用コンピュータで使用されることが可能なプロセッサデバイス中に実装することができる。最後に、当業者は、開示される概念と特定の実施形態を、添付の特許請求の範囲によって定義される本発明の範囲から逸脱することなく、本発明と同じ目的を遂行するための他の構造を設計するための、又はそれに変更を加えるための基礎として容易に使用できることを認識されよう。