(57)【要約】【課題】  キャッシュメモリ又はニューラルネットワークユニットメモリとして動作可能なメモリアレイを有するプロセッサを提供する。【解決手段】  プロセッサが、モードインディケータ、複数の処理コア、及びニューラルネットワークユニット（ＮＮＵ）を含み、ＮＮＵは、メモリアレイ、ニューラル処理ユニット（ＮＰＵ）のアレイ、キャッシュ制御論理、及び選択論理を含み、選択論理は、複数のＮＰＵとキャッシュ制御論理とをメモリアレイに選択的に結合する。モードインディケータが第１のモードを示すとき、選択論理は、複数のＮＰＵがメモリアレイからニューラルネットワーク重みを読み出して重みを用いて計算を行うことを可能にする。モードインディケータが第２のモードを示すとき、選択論理は、複数の処理コアがキャッシュ制御論理をとおしてキャッシュメモリとしてメモリアレイにアクセスすることを可能にする。【選択図】  図４０
2018092561.tif 000002
【特許請求の範囲】
【請求項１】
モードインディケータと、
複数の処理コアと、
メモリアレイ、
ニューラル処理ユニット（ＮＰＵ）のアレイ、
キャッシュ制御論理、及び、
前記複数のＮＰＵと前記キャッシュ制御論理とを前記メモリアレイに選択的に結合するように構成された選択論理、
を含むニューラルネットワークユニット（ＮＮＵ）と、
を含み、
前記モードインディケータが第１のモードを示すとき、前記選択論理は、前記複数のＮＰＵが前記メモリアレイからニューラルネットワーク重みを読み出して前記重みを用いて計算を行うことを可能にし、
前記モードインディケータが第２のモードを示すとき、前記選択論理は、前記複数の処理コアが前記キャッシュ制御論理をとおしてキャッシュメモリとして前記メモリアレイにアクセスすることを可能にする、
プロセッサ。
【請求項２】
前記モードインディケータが前記第２のモードを示すとき、前記複数の処理コアは前記キャッシュ制御論理をとおしてビクティムキャッシュメモリとして前記メモリアレイにアクセスする、
ことをさらに含む請求項１に記載のプロセッサ。
【請求項３】
前記モードインディケータが前記第２のモードを示すとき、前記複数の処理コアは前記キャッシュ制御論理をとおして当該プロセッサのラストレベルキャッシュメモリのスライスとして前記メモリアレイにアクセスする、
ことをさらに含む請求項１に記載のプロセッサ。
【請求項４】
複数のラストレベルキャッシュスライス、
をさらに含み、
前記モードインディケータが前記第２のモードを示すとき、前記メモリアレイ及びキャッシュ制御論理は、前記複数のラストレベルキャッシュスライスと関連して、前記複数の処理コアがアクセスする前記ラストレベルキャッシュメモリとして動作する、
請求項３に記載のプロセッサ。
【請求項５】
前記ＮＮＵは前記複数の処理コアに結合され、
前記モードインディケータが前記第１のモードを示すとき、前記ＮＮＵは、前記複数の処理コアのニューラルネットワーク計算を加速するように前記複数の処理コアにより制御可能である、
ことをさらに含む請求項１に記載のプロセッサ。
【請求項６】
前記ＮＮＵと前記複数の処理コアとを結合するリングバス、
をさらに含む請求項５に記載のプロセッサ。
【請求項７】
前記リングバスに結合された複数のラストレベルキャッシュスライス、
をさらに含み、
前記モードインディケータが前記第２のモードを示すとき、前記メモリアレイ及びキャッシュ制御論理は、前記複数のラストレベルキャッシュスライスと関連して、前記リングバスを介して前記複数の処理コアがアクセスするラストレベルキャッシュメモリとして動作する、
請求項６に記載のプロセッサ。
【請求項８】
前記第２のモードから前記第１のモードに移行するために、前記キャッシュ制御論理は前記メモリアレイをライトバック無効にする、
ことをさらに含む請求項１に記載のプロセッサ。
【請求項９】
前記複数の処理コアはｘ８６命令セットアーキテクチャ処理コアである、
ことをさらに含む請求項１に記載のプロセッサ。
【請求項１０】
モードインディケータと、複数の処理コアと、メモリアレイ、ニューラル処理ユニット（ＮＰＵ）のアレイ、キャッシュ制御論理、及び、前記複数のＮＰＵと前記キャッシュ制御論理とを前記メモリアレイに選択的に結合するように構成された選択論理を含むニューラルネットワークユニット（ＮＮＵ）と、を有するプロセッサを動作させる方法であって、
第１のモードを示すように前記モードインディケータを設定することに応答して前記選択論理により、前記複数のＮＰＵが前記メモリアレイからニューラルネットワーク重みを読み出して前記重みを用いて計算を行うことを可能にすることと、
第２のモードを示すように前記モードインディケータを設定することに応答して前記選択論理により、前記複数の処理コアが前記キャッシュ制御論理をとおしてキャッシュメモリとして前記メモリアレイにアクセスすることを可能にすることと、
を含む方法。
【請求項１１】
前記モードインディケータが前記第２のモードを示すときに前記複数の処理コアにより、前記キャッシュ制御論理をとおしてビクティムキャッシュメモリとして前記メモリアレイにアクセスすること、
をさらに含む請求項１０に記載の方法。
【請求項１２】
前記モードインディケータが前記第２のモードを示すときに前記複数の処理コアにより、前記キャッシュ制御論理をとおして前記プロセッサのラストレベルキャッシュメモリのスライスとして前記メモリアレイにアクセスすること、
をさらに含む請求項１０に記載の方法。
【請求項１３】
前記プロセッサは複数のラストレベルキャッシュスライスをさらに含み、
前記モードインディケータが前記第２のモードを示すときに前記メモリアレイ及びキャッシュ制御論理により、前記複数のラストレベルキャッシュスライスと関連して、前記複数の処理コアがアクセスする前記ラストレベルキャッシュメモリとして動作すること、
をさらに含む請求項１２に記載の方法。
【請求項１４】
前記ＮＮＵは前記複数の処理コアに結合され、
前記モードインディケータが前記第１のモードを示すときに前記複数の処理コアにより、前記複数の処理コアのニューラルネットワーク計算を加速するように前記ＮＮＵを制御すること、
をさらに含む請求項１０に記載の方法。
【請求項１５】
前記プロセッサは、前記ＮＮＵと前記複数の処理コアとを結合するリングバスをさらに含む、
ことをさらに含む請求項１４に記載の方法。
【請求項１６】
前記プロセッサは、前記リングバスに結合された複数のラストレベルキャッシュスライスをさらに含み、
前記モードインディケータが前記第２のモードを示すときに前記メモリアレイ及びキャッシュ制御論理により、前記複数のラストレベルキャッシュスライスと関連して、前記リングバスを介して前記複数の処理コアがアクセスするラストレベルキャッシュメモリとして動作すること、
をさらに含む請求項１５に記載の方法。
【請求項１７】
前記キャッシュ制御論理により、前記第２のモードから前記第１のモードに移行するために前記メモリアレイをライトバック無効にすること、
をさらに含む請求項１０に記載の方法。
【請求項１８】
前記複数の処理コアはｘ８６命令セットアーキテクチャ処理コアである、
ことをさらに含む請求項１０に記載の方法。
【請求項１９】
コンピューティングデバイスでの使用のための少なくとも１つの非一時的コンピュータ使用可能媒体内に符号化されたコンピュータプログラムであって、
プロセッサを規定するための、前記媒体内に具現化されたコンピュータ使用可能プログラムコードを含み、前記コンピュータ使用可能プログラムコードは、
モードインディケータを規定するための第１のプログラムコードと、
複数の処理コアを規定するための第２のプログラムコードと、
メモリアレイ、
ニューラル処理ユニット（ＮＰＵ）のアレイ、
キャッシュ制御論理、及び
前記複数のＮＰＵと前記キャッシュ制御論理とを前記メモリアレイに選択的に結合するように構成された選択論理、
を含むニューラルネットワークユニット（ＮＮＵ）を規定するための第３のプログラムコードと、
を含み、
前記モードインディケータが第１のモードを示すとき、前記選択論理は、前記複数のＮＰＵが前記メモリアレイからニューラルネットワーク重みを読み出して前記重みを用いて計算を行うことを可能にし、
前記モードインディケータが第２のモードを示すとき、前記選択論理は、前記複数の処理コアが前記キャッシュ制御論理をとおしてキャッシュメモリとして前記メモリアレイにアクセスすることを可能にする、
コンピュータプログラム。
【請求項２０】
前記少なくとも１つの非一時的コンピュータ使用可能媒体は、ディスク、テープ、又は他の磁気、光学、若しくは電子記憶媒体のセットから選択される、請求項１９に記載のコンピュータプログラム。
【発明の詳細な説明】
【背景技術】
【０００１】
関連出願の相互参照
本願は、以下の米国正規出願に関連し、それらの出願はそれぞれ全体が参照により本明細書に取り込まれる。
【０００２】
【表１】
2018092561.tif 000003
上記の正規出願はそれぞれ、以下の米国仮出願に基づく優先権を主張し、それらの出願はそれぞれ全体が参照により本明細書に取り込まれる。
【０００３】
【表２】
2018092561.tif 000004
本願は、以下の同時に出願された米国正規出願にも関連し、それらの出願はそれぞれ全体が参照により本明細書に取り込まれる。
【０００４】
【表３】
2018092561.tif 000005
【０００５】
近年、人工ニューラルネットワーク（ａｒｔｉｆｉｃｉａｌ  ｎｅｕｒａｌ  ｎｅｔｗｏｒｋ：ＡＮＮ）への関心が再び高まっており、そのような研究は、一般に、ディープラーニング、コンピュータ学習、及び同様の用語で呼称されている。汎用プロセッサの計算力が増大したことにより、数十年前に衰えた関心の復活がもたらされた。ＡＮＮの近年の応用例には、音声認識及び画像認識、その他が含まれる。ＡＮＮに関連する計算の性能と効率の向上を求める需要が増しているように思われる。
【図面の簡単な説明】
【０００６】
【図１】ニューラルネットワークユニット（ＮＮＵ）を含むプロセッサを図示するブロック図である。
【図２】図１のＮＰＵを図示するブロック図である。
【図３】図１のＮＮＵのＮ個のＮＰＵのＮ個のｍｕｘ−ｒｅｇの編成の一実施形態を図示するブロック図であって、図１のデータＲＡＭから受け取られるデータワードの行に対する、Ｎワード循環器又はサーキュラーシフタとしてのｍｕｘ−ｒｅｇの動作を図示する図である。
【図４】図１のＮＮＵのプログラムメモリに記憶されてＮＮＵによって実行されるプログラムを図示する表である。
【図５】ＮＮＵによる図４のプログラムの実行を図示するタイミング図である。
【図６Ａ】図４のプログラムを実行する図１のＮＮＵを図示するブロック図である。
【図６Ｂ】図４のプログラムによって行われるような、従来は人工ニューラルネットワークの隠れ層のニューロンに関連する積和活性化関数の計算を行うＮＮＵを使用するアーキテクチャプログラムを、図１のプロセッサが行う動作を図示するフローチャートである。
【図７】代替的な一実施形態による図１のＮＰＵを図示するブロック図である。
【図８】代替的な一実施形態による図１のＮＰＵを図示するブロック図である。
【図９】図１のＮＮＵのプログラムメモリに記憶されてＮＮＵによって実行されるプログラムを図示する表である。
【図１０】ＮＮＵによる図９のプログラムの実行を図示するタイミング図である。
【図１１】図１のＮＮＵの実施形態を図示するブロック図である。図１１の実施形態では、ニューロンが、活性化関数ユニット部分とＡＬＵ部分（シフトレジスタ部分も含む）の２つの部分に分割され、各活性化関数ユニット部分が複数のＡＬＵ部分に共有される。
【図１２】図１１のＮＮＵによる図４のプログラムの実行を図示するタイミング図である。
【図１３】図１１のＮＮＵによる図４のプログラムの実行を図示するタイミング図である。
【図１４】図１のＮＮＵの一部分に関する、ニューラルネットワークへ移動（ＭＴＮＮ）アーキテクチャ命令とその動作を図示するブロック図である。
【図１５】図１のＮＮＵの一部に関連する、ニューラルネットワークから移動（ＭＦＮＮ）アーキテクチャ命令とその動作を図示するブロック図である。
【図１６】図１のデータＲＡＭの一実施形態を図示するブロック図である。
【図１７】図１の重みＲＡＭ及びバッファの一実施形態を図示するブロック図である。
【図１８】図１の動的に構成可能なＮＰＵを図示するブロック図である。
【図１９】図１８の実施形態による図１のＮＮＵのＮ個ＮＰＵの２Ｎ個のｍｕｘ−ｒｅｇの編成の一実施形態を図示するブロック図であって、図１のデータＲＡＭから受け取られるデータワードの行に対する循環器としてのｍｕｘ−ｒｅｇの動作を図示する図である。
【図２０】図１８の実施形態によるＮＰＵを有する図１のＮＮＵのプログラムメモリに記憶され、ＮＮＵによって実行されるプログラムを図示する表である。
【図２１】ナロー構成で動作する図１８のＮＰＵを含むＮＮＵによる、図２０のプログラムの実行を図示するタイミング図である。
【図２２】図１８のＮＰＵを含んで図２０のプログラムを実行する図１のＮＮＵを図示するブロック図である。
【図２３】代替的な一実施形態による、図１の動的に構成可能なＮＰＵを図示するブロック図である。
【図２４】畳み込み演算を行うために図１のＮＮＵによって使用されるデータ構造の例を図示するブロック図である。
【図２５】図１のプロセッサが、ＮＮＵを使用するアーキテクチャプログラムを行って、畳み込みカーネルと図２４のデータ配列との畳み込みを行う動作を図示するフローチャートである。
【図２６Ａ】データ行列と図２４の畳み込みカーネルとの畳み込みを行い、それを重みＲＡＭに書き戻すＮＮＵプログラムのプログラムリストである。
【図２６Ｂ】一実施形態による図１のＮＮＵの制御レジスタの特定のフィールドを図示するブロック図である。
【図２７】プーリング演算が図１のＮＮＵによって行われる入力データを投入された、図１の重みＲＡＭの例を図示するブロック図である。
【図２８】図２７の入力データ行列のプーリング演算を行い、それを重みＲＡＭに書き戻すＮＮＵプログラムのプログラムリストである。
【図２９Ａ】図１の制御レジスタの一実施形態を図示するブロック図である。
【図２９Ｂ】代替的な一実施形態による図１の制御レジスタの一実施形態を図示するブロック図である。
【図２９Ｃ】一実施形態による、２つの部分として記憶される図２９Ａの逆数の一実施形態を図示するブロック図である。
【図３０】図２のＡＦＵの実施形態をより詳細に図示するブロック図である。
【図３１】図３０のＡＦＵの動作の例の図である。
【図３２】図３０のＡＦＵの動作の第２の例の図である。
【図３３】図３０のＡＦＵの動作の第３の例の図である。
【図３４】図１のプロセッサ、及び図１のＮＮＵのより詳細な部分を図示するブロック図である。
【図３５】可変レートのＮＮＵを含むプロセッサを図示するブロック図である。
【図３６Ａ】ＮＮＵが通常モード、すなわち基本クロックレートで動作している、プロセッサの動作の例を図示するタイミング図である。
【図３６Ｂ】ＮＮＵが緩和モード、すなわち基本クロックレート未満のレートで動作している、プロセッサの動作の例を図示するタイミング図である。
【図３７】図３５のプロセッサの動作を図示するフローチャートである。
【図３８】ＮＮＵのシーケンサをより詳細に図示するブロック図である。
【図３９】ＮＮＵの制御及び状態レジスタの特定のフィールドを図示するブロック図である。
【図４０】プロセッサを例示するブロック図である。
【図４１】より詳細な図４０のＮＮＵと図４０のリングストップとを図示するブロック図である。
【図４２】図４１のメモリアレイがＬＬＣスライスとして使用されるときのキャッシュメモリモードからＮＮＵの重み／データＲＡＭとして使用されるときのＮＮＵモードに移行される場合の、図４０のプロセッサの動作を図示するフローチャートである。
【図４３】図４１のメモリアレイがＮＮＵの重み／データＲＡＭとして使用されるときのＮＮＵモードからＬＬＣスライスとして使用されるときのキャッシュメモリモードに移行される場合の、図４０のプロセッサの動作を図示するフローチャートである。
【図４４】図４１のメモリアレイがＮＮＵの重み／データＲＡＭとして使用されるときのＮＮＵモードからビクティムキャッシュとして使用されるときのキャッシュメモリモードに移行される場合の、図４０のプロセッサの動作を図示するフローチャートである。
【図４５】図４１のメモリアレイがビクティムキャッシュとして使用されるときのキャッシュメモリモードからＮＮＵの重み／データＲＡＭとして使用されるときのＮＮＵモードに移行される場合の、図４０のプロセッサの動作を図示するフローチャートである。
【発明を実施するための形態】
【０００７】
アーキテクチャニューラルネットワークユニットを備えたプロセッサ
次いで図１を参照すると、ニューラルネットワークユニット（ＮＮＵ）１２１を含むプロセッサ１００を図示するブロック図が示される。プロセッサ１００は、命令取出しユニット１０１、命令キャッシュ１０２、及び命令トランスレータ１０４、リネームユニット１０６、リザベーションステーション１０８、メディアレジスタ１１８、汎用レジスタ（ＧＰＲ）１１６、ＮＮＵ１２１以外の実行ユニット１１２、並びにメモリサブシステム１１４を含む。
【０００８】
プロセッサ１００は、集積回路の中央演算処理装置（ＣＰＵ）として機能する電子デバイスである。プロセッサ１００は、デジタルデータを入力として受け取り、そのデータを、メモリから取り出された命令に従って処理し、命令によって規定される動作の結果を出力として生成する。プロセッサ１００は、デスクトップコンピュータ、モバイルコンピュータ、又はタブレットコンピュータで用いられることがあり、計算、テキスト編集、マルチメディアの表示、及びインターネットの閲覧などの用途に用いられる。プロセッサ１００は、組み込みシステムの中に配設されて、電気製品、携帯電話、スマートフォン、自動車、及び産業用制御デバイスを含む、幅広い種類のデバイスを制御することもある。ＣＰＵは、算術演算、論理演算、及び入出力動作を含む演算をデータに行うことにより、コンピュータプログラム（「コンピュータアプリケーション」又は「アプリケーション」とも呼ばれる）の命令を実行する電子回路（すなわち「ハードウェア」）である。集積回路（ＩＣ）は、半導体材料、通例はシリコンの小片上に作製される電子回路の組である。ＩＣは、チップ、マイクロチップ、又はダイとも呼ばれる。
【０００９】
命令取出しユニット１０１は、システムメモリ（図示せず）から命令キャッシュ１０２へのアーキテクチャ命令１０３の取り出しを制御する。命令取出しユニット１０１は、プロセッサ１００がアーキテクチャ命令バイトのキャッシュラインをそこから取り出して命令キャッシュ１０２に入れるメモリアドレスを指定する、命令キャッシュ１０２へのフェッチアドレスを提供する。フェッチアドレスは、プロセッサ１００の命令ポインタ（図示せず）、又はプログラムカウンタの現在の値に基づく。通常、プログラムカウンタは、命令の流れの中で分岐命令、呼び出し命令、若しくは戻り命令などの制御命令に遭遇しない限り、又は、割込み、トラップ、例外、若しくは障害などの例外条件が発生しない限り、命令のサイズずつ連続的に増分されて行き、上記制御命令又は例外条件の場合、プログラムカウンタは、分岐先アドレス、戻りアドレス、又は例外ベクトルなどの非連続的なアドレスで更新される。一般的に言って、プログラムカウンタは、実行ユニット１１２／１２１による命令の実行に応答して更新される。プログラムカウンタは、命令トランスレータ１０４がプロセッサ１００の命令セットアーキテクチャで定義されていない命令１０３に遭遇するなど、例外条件の検出に応答して更新される場合もある。
【００１０】
命令キャッシュ１０２は、プロセッサ１００に結合されたシステムメモリから取り出されたアーキテクチャ命令１０３をキャッシュする。アーキテクチャ命令１０３は、ニューラルネットワークへ移動（ｍｏｖｅ  ｔｏ  ｎｅｕｒａｌ  ｎｅｔｗｏｒｋ：ＭＴＮＮ：）命令及びニューラルネットワークから移動（ｍｏｖｅ  ｆｒｏｍ  ｎｅｕｒａｌ  ｎｅｔｗｏｒｋ：ＭＦＮＮ）命令を含み、これらについては下記でより詳細に説明する。一実施形態では、アーキテクチャ命令１０３は、ｘ８６命令セットアーキテクチャ（ＩＳＡ）の命令であり、ＭＴＮＮ及びＭＦＮＮ命令が追加されている。本開示の文脈では、ｘ８６ＩＳＡプロセッサは、Ｉｎｔｅｌ（登録商標）８０３８６（登録商標）プロセッサが同じ機械言語命令を実行するときに生成する同じ結果を命令セットアーキテクチャレベルで生成するプロセッサである。ただし、他の実施形態は、Ａｄｖａｎｃｅｄ  ＲＩＳＣ  Ｍａｃｈｉｎｅｓ（ＡＲＭ）（登録商標）、Ｓｕｎ  ＳＰＡＲＣ（登録商標）、又はＰｏｗｅｒＰＣ（登録商標）などの他の命令セットアーキテクチャを企図する。命令キャッシュ１０２は、アーキテクチャ命令１０３を命令トランスレータ１０４に提供し、命令トランスレータ１０４は、アーキテクチャ命令１０３をマイクロ命令１０５に翻訳する。
【００１１】
マイクロ命令１０５は、リネームユニット１０６に提供され、最終的に実行ユニット１１２／１２１によって実行される。マイクロ命令１０５は、アーキテクチャ命令を実装する。好ましくは、命令トランスレータ１０４は、頻繁に実行されるアーキテクチャ命令１０３及び／又は比較的複雑性の低いアーキテクチャ命令１０３をマイクロ命令１０５に翻訳する第１の部分を含んでいる。命令トランスレータ１０４は、マイクロコードユニット（図示せず）を含む第２の部分も含んでいる。マイクロコードユニットは、アーキテクチャ命令セットのうち複雑な命令及び／又はまれに使用される命令を実装するマイクロコード命令を保持するマイクロコードメモリを備える。マイクロコードユニットは、非アーキテクチャマイクロプログラムカウンタ（マイクロＰＣ）をマイクロコードメモリに提供するマイクロシーケンサも備える。好ましくは、マイクロコード命令は、マイクロトランスレータ（図示せず）によってマイクロ命令１０５に翻訳される。マイクロコードユニットが現在制御権を有するか否かに依存して、セレクタが、マイクロ命令１０５を、第１の部分又は第２の部分のどちらかから、リネームユニット１０６に提供するために選択する。
【００１２】
リネームユニット１０６は、アーキテクチャ命令１０３の中で指定されるアーキテクチャレジスタを、プロセッサ１００の物理レジスタにリネーミングする。好ましくは、プロセッサ１００は、リオーダバッファ（図示せず）を備える。リネームユニット１０６は、プログラムの順序で、リオーダバッファ内のエントリを各マイクロ命令１０５に割り振る。それにより、プロセッサ１００は、マイクロ命令１０５とそれらに対応するアーキテクチャ命令１０３をプログラムの順序でリタイアできるようになる。一実施形態では、メディアレジスタ１１８は２５６ビット幅であり、ＧＰＲ１１６は６４ビット幅である。一実施形態では、メディアレジスタ１１８は、高度ベクトル拡張（Ａｄｖａｎｃｅｄ  Ｖｅｃｔｏｒ  Ｅｘｔｅｎｓｉｏｎｓ：ＡＶＸ）レジスタなどのｘ８６メディアレジスタである。
【００１３】
一実施形態では、リオーダバッファの各エントリは、マイクロ命令１０５の結果のための記憶域を含む。加えて、プロセッサ１００はアーキテクチャレジスタファイルを備え、アーキテクチャレジスタファイルは、アーキテクチャレジスタ、例えば、メディアレジスタ１１８及びＧＰＲ１１６及び他のアーキテクチャレジスタ、の各々に対応する物理レジスタを含む。（好ましくは、例えば、メディアレジスタ１１８とＧＰＲ１１６はサイズが異なるため、それらに別個のレジスタファイルがある。）アーキテクチャレジスタを指定するマイクロ命令１０５の各ソースオペランドに対して、リネームユニットは、マイクロ命令１０５のソースオペランドフィールドに、そのアーキテクチャレジスタに書き込みをする古いマイクロ命令１０５のうち最も新しいもののリオーダバッファ索引を投入する。実行ユニット１１２／１２１がマイクロ命令１０５の実行を完了すると、実行ユニット１１２／１２１は、結果をマイクロ命令１０５のリオーダバッファエントリに書き込む。マイクロ命令１０５がリタイアする時、リタイアユニット（図示せず）が、結果を、マイクロ命令のリオーダバッファエントリから、リタイアするマイクロ命令１０５によって指定されるアーキテクチャ宛先レジスタに関連付けられた物理レジスタファイルのレジスタに書き込む。
【００１４】
別の実施形態では、プロセッサ１００は、アーキテクチャレジスタの数よりも多い物理レジスタを含む物理レジスタファイルを備えるが、アーキテクチャレジスタファイルを含まず、リオーダバッファエントリは、結果の記憶域を含まない。（好ましくは、例えば、メディアレジスタ１１８とＧＰＲ１１６はサイズが異なるため、それらに別個の物理レジスタファイルがある。）プロセッサ１００は、アーキテクチャレジスタごとに関連付けられたポインタを持つポインタテーブルも備える。アーキテクチャレジスタを指定するマイクロ命令１０５のオペランドに対して、リネームユニットは、マイクロ命令１０５中の宛先オペランドフィールドに、物理レジスタファイル内の空きレジスタに対するポインタを投入する。物理レジスタファイルに空いているレジスタがない場合、リネームユニット１０６はパイプラインをストールする（stalls）。アーキテクチャレジスタを指定するマイクロ命令１０５の各ソースオペランドについて、リネームユニットは、マイクロ命令１０５中のソースオペランドフィールドに、そのアーキテクチャレジスタに書き込みをする古いマイクロ命令１０５のうち最も新しいものに割り当てられた物理レジスタファイル内のレジスタに対するポインタを投入する。実行ユニット１１２／１２１がマイクロ命令１０５の実行を完了すると、実行ユニット１１２／１２１は、マイクロ命令１０５の宛先オペランドフィールドによってポイントされる物理レジスタファイルのレジスタに結果を書き込む。マイクロ命令１０５がリタイアする時、リタイアユニットは、マイクロ命令１０５の宛先オペランドフィールド値を、リタイアするマイクロ命令１０５によって指定されるアーキテクチャ宛先レジスタに関連付けられたポインタテーブル内のポインタにコピーする。
【００１５】
リザベーションステーション１０８は、マイクロ命令１０５が実行のために実行ユニット１１２／１２１に発行できる状態になるまで、マイクロ命令１０５を保持する。マイクロ命令１０５が発行できる状態になるのは、そのソースオペランドがすべて利用可能になり、実行のために実行ユニット１１２／１２１が利用できるときである。実行ユニット１１２／１２１は、上記で説明された第１の実施形態ではリオーダバッファ若しくはアーキテクチャレジスタファイルから、又は第２の実施形態では物理レジスタファイルから、レジスタソースオペランドを受け取る。加えて、実行ユニット１１２／１２１は、実行ユニット１１２／１２１から直接、結果転送バス（図示せず）を介してレジスタソースオペランドを受け取ることもできる。加えて、実行ユニット１１２／１２１は、リザベーションステーション１０８から、マイクロ命令１０５によって指定される即値オペランドを受け取ることができる。下記でより詳細に論じるように、ＭＴＮＮ及びＭＦＮＮアーキテクチャ命令１０３は、ＭＴＮＮ及びＭＦＮＮアーキテクチャ命令１０３が翻訳された１つ又は複数のマイクロ命令１０５の１つで提供される、ＮＮＵ１２１によって行われるべき関数を指定する即値オペランドを含む。
【００１６】
実行ユニット１１２は、メモリサブシステム１１４からデータをロードし及びデータをメモリサブシステム１１４に記憶する１つ又は複数のロード／記憶ユニット（図示せず）を備える。好ましくは、メモリサブシステム１１４は、メモリ管理ユニット（図示せず）を備え、メモリ管理ユニットは、例えば、トランスレーションルックアサイドバッファ及びテーブルウォークユニット、レベル１データキャッシュ（及び命令キャッシュ１０２）、レベル２ユニファイドキャッシュ、並びに、プロセッサ１００とシステムメモリとの間のインターフェースをとるバスインターフェースユニットを含むことができる。一実施形態では、図１のプロセッサ１００は、ラストレベルキャッシュメモリを共有するマルチコアプロセッサ内の複数の処理コアの１つである処理コアを表している。実行ユニット１１２は、整数ユニット、メディアユニット、浮動小数点ユニット、及び分岐ユニットも含むことができる。
【００１７】
ＮＮＵ１２１は、重みランダムアクセスメモリ（ＲＡＭ）１２４、データＲＡＭ１２２、Ｎ個のニューラル処理ユニット（ＮＰＵ）１２６、プログラムメモリ１２９、シーケンサ１２８、並びに制御及び状態レジスタ１２７を含む。ＮＰＵ１２６は、概念的には神経回路網内のニューロンとして機能する。重みＲＡＭ１２４、データＲＡＭ１２２、及びプログラムメモリ１２９はすべて、ＭＴＮＮ及びＭＦＮＮアーキテクチャ命令１０３を介して、それぞれ、書き込み及び読み出しが可能である。重みＲＡＭ１２４は、Ｎ個の重みワードのＷ個の行として編成され（arranged）、データＲＡＭ１２２はＮ個のデータワードのＤ個の行として編成される。各データワード及び各重みワードは、複数ビットであり、好ましくは、８ビット、９ビット、１２ビット、又は１６ビットである。各データワードは、ネットワーク内の前の層のニューロンの出力値（活性化と呼ばれることもある）として機能し、各重みワードは、ネットワークの当該層のニューロンに入ってくる接続に関連付けられた重みとして機能する。ＮＮＵ１２１の使用例の多くでは、重みＲＡＭ１２４に保持されているワード又はオペランドは、実際にニューロンに入ってくる接続に関連付けられた重みであるが、ＮＮＵ１２１の他の使用例では、重みＲＡＭ１２４に保持されるワードは重みではなく、それにもかかわらず、重みＲＡＭ１２４に記憶されることから「重みワード」と呼ばれることを理解されたい。例えば、ＮＮＵ１２１の使用例によっては、例えば図２４〜図２６Ａの畳み込みの例や図２７〜図２８のプーリングの例では、重みＲＡＭ１２４は、データ行列の要素、例えば画像画素データなど、重み以外を保持することもある。同様に、ＮＮＵ１２１の使用例の多くでは、データＲＡＭ１２２に保持されるワード又はオペランドは、実際にニューロンの出力値又は活性化であるが、ＮＮＵ１２１の他の使用例では、データＲＡＭ１２２に保持されるワードはそのようなものではなく、それにもかかわらず、データＲＡＭ１２２に記憶されることから「データワード」と呼ばれることを理解されたい。例えば、ＮＮＵ１２１の使用例によっては、例えば図２４〜図２６Ａの畳み込みの例では、データＲＡＭ１２２は、畳み込みカーネルの要素など、ニューロン出力以外を保持することもある。
【００１８】
一実施形態では、ＮＰＵ１２６及びシーケンサ１２８は、組み合わせ論理、順序論理、ステートマシン、又はそれらの組み合わせを含む。アーキテクチャ命令（例えば、ＭＦＮＮ命令１５００）は、状態レジスタ１２７の内容をＧＰＲ１１６の１つにロードして、ＮＮＵ１２１のステータス、例えば、ＮＮＵ１２１がコマンドを完了したこと、若しくはＮＮＵ１２１がプログラムメモリ１２９から稼働させていたプログラムを完了したこと、又はＮＮＵ１２１が、新しいコマンドを受け取るか若しくは新しいＮＮＵプログラムを開始するのに空いていることを決定する。
【００１９】
有利な点として、ＮＰＵ１２６の数は必要に応じて増やすことができ、それに応じて、重みＲＡＭ１２４及びデータＲＡＭ１２２のサイズを幅及び深さの両方で拡張することができる。好ましくは、重みＲＡＭ１２４の方が大きい。それは、典型的なニューラルネットワーク層には各ニューロンに関連付けられた多数の接続と、したがって多数の重みがあるためである。データワード及び重みワードのサイズ、並びに重みＲＡＭ１２４及びデータＲＡＭ１２２のサイズ、並びにＮＰＵ１２６の数に関して、様々な実施形態が本明細書に記載される。一実施形態では、６４ＫＢ（８１９２ビット×６４行）のデータＲＡＭ１２２、２ＭＢ（８１９２ビット×２０４８行）の重みＲＡＭ１２４、及び５１２個のＮＰＵ１２６を持つＮＮＵ１２１が、台湾セミコンダクターマニュファクチュアリングカンパニー（Ｔａｉｗａｎ  Ｓｅｍｉｃｏｎｄｕｃｔｏｒ  Ｍａｎｕｆａｃｔｕｒｉｎｇ  Ｃｏｍｐａｎｙ，Ｌｉｍｉｔｅｄ：ＴＳＭＣ）の１６ｎｍプロセスで実装され、約３．３ｍｍ２の面積を占める。
【００２０】
シーケンサ１２８は、プログラムメモリ１２９から命令を取り出して実行し、これは、とりわけ、データＲＡＭ１２２、重みＲＡＭ１２４及びＮＰＵ１２６に提供するアドレス及び制御信号を生成することを含む。シーケンサ１２８は、Ｎ個のＮＰＵ１２６に対して提供されるＮ個のデータワードのＤ個の行のうち１つを選択するための、データＲＡＭ１２２に提供されるメモリアドレス１２３及び読み出しコマンドを生成する。シーケンサ１２８は、Ｎ個のＮＰＵ１２６に対して提供されるＮ個の重みワードのＷ個の行のうち１つを選択するための、重みＲＡＭ１２４に提供されるメモリアドレス１２５及び読み出しコマンドをさらに生成する。ＮＰＵ１２６に対する提供のためにシーケンサ１２８によって生成されるアドレス１２３と１２５の順番が、ニューロン間の「つながり」を決定する。シーケンサ１２８は、Ｎ個のＮＰＵ１２６から書き込みされるＮ個のデータワードのＤ個の行のうち１つを選択するための、データＲＡＭ１２２に提供されるメモリアドレス１２３及び書き込みコマンドをさらに生成する。シーケンサ１２８は、Ｎ個のＮＰＵ１２６から書き込みされるＮ個の重みワードのＷ個の行のうち１つを選択するための、重みＲＡＭ１２４に提供されるメモリアドレス１２５及び書き込みコマンドをさらに生成する。シーケンサ１２８は、下記で説明するように、シーケンサ１２８に提供されるＮＮＵ命令を選択するための、プログラムメモリ１２９に対するメモリアドレス１３１をさらに生成する。メモリアドレス１３１は、シーケンサ１２８がループ命令（例えば、図２６Ａを参照されたい）などの制御命令に遭遇しない限り、シーケンサ１２８がプログラムメモリ１２９の連続した場所を通じて一般に増分するプログラムカウンタ（図示せず）に対応している。制御命令に遭遇した場合、シーケンサ１２８は、プログラムカウンタを制御命令の目標アドレスに更新する。シーケンサ１２８は、ＮＰＵ１２６に対する制御信号をさらに生成して、各種の動作又は機能を行うようにＮＰＵ１２６に命令し、そのような動作又は機能には、初期化、算術演算／論理演算、循環（rotate）及びシフト演算、活性化関数、並びに書き戻し動作（write  back  operations）等があり、その例は下記でより詳細に説明する（例えば、図３４のマイクロ操作（micro-operations）３４１８を参照されたい）。
【００２１】
ＮＰＵ１２６は、Ｎ個の結果ワード１３３を生成し、それらは、重みＲＡＭ１２４の行又はデータＲＡＭ１２２に書き戻すことができる。好ましくは、重みＲＡＭ１２４及びデータＲＡＭ１２２は、Ｎ個のＮＰＵ１２６に直接結合されている。より具体的には、重みＲＡＭ１２４及びデータＲＡＭ１２２は、ＮＰＵ１２６に専用であり、プロセッサ１００のその他の実行ユニット１１２によって共有されず、ＮＰＵ１２６は、重みＲＡＭ１２４とデータＲＡＭ１２２の一方又は両方の行を、クロックサイクルごとに持続的な形で、好ましくはパイプライン方式で消費することができる。一実施形態では、データＲＡＭ１２２及び重みＲＡＭ１２４は各々、各クロックサイクルに８１９２ビットをＮＰＵ１２６に提供することができる。８１９２ビットは、下記でより詳細に説明するように、５１２個の１６ビットワード又は１０２４個の８ビットワードとして消費されることが可能である。
【００２２】
有利な点として、ＮＮＵ１２１によって処理できるデータセットのサイズは、重みＲＡＭ１２４及びデータＲＡＭ１２２のサイズに制限されるのではなく、システムメモリのサイズによってのみ制限される。これは、データ及び重みが、ＭＴＮＮ命令及びＭＦＮＮ命令を使用して（例えば、メディアレジスタ１１８を通じて）、システムメモリとＲＡＭ１２４及びデータＲＡＭ１２２との間で移動されることがあるためである。一実施形態では、データＲＡＭ１２２はデュアルポートであって、データワードが同時にデータＲＡＭ１２２から読み出され又はデータＲＡＭ１２２に書き込まれる間に、データワードがデータＲＡＭ１２２に書き込まれることを可能にする。さらに、キャッシュメモリを含むメモリサブシステム１１４の大規模なメモリ階層が、システムメモリとＮＮＵ１２１との間の伝達に非常に高いデータ帯域幅を提供する。さらには、好ましくは、メモリサブシステム１１４は、ハードウェアデータプリフェッチャを含み、これは、システムメモリからのニューラルデータや重みのロードなどのメモリアクセスパターンを追跡し、キャッシュ階層へのデータのプリフェッチを行って、重みＲＡＭ１２４及びデータＲＡＭ１２２に対する高帯域幅及び低レイテンシ伝達を容易にする。
【００２３】
各ＮＰＵ１２６に提供されるオペランドの１つが重みメモリから提供され、それが重みと表される実施形態が記載され、これはニューラルネットワークで広く使用されるが、オペランドは、記載される装置によって速度が向上する可能性のある算出に関連する他タイプのデータであってもよいことを理解されたい。
【００２４】
次いで図２を参照すると、図１のＮＰＵ１２６を図示するブロック図が示される。ＮＰＵ１２６は、多くの機能又は演算を行うように動作する。詳細には、有利な点として、ＮＰＵ１２６は、人工ニューラルネットワーク内のニューロン又はノードとして動作して、典型的な積和（multiply-accumulate）関数又は演算を行うように構成される。すなわち、一般的に言って、ＮＰＵ１２６（ニューロン）は次のように構成される。（１）自身への接続を持つ各ニューロンから、必ずしもそうとは限らないが通例は人工ニューラルネットワークのすぐ前の層から、入力値を受け取り、（２）各入力値を、その接続に関連付けられた対応する重み値で乗算して積を生成し、（３）すべての積を加算して和を生成し、（４）この和に活性化関数を行って、上記ニューロンの出力を生成する。しかし、従来のようにすべての接続入力に関連するすべての乗算を行ってからすべての積を一緒に加算するのではなく、有利な点として、各ニューロンは、所与のクロックサイクルにおいて、接続入力の１つに関連付けられた重みの乗算演算を行ってから、その積を、その時点までの前のクロックサイクル中に処理された接続入力に関連する積の累算値と加算（累算）するように構成される。ニューロンへの接続がＭ個あると仮定すると、Ｍ個の積すべてが累算された後（これは約Ｍクロックサイクルを要する）、ニューロンが活性化関数を累算された値に行って、出力又は結果を生成する。これには、ニューロン中で、より少ない乗算器と、すべての接続入力に関連付けられた積のすべて又はサブセットさえを加算するのに必要とされるであろう加算器よりもより小さい、より単純な、及びより高速な加算器回路（例えば、２入力の加算器）とで済むという利点がある。このことは、ひいては、ＮＮＵ１２１内におけるかなり多くの数（Ｎ）のニューロン（ＮＰＵ１２６）を容易にするという利点があり、そのため、約Ｍクロックサイクルの後、ＮＮＵ１２１は、多数（Ｎ個）のニューロンのすべてに対して出力を生成している。最後に、そのようなニューロンで組織されるＮＮＵ１２１は、多数の異なる接続入力に対する人工ニューラルネットワーク層として効率的に働くという利点がある。すなわち、Ｍが異なる層について増加又は減少すると、ニューロンの出力を生成するために必要とされるクロックサイクル数がそれに応じて増加又は減少し、リソース（例えば、乗算器や累算器）が最大限に利用される。それに対して、より従来型の設計では、より小さい値のＭについて、乗算器のうちいくつかと加算器の一部分とが利用されないことがある。そのため、本明細書に記載される実施形態は、ＮＮＵ１２１のニューロンへの接続入力の数に関して柔軟性及び効率の利益を有し、極めて高い性能を提供する。
【００２５】
ＮＰＵ１２６は、レジスタ２０５、２入力多重化レジスタ（ｍｕｘ−ｒｅｇ）２０８、算術論理ユニット（ＡＬＵ）２０４、累算器２０２、及び活性化関数ユニット（ＡＦＵ）２１２を備える。レジスタ２０５は、重みＲＡＭ１２４から重みワード２０６を受け取り、出力２０３を後のクロックサイクルで提供する。ｍｕｘ−ｒｅｇ２０８は、入力２０７又は２１１の一方を選択して自身のレジスタに記憶し、それから出力２０９において後のクロックサイクルで提供する。一方の入力２０７は、データＲＡＭ１２２からデータワードを受け取る。他方の入力２１１は、隣接するＮＰＵ１２６の出力２０９を受け取る。図２に示すＮＰＵ１２６は、図１のＮ個のＮＰＵ１２６のうちのＮＰＵ  Ｊと表される。すなわち、ＮＰＵ  Ｊは、Ｎ個のＮＰＵ１２６の代表事例である。好ましくは、ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ２０８の入力２１１は、ＮＰＵ１２６のインスタンスＪ−１のｍｕｘ−ｒｅｇ２０８の出力２０９を受け取り、ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ２０８の出力２０９は、ＮＰＵ１２６のインスタンスＪ＋１のｍｕｘ−ｒｅｇ２０８の入力２１１に提供される。このようにして、Ｎ個のＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８は、図３に関して下記でより詳細に説明するように、Ｎワードの循環器（rotater）又はサーキュラーシフタ（circular  shifter）として集合的に動作する。制御入力２１３は、２つの入力のうちいずれをｍｕｘ−ｒｅｇ２０８が選択して自身のレジスタに記憶し、それが後に出力２０９で提供されるかを、制御する。
【００２６】
ＡＬＵ２０４は３つの入力を有する。１つの入力は、レジスタ２０５から重みワード２０３を受け取る。別の入力は、ｍｕｘ−ｒｅｇ２０８の出力２０９を受け取る。もう１つの入力は、累算器２０２の出力２１７を受け取る。ＡＬＵ２０４は、入力に算術演算及び／又は論理演算を行って、出力で提供される結果を生成する。好ましくは、ＡＬＵ２０４によって行われる算術演算及び／又は論理演算は、プログラムメモリ１２９に記憶された命令によって指定される。例えば、図４の積和命令は、積和演算を指定し、すなわち、結果２１５は、累算器２０２の値２１７と、重みワード２０３とｍｕｘ−ｒｅｇ２０８の出力２０９のデータワードとの積と、の和になる。指定されることが可能な他の演算には、これらに限定されないが以下が含まれる。結果２１５が、ｍｕｘ−ｒｅｇ出力２０９のパススルーされた値である；結果２１５が、重みワード２０３のパススルーされた値である；結果２１５がゼロである；結果２１５が、重みワード２０３のパススルーされた値である；結果２１５が、累算器２０２の値２１７と重みワード２０３との和である；結果２１５が、累算器２０２の値２１７とｍｕｘ−ｒｅｇ出力２０９との和である；結果２１５が、累算器２０２の値２１７と重みワード２０３とのうちの最大値である；結果２１５が、累算器２０２の値２１７とｍｕｘ−ｒｅｇ出力２０９とのうちの最大値である。
【００２７】
ＡＬＵ２０４は、出力２１５を、累算器２０２における記憶のために累算器２０２に提供する。ＡＬＵ２０４は、乗算器２４２を含み、乗算器２４２は、重みワード２０３とｍｕｘ−ｒｅｇ２０８の出力２０９のデータワードとを乗算して積２４６を生成する。一実施形態では、乗算器２４２は、２つの１６ビットオペランドを乗算して３２ビットの結果を生成する。ＡＬＵ２０４は、加算器２４４をさらに含み、加算器２４４は、積２４６を累算器２０２の出力２１７に加算して和を生成する。この和は、累算器２０２に記憶するために累算器２０２に累算される結果２１５である。一実施形態では、加算器２４４は、乗算器２４２の３２ビットの結果を累算器２０２の４１ビット値２１７に加算して４１ビットの結果を生成する。このようにして、複数のクロックサイクルの経過にわたってｍｕｘ−ｒｅｇ２０８の循環器態様を使用して、ＮＰＵ１２６は、ニューラルネットワークにより必要とされるとおり、ニューロンについての積の総計を達成する。ＡＬＵ２０４は、上記のような他の算術演算／論理演算を行う他の回路要素も含むことができる。一実施形態では、第２の加算器が、ｍｕｘ−ｒｅｇ２０８の出力２０９のデータワードから重みワード２０３を引いて差を生成し、次いで、この差を加算器２４４が累算器２０２の出力２１７に加算して和２１５を生成し、この和２１５が累算器２０２に累算される結果である。このようにして、複数のクロックサイクルの経過にわたり、ＮＰＵ１２６は差の総計を達成することができる。好ましくは、重みワード２０３とデータワード２０９とは（ビット単位で）同じサイズであるが、下記でより詳細に説明するように、これらは異なる２進小数点の場所を有することができる。好ましくは、乗算器２４２及び加算器２４４は、下記でより詳細に説明するように整数乗算器及び整数加算器であって、浮動小数点の乗算器や加算器よりもあまり複雑でない、より小さい、より高速な、及びより低電力消費のＡＬＵ２０４を有利に達成する。ただし、他の実施形態ではＡＬＵ２０４は浮動小数点演算を行うことを理解されたい。
【００２８】
図２は、ＡＬＵ２０４の中に乗算器２４２及び加算器２４４のみを示しているが、好ましくは、ＡＬＵ２０４は、上記の他の演算を行う他の要素を含む。例えば、好ましくは、ＡＬＵ２０４は、累算器２０２をデータワード／重みワードと比較する比較器（図示せず）、及び、比較器によって指示される２つの値のうち大きい方の値（最大値）を累算器２０２に記憶するために選択するｍｕｘ（図示せず）を含む。別の例として、好ましくは、ＡＬＵ２０４は選択論理（図示せず）を含み、この選択論理は、データワード／重みワードに関して乗算器２４２を迂回して、加算器２４４がそのデータワード／重みワードを累算器２０２の値２１７に加算して、累算器２０２に記憶するための和を生成できるようにする。そのような追加的な動作については下記で例えば図１８〜図２９Ａに関連してより詳細に説明され、例えば畳み込み演算及びプーリング演算を行うために有用である可能性がある。
【００２９】
ＡＦＵ２１２は、累算器２０２の出力２１７を受け取る。ＡＦＵ２１２は、累算器２０２の出力２１７に活性化関数を行って、図１の結果１３３を生成する。一般的に言って、人工ニューラルネットワークの中間層のニューロン内の活性化関数は、累算された積の和を、好ましくは非線形的に、基準化する（normalize）働きをすることができる。累算された和を「基準化」するために、当該ニューロンの活性化関数は、当該ニューロンに接続されたニューロンが入力として受け取ることを予期する値の範囲内で結果値を作り出す。（基準化された結果は「活性化」と呼ばれることがあり、活性化は、本明細書に記載されるように、当該ノードの出力であり、その出力を、受信側ノードが、出力側ノードと受信側ノードとの間の接続に関連付けられた重みで乗算して積を生成し、その積が、受信側ノードへのその他の入力接続に関連する他の積と共に累算される。）例えば、受信するニューロン／接続されたニューロンは、入力として０と１の間の値を受け取ることを予期する場合があり、その場合、出力側のニューロンは、０から１の範囲の外側にある累算された和を、予期される範囲内の値に、非線形的に押し込め及び／又は調節する必要があり得る（例えば、負の値を正の値に変容させる上方シフト）。そのため、ＡＦＵ２１２は、累算器２０２の値２１７に演算を行って、結果１３３を既知の範囲内にする。Ｎ個のＮＰＵ１２６すべての結果１３３が、同時にデータＲＡＭ１２２又は重みＲＡＭ１２４のどちらかに書き戻されることが可能である。好ましくは、ＡＦＵ２１２は、複数の活性化関数を行うように構成され、入力、例えば制御レジスタ１２７からのものが、累算器２０２の出力２１７に行うべき活性化関数のうち１つを選択する。活性化関数には、これらに限定されないが、ステップ関数、正規化関数（rectify  function）、シグモイド関数、ハイパーボリックタンジェント（ｔａｎｈ）関数、及びソフトプラス関数（平滑正規化とも呼ばれる）が含まれる可能性がある。ソフトプラス関数は、分析関数ｆ（ｘ）＝ｌｎ（１＋ｅｘ）であり、すなわち、１とｅｘとの和の自然対数であり、「ｅ」はオイラー数であり、ｘはこの関数への入力２１７である。好ましくは、活性化関数は、下記でより詳細に説明するように、累算器２０２の値２１７又はその一部分をパススルーするパススルー関数をさらに含む場合がある。一実施形態では、ＡＦＵ２１２の回路は、１クロックサイクル内に活性化関数を行う。一実施形態では、ＡＦＵ２１２は表を備え、これらの表は、累算された値を受け取り、活性化関数のうちいくつか、例えばシグモイド、ハイパーボリックタンジェント、ソフトプラスについて、本物の活性化関数が提供するであろう値に密接に近似した値を出力する。
【００３０】
好ましくは、累算器２０２の幅（ビット単位）は、ＡＦＵ２１２の出力１３３の幅より大きい。例えば、一実施形態では、累算器は４１ビット幅であって、最大で５１２個の３２ビット積の累算における精度の損失を回避し（下記で例えば図３０に関連してより詳細に説明する）、結果１３３は１６ビット幅である。図８に関連して下記でより詳細にその一例が説明される一実施形態では、連続するクロックサイクル中に、「未処理の（raw）」累算器２０２の出力２１７値の種々の部分が、ＡＦＵ２１２をパススルーされ、データＲＡＭ１２２又は重みＲＡＭ１２４に書き戻される。これにより、未処理の累算器２０２値が、ＭＦＮＮ命令を介してメディアレジスタ１１８に再びロードされることが可能になり、そのため、プロセッサ１００の他の実行ユニット１１２で実行される命令が、ＡＦＵ２１２が行うことのできない複雑な活性化関数を行うことができ、そのような活性化関数には、基準化指数関数とも呼ばれる、よく知られたソフトマックス活性化関数などがある。一実施形態では、プロセッサ１００の命令セットアーキテクチャは、一般にｅｘ又はｅｘｐ（ｘ）と呼ばれる指数関数を行う命令を含み、これを使用してプロセッサ１００の他の実行ユニット１１２によるソフトマックス活性化関数の実行の速度を上げることができる。
【００３１】
一実施形態では、ＮＰＵ１２６はパイプライン化される。例えば、ＮＰＵ１２６は、ＡＬＵ２０４の乗算器及び加算器及び／又は他の回路の間のレジスタなどの、ＡＬＵ２０４のレジスタと、ＡＦＵ２１２の出力を保持するレジスタとを含むことができる。ＮＰＵ１２６の他の実施形態は、下記で説明する。
【００３２】
次いで図３を参照すると、図１のＮＮＵ１２１のＮ個のＮＰＵ１２６のＮ個のｍｕｘ−ｒｅｇ２０８の編成（arrangement）の実施形態を図示するブロック図が示され、これは、図１のデータＲＡＭ１２２から受け取られるデータワード２０７の行に対する、Ｎワード循環器又はサーキュラーシフタとしてのｍｕｘ−ｒｅｇ２０８の動作を図示している。図３の実施形態では、Ｎは５１２であり、そのため、ＮＮＵ１２１は、示されるように、５１２個のＮＰＵ１２６に対応する、０〜５１１と表される５１２個のｍｕｘ−ｒｅｇ２０８を有する。各ｍｕｘ−ｒｅｇ２０８は、データＲＡＭ１２２のＤ個の行のうち１つの行からなる、自身の対応するデータワード２０７を受け取る。すなわち、ｍｕｘ−ｒｅｇ０は、データＲＡＭ１２２の行のデータワード０を受け取り、ｍｕｘ−ｒｅｇ１は、データＲＡＭ１２２の行のデータワード１を受け取り、ｍｕｘ−ｒｅｇ２は、データＲＡＭ１２２の行のデータワード２を受け取り、以下同様に続き、ｍｕｘ−ｒｅｇ５１１は、データＲＡＭ１２２の行のデータワード５１１を受け取る。さらに、ｍｕｘ−ｒｅｇ１は、他の入力２１１上でｍｕｘ−ｒｅｇ０の出力２０９を受け取り、ｍｕｘ−ｒｅｇ２は、他の入力２１１上でｍｕｘ−ｒｅｇ１の出力２０９を受け取り、ｍｕｘ−ｒｅｇ３は、他の入力２１１上でｍｕｘ−ｒｅｇ２の出力２０９を受け取り、以下同様に続き、ｍｕｘ−ｒｅｇ５１１は、他の入力２１１上でｍｕｘ−ｒｅｇ５１０の出力２０９を受け取り、ｍｕｘ−ｒｅｇ０は、他の入力２１１上でｍｕｘ−ｒｅｇ５１１の出力２０９を受け取る。ｍｕｘ−ｒｅｇ２０８の各々は、データワード２０７を選択するか循環された入力２１１を選択するかを制御する制御入力２１３を受け取る。下記でより詳細に説明するように、ある動作モードでは、最初のクロックサイクルで、制御入力２１３は、レジスタ内における記憶のため及びＡＬＵ２０４に対する後の提供のためにデータワード２０７を選択するようにｍｕｘ−ｒｅｇ２０８の各々を制御し、後のクロックサイクル（例えば、上記のようにＭ−１のクロックサイクル）中は、制御入力２１３は、レジスタ内における記憶のため及びＡＬＵ２０４に対する後の提供のために、循環された入力２１１を選択するようにｍｕｘ−ｒｅｇ２０８の各々を制御する。
【００３３】
図３（並びに下記の図７及び図１９）は、ＮＰＵ１２６がｍｕｘ−ｒｅｇ２０８／７０５の値を右に、すなわちＮＰＵ  ＪからＮＰＵ  Ｊ＋１に循環させるように構成される実施形態を説明しているが、ＮＰＵ１２６がｍｕｘ−ｒｅｇ２０８／７０５の値を左に、すなわちＮＰＵ  ＪからＮＰＵ  Ｊ−１に循環させるように構成される実施形態（図２４〜図２６の実施形態に関するものなど）が企図される。さらに、ＮＰＵ１２６が、例えばＮＮＵ命令の命令により指定されるとおり、ｍｕｘ−ｒｅｇ２０８／７０５の値を選択的に左又は右に循環させるように構成される実施形態が企図される。
【００３４】
次いで図４を参照すると、図１のＮＮＵ１２１のプログラムメモリ１２９に記憶されてＮＮＵ１２１によって実行されるプログラムを図示する表が示される。この例示的プログラムは、上記のような人工ニューラルネットワークの層に関連する算出を行う。図４の表には、４つの行及び３つの列が示される。各行は、第１の列に表されるプログラムメモリ１２９のアドレスに対応している。第２の列は命令を指定し、第３の列は、その命令に伴うクロックサイクル数を指示する。好ましくは、クロックサイクル数は、命令のレイテンシではなく、パイプライン化された実施形態における命令当たりクロック（clocks-per-instruction）型の値で有効クロック数を指示する。図示されるように、命令の各々は、ＮＮＵ１２１のパイプライン化された性質に起因して、関連付けられた１クロックサイクルを有し、アドレス２における命令は例外であり、この命令は、下記でより詳細に説明するように、該命令が自身を実際上５１１回繰り返すため、５１１クロックを必要とする。
【００３５】
プログラムの各命令について、ＮＰＵ１２６のすべてが該命令を並列に行う。すなわち、すべてのＮ個のＮＰＵ１２６が、同じクロックサイクルに１番目の行の命令を行い、すべてのＮ個のＮＰＵ１２６が同じクロックサイクルに２番目の行の命令を行い、以下同様に続く。ただし、命令の一部が部分的に並列で部分的に順次なやり方で行われる他の実施形態が下記に記載され、例えば、ＮＰＵ１２６が活性化関数ユニットを共有する実施形態におけるアドレス３及び４の活性化関数及び出力命令であり、例えば図１１の実施形態に関連する。図４の例は、１つの層に５１２個のニューロン（ＮＰＵ１２６）があり、各々が、前の層の５１２個のニューロンからの５１２個の接続入力を有し、合計で２５６Ｋ個の接続があると仮定している。各ニューロンは、各接続入力から１６ビットのデータ値を受け取り、その１６ビットのデータ値に適切な１６ビットの重み値を乗算する。
【００３６】
アドレス０（ただし他のアドレスが指定されることもある）にある１番目の行は、ＮＰＵ初期化命令を指定する。初期化命令は、累算器２０２の値をゼロにクリアする。一実施形態では、初期化命令は、この命令によってアドレスが指定されるデータＲＡＭ１２２又は重みＲＡＭ１２４の行の対応するワードを、累算器２０２にロードすることを指定することもできる。初期化命令は、図２９Ａ及び図２９Ｂに関して下記でより詳細に説明するように、構成値を制御レジスタ１２７にさらにロードする。例えば、データワード２０７と重みワード２０９の幅をロードすることができ、その幅がＡＬＵ２０４によって使用されて、回路によって行われる演算のサイズを決定することができ、また、この幅は、累算器２０２に記憶される結果２１５に影響する可能性がある。一実施形態では、ＮＰＵ１２６は、累算器２０２に記憶される前にＡＬＵ２０４の出力２１５を飽和させる回路を含み、初期化命令が構成値を回路にロードしてその飽和に影響を与える。一実施形態では、累算器２０２は、ＡＬＵ関数命令（例えば、アドレス１の積和命令）、又はアドレス４のＡＦＵ出力書き出し命令などの出力命令の中でその旨を指定することにより、ゼロ値にクリアされることも可能である。
【００３７】
アドレス１にある２番目の行は、積和命令を指定し、この命令は、５１２個のＮＰＵ１２６に対して、データＲＡＭ１２２の行からそれぞれのデータワードをロードし、重みＲＡＭ１２４の行からそれぞれの重みワードをロードし、データワード入力２０７及び重みワード入力２０６に第１の積和演算を行うように命令し、この積和は、初期化された累算器２０２のゼロ値と共に累算される。より具体的には、上記命令は、シーケンサ１２８に対して、データワード入力２０７を選択するための制御入力２１３上の値を生成するように命令する。図４の例では、指定されるデータＲＡＭ１２２の行は行１７であり、指定される重みＲＡＭ１２４の行は行０であり、このことは、シーケンサ１２８に、１７のデータＲＡＭアドレス１２３値を出力し、０の重みＲＡＭアドレス１２５値を出力するように命令する。その結果、データＲＡＭ１２２の行１７にあった５１２個のデータワードが、５１２個のＮＰＵ１２６の対応するデータ入力２０７に提供され、重みＲＡＭ１２４の行０にあった５１２個の重みワードが、５１２個のＮＰＵ１２６の対応する重み入力２０６に提供される。
【００３８】
アドレス２にある３番目の行は、５１１のカウントを持つ積和循環命令を指定し、これは、５１２個のＮＰＵ１２６の各々に、５１１回の積和演算を行うように命令する。この命令は、５１２個のＮＰＵ１２６に、５１１回の積和演算の各々についてＡＬＵ２０４に入力されるデータワード２０９が隣接のＮＰＵ１２６からの循環された値２１１であるように命令する。すなわち、この命令は、シーケンサ１２８に、上記循環値２１１を選択するための制御入力２１３上の値を生成するように命令する。加えて、この命令は、５１２個のＮＰＵ１２６に、５１１回の積和演算の各々についてのそれぞれの重みワードを、重みＲＡＭ１２４の「次の」行からロードするように命令する。すなわち、この命令は、シーケンサ１２８に、前のクロックサイクルにおけるその値に対して１だけ重みＲＡＭのアドレス１２５を増分するように命令し、これは、この例では、命令の最初のクロックサイクルでは行１、次のクロックサイクルでは行２、その次のクロックサイクルでは行３となり、以下同様に続き、５１１回目のクロックサイクルでは行５１１となる。５１１回の積和演算の各々について、循環された入力２１１と重みワード入力２０６との積が、前の値と共に累算器２０２に累算される。５１２個のＮＰＵ１２６は、５１１回の積和演算を５１１クロックサイクルで行い、ここで、各ＮＰＵ１２６は、データＲＡＭ１２２の行１７からの異なるデータワード、すなわち、前のサイクルで隣接ＮＰＵ１２６によって操作されたデータワードと、そのデータワードに関連付けられた異なる重みワードとに積和演算を行い、重みワードは、概念的には、そのニューロンへの異なる接続入力である。この例では、各ＮＰＵ１２６（ニューロン）への接続入力の数は５１２であると仮定され、したがって、５１２個のデータワード及び５１２個の重みワードを伴う。行２の積和循環命令の最後の反復が行われると、累算器２０２は、５１２個の接続入力すべてについての積の和を含んでいる。一実施形態では、ＡＬＵ演算の各タイプ（例えば、上記のように積和、累算器と重みワードとの最大値など）について別個の命令があるのではなく、ＮＰＵ１２６の命令セットは、図２９ＡのＡＬＵ関数２９２６で指定されるものなど、ＮＰＵ初期化命令によって指定されるＡＬＵ演算を行うようにＡＬＵ２０４に命令する「実行」命令を含む。
【００３９】
アドレス３にある４番目の行は、活性化関数命令を指定する。活性化関数命令は、ＡＦＵ２１２に、指定された活性化関数を累算器２０２の値２１７に行って結果１３３を生成するように命令する。一実施形態による活性化関数については下記でより詳細に説明する。
【００４０】
アドレス４にある５番目の行は、ＡＦＵ出力書き出し命令を指定し、これは、５１２個のＮＰＵ１２６に、各自のＡＦＵ２１２の出力を結果１３３として、データＲＡＭ１２２の行、この例では行１６に書き戻すように命令する。すなわち、この命令は、１６のデータＲＡＭアドレス１２３値と書き込みコマンドとを出力するようにシーケンサ１２８に命令する（アドレス１の積和命令の場合における読み出しコマンドとは対照的に）。好ましくは、ＡＦＵ出力書き出し命令の実行は、パイプライン化された性質で他の命令の実行に重ねられることができ、ＡＦＵ出力書き出し命令は、１クロックサイクルで効果的に実行される。
【００４１】
好ましくは、各ＮＰＵ１２６は、各種の機能要素、例えば、ｍｕｘ−ｒｅｇ２０８（及び図７のｍｕｘ−ｒｅｇ７０５）、ＡＬＵ２０４、累算器２０２、ＡＦＵ２１２、（図８の）ｍｕｘ８０２、（図１１の）行バッファ１１０４及びＡＦＵ１１１２などを含むパイプラインとして構成され、これらのうちいくつかはそれ自体がパイプライン化される場合もある。データワード２０７及び重みワード２０６に加えて、パイプラインは、プログラムメモリ１２９から命令を受け取る。命令は、パイプラインを流れて行き、各種の機能ユニットを制御する。代替的な一実施形態では、活性化関数命令は、プログラムに含まれない。代わりに、ＮＰＵ初期化命令が、累算器２０２の値２１７に行われる活性化関数を指定し、その指定された活性化関数を指示する値が構成レジスタに保存され、後に、最終的な累算器２０２の値２１７が生成されると、すなわち、アドレス２にある積和循環命令の最後の反復が完了すると、パイプラインのＡＦＵ２１２部分によって使用される。好ましくは、電力節減の目的で、パイプラインのＡＦＵ２１２部分は、ＡＦＵ出力書き出し命令がその部分に達するまで非アクティブであり、命令が達した時にＡＦＵ２１２が電源投入され、初期化命令によって指定される累算器２０２の出力２１７に活性化関数を行う。
【００４２】
次いで図５を参照すると、ＮＮＵ１２１による図４のプログラムの実行を図示するタイミング図が示される。タイミング図の各行は、１番目の列に指示される連続したクロックサイクルに対応している。その他の列は各々、５１２個のＮＰＵ１２６のうち異なる１つに対応し、そのＮＰＵの動作を指示する。図示を簡略且つ明瞭にするために、ＮＰＵ０、１、及び５１１についてのみ動作を示している。
【００４３】
クロック０に、５１２個のＮＰＵ１２６の各々が、図４の初期化命令を行い、これは図５では累算器２０２へのゼロ値の代入によって図示されている。
【００４４】
クロック１に、５１２個のＮＰＵ１２６の各々が、図４のアドレス１にある積和命令を行う。示されるように、ＮＰＵ０は、累算器２０２の値（ゼロである）を、データＲＡＭ１２２の行１７のワード０と重みＲＡＭ１２４の行０のワード０との積と共に累算し、ＮＰＵ１は、累算器２０２の値（ゼロである）を、データＲＡＭ１２２の行１７のワード１と重みＲＡＭ１２４の行０のワード１との積と共に累算し、以下同様に続き、ＮＰＵ５１１は、累算器２０２の値（ゼロである）を、データＲＡＭ１２２の行１７のワード５１１と重みＲＡＭ１２４の行０のワード５１１との積と共に累算する。
【００４５】
クロック２に、５１２個のＮＰＵ１２６の各々は、図４のアドレス２にある積和循環命令の１回目の反復を行う。示されるように、ＮＰＵ０は、累算器２０２の値を、ＮＰＵ５１１のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード５１１であった）と重みＲＡＭ１２４の行１のワード０との積と共に累算し、ＮＰＵ１は、累算器２０２の値を、ＮＰＵ０のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード０であった）と重みＲＡＭ１２４の行１のワード１との積と共に累算し、以下同様に続き、ＮＰＵ５１１は、累算器２０２の値を、ＮＰＵ５１０のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード５１０であった）と重みＲＡＭ１２４の行１のワード５１１との積と共に累算する。
【００４６】
クロック３に、５１２個のＮＰＵ１２６の各々は、図４のアドレス２にある積和循環命令の２回目の反復を行う。示されるように、ＮＰＵ０は、累算器２０２の値を、ＮＰＵ５１１のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード５１０であった）と重みＲＡＭ１２４の行２のワード０との積と共に累算し、ＮＰＵ１は、累算器２０２の値を、ＮＰＵ０のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード５１１であった）と重みＲＡＭ１２４の行２のワード１との積と共に累算し、以下同様に続き、ＮＰＵ５１１は、累算器２０２の値を、ＮＰＵ５１０のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード５０９であった）と重みＲＡＭ１２４の行２のワード５１１との積と共に累算する。図５の省略記号によって指示されるように、これは、・・・に至るまで、続く５０９クロックサイクルの各々について継続する。
【００４７】
クロック５１２に、５１２個のＮＰＵ１２６の各々は、図４のアドレス２にある積和循環命令の５１１回目の反復を行う。示されるように、ＮＰＵ０は、累算器２０２の値を、ＮＰＵ５１１のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード１であった）と重みＲＡＭ１２４の行５１１のワード０との積と共に累算し、ＮＰＵ１は、累算器２０２の値を、ＮＰＵ０のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード２であった）と重みＲＡＭ１２４の行５１１のワード１との積と共に累算し、以下同様に続き、ＮＰＵ５１１は、累算器２０２の値を、ＮＰＵ５１０のｍｕｘ−ｒｅｇ２０８の出力２０９から受け取られた循環データワード２１１（データＲＡＭ１２２から受け取られたデータワード０であった）と重みＲＡＭ１２４の行５１１のワード５１１との積と共に累算する。一実施形態では、データワード及び重みワードをデータＲＡＭ１２２及び重みＲＡＭ１２４から読み込んで図４のアドレス１の積和命令を行うために複数のクロックサイクルが必要とされる。しかしながら、データＲＡＭ１２２及び重みＲＡＭ１２４並びにＮＰＵ１２６はパイプライン化されており、そのため、最初の積和演算が開始されると（例えば、図５のクロック１中に示されるように）、後続の積和演算（例えばクロック２〜５１２中に示される）は、続くクロックサイクルで開始される。好ましくは、ＮＰＵ１２６は、アーキテクチャ命令、例えばＭＴＮＮ若しくはＭＦＮＮ命令（図１４及び図１５に関連して下記で説明する）、又はアーキテクチャ命令が翻訳されたマイクロ命令による、データＲＡＭ１２２及び／又は重みＲＡＭ１２４のアクセスに応答して、短時間ストールすることができる。
【００４８】
クロック５１３に、５１２個のＮＰＵ１２６各々のＡＦＵ２１２が、図４のアドレス３にある活性化関数命令を行う。最後、クロック５１４に、５１２個のＮＰＵ１２６の各々は、各自の結果１３３を、データＲＡＭ１２２の行１６の自身の対応するワードに書き戻すことにより、図４のアドレス４におけるＡＦＵ出力書き出し命令を行い、すなわち、ＮＰＵ０の結果１３３は、データＲＡＭ１２２のワード０に書き込まれ、ＮＰＵ１の結果１３３は、データＲＡＭ１２２のワード１に書き込まれ、以下同様に続き、ＮＰＵ５１１の結果１３３は、データＲＡＭ１２２のワード５１１に書き込まれる。上記で図５に関して説明した動作は、ブロック図の形態で図６Ａにも示している。
【００４９】
次いで図６Ａを参照すると、図４のプログラムを実行する図１のＮＮＵ１２１を図示するブロック図が示される。ＮＮＵ１２１は、５１２個のＮＰＵ１２６、アドレス入力１２３を受け取るデータＲＡＭ１２２、及び、アドレス入力１２５を受け取る重みＲＡＭ１２４を含む。示されていないが、クロック０に、５１２個のＮＰＵ１２６は、初期化命令を行う。示されるように、クロック１に、行１７の５１２個の１６ビットのデータワードが、データＲＡＭ１２２から読み出され、５１２個のＮＰＵ１２６に提供される。クロック１〜５１２に、行０〜５１１の５１２の１６ビット重みワードが、それぞれ、重みＲＡＭ１２４から読み出され、５１２個のＮＰＵ１２６に提供される。示されていないが、クロック１に、５１２個のＮＰＵ１２６は、ロードしたデータワード及び重みワードにそれぞれの積和演算を行う。クロック２〜５１２に、５１２個のＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８は、５１２個の１６ビットワードの循環器として動作して、直前にロードされたデータＲＡＭ１２２の行１７のデータワードを、隣接するＮＰＵ１２６に循環させ、ＮＰＵ１２６は、それぞれの循環データワードと重みＲＡＭ１２４からロードされたそれぞれの重みワードとに積和演算を行う。図示されていないが、クロック５１３に、５１２個のＡＦＵ２１２は活性化命令を行う。クロック５１４に、５１２個のＮＰＵ１２６は、それぞれの５１２個の１６ビットの結果１３３を、データＲＡＭ１２２の行１６に書き戻す。
【００５０】
観察できるように、作り出されてデータＲＡＭ１２２又は重みＲＡＭ１２４に書き戻される結果ワード（ニューロン出力）を生成するために必要なクロック数は、およそ、ニューラルネットワークの現在の層に受け取られるデータ入力（接続）の数の平方根である。例えば、現在の層が５１２個のニューロンを有し、各々が前の層からの５１２個の接続を有する場合には、接続の総数は２５６Ｋ個であり、現在の層についての結果を生成するために必要なクロック数は５１２をわずかに上回る。したがって、ＮＮＵ１２１は、ニューラルネットワークの計算に極めて高い性能を提供する。
【００５１】
次いで図６Ｂを参照すると、図１のプロセッサ１００がアーキテクチャプログラムを行う動作を図示するフローチャートが示され、このアーキテクチャプログラムは、ＮＮＵ１２１を使用して、例えば図４のプログラムによって行われるような、従来は人工ニューラルネットワークの隠れ層のニューロンに関連する積和活性化関数の計算を行う。図６Ｂの例は、４つの隠れ層（ブロック６０２のＮＵＭ＿ＬＡＹＥＲＳ変数の初期化で表される）についての計算を仮定し、各層は５１２個のニューロンを有し、各ニューロンは、（図４のプログラムを使用することによって）前の層の５１２個のニューロンと完全に接続されている。ただし、これらの層及びニューロンの数は説明の目的で選択されたものであり、ＮＮＵ１２１を用いて、異なる数の隠れ層及び異なる数の層当たりのニューロンに、また非完全に接続されたニューロンに、同様の計算を行うことが可能であることを理解されたい。一実施形態では、重み値は、層内にニューロンの存在しないことに対して、又はニューロンへの接続の存在しないことに対して、ゼロに設定されてもよい。好ましくは、アーキテクチャプログラムは、第１の重みのセットを重みＲＡＭ１２４に書き込み、ＮＮＵ１２１を開始し、ＮＮＵ１２１が第１の層に関連する計算を行っている間に、アーキテクチャプログラムは、第２の重みのセットを重みＲＡＭ１２４に書き込み、そのため、ＮＮＵ１２１が第１の隠れ層についての計算を完了すると、ＮＮＵ１２１は直ちに第２の層についての計算を開始することができる。このようにして、アーキテクチャプログラムは、重みＲＡＭ１２４の２つの領域の間を行き来して、ＮＮＵ１２１を最大限に利用された状態に保つ。フローはブロック６０２で開始する。
【００５２】
ブロック６０２で、プロセッサ１００、すなわちプロセッサ１００で稼働しているアーキテクチャプログラムが、ニューロンの現在の隠れ層への入力値をデータＲＡＭ１２２に、例えば、図６Ａに関して示し説明するようにデータＲＡＭ１２２の行１７に、書き込む。或いは、この値は、前の層（例えば、畳み込み層、プーリング層、又は入力層）についてのＮＮＵ１２１の演算の結果１３３として、データＲＡＭ１２２の行１７にすでに存在している場合もある。加えて、アーキテクチャプログラムは、変数Ｎを１の値に初期化する。変数Ｎは、隠れ層のうち、ＮＮＵ１２１によって処理されている現在の層を表す。加えて、この例では４つの隠れ層があるため、アーキテクチャプログラムは、変数ＮＵＭ＿ＬＡＹＥＲＳを４の値に初期化する。フローはブロック６０４に進む。
【００５３】
ブロック６０４で、プロセッサ１００は、層１の重みワードを重みＲＡＭ１２４に、例えば、図６Ａに示すように行０〜５１１に、書き込む。フローはブロック６０６に進む。
【００５４】
ブロック６０６で、プロセッサ１００は、プログラムメモリ１２９に書き込みをする関数１４３２を指定するＭＴＮＮ１４００命令を使用して、積和活性化関数プログラム（例えば図４の）をＮＮＵ１２１のプログラムメモリ１２９に書き込む。プロセッサ１００は、次いで、プログラムの実行を開始する関数１４３２を指定するＭＴＮＮ１４００命令を使用して、ＮＮＵプログラムを開始する。フローは判定ブロック６０８に進む。
【００５５】
判定ブロック６０８で、アーキテクチャプログラムは、変数Ｎの値がＮＵＭ＿ＬＡＹＥＲＳより小さいかどうかを決定する。小さい場合、フローはブロック６１２に進み、それ以外の場合、フローはブロック６１４に進む。
【００５６】
ブロック６１２で、プロセッサ１００は、層Ｎ＋１の重みワードを重みＲＡＭ１２４に、例えば、行５１２〜１０２３に書き込む。したがって、有利な点として、アーキテクチャプログラムは、ＮＮＵ１２１が現在の層について隠れ層の計算を行っている間に、次の層の重みワードを重みＲＡＭ１２４に書き込み、そのため、ＮＮＵ１２１は、現在の層についての計算が完了する、すなわちデータＲＡＭ１２２に書き込まれると、直ちに次の層について隠れ層の計算の実行を開始することができる。フローはブロック６１４に進む。
【００５７】
ブロック６１４で、プロセッサ１００は、現在稼働しているＮＮＵプログラム（層１の場合はブロック６０６で開始され、層２〜４の場合はブロック６１８で開始されたもの）が完了したと決定する。好ましくは、プロセッサ１００は、ＭＦＮＮ１５００命令を実行してＮＮＵ１２１の状態レジスタ１２７を読み出すことによってこれを判定する。代替的な一実施形態では、ＮＮＵ１２１は、割込みを生成して、積和活性化関数層のプログラムを完了したことを示す。フローは判定ブロック６１６に進む。
【００５８】
判定ブロック６１６で、アーキテクチャプログラムは、変数Ｎの値がＮＵＭ＿ＬＡＹＥＲＳより小さいかどうかを決定する。小さい場合、フローはブロック６１８に進み、それ以外の場合、フローはブロック６２２に進む。
【００５９】
ブロック６１８で、プロセッサ１００は、積和活性化関数プログラムを更新し、それにより、プロセッサ１００は層Ｎ＋１についての隠れ層の計算を行えるようになる。より具体的には、プロセッサ１００は、図４のアドレス１における積和命令のデータＲＡＭ１２２の行値を、前の層が結果を書き込んだデータＲＡＭ１２２の行に（例えば、行１６に）更新し、さらに、出力行を（例えば、行１５に）更新する。プロセッサ１００は、次いで、更新されたＮＮＵプログラムを開始する。或いは、図４のプログラムは、アドレス１の積和命令で指定される行（すなわちデータＲＡＭ１２２から読み出された行）と同じ行を、アドレス４の出力命令中で指定する。この実施形態では、入力されたデータワードの現在の行が上書きされる（このことは、データワードのその行が何らかの他の目的に必要とされない限り許容できる。その理由は、データワードのその行はすでにｍｕｘ−ｒｅｇ２０８に読み込まれており、Ｎワード循環器を介してＮＰＵ１２６間で現在循環されているためである）。この場合は、ブロック６１８でＮＮＵプログラムの更新は必要なく、ＮＮＵプログラムを再開するだけでよい。フローはブロック６２２に進む。
【００６０】
ブロック６２２で、プロセッサ１００は、層Ｎについて、ＮＮＵプログラムの結果をデータＲＡＭ１２２から読み出す。ただし、結果がその後単に次の層によって使用されるだけの場合は、アーキテクチャプログラムは、結果をデータＲＡＭ１２２から読み出す必要はない場合もあり、しかし代わりに、次の隠れ層の計算のために結果をデータＲＡＭ１２２に残しておくことができる。フローは判定ブロック６２４に進む。
【００６１】
判定ブロック６２４で、アーキテクチャプログラムは、変数Ｎの値がＮＵＭ＿ＬＡＹＥＲＳより小さいかどうかを決定する。小さい場合、フローはブロック６２６に進み、それ以外の場合、フローは終了する。
【００６２】
ブロック６２６で、アーキテクチャプログラムは、Ｎを１だけ増分する。フローは判定ブロック６０８に戻る。
【００６３】
図６Ｂの例から判断できるように、約５１２クロックサイクルごとに、ＮＰＵ１２６はデータＲＡＭ１２２から一度読み出し、データＲＡＭ１２２に一度書き込む（図４のＮＮＵプログラムの動作により）。加えて、ＮＰＵ１２６は、およそ毎クロックサイクルごとに重みＲＡＭ１２４を読み出して、重みワードの行を読み出す。したがって、重みＲＡＭ１２４の帯域幅全体が、ＮＮＵ１２１が隠れ層の演算を行うハイブリッド方式によって消費される。加えて、図１７のバッファ１７０４のような書き込み及び読み出しバッファを含んでいる実施形態を仮定すると、ＮＰＵ１２６の読み出しと同時に、プロセッサ１００が重みＲＡＭ１２４に書き込みをし、そのため、バッファ１７０４は、約１６クロックサイクルごとに１回の書き込みを重みＲＡＭ１２４に対して行って、重みワードを書き込む。したがって、重みＲＡＭ１２４がシングルポートである実施形態（図１７に関して説明するものなど）では、約１６クロックサイクルごとに、バッファ１７０４が重みＲＡＭ１２４に書き込めるように、ＮＰＵ１２６が重みＲＡＭ１２４を読み出すことをストールされなければならない。しかし、重みＲＡＭ１２４がデュアルポートである実施形態では、ＮＰＵ１２６をストールさせる必要はない。
【００６４】
次いで図７を参照すると、代替的な一実施形態による図１のＮＰＵ１２６を図示するブロック図が示される。図７のＮＰＵ１２６は、多くの点で図２のＮＰＵ１２６に似ている。ただし、図７のＮＰＵ１２６は、第２の２入力ｍｕｘ−ｒｅｇ７０５を追加的に含む。ｍｕｘ−ｒｅｇ７０５は、入力２０６又は７１１の一方を選択して自身のレジスタに記憶し、それから出力２０３において後のクロックサイクルで提供する。入力２０６は、重みＲＡＭ１２４から重みワードを受け取る。他方の入力７１１は、隣接するＮＰＵ１２６の第２のｍｕｘ−ｒｅｇ７０５の出力２０３を受け取る。好ましくは、ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ７０５の入力７１１は、ＮＰＵ１２６のインスタンスＪ−１のｍｕｘ−ｒｅｇ７０５の出力２０３を受け取り、ＮＰＵ  Ｊの出力は、ＮＰＵ１２６のインスタンスＪ＋１のｍｕｘ−ｒｅｇ７０５の入力７１１に提供される。このようにして、Ｎ個のＮＰＵ１２６のｍｕｘ−ｒｅｇ７０５は、上記で図３に関して説明した仕方と同じように、しかしデータワードに対してではなく重みワードに対して、Ｎワード循環器として集合的に動作する。制御入力７１３が、２つの入力のうちいずれをｍｕｘ−ｒｅｇ７０５が選択してそのレジスタに記憶し、それが後に出力２０３で提供されるかを、制御する。
【００６５】
ｍｕｘ−ｒｅｇ２０８及び／又はｍｕｘ−ｒｅｇ７０５（並びに図１８及び図２３の実施形態などの他の実施形態のｍｕｘ−ｒｅｇ）を含めて、データＲＡＭ１２２及び／又は重みＲＡＭ１２４から受け取られる行のデータ／重みを循環させる大きな循環器を効果的に形成することには、さもなければ必要なデータワード／重みワードを適切なＮＮＵ１２１に提供するためにデータＲＡＭ１２２及び／又は重みＲＡＭ１２４の間で必要となるであろう極めて大きなｍｕｘを、ＮＮＵ１２１が必要としないという利点がある。
【００６６】
活性化関数の結果に加えた累算値の書き戻し
応用例によっては、プロセッサ１００が未処理の累算器２０２の値２１７を（例えば、図１５のＭＦＮＮ命令を介してメディアレジスタ１１８に）再び受け取り、その値に、他の実行ユニット１１２で実行されている命令が計算を行えると有用である。例えば、一実施形態では、ＡＦＵ２１２の複雑性を低減するために、ＡＦＵ２１２はソフトマックス活性化関数を行うように構成されない。したがって、ＮＮＵ１２１は、未処理の累算器２０２の値２１７又はそのサブセットを、データＲＡＭ１２２又は重みＲＡＭ１２４に出力することができ、それを後にアーキテクチャプログラムがデータＲＡＭ１２２又は重みＲＡＭ１２４から読み出して、その未処理値に計算を行う。ただし、未処理の累算器２０２の値２１７の使用は、ソフトマックスの実行に限定されず、他の使用例が企図される。
【００６７】
次いで図８を参照すると、代替的な一実施形態による図１のＮＰＵ１２６を図示するブロック図が示される。図８のＮＰＵ１２６は、多くの点で図２のＮＰＵ１２６に似ている。ただし、図８のＮＰＵ１２６は、制御入力８０３を有する多重化器（ｍｕｘ）８０２をＡＦＵ２１２に含んでいる。累算器２０２の幅（ビット単位）は、データワードの幅より大きい。ｍｕｘ８０２は、累算器２０２の出力２１７のデータワード幅分を受け取る複数の入力を有する。一実施形態では、累算器２０２の幅は４１ビットであり、ＮＰＵ１２６は、１６ビットの結果ワード１３３を出力するように構成され、したがって、例えば、ｍｕｘ８０２（又は図３０のｍｕｘ３０３２及び／若しくはｍｕｘ３０３７）は、累算器２０２の出力２１７のビット［１５：０］、ビット［３１：１６］、及びビット［４７：３２］をそれぞれ受け取る３つの入力を備える。好ましくは、累算器２０２から提供されるのでない出力ビット（例えば、ビット［４７：４１］）は、ゼロ値ビットに強制される。
【００６８】
シーケンサ１２８は、下記の図９のアドレス３〜５のＡＣＣ書き出し命令などのＡＣＣ書き出し命令に応答して、制御入力８０３に値を生成して、累算器２０２のワード（例えば、１６ビット）のうち１つを選択するようにｍｕｘ８０２を制御する。好ましくは、ｍｕｘ８０２は、データワードの幅である出力を生成する活性化関数回路（例えば、図３０の要素３０２２、３０２４、３０２６、３０１８、３０１４、及び３０１６）の出力を受け取る１つ又は複数の入力をさらに有する。シーケンサ１２８は、図４のアドレス４におけるＡＦＵ出力書き出し命令などの命令に応答して、制御入力８０３に値を生成して、累算器２０２のワードのうち１つではなく活性化関数回路の出力のうち１つを選択するようにｍｕｘ８０２を制御する。
【００６９】
次いで図９を参照すると、図１のプログラムメモリ１２９に記憶され、ＮＮＵ１２１によって実行されるプログラムを図示する表が示される。図９の例示的プログラムは、多くの点で図４のプログラムに似ている。具体的には、アドレス０〜２の命令は同一である。しかし、図４のアドレス３及び４における命令が、図９ではＡＣＣ書き出し命令に置き換えられており、この命令は、５１２個のＮＰＵ１２６に各自の累算器２０２の出力２１７を結果１３３として、データＲＡＭ１２２の３つの行に書き戻すように命令し、３つの行はこの例では行１６〜１８である。すなわち、ＡＣＣ書き出し命令は、シーケンサ１２８に命令して、最初のクロックサイクルに１６のデータＲＡＭアドレス１２３値と書き込みコマンドとを出力させ、２番目のクロックサイクルに１７のデータＲＡＭアドレス１２３値と書き込みコマンドとを出力させ、３番目のクロックサイクルに１８のデータＲＡＭアドレス１２３値と書き込みコマンドとを出力させる。好ましくは、ＡＣＣ書き出し命令の実行は、他の命令の実行に重ねられることができ、ＡＣＣ書き出し命令は、データＲＡＭ１２２内で書き込まれる行ごとに１クロックサイクルずつ、３クロックサイクルで効果的に実行される。一実施形態では、ユーザが、活性化関数２９３４及び出力コマンド２９５６フィールドの値を制御レジスタ１２７（図２９Ａの）内で指定して、累算器２０２の所望部分の、データＲＡＭ１２２又は重みＲＡＭ１２４への書き込みを達成する。或いは、累算器２０２の内容全体を書き戻すのではなく、ＡＣＣ書き出し命令は、任意で、累算器２０２のサブセットを書き戻してもよい。一実施形態では、図２９〜図３１に関連して下記でより詳細に説明するように、累算器２０２の基準形式（canonical  form）を書き戻すことができる。
【００７０】
次いで図１０を参照すると、ＮＮＵ１２１による図９のプログラムの実行を図示するタイミング図が示される。図１０のタイミング図は図５のタイミング図と似ており、クロック０〜５１２は同じである。ただし、クロック５１３〜５１５に、５１２個のＮＰＵ１２６の各々のＡＦＵ２１２が、図９のアドレス３〜５におけるＡＣＣ書き出し命令のうち１つを行う。具体的には、クロック５１３に、５１２個のＮＰＵ１２６の各々が、各自の結果１３３として、データＲＡＭ１２２の行１６の自身の対応するワードに、累算器２０２の出力２１７のビット［１５：０］を書き戻し、クロック５１４に、５１２個のＮＰＵ１２６の各々が、各自の結果１３３として、データＲＡＭ１２２の行１７の自身の対応するワードに、累算器２０２の出力２１７のビット［３１：１６］を書き戻し、クロック５１５に、５１２個のＮＰＵ１２６の各々が、各自の結果１３３として、データＲＡＭ１２２の行１８の自身の対応するワードに、累算器２０２の出力２１７のビット［４０：３２］を書き込む。好ましくは、ビット［４７：４１］はゼロ値に強制される。
【００７１】
共有ＡＦＵ
次いで図１１を参照すると、図１のＮＮＵ１２１の一実施形態を図示するブロック図が示される。図１１の実施形態では、ニューロンが、活性化関数ユニット部分とＡＬＵ部分（シフトレジスタ部分も含む）との２つの部分に分割され、各活性化関数ユニット部分は、複数のＡＬＵ部分により共有される。図１１では、ＡＬＵ部分は、ＮＰＵ１２６として参照され、共有される活性化関数ユニット部分は、ＡＦＵ１１１２として参照される。このことは、例えば、各ニューロンが専用のＡＦＵ２１２を備える図２の実施形態と対照的である。したがって、例えば、一実施形態では、図１１の実施形態のＮＰＵ１２６（ＡＬＵ部分）は、図２の累算器２０２、ＡＬＵ２０４、ｍｕｘ−ｒｅｇ２０８、及びレジスタ２０５を含むが、ＡＦＵ２１２を含まない。図１１の実施形態では、ＮＮＵ１２１は、５１２個のＮＰＵ１２６を一例として含むが、他の数のＮＰＵ１２６を持つ他の実施形態が企図される。図１１の例では、５１２個のＮＰＵ１２６は、各々８つのＮＰＵ１２６からなる６４個のグループにグループ化され、図１１においてグループ０〜６３として参照される。
【００７２】
ＮＮＵ１２１は、行バッファ１１０４と、ＮＰＵ１２６と行バッファ１１０４との間に結合された複数の共有ＡＦＵ１１１２とをさらに含む。行バッファ１１０４は、データＲＡＭ１２２又は重みＲＡＭ１２４の行と同じ幅（ビット単位）であり、例えば５１２ワードである。１つのＮＰＵ１２６グループにつき１つのＡＦＵ１１１２があり、すなわち、各ＡＦＵ１１１２が、対応するＮＰＵ１２６グループを有する。したがって、図１１の実施形態では、６４個のＮＰＵ１２６グループに対応する６４個のＡＦＵ１１１２がある。１つのグループ内の８つのＮＰＵ１２６の各々が、対応するＡＦＵ１１１２を共有する。グループ当たりに異なる数のＡＦＵ１１１２及びＮＰＵ１２６を有する他の実施形態が企図される。例えば、１つのグループ内の２個、４個、又は１６個のＮＰＵ１２６がＡＦＵ１１１２を共有する他の実施形態が企図される。
【００７３】
ＡＦＵ１１１２を共有する動機は、ＮＮＵ１２１のサイズを低減することである。サイズの低減は、性能の低下という犠牲を払って得られる。すなわち、例えば下記の図１２で実証されるとおり、共有比に依存して、ＮＰＵ１２６のアレイ全体の結果１３３を生成するのに数クロック長くかかる可能性があり、図１２の場合には、８：１の共有比のため、７のさらなるクロックサイクルが必要とされる。ただし、一般的に言って、この追加的なクロック数（例えば７）は、累算和を生成するために必要とされるクロック数（例えば、１ニューロン当たり５１２個の接続がある層では５１２クロック）と比べて、比較的少ない。したがって、この比較的小さな性能への影響（例えば、計算時間の１％の増加）は、ＮＮＵ１２１の低減されたサイズに対して、価値のあるトレードオフであり得る。
【００７４】
一実施形態では、ＮＰＵ１２６の各々は、比較的単純な活性化関数を行うＡＦＵ２１２を含み、それにより、上記単純なＡＦＵ２１２が比較的小さくあり、したがって各ＮＰＵ１２６に含まれることを可能にしている。それに対して、共有される、又は複雑なＡＦＵ１１１２は、比較的複雑な活性化関数を行い、したがって、単純なＡＦＵ２１２よりも比較的大幅に大きい。そのような実施形態では、追加的なクロックサイクルは、複雑なＡＦＵ１１１２の共有を必要とする複雑な活性化関数が指定されるときのみ必要とされ、単純なＡＦＵ２１２が行うように構成された活性化関数が指定されるときには必要とされない。
【００７５】
次いで図１２及び図１３を参照すると、図１１のＮＮＵ１２１による図４のプログラムの実行を図示する２つのタイミング図が示される。図１２のタイミング図は、図５タイミング図と似ており、クロック０〜５１２は同じである。ただし、クロック５１３において、動作が図５のタイミング図に記載される動作と異なり、なぜならば、図１１のＮＰＵ１２６はＡＦＵ１１１２を共有するからである。すなわち、１つのグループのＮＰＵ１２６は、そのグループに関連付けられたＡＦＵ１１１２を共有し、図１１はこの共有を図示している。
【００７６】
図１３のタイミング図の各行は、１番目の列に指示される連続したクロックサイクルに対応している。その他の列はそれぞれ、６４個のＡＦＵ１１１２のうち異なる１つに対応し、そのＡＦＵの動作を指示する。図示を簡略且つ明瞭にするために、ＡＦＵ０、１、及び６３のみの動作を示している。図１３のクロックサイクルは、図１２のクロックサイクルに対応しているが、異なる仕方でＮＰＵ１２６によるＡＦＵ１１１２の共有を図示している。図１３に示されるように、クロック０〜５１２において、６４個のＡＦＵ１１１２の各々は非アクティブであり、一方、ＮＰＵ１２６は、ＮＰＵ初期化並びに積和及び積和循環命令を行う。
【００７７】
図１２と図１３の両方に示されるように、クロック５１３において、ＡＦＵ０（グループ０に関連付けられたＡＦＵ１１１２）が、グループ０の１番目のＮＰＵ１２６であるＮＰＵ０の累算器２０２の値２１７に、指定された活性化関数の実行を開始する。ＡＦＵ０の出力は、行バッファ１１０４のワード０に記憶されることになる。さらに、クロック５１３において、ＡＦＵ１１１２の各々が、自身の対応するＮＰＵ１２６のグループ内の１番目のＮＰＵ１２６の累算器２０２に、指定された活性化関数の実行を開始する。したがって、クロック５１３には、図１３に示されるように、ＡＦＵ０は、ＮＰＵ０の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード０に記憶されることになる結果を生成し、ＡＦＵ１は、ＮＰＵ８の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード８に記憶されることになる結果を生成し、以下同様に続き、ＡＦＵ６３は、ＮＰＵ５０４の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード５０４に記憶されることになる結果を生成する。
【００７８】
示されるように、クロック５１４において、ＡＦＵ０（グループ０に関連付けられたＡＦＵ１１１２）が、グループ０の２番目のＮＰＵ１２６であるＮＰＵ１の累算器２０２の値２１７に、指定された活性化関数の実行を開始し、ＡＦＵ０の出力は、行バッファ１１０４のワード１に記憶されることになる。さらに、クロック５１４において、ＡＦＵ１１１２の各々が、自身の対応するＮＰＵ１２６のグループ内の２番目のＮＰＵ１２６の累算器２０２に、指定された活性化関数の実行を開始する。したがって、クロック５１４には、図１３に示されるように、ＡＦＵ０は、ＮＰＵ１の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード１に記憶されることになる結果を生成し、ＡＦＵ１は、ＮＰＵ９の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード９に記憶されることになる結果を生成し、以下同様に続き、ＡＦＵ６３は、ＮＰＵ５０５の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード５０５に記憶されることになる結果を生成する。このパターンは、示されるように、クロックサイクル５２０において、ＡＦＵ０（グループ０に関連付けられたＡＦＵ１１１２）が、グループ０内の８番目（最後）のＮＰＵ１２６であるＮＰＵ７の累算器２０２の値２１７に指定された活性化関数の実行を開始するまで続き、ＡＦＵ０の出力は、行バッファ１１０４のワード７に記憶されることになる。さらに、クロック５２０において、ＡＦＵ１１１２の各々が、自身の対応するＮＰＵ１２６のグループ内の８番目のＮＰＵ１２６の累算器２０２に、指定された活性化関数の実行を開始する。したがって、クロック５２０には、図１３に示されるように、ＡＦＵ０は、ＮＰＵ７の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード７に記憶されることになる結果を生成し、ＡＦＵ１は、ＮＰＵ１５の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード１５に記憶されることになる結果を生成し、以下同様に続き、ＡＦＵ６３は、ＮＰＵ５１１の累算器２０２に指定された活性化関数を実行し始めて、行バッファ１１０４のワード５１１に記憶されることになる結果を生成する。
【００７９】
５１２個のＮＰＵ１２６に関連するすべての５１２個の結果が生成され、行バッファ１１０４に書き込まれると、クロック５２１において、行バッファ１１０４は、その内容の、データＲＡＭ１２２又は重みＲＡＭ１２４に対する書き出しを開始する。このようにして、ＮＰＵ１２６の６４個のグループの各々のＡＦＵ１１１２は、図４のアドレス３にある活性化関数命令の一部分を行う。
【００８０】
ＡＬＵ２０４のグループ間でＡＦＵ１１１２を共有する図１１のような実施形態は、例えば下記で図２９Ａ〜図３３との関連でより詳細に説明する、整数ＡＬＵ２０４との関連で特に有利である可能性がある。
【００８１】
ＭＴＮＮ及びＭＦＮＮアーキテクチャ命令
次いで図１４を参照すると、図１のＮＮＵ１２１の一部分に関する、ニューラルネットワークへ移動（ＭＴＮＮ）アーキテクチャ命令１４００とその動作を図示するブロック図が示される。ＭＴＮＮ命令１４００は、オペコードフィールド１４０２、ｓｒｃ１フィールド１４０４、ｓｒｃ２フィールド１４０６、ｇｐｒフィールド１４０８、及び即値フィールド１４１２を含む。ＭＴＮＮ命令１４００は、アーキテクチャ命令であり、すなわちプロセッサ１００の命令セットアーキテクチャに含まれている。好ましくは、命令セットアーキテクチャは、オペコードフィールド１４０２の所定の値をＭＴＮＮ命令１４００に関連付けて、ＭＴＮＮ命令１４００を命令セットアーキテクチャ中の他の命令から区別する。ＭＴＮＮ命令１４００のオペコード１４０２は、例えばｘ８６アーキテクチャで一般的であるプレフィクスを含む場合も含まない場合もある。
【００８２】
即値フィールド１４１２は、関数１４３２を指定する値を、ＮＮＵ１２１の制御論理１４３４に提供する。好ましくは、関数１４３２は、図１のマイクロ命令１０５の即値オペランドとして提供される。ＮＮＵ１２１によって行われることが可能な関数１４３２には、これらに限定されないが、データＲＡＭ１２２への書き込み、重みＲＡＭ１２４への書き込み、プログラムメモリ１２９への書き込み、制御レジスタ１２７への書き込み、プログラムメモリ１２９にあるプログラムの実行の開始、プログラムメモリ１２９にあるプログラムの実行の一時停止、プログラムメモリ１２９にあるプログラムの実行の完了の通知（例えば、割込み）の要求、及びＮＮＵ１２１のリセット、が含まれる。好ましくは、ＮＮＵ命令セットは、その結果がＮＮＵプログラムの完了を示す命令を含む。或いは、ＮＮＵ命令セットは、明示的な割込み生成命令を含む。好ましくは、ＮＮＵ１２１をリセットすることは、データＲＡＭ１２２、重みＲＡＭ１２４、プログラムメモリ１２９の内容がそのままに保たれる以外は、ＮＮＵ１２１をリセット状態に効果的に強制して戻すことを含む（例えば、内部のステートマシンがクリアされ、アイドル状態に設定される）。加えて、累算器２０２などの内部レジスタは、リセット関数には影響されず、例えば図４のアドレス０にあるＮＰＵ初期化命令などによって、明示的にクリアされなければならない。一実施形態では、関数１４３２は、第１のソースレジスタがマイクロ操作（例えば、図３４のマイクロ操作３４１８を参照されたい）を含んでいる、直接実行関数を含むことができる。直接実行関数は、ＮＮＵ１２１に、指定されるマイクロ操作を直接実行するように命令する。このようにして、アーキテクチャプログラムは、命令をプログラムメモリ１２９に書き込んでからＮＮＵ１２１にプログラムメモリ内のその命令を実行するように命令すること、又はＭＴＮＮ命令１４００（若しくは図１５のＭＦＮＮ命令１５００）を実行することによってでなく、直接ＮＮＵ１２１を制御して動作を行わせることができる。図１４は、データＲＡＭ１２２に書き込む関数１４３２の一例を図示する。
【００８３】
ｇｐｒフィールド１４０８は、汎用レジスタファイル１１６内のＧＰＲの１つを指定する。一実施形態では、各ＧＰＲは６４ビットである。示されるように、汎用レジスタファイル１１６は、選択されたＧＰＲからの値をＮＮＵ１２１に提供し、ＮＮＵ１２１は、その値をアドレス１４２２として使用する。アドレス１４２２は、関数１４３２中で指定されるメモリの行を選択する。データＲＡＭ１２２又は重みＲＡＭ１２４の場合、アドレス１４２２は追加的に、選択された行の中で、メディアレジスタの場所のサイズの２倍であるチャンク（例えば、５１２ビット）を選択する。好ましくは、その場所は５１２ビットの境界上である。一実施形態では、多重化器が、アドレス１４２２（若しくは下記のＭＦＮＮ命令１４００の場合におけるアドレス１４２２）、又は、データＲＡＭ１２２／重みＲＡＭ１２４／プログラムメモリ１２９に対する提供のためのシーケンサ１２８からのアドレス１２３／１２５／１３１の、いずれかを選択する。一実施形態では、下記でより詳細に説明するように、データＲＡＭ１２２はデュアルポートであって、メディアレジスタ１１８がデータＲＡＭ１２２の読み出し／書き込みを行うのと同時に、ＮＰＵ１２６がデータＲＡＭ１２２の読み出し／書き込みを行うことができる。一実施形態では、重みＲＡＭ１２４もまた、同様の目的のためにデュアルポートである。
【００８４】
ｓｒｃ１フィールド１４０４及びｓｒｃ２フィールド１４０６は各々、メディアレジスタファイル１１８内のメディアレジスタを指定する。一実施形態では、各メディアレジスタ１１８は２５６ビットである。メディアレジスタファイル１１８は、示されるように、選択されたメディアレジスタからの連結されたデータ（例えば、５１２ビット）を、データＲＡＭ１２２（又は重みＲＡＭ１２４又はプログラムメモリ１２９）に提供して、アドレス１４２２で指定される選択された行１４２８に、及び、選択された行１４２８の中のアドレス１４２２で指定される場所に書き込む。有利な点として、一連のＭＴＮＮ命令１４００（及び下記のＭＦＮＮ命令１４００）を実行することにより、プロセッサ１００で実行されているアーキテクチャプログラムは、データＲＡＭ１２２の行及び重みＲＡＭ１２４の行を埋めると共に、本明細書に記載される（例えば、図４及び図９の）プログラムなどのプログラムをプログラムメモリ１２９に書き込んで、ＮＮＵ１２１に極めて高速にデータ及び重みに対する演算を行わせて、人工ニューラルネットワークを達成することができる。一実施形態では、アーキテクチャプログラムは、プログラムをプログラムメモリ１２９に書き込むのではなく、直接ＮＮＵ１２１を制御する。
【００８５】
一実施形態では、２つのソースレジスタ（例えば、１４０４及び１４０６）を指定するのではなく、ＭＴＮＮ命令１４００は、開始ソースレジスタとソースレジスタの数Ｑとを指定する。この形式のＭＴＮＮ命令１４００は、プロセッサ１００に、開始ソースレジスタとして指定されるメディアレジスタ１１８と次のＱ−１個の連続したメディアレジスタ１１８とを、ＮＮＵ１２１に、すなわち、指定されたデータＲＡＭ１２２又は重みＲＡＭ１２４に書き込むように命令する。好ましくは、命令トランスレータ１０４は、ＭＴＮＮ命令１４００を、Ｑ個の指定されたメディアレジスタ１１８すべてに書き込むために必要とされるだけの数のマイクロ命令に翻訳する。例えば、一実施形態では、ＭＴＮＮ命令１４００が開始ソースレジスタをＭＲ４と指定し、Ｑが８である場合、命令トランスレータ１０４は、ＭＴＮＮ命令１４００を４つのマイクロ命令に翻訳し、４つのうち第１の命令はＭＲ４及びＭＲ５に書き込み、第２の命令はＭＲ６及びＭＲ７に書き込み、第３の命令はＭＲ８及びＭＲ９に書き込み、第４の命令はＭＲ１０及びＭＲ１１に書き込みをする。メディアレジスタ１１８からＮＮＵ１２１へのデータ経路が５１２ビットではなく１０２４ビットである代替的な一実施形態では、命令トランスレータ１０４は、ＭＴＮＮ命令１４００を２つのマイクロ命令に翻訳し、そのうち第１の命令はＭＲ４〜ＭＲ７に書き込み、第２の命令はＭＲ８〜ＭＲ１１に書き込みをする。ＭＦＮＮ命令１５００が開始宛先レジスタ及び宛先レジスタの数を指定する同様の実施形態が企図され、それにより、単一のメディアレジスタ１１８よりも、１つのＭＦＮＮ命令１５００当たり、データＲＡＭ１２２又は重みＲＡＭ１２４の行のより大きなチャンクを読み出すことができる。
【００８６】
次いで図１５を参照すると、図１のＮＮＵ１２１の一部に関連するニューラルネットワークから移動（ＭＦＮＮ）アーキテクチャ命令１５００とその動作を図示するブロック図が示される。ＭＦＮＮ命令１５００は、オペコードフィールド１５０２、ｄｓｔフィールド１５０４、ｇｐｒフィールド１５０８、及び即値フィールド１５１２を含む。ＭＦＮＮ命令１５００は、アーキテクチャ命令であり、すなわちプロセッサ１００の命令セットアーキテクチャに含まれている。好ましくは、命令セットアーキテクチャは、オペコードフィールド１５０２の所定の値をＭＦＮＮ命令１５００に関連付けて、ＭＦＮＮ命令１５００を命令セットアーキテクチャ中の他の命令から区別する。ＭＦＮＮ命令１５００のオペコード１５０２は、例えばｘ８６アーキテクチャで一般的であるプレフィクスを含む場合も含まない場合もある。
【００８７】
即値フィールド１５１２は、関数１５３２を指定する値を、ＮＮＵ１２１の制御論理１４３４に提供する。好ましくは、関数１５３２は、図１のマイクロ命令１０５の即値オペランドとして提供される。ＮＮＵ１２１によって行われることが可能な関数１５３２には、これらに限定されないが、データＲＡＭ１２２からの読み出し、重みＲＡＭ１２４からの読み出し、プログラムメモリ１２９からの読み出し、及び状態レジスタ１２７からの読み出しが含まれる。図１５は、データＲＡＭ１２２から読み出す関数１５３２の一例を図示する。
【００８８】
ｇｐｒフィールド１５０８は、汎用レジスタファイル１１６内のＧＰＲの１つを指定する。汎用レジスタファイル１１６は、示されるように、選択されたＧＰＲからの値をＮＮＵ１２１に提供し、ＮＮＵ１２１はその値を、図１４のアドレス１４２２と同じように動作するアドレス１５２２として使用して、関数１５３２で指定されるメモリの行を選択する。データＲＡＭ１２２又は重みＲＡＭ１２４の場合、アドレス１５２２は追加的に、選択された行の中で、メディアレジスタの場所のサイズであるチャンク（例えば、２５６ビット）を選択する。好ましくは、その場所は２５６ビットの境界上である。
【００８９】
ｄｓｔフィールド１５０４は、メディアレジスタファイル１１８内のメディアレジスタを指定する。示されるように、メディアレジスタファイル１１８は、データ（例えば、２５６ビット）を、データＲＡＭ１２２（又は重みＲＡＭ１２４又はプログラムメモリ１２９）から、選択されたメディアレジスタに受け取り、上記データは、アドレス１５２２によって指定される選択された行１５２８から、及び、選択された行１５２８の中のアドレス１５２２で指定される場所から読み出される。
【００９０】
ＮＮＵ内部ＲＡＭのポート構成
次いで図１６を参照すると、図１のデータＲＡＭ１２２の実施形態を図示するブロック図が示される。データＲＡＭ１２２は、メモリアレイ１６０６、読み出しポート１６０２、及び書き込みポート１６０４を備える。メモリアレイ１６０６は、データワードを保持し、好ましくは、上記のようにＮ個のワードのＤ個の行として編成される。一実施形態では、メモリアレイ１６０６は、６４個の水平方向に編成された静的ＲＡＭセルの配列からなり、各セルは１２８ビットの幅及び６４ビットの高さであり、それにより、８１９２ビット幅で６４個の行を有する６４ＫＢのデータＲＡＭ１２２を提供し、データＲＡＭ１２２は、約０．２平方ミリメートルのダイ面積を占める。ただし、他の実施形態が企図される。
【００９１】
読み出しポート１６０２は、好ましくは多重化されるやり方で、ＮＰＵ１２６に及びメディアレジスタ１１８に結合される。（より正確には、メディアレジスタ１１８は、リオーダバッファにデータを提供することも可能な結果バス、及び／又は他の実行ユニット１１２への結果転送バスを介して、読み出しポート１６０２に結合可能である。）ＮＰＵ１２６及びメディアレジスタ１１８は、読み出しポート１６０２を共有してデータＲＡＭ１２２を読み出す。書き込みポート１６０４もまた、好ましくは多重化されるやり方で、ＮＰＵ１２６に及びメディアレジスタ１１８に結合される。ＮＰＵ１２６及びメディアレジスタ１１８は、書き込みポート１６０４を共有してデータＲＡＭ１２２に書き込む。したがって、有利な点として、メディアレジスタ１１８は、ＮＰＵ１２６がさらにデータＲＡＭ１２２から読み出している間に、同時にデータＲＡＭ１２２に書き込むことができ、又は、ＮＰＵ１２６は、メディアレジスタ１１８がデータＲＡＭ１２２から読み出している間に、同時にデータＲＡＭ１２２に書き込むことができる。これは、有利に、向上した性能をもたらすことができる。例えば、ＮＰＵ１２６は、メディアレジスタ１１８がさらなるデータワードをデータＲＡＭ１２２に書き込む間に、データＲＡＭ１２２を（例えば、算出の実行を続けるために）読み出すことができる。別の例として、ＮＰＵ１２６は、メディアレジスタ１１８が算出結果をデータＲＡＭ１２２から読み出す間に、算出結果をデータＲＡＭ１２２に書き込むことができる。一実施形態では、ＮＰＵ１２６は、ＮＰＵ１２６がデータＲＡＭ１２２からデータワードの行を読み出す間にも、算出結果の行をデータＲＡＭ１２２に書き込むことができる。一実施形態では、メモリアレイ１６０６は、バンクにおいて構成される。ＮＰＵ１２６がデータＲＡＭ１２２にアクセスする時、すべてのバンクがアクティブにされてメモリアレイ１６０６の一行全体にアクセスする。これに対し、メディアレジスタ１１８がデータＲＡＭ１２２にアクセスする時、指定されたバンクだけがアクティブにされる。一実施形態では、例えば、各バンクは１２８ビット幅であり、メディアレジスタ１１８は２５６ビット幅であり、したがって、メディアレジスタ１１８のアクセスにつき、２つのバンクがアクティブにされる。一実施形態では、ポート１６０２／１６０４の一方が、読み出し／書き込みポートである。一実施形態では、ポート１６０２及び１６０４の双方が読み出し／書き込みポートである。
【００９２】
本明細書に記載されるＮＰＵ１２６の循環器能力の利点は、そうでない場合にＮＰＵ１２６が高度に利用されることを保証するために必要とされ得る場合と比べて、データＲＡＭ１２２のメモリアレイ１６０６が大幅により少ない行を有し、したがって相対的にはるかにより小さくなる能力を容易にする点である。ＮＰＵ１２６が高度に利用されるためには、ＮＰＵ１２６が計算を行っている間に、アーキテクチャプログラムが（メディアレジスタ１１８を介して）データＲＡＭ１２２にデータを提供し続け、またデータＲＡＭ１２２から結果を引き出し続けられることが必要となる。
【００９３】
内部ＲＡＭバッファ
次いで図１７を参照すると、図１の重みＲＡＭ１２４及びバッファ１７０４の実施形態を図示するブロック図が示される。重みＲＡＭ１２４は、メモリアレイ１７０６及びポート１７０２を含む。メモリアレイ１７０６は、重みワードを保持し、好ましくは、上記のようにＮ個のワードのＷ個の列として編成される。一実施形態では、メモリアレイ１７０６は、１２８個の水平方向に編成された静的ＲＡＭセルの配列からなり、各セルは６４ビットの幅及び２０４８ビットの高さであり、それにより、８１９２ビット幅で２０４８個の行を有する２ＭＢの重みＲＡＭ１２４を提供し、重みＲＡＭ１２４は、約２．４平方ミリメートルのダイ面積を占める。ただし、他の実施形態が企図される。
【００９４】
ポート１７０２は、好ましくは多重化されるやり方に、ＮＰＵ１２６に及びバッファ１７０４に結合される。ＮＰＵ１２６及びバッファ１７０４は、ポート１７０２を介して、重みＲＡＭ１２４の読み出し及び書き込みを行う。バッファ１７０４は、図１のメディアレジスタ１１８にさらに結合され、その結果メディアレジスタ１１８は、バッファ１７０４を通して重みＲＡＭ１２４の読み出し及び書き込みを行う。したがって、有利な点として、メディアレジスタ１１８は、ＮＰＵ１２６がさらに重みＲＡＭ１２４の読み出し又は書き込みを行っている間に、同時にバッファ１７０４の読み出し又は書き込みを行うことができる（ただし、好ましくは、ＮＰＵ１２６が現在実行中である場合、ＮＰＵ１２６がストールして、バッファ１７０４が重みＲＡＭ１２４にアクセスしている間に重みＲＡＭ１２４にアクセスすることを回避する）。これは、有利に、向上した性能をもたらすことができ、それは、特にメディアレジスタ１１８による重みＲＡＭ１２４の読み出し／書き込みは、ＮＰＵ１２６による重みＲＡＭ１２４の読み出し／書き込みよりも比較的はるかにより小さいためである。例えば、一実施形態では、ＮＰＵ１２６は一度に８１９２ビット（１行）の読み出し／書き込みをし、これに対しメディアレジスタ１１８は２５６ビット幅であり、各ＭＴＮＮ命令１４００は２つのメディアレジスタ１１８、すなわち５１２ビットを書き込む。したがって、アーキテクチャプログラムが１６回のＭＴＮＮ命令１４００を実行してバッファ１７０４を埋める場合に、重みＲＡＭ１２４に対するアクセスについて、ＮＰＵ１２６とアーキテクチャプログラムとの間で、その時間のわずか約６パーセント未満で衝突が発生する。代替的な一実施形態では、命令トランスレータ１０４は、ＭＴＮＮ命令１４００を２つのマイクロ命令１０５に翻訳し、該マイクロ命令の各々は、１つのメディアレジスタ１１８をバッファ１７０４に書き込み、この場合、重みＲＡＭ１２４に対するアクセスについて、ＮＰＵ１２６とアーキテクチャプログラムとの間で、さらに少ない頻度で衝突が発生する。
【００９５】
バッファ１７０４を含んでいる一実施形態では、アーキテクチャプログラムによる重みＲＡＭ１２４への書き込みが、複数のＭＴＮＮ命令１４００を必要とする。１つ又は複数のＭＴＮＮ命令１４００が、バッファ１７０４の指定されたチャンクに書き込むための関数１４３２を指定し、続いて、ＭＴＮＮ命令１４００が、ＮＮＵ１２１にバッファ１７０４の内容を重みＲＡＭ１２４の指定された行に書き込むように命令する関数１４３２を指定し、ここで、チャンクのサイズは、メディアレジスタ１１８のビット数の２倍であり、チャンクはバッファ１７０４内で当然位置合わせされる。一実施形態では、バッファ１７０４の指定されたチャンクに書き込む関数１４３２を指定するＭＴＮＮ命令１４００の各々に、バッファ１７０４の各チャンクに対応するビットを持つビットマスクが含められる。２つの指定されたソースレジスタ１１８からのデータが、ビットマスク中で対応するビットが設定されているバッファ１７０４の各チャンクに書き込まれる。これは、重みＲＡＭ１２４の行の中で繰り返されるデータ値に有用である可能性がある。例えば、バッファ１７０４（及び、その後ＲＡＭ１２４の行）をゼロアウトするために、プログラマは、ソースレジスタにゼロをロードし、ビットマスクのすべてのビットを設定することができる。加えて、ビットマスクは、プログラマがバッファ１７０４の選択されたチャンクだけに書き込みをし、それによりその他のチャンク内の以前のデータを保有しておくことを可能にする。
【００９６】
バッファ１７０４を含んでいる一実施形態では、アーキテクチャプログラムによる重みＲＡＭ１２４からの読み出しが、複数のＭＦＮＮ命令１５００を必要とする。初期ＭＦＮＮ命令１５００が、重みＲＡＭ１２４の指定された行からバッファ１７０４にロードする関数１５３２を指定し、続いて、１つ又は複数のＭＦＮＮ命令１５００が、バッファ１７０４の指定されたチャンクを宛先レジスタに読み込む関数１５３２を指定し、ここで、チャンクのサイズはメディアレジスタ１１８のビット数であり、チャンクはバッファ１７０４内で当然位置合わせされる。他の実施形態が企図され、それらの実施形態では、重みＲＡＭ１２４が複数のバッファ１７０４を含んで、ＮＰＵ１２６の実行中にアーキテクチャプログラムが行えるアクセス数を増やすことにより、重みＲＡＭ１２４にアクセスするためのＮＰＵ１２６とアーキテクチャプログラムとの間の競合をさらに減らし、このことは、ＮＰＵ１２６が重みＲＡＭ１２４にアクセスする必要がないクロックサイクル中に、バッファ１７０４によるアクセスを行える見込みを増やす可能性がある。
【００９７】
図１６は、デュアルポートのデータＲＡＭ１２２を説明するが、重みＲＡＭ１２４がさらにデュアルポートである他の実施形態が企図される。さらに、図１７は、重みＲＡＭ１２４と共に使用するためのバッファを説明するが、データＲＡＭ１２２がバッファ１７０４と同様の関連付けられたバッファをさらに有する他の実施形態が企図される。
【００９８】
動的に構成可能なＮＰＵ
次いで図１８を参照すると、図１の動的に構成可能なＮＰＵ１２６を図示するブロック図が示される。図１８のＮＰＵ１２６は、多くの点で図２のＮＰＵ１２６に似ている。ただし、図１８のＮＰＵ１２６は、２つの異なる構成の一方で動作するように動的に構成可能である。第１の構成では、図１８のＮＰＵ１２６は、図２のＮＰＵ１２６と同様に動作する。すなわち、本明細書で「ワイド」構成又は「シングル」構成と呼ばれる第１の構成では、ＮＰＵ１２６のＡＬＵ２０４は、１つの幅広の（wide）データワードと１つの幅広の重みワード（例えば、１６ビット）に動作を行って、１つの幅広の結果を生成する。対照的に、本明細書で「ナロー」構成又は「デュアル」構成と呼ばれる第２の構成では、ＮＰＵ１２６は、２つの幅狭の（narrow）データワード及び２つのそれぞれの幅狭の重みワード（例えば、８ビット）に動作を行って、２つのそれぞれの幅狭の結果を生成する。一実施形態では、ＮＰＵ１２６の構成（ワイド又はナロー）は、ＮＰＵ初期化命令（例えば、下記の図２０のアドレス０におけるもの）によってなされる。或いは、構成は、命令の関数１４３２がＮＰＵ１２６を構成（ワイド又はナロー）に構成することを指定するＭＴＮＮ命令によってなされる。好ましくは、構成レジスタがプログラムメモリ１２９命令又はＭＴＮＮ命令によって埋められ、構成（ワイド又はナロー）を決定する。例えば、構成レジスタの出力が、ＡＬＵ２０４と、ＡＦＵ２１２と、ｍｕｘ−ｒｅｇ制御信号２１３を生成する論理とに提供される。一般的に言って、図１８のＮＰＵ１２６の要素は、図２の同様の参照符号が付された要素と同様の機能を行い、図１８の理解のためには図２を参照されたい。ただし、次いで、図２との違いを含めて、図１８の実施形態について説明する。
【００９９】
図１８のＮＰＵ１２６は、２つのレジスタ２０５Ａ及び２０５Ｂ、２つの３入力ｍｕｘ−ｒｅｇ２０８Ａ及び２０８Ｂ、ＡＬＵ２０４、２つの累算器２０２Ａ及び２０２Ｂ、並びに２つのＡＦＵ２１２Ａ及び２１２Ｂを備える。レジスタ２０５Ａ／２０５Ｂの各々は別個に、図２のレジスタ２０５の幅の半分（例えば、８ビット）である。レジスタ２０５Ａ／２０５Ｂの各々は、それぞれのナロー重みワード２０６Ａ／２０６Ｂ（例えば、８ビット）を重みＲＡＭ１２４から受け取り、それぞれの出力２０３Ａ／２０３Ｂを、後のクロックサイクルで、ＡＬＵ２０４のオペランド選択論理１８９８に提供する。ＮＰＵ１２６がワイド構成であるとき、レジスタ２０５Ａ／２０５Ｂは、効果的に共に機能して、図２の実施形態のレジスタ２０５と同様にして、ワイド重みワード２０６Ａ／２０６Ｂ（例えば、１６ビット）を重みＲＡＭ１２４から受け取る。ＮＰＵ１２６がナロー構成であるとき、レジスタ２０５Ａ／２０５Ｂは、効果的に個々に機能して、ナロー重みワード２０６Ａ／２０６Ｂ（例えば、８ビット）を重みＲＡＭ１２４から各々受け取り、ＮＰＵ１２６は効果的に２つの別個のナローＮＰＵであるようになる。それにも関わらず、ＮＰＵ１２６の構成に関係なく、重みＲＡＭ１２４の同じ出力ビットがレジスタ２０５Ａ／２０５Ｂに結合され、提供される。例えば、ＮＰＵ０のレジスタ２０５Ａはバイト０を受け取り、ＮＰＵ０のレジスタ２０５Ｂはバイト１を受け取り、ＮＰＵ１のレジスタ２０５Ａはバイト２を受け取り、ＮＰＵ１のレジスタ２０５Ａはバイト３を受け取り、以下同様に続き、ＮＰＵ５１１のレジスタ２０５Ｂはバイト１０２３を受け取る。
【０１００】
ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々は、別個に、図２のレジスタ２０８の幅の半分（例えば、８ビット）である。ｍｕｘ−ｒｅｇ２０８Ａは、入力２０７Ａ又は２１１Ａ又は１８１１Ａのうち１つを選択して自身のレジスタに記憶し、次いで、出力２０９Ａで、後のクロックサイクルにおいて出力し、ｍｕｘ−ｒｅｇ２０８Ｂは、入力２０７Ｂ又は２１１Ｂ又は１８１１Ｂのうち１つを選択して自身のレジスタに記憶し、次いで、出力２０９Ｂで、後のクロックサイクルにおいて、オペランド選択論理１８９８に提供する。入力２０７Ａは、データＲＡＭ１２２からナローデータワード（例えば、８ビット）を受け取り、入力２０７Ｂは、データＲＡＭ１２２からナローデータワードを受け取る。ＮＰＵ１２６がワイド構成であるとき、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂは効果的に共に機能して、図２の実施形態のｍｕｘ−ｒｅｇ２０８と同様にして、ワイドデータワード２０７Ａ／２０７Ｂ（例えば、１６ビット）をデータＲＡＭ１２２から受け取る。ＮＰＵ１２６がナロー構成であるとき、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂは、効果的に個々に機能して、ナローデータワード２０７Ａ／２０７Ｂ（例えば、８ビット）をデータＲＡＭ１２２から各々受け取り、ＮＰＵ１２６は効果的に２つの別個のナローＮＰＵであるようになる。それにも関わらず、ＮＰＵ１２６の構成に関係なく、データＲＡＭ１２２の同じ出力ビットがｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂに結合され、提供される。例えば、ＮＰＵ０のｍｕｘ−ｒｅｇ２０８Ａはバイト０を受け取り、ＮＰＵ０のｍｕｘ−ｒｅｇ２０８Ｂはバイト１を受け取り、ＮＰＵ１のｍｕｘ−ｒｅｇ２０８Ａはバイト２を受け取り、ＮＰＵ１のｍｕｘ−ｒｅｇ２０８Ａはバイト３を受け取り、以下同様に続き、ＮＰＵ５１１のｍｕｘ−ｒｅｇ２０８Ｂはバイト１０２３を受け取る。
【０１０１】
入力２１１Ａは、隣接するＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａを受け取り、入力２１１Ｂは、隣接するＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８Ｂの出力２０９Ｂを受け取る。示されるように、入力１８１１Ａは、隣接するＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８Ｂの出力２０９Ｂを受け取り、入力１８１１Ｂは、当該ＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａを受け取る。図１８に示されるＮＰＵ１２６は、図１のＮ個のＮＰＵ１２６のうちのＮＰＵ  Ｊと表される。すなわち、ＮＰＵ  Ｊは、Ｎ個のＮＰＵ１２６の代表事例である。好ましくは、ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ２０８Ａの入力２１１Ａは、ＮＰＵ１２６のインスタンスＪ−１のｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａを受け取り、ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ２０８Ａの入力１８１１Ａは、ＮＰＵ１２６のインスタンスＪ−１のｍｕｘ−ｒｅｇ２０８Ｂの出力２０９Ｂを受け取り、ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａは、ＮＰＵ１２６のインスタンスＪ＋１のｍｕｘ−ｒｅｇ２０８Ａの入力２１１Ａと、ＮＰＵ１２６のインスタンスＪのｍｕｘ−ｒｅｇ２０８Ｂの入力２１１Ｂとの双方に提供される。ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ２０８Ｂの入力２１１Ｂは、ＮＰＵ１２６のインスタンスＪ−１のｍｕｘ−ｒｅｇ２０８Ｂの出力２０９Ｂを受け取り、ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ２０８Ｂの入力１８１１Ｂは、ＮＰＵ１２６のインスタンスＪのｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａを受け取り、ＮＰＵ  Ｊのｍｕｘ−ｒｅｇ２０８Ｂの出力２０９Ｂは、ＮＰＵ１２６のインスタンスＪ＋１のｍｕｘ−ｒｅｇ２０８Ａの入力１８１１と、ＮＰＵ１２６のインスタンスＪ＋１のｍｕｘ−ｒｅｇ２０８Ｂの入力２１１Ｂとの双方に提供される。
【０１０２】
制御入力２１３は、３つの入力のうちいずれをｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々が選択して各自のレジスタに記憶し、それが後にそれぞれの出力２０９Ａ／２０９Ｂで提供されるかを、制御する。ＮＰＵ１２６が、データＲＡＭ１２２から行をロードするように命令されるとき（例えば、下記の図２０のアドレス１の積和命令により）、ＮＰＵ１２６がワイド構成であるかナロー構成であるかに関係なく、制御入力２１３は、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々を制御して、データＲＡＭ１２２の選択された行の対応するナローワードから、各自のナローデータワード２０７Ａ／２０７Ｂ（例えば、８ビット）を選択させる。
【０１０３】
ＮＰＵ１２６が、前に受け取られたデータ行値を循環させるように命令されるとき（例えば、下記の図２０のアドレス２にある積和循環命令により）、ＮＰＵ１２６が、ナロー構成である場合、制御入力２１３は、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々を制御して、それぞれの入力１８１１Ａ／１８１１Ｂを選択させる。この場合、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂは個々に効果的に機能し、ＮＰＵ１２６は効果的に２つの別個のナローＮＰＵであるようになる。このようにして、図１９に関連して下記でより詳細に説明するように、Ｎ個のＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８Ａ及び２０８Ｂが、２Ｎナローワード循環器として集合的に動作する。
【０１０４】
ＮＰＵ１２６が、前に受け取られたデータ行値を循環させるように命令されるとき、ＮＰＵ１２６が、ワイド構成である場合、制御入力２１３は、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々を制御して、それぞれの入力２１１Ａ／２１１Ｂを選択させる。この場合、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂは、ＮＰＵ１２６が単一のワイドＮＰＵ１２６であるかのように、共に効果的に機能する。このようにして、図３に関連して説明したのと同様にして、Ｎ個のＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８Ａ及び２０８Ｂが、Ｎワイドワード循環器として集合的に動作する。
【０１０５】
ＡＬＵ２０４は、オペランド選択論理１８９８、ワイド乗算器２４２Ａ、ナロー乗算器２４２Ｂ、ワイド２入力ｍｕｘ１８９６Ａ、ナロー２入力ｍｕｘ１８９６Ｂ、ワイド加算器２４４Ａ、及びナロー加算器２４４Ｂを備える。効果的に、ＡＬＵ２０４は、オペランド選択論理１８９８、ワイドＡＬＵ２０４Ａ（ワイド乗算器２４２Ａ、ワイドｍｕｘ１８９６Ａ、及びワイド加算器２４４Ａを備える）、並びにナローＡＬＵ２０４Ｂ（ナロー乗算器２４２Ｂ、ナローｍｕｘ１８９６Ｂ、及びナロー加算器２４４Ｂを備える）を備える。好ましくは、ワイド乗算器２４２Ａは、２つのワイドワードを乗算し、図２の乗算器２４２と似ており、例えば１６ビット×１６ビット乗算器である。ナロー乗算器２４２Ｂは、２つのナローワードを乗算し、例えば、１６ビットの結果を生成する８ビット×８ビット乗算器である。ＮＰＵ１２６がナロー構成であるとき、ワイド乗算器２４２Ａは、オペランド選択論理１８９８の助けを借りて、２つのナローワードを乗算するナロー乗算器として効果的に使用され、そのためＮＰＵ１２６は効果的に２つのナローＮＰＵとして機能する。好ましくは、ワイド加算器２４４Ａは、ワイドｍｕｘ１８９６Ａの出力とワイド累算器２０２Ａの出力２１７Ａとを加算して、ワイド累算器２０２Ａに提供される和２１５Ａを生成し、図２の加算器２４４と似ている。ナロー加算器２４４Ｂは、ナローｍｕｘ１８９６Ｂの出力とナロー累算器２０２Ｂの出力２１７Ｂとを加算して、ナロー累算器２０２Ｂに提供される和２１５Ｂを生成する。一実施形態では、ナロー累算器２０２Ｂは２８ビット幅であって、最大で１０２４個の１６ビット積の累算における精度の損失を回避する。ＮＰＵ１２６がワイド構成であるとき、ナロー乗算器２４２Ｂ、ナローｍｕｘ１８９６Ｂ、ナロー加算器２４４Ｂ、ナロー累算器２０２Ｂ、及びナローＡＦＵ２１２Ｂは、好ましくは、電力消費を減らすように非アクティブである。
【０１０６】
オペランド選択論理１８９８は、下記でより詳細に説明するように、２０９Ａ、２０９Ｂ、２０３Ａ、及び２０３Ｂからオペランドを選択して、ＡＬＵ２０４のその他の要素に提供する。好ましくは、オペランド選択論理１８９８は、符号付き値のデータワード及び重みワードの符号拡張を行うなど、他の機能も行う。例えば、ＮＰＵ１２６がナロー構成である場合、オペランド選択論理１８９８は、ナローデータワード及び重みワードを、これらをワイド乗算器２４２Ａに提供する前に、ワイドワードの幅に符号拡張する。同様に、ＡＬＵ２０４が、ナローデータ／重みワードをパススルーする（ワイドｍｕｘ１８９６Ａを介してワイド乗算器２４２Ａを迂回する）ように命令される場合、オペランド選択論理１８９８は、ナローデータ／重みワードを、これをワイド加算器２４４Ａに提供する前に、ワイドワードの幅に符号拡張する。好ましくは、図２のＮＰＵ１２６のＡＬＵ２０４に、符号拡張機能を行うように論理がさらに存在する。
【０１０７】
ワイドｍｕｘ１８９６Ａは、ワイド乗算器２４２Ａの出力とオペランド選択論理１８９８からのオペランドとを受け取り、これら入力のうち一方を、ワイド加算器２４４Ａに対する提供のために選択する。ナローｍｕｘ１８９６Ｂは、ナロー乗算器２４２Ｂの出力とオペランド選択論理１８９８からのオペランドとを受け取り、これら入力のうち一方を、ナロー加算器２４４Ｂに対する提供のために選択する。
【０１０８】
オペランド選択論理１８９８によって提供されるオペランドは、ＮＰＵ１２６の構成と、ＮＰＵ１２６によって実行されている命令で指定される関数に基づいてＡＬＵ２０４によって行われることになる算術演算及び／又は論理演算とに依存する。例えば、命令が積和を行うようにＡＬＵ２０４に命令し、ＮＰＵ１２６がワイド構成である場合、オペランド選択論理１８９８は、ワイド乗算器２４２Ａに対して、一方の入力で、出力２０９Ａと２０９Ｂとの連結であるワイドワードを、もう一方の入力で、出力２０３Ａと２０３Ｂとの連結であるワイドワードを提供し、ナロー乗算器２４２Ｂは非アクティブであり、その結果、ＮＰＵ１２６は、図２のＮＰＵ１２６と同様の単一のワイドＮＰＵ１２６として機能する。これに対し、命令が積和を行うようにＡＬＵ２０４に命令し、ＮＰＵ１２６がナロー構成である場合、オペランド選択論理１８９８は、ワイド乗算器２４２Ａに対して、一方の入力で、ナローデータワード２０９Ａの拡張された、又は幅を広くされたバージョンを、もう一方の入力で、ナロー重みワード２０３Ａの拡張されたバージョンを提供する。加えて、オペランド選択論理１８９８は、ナロー乗算器２４２Ｂに対して、一方の入力でナローデータワード２０９Ｂを、もう一方の入力でナロー重みワード２０３Ｂを提供する。ナローワードを拡張、すなわち幅を広くするために、ナローワードが符号付きである場合、オペランド選択論理１８９８はナローワードを符号拡張する。これに対し、ナローワードが符号なしである場合、オペランド選択論理１８９８は、ナローワードを、ゼロ値の上位ビットでパディングする。
【０１０９】
別の例として、ＮＰＵ１２６がワイド構成であり、命令がＡＬＵ２０４に重みワードの累算を行うように命令する場合、ワイド乗算器２４２Ａは迂回され、オペランド選択論理１８９８は、出力２０３Ａと２０３Ｂとの連結を、ワイド加算器２４４Ａに対する提供のためにワイドｍｕｘ１８９６Ａに提供する。これに対し、ＮＰＵ１２６がナロー構成であり、命令がＡＬＵ２０４に重みワードの累算を行うように命令する場合、ワイド乗算器２４２Ａは迂回され、オペランド選択論理１８９８は、出力２０３Ａの拡張されたバージョンを、ワイド加算器２４４Ａに対する提供のためにワイドｍｕｘ１８９６Ａに提供し、ナロー乗算器２４２Ｂは迂回され、オペランド選択論理１８９８は、出力２０３Ｂの拡張されたバージョンを、ナロー加算器２４４Ｂに対する提供のためにナローｍｕｘ１８９６Ｂに提供する。
【０１１０】
別の例として、ＮＰＵ１２６がワイド構成であり、命令がＡＬＵ２０４にデータワードの累算を行うように命令する場合、ワイド乗算器２４２Ａは迂回され、オペランド選択論理１８９８は、出力２０９Ａと２０９Ｂとの連結を、ワイド加算器２４４Ａに対する提供のためにワイドｍｕｘ１８９６Ａに提供する。これに対し、ＮＰＵ１２６がナロー構成であり、命令がＡＬＵ２０４にデータワードの累算を行うように命令する場合、ワイド乗算器２４２Ａは迂回され、オペランド選択論理１８９８は、出力２０９Ａの拡張されたバージョンを、ワイド加算器２４４Ａに対する提供のためにワイドｍｕｘ１８９６Ａに提供し、ナロー乗算器２４２Ｂは迂回され、オペランド選択論理１８９８は、出力２０９Ｂの拡張したバージョンを、ナロー加算器２４４Ｂに対する提供のためにナローｍｕｘ１８９６Ｂに提供する。重みワード／データワードの累算は、画像処理など、一部の人工ニューラルネットワークの応用例のプーリング層で使用される平均演算を行うために有用である可能性がある。
【０１１１】
好ましくは、ＮＰＵ１２６は、ワイド加算器２４４Ａを迂回してワイド構成におけるワイドデータワード／重みワード又はナロー構成における拡張されたナローデータワード／重みワードをワイド累算器２０２Ａにロードすることを容易にする第２のワイドｍｕｘ（図示せず）と、ナロー加算器２４４Ｂを迂回してナロー構成におけるナローデータワード／重みワードをナロー累算器２０２Ｂにロードすることを容易にする第２のナローｍｕｘ（図示せず）と、をさらに含む。好ましくは、ＡＬＵ２０４は、ワイド及びナロー比較器／ｍｕｘの組み合わせ（図示せず）をさらに含み、これは、それぞれの累算器の値２１７Ａ／２１７Ｂ及びそれぞれのｍｕｘ１８９６Ａ／１８９６Ｂの出力を受け取って、累算器値２１７Ａ／２１７Ｂとデータワード／重みワード２０９Ａ／Ｂ／２０３Ａ／Ｂとの間で最大値を選択し、これは、例えば図２７及び図２８に関連して下記でより詳細に説明するように、一部の人工ニューラルネットワークの応用例のプーリング層で使用される演算である。加えて、オペランド選択論理１８９８は、ゼロ値のオペランドを提供し（ゼロで加算するため、又は累算器をクリアするため）、及び１の値のオペランドを提供する（１で乗算するため）ように構成される。
【０１１２】
ナローＡＦＵ２１２Ｂは、ナロー累算器２０２Ｂの出力２１７Ｂを受け取り、それに活性化関数を行ってナロー結果１３３Ｂを生成し、ワイドＡＦＵ２１２Ａは、ワイド累算器２０２Ａの出力２１７Ａを受け取り、それに活性化関数を行ってワイド結果１３３Ａを生成する。ＮＰＵ１２６がナロー構成であるとき、例えば図２９Ａ〜図３０に関連して下記でより詳細に説明するように、ワイドＡＦＵ２１２Ａは、それに応じてワイド累算器２０２Ａの出力２１７Ａを考慮し、その出力に活性化関数を行って、例えば８ビットのナロー結果を生成する。
【０１１３】
上記の説明から観察できるように、有利な点として、ナロー構成であるとき、単一のＮＰＵ１２６が効果的に２つのナローＮＰＵとして動作し、それにより、より小さいワードについて、最大で、ワイド構成であるときの約２倍のスループットをもたらす。例えば、１０２４個のニューロンを持ち、各々が前の層から１０２４個のナロー入力を受け取る（及び、ナロー重みワードを有する）ニューラルネットワーク層を仮定すると、その結果、１メガの接続がもたらされる。ワイド構成において５１２個のＮＰＵ１２６を有するＮＮＵ１２１と比べて、ナロー構成において５１２個のＮＰＵ１２６（１０２４個のナローＮＰＵ）を有するＮＮＵ１２１は、ワイドワードではなくナローワードであるが、約半分の時間で（およそ１０２６クロック対５１４クロック）、４倍の接続数（１メガの接続対２５６Ｋの接続）を処理することができる。
【０１１４】
一実施形態では、図１８の動的に構成可能なＮＰＵ１２６は、レジスタ２０５Ａ及び２０５Ｂの代わりに、ｍｕｘ−ｒｅｇ２０８Ａ及び２０８Ｂと同様の３入力多重化レジスタを含み、図７の実施形態に関連して説明した仕方といくらか似た、しかし図１８に関連して説明した動的に構成可能なやり方で、重みＲＡＭ１２４から受け取られる重みワードの行のための循環器を実現する。
【０１１５】
次いで図１９を参照すると、図１８の実施形態による図１のＮＮＵ１２１のＮ個のＮＰＵ１２６の２Ｎ個のｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの編成の一実施形態を図示するブロック図が示され、図１のデータＲＡＭ１２２から受け取られるデータワード２０７の行に対する循環器としてのｍｕｘ−ｒｅｇの動作を図示している。図１９の実施形態では、Ｎは５１２であり、そのため、示されるように、ＮＮＵ１２１は、５１２個のＮＰＵ１２６、及び効果的に１０２４個のナローＮＰＵに対応する、０〜５１１と表される１０２４個のｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂを有する。ＮＰＵ１２６内の２つのナローＮＰＵをＡ及びＢと表し、ｍｕｘ−ｒｅｇ２０８の各々の中に、対応するナローＮＰＵの呼称が示されている。より具体的には、ＮＰＵ１２６  ０のｍｕｘ−ｒｅｇ２０８Ａを０−Ａと呼び、ＮＰＵ１２６  ０のｍｕｘ−ｒｅｇ２０８Ｂを０−Ｂと呼び、ＮＰＵ１２６  １のｍｕｘ−ｒｅｇ２０８Ａを１−Ａと呼び、ＮＰＵ１２６  １のｍｕｘ−ｒｅｇ２０８Ｂを１−Ｂと呼び、ＮＰＵ１２６  ５１１のｍｕｘ−ｒｅｇ２０８Ａを５１１−Ａと呼び、ＮＰＵ１２６  ５１１のｍｕｘ−ｒｅｇ２０８Ｂを５１１−Ｂと呼び、これらの値は、下記で説明する図２１のナローＮＰＵにさらに対応している。
【０１１６】
各ｍｕｘ−ｒｅｇ２０８Ａは、データＲＡＭ１２２のＤ個の行のうちの１行の、自身の対応するナローデータワード２０７Ａを受け取り、各ｍｕｘ−ｒｅｇ２０８Ｂは、データＲＡＭ１２２のＤ個の行のうちの１行の、自身の対応するナローデータワード２０７Ｂを受け取る。すなわち、ｍｕｘ−ｒｅｇ０Ａは、データＲＡＭ１２２の行のナローデータワード０を受け取り、ｍｕｘ−ｒｅｇ０Ｂは、データＲＡＭ１２２の行のナローデータワード１を受け取り、ｍｕｘ−ｒｅｇ１Ａは、データＲＡＭ１２２の行のナローデータワード２を受け取り、ｍｕｘ−ｒｅｇ１Ｂは、データＲＡＭ１２２の行のナローデータワード３を受け取り、以下同様に続き、ｍｕｘ−ｒｅｇ５１１Ａは、データＲＡＭ１２２の行のナローデータワード１０２２を受け取り、ｍｕｘ−ｒｅｇ５１１Ｂは、データＲＡＭ１２２の行のナローデータワード１０２３を受け取る。加えて、ｍｕｘ−ｒｅｇ１Ａは、入力２１１Ａで、ｍｕｘ−ｒｅｇ０Ａの出力２０９Ａを受け取り、ｍｕｘ−ｒｅｇ１Ｂは、入力２１１Ｂで、ｍｕｘ−ｒｅｇ０Ｂの出力２０９Ｂを受け取り、以下同様に続き、ｍｕｘ−ｒｅｇ５１１Ａは、入力２１１Ａで、ｍｕｘ−ｒｅｇ５１０Ａの出力２０９Ａを受け取り、ｍｕｘ−ｒｅｇ５１１Ｂは、入力２１１Ｂで、ｍｕｘ−ｒｅｇ５１０Ｂの出力２０９Ｂを受け取り、ｍｕｘ−ｒｅｇ０Ａは、入力２１１Ａで、ｍｕｘ−ｒｅｇ５１１Ａの出力２０９Ａを受け取り、ｍｕｘ−ｒｅｇ０Ｂは、入力２１１Ｂでｍｕｘ−ｒｅｇ５１１Ｂの出力２０９Ｂを受け取る。ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々は、データワード２０７Ａ／２０７Ｂを選択するか、又は循環された入力２１１Ａ／２１１Ｂを選択するか、又は循環された入力１８１１Ａ／１８１１Ｂを選択するかを制御する制御入力２１３を受け取る。最後、ｍｕｘ−ｒｅｇ１Ａは、入力１８１１Ａでｍｕｘ−ｒｅｇ０Ｂの出力２０９Ｂを受け取り、ｍｕｘ−ｒｅｇ１Ｂは、入力１８１１Ｂでｍｕｘ−ｒｅｇ１Ａの出力２０９Ａを受け取り、以下同様に続き、ｍｕｘ−ｒｅｇ５１１Ａは、入力１８１１Ａでｍｕｘ−ｒｅｇ５１０Ｂの出力２０９Ｂを受け取り、ｍｕｘ−ｒｅｇ５１１Ｂは、入力１８１１Ｂでｍｕｘ−ｒｅｇ５１１Ａの出力２０９Ａを受け取り、ｍｕｘ−ｒｅｇ０Ａは、入力１８１１Ａでｍｕｘ−ｒｅｇ５１１Ｂの出力２０９Ｂを受け取り、ｍｕｘ−ｒｅｇ０Ｂは、入力１８１１Ｂでｍｕｘ−ｒｅｇ０Ａの出力２０９Ａを受け取る。ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々は、データワード２０７Ａ／２０７Ｂを選択するか、又は循環された入力２１１Ａ／２１１Ｂを選択するか、又は循環された入力１８１１Ａ／１８１１Ｂを選択するかを制御する制御入力２１３を受け取る。下記でより詳細に説明するように、ある動作モードにおいて、最初のクロックサイクルに、制御入力２１３は、レジスタ内における記憶のため及びＡＬＵ２０４に対する後の提供のためにデータワード２０７Ａ／２０７Ｂを選択するようにｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々を制御し、後のクロックサイクル（例えば、上記のようにＭ−１のクロックサイクル）中、制御入力２１３は、レジスタ内における記憶のため及びＡＬＵ２０４に対する後の提供のために、循環された入力１８１１Ａ／１８１１Ｂを選択するようにｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂの各々を制御する。
【０１１７】
次いで図２０を参照すると、図１８の実施形態によるＮＰＵ１２６を有する図１のＮＮＵ１２１のプログラムメモリ１２９に記憶され、該ＮＮＵ１２１により実行されるプログラムを図示する表が示される。図２０の例示的プログラムは、多くの点で図４のプログラムと似ている。ただし、以下では違いを説明する。アドレス０におけるＮＰＵ初期化命令は、ＮＰＵ１２６がナロー構成であるように指定する。加えて、アドレス２における積和循環命令は、示されるように、１０２３のカウントを指定し、１０２３クロックサイクルを必要とする。この理由は、図２０の例は、一層について効果的に１０２４個のナロー（例えば、８ビット）のニューロン（ＮＰＵ）であり、各々が、１０２４個のニューロンからなる前の層からの１０２４個の接続入力を有し、合計で１０２４Ｋ個の接続であることを仮定しているためである。各ニューロンは、各接続入力から８ビットのデータ値を受け取り、その８ビットのデータ値に適切な８ビットの重み値を乗算する。
【０１１８】
次いで図２１を参照すると、ナロー構成において動作する図１８のＮＰＵ１２６を含むＮＮＵ１２１による図２０のプログラムの実行を図示するタイミング図が示される。図２１のタイミング図は多くの点で図５のタイミング図に似ているが、以下では違いを説明する。
【０１１９】
図２１のタイミング図では、アドレス０のＮＰＵ初期化命令がＮＰＵ１２６をナロー構成に初期化するため、ＮＰＵ１２６はナロー構成にある。その結果、５１２個のＮＰＵ１２６は、１０２４個のナローＮＰＵ（又はニューロン）として効果的に動作し、これらＮＰＵを、列の中で、ＮＰＵ０−Ａ及びＮＰＵ０−Ｂ（ＮＰＵ１２６  ０の２つのナローＮＰＵ）、ＮＰＵ１−Ａ及びＮＰＵ１−Ｂ（ＮＰＵ１２６  １の２つのナローＮＰＵ）、以下同様に続き、ＮＰＵ５１１−Ａ及びＮＰＵ５１１−Ｂ（ＮＰＵ１２６  ５１１の２つのナローＮＰＵ）と呼ぶ。図示を簡略且つ明瞭にするために、ナローＮＰＵ０−Ａ、０−Ｂ、及び５１１−Ｂのみについての動作を示している。アドレス２の積和循環が１０２３のカウントを指定し、これが１０２３クロックを必要とする事実に起因して、図２１のタイミング図の行は、クロックサイクル１０２６まで含んでいる。
【０１２０】
クロック０に、１０２４個のＮＰＵの各々が図４の初期化命令を行い、これは図５では累算器２０２へのゼロ値の代入によって図示されている。
【０１２１】
クロック１に、１０２４個のナローＮＰＵの各々が、図２０のアドレス１の積和命令を行う。示されるように、ナローＮＰＵ０−Ａは、累算器２０２Ａの値（ゼロである）を、データＲＡＭ１２２の行１７のナローワード０と重みＲＡＭ１２４の行０のナローワード０との積と共に累算し、ナローＮＰＵ０−Ｂは、累算器２０２Ｂの値（ゼロである）を、データＲＡＭ１２２の行１７のナローワード１と重みＲＡＭ１２４の行０のナローワード１との積と共に累算し、以下同様に続き、ナローＮＰＵ５１１−Ｂは、累算器２０２Ｂの値（ゼロである）を、データＲＡＭ１２２の行１７のナローワード１０２３と重みＲＡＭ１２４の行０のナローワード１０２３との積と共に累算する。
【０１２２】
クロック２に、１０２４個のナローＮＰＵの各々が、図２０のアドレス２の積和循環命令の１回目の反復を行う。示されるように、ナローＮＰＵ０−Ａは、累算器２０２Ａの値２１７Ａを、ナローＮＰＵ５１１−Ｂのｍｕｘ−ｒｅｇ２０８Ｂの出力２０９Ｂから受け取られた循環されたナローデータワード１８１１Ａ（データＲＡＭ１２２から受け取られたナローデータワード１０２３であった）と重みＲＡＭ１２４の行１のナローワード０との積と共に累算し、ナローＮＰＵ０−Ｂは、累算器２０２Ｂの値２１７Ｂを、ナローＮＰＵ０−Ａのｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａから受け取られた循環されたナローデータワード１８１１Ｂ（データＲＡＭ１２２から受け取られたナローデータワード０であった）と重みＲＡＭ１２４の行１のナローワード１との積と共に累算し、以下同様に続き、ナローＮＰＵ５１１−Ｂは、累算器２０２Ｂの値２１７Ｂを、ナローＮＰＵ５１１−Ａのｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａから受け取られた循環されたナローデータワード１８１１Ｂ（データＲＡＭ１２２から受け取られたナローデータワード１０２２であった）と重みＲＡＭ１２４の行１のナローワード１０２３との積と共に累算する。
【０１２３】
クロック３に、１０２４個のナローＮＰＵの各々は、図２０のアドレス２の積和循環命令の２回目の反復を行う。示されるように、ナローＮＰＵ０−Ａは、累算器２０２Ａの値２１７Ａを、ナローＮＰＵ５１１−Ｂのｍｕｘ−ｒｅｇ２０８Ｂの出力２０９Ｂから受け取られた循環されたナローデータワード１８１１Ａ（データＲＡＭ１２２から受け取られたナローデータワード１０２２であった）と重みＲＡＭ１２４の行２のナローワード０との積と共に累算し、ナローＮＰＵ０−Ｂは、累算器２０２Ｂの値２１７Ｂを、ナローＮＰＵ０−Ａのｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａから受け取られた循環されたナローデータワード１８１１Ｂ（データＲＡＭ１２２から受け取られたナローデータワード１０２３であった）と重みＲＡＭ１２４の行２のナローワード１との積と共に累算し、以下同様に続き、ナローＮＰＵ５１１−Ｂは、累算器２０２Ｂの値２１７Ｂを、ナローＮＰＵ５１１−Ａのｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａから受け取られた循環されたナローデータワード１８１１Ｂ（データＲＡＭ１２２から受け取られたナローデータワード１０２１であった）と重みＲＡＭ１２４の行２のナローワード１０２３との積と共に累算する。図２１の省略記号によって指示されるように、これは、・・・に至るまで、続く１０２１クロックサイクルの各々について継続する。
【０１２４】
クロック１０２４に、１０２４個のナローＮＰＵの各々が、図２０のアドレス２の積和循環命令の１０２３回目の反復を行う。示されるように、ナローＮＰＵ０−Ａは、累算器２０２Ａの値２１７Ａを、ナローＮＰＵ５１１−Ｂのｍｕｘ−ｒｅｇ２０８Ｂの出力２０９Ｂから受け取られた循環されたナローデータワード１８１１Ａ（データＲＡＭ１２２から受け取られたナローデータワード１であった）と重みＲＡＭ１２４の行１０２３のナローワード０との積と共に累算し、ＮＰＵ０−Ｂは、累算器２０２Ｂの値２１７Ｂを、ＮＰＵ０−Ａのｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａから受け取られた循環されたナローデータワード１８１１Ｂ（データＲＡＭ１２２から受け取られたナローデータワード２であった）と重みＲＡＭ１２４の行１０２３のナローワード１との積と共に累算し、以下同様に続き、ＮＰＵ５１１−Ｂは、累算器２０２Ｂの値を、ＮＰＵ５１１−Ａのｍｕｘ−ｒｅｇ２０８Ａの出力２０９Ａから受け取られた循環されたナローデータワード１８１１Ｂ（データＲＡＭ１２２から受け取られたナローデータワード０であった）と重みＲＡＭ１２４の行１０２３のナローワード１０２３との積と共に累算する。
【０１２５】
クロック１０２５に、１０２４個のナローＮＰＵの各々のＡＦＵ２１２Ａ／２１２Ｂが、図２０のアドレス３の活性化関数命令を行う。最後、クロック１０２６に、１０２４個のナローＮＰＵの各々は、各自の結果１３３Ａ／１３３Ｂを、データＲＡＭ１２２の行１６の自身の対応するナローワードに書き戻すことにより、図２０のアドレス４におけるＡＦＵ出力書き出し命令を行い、すなわち、ＮＰＵ０−Ａのナロー結果１３３Ａは、データＲＡＭ１２２のナローワード０に書き込まれ、ＮＰＵ０−Ｂのナロー結果１３３Ｂは、データＲＡＭ１２２のナローワード１に書き込まれ、以下同様に続き、ＮＰＵ５１１−Ｂのナロー結果１３３は、データＲＡＭ１２２のナローワード１０２３に書き込まれる。図２１に関連して上記で説明した動作は、ブロック図の形態で図２２にさらに示される。
【０１２６】
次いで図２２を参照すると、図１８のＮＰＵ１２６を含んで図２０のプログラムを実行する図１のＮＮＵ１２１を図示するブロック図が示される。ＮＮＵ１２１は、５１２個のＮＰＵ１２６、すなわち１０２４個のナローＮＰＵ、アドレス入力１２３を受け取るデータＲＡＭ１２２、及びアドレス入力１２５を受け取る重みＲＡＭ１２４を含む。示されていないが、クロック０に、１０２４個のナローＮＰＵは、図２０の初期化命令を行う。示されるように、クロック１に、行１７の１０２４個の８ビットのデータワードがデータＲＡＭ１２２から読み出され、１０２４個のナローＮＰＵに提供される。クロック１〜１０２４に、行０〜１０２３の１０２４個の８ビット重みワードが、それぞれ、重みＲＡＭ１２４から読み出され、１０２４個のナローＮＰＵに提供される。示されていないが、クロック１に、１０２４個のナローＮＰＵが、ロードされたデータワード及び重みワードにそれぞれの積和演算を行う。クロック２〜１０２４に、１０２４個のナローＮＰＵのｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂが、１０２４個の８ビットワードの循環器として動作して、前にロードされたデータＲＡＭ１２２の行１７のデータワードを、隣接するナローＮＰＵに循環させ、ナローＮＰＵは、それぞれの循環されたナローデータワードと重みＲＡＭ１２４からロードされたそれぞれのナロー重みワードとに積和演算を行う。図示されていないが、クロック１０２５に、１０２４個のナローＡＦＵ２１２Ａ／２１２Ｂが活性化命令を行う。クロック１０２６に、１０２４個のナローＮＰＵが、それぞれの１０２４個の８ビットの結果１３３Ａ／１３３Ｂを、データＲＡＭ１２２の行１６に書き戻す。
【０１２７】
観察できるように、図１８の実施形態は、例えば図２の実施形態よりも有利である可能性があり、これは、なぜならば、モデル化される特定の応用例によってワイドのデータ及び重みワード（例えば、１６ビット）の量の精度が必要とされるときにそうしたワードを、応用例によってナローのデータ及び重みワード（例えば、８ビット）の量の精度が必要とされるときにそうしたワードを使用して、計算を実行する柔軟性をプログラマに提供するからである。ある観点から見ると、図１８の実施形態は、ナローデータの応用例について、追加のナロー要素（例えば、ｍｕｘ−ｒｅｇ２０８Ｂ、ｒｅｇ２０５Ｂ、ナローＡＬＵ２０４Ｂ、ナロー累算器２０２Ｂ、ナローＡＦＵ２１２Ｂ）という犠牲を払って、図２の実施形態を上回って２倍のスループットを提供し、上記追加のナロー要素は、ＮＰＵ１２６の面積において約５０％の増大である。
【０１２８】
３モードＮＰＵ
次いで図２３を参照すると、代替的な一実施形態による、図１の動的に構成可能なＮＰＵ１２６を図示するブロック図が示される。図２３のＮＰＵ１２６は、ワイド構成及びナロー構成においてだけでなく、さらに、本明細書で「じょうご（funnel）」構成と呼ぶ第３の構成において構成可能である。図２３のＮＰＵ１２６は、多くの点で図１８のＮＰＵ１２６に似ている。ただし、図１８のワイド加算器２４４Ａが、図２３のＮＰＵ１２６では、ナローｍｕｘ１８９６Ｂの出力の拡張されたバージョンである第３の加数２３９９を受け取る３入力ワイド加算器２３４４Ａに置き換えられている。図２３のＮＰＵ１２６を有するＮＮＵ１２１を動作させるためのプログラムは、大半の点で図２０のプログラムと似ている。ただし、アドレス０のＮＰＵ初期化命令は、ＮＰＵ１２６を、ナロー構成ではなくじょうご構成に初期化する。加えて、アドレス２の積和循環命令のカウントは、１０２３ではなく５１１である。
【０１２９】
じょうご構成にあるとき、ＮＰＵ１２６は、図２０のアドレス１などにおける積和命令を行うとき、２つのナローデータワード２０７Ａ／２０７Ｂ及び２つのナロー重みワード２０６Ａ／２０６Ｂを受け取るという点で、ナロー構成にあるときと同様に動作する。ワイド乗算器２４２Ａは、データワード２０９Ａと重みワード２０３Ａとを乗算して積２４６Ａを生成し、その積をワイドｍｕｘ１８９６Ａが選択する。ナロー乗算器２４２Ｂは、データワード２０９Ｂと重みワード２０３Ｂとを乗算して積２４６Ｂを生成し、その積をナローｍｕｘ１８９６Ｂが選択する。ただし、ワイド加算器２３４４Ａは、積２４６Ａ（ワイドｍｕｘ１８９６Ａによって選択される）と積２４６Ｂ／２３９９（ワイドｍｕｘ１８９６Ｂによって選択される）との双方をワイド累算器２０２Ａの値２１７Ａに加算し、ナロー加算器２４４Ｂ及びナロー累算器２０２Ｂは非アクティブである。さらに、じょうご構成にあるとき、図２０のアドレス２におけるものなどの積和循環命令を実行するときに、制御入力２１３は、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂに、２つのナローワード（例えば、１６ビット）ずつ循環させ、すなわち、ｍｕｘ−ｒｅｇ２０８Ａ／２０８Ｂは、ワイド構成にあるかのように、それぞれの２１１Ａ／２１１Ｂの入力を選択する。ただし、ワイド乗算器２４２Ａは、データワード２０９Ａと重みワード２０３Ａとを乗算して積２４６Ａを生成し、それをワイドｍｕｘ１８９６Ａが選択し、ナロー乗算器２４２Ｂは、データワード２０９Ｂと重みワード２０３Ｂとを乗算して積２４６Ｂを生成し、それをナローｍｕｘ１８９６Ｂが選択し、ワイド加算器２３４４Ａは、積２４６Ａ（ワイドｍｕｘ１８９６Ａによって選択される）と積２４６Ｂ／２３９９（ワイドｍｕｘ１８９６Ｂによって選択される）との双方をワイド累算器２０２Ａの値２１７Ａに加算し、ナロー加算器２４４Ｂ及びナロー累算器２０２Ｂは、上記のように非アクティブである。最後、じょうご構成にあるとき、図２０のアドレス３におけるものなどの活性化関数命令を実行するときに、ワイドＡＦＵ２１２Ａは、結果として生じる和２１５Ａに活性化関数を行ってナロー結果１３３Ａを生成し、ナローＡＦＵ２１２Ｂは非アクティブである。したがって、ＡのナローＮＰＵだけがナロー結果１３３Ａを生成し、ＢのナローＮＰＵによって生成されたナロー結果１３３Ｂは無効である。その結果、書き戻される結果の行（例えば、図２０のアドレス４にある命令のように行１６）は、穴を含んでいる。これは、ナロー結果１３３Ａだけが有効であり、ナロー結果１３３Ｂは無効であるためである。したがって、概念的には、各クロックサイクルに、各ニューロン（図２３のＮＰＵ１２６）は、２つの接続データ入力を処理し、すなわち２つのナローデータワードにそれぞれの重みを乗算し、２つの積を累算する。このことは、１クロックサイクルにつき１つのみの接続データ入力を各々処理する図２及び図１８の実施形態と対照的である。
【０１３０】
図２３の実施形態に関連して観察できるように、作り出され、データＲＡＭ１２２又は重みＲＡＭ１２４に書き戻される結果ワード（ニューロン出力）の数は、受け取られるデータ入力（接続）の数の平方根の半分になり、書き戻された結果の行は穴を有し、すなわち１つおきのナローワード結果が無効であり、より具体的にはＢのナローＮＰＵの結果は有意でない。そのため、図２３の実施形態は、２つの連続した層を持ち、例えば第１の層が第２の層の２倍の数のニューロンを有する（例えば、第１の層が、５１２個のニューロンからなる第２の層に完全に接続された１０２４個のニューロンを持つ）ニューラルネットワークにおいて特に効率的である可能性がある。さらに、他の実行ユニット１１２（例えば、ｘ８６  ＡＶＸユニットなどのメディアユニット）は、ＮＮＵ１２１がデータＲＡＭ１２２及び／又は重みＲＡＭ１２４の他の行に関連する他の計算を行っている間、必要であれば、後の計算で使用するために、散在した結果の行（すなわち穴がある）にパック動作を行ってそれをコンパクトにする（すなわち穴をなくす）ことができる。
【０１３１】
ハイブリッドのＮＮＵ動作、畳み込み及びプーリング機能
本明細書に記載される実施形態によるＮＮＵ１２１の利点は、ＮＮＵ１２１が、同時に、独自の内部プログラムを実行する点でコプロセッサに似たやり方で動作し、自身に対して発行されたアーキテクチャ命令（又はそれから翻訳されたマイクロ命令）を実行する点でプロセッサの実行ユニットに似たやり方で動作することができる点である。アーキテクチャ命令は、ＮＮＵ１２１を含むプロセッサによって行われているアーキテクチャプログラムの命令である。このようにして、ＮＮＵ１２１は、ハイブリッド式に動作し、このことは、ＮＮＵ１２１の高度の利用を維持する能力を提供するため、有利である。例えば、図２４〜図２６は、ＮＮＵ１２１が高度に利用される畳み込み演算を行うＮＮＵ１２１の動作を図示し、図２７〜図２８は、プーリング演算を行うＮＮＵ１２１の動作を図示し、これらは、畳み込み層及びプーリング層、並びに画像処理（例えば、エッジ検出、鮮明化、ぼかし処理、認識／分類）などの他のデジタルデータ演算の応用例に必要とされる。ただし、ＮＮＵ１２１のハイブリッド動作は、畳み込み又はプーリング演算を行うことに限定されず、このハイブリッドな特徴を使用して、上記で図４〜図１３に関連して説明したような典型的なニューラルネットワークの積和や活性化関数演算などの他の演算を行うことができる。すなわち、プロセッサ１００（より具体的には、リザベーションステーション１０８）が、ＭＴＮＮ１４００及びＭＦＮＮ１５００命令をＮＮＵ１２１に発行し、このことに応答して、ＮＮＵ１２１は、データをメモリ１２２／１２４／１２９に書き込み、ＮＮＵ１２１によりメモリ１２２／１２４に書き込まれた結果をメモリ１２２／１２４から読み出し、一方で、同時に、ＮＮＵ１２１は、（ＭＴＮＮ１４００命令を介して）プロセッサ１００によってプログラムメモリ１２９に書き込まれたプログラムの実行に応答して、メモリ１２２／１２４／１２９の読み出し及び書き込みを行う。
【０１３２】
次いで図２４を参照すると、畳み込み演算を行うために図１のＮＮＵ１２１によって使用されるデータ構造の例を図示するブロック図が示される。このブロック図は、畳み込みカーネル２４０２、データ配列２４０４、並びに図１のデータＲＡＭ１２２及び重みＲＡＭ１２４を含んでいる。好ましくは、データ配列２４０４（例えば、画像画素の）は、プロセッサ１００に取り付けられたシステムメモリ（図示せず）に保持され、プロセッサ１００がＭＴＮＮ命令１４００を実行することにより、ＮＮＵ１２１の重みＲＡＭ１２４にロードされる。畳み込み演算は、第１の行列を第２の行列で畳み込む演算であり、第２の行列を本明細書では畳み込みカーネルと呼ぶ。本開示の文脈において理解されるように、畳み込みカーネルは係数の行列であり、係数は、重み、パラメータ、要素、又は値と呼ばれることもある。好ましくは、畳み込みカーネル２０４２は、プロセッサ１００によって実行されているアーキテクチャプログラムの静的なデータである。
【０１３３】
データ配列２４０４は、データ値の２次元配列であり、各データ値（例えば、画像画素値）は、データＲＡＭ１２２又は重みＲＡＭ１２４のワードのサイズ（例えば、１６ビット又は８ビット）である。この例では、データ値は１６ビットワードであり、ＮＮＵ１２１は、５１２個のワイド構成のＮＰＵ１２６として構成されている。加えて、この実施形態では、ＮＰＵ１２６は、下記でより詳細に説明するように、重みＲＡＭ１２４から重みワード２０６を受け取るｍｕｘ−ｒｅｇ、例えば図７のｍｕｘ−ｒｅｇ７０５などを備えて、重みＲＡＭ１２４から受け取られたデータ値の行の、集合的な循環器動作を行う。この例では、データ配列２４０４は、２５６０列×１６００行の画素配列である。アーキテクチャプログラムがデータ配列２４０４を畳み込みカーネル２４０２で畳み込むとき、アーキテクチャプログラムは、示されるように、データ配列２４０４を２０個のチャンクに分け、各チャンクは、５１２×４００のデータ行列２４０６である。
【０１３４】
畳み込みカーネル２０４２は、この例では、係数、又は重み、又はパラメータ、又は要素の３×３行列である。係数の１番目の行を、Ｃ０，０；Ｃ０，１；及びＣ０，２と表し、係数の２番目の行を、Ｃ１，０；Ｃ１，１；及びＣ１，２と表し、係数の３番目の行を、Ｃ２，０；Ｃ２，１；及びＣ２，２と表す。例えば、エッジ検出を行うために使用され得る畳み込みカーネルは、０、１、０、１、−４、１、０、１、０、の係数を有する。別の例として、画像のガウスぼかしに使用され得る畳み込みカーネルは、１、２、１、２、４、２、１、２、１、の係数を有する。この場合、通例は除算が最終的な累算値に行われ、除数は、畳み込みカーネル２０４２の要素の絶対値の和であり、この例では１６である。別の例として、除数は、畳み込みカーネル２０４２の要素の数である。別の例として、除数は、畳み込みを圧縮して所望の値の範囲内に戻す値であり、除数は、畳み込みカーネル２０４２の要素の値と、上記所望の範囲と、畳み込み対象の行列の入力値の範囲とから決定される。
【０１３５】
図２４に示し、下記で図２５との関連でより詳細に説明するように、アーキテクチャプログラムは、データＲＡＭ１２２に、畳み込みカーネル２０４２の係数を書き込む。好ましくは、データＲＡＭ１２２の９つ（畳み込みカーネル２４０２の要素の数）の連続する行の各々のすべてのワードが、行優先の順序で、畳み込みカーネル２４０２の異なる要素を書き込まれる。すなわち、示されるように、ある行の各ワードが第１の係数Ｃ０，０を書き込まれ、次の行が第２の係数Ｃ０，１を書き込まれ、その次の行が第３の係数Ｃ０，２を書き込まれ、その次の行が第４の係数Ｃ１，０を書き込まれ、以下同様に続き、最後、９番目の行の各ワードが、第９の係数Ｃ２，２を書き込まれる。特に図２６Ａとの関連で下記でより詳細に説明するように、データ配列２４０４のチャンクのデータ行列２４０６を畳み込むために、ＮＰＵ１２６は、畳み込みカーネル２０４２の係数を保持しているデータＲＡＭ１２２の９行を、順に、繰り返し読み出す。
【０１３６】
図２４に示し、図２５に関連してより詳細に説明するように、アーキテクチャプログラムは、重みＲＡＭ１２４に、データ行列２４０６の値を書き込む。ＮＮＵプログラムが、畳み込みを行うとき、ＮＮＵプログラムは、結果として生じる行列を重みＲＡＭ１２４に書き戻す。好ましくは、図２５に関連して下記でより詳細に説明するように、アーキテクチャプログラムは、第１のデータ行列２４０６を重みＲＡＭ１２４に書き込み、ＮＮＵ１２１を開始し、ＮＮＵ１２１が第１のデータ行列２４０６を畳み込みカーネル２０４２で畳み込んでいる間、アーキテクチャプログラムは、第２のデータ行列２４０６を重みＲＡＭ１２４に書き込む。そのため、ＮＮＵ１２１が第１のデータ行列２４０６の畳み込みを完了すると、ＮＮＵ１２１は直ちに第２のデータ行列２４０６の畳み込みを開始することができる。このように、アーキテクチャプログラムは、ＮＮＵ１２１を最大限に利用された状態に保つために、重みＲＡＭ１２４の２つの領域の間を行き来する。したがって、図２４の例は、重みＲＡＭ１２４の行０〜３９９を占めている第１のチャンクに対応する第１のデータ行列２４０６Ａ、及び、重みＲＡＭ１２４の行５００〜８９９を占めている第２のチャンクに対応する第２のデータ行列２４０６Ｂを示している。さらに、示されるように、ＮＮＵ１２１は、畳み込みの結果を、重みＲＡＭ１２４の行９００〜１２９９及び１３００〜１６９９に書き戻し、これをアーキテクチャプログラムが後に重みＲＡＭ１２４から読み出す。重みＲＡＭ１２４に保持されているデータ行列２４０６のデータ値を「Ｄｘ，ｙ」と表し、「ｘ」は重みＲＡＭ１２４の行番号であり、「ｙ」は重みＲＡＭ１２４のワード又は列番号である。したがって、例えば、行３９９のデータワード５１１は、図２４でＤ３９９，５１１と表されており、これは、ＮＰＵ５１１のｍｕｘ−ｒｅｇ７０５によって受け取られる。
【０１３７】
次いで図２５を参照すると、図１のプロセッサ１００が、ＮＮＵ１２１を使用するアーキテクチャプログラムを行って、図２４の畳み込みカーネル２０４２とデータ配列２４０４との畳み込みを行う動作を図示するフローチャートが示される。フローはブロック２５０２で開始する。
【０１３８】
ブロック２５０２で、プロセッサ１００、すなわちプロセッサ１００で稼働しているアーキテクチャプログラムが、図２４の畳み込みカーネル２０４２を、図２４に示し図２４に関連して説明したようにデータＲＡＭ１２２に書き込む。加えて、アーキテクチャプログラムは、変数Ｎを１の値に初期化する。変数Ｎは、ＮＮＵ１２１によって処理されているデータ配列２４０４の現在のチャンクを表す。加えて、アーキテクチャプログラムは、変数ＮＵＭ＿ＣＨＵＮＫＳを２０の値に初期化する。フローはブロック２５０４に進む。
【０１３９】
ブロック２５０４で、プロセッサ１００は、図２４に示すように、チャンク１のデータ行列２４０６を重みＲＡＭ１２４に書き込む（例えば、チャンク１のデータ行列２４０６Ａ）。フローはブロック２５０６に進む。
【０１４０】
ブロック２５０６で、プロセッサ１００は、プログラムメモリ１２９に書き込む関数１４３２を指定するＭＴＮＮ１４００命令を使用して、畳み込みプログラムをＮＮＵ１２１のプログラムメモリ１２９に書き込む。次いで、プロセッサ１００は、プログラムの実行を開始する関数１４３２を指定するＭＴＮＮ１４００命令を使用して、ＮＮＵ畳み込みプログラムを開始する。ＮＮＵ畳み込みプログラムの一例は、図２６Ａに関連してより詳細に説明する。フローは判定ブロック２５０８に進む。
【０１４１】
判定ブロック２５０８で、アーキテクチャプログラムは、変数Ｎの値がＮＵＭ＿ＣＨＵＮＫＳより小さいかどうかを決定する。小さい場合、フローはブロック２５１２に進み、そうでない場合、フローはブロック２５１４に進む。
【０１４２】
ブロック２５１２で、プロセッサ１００は、図２４に示すように、チャンクＮ＋１についてのデータ行列２４０６を重みＲＡＭ１２４に書き込む（例えば、チャンク２のデータ行列２４０６Ｂ）。このように、有利な点として、アーキテクチャプログラムは、ＮＮＵ１２１が現在のチャンクに畳み込みを行っている間に、次のチャンクのデータ行列２４０６を重みＲＡＭ１２４に書き込み、そのため、ＮＮＵ１２１は、現在のチャンクの畳み込みが完了する、すなわち重みＲＡＭ１２４に書き込まれると、直ちに次のチャンクに畳み込みの実行を開始することができる。フローはブロック２５１４に進む。
【０１４３】
ブロック２５１４で、プロセッサ１００は、現在稼働しているＮＮＵプログラム（チャンク１の場合はブロック２５０６で開始され、チャンク２〜２０の場合はブロック２５１８で開始されたもの）が完了したことを決定する。好ましくは、プロセッサ１００は、ＭＦＮＮ１５００命令を実行してＮＮＵ１２１の状態レジスタ１２７を読み出すことにより、これを決定する。代替的な一実施形態では、ＮＮＵ１２１は、畳み込みプログラムを完了したことを示す割込みを生成する。フローは判定ブロック２５１６に進む。
【０１４４】
判定ブロック２５１６で、アーキテクチャプログラムは、変数Ｎの値がＮＵＭ＿ＣＨＵＮＫＳより小さいかどうかを決定する。小さい場合、フローはブロック２５１８に進み、そうでない場合、フローはブロック２５２２に進む。
【０１４５】
ブロック２５１８で、プロセッサ１００は、畳み込みプログラムを更新して、チャンクＮ＋１の畳み込みを行えるようにする。より具体的には、プロセッサ１００は、アドレス０におけるＮＰＵ初期化命令の重みＲＡＭ１２４の行値を、データ行列２４０６の１番目の行（例えば、データ行列２４０６Ａについて、行０、又は、データ行列２４０６Ｂについて、行５００）に更新し、出力行を（例えば、９００又は１３００に）更新する。プロセッサ１００は、次いで、更新されたＮＮＵ畳み込みプログラムを開始する。フローはブロック２５２２に進む。
【０１４６】
ブロック２５２２で、プロセッサ１００は、チャンクＮについてＮＮＵ畳み込みプログラムの結果を、重みＲＡＭ１２４から読み出す。フローは判定ブロック２５２４に進む。
【０１４７】
判定ブロック２５２４で、アーキテクチャプログラムは、変数Ｎの値がＮＵＭ＿ＣＨＵＮＫＳより小さいかどうかを決定する。小さい場合、フローはブロック２５２６に進み、そうでない場合、フローは終了する。
【０１４８】
ブロック２５２６で、アーキテクチャプログラムは、Ｎを１だけ増分する。フローは判定ブロック２５０８に戻る。
【０１４９】
次いで図２６Ａを参照すると、図２４のデータ行列２４０６と畳み込みカーネル２０４２との畳み込みを行い、それを重みＲＡＭ１２４に書き戻すＮＮＵプログラムのプログラムリストが示される。このプログラムは、アドレス１〜９の命令のループ本体を通じて複数回ループする。アドレス０のＮＰＵ初期化命令は、各ＮＰＵ１２６がループ本体を実行する回数を指定し、ループ本体は、図２６Ａの例では、図２４のデータ行列２４０６内の行の数に対応する４００のループカウント値を有し、ループの最後（アドレス１０）におけるループ命令は、現在のループカウント値を減分し、その結果が非ゼロである場合、ループ本体の先頭に（すなわちアドレス１の命令に）制御を戻す。ＮＰＵ初期化命令はさらに、累算器２０２をゼロにクリアする。好ましくは、アドレス１０のループ命令がさらに、累算器２０２をゼロにクリアする。或いは、上記のように、アドレス１の積和命令が、累算器２０２をゼロにクリアすることを指定してもよい。
【０１５０】
プログラムのループ本体が実行されるたび、５１２個のＮＰＵ１２６が、３×３の畳み込みカーネル２４０２と、データ行列２４０６の５１２個それぞれの３×３部分行列との、５１２の畳み込みを同時に行う。畳み込みは、畳み込みカーネル２０４２の要素と、上記それぞれの部分行列のうちその対応する要素との、９つの積の和である。図２６Ａの実施形態では、５１２個それぞれの３×３部分行列各々の原点（中央の要素）が、図２４のデータワードＤｘ＋１、ｙ＋１であり、ここで、ｙ（列番号）はＮＰＵ１２６の番号であり、ｘ（行番号）は、図２６Ａのプログラムのアドレス１における積和命令によって読み出される現在の重みＲＡＭ１２４の行番号である（また、行番号は、アドレス０のＮＰＵ初期化命令によって初期化され、アドレス３及び５の積和命令の各々で増分され、アドレス９の減分命令によって更新される）。したがって、プログラムの各ループについて、５１２個のＮＰＵ１２６が５１２個の畳み込みを計算し、５１２個の畳み込み結果を、重みＲＡＭ１２４の指定された行に書き戻す。この説明では、簡略のためにエッジ処理は無視するが、ＮＰＵ１２６の集合的循環機能の使用は、列のうち２つをデータ行列２４０６（例えば、画像処理の場合は画像の）の一方の縦方向のエッジからもう一方の縦方向のエッジに（例えば、左のエッジから右のエッジへ、又はその逆）送ること（wrapping）を引き起こすことに留意されたい。次いでループ本体について説明する。
【０１５１】
アドレス１にあるのは、データＲＡＭ１２２の行０を指定し、現在の重みＲＡＭ１２４の行を暗黙的に使用する積和命令であり、上記現在の行は、好ましくは、シーケンサ１２８に保持される（また、ループ本体の最初の通過のために、アドレス０の命令によってゼロに初期化される）。すなわち、アドレス１の命令は、ＮＰＵ１２６の各々に、各自の対応するワードをデータＲＡＭ１２２の行０から読み出させ、各自の対応するワードを現在の重みＲＡＭ１２４の行から読み出させ、その２つのワードに対する積和演算を行わせる。したがって、例えば、ＮＰＵ５は、Ｃ０，０とＤｘ，５とを乗算し（「ｘ」は現在の重みＲＡＭ１２４の行）、その結果を累算器２０２の値２１７に加算し、その和を累算器２０２に書き戻す。
【０１５２】
アドレス２にあるのは、データＲＡＭ１２２の行を増分（すなわち、行１に増分）してから、増分されたアドレスにおける行をデータＲＡＭ１２２から読み出すように指定する積和命令である。この命令はさらに、各ＮＰＵ１２６のｍｕｘ−ｒｅｇ７０５内の値を隣接するＮＰＵ１２６に循環させることを指定し、これは、この場合、アドレス１の命令に応答して重みＲＡＭ１２４から読み出されたばかりのデータ行列２４０６の値の行である。図２４〜図２６の実施形態では、ＮＰＵ１２６は、図３、図７、及び図１９に関連して上記で説明したように、ｍｕｘ−ｒｅｇ７０５の値を左に、すなわち、ＮＰＵ  ＪからＮＰＵ  Ｊ＋１へではなくＮＰＵ  ＪからＮＰＵ  Ｊ−１に循環させるように構成される。ＮＰＵ１２６が右に循環するように構成される実施形態では、同様の畳み込み結果を達成するために、アーキテクチャプログラムは、畳み込みカーネル２０４２の係数値をデータＲＡＭ１２２に、異なる順序で（例えば、中央の列を中心に循環させる）書き込むことができることを理解されたい。さらに、アーキテクチャプログラムは、必要に応じて、畳み込みカーネル２０４２の追加的な事前処理（例えば、互換）を行ってもよい。加えて、命令は、２のカウント値を指定する。したがって、アドレス２の命令は、ＮＰＵ１２６の各々に、各自の対応するワードをデータＲＡＭ１２２の行１から読み出させ、循環されたワードをｍｕｘ−ｒｅｇ７０５へと受け取らせ、その２つのワードに対する積和演算を行わせる。カウント値が２であるために、命令はさらに、ＮＰＵ１２６の各々にすぐ上記で説明した動作を繰り返させる。すなわち、シーケンサ１２８は、データＲＡＭ１２２の行アドレス１２３を増分（すなわち行２に増分）し、各ＮＰＵ１２６は、各自の対応するワードをデータＲＡＭ１２２の行２から読み出し、循環されたワードをｍｕｘ−ｒｅｇ７０５へと受け取り、その２つのワードに積和演算を行う。したがって、例えば、現在の重みＲＡＭ１２４の行が２７であると仮定すると、アドレス２の命令を実行した後、ＮＰＵ５は、自身の累算器２０２の中に、Ｃ０，１とＤ２７，６との積、及びＣ０，２とＤ２７，７との積を累算していることになる。したがって、アドレス１及び２における命令の完了後、Ｃ０，０とＤ２７，５との積、Ｃ０，１とＤ２７，６との積、及びＣ０，２とＤ２７，７との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器２０２に累算されていることになる。
【０１５３】
アドレス３及び４の命令は、アドレス１及び２の命令と同様の動作を行うが、重みＲＡＭ１２４の行増分インディケータがあるために、重みＲＡＭ１２４の次の行に対して動作を行い、またデータＲＡＭ１２２の次の３つの行、すなわち行３〜５に対して動作を行う。すなわち、例えばＮＰＵ５に関しては、アドレス１〜４の命令の完了後、Ｃ０，０とＤ２７，５との積、Ｃ０，１とＤ２７，６との積、Ｃ０，２とＤ２７，７との積、Ｃ１，０とＤ２８，５との積、Ｃ１，１とＤ２８，６との積、及びＣ１，２とＤ２８，７との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器２０２に累算されていることになる。
【０１５４】
アドレス５及びの６命令は、アドレス３及び４の命令と同様の動作を行うが、重みＲＡＭ１２４の次の行、及びデータＲＡＭ１２２の次の３つの行、すなわち行６〜８について行う。すなわち、例えばＮＰＵ５に関しては、アドレス１〜６の命令の完了後、Ｃ０，０とＤ２７，５との積、Ｃ０，１とＤ２７，６との積、Ｃ０，２とＤ２７，７との積、Ｃ１，０とＤ２８，５との積、Ｃ１，１とＤ２８，６との積、Ｃ１，２とＤ２８，７との積、Ｃ２，０とＤ２９，５との積、Ｃ２，１とＤ２９，６との積、及びＣ２，２とＤ２９，７との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器２０２に累算されていることになる。すなわち、アドレス１〜６の命令の完了後、そしてループ本体の開始時の重みＲＡＭ１２４の行が２７であったと仮定すると、例えばＮＰＵ５は、畳み込みカーネル２０４２を使用して、以下の３×３の部分行列の畳み込みを行っていることになる。
（外１）
2018092561.tif 000006
より一般的には、アドレス１〜６の命令の完了後、５１２個のＮＰＵ１２６の各々は、畳み込みカーネル２０４２を使用して、以下の３×３の部分行列の畳み込みを行っていることになる。
（外２）
2018092561.tif 000007
ここで、ｒはループ本体の開始時の重みＲＡＭ１２４の行アドレス値であり、ｎはＮＰＵ１２６の番号である。
【０１５５】
アドレス７の命令は、ＡＦＵ２１２を通じて、累算器２０２の値２１７をパススルーする。このパススルー関数は、データＲＡＭ１２２及び重みＲＡＭ１２４から読み出されるワードのサイズ（ビット単位）（すなわち、本例では１６ビット）であるワードをパススルーする。好ましくは、下記でより詳細に説明するように、ユーザが、出力の形式、例えば、出力ビットのうちいくつが小数ビットであるかを指定することができる。或いは、パススルー活性化関数を指定するのではなく、除算活性化関数が指定され、これは、例えば図２９Ａ及び図３０に関連して本明細書に記載されるように、例えば図３０の「除算器」３０１４／３０１６の１つを使用して累算器２０２の値２１７を除数で割る。例えば、上記のガウスぼかしカーネルの１６分の１係数などの係数を伴う畳み込みカーネル２０４２の場合、パススルー関数ではなく、アドレス７の活性化関数命令が、除算（例えば、１６で割る）活性化関数を指定することができる。或いは、アーキテクチャプログラムは、データＲＡＭ１２２に畳み込みカーネル２０４２の係数を書き込む前に、これらに１６による除算を行い、このことに応じて畳み込みカーネル２４０２の値について、例えば下記の図２９のデータの２進小数点２９２２を使用して、２進小数点の場所を調節することができる。
【０１５６】
アドレス８の命令は、ＡＦＵ２１２の出力を、出力行レジスタの現在の値で指定される重みＲＡＭ１２４の行に書き込む。上記出力行レジスタは、アドレス０の命令で初期化されており、この命令中に増分インディケータがあるため、ループを通過するたびに増分される。
【０１５７】
３×３の畳み込みカーネル２４０２を有する図２４〜図２６の例から判断できるように、ＮＰＵ１２６は、約３クロックサイクルごとに重みＲＡＭ１２４を読み出してデータ行列２４０６の行を読み出し、畳み込み結果行列を書き込むためにおよそ１２クロックサイクルごとに重みＲＡＭ１２４に書き込みをする。加えて、図１７のバッファ１７０４など、読み出し及び書き込みバッファを含んでいる実施形態を仮定すると、ＮＰＵ１２６が読み出し及び書き込みを行うのと同時に、プロセッサ１００が重みＲＡＭ１２４の読み出し及び書き込みを行い、その結果、バッファ１７０４は、約１６クロックサイクルごとに重みＲＡＭ１２４の１回の書き込みと１回の読み出しとを行って、それぞれ、データ行列２４０６を書き込み、畳み込みの結果行列を読み出す。したがって、重みＲＡＭ１２４の帯域幅の約半分が、ＮＮＵ１２１が畳み込み演算を行うハイブリッドな仕方によって消費される。この例は３×３の畳み込みカーネル２０４２を含むが、２×２、４×４、５×５、６×６、７×７、８×８等の行列など、他のサイズの畳み込みカーネルが用いられることも可能であり、その場合はＮＮＵプログラムが変化する。より大きな畳み込みカーネルの場合、より小さいパーセンテージの重みＲＡＭ１２４の帯域幅が、消費される。これは、ＮＰＵ１２６がより小さいパーセンテージの時間、重みＲＡＭを読み出すためであり、なぜならば、積和命令の循環バージョンにおけるカウントが（例えば、図２６Ａのプログラムのアドレス２、４、及び６、並びにより大きい畳み込みカーネルの場合に必要となるであろう追加的な同様の命令において）より大きいからである。
【０１５８】
或いは、畳み込みの結果を重みＲＡＭ１２４の異なる行（例えば、９００〜１２９９及び１３００〜１６９９）に書き戻すのではなく、アーキテクチャプログラムは、入力データ行列２４０６の行を、それらの行が必要でなくなった後に上書きするようにＮＮＵプログラムを構成する。例えば、３×３の畳み込みカーネルの場合、データ行列２４０６を重みＲＡＭ１２４の行０〜３９９に書き込むのではなく、アーキテクチャプログラムは、データ行列２４０６を行２〜４０１に書き込み、ＮＮＵプログラムは、畳み込みの結果を、重みＲＡＭ１２４の行０から始めてループ本体を通過するたびに増分する行に書き込むように構成される。このようにして、ＮＮＵプログラムは、もう必要でなくなった行だけを上書きする。例えば、ループ本体の１回目の通過の後（より具体的には、重みＲＡＭ１２４の行０にロードするアドレス１の命令の実行後）、行０にあるデータは上書きできるようになるが、行１〜３にあるデータは、ループ本体を２回目に通過する際に必要になり、したがってループ本体の１回目の通過では上書きされない。同様に、ループ本体の２回目の通過後には、行１にあるデータが上書きできるようになるが、行２〜４にあるデータは、ループ本体を２回目に通過する際に必要となり、したがってループ本体の２回目の通過では上書きされず、以下同様に続く。そのような実施形態では、各データ行列２４０６（チャンク）の高さは、より大きくてよく（例えば、８００行）、結果として、より少ないチャンク数がもたらされる。
【０１５９】
或いは、畳み込みの結果を重みＲＡＭ１２４に書き戻すのではなく、アーキテクチャプログラムは、畳み込みの結果を畳み込みカーネル２４０２より上の（例えば、行８より上の）データＲＡＭ１２２の行に書き戻すようにＮＮＵプログラムを構成し、アーキテクチャプログラムは、ＮＮＵ１２１が結果を書き込むとき、それをデータＲＡＭ１２２から読み出す（例えば、下記の図２６Ｂの一番最近書き込まれたデータＲＡＭ１２２の行２６０６のアドレスを使用する）。この代替法は、重みＲＡＭ１２４がシングルポートでありデータＲＡＭ１２２がデュアルポートである実施形態で有利である可能性がある。
【０１６０】
図２４〜図２６Ａの実施形態によるＮＮＵ１２１の動作から観察できるように、図２６Ａのプログラムの各実行は、約５０００クロックサイクルを要し、その結果、図２４の２５６０×１６００のデータ配列２４０４全体を畳み込むには、約１００，０００クロックサイクルを要し、これは、同様の作業を従来の方法で行うために必要なクロックサイクル数よりもかなり少ない可能性がある。
【０１６１】
次いで図２６Ｂを参照すると、一実施形態による図１のＮＮＵ１２１の制御レジスタ１２７の特定のフィールドを図示するブロック図が示される。状態レジスタ１２７は、ＮＰＵ１２６によって書き込まれた重みＲＡＭ１２４の一番最近の行のアドレスを指示するフィールド２６０２、ＮＰＵ１２６によって書き込まれたデータＲＡＭ１２２の一番最近の行のアドレスを指示するフィールド２６０６、ＮＰＵ１２６によって読み出された重みＲＡＭ１２４の一番最近の行のアドレスを指示するフィールド２６０４、及び、ＮＰＵ１２６によって読み出されたデータＲＡＭ１２２の一番最近の行のアドレスを指示するフィールド２６０８を含む。これにより、プロセッサ１００で実行されているアーキテクチャプログラムは、ＮＮＵ１２１がデータＲＡＭ１２２及び／又は重みＲＡＭ１２４の読み出し及び／又は書き込みを進めるとき、ＮＮＵ１２１の進捗を決定することができる。上記のように入力データ行列を上書きする（又は上述のようにデータＲＡＭ１２２に結果を書き込む）選択肢と併せてこの能力を用いると、図２４のデータ配列２４０４は、以下のように、例えば、２０個の５１２×４００チャンクではなく、５個の５１２×１６００チャンクとして処理することができる。プロセッサ１００は、最初の５１２×１６００のチャンクを重みＲＡＭ１２４の行２から書き込み、ＮＮＵプログラム（１６００回のループカウント、及び初期化された０の重みＲＡＭ１２４の出力行を有する）を開始する。ＮＮＵ１２１がＮＮＵプログラムを実行するとき、プロセッサ１００は、重みＲＡＭ１２４の出力の場所／アドレスを監視して、（１）ＮＮＵ１２１によって書き込まれた有効な畳み込み結果を持つ重みＲＡＭ１２４の行（行０から開始する）を（ＭＦＮＮ１５００命令を使用して）読み出し、（２）有効な畳み込み結果がすでに読み出された後、該畳み込み結果の上に２番目の５１２×１６００のデータ行列２４０６を書き込む（行２から開始する）。それにより、ＮＮＵ１２１が最初の５１２×１６００チャンクに対してＮＮＵプログラムを完了するとき、プロセッサ１００は必要に応じて直ちにＮＮＵプログラムを更新し、ＮＮＵプログラムを再度開始して２番目の５１２×１６００チャンクを処理することができる。このプロセスは、残りの３つの５１２×１６００のチャンクに対してもう３回繰り返されて、ＮＮＵ１２１の高い利用率を達成する。
【０１６２】
有利な点として、一実施形態では、特に図２９Ａ及び図２９Ｂ及び図３０に関連して下記でより詳細に説明するように、ＡＦＵ２１２は、累算器２０２の値２１７の有効な除算を効率的に行う能力を備える。例えば、累算器２０２の値２１７を１６で割る活性化関数ＮＮＵ命令が、上記のガウスぼかし行列に使用できる。
【０１６３】
図２４の例で使用される畳み込みカーネル２４０２は、データ配列２４０４全体に適用される小さい静的な畳み込みカーネルであるが、他の実施形態では、畳み込みカーネルは、畳み込みニューラルネットワークに一般的に見られるような、データ配列２４０４の異なるデータ値に関連付けられた固有の重みを有する大きな行列であってもよい。ＮＮＵ１２１がそのようにして使用される場合、アーキテクチャプログラムは、データ行列の場所と畳み込みカーネルの場所とを入れ替えることができ、すなわち、データＲＡＭ１２２にデータ行列を、重みＲＡＭ１２４に畳み込みカーネルを置いてもよく、ＮＮＵプログラムの所与の実行で処理できる行の数は、相対的により少なくなる可能性がある。
【０１６４】
次いで図２７を参照すると、図１のＮＮＵ１２１によってプーリング演算が行われる入力データが投入された、図１の重みＲＡＭ１２４の一例を図示するブロック図が示される。人工ニューラルネットワークのプーリング層によって行われるプーリング演算は、入力行列の部分領域又は部分行列を取り出すことと、その部分行列の最大値又は平均値のどちらかを計算することとにより、入力データ（例えば、画像又は畳み込み画像）の行列の次元数を減らし、上記最大値又は平均値は、結果得られる行列、すなわちプーリングされた行列になる。図２７及び図２８の例では、プーリング演算は、各部分行列の最大値を計算する。プーリング演算は、例えばオブジェクト分類や検出を行う人工ニューラルネットワークで特に有用である。一般に、プーリング演算は、調べる部分行列内の要素数の因数によって（by  a  factor  of）、演算の入力行列のサイズを効果的に減らし、特に、各次元の入力行列を、部分行列の対応する次元にある要素数だけ減らす。図２７の例では、入力データは、重みＲＡＭ１２４の行０〜１５９９に記憶された、ワイドワード（例えば、１６ビット）の５１２×１６００行列である。図２７では、ワードは、各自の行、列の場所で表され、例えば、行０及び列０にあるワードはＤ０，０と表され、行０及び列１にあるワードはＤ０，１と表され、行０及び列２にあるワードはＤ０，２と表され、以下同様に続き、行０及び列５１１にあるワードはＤ０，５１１と表される。同様に、行１及び列０にあるワードはＤ１，０と表され、行１及び列１にあるワードはＤ１，１と表され、行１及び列２にあるワードはＤ１，２と表され、以下同様に続き、行１及び列５１１にあるワードはＤ１，５１１と表され、以下同様に続き、行１５９９及び列０にあるワードはＤ１５９９，０と表され、行１５９９及び列１にあるワードはＤ１５９９，１と表され、行１５９９及び列２にあるワードはＤ１５９９，２と表され、以下同様に続き、行１５９９及び列５１１にあるワードはＤ１５９９，５１１と表される。
【０１６５】
次いで図２８を参照すると、図２７の入力データ行列のプーリング演算を行い、それを重みＲＡＭ１２４に書き戻すＮＮＵプログラムのプログラムリストが示される。図２８の例では、プーリング演算は、入力データ行列の部分行列のそれぞれの４×４部分行列の最大値を計算する。プログラムは、アドレス１〜１０の命令のループ本体を複数回ループする。アドレス０にあるＮＰＵ初期化命令が、各ＮＰＵ１２６がループ本体を実行する回数を指定し、ループ本体は、図２８の例では４００のループカウント値を有し、ループの最後（アドレス１１）にあるループ命令は、現在のループカウント値を減分し、その結果が非ゼロである場合、ループ本体の先頭に（すなわちアドレス１の命令に）制御を戻す。重みＲＡＭ１２４内の入力データ行列は、ＮＮＵプログラムにより、４つの隣接する行、すなわち行０〜３、行４〜７、行８〜１１、及び以下同様に行１５９６〜１５９９までの４００個の相互に排他的なグループとして、効果的に扱われる。４つの隣接する行からなる各グループは、１２８個の４×４部分行列、すなわち、あるグループの４つの行と、それに隣接する４つの列、すなわち列０〜３、４〜７、８〜１１、及び以下同様に列５０８〜５１１との、交差によって形成される要素の４×４部分行列を含む。５１２個のＮＰＵ１２６のうち、５１２個のＮＰＵ１２６の４つごとのＮＰＵ１２６（すなわち１２８個）が、それぞれの４×４部分行列にプーリング演算を行い、ＮＰＵ１２６の他の４分の３は使用されない。より具体的には、ＮＰＵ０、４、８、及び以下同様にＮＰＵ５０８までが各々、そのそれぞれの４×４部分行列にプーリング演算を行い、該部分行列の一番左の列番号がＮＰＵ番号に対応し、該部分行列の下側の行が現在の重みＲＡＭ１２４の行値に対応する。上記現在の重みＲＡＭ１２４の行値は、下記でより詳細に説明するように、アドレス０の初期化命令によってゼロに初期化され、ループ本体が反復されるたびに４だけ増分される。ループ本体の４００回の反復は、図２７の入力データ行列の４×４部分行列からなるグループの数に対応している（入力データ行列の１６００行÷４）。ＮＰＵ初期化命令はさらに、累算器２０２をゼロにクリアする。好ましくは、アドレス１１のループ命令がさらに、累算器２０２をゼロにクリアする。或いは、アドレス１のｍａｘｗａｃｃ命令が累算器２０２をゼロにクリアすることを指定する。
【０１６６】
プログラムのループ本体が反復されるたびに、１２８個の使用されるＮＰＵ１２６が同時に、入力データ行列の現在の４行グループの１２８個のそれぞれの４×４部分行列の、１２８のプーリング演算を行う。より具体的には、プーリング演算は、４×４部分行列の１６個の要素のうち、最大値の要素を決定する。図２８の実施形態では、使用される１２８個のＮＰＵ１２６の各ＮＰＵ  ｙについて、４×４部分行列の左下の要素が、図２７の要素Ｄｘ，ｙであり、ｘは、ループ本体の開始時における現在の重みＲＡＭ１２４の行番号であり、これが、図２８のプログラムのアドレス１にあるｍａｘｗａｃｃ命令によって読み出される（さらに、行番号は、アドレス０のＮＰＵ初期化命令によって初期化され、アドレス３、５、及び７のｍａｘｗａｃｃ命令の各々で増分される）。プログラムのループごとに、使用される１２８個のＮＰＵ１２６は、現在の行のグループのそれぞれの１２８個の４×４部分行列のうち、その対応する最大値の要素を、重みＲＡＭ１２４の指定された行に書き戻す。次いでループ本体について説明する。
【０１６７】
アドレス１にあるのは、現在の重みＲＡＭ１２４の行を暗黙的に使用するｍａｘｗａｃｃ命令であり、現在の重みＲＡＭ１２４の行は、好ましくは、シーケンサ１２８に保持される（また、ループ本体の最初の通過のために、アドレス０の命令によってゼロに初期化される）。アドレス１の命令は、ＮＰＵ１２６の各々に、その対応するワードを重みＲＡＭ１２４の現在の行から読み出させ、該ワードを累算器２０２の値２１７と比較させ、累算器２０２に２つの値のうち最大値を記憶させる。したがって、例えば、ＮＰＵ８は、累算器２０２の値２１７とデータワードＤｘ，８（「ｘ」は現在の重みＲＡＭ１２４の行）とのうち最大値を決定し、その最大値を累算器２０２に書き戻す。
【０１６８】
アドレス２にあるのは、各ＮＰＵ１２６のｍｕｘ−ｒｅｇ７０５にある値を隣接するＮＰＵ１２６に循環させるように指定するｍａｘｗａｃｃ命令であり、これは、この場合、アドレス１の命令に応答して重みＲＡＭ１２４から読み出されたばかりの入力データ行列値の行である。図２７〜図２８の実施形態では、ＮＰＵ１２６は、上記で図２４〜図２６に関連して説明したように、ｍｕｘ−ｒｅｇ７０５の値を左に、すなわちＮＰＵ  ＪからＮＰＵ  Ｊ−１に循環させるように構成される。加えて、命令は、３のカウント値を指定する。したがって、アドレス２の命令は、ＮＰＵ１２６各々に、循環されたワードをｍｕｘ−ｒｅｇ７０５に受け取らせ、循環されたワードと累算器２０２の値２１７とのうち最大値を決定させ、次いでその動作をもう２回繰り返させる。すなわち、各ＮＰＵ１２６は、３回、循環されたワードをｍｕｘ−ｒｅｇ７０５中に受け取り、循環されたワードと累算器２０２の値２１７とのうちの最大値を決定する。したがって、例えば、ループ本体の開始時における現在の重みＲＡＭ１２４の行が３６であると仮定すると、アドレス１及び２の命令を実行した後、例えばＮＰＵ８は、自身の累算器２０２の中に、ループ本体の開始時の累算器２０２と、４つの重みＲＡＭ１２４ワード、Ｄ３６，８及びＤ３６，９及びＤ３６，１０及びＤ３６，１１とのうちの、最大値を記憶していることになる。
【０１６９】
アドレス３及び４のｍａｘｗａｃｃ命令は、アドレス１及び２の命令と同様の動作を行うが、重みＲＡＭ１２４の行増分インディケータがあるために、重みＲＡＭ１２４の次の行について動作を行う。すなわち、ループ本体の開始時における現在の重みＲＡＭ１２４の行が３６であると仮定すると、アドレス１〜４の命令の完了後、例えばＮＰＵ８は、自身の累算器２０２の中に、ループ本体の開始時の累算器２０２と、８つの重みＲＡＭ１２４ワード、Ｄ３６，８及びＤ３６，９及びＤ３６，１０及びＤ３６，１１及びＤ３７，８及びＤ３７，９及びＤ３７，１０及びＤ３７，１１とのうちの、最大値を記憶していることになる。
【０１７０】
アドレス５〜８のｍａｘｗａｃｃ命令は、アドレス３及び４の命令と同様の動作を行うが、重みＲＡＭ１２４の次の２つの行について動作を行う。すなわち、ループ本体の開始時における現在の重みＲＡＭ１２４の行が３６であると仮定すると、アドレス１〜８の命令の完了後、例えばＮＰＵ８は、自身の累算器２０２の中に、ループ本体の開始時の累算器２０２と、１６個の重みＲＡＭ１２４ワード、Ｄ３６，８及びＤ３６，９及びＤ３６，１０及びＤ３６，１１及びＤ３７，８及びＤ３７，９及びＤ３７，１０及びＤ３７，１１及びＤ３８，８及びＤ３８，９及びＤ３８，１０及びＤ３８，１１及びＤ３９，８及びＤ３９，９及びＤ３９，１０及びＤ３９，１１とのうちの、最大値を記憶していることになる。すなわち、アドレス１〜８の命令の完了後、そしてループ本体の開始時の重みＲＡＭ１２４の行が３６であったと仮定すると、例えばＮＰＵ８は、次の４×４部分行列の最大値を決定していることになる。
（外３）
2018092561.tif 000008
より一般的には、アドレス１〜８の命令の完了後、使用される１２８個のＮＰＵ１２６の各々は、次の４×４部分行列の最大値を決定していることになる。
（外４）
2018092561.tif 000009
ここで、ｒはループ本体の開始時の重みＲＡＭ１２４の行アドレス値であり、ｎはＮＰＵ１２６の番号である。
【０１７１】
アドレス９の命令は、累算器２０２の値２１７を、ＡＦＵ２１２を通じてパススルーする。このパススルー関数は、重みＲＡＭ１２４から読み出されるワードのサイズ（ビット単位）（すなわち、本例では１６ビット）であるワードをパススルーする。好ましくは、下記でより詳細に説明するように、ユーザが、出力の形式、例えば、出力ビットのうちいくつが小数ビットであるかを指定することができる。
【０１７２】
アドレス１０の命令は、累算器２０２の値２１７を、出力行レジスタの現在の値で指定される重みＲＡＭ１２４の行に書き込む。上記出力行レジスタは、アドレス０の命令で初期化されており、この命令中に増分インディケータがあるために、ループを通過するたびに増分される。より具体的には、アドレス１０の命令は、累算器２０２のワイドワード（例えば、１６ビット）を重みＲＡＭ１２４に書き込む。好ましくは、下記の図２９Ａ及び図２９Ｂに関連して下記でより詳細に説明するように、この命令は、出力２進小数点２９１６で指定されるように１６ビットを書き込む。
【０１７３】
観察できるように、ループ本体の反復によって重みＲＡＭ１２４に書き込まれる各行は、無効なデータを有する穴を含んでいる。すなわち、結果的に得られる１３３個のワイドワード、１〜３、５〜７、９〜１１、及び以下同様にワイドワード５０９〜５１１は、無効であり、すなわち使用されない。一実施形態では、ＡＦＵ２１２は、出力重みＲＡＭ１２４の行に書き戻すために、図１１の行バッファ１１０４などの行バッファの隣接するワードに結果をパックできるようにするｍｕｘを含む。好ましくは、活性化関数命令が各穴にあるワードの数を指定し、穴内のワード数が使用されて、ｍｕｘを制御して結果をパックする。一実施形態では、穴の数は、プーリングの３×３、４×４、５×５、６×６、又は７×７の部分行列の出力をパックするために、２から６の値として指定することができる。或いは、プロセッサ１００で実行されているアーキテクチャプログラムが、結果として生じる疎な（すなわち穴を含んでいる）結果行を重みＲＡＭ１２４から読み出し、例えばｘ８６  ＳＳＥ命令などのアーキテクチャパック命令を使用するメディアユニットなどの他の実行ユニット１１２を使用して、パック関数を行う。有利な点として、上記の仕方に似ると共にＮＮＵ１２１のハイブリッド的な性質を利用する同時的な仕方で、プロセッサ１００で実行されているアーキテクチャプログラムは、状態レジスタ１２７を読み出して、重みＲＡＭ１２４の一番最近書き込まれた行を監視し（例えば、図２６Ｂのフィールド２６０２）て、結果として生じる疎な行を読み出し、その行をパックし、これを重みＲＡＭ１２４の同じ行に書き戻すことができる。その結果、上記行は、畳み込み層や典型的なニューラルネットワーク層（すなわち積和層）など、ニューラルネットワークの次の層のための入力データ行列として使用できる状態になる。さらに、プーリング演算を４×４の部分行列に行う実施形態が記載されるが、図２８のＮＮＵプログラムは、３×３、５×５、６×６、又は７×７の部分行列など、他のサイズの部分行列にプーリング演算を行うように変更を加えられてもよい。
【０１７４】
さらに観察されるように、重みＲＡＭ１２４に書き込まれる結果行の数は、入力データ行列の行の数の４分の１である。最後、この例では、データＲＡＭ１２２は使用されない。しかし、別法として、重みＲＡＭ１２４ではなく、データＲＡＭ１２２がプーリング演算を行うために使用されてもよい。
【０１７５】
図２７及び図２８の例では、プーリング演算は、部分領域の最大値を計算する。しかし、図２８のプログラムは、例えば、ｍａｘｗａｃｃ命令をｓｕｍｗａｃｃ命令（重みワードを累算器２０２の値２１７に足す）に置き換えることと、アドレス９の活性化関数命令を変更して、累算されている結果を、この例では１６である各部分領域の要素数で（好ましくは下記のように逆数乗算を介して）割ることとにより、部分領域の平均値を計算するように変更を加えられてもよい。
【０１７６】
図２７及び図２８の実施形態によるＮＮＵ１２１の動作から観察できるように、図２８のプログラムの各実行は、図２７の５１２×１６００のデータ行列全体のプーリング演算を行うために約６０００クロックサイクルを要し、これは、同様の作業を従来の方法で行うために必要なクロックサイクル数よりもかなり少ない可能性がある。
【０１７７】
或いは、プーリング演算の結果を重みＲＡＭ１２４に書き戻すのではなく、アーキテクチャプログラムは、結果をデータＲＡＭ１２２の行に書き戻すようにＮＮＵプログラムを構成し、アーキテクチャプログラムは、ＮＮＵ１２１が結果を書き込むとき、その結果をデータＲＡＭ１２２から読み出す（例えば、図２６Ｂの一番最近書き込まれたデータＲＡＭ１２２の行２６０６のアドレスを使用して）。この代替法は、重みＲＡＭ１２４がシングルポートでありデータＲＡＭ１２２がデュアルポートである実施形態で有利である可能性がある。
【０１７８】
ユーザ供給の２進小数点による固定小数点算術、最大精度の固定小数点累算、ユーザ指定の逆数値、累算器値の確率的丸め、及び選択可能な活性化／出力関数
一般的に言って、デジタルコンピューティングデバイス内で算術を行うハードウェアユニットは、それぞれ整数及び浮動小数点数に算術演算を行うことから一般に「整数」ユニット及び「浮動小数点」ユニットと呼ばれるものに分けることができる。浮動小数点数は、大きさ（又は仮数）及び指数、並びに通例は符号を有する。指数は、大きさに対する小数点（通例は２進小数点）の場所を示すものである。対して、整数は指数を持たず、大きさのみを持ち、しばしば符号を有する。浮動小数点ユニットの利点の１つは、プログラマが、極めて大きな範囲内の異なる値をとり得る数を扱えることであり、ハードウェアが、必要に応じて数の指数値の調節を担い、プログラマは調節を行う必要がない。例えば、２つの浮動小数点数、０．１１１×１０２９と０．８１×１０３１が乗算されると仮定する。（ここでは１０進、すなわち１０を底とする例が使用されるが、浮動小数点ユニットは、最も一般的には２を底とする浮動小数点数を扱う。）浮動小数点ユニットは、仮数を乗算し、指数を加算し、次いで結果を基準化して．８９９１×１０５９の値に戻すことを自動的に担う。別の例として、上記の同じ２つの浮動小数点数が加算されると仮定する。浮動小数点ユニットは、これらを加算する前に仮数の２進小数点を位置合わせして、結果として得られる和の．８１１１１×１０３１の値を生成することを自動的に担う。
【０１７９】
しかし、浮動小数点ユニットに伴う複雑性とその結果生じるサイズ、電力消費、命令当たりのクロック数の増大及び／又はサイクル時間の延長はよく知られている。実際、この理由のために、多くのデバイス（例えば、組み込みプロセッサ、マイクロコントローラ、並びに、比較的低コスト及び／又は低電力のマイクロプロセッサ）は、浮動小数点ユニットを含んでいない。上記の例から観察できるように、浮動小数点ユニットの複雑性の一部には、浮動小数点の加算及び乗算／除算に関連する指数算出を行う論理（オペランドの指数を加算／減算して、結果得られる浮動小数点乗算／除算の指数値を生成する加算器、オペランドの減算指数を決定して、浮動小数点加算のための２進小数点位置合わせシフト量を決定する減算器）、浮動小数点加算のために仮数の２進小数点位置合わせを達成するシフタ、浮動小数点の結果を基準化するシフタが含まれる。加えて、ブロックユニットに対するフロー進行は、通例、浮動小数点結果の丸めを行う論理、整数形式と浮動小数点形式との間、又は異なる浮動小数点精度形式（例えば、拡張精度、倍精度、単精度、半精度）間の変換を行う論理、先行ゼロ及び先行１の検出器、並びに、非正規化数、ＮＡＮ、及び無限大などの特殊な浮動小数点数を扱う論理を必要とする。
【０１８０】
さらに、浮動小数点ユニットの正確さを検証する際の複雑性が著しいという不都合があり、これは主として、設計を検証しなければならない数空間が増大するためであり、それにより、製品の開発サイクルと市場で販売するまでの時間が長くなる可能性がある。さらには、上記のように、浮動小数点算術は、計算に関係する浮動小数点数ごとに別個の仮数フィールドと指数フィールドを記憶及び使用することを示唆し、それにより、必要とされる記憶域の量が増大する、且つ／又は、整数を記憶するために等しい量の記憶域を想定したときに精度が低下する可能性がある。これらの不都合点の多くは、整数に算術演算を行う整数ユニットの使用によって回避される。
【０１８１】
しばしば、プログラマは、小数、すなわち自然数でない数を処理するプログラムを書く。そのプログラムは、浮動小数点ユニットを備えないプロセッサで稼働する可能性もあり、又は、備えている場合でも、プロセッサの整数ユニットによって実行される整数命令の方がより速い可能性がある。整数ユニットに伴う潜在的な性能の利点を活用するために、プログラマは、一般に固定小数点算術として知られるものを固定小数点数に用いる。そのようなプログラムは、整数ユニットに実行されて整数又は整数データを処理する命令を含んでいる。ソフトウェアは、データが小数であることを認識しており、また、整数データに例えば位置合わせシフトなどの演算を行って、データが実際には小数である事実に対処する命令を含んでいる。基本的に、固定小数点ソフトウェアは、浮動小数点ユニットが行う機能の一部又はすべてを手動で行う。
【０１８２】
本開示で使用される場合、「固定小数点」数（又は値又はオペランド又は入力又は出力）は、その記憶のビットが、本明細書で「小数ビット」と呼ばれる、当該固定小数点数の小数部分を表すビットを含んでいると理解される数である。固定小数点数の記憶のビットは、メモリ又はレジスタに含まれ、例えば、メモリ又はレジスタ内の８ビット又は１６ビットのワードである。さらに、固定小数点数の記憶のビットはすべて、大きさを表すために使用され、場合によっては、１ビットが符号を表すために使用されるが、固定小数点数の記憶ビットのうち、その数の指数を表すために使用される記憶ビットはない。さらに、固定小数点数の小数ビットの数又は２進小数点の場所は、固定小数点数の記憶ビットとは別個の記憶域において指定され、この記憶域は、固定小数点数が属する固定小数点数のセット、例えば、処理ユニットのアレイの入力オペランド、累算値、又は出力結果のセットなどについて、小数ビットの数又は２進小数点の場所を、共有されたやり方又は大域的なやり方で指示する。
【０１８３】
有利な点として、ＡＬＵは整数ユニットであるが、活性化関数ユニットが固定小数点算術のハードウェア支援又は加速を含む実施形態が、本明細書に記載される。これにより、ＡＬＵ部分を小型化及び高速化することができ、それにより、ダイ上の所与の空間内により多くのＡＬＵを持つことが容易になる。これは、ダイ空間当たりのニューロン数が増えることを示唆し、これは特にニューラルネットワークユニットで有利である。
【０１８４】
さらに有利な点として、浮動小数点数ごとに指数記憶ビットを必要とする浮動小数点数と対照的に、記載される実施形態では、固定小数点数が、数のセット全体について、小数ビットである記憶のビット数の指示を用いて表され、ただしこの指示は、セット全体のすべての数について小数ビットの数を大域的に指示する、単一の共有された記憶域に置かれる。上記数のセットは、例えば、一連の演算への入力のセット、その一連の演算の累算値のセット、出力のセットである。好ましくは、ＮＮＵのユーザが、数のセットに対して小数記憶ビットの数を指定できるようにされる。したがって、多くの文脈（例えば、一般の数学）では、用語「整数」は符号付きの自然数、すなわち小数部分を持たない数を指すが、本開示の文脈における用語「整数」は、小数部分を持つ数を指す場合もあることを理解されたい。さらに、本開示の文脈における用語「整数」は、個々の記憶のビットの一部が浮動小数点数の指数を表すために使用される浮動小数点数から区別することが意図される。同様に、整数ユニットによって行われる整数の乗算又は加算又は比較などの整数算術演算は、オペランドが指数を持たないことを仮定し、したがって、整数ユニットの整数要素、例えば整数乗算器、整数加算器、整数比較器は、指数を扱う論理を含んでおらず、例えば、加算又は比較演算のために仮数をシフトして２進小数点を位置合わせすることをせず、乗算演算のために指数を加算することをしない。
【０１８５】
加えて、精度の低下なく大きな一続きの整数演算（例えば、１０００回前後の積和）を累算する大きなハードウェア整数累算器を含む実施形態が、本明細書に記載される。それにより、ＮＮＵが浮動小数点数を扱うことを回避できるようになり、同時に、累算された値の最大精度を維持することができ、累算値を飽和させる必要がなく、又はオーバーフローが原因となって不正確な結果を招くことがない。一続きの整数演算が結果を最大精度の累算器に累算すると、固定小数点ハードウェア支援が、下記でより詳細に説明するように、ユーザによって指定された、累算値の小数ビット数の指示と、望まれる出力値中の小数ビット数とを使用して、必要なスケーリング及び飽和を行って最大精度の累算値を出力値に変換する。
【０１８６】
下記でより詳細に説明するように、好ましくは、活性化関数ユニットは、活性化関数への入力として使用するため又はパススルーのために、累算器値を最大精度の形式から圧縮するときに、選択的に累算器値に確率的丸めを行うことができる。最後、ＮＰＵは、ニューラルネットワークの所与の層の種々の必要性により指示されるとおり、異なる活性化関数を適用するように、且つ／又は各種の異なる形式の累算器値を出力するように、選択的に命令されることができる。
【０１８７】
次いで図２９Ａを参照すると、図１の制御レジスタ１２７の一実施形態を図示するブロック図が示される。制御レジスタ１２７は、複数の制御レジスタ１２７を含むことができる。制御レジスタ１２７は、示されるように、以下のフィールド、構成２９０２、符号付きデータ２９１２、符号付き重み２９１４、データ２進小数点２９２２、重み２進小数点２９２４、ＡＬＵ関数２９２６、丸め制御２９３２、活性化関数２９３４、逆数２９４２、シフト量２９４４、出力ＲＡＭ２９５２、出力の２進小数点２９５４、及び出力コマンド２９５６を含む。制御レジスタ１２７値は、ＭＴＮＮ命令１４００と、開始命令などのＮＮＵプログラムの命令との両方によって書き込まれる可能性がある。
【０１８８】
構成２９０２値は、上記のようにＮＮＵ１２１がナロー構成であるか、ワイド構成であるか、又はじょうご構成であるかを指定する。構成２９０２は、データＲＡＭ１２２及び重みＲＡＭ１２４から受け取られる入力ワードのサイズを示唆する。ナロー構成及びじょうご構成では、入力ワードのサイズはナローであり（例えば、８ビット又は９ビット）、対してワイド構成では、入力ワードのサイズはワイドである（例えば、１２ビット又は１６ビット）。さらに、構成２９０２は、入力ワードのサイズと同じである出力結果１３３のサイズを示唆する。
【０１８９】
符号付きデータ値２９１２は、真の場合は、データＲＡＭ１２２から受け取られるデータワードが符号付きの値であることを指示し、偽の場合は、符号なしの値であることを指示する。符号付きの重み値２９１４は、真の場合は、重みＲＡＭ１２４から受け取られる重みワードが符号付きの値であることを指示し、偽の場合は、符号なしの値であることを指示する。
【０１９０】
データ２進小数点２９２２の値は、データＲＡＭ１２２から受け取られるデータワードについて、２進小数点の場所を指示する。好ましくは、データ２進小数点２９２２値は、２進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、データ２進小数点２９２２は、データワードの最下位（least  significant）ビットのうちいくつが小数ビットであるか、すなわち２進小数点の右側にあるかを指示する。同様に、重み２進小数点２９２４値は、重みＲＡＭ１２４から受け取られる重みワードについて、２進小数点の場所を指示する。好ましくは、ＡＬＵ関数２９２６が積和又は累算器出力である場合、ＮＰＵ１２６は、累算器２０２に保持されている値について、２進小数点の右側にあるビットの数を、データ２進小数点２９２２と重み２進小数点２９２４との和として判定する。したがって、例えば、データ２進小数点２９２２の値が５で、重み２進小数点２９２４の値が３である場合には、累算器２０２内の値は、２進小数点の右側に８ビットを有する。ＡＬＵ関数２９２６が、累算器とデータワード／重みワードとの和／最大値、又はデータワード／重みワードのパススルーである場合、ＮＰＵ１２６は、累算器２０２に保持されている値について、２進小数点の右側にあるビットの数を、それぞれデータ／重みの２進小数点２９２２／２９２４として判定する。下記で図２９Ｂに関連して説明する代替実施形態では、個々のデータ２進小数点２９２２及び重み２進小数点２９２４を指定するのではなく、単一の累算器２進小数点２９２３が指定される。
【０１９１】
ＡＬＵ関数２９２６は、ＮＰＵ１２６のＡＬＵ２０４によって行われる関数を指定する。上記のように、ＡＬＵ関数２９２６は、これらに限定されないが、データワード２０９と重みワード２０３とを乗算して積を累算器２０２と累算すること、累算器２０２と重みワード２０３とを足すこと、累算器２０２とデータワード２０９とを足すこと、累算器２０２とデータワード２０９とのうちの最大値、累算器２０２と重みワード２０３とのうちの最大値、累算器２０２を出力すること、データワード２０９をパススルーすること、重みワード２０３をパススルーすること、ゼロを出力すること、を含むことができる。一実施形態では、ＡＬＵ関数２９２６は、ＮＮＵ開始命令によって指定され、実行命令（図示せず）に応答してＡＬＵ２０４によって使用される。一実施形態では、ＡＬＵ関数２９２６は、上記の積和命令やｍａｘｗａｃｃ命令などの個々のＮＮＵ命令によって指定される。
【０１９２】
丸め制御２９３２は、（図３０の）丸め器３００４によって使用されるべき丸めの形式を指定する。一実施形態では、指定されることが可能な丸めモードは、これらに限定されないが、丸めなし、最近接丸め、及び確率的丸めを含む。好ましくは、プロセッサ１００は、（図３０の）ランダムビットソース３００３を含み、ランダムビットソース３００３は、サンプリングされ、確率的丸めを行うのに使用されるランダムビット３００５を生成して、丸めバイアスの可能性を低減する。一実施形態では、丸めビット３００５が１で、スティッキービットがゼロの場合、ＮＰＵ１２６は、サンプリングされたランダムビット３００５が真であれば切り上げ、ランダムビット３００５が偽であれば切り上げない。一実施形態では、ランダムビットソース３００３は、半導体ダイオード又はレジスタ中の熱雑音など、プロセッサ１００のランダムな電気的特性のサンプリングに基づいてランダムビット３００５を生成するが、他の実施形態が企図される。
【０１９３】
活性化関数２９３４は、ＮＰＵ１２６の出力１３３を生成するために累算器２０２の値２１７に適用される関数を指定する。上記で説明し、下記でより詳細に説明するように、活性化関数２９３４には、これらに限定されないが、シグモイド、ハイパーボリックタンジェント、ソフトプラス、正規化、指定された２の累乗による除算、有効な除算を達成するためのユーザ指定の逆数値による乗算、全累算器のパススルー、及び、下記で詳細に説明する基準サイズとしての累算器のパススルーが含まれる。一実施形態では、活性化関数は、ＮＮＵ活性化関数命令によって指定される。或いは、活性化関数は、開始命令によって指定され、出力命令、例えば図４のアドレス４にあるＡＦＵ出力書き出し命令に応答して適用され、そのような実施形態では、図４のアドレス３の活性化関数命令は、出力命令に包含される。
【０１９４】
逆数２９４２値は、累算器２０２の値２１７の除算を達成するために、累算器２０２の値２１７で乗算される値を指定する。すなわち、ユーザは、実際の所望される除数の逆数として、逆数２９４２値を指定する。これは、例えば、本明細書に記載されるように畳み込み演算及びプーリング演算に関連して有用である。好ましくは、下記で図２９Ｃに関連してより詳細に説明するように、ユーザは、逆数２９４２値を２つの部分で指定する。一実施形態では、制御レジスタ１２７は、複数の組み込み除数値の１つによる除算をユーザが指定できるフィールド（図示せず）を含み、上記組み込み除数値は、一般に使用される畳み込みカーネルのサイズ、例えば９、２５、３６、又は４９である。そのような実施形態では、ＡＦＵ２１２は、累算器２０２の値２１７で乗算するために組み込み除数の逆数を記憶することができる。
【０１９５】
シフト量２９４４は、２の累乗による除算を達成するために、ＡＦＵ２１２のシフタが累算器２０２の値２１７を右にシフトするビット数を指定する。このこともまた、サイズが２の累乗である畳み込みカーネルに関連して有用である可能性がある。
【０１９６】
出力ＲＡＭ２９５２値は、データＲＡＭ１２２と重みＲＡＭ１２４のどちらが出力結果１３３を受け取るかを指定する。
【０１９７】
出力２進小数点２９５４値は、出力結果１３３について２進小数点の場所を指示する。好ましくは、出力２進小数点２９５４は、出力結果１３３の２進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、出力２進小数点２９５４は、出力結果１３３の最下位ビットのうちいくつが小数ビットであるか、すなわち２進小数点の右にあるかを指示する。ＡＦＵ２１２は、出力２進小数点２９５４の値に基づいて（並びに、大半の場合は、データ２進小数点２９２２、重み２進小数点２９２４、活性化関数２９３４、及び／又は構成２９０２の値に基づいて）、丸め、圧縮、飽和、及びサイズコンバージョンを行う。
【０１９８】
出力コマンド２９５６は、出力結果１３３の諸面を制御する。一実施形態では、ＡＦＵ２１２は、基準サイズの概念を用い、これは、構成２９０２で指定される幅のサイズ（ビット単位）の２倍である。したがって、例えば、構成２９０２が、データＲＡＭ１２２及び重みＲＡＭ１２４から受け取られる入力ワードのサイズが８ビットであると示唆する場合、基準サイズは１６ビットである。別の例として、構成２９０２が、データＲＡＭ１２２及び重みＲＡＭ１２４から受け取られる入力ワードのサイズが１６ビットであると示唆する場合、基準サイズは３２ビットである。本明細書に記載されるように、中間計算、例えばそれぞれ１０２４回及び５１２回のＮＮＵ積和命令の最大精度を保つために、累算器２０２のサイズは大きい（例えば、ナロー累算器２０２Ｂは２８ビットであり、ワイド累算器２０２Ａは４１ビットである）。その結果、累算器２０２の値２１７は、基準サイズよりも大きく（ビット単位で）、ＡＦＵ２１２（例えば、下記で図３０に関連して説明するＣＣＳ３００８）は、活性化関数２９３４の大半の値について（全累算器のパススルーを除く）、累算器２０２の値２１７を、基準サイズの値まで圧縮する。出力コマンド２９５６の第１の所定の値は、指定された活性化関数２９３４を行って、元の入力ワードと同じサイズ、すなわち基準サイズの半分である内部結果を生成し、その内部結果を出力結果１３３として出力するようにＡＦＵ２１２に命令する。出力コマンド２９５６の第２の所定の値は、指定された活性化関数２９３４を行って、元の入力ワードの２倍のサイズ、すなわち基準サイズである内部結果を生成し、その内部結果の下位半分を出力結果１３３として出力するようにＡＦＵ２１２に命令する。出力コマンド２９５６の第３の所定の値は、基準サイズの内部結果の上位半分を出力結果１３３として出力するようにＡＦＵ２１２に命令する。図８〜図１０に関連して上記で説明したように、出力コマンド２９５６の第４の所定の値は、累算器２０２の未処理最下位ワード（その幅は構成２９０２で指定される）を出力結果１３３として出力するようにＡＦＵ２１２に命令し、第５の所定の値は、累算器２０２の未処理中位（middle-significant）ワードを出力結果１３３として出力するようにＡＦＵ２１２に命令し、第６の所定の値は、累算器２０２の未処理最上位（most-significant）ワードを出力結果１３３として出力するようにＡＦＵ２１２に命令する。上記のように、全累算器２０２のサイズ又は基準サイズの内部結果を出力することは、例えば、プロセッサ１００の他の実行ユニット１１２がソフトマックス活性化関数などの活性化関数を行えるようにするために有利である可能性がある。
【０１９９】
図２９Ａ（及び図２９Ｂ及び図２９Ｃ）のフィールドは、制御レジスタ１２７に存在するものと記載されるが、他の実施形態では、それらのフィールドの１つ又は複数は、ＮＮＵ１２１の他の部分に存在してもよい。好ましくは、フィールドの多くは、ＮＮＵ命令自体に含められ、シーケンサ１２８によって復号されて、ＡＬＵ２０４及び／又はＡＦＵ２１２を制御する（図３４の）マイクロ操作３４１６を生成する。加えて、フィールドは、ＡＬＵ２０４及び／又はＡＦＵ２１２メディアレジスタ１１８を制御するメディアレジスタ１１８に記憶される（図３４の）マイクロ操作３４１４に含まれてもよい。そのような実施形態では、ＮＮＵ初期化命令の使用が最小になり、他の実施形態では、ＮＮＵ初期化命令が除去される。
【０２００】
上記のように、ＮＮＵ命令は、メモリオペランド（例えば、データＲＡＭ１２２及び／若しくは重みＲＡＭ１２４にあるワード）、又は循環されたオペランド（例えば、ｍｕｘ−ｒｅｇ２０８／７０５にあるもの）へのＡＬＵ演算を実行するよう指定することができる。一実施形態では、ＮＮＵ命令はさらに、オペランドを、活性化関数のレジスタからの出力として指定することができる（例えば、図３０のレジスタ３０３８の出力）。加えて、上記のように、ＮＮＵ命令は、データＲＡＭ１２２又は重みＲＡＭ１２４の現在の行アドレスを増分するよう指定することができる。一実施形態では、ＮＮＵ命令は、１以外の値による増分又は減分を達成するために現在の行に加算される即値符号付き整数差分値を指定することができる。
【０２０１】
次いで図２９Ｂを参照すると、代替的な一実施形態による、図１の制御レジスタ１２７の実施形態を図示するブロック図が示される。図２９Ｂの制御レジスタ１２７は、図２９Ａの制御レジスタ１２７に似ているが、図２９Ｂの制御レジスタ１２７は、累算器２進小数点２９２３を含んでいる。累算器２進小数点２９２３は、累算器２０２について２進小数点の場所を指示する。好ましくは、累算器２進小数点２９２３値は、２進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、累算器２進小数点２９２３は、累算器２０２の最下位ビットのうちいくつが小数ビットであるか、すなわち２進小数点の右であるかを指示する。この実施形態では、上記で図２９Ａの実施形態に関連して説明したように、累算器２進小数点２９２３は、暗黙的に決定されるのではなく、明示的に指定される。
【０２０２】
次いで図２９Ｃを参照すると、一実施形態による、２つの部分として記憶される図２９Ａの逆数２９４２の実施形態を図示するブロック図が示される。第１の部分２９６２は、ユーザが累算器２０２の値２１７で乗算することを望む真の逆数値の中の、抑制された先行ゼロの数２９６２を指示するシフト値である。先行ゼロの数は、２進小数点のすぐ右側にある連続したゼロの数である。第２の部分２６９４は、先行ゼロを抑制された逆数２９６４値、すなわち、すべての先行ゼロが除去された真の逆数値である。一実施形態では、抑制された先行ゼロの数２９６２は４ビットとして記憶され、先行ゼロを抑制された逆数２９６４値は、８ビットの符号なしの値として記憶される。
【０２０３】
例による説明として、ユーザが、累算器２０２の値２１７を４９の逆数で乗算したいと仮定する。１３個の小数ビットで表された４９の逆数の２進表現は、０．０００００１０１００１１１であり、５個の先行ゼロがある。この場合、ユーザは、抑制された先行ゼロの数２９６２に５の値を入れ、先行ゼロを抑制された逆数２９６４に１０１００１１１の値を入れる。逆数乗算器の「除算器Ａ」３０１４（図３０の）が、累算器２０２の値２１７と、先行ゼロを抑制された逆数２９６４の値とを乗算した後、除算器Ａは、得られた積を、抑制された先行ゼロの数２９６２だけ右シフトする。そのような実施形態は、有利に、逆数２９４２値を表すために使用されるビット数を比較的少なくして、高い精度を達成することができる。
【０２０４】
次いで図３０を参照すると、図２のＡＦＵ２１２の実施形態をより詳細に図示するブロック図が示される。ＡＦＵ２１２は、図１の制御レジスタ１２７；累算器２０２の値２１７を受け取る正形式変換器（ｐｏｓｉｔｉｖｅ  ｆｏｒｍ  ｃｏｎｖｅｒｔｅｒ：ＰＦＣ）及び出力２進小数点位置合わせ器（ｏｕｔｐｕｔ  ｂｉｎａｒｙ  ｐｏｉｎｔ  ａｌｉｇｎｅｒ：ＯＢＰＡ）３００２；累算器２０２の値２１７とＯＢＰＡ３００２によって外へシフトされたビット数の指示とを受け取る丸め器３００４；上記のようにランダムビット３００５を生成するランダムビットソース３００３；ＰＦＣ及びＯＢＰＡ３００２の出力と丸め器３００４の出力とを受け取る第１のｍｕｘ３００６；第１のｍｕｘ３００６の出力を受け取る、基準サイズへの圧縮器（ｃｏｍｐｒｅｓｓｏｒ  ｔｏ  ｃａｎｏｎｉｃａｌ  ｓｉｚｅ：ＣＣＳ）及び飽和器３００８；ＣＣＳ及び飽和器３００８の出力を受け取る、ビット選択器及び飽和器３０１２；ＣＣＳ及び飽和器３００８の出力を受け取る正規化器（rectifier）３０１８；ＣＣＳ及び飽和器３００８の出力を受け取る逆数乗算器３０１４；ＣＣＳ及び飽和器３００８の出力を受け取る右シフタ３０１６；ビット選択器及び飽和器３０１２の出力を受け取るハイパーボリックタンジェント（ｔａｎｈ）モジュール３０２２；ビット選択器及び飽和器３０１２の出力を受け取るシグモイドモジュール３０２４；ビット選択器及び飽和器３０１２の出力を受け取るソフトプラスモジュール３０２６；ｔａｎｈモジュール３０２２、シグモイドモジュール３０２４、ソフトプラスモジュール３０２６、正規化器３１０８、逆数乗算器３０１４、及び右シフタ３０１６の出力と、ＣＣＳ及び飽和器３００８のパススルーされた基準サイズ出力３０２８と、を受け取る第２のｍｕｘ３０３２；第２のｍｕｘ３０３２の出力を受け取る符号復元器３０３４；符号復元器３０３４の出力を受け取る、サイズ変換器及び飽和器３０３６；サイズ変換器及び飽和器３０３６の出力と累算器の出力２１７とを受け取る第３のｍｕｘ３０３７；並びに、ｍｕｘ３０３７の出力を受け取り、出力が図１の結果１３３である出力レジスタ３０３８、を含む。
【０２０５】
ＰＦＣ及びＯＢＰＡ３００２は、累算器２０２の値２１７を受け取る。好ましくは、累算器２０２の値２１７は、上記のように最大精度値である。すなわち、累算器２０２は、整数乗算器２４２によって生成された一連の積の、整数加算器２４４によって生成される和である累算値を保持するのに十分なビット数の記憶を有し、乗算器２４２の個々の積又は加算器２４４の和のビットのうちいずれも破棄することがなく、よって精度の低下がない。好ましくは、累算器２０２は、少なくとも、ＮＮＵ１２１が行うようにプログラムされることが可能な最大数の積の累算を保持するのに十分なビット数を有する。例えば、図４のプログラムを参照して説明すると、ワイド構成のときにＮＮＵ１２１が行うようにプログラム可能な積の累算の最大数は５１２であり、累算器２０２のビット幅は４１である。別の例として、図２０のプログラムを参照して説明すると、ナロー構成のときにＮＮＵ１２１が行うようにプログラム可能な積累算の最大数は１０２４であり、累算器２０２のビット幅は２８である。一般化すると、最大精度の累算器２０２は少なくともＱビットを含み、Ｑは、Ｍとｌｏｇ２Ｐとの和であり、Ｍは、乗算器２４２の整数積のビット幅であり（例えば、ナロー乗算器２４２では１６ビット、又はワイド乗算器２４２では３２ビット）、Ｐは、累算器２０２中に累算されることが可能な整数積の最大許容数である。好ましくは、積累算の最大数は、ＮＮＵ１２１のプログラマへのプログラミングの仕様を介して指定される。一実施形態では、シーケンサ１２８は、データワード／重みワード２０６／２０７の行をデータＲＡＭ／重みＲＡＭ１２２／１２４からロードする、１つの前の積和命令（例えば、図４のアドレス１にある命令）を仮定して、積和ＮＮＵ命令（例えば、図４のアドレス２にある命令）のカウントの最大値、例えば５１１を強制する。
【０２０６】
有利な点として、許容される累算の最大数に対して最大精度値を累算するのに十分に大きいビット幅を持つ累算器２０２を含めることにより、ＮＰＵ１２６のＡＬＵ２０４部分の設計が簡略化される。詳細には、それにより、整数加算器２４４によって生成される和を飽和させる論理の必要性が緩和され、上記生成される和は、より小さい累算器であればオーバーフローを生じさせる可能性があり、また、累算器の２進小数点の場所を追跡して、オーバーフローが発生したかどうかを決定して、飽和が必要であったかを知ることを必要とする可能性がある。非最大精度の累算器を含んでいたが、代わりに非最大精度の累算器のオーバーフローに対処する飽和論理を含んでいる設計の問題を、例として説明するために、以下を仮定する。
（１）データワード値の範囲は０と１の間であり、すべての記憶ビットを使用して小数ビットを記憶する。重みワードの範囲は−８と＋８の間であり、記憶ビットのうち３ビットを除くすべてのビットを使用して小数ビットを記憶する。そして、ハイパーボリックタンジェント活性化関数に入力するための累算値の範囲は−８と＋８の間であり、記憶ビットのうち３ビットを除くすべてのビットを使用して小数ビットを記憶する。
（２）累算器のビット幅は、非最大精度である（例えば、積のビット幅のみ）。
（３）累算器が最大精度であったと仮定すると、最終的な累算値は、−８と＋８の間のいずれかの値（例えば、＋４．２）になるが、列中の「点Ａ」よりも前の積は、より高頻度に正になる傾向があり、対して点Ａより後の積はより高頻度に負になる傾向がある。
このような状況では、不正確な結果（すなわち＋４．２以外の結果）が得られる可能性がある。その理由は、点Ａより前のいずれかの点で、累算器が、例えば＋８．２のようなより大きな値でなければならないときに最大の＋８の値に飽和される可能性があり、それにより、残りの＋０．２の損失を引き起こす可能性があるためである。累算器は、より多くの積の累算について飽和値のままになる可能性すらあり、その結果、さらに多くの正の値が失われる可能性がある。そのため、累算器の最終値は、累算器が最大精度のビット幅を持っていた場合になるはずよりも小さな数（すなわち、＋４．２未満）になる可能性がある。
【０２０７】
ＰＦＣ３００２は、累算器２０２の値２１７が負である場合には、値を正形式に変換し、元の値が正であったか又は負であったかを指示する付加ビットを生成し、そのビットは、値と共にＡＦＵ２１２のパイプラインで渡される。正形式に変換することで、ＡＦＵ２１２による後の動作を簡略化する。例えば、それにより、正の値だけがｔａｎｈ３０２２及びシグモイド３０２４モジュールに入力されることが可能になり、したがって、それらのモジュールを簡略化することができる。加えて、このことは、丸め器３００４及び飽和器３００８を簡略化する。
【０２０８】
ＯＢＰＡ３００２は、正形式の値を右にシフト又はスケーリングして、制御レジスタ１２７中で指定される出力２進小数点２９５４と位置合わせする。好ましくは、ＯＢＰＡ３００２は、出力の小数ビットの数（例えば、出力２進小数点２９５４によって指定される）を、累算器２０２の値２１７の小数ビットの数（例えば、累算器２進小数点２９２３によって指定されるか、又はデータ２進小数点２９２２と重み２進小数点２９２４との和）から引いた差として、シフト量を算出する。したがって、例えば、累算器２０２の２進小数点２９２３が８で（上記の例のように）、出力の２進小数点２９５４が３である場合には、ＯＢＰＡ３００２は、正形式の値を右に５ビットシフトして、ｍｕｘ３００６及び丸め器３００４に提供される結果を生成する。
【０２０９】
丸め器３００４は、累算器２０２の値２１７を丸める。好ましくは、丸め器３００４は、ＰＦＣ及びＯＢＰＡ３００２によって生成された正形式の値を丸めたバージョンを生成し、その丸められたバージョンをｍｕｘ３００６に提供する。丸め器３００４は、上記の丸め制御２９３２に従って丸めを行い、この丸めは、上記及び下記で説明するように、ランダムビット３００５を使用した確率的丸めを含むことができる。ｍｕｘ３００６は、丸め制御２９３２（本明細書に記載されるように確率的丸めを含み得る）に基づいて、自身の入力のうち１つ、すなわち、ＰＦＣ及びＯＢＰＡ３００２からの正形式の値か、又は丸め器３００４からのその値の丸められたバージョンかのどちらかを選択し、選択した値をＣＣＳ及び飽和器３００８に提供する。好ましくは、丸め制御２９３２が丸めなしを指定する場合、ｍｕｘ３００６は、ＰＦＣ及びＯＢＰＡ３００２の出力を選択し、それ以外の場合、丸め器３００４の出力を選択する。ＡＦＵ２１２が追加的な丸めを行う他の実施形態が企図される。例えば、一実施形態では、ビット選択器３０１２が、ＣＣＳ及び飽和器３００８の出力のビットを圧縮するときに、失われた低次ビットに基づいて丸めを行う（下記で説明する）。別の例として、一実施形態では、逆数乗算器３０１４（下記で説明する）の積が丸められる。さらに別の例として、一実施形態では、サイズ変換器３０３６が、適正な出力サイズに変換するときに丸めを行い（下記で説明する）、これは、丸めの決定で使用された低次ビットを失うことを伴う場合もある。
【０２１０】
ＣＣＳ３００８は、ｍｕｘ３００６の出力値を基準サイズに圧縮する。したがって、例えば、ＮＰＵ１２６がナロー構成又はじょうご構成２９０２である場合、ＣＣＳ３００８は、２８ビットのｍｕｘ３００６の出力値を１６ビットに圧縮し、ＮＰＵ１２６がワイド構成２９０２である場合、ＣＣＳ３００８は、４１ビットのｍｕｘ３００６の出力値を３２ビットに圧縮する。ただし、基準サイズに圧縮する前に、事前に圧縮された値が、基準形式で表すことが可能な最大値よりも大きい場合、飽和器３００８が、事前に圧縮された値を飽和させて、基準形式で表すことが可能な最大値にする。例えば、最上位の基準形式ビットの左側にある事前に圧縮された値のビットのいずれかが１の値を有する場合には、飽和器３００８は、最大値に（例えば、すべて１に）飽和させる。
【０２１１】
好ましくは、ｔａｎｈ３０２２、シグモイド３０２４、及びソフトプラス３０２６モジュールは、参照表、例えば、プログラム可能ロジックアレイ（ＰＬＡ）、読み出し専用メモリ（ＲＯＭ）、組み合わせ論理ゲートなどを備える。一実施形態では、モジュール３０２２／３０２４／３０２６を簡略化してサイズを減らすために、それらには、３．４の形式、すなわち３つの整数ビットと４つの小数ビットを持つ入力値が提供され、すなわち、入力値は、２進小数点の右側に４ビット、及び２進小数点の左側に３ビットを有する。それらの値が選択される理由は、３．４形式の入力値範囲（−８、＋８）の極値では、出力値が、その最小値／最大値に漸近的に近づくためである。ただし、２進小数点を異なる場所に置く、例えば４．３形式又は２．５形式の他の実施形態が企図される。ビット選択器３０１２は、３．４形式の基準を満たすＣＣＳ及び飽和器３００８の出力のビットを選択し、このことは圧縮を含み、すなわち一部のビットが失われる。これは、基準形式の方がビット数が多いためである。ただし、ＣＣＳ及び飽和器３００８の出力値を選択／圧縮する前に、事前に圧縮された値が３．４形式で表すことが可能な最大値よりも大きい場合、飽和器３０１２が、事前に圧縮された値を、３．４形式で表すことが可能な最大値に飽和させる。例えば、３．４形式の最上位ビットの左側にある事前に圧縮された値のビットのいずれかが１の値を有する場合、飽和器３０１２は、最大値に（例えば、すべて１に）飽和させる。
【０２１２】
ｔａｎｈ３０２２、シグモイド３０２４、及びソフトプラス３０２６モジュールは、各自の活性化関数（上記で説明した）を、ＣＣＳ及び飽和器３００８から出力された３．４形式の値に行って、結果を生成する。好ましくは、ｔａｎｈ３０２２及びシグモイド３０２４モジュールの結果は、０．７形式の７ビットの結果であり、すなわち、ゼロ個の整数ビット及び７つの小数ビットがあり、すなわち、入力値は２進小数点の右側に７ビットを有する。好ましくは、ソフトプラスモジュール３０２６の結果は、３．４形式の７ビットの結果であり、例えば、モジュール３０２６への入力と同じ形式である。好ましくは、ｔａｎｈ３０２２、シグモイド３０２４、及びソフトプラス３０２６モジュールの出力は、基準形式に合わせて拡張され（例えば、必要に応じて先行ゼロが追加され）、出力２進小数点２９５４の値によって指定される２進小数点を持つように位置合わせされる。
【０２１３】
正規化器３０１８は、ＣＣＳ及び飽和器３００８の出力値の正規化バージョンを生成する。すなわち、ＣＣＳ及び飽和器３００８の出力値（その符号は上記のようにして渡される）が負である場合、正規化器３０１８はゼロの値を出力し、それ以外の場合、正規化器３０１８は自身の入力値を出力する。好ましくは、正規化器３０１８の出力は、基準形式であり、出力２進小数点２９５４値によって指定される２進小数点を有する。
【０２１４】
逆数乗算器３０１４は、ＣＣＳ及び飽和器３００８の出力に、逆数値２９４２で指定されるユーザ指定の逆数値を乗算して基準サイズの積を生成し、これは、効果的に、ＣＣＳ及び飽和器３００８の出力と、逆数２９４２値の逆数である除数との商である。好ましくは、逆数乗算器３０１４の出力は、基準形式であり、出力２進小数点２９５４値によって指定される２進小数点を有する。
【０２１５】
右シフタ３０１６は、ＣＣＳ及び飽和器３００８の出力を、シフト量の値２９４４で指定される、ユーザ指定のビット数だけシフトして、基準サイズの商を生成する。好ましくは、右シフタ３０１６の出力は、基準形式であり、出力２進小数点２９５４値によって指定される２進小数点を有する。
【０２１６】
ｍｕｘ３０３２は、活性化関数２９３４値によって指定される適切な入力を選択し、選択したものを符号復元器３０３４に提供し、符号復元器３０３４は、元の累算器２０２の値２１７が負値であった場合、ｍｕｘ３０３２の正形式の出力を負形式に、例えば２の補数の形式に変換する。
【０２１７】
サイズ変換器３０３６は、出力コマンド２９５６の値に基づいて、符号復元器３０３４の出力を適切なサイズに変換する。出力コマンド２９５６の値については、上記で図２９Ａに関連して説明している。好ましくは、符号復元器３０３４の出力は、出力２進小数点２９５４値によって指定される２進小数点を有する。好ましくは、出力コマンド２９５６の第１の所定の値について、サイズ変換器３０３６は、符号復元器３０３４の出力の上位半分のビットを破棄する。さらに、符号復元器３０３４の出力が正で、且つ構成２９０２で指定されるワードサイズで表すことが可能な最大値を超えているか、又は、負で、且つそのワードサイズで表すことが可能な最小値未満である場合、飽和器３０３６は、出力を、当該ワードサイズで表すことが可能なそれぞれの最大値又は最小値に飽和させる。第２及び第３の所定の値の場合、サイズ変換器３０３６は、符号復元器３０３４の出力をパススルーする。
【０２１８】
ｍｕｘ３０３７は、出力コマンド２９５６に基づいて、サイズ変換器及び飽和器３０３６の出力か、又は累算器２０２の出力２１７かのどちらかを、出力レジスタ３０３８に提供するために選択する。より具体的には、出力コマンド２９５６の第１及び第２の所定の値について、ｍｕｘ３０３７は、サイズ変換器及び飽和器３０３６の出力の下位ワード（そのサイズは構成２９０２によって指定される）を選択する。第３の所定の値について、ｍｕｘ３０３７は、サイズ変換器及び飽和器３０３６の出力の上位ワードを選択する。第４の所定の値について、ｍｕｘ３０３７は、未処理の累算器２０２の値２１７の下位ワードを選択し、第５の所定の値について、ｍｕｘ３０３７は、未処理の累算器２０２の値２１７の中位ワードを選択し、第６の所定の値について、ｍｕｘ３０３７は、未処理の累算器２０２の値２１７の上位ワードを選択する。上記のように、好ましくは、ＡＦＵ２１２は、未処理の累算器２０２の値２１７の上位ワードの上位ビットをパディングしてゼロにする。
【０２１９】
次いで図３１を参照すると、図３０のＡＦＵ２１２の動作の例が示される。示されるように、構成２９０２は、ＮＰＵ１２６のナロー構成に設定されている。加えて、符号付きデータ２９１２及び符号付き重み２９１４値は真である。加えて、データ２進小数点２９２２値は、データＲＡＭ１２２ワードの２進小数点が、２進小数点の右に７ビットがあるように配置されることを指示し、ＮＰＵ１２６の１つによって受け取られた第１のデータワードの例示的な値が、０．１００１１１０と示されている。さらには、重み２進小数点２９２４値は、重みＲＡＭ１２４のワードの２進小数点が、２進小数点の右に３ビットがあるように配置されることを指示し、ＮＰＵ１２６の１つによって受け取られた第１のデータワードの例示的な値が、００００１．０１０と示されている。
【０２２０】
第１のデータワードと重みワードとの１６ビットの積（累算器２０２の初期ゼロ値と共に累算されている）は、００００００．１１００００１１００と示されている。データ２進小数点２９１２が７であり、重み２進小数点２９１４が３であるため、示唆される累算器２０２の２進小数点は、２進小数点の右に１０ビットがあるように配置される。ナロー構成の場合、累算器２０２は、この例示的実施形態では、２８ビット幅である。この例では、すべてのＡＬＵ演算（例えば、図２０の１０２４回の積和すべて）が行われた後の累算器２０２の０００００００００００００００００１．１１０１０１０１００という値２１７が示されている。
【０２２１】
出力２進小数点２９５４値は、出力の２進小数点が、２進小数点の右に７ビットがあるように配置されることを指示している。したがって、ＯＢＰＡ３００２及びＣＣＳ３００８を通過した後に、累算器２０２の値２１７は、スケーリングされ、丸められ、及び圧縮されて、００００００００１．１１０１０１１の基準形式値にされる。この例では、出力２進小数点の場所は７つの小数ビットを指示し、累算器２０２の２進小数点の場所は１０個の小数ビットを指示する。したがって、ＯＢＰＡ３００２は、３の差を算出し、累算器２０２の値２１７を、右に３ビットシフトすることによってスケーリングする。これは、図３１では、累算器２０２の値２１７の最下位３ビット（２進の１００）が失われることによって示されている。さらにこの例では、丸め制御２９３２値は、確率的丸めを使用することを指示しており、この例では、サンプリングされたランダムビット３００５が真であると仮定される。その結果最下位ビットが切り上げられたが、これは、上記の説明によれば、累算器２０２の値２１７の丸めビット（累算器２０２の値２１７のスケーリングによってシフトされて消えた３ビットの最上位ビット）が１であり、スティッキービット（累算器２０２の値２１７のスケーリングによってシフトされて消えた３ビットのうち最下位２ビットのブールＯＲ）がゼロであったためである。
【０２２２】
活性化関数２９３４は、この例ではシグモイド関数の使用を指示している。その結果、ビット選択器３０１２は、基準形式値のビットを選択し、そのため、上記のようにシグモイドモジュール３０２４への入力が３つの整数ビット及び４つの小数ビットを持つようになり、すなわち、示されるように００１．１１０１の値となる。シグモイドモジュール３０２４は、示されるように、０００００００００．１１０１１１０の基準形式にされた値を出力する。
【０２２３】
この例における出力コマンド２９５６は、第１の所定の値を指定し、すなわち構成２９０２によって指示されるワードサイズを出力することを指定し、この場合のワードサイズはナローワード（８ビット）である。その結果、サイズ変換器３０３６は、基準シグモイド出力値を、２進小数点の右側に７ビットがあるように配置された、示唆される２進小数点を持つ８ビット量に変換して、示されるように０１１０１１１０の出力をもたらす。
【０２２４】
次いで図３２を参照すると、図３０のＡＦＵ２１２の動作の第２の例が示される。図３２の例は、活性化関数２９３４が累算器２０２の値２１７を基準サイズでパススルーすることを指示する場合のＡＦＵ２１２の動作を図示している。示されるように、構成２９０２は、ＮＰＵ１２６のナロー構成に設定されている。
【０２２５】
この例では、累算器２０２は２８ビット幅であり、累算器２０２の２進小数点は、２進小数点の右側に１０ビットがあるように配置される（この理由は、上記のように、一実施形態によれば、データ２進小数点２９１２と重み２進小数点２９１４との和が１０であるためか、又は、代替実施形態によれば、累算器の２進小数点２９２３が１０の値を持つように明示的に指定されるためか、のどちらかである）。この例では、図３２は、すべてのＡＬＵ演算が行われた後の累算器２０２の０００００１１００００００１１０１１．１１０１１１１０１０という値２１７を示している。
【０２２６】
この例では、出力２進小数点２９５４値は、出力の２進小数点が、２進小数点の右側に４ビットがあるように配置されることを指示している。したがって、ＯＢＰＡ３００２及びＣＣＳ３００８を通過した後、示されるように、累算器２０２の値２１７が飽和及び圧縮されて１１１１１１１１１１１１．１１１１の基準形式値にされ、これが、ｍｕｘ３０３２によって基準サイズのパススルー値３０２８として受け取られる。
【０２２７】
この例では、２つの出力コマンド２９５６が示されている。第１の出力コマンド２９５６は、第２の所定の値を指定し、すなわち基準形式サイズの下位ワードを出力することを指定している。構成２９０２によって指示されるサイズはナローワード（８ビット）であり、これは１６ビットの基準サイズを示唆することから、サイズ変換器３０３６は、示されるように、基準サイズのパススルー値３０２８の下位８ビットを選択して、１１１１１１１１の８ビット値を生じる。第２の出力コマンド２９５６は、第３の所定の値を指定し、すなわち基準形式サイズの上位ワードを出力することを指定している。その結果、サイズ変換器３０３６は、示されるように、基準サイズのパススルー値３０２８の上位８ビットを選択して、１１１１１１１１の８ビット値を生じる。
【０２２８】
次いで図３３を参照すると、図３０のＡＦＵ２１２の動作の第３の例が示される。図３３の例は、活性化関数２９３４が、未処理の累算器２０２の値２１７をすべてパススルーすることを指示する場合のＡＦＵ２１２の動作を図示している。示されるように、構成２９０２は、ＮＰＵ１２６のワイド構成（例えば、１６ビットの入力ワード）に設定されている。
【０２２９】
この例では、累算器２０２は４１ビット幅であり、累算器２０２の２進小数点は、２進小数点の右に８ビットがあるように配置されている（この理由は、上記のように、一実施形態によれば、データ２進小数点２９１２と重み２進小数点２９１４との和が８であるためか、又は代替実施形態によれば、累算器の２進小数点２９２３が８の値を持つように明示的に指定されるためか、のどちらかである）。この例では、図３３は、すべてのＡＬＵ演算が行われた後の累算器２０２の００１０００００００００００００００００１１００００００１１０１１．１１０１１１１０という値２１７を示している。
【０２３０】
この例では、３つの出力コマンド２９５６が示されている。第１の出力コマンド２９５６は、第４の所定の値を指定し、すなわち未処理累算器２０２値の下位ワードを出力することを指定し、第２の出力コマンド２９５６は、第５の所定の値を指定し、すなわち未処理累算器２０２値の中位ワードを出力することを指定し、第３の出力コマンド２９５６は、第６の所定の値を指定し、すなわち未処理累算器２０２値の上位ワードを出力することを指定している。構成２９０２で指示されるサイズがワイドワード（１６ビット）であるため、図３３は、第１の出力コマンド２９５６に応答して、ｍｕｘ３０３７が０００１１０１１１１０１１１１０の１６ビット値を選択し、第２の出力コマンド２９５６に応答して、ｍｕｘ３０３７が０００００００００００１１０００の１６ビット値を選択し、第３の出力コマンド２９５６に応答して、ｍｕｘ３０３７が、０００００００００１００００００の１６ビット値を選択することを示している。
【０２３１】
上述のように、有利な点として、ＮＮＵ１２１は、浮動小数点データではなく、整数データに演算する。これには、各ＮＰＵ１２６、又は少なくともＡＬＵ２０４部分を簡略化するという利点がある。例えば、ＡＬＵ２０４は、浮動小数点実装であれば乗算器２４２について被乗数の指数を加算するために必要とされるであろう加算器を、含む必要がない。同様に、ＡＬＵ２０４は、浮動小数点実装であれば加算器２３４について加数の２進小数点を位置合わせするために必要とされるであろうシフタを、含む必要がない。当業者が理解するように、浮動小数点ユニットは一般に非常に複雑である。そのため、上記はＡＬＵ２０４の簡略化の例に過ぎず、関連する２進小数点をユーザが指定できるようにするハードウェアの固定小数点支援を用いるこの整数実施形態によって、他の簡略化が享受される。ＡＬＵ２０４が整数ユニットであることの結果、有利な点として、浮動小数点の実施形態に比べてＮＰＵ１２６がより小さく（且つより高速に）なる可能性があり、それにより、さらに、有利な点として、ＮＰＵ１２６の大きなアレイをＮＮＵ１２１に組み込むことが容易になる。ＡＦＵ２１２部分は、好ましくは、累算値中で望まれるユーザ指定の小数ビットの数と、出力値中で望まれる小数ビットの数とに基づいて、累算器２０２の値２１７のスケーリング及び飽和を扱う。有利な点として、ＡＦＵ２１２の固定小数点ハードウェア支援の追加的な複雑性と、それに伴うサイズ、電力消費、及び／又は時間の増大は、生じた場合には、例えば図１１の実施形態に関連して説明するように、ＡＦＵ２１２をＡＬＵ２０４部分間で共有することによって償却される可能性がある。これは、ＡＦＵ１１１２の数は、共有実施形態では減らすことができるためである。
【０２３２】
有利な点として、本明細書に記載される実施形態は、浮動小数点の算術ユニットと比べて、ハードウェアの整数算術ユニットの複雑性が低減することに伴う利益の多くを享受することができ、一方で、小数、すなわち２進小数点を持つ数に対する算術演算を依然として提供する。浮動小数点算術の利点は、個々の値が非常に広い値の範囲（効果的に、非常に大きい可能性のある指数範囲のサイズによってのみ制限される）内のいずれかの値であり得るデータへの算術演算に対応できることである。すなわち、各浮動小数点数は、その独自の、可能性として固有の指数値を有する。ただし、本明細書に記載される実施形態は、入力データが高度に並列化されており、それらの値が比較的狭い範囲内にあって、すべての並列化された値の「指数」が同じである場合がある特定の応用例が存在する、という事実を認識し、活用する。したがって、そのような実施形態は、ユーザが、すべての入力値及び／又は累算値に対して２進小数点の場所を一回指定することを可能にする。同様に、そのような実施形態は、並列化された出力の類似する範囲特性を認識及び活用して、ユーザが、すべての出力値に対して２進小数点の場所を一回指定することを可能にする。人工ニューラルネットワークはそのような応用例の一例であるが、それらの実施形態を用いて他の応用例のための計算を行うことができる。個々の各入力数に対してではなく、入力に対して２進小数点の場所を一回指定することにより、それらの実施形態は、浮動小数点実装と比べてメモリ空間のより効率的な使用をもたらし（例えば、必要とするメモリの減少）、且つ／又は、ほぼ同じ量のメモリに対して精度の向上をもたらす。これは、浮動小数点実装であれば指数に使用されることになるビットが、より高い大きさの精度を指定するために使用できるためである。
【０２３３】
さらに有利な点として、上記実施形態は、整数演算の大きな連続の累算中に経験し得る潜在的な精度の低下（例えば、より低い有意性（significance）の小数ビットのオーバーフロー又は損失）を認識し、主として、精度の低下を回避するのに十分に大きい累算器の形で解決法を提供する。
【０２３４】
ＮＮＵマイクロ操作の直接実行
次いで図３４を参照すると、図１のプロセッサ１００、及び図１のＮＮＵ１２１のより詳細な部分を図示するブロック図が示される。ＮＮＵ１２１は、ＮＰＵ１２６のパイプラインステージ３４０１を含んでいる。パイプラインステージ３４０１は、ステージングレジスタによって分離され、ブール論理ゲート、多重化器、加算器、乗算器、比較器など、本明細書に記載されるＮＰＵ１２６の演算を達成する組み合わせ論理を含んでいる。パイプラインステージ３４０１は、ｍｕｘ３４０２からマイクロ操作３４１８を受け取る。マイクロ操作３４１８は、パイプラインステージ３４０１を流れて行き、それらステージの組み合わせ論理を制御する。マイクロ操作３４１８は、ビットの集まりである。好ましくは、マイクロ操作３４１８は、例えば、とりわけ、データＲＡＭ１２２のメモリアドレス１２３、重みＲＡＭ１２４のメモリアドレス１２５、プログラムメモリ１２９のメモリアドレス１３１、ｍｕｘ−ｒｅｇ２０８／７０５の制御信号２１３／７１３、ｍｕｘ８０２の制御信号８０３、及び制御レジスタ１２７のフィールドのうち（例えば、図２９Ａ〜図２９Ｃのうち）多く、のビットを含む。一実施形態では、マイクロ操作３４１８は約１２０ビットからなる。ｍｕｘ３４０２は、３つの異なるソースからマイクロ操作を受け取り、これらのうち１つを、パイプラインステージ３４０１に提供するためのマイクロ操作３４１８として選択する。
【０２３５】
ｍｕｘ３４０２へのマイクロ操作ソースの１つは、図１のシーケンサ１２８である。シーケンサ１２８は、プログラムメモリ１２９から受け取られたＮＮＵ命令を復号し、それに応答して、ｍｕｘ３４０２の第１の入力に提供されるマイクロ操作３４１６を生成する。
【０２３６】
ｍｕｘ３４０２への第２のマイクロ操作ソースは、図１のリザベーションステーション１０８からのマイクロ命令１０５を、ＧＰＲ１１６及びメディアレジスタ１１８からのオペランドと共に受け取る復号器３４０４である。好ましくは、マイクロ命令１０５は、上記のように、ＭＴＮＮ命令１４００及びＭＦＮＮ命令１５００を翻訳するのに応答して、命令トランスレータ１０４によって生成される。マイクロ命令１０５は、即値フィールドを含むことができ、このフィールドは、特定の関数（ＭＴＮＮ命令１４００又はＭＦＮＮ命令１５００によって指定された関数）を指定し、この特定の関数は、上記のように、プログラムメモリ１２９内のプログラムの実行を開始及び停止すること、メディアレジスタ１１８からマイクロ操作を直接実行すること、又はＮＮＵ１２１のメモリの読み出し／書き込みなどである。復号器３４０４は、マイクロ命令１０５を復号し、それに応答して、ｍｕｘ３４０２の第２の入力に提供されるマイクロ操作３４１２を生成する。好ましくは、ＭＴＮＮ／ＭＦＮＮ１４００／１５００命令のいくつかの関数１４３２／１５３２に応答して、復号器３４０４は、パイプライン３４０１に送り出すマイクロ操作３４１２を生成する必要がなく、例えば、制御レジスタ１２７への書き込み、プログラムメモリ１２９にあるプログラムの実行の開始、プログラムメモリ１２９にあるプログラムの実行の一時停止、プログラムメモリ１２９内のプログラムの実行の完了の待機、状態レジスタ１２７からの読み出し、及び、ＮＮＵ１２１のリセットである。
【０２３７】
ｍｕｘ３４０２への第３のマイクロ操作ソースは、メディアレジスタ１１８自体である。好ましくは、上記で図１４に関連して説明したように、ＭＴＮＮ命令１４００は、メディアレジスタ１１８からｍｕｘ３４０２の第３の入力に提供されるマイクロ操作３４１４を直接実行するようにＮＮＵ１２１に命令する関数を指定することができる。アーキテクチャメディアレジスタ１１８から提供されるマイクロ操作３４１４の直接の実行は、検査、例えばＮＮＵ１２１の組み込み自己テスト（ＢＩＳＴ）やデバッグに特に有用である可能性がある。
【０２３８】
好ましくは、復号器３４０４は、ｍｕｘ３４０２の選択を制御するモードインディケータ３４２２を生成する。ＭＴＮＮ命令１４００が、プログラムメモリ１２９からのプログラムの稼働を開始する関数を指定するとき、復号器３４０４は、エラーが発生するまで、又は、復号器３４０４が、プログラムメモリ１２９からのプログラムの実行を停止する関数を指定するＭＴＮＮ命令１４００に遭遇するまで、ｍｕｘ３４０２にシーケンサ１２８からのマイクロ操作３４１６を選択させるモードインディケータ３４２２値を生成する。ＭＴＮＮ命令１４００が、メディアレジスタ１１８から提供されるマイクロ操作３４１４を直接実行するようにＮＮＵ１２１に命令する関数を指定するとき、復号器３４０４は、ｍｕｘ３４０２に、指定されたメディアレジスタ１１８からのマイクロ操作３４１４を選択させるモードインディケータ３４２２値を生成する。それ以外の場合、復号器３４０４は、ｍｕｘ３４０２に復号器３４０４からのマイクロ操作３４１２を選択させるモードインディケータ３４２２値を生成する。
【０２３９】
可変レートのニューラルネットワークユニット
ＮＮＵ１２１がプログラムを稼働させ、その後、次のプログラムを稼働できるようになる前、ＮＮＵ１２１が必要とする何らかのことをプロセッサ１００が行うのを待って、アイドル状態になる状況があり得る。例えば、図３〜図６Ａに関連して記載した状況と似た、ＮＮＵ１２１が、積和活性化関数プログラム（フィードフォワードニューラルネットワーク層プログラムと呼ばれる場合もある）の２つ以上の連続したインスタンスを稼働させる状況を仮定する。プロセッサ１００が、ＮＮＵプログラムの次の稼働で使用されることになる５１２ＫＢ分の重み値を重みＲＡＭ１２４に書き込むには、ＮＮＵ１２１がそのプログラムを稼働させるためにかかる時間よりも、大幅に長い時間がかかる可能性がある。別の表現をすると、ＮＮＵ１２１はプログラムを比較的短い時間量で稼働させ、その後、プロセッサ１００がそのプログラムの次の稼働のために次の重み値を重みＲＡＭ１２４に書き込み終える間、アイドル状態になる可能性がある。この状況を図３６Ａに視覚的に図示しており、これについては下記でより詳細に説明する。そのような状況では、ＮＮＵ１２１をより遅いレートで稼働させ、より長い時間をかけてプログラムを実行し、それにより、ＮＮＵ１２１がプログラムを稼働させるために必要とされるエネルギー消費をより長い時間にわたって分散させると有利である可能性があり、そのようにすると、一般に、ＮＮＵ１２１及び恐らくはプロセッサ１００の温度をより低く保つ傾向がある可能性がある。この状況を緩和モードと呼び、図３６Ｂに視覚的に図示している。これについては下記でより詳細に説明する。
【０２４０】
次いで図３５を参照すると、可変レートのＮＮＵ１２１を含むプロセッサ１００を図示するブロック図が示される。プロセッサ１００は、図１のプロセッサ１００と多くの点で似ており、同様の参照符号を付した要素は類似する。図３５のプロセッサ１００は、クロック生成論理３５０２をさらに含み、これは、プロセッサ１００の機能ユニット、すなわち、命令取出しユニット１０１、命令キャッシュ１０２、命令トランスレータ１０４、リネームユニット１０６、リザベーションステーション１０８、ＮＮＵ１２１、その他の実行ユニット１１２、メモリサブシステム１１４、汎用レジスタ１１６、及びメディアレジスタ１１８に結合されている。クロック生成論理３５０２は、基本クロック（primary  clock）レート又はクロック周波数を有するクロック信号を生成する、位相ロックループ（ＰＬＬ）などのクロック生成器を含む。例えば、基本クロックレートは、１ＧＨｚ、１．５ＧＨｚ、２ＧＨｚなどであり得る。クロックレートは、１秒当たりのクロック信号のサイクル数、例えばハイ状態とロー状態との間の振動数を指示する。好ましくは、クロック信号は、均衡のとれたデューティサイクルを有する、すなわちサイクルの半分がハイでサイクルのもう半分がローであるか、或いは、クロック信号は、クロック信号がロー状態よりも長くハイ状態にあるか又はその逆である不均衡なデューティサイクルを有する。好ましくは、ＰＬＬは、複数のクロックレートで基本クロック信号を生成するように構成可能である。好ましくは、プロセッサ１００は、各種の要因に基づいて自動的に基本クロックレートを調節する電力管理モジュールを含み、そのような要因には、動的に検出されるプロセッサ１００の動作温度、利用率、並びに、要求される性能及び／又は電力節減指標を指示するシステムソフトウェア（例えば、オペレーティングシステム、ＢＩＯＳ）からのコマンドが含まれる。一実施形態では、電力管理モジュールは、プロセッサ１００のマイクロコードを含む。
【０２４１】
クロック生成論理３５０２は、クロック分配ネットワーク、又はクロックツリーをさらに含む。クロックツリーは、基本クロック信号をプロセッサ１００の機能ユニットに分配し（distributes）、これは図３５では、命令取出しユニット１０１へのクロック信号３５０６−１、命令キャッシュ１０２へのクロック信号３５０６−２、命令トランスレータ１０４へのクロック信号３５０６−１０、リネームユニット１０６へのクロック信号３５０６−９、リザベーションステーション１０８へのクロック信号３５０６−８、ＮＮＵ１２１へのクロック信号３５０６−７、他の実行ユニット１１２へのクロック信号３５０６−４、メモリサブシステム１１４へのクロック信号３５０６−３、汎用レジスタ１１６へのクロック信号３５０６−５、及び、メディアレジスタ１１８へのクロック信号３５０６−６として示され、これらを集合的にクロック信号３５０６と呼ぶ。クロックツリーは、基本クロック信号３５０６をそれぞれの機能ユニットに送信するノード、又は配線を含んでいる。加えて、好ましくは、クロック生成論理３５０２は、クロックバッファを含み、これは、特に長いノードの場合に、必要に応じて基本クロック信号を再生成してよりクリーンなクロック信号を提供する、且つ／又は基本クロック信号の電圧レベルを昇圧する。加えて、各機能ユニットが、必要に応じて、各々が受け取るそれぞれの基本クロック信号３５０６を再生成及び／又は昇圧する、独自の部分クロックツリーをさらに含むことが可能である。
【０２４２】
ＮＮＵ１２１は、クロック低減論理３５０４を含み、クロック低減論理３５０４は、緩和インディケータ３５１２を受け取り、基本クロック信号３５０６−７を受け取り、それに応答して副クロック（secondary  clock）信号を生成する。副クロック信号は、基本クロックレートと同じクロックレートであるクロックレートを有するか、又は、緩和モード時には、基本クロックレートに対して、緩和インディケータ３５１２中にプログラムされた量だけ低減させたクロックレートを有し、これは熱に関する利益をもたらす可能性がある。クロック低減論理３５０４は、副クロック信号をＮＮＵ１２１の様々なブロックに分配するクロック分配ネットワーク、又はクロックツリーを含んでいる点で、多くの点でクロック生成論理３５０２に似ており、この副クロック信号は、ＮＰＵ１２６のアレイへのクロック信号３５０８−１、シーケンサ１２８へのクロック信号３５０８−２、及びインターフェース論理３５１４へのクロック信号３５０８−３として示されており、これらを集合的に又は個々に、副クロック信号３５０８と呼ぶ。好ましくは、ＮＰＵ１２６は、図３４に関連して説明するように複数のパイプラインステージ３４０１を含み、これは、クロック低減論理３５０４から副クロック信号３５０８−１を受け取るパイプラインステージングレジスタを含んでいる。
【０２４３】
ＮＮＵ１２１は、基本クロック信号３５０６−７及び副クロック信号３５０８−３を受け取るインターフェース論理３５１４をさらに含んでいる。インターフェース論理３５１４は、プロセッサ１００のフロントエンドの下方部分（例えば、リザベーションステーション１０８、メディアレジスタ１１８、及び汎用レジスタ１１６）と、ＮＮＵ１２１の様々なブロック、すなわち、クロック低減論理３５０４、データＲＡＭ１２２、重みＲＡＭ１２４、プログラムメモリ１２９、及びシーケンサ１２８との間に結合される。インターフェース論理３５１４は、データＲＡＭバッファ３５２２、重みＲＡＭバッファ３５２４、図３４の復号器３４０４、及び緩和インディケータ３５１２を含む。緩和インディケータ３５１２は、そのようにさせる場合に、ＮＰＵ１２６のアレイがＮＮＵプログラム命令をどれほどゆっくり実行するかを指定する値を保持する。好ましくは、緩和インディケータ３５１２は、除数値Ｎを指定し、クロック低減論理３５０４は、その除数値で基本クロック信号３５０６−７を割って副クロック信号３５０８を生成し、副クロック信号３５０８が１／Ｎであるレートを持つようにする。好ましくは、Ｎの値は、複数の異なる所定の値のいずれか１つにプログラムされて、クロック低減論理３５０４に、基本クロックレートよりも小さい、対応する複数の異なるレートで副クロック信号３５０８を生成させることができる。
【０２４４】
一実施形態では、クロック低減論理３５０４は、基本クロック信号３５０６−７を緩和インディケータ３５１２の値で割るクロック分周回路を備える。一実施形態では、クロック低減論理３５０４は、基本クロック信号３５０６−７を、基本クロック信号３５０６−７のＮ回のサイクルごとに一回だけ真になるイネーブル信号でゲートするクロックゲート（例えば、ＡＮＤゲート）を備える。例えば、Ｎまでカウントするカウンタを含んだ回路が使用されて、イネーブル信号を生成することができる。付随する論理が、カウンタの出力がＮと一致することを検出すると、その論理は、副クロック信号３５０８に真のパルスを生成し、カウンタをリセットする。好ましくは、緩和インディケータ３５１２の値は、図１４のＭＴＮＮ１４００命令などのアーキテクチャ命令によってプログラム可能である。好ましくは、図３７に関してより詳細に説明するように、プロセッサ１００で稼働しているアーキテクチャプログラムが、ＮＮＵプログラムの稼働を開始するようにＮＮＵ１２１に命令する直前に、緩和値を緩和インディケータ３５１２にプログラムする。
【０２４５】
重みＲＡＭバッファ３５２４は、重みＲＡＭ１２４とメディアレジスタ１１８との間に結合されて、それらの間のデータの伝達をバッファリングする。好ましくは、重みＲＡＭバッファ３５２４は、図１７のバッファ１７０４の実施形態の１つ又は複数に似ている。好ましくは、メディアレジスタ１１８からデータを受け取る重みＲＡＭバッファ３５２４の部分は、基本クロックレートの基本クロック信号３５０６−７によってクロック制御され、重みＲＡＭ１２４からデータを受け取る重みＲＡＭバッファ３５２４の部分は、副クロックレートの副クロック信号３５０８−３によってクロック制御され、副クロックレートは、緩和インディケータ３５１２にプログラムされた値に依存して、すなわちＮＮＵ１２１が緩和モードで動作しているか又は通常モードで動作しているかに依存して、基本クロックレートに対して低減される場合も低減されない場合もある。一実施形態では、重みＲＡＭ１２４は、図１７に関連して上記で説明したようにシングルポートであり、重みＲＡＭバッファ３５２４を介してメディアレジスタ１１８によって、及び図１１のＮＰＵ１２６又は行バッファ１１０４によっての双方で、調停されるやり方でアクセス可能である。代替的な一実施形態では、重みＲＡＭ１２４は、図１６に関連して上記で説明したようにデュアルポートであり、各ポートは、重みＲＡＭバッファ３５２４を介してメディアレジスタ１１８によって、及びＮＰＵ１２６又は行バッファ１１０４によっての双方で、同時的なやり方でアクセス可能である。
【０２４６】
同様に、データＲＡＭバッファ３５２２は、データＲＡＭ１２２とメディアレジスタ１１８との間に結合されて、それらの間のデータの伝達をバッファリングする。好ましくは、データＲＡＭバッファ３５２２は、図１７のバッファ１７０４の実施形態の１つ又は複数に似ている。好ましくは、メディアレジスタ１１８からデータを受け取るデータＲＡＭバッファ３５２２の部分は、基本クロックレートの基本クロック信号３５０６−７でクロック制御され、データＲＡＭ１２２からデータを受け取るデータＲＡＭバッファ３５２２の部分は、副クロックレートの副クロック信号３５０８−３でクロック制御され、副クロックレートは、緩和インディケータ３５１２にプログラムされた値に依存して、すなわちＮＮＵ１２１が緩和モードで動作しているか又は通常モードで動作しているかに依存して、基本クロックレートに対して低減される場合もされない場合もある。一実施形態では、データＲＡＭ１２２は、図１７に関連して上記で説明したようにシングルポートであり、データＲＡＭバッファ３５２２を介してメディアレジスタ１１８によって、及び図１１のＮＰＵ１２６又は行バッファ１１０４によっての双方で、調停されるやり方でアクセス可能である。代替的な一実施形態では、データＲＡＭ１２２は、上記で図１６に関連して説明したようにデュアルポートであり、各ポートは、データＲＡＭバッファ３５２２を介してメディアレジスタ１１８によって、及びＮＰＵ１２６又は行バッファ１１０４によっての双方で、同時的なやり方でアクセス可能である。
【０２４７】
好ましくは、インターフェース論理３５１４は、基本クロックドメインと副クロックドメインとの間の同期をもたらすために、データＲＡＭ１２２及び／又は重みＲＡＭ１２４がシングルポートであるか又はデュアルポートであるかに関係なく、データＲＡＭバッファ３５２２及び重みＲＡＭバッファ３５２４を含む。好ましくは、データＲＡＭ１２２、重みＲＡＭ１２４、及びプログラムメモリ１２９の各々は、それぞれの読み出しイネーブル信号、書き込みイネーブル信号、及びメモリ選択信号を含む静的ＲＡＭ（ＳＲＡＭ）を含む。
【０２４８】
上記のように、ＮＮＵ１２１は、プロセッサ１００の実行ユニットである。実行ユニットは、図１のアーキテクチャ命令１０３が翻訳されたマイクロ命令１０５など、アーキテクチャ命令が翻訳されたマイクロ命令を実行するか、又はアーキテクチャ命令１０３自体を実行する、プロセッサの機能ユニットである。実行ユニットは、ＧＰＲ１１６やメディアレジスタ１１８など、プロセッサの汎用レジスタからオペランドを受け取る。実行ユニットは、マイクロ命令又はアーキテクチャ命令を実行するのに応答して、汎用レジスタに書き込まれ得る結果を生成することができる。アーキテクチャ命令１０３の例は、それぞれ図１４及び図１５に関連して説明した、ＭＴＮＮ命令１４００及びＭＦＮＮ命令１５００である。マイクロ命令は、アーキテクチャ命令を実装する。より具体的には、アーキテクチャ命令が翻訳された１つ又は複数のマイクロ命令の実行ユニットによる集合的な実行は、そのアーキテクチャ命令で指定される入力に、アーキテクチャ命令で指定される演算を行って、アーキテクチャ命令によって定義される結果を作り出す。
【０２４９】
次いで図３６Ａを参照すると、ＮＮＵ１２１が通常モード、すなわち基本クロックレートで動作している、プロセッサ１００の動作の例を図示するタイミング図が示される。時間は、タイミング図中の左から右へと進行する。プロセッサ１００は、アーキテクチャプログラムを基本クロックレートで稼働させている。より具体的には、プロセッサ１００のフロントエンド（例えば、命令取出しユニット１０１、命令キャッシュ１０２、命令トランスレータ１０４、リネームユニット１０６、リザベーションステーション１０８）が、基本クロックレートで、アーキテクチャ命令を取り出し、復号し、ＮＮＵ１２１及び他の実行ユニット１１２に発行する。
【０２５０】
最初、アーキテクチャプログラムは、フロントエンド１００がＮＮＵ１２１に対して発行するアーキテクチャ命令（例えば、ＭＴＮＮ命令１４００）を実行し、この命令は、ＮＮＵ１２１に、そのプログラムメモリ１２９内のＮＮＵプログラムの稼働を開始するように命令する。それに先立って、アーキテクチャプログラムは、アーキテクチャ命令を実行して、緩和インディケータ３５１２に、基本クロックレートを指定する値、すなわちＮＮＵ１２１を通常モードにする値を書き込んでいる。より具体的には、緩和インディケータ３５１２にプログラムされた値により、クロック低減論理３５０４は、副クロック信号３５０８を、基本クロック信号３５０６の基本クロックレートで生成する。好ましくは、この場合、クロック低減論理３５０４のクロックバッファは、単に基本クロック信号３５０６を昇圧する。また、先立って、アーキテクチャプログラムは、アーキテクチャ命令を実行して、データＲＡＭ１２２及び重みＲＡＭ１２４に書き込みをし、ＮＮＵプログラムをプログラムメモリ１２９に書き込んでいる。ＮＮＵプログラム開始のＭＴＮＮ命令１４００に応答して、ＮＮＵ１２１は、ＮＮＵプログラムを基本クロックレートで稼働させ始める。これは、緩和インディケータ３５１２が基本レート値でプログラムされたためである。ＮＮＵ１２１の稼働を開始した後、アーキテクチャプログラムは、アーキテクチャ命令を基本クロックレートで実行し続け、このアーキテクチャ命令は、主として、ＮＮＵプログラムの次のインスタンス、又はＮＮＵプログラムの呼び出し若しくは稼働の準備として、データＲＡＭ１２２及び重みＲＡＭ１２４の書き込み及び／又は読み出しを行うＭＴＮＮ命令１４００を含む。
【０２５１】
図３６Ａの例に示されるように、ＮＮＵ１２１は、アーキテクチャプログラムがデータＲＡＭ１２２及び重みＲＡＭ１２４の書き込み／読み出しを終えるために要するよりも大幅に少ない時間（例えば、その時間の４分の１）で、ＮＮＵプログラムの稼働を終了する。例えば、ＮＮＵ１２１は、ＮＮＵプログラムを稼働させるのに約１０００クロックサイクルを要する可能性があるのに対して、アーキテクチャプログラムは、稼働に約４０００クロックサイクルを要し、両方とも基本クロックレートである。その結果、ＮＮＵ１２１は、その時間の残りはアイドル状態になり、これはこの例では大幅に長い時間であり、例えば、約３０００基本クロックレートサイクルである。図３６Ａの例に示されるように、このパターンはもう１回継続し、また、ニューラルネットワークのサイズ及び構成に依存して、もう数回継続する可能性がある。ＮＮＵ１２１は、プロセッサ１００のうち比較的大きくトランジスタ密度が高い機能ユニットである可能性があるため、特に基本クロックレートで稼働している時に、著しい量の熱を発生する可能性がある。
【０２５２】
次いで図３６Ｂを参照すると、ＮＮＵ１２１が緩和モード、すなわち基本クロックレート未満のレートで動作している、プロセッサ１００の動作の例を図示するタイミング図が示される。図３６Ｂのタイミング図は、プロセッサ１００がアーキテクチャプログラムを基本クロックレートで稼働させている点において、多くの点で図３６Ａのタイミング図に似ている。そして、この例では、図３６Ｂのアーキテクチャプログラム及びＮＮＵプログラムが、図３６Ａと同じであると仮定される。ただし、ＮＮＵプログラムを開始する前に、アーキテクチャプログラムは、ＭＴＮＮ命令１４００を実行し、その命令で、クロック低減論理３５０４に基本クロックレート未満の副クロックレートの副クロック信号３５０８を生成させる値を、緩和インディケータ３５１２にプログラムしている。すなわち、アーキテクチャプログラムは、ＮＮＵ１２１を、図３６Ａのように通常モードにするのではなく、図３６Ｂでは緩和モードにする。その結果、ＮＰＵ１２６は、ＮＮＵプログラムを副クロックレートで実行し、副クロックレートは、緩和モードでは基本クロックレート未満である。この例では、緩和インディケータ３５１２には、副クロックレートが基本クロックレートの４分の１であることを指定する値がプログラムされると仮定する。その結果、図３６Ａと図３６Ｂを比較することで分かるように、ＮＮＵ１２１は、ＮＮＵプログラムを緩和モードで稼働させるには、ＮＮＵプログラムを通常モードで稼働させる場合に比べて約４倍長い時間を要し、ＮＮＵ１２１がアイドルになる時間量が比較的短くなる。したがって、ＮＮＵプログラムを稼働させるために使用されるエネルギーは、ＮＮＵ１２１が図３６Ａでプログラムを通常モードで稼働させた場合と比べて約４倍長い期間にわたって、図３６ＢのＮＮＵ１２１によって消費される。そのため、ＮＮＵ１２１がＮＮＵプログラムを稼働させるために発生させる熱が図３６Ｂでは図３６Ａのおよそ４分の１の割合になり、これは、本明細書に記載されるように熱に関する利益を有する可能性がある。
【０２５３】
次いで図３７を参照すると、図３５のプロセッサ１００の動作を図示するフローチャートが示される。このフローチャートは、多くの点で、上記で図３５、図３６Ａ、及び図３６Ｂに関連して説明した動作に似ている動作を図示している。フローはブロック３７０２で開始する。
【０２５４】
ブロック３７０２で、プロセッサ１００が、ＭＴＮＮ命令１４００を実行して、重みＲＡＭ１２４に重みを書き込み、データＲＡＭ１２２にデータを書き込む。フローはブロック３７０４に進む。
【０２５５】
ブロック３７０４で、プロセッサ１００が、ＭＴＮＮ命令１４００を実行して、緩和インディケータ３５１２に、基本クロックレートよりも低いレートを指定する値をプログラムし、すなわちＮＮＵ１２１を緩和モードにする。フローはブロック３７０６に進む。
【０２５６】
ブロック３７０６で、プロセッサ１００は、ＭＴＮＮ命令１４００を実行して、ＮＮＵ１２１に、図３６Ｂに視覚化されたのと同様にしてＮＮＵプログラムの稼働を開始するように命令する。フローはブロック３７０８に進む。
【０２５７】
ブロック３７０８で、ＮＮＵ１２１が、ＮＮＵプログラムの稼働を開始する。並行して、プロセッサ１００は、ＭＴＮＮ命令１４００を実行して、重みＲＡＭ１２４に新しい重みを書き込み（且つ、場合によってはデータＲＡＭ１２２に新しいデータを書き込み）、且つ／又はＭＦＮＮ命令１５００を実行して、データＲＡＭ１２２から（及び場合によっては重みＲＡＭ１２４から）結果を読み出す。フローはブロック３７１２に進む。
【０２５８】
ブロック３７１２で、プロセッサ１００は、ＭＦＮＮ命令１５００（例えば、状態レジスタ１２７の読み出し）を実行して、ＮＮＵ１２１がそのプログラムの稼働を終えたことを検出する。アーキテクチャプログラムが緩和インディケータ３５１２の適切な値を選択したと仮定すると、図３６Ｂに視覚化されるように、ＮＮＵ１２１がＮＮＵプログラムを実行するには、プロセッサ１００が重みＲＡＭ１２４及び／又はデータＲＡＭ１２２にアクセスするアーキテクチャプログラムの部分を実行するためにかかる時間量とおよそ同じ時間量を要するはずである。フローはブロック３７１４に進む。
【０２５９】
ブロック３７１４で、プロセッサ１００は、ＭＴＮＮ命令１４００を実行して、緩和インディケータ３５１２に、基本クロックレートを指定する値をプログラムし、すなわちＮＮＵ１２を通常モードにする。フローはブロック３７１６に進む。
【０２６０】
ブロック３７１６で、プロセッサ１００は、ＭＴＮＮ命令１４００を実行して、ＮＮＵ１２１に、図３６Ａに視覚化されたのと同様にしてＮＮＵプログラムの稼働を開始するように命令する。フローはブロック３７１８に進む。
【０２６１】
ブロック３７１８で、ＮＮＵ１２１は、ＮＮＵプログラムを通常モードで稼働させ始める。フローはブロック３７１８で終了する。
【０２６２】
上記のように、ＮＮＵプログラムを緩和モードで稼働させると、ＮＮＵがプログラムを稼働させる時間が、ＮＮＵがプログラムを通常モードで（すなわち、プロセッサの基本クロックレートで）稼働させる時間と比べて延び、これは熱に関する利益をもたらす可能性がある。より具体的には、デバイス（例えば、トランジスタ、キャパシタ、配線）は、ＮＮＵがプログラムを緩和モードで稼働させている間は、より低い温度で動作する可能性が高い。これは、ＮＮＵが、ＮＮＵ（例えば、半導体素子、金属層、下にある基板）並びに周辺パッケージ及び冷却対策（例えば、ヒートシンク、ファン）によって放散される熱を発生させるレートがよりゆっくりになるためである。これにより、一般には、プロセッサダイの他の部分にあるデバイスの温度も下げることができる。デバイスの動作温度、特にデバイスの接合部の温度の低下は、漏洩電流の減少という利益も有する可能性がある。さらに、単位時間当たりに消費される電流の量が減るため、誘導雑音及びＩＲ低下雑音を低減させることができる。さらには、より低い温度は、プロセッサのＭＯＳＦＥＴの負バイアス温度不安定性（ＮＢＴＩ）及び正バイアス温度不安定性（ＰＢＴＩ）に好影響を与える可能性があり、それにより、デバイス及びその結果プロセッサ部分の信頼性及び／又は寿命を向上させる。温度の低下は、プロセッサの金属層におけるジュール加熱及びエレクトロマイグレーションも低減することができる。
【０２６３】
ＮＮＵの共有リソースに関するアーキテクチャプログラムと非アーキテクチャプログラムとの間の通信機構
例えば図２４〜図２８及び図３５〜図３７に関連して上記で説明したように、データＲＡＭ１２２及び重みＲＡＭ１２４は、共有リソースである。ＮＰＵ１２６とプロセッサ１００のフロントエンドとの両方が、データＲＡＭ１２２及び重みＲＡＭ１２４を共有する。より具体的には、ＮＰＵ１２６と、プロセッサ１００のフロントエンド、例えばメディアレジスタ１１８との両方が、データＲＡＭ１２２及び重みＲＡＭ１２４の書き込み及び読み出しを行う。別の表現をすると、プロセッサ１００で稼働しているアーキテクチャプログラムは、データＲＡＭ１２２及び重みＲＡＭ１２４を、ＮＮＵ１２１で稼働しているＮＮＵプログラムと共有し、状況によっては、これは、上記のようにアーキテクチャプログラムとＮＮＵプログラムとの間のフローの制御を必要とする。このリソース共有は、プログラムメモリ１２９にもある程度当てはまる。なぜならば、アーキテクチャプログラムがプログラムメモリ１２９に書き込み、シーケンサ１２８がプログラムメモリ１２９を読み出すためである。アーキテクチャプログラムとＮＮＵプログラムの間の共有リソースへのアクセスのフローを制御する、高性能の解決法を提供する実施形態が上記及び下記に記載される。
【０２６４】
ＮＮＵプログラムが非アーキテクチャプログラムとも呼ばれ、ＮＮＵ命令が非アーキテクチャ命令とも呼ばれ、ＮＮＵ命令セット（上記ではＮＰＵ命令セットとも呼んでいる）が非アーキテクチャ命令セットとも呼ばれる実施形態が記載される。非アーキテクチャ命令セットは、アーキテクチャ命令セットとは別のものである。プロセッサ１００がアーキテクチャ命令をマイクロ命令に翻訳する命令トランスレータ１０４を含んでいる実施形態では、非アーキテクチャ命令セットは、マイクロ命令セットとも別のものである。
【０２６５】
次いで図３８を参照すると、ＮＮＵ１２１のシーケンサ１２８をより詳細に図示するブロック図が示される。シーケンサ１２８は、上記のように、メモリアドレス１３１をプログラムメモリ１２９に提供して、シーケンサ１２８に提供される非アーキテクチャ命令を選択する。メモリアドレス１３１は、図３８に示されるように、シーケンサ１２８のプログラムカウンタ３８０２に保持される。シーケンサ１２８は、一般に、シーケンサ１２８がループ命令や分岐命令などの非アーキテクチャ制御命令に遭遇しない限り、プログラムメモリ１２９の順次アドレスを通じて増分して行き、非アーキテクチャ制御命令に遭遇した場合、シーケンサ１２８は、プログラムカウンタ３８０２を、制御命令の目標アドレス、すなわち制御命令のターゲットにある非アーキテクチャ命令のアドレスに更新する。したがって、プログラムカウンタ３８０２に保持されているアドレス１３１は、ＮＰＵ１２６による実行のために現在取り出されている非アーキテクチャプログラムの非アーキテクチャ命令の、プログラムメモリ１２９内のアドレスを指定する。有利な点として、プログラムカウンタ３８０２の値は、図３９に関連して下記で説明するように、状態レジスタ１２７のＮＮＵプログラムカウンタフィールド３９１２を介して、アーキテクチャプログラムによって取得されることが可能である。これにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データＲＡＭ１２２及び／又は重みＲＡＭ１２４のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。
【０２６６】
シーケンサ１２８は、ループカウンタ３８０４をさらに含み、これは、例えば、図２６Ａのアドレス１０にあるＬＯＯＰ  ＴＯ  １命令や、図２８のアドレス１１にあるＬＯＯＰ  ＴＯ  １命令などの非アーキテクチャループ命令との関係で使用される。図２６Ａ及び図２８の例では、ループカウンタ３８０４には、アドレス０の非アーキテクチャ初期化命令で指定される値、例えば４００の値がロードされる。シーケンサ１２８がループ命令に遭遇して目標命令（例えば、図２６Ａのアドレス１の積和命令、又は図２８のアドレス１のｍａｘｗａｃｃ命令）にジャンプするたびに、シーケンサ１２８はループカウンタ３８０４を減分する。ループカウンタ３８０４がゼロに達すると、シーケンサ１２８は、次の順次非アーキテクチャ命令に進む。代替的な一実施形態では、ループ命令に最初に遭遇した時に、ループカウンタ３８０４は、そのループ命令で指定されるループカウント値をロードされ、非アーキテクチャ初期化命令を介してループカウンタ３８０４を初期化する必要がなくされる。したがって、ループカウンタ３８０４の値は、非アーキテクチャプログラムのループ本体があと何回実行されることになるかを指示する。有利な点として、ループカウンタ３８０４の値は、図３９に関連して下記で説明するように、状態レジスタ１２７のループカウント３９１４フィールドを介して、アーキテクチャプログラムによって取得されることが可能である。それにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データＲＡＭ１２２及び／又は重みＲＡＭ１２４のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。一実施形態では、シーケンサ１２８は、非アーキテクチャプログラム中の入れ子構造のループに対応するための３つの追加的なループカウンタを含み、これら他の３つのループカウンタの値も、状態レジスタ１２７を介して読み出すことが可能である。ループ命令中の１ビットが、４つのループカウンタのうちどれが当該ループ命令に使用されるかを指示する。
【０２６７】
シーケンサ１２８は、反復カウンタ３８０６をさらに含む。反復カウンタ３８０６は、例えば、図４、図９、図２０、及び図２６Ａのアドレス２の積和命令や、図２８アドレス２のｍａｘｗａｃｃ命令などの非アーキテクチャ命令との関連で使用され、これらを以後「実行」命令と呼ぶ。上記の例では、実行命令の各々は、それぞれ５１１、５１１、１０２３、２、及び３の反復回数を指定する。シーケンサ１２８が、非ゼロの反復回数を指定する実行命令に遭遇すると、シーケンサ１２８は、反復カウンタ３８０６に、指定される値をロードする。加えて、シーケンサ１２８は、適切なマイクロ操作３４１８を生成して、図３４のＮＰＵ１２６のパイプラインステージ３４０１中の論理を実行のために制御し、反復カウンタ３８０６を減分する。反復カウンタ３８０６がゼロより大きい場合、シーケンサ１２８は、再度適切なマイクロ操作３４１８を生成して、ＮＰＵ１２６内の論理を制御し、反復カウンタ３８０６を減分する。シーケンサ１２８は、反復カウンタ３８０６がゼロに達するまで、このようにして継続する。したがって、反復カウンタ３８０６の値は、非アーキテクチャ実行命令の中で指定される演算（例えば、累算器及びデータワード／重みワードの、積和、最大値、和）があと何回行われることになるかを指示する。有利な点として、反復カウンタ３８０６の値は、図３９に関連して下記で説明するように、状態レジスタ１２７の反復カウント３９１６フィールドを介して、アーキテクチャプログラムによって取得されることが可能である。それにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データＲＡＭ１２２及び／又は重みＲＡＭ１２４のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。
【０２６８】
次いで図３９を参照すると、ＮＮＵ１２１の制御及び状態レジスタ１２７の特定のフィールドを図示するブロック図が示される。それらのフィールドが含むのは、非アーキテクチャプログラムを実行しているＮＰＵ１２６によって一番最近書き込まれた重みＲＡＭ行２６０２のアドレス、非アーキテクチャプログラムを実行しているＮＰＵ１２６によって一番最近読み出された重みＲＡＭ行２６０４のアドレス、非アーキテクチャプログラムを実行しているＮＰＵ１２６によって一番最近書き込まれたデータＲＡＭ行２６０６のアドレス、及び、非アーキテクチャプログラムを実行しているＮＰＵ１２６によって一番最近読み出されたデータＲＡＭ行２６０４のアドレス、であり、これらについては上記で２６Ｂに関連して説明した。加えて、これらのフィールドは、ＮＮＵプログラムカウンタ３９１２、ループカウント３９１４、及び反復カウント３９１６をさらに含んでいる。上記のように、状態レジスタ１２７は、アーキテクチャプログラムによって、例えばＭＦＮＮ命令１５００で、ＮＮＵプログラムカウンタ３９１２、ループカウント３９１４、及び反復カウント３９１６フィールド値を含めて、メディアレジスタ１１８及び／又は汎用レジスタ１１６へと読み出すことができる。プログラムカウンタ３９１２値は、図３８のプログラムカウンタ３８０２の値を反映する。ループカウント３９１４値は、ループカウンタ３８０４の値を反映する。反復カウント３９１６値は、反復カウンタ３８０６の値を反映する。一実施形態では、シーケンサ１２８は、プログラムカウンタ３８０２、ループカウンタ３８０４、又は反復カウンタ３８０６に変更を加えるたびに、プログラムカウンタ３９１２、ループカウント３９１４、及び反復カウント３９１６フィールドの値を更新して、アーキテクチャプログラムが読み出す時にそれらのフィールド値が現在の値であるようにする。別の実施形態では、ＮＮＵ１２１が、状態レジスタ１２７を読み出すアーキテクチャ命令を実行する時、ＮＮＵ１２１は、単に、プログラムカウンタ３８０２、ループカウンタ３８０４、及び反復カウンタ３８０６の値を取得し、それらをアーキテクチャ命令に（例えば、メディアレジスタ１１８又は汎用レジスタ１１６に）返す。
【０２６９】
前述から観察できるように、図３９の状態レジスタ１２７のフィールドの値は、ＮＮＵ１２１によって実行されている間の非アーキテクチャプログラムの進捗を指示する情報と特徴づけることができる。非アーキテクチャプログラムの進捗の特定の態様について上記で説明したが、それらは、プログラムカウンタ３８０２値、ループカウンタ３８０４値、反復カウンタ３８０６値、重みＲＡＭ１２４のアドレス１２５のうち一番最近書き込まれた／読み出されたアドレス２６０２／２６０４、及びデータＲＡＭ１２２のアドレス１２３のうち一番最近書き込まれた／読み出されたアドレス２６０６／２６０８などである。プロセッサ１００で実行されているアーキテクチャプログラムは、図３９の非アーキテクチャプログラムの進捗値を状態レジスタ１２７から読み出し、その情報を使用して、例えば比較及び分岐命令などのアーキテクチャ命令によって決定を行うことができる。例えば、アーキテクチャプログラムは、データ／重みをデータＲＡＭ１２２及び／又は重みＲＡＭ１２４に書き込む行、又は読み出す行を決定して、特に大きなデータセットについて及び／又は異なる非アーキテクチャプログラムの重なった実行インスタンスについて、データＲＡＭ１２２又は重みＲＡＭ１２４に出入りするデータのフローを制御する。アーキテクチャプログラムによってなされる決定の例については、上記及び下記で説明している。
【０２７０】
例えば、上記で図２６Ａに関連して説明したように、アーキテクチャプログラムは、畳み込みの結果を畳み込みカーネル２４０２より上の（例えば、行８より上）データＲＡＭ１２２の行に書き戻すように非アーキテクチャプログラムを構成し、アーキテクチャプログラムは、ＮＮＵ１２１が結果を書き込むと、一番最近書き込まれたデータＲＡＭ１２２の行２６０６のアドレスを使用して、その結果をデータＲＡＭ１２２から読み出す。
【０２７１】
別の例として、上記で図２６Ｂに関連して説明したように、アーキテクチャプログラムは、図３８の状態レジスタ１２７のフィールドからの情報を使用して、非アーキテクチャプログラムの進捗を決定して、図２４のデータ配列２４０４の畳み込みを、５つの５１２×１６００のチャンクで行う。アーキテクチャプログラムは、２５６０×１６００のデータ配列２４０４のうち最初の５１２×１６００チャンクを重みＲＡＭ１２４に書き込み、非アーキテクチャプログラムを開始し、このプログラムは、１６００のループカウント、及び初期化された重みＲＡＭ１２４の０の出力行を有する。ＮＮＵ１２１が非アーキテクチャプログラムを実行するとき、アーキテクチャプログラムは、状態レジスタ１２７を読み出して、一番最近書き込みがされた重みＲＡＭの行２６０２を決定し、そのため、非アーキテクチャプログラムによって書き込まれた有効な畳み込み結果を読み出し、アーキテクチャプログラムがその畳み込み結果を読み出した後に、次の５１２×１６００チャンクをその有効な畳み込み結果の上に書き込むことができる。それにより、ＮＮＵ１２１が、最初の５１２×１６００チャンクへの非アーキテクチャプログラムを完了すると、プロセッサ１００は直ちに、必要に応じて非アーキテクチャプログラムを更新し、そのプログラムを再度開始して、次の５１２×１６００チャンクを処理することができる。
【０２７２】
別の例として、アーキテクチャプログラムが、重みが重みＲＡＭ１２４に記憶され、結果がデータＲＡＭ１２２に書き戻される一続きの典型的なニューラルネットワーク積和活性化関数演算を、ＮＮＵ１２１に行わせていると仮定する。その場合、非アーキテクチャプログラムが重みＲＡＭ１２４のある行を読み出すと、そのプログラムはその行を再び読み出すことはない。そのため、アーキテクチャプログラムは、現在の重みが非アーキテクチャプログラムによって読み出される／使用されると、重みＲＡＭ１２４にある重みを、非アーキテクチャプログラムの次の実行インスタンスのための（例えば、次のニューラルネットワーク層に関する）新しい重みで上書きし始めるように構成することができる。その場合、アーキテクチャプログラムは、状態レジスタ１２７を読み出して、一番最近読み出された重みＲＡＭ行２６０４のアドレスを取得して、新しい重みのセットを重みＲＡＭ１２４内でどこに書き込めるかを決定する。
【０２７３】
別の例として、アーキテクチャプログラムが、非アーキテクチャプログラムの中に、図２０のアドレス２の非アーキテクチャ積和命令など、大きな反復回数を有する実行命令が含まれていることを知っていると仮定する。そのような場合、アーキテクチャプログラムは、その非アーキテクチャ命令を完了するのにあと約何回のクロックサイクルを要するかを知って、アーキテクチャプログラムが２つ以上の動作のどちらを行うかを決定できるようにするために、反復カウント３９１６を知る必要がある可能性がある。例えば、アーキテクチャプログラムは、その時間が長い場合は、オペレーティングシステムなどの別のアーキテクチャプログラムに制御を引き渡すことがある。同様に、アーキテクチャプログラムが、図２８の非アーキテクチャプログラムなど、非アーキテクチャプログラムの中に比較的大きいループ回数を持つループ本体が含まれることを知っていると仮定する。そのような場合、アーキテクチャプログラムは、その非アーキテクチャプログラムを完了するのにあと約何回のクロックサイクルを要するかを知って、アーキテクチャプログラムが２つ以上の動作のどちらを行うかを決定できるようにするために、ループカウント３９１４を知る必要がある可能性がある。
【０２７４】
別の例として、アーキテクチャプログラムＮＮＵ１２１が、プーリング対象のデータが重みＲＡＭ１２４に記憶され、結果が重みＲＡＭ１２４に書き戻される、図２７及び図２８に関連して説明したのと同様のプーリング演算をＮＮＵ１２１に行わせていると仮定する。ただし、図２７及び図２８の例とは異なり、結果が重みＲＡＭ１２４の先頭の４００行、例えば、行１６００から１９９９に書き戻されると仮定する。この場合、非アーキテクチャプログラムが、自身がプールする重みＲＡＭ１２４の４つの行を読み出すと、その非アーキテクチャプログラムはその行を再び読み出すことはない。そのため、アーキテクチャプログラムは、現在の４つの行が非アーキテクチャプログラムによって読み出される／使用されると、重みＲＡＭ１２４にあるデータを、新しいデータ（例えば、プーリングされたデータに典型的な積和活性化関数演算を行うための、例えば、非アーキテクチャプログラムの次の実行インスタンスのための重み）で上書きし始めるように構成することができる。その場合、アーキテクチャプログラムは、状態レジスタ１２７を読み出して、一番最近読み出された重みＲＡＭ行２６０４のアドレスを取得して、新しい重みのセットを重みＲＡＭ１２４内でどこに書き込めるかを決定する。
【０２７５】
ＮＮＵメモリ及びキャッシュメモリとしてのメモリアレイのデュアル使用
次に図４０を参照すると、プロセッサ４０００を図示するブロック図が示される。プロセッサ４０００は、双方向の方式で互いに接続された複数のリングストップ４００４を含んで、リングバス４０２４を形成している。図４０の実施形態は、６つのリングストップを含み、４００４−０、４００４−１、４００４−２、４００４−３、４００４−Ｍ、及び４００４−Ｕと表される。プロセッサ４０００は、４つのコア複合体（core  complexes）４０１２を含み、個々にコア複合体０  ４０１２−０、コア複合体１  ４０１２−１、コア複合体２  ４０１２−２、及びコア複合体３  ４０１２−３と呼ばれ、これらは、コア複合体４０１２をリングバス４０２４に結合する４つのリングストップ４００４−０、４００４−１、４００４−２、及び４００４−３をそれぞれ含む。プロセッサ４０００は、アンコア部分４０１６をさらに含み、アンコア部分４０１６は、アンコア４０１６をリングバス４０２４に結合するリングストップ４００４−Ｕを含む。最後、プロセッサ４００は、リングストップ４００４−Ｍによりリングバス４０２４に結合されたダイナミックランダムアクセスメモリ（ＤＲＡＭ）コントローラ４０１８及びＮＮＵ１２１を含む。ＮＮＵ１２１は、メモリアレイ４１５２を含み（図４１を参照）、メモリアレイ４１５２は、ＮＮＵ１２１のＮＰＵ１２６のアレイにより使用されるメモリ（例えば、図１の重みＲＡＭ１２４）としてか、又は、コア複合体４０１２により共有されるキャッシュメモリとして、例えばビクティムキャッシュ（victim  cache）若しくはラストレベルキャッシュ（ＬＬＣ）のスライスとしてかのいずれかで用いられることができ、このことは下記でより詳細に説明される。図４０の例は４つのコア複合体４０１２を含むが、異なる数のコア複合体４０１２を用いた他の実施形態が企図される。
【０２７６】
アンコア４０１６は、バスコントローラ４０１４を含み、バスコントローラ４０１４は、周辺デバイスが結合され得るシステムバス４０２２に対してのプロセッサ４０００によるアクセスを制御し、周辺デバイスは、例えば、ビデオコントローラ、ディスクコントローラ、ペリフェラルバスコントローラ（例えば、ＰＣＩ−Ｅ）等である。一実施形態では、システムバス４０２２は、良く知られるＶ４バスである。アンコア４０１６は、他の機能ユニット、例えば、電力管理ユニット及びプライベートＲＡＭ（例えば、コア４００２のマイクロコードにより使用される非アーキテクチャメモリ）などをさらに含んでもよい。
【０２７７】
ＤＲＡＭコントローラは、システムメモリであるＤＲＡＭ（例えば、非同期ＤＲＡＭ、又は同期ＤＲＡＭ（ＳＤＲＡＭ）、例えば、ダブルデータレート同期ＤＲＡＭ、ダイレクトＲａｍｂｕｓ  ＤＲＡＭ、又はレイテンシ低減ＤＲＡＭなど）を制御する。コア複合体４０１２、アンコア４０１６、及びＮＮＵ１２１が、リングバス４０２４を介してシステムメモリにアクセスする。より詳細には、ＮＮＵ１２１はリングバス４０２４を介して、ニューラルネットワーク重み及びデータをシステムメモリからメモリアレイ４１５２に読み出し、ニューラルネットワーク結果をメモリアレイ４１５２からシステムメモリに書き込む。さらに、ビクティムキャッシュとして動作するとき（図４１の４００６−４を参照）、メモリアレイ４１５２は、キャッシュ制御論理４１０８の制御下で（図４１を参照）、キャッシュラインをシステムメモリに追い出す（evicts）。さらに、ＬＬＣスライスとして動作するとき（図４１の４００６−４を参照）、メモリアレイ４１５２及びキャッシュ制御論理４１０８は、システムメモリからキャッシュラインをフィルし（fill）、キャッシュラインをシステムメモリに書き戻し、追い出す。
【０２７８】
４つのコア複合体４０１２は、それぞれのＬＬＣスライス４０１２−０、４０１２−１、４０１２−２、及び４０１２−３を含み、ＬＬＣスライスの各々がリングストップ４００４に結合され、ＬＬＣスライスは個々に総称的にＬＬＣスライス４００６と呼ばれ、集合的にＬＬＣスライス４００６と呼ばれる。各コア４００２は、キャッシュメモリ、例えば、リングストップ４００４に結合されたレベル２（Ｌ２）キャッシュ４００８などを含む。各コア４００２は、レベル１キャッシュ（図示せず）をさらに含んでもよい。一実施形態では、コア４００２はｘ８６命令セットアーキテクチャ（ＩＳＡ）コアであるが、コア４００２が別のＩＳＡのもの、例えば、ＡＲＭ、ＳＰＡＲＣ、ＭＩＰＳのものである他の実施形態が企図される。
【０２７９】
ＬＬＣスライス４００６−０、４００６−１、４００６−２、及び４００６−３は、図４０に示されるとおり、コア複合体４０１２により共有されるプロセッサ４０００のＬＬＣ４００５を集合的に形成する。各ＬＬＣスライス４００６は、図４１のメモリアレイ４１５２及びキャッシュ制御論理４１０８と同様のメモリアレイ及びキャッシュ制御論理を含む。ＮＮＵ１２１のメモリアレイ４１５２がＬＬＣ４００５の追加的な（例えば、第５の又は第９の）スライス４００６−４として動作するように、モードインディケータ（例えば、図４１のモード入力４１９９）が設定されることができ、このことは下記でより詳細に説明される。追加的なＬＬＣスライス４００６−４を選択的に作り上げるメモリアレイ４１５２（及び、図４１のキャッシュ制御論理４１０８）は、ＮＮＵ  ＬＬＣスライス４００６−４とさらに呼ばれる。一実施形態では、メモリアレイ４１５２及び各ＬＬＣスライス４００６は２ＭＢのメモリアレイからなるが、異なるサイズを用いた他の実施形態が企図される。さらに、メモリアレイ４１５２のサイズとＬＬＣスライス４００６のサイズとが異なる実施形態が企図される。好ましくは、ＬＬＣ４００５は、Ｌ２キャッシュ４００８と、キャッシュ階層内の任意の他のキャッシュ（例えば、Ｌ１キャッシュ）とについてインクルーシブで（inclusive  of）ある。
【０２８０】
リングバス４０２４、又はリング４０２４は、スケーラブルな双方向のインターコネクトであり、ＤＲＡＭコントローラ４０１８とアンコア４０１６とＬＬＣスライス４００６とを含むコヒーレントなコンポーネント間における通信を容易にする。リング４０２４は２つの単方向リングを含み、該リングの各々が５つのサブリング（sub-rings）をさらに含み、すなわち、ロードを含む大抵のタイプの要求パケットを移送するためのＲｅｑｕｅｓｔと、スヌープ要求パケットを移送するためのＳｎｏｏｐと、応答パケットを移送するためのＡｃｋｎｏｗｌｅｄｇｅと、データパケット及び書き込みを含む特定の要求アイテムを移送するためのＤａｔａと、リモートのキュー内のクレジットを放出し及び取得するためのＣｒｅｄｉｔである。リング４０２４に取り付けられる各ノードは、リングストップ４００４を介して接続され、リングストップ４００４は、リング４０２４上でパケットを送信し及び受信するためのキューを含む。キューは、リング４０２４上で、取り付けられたコンポーネントの代わりに、リモートのキュー内で受信されることになる要求を開始する出口キューか、又は、リング４０２４からの、取り付けられたコンポーネントに転送されることになる要求を受信する入口キューかのいずれかである。出口キューは、リング上で要求を開始する前、リモートの宛先入口キューからのＣｒｅｄｉｔリング上のクレジットを最初取得する。このことは、リモートの入口キューが要求の到着においてその要求を処理するのに利用可能なリソースを有することを確保する。出口キューは、リング４０２４上でトランザクションパケットを送りたいとき、リモートノードへ最終的に仕向けられた到来パケットに優先し（preempt）ない場合に限りそのようにすることができる。到来パケットがいずれかの方向からリングストップ４００４に到着するとき、そのパケットの宛先ＩＤが調査されて、このリングストップ４００４がパケットの最終的な宛先であるかを決定する。宛先ＩＤがリングストップ４００４のノードＩＤに等しくない場合、パケットは後のクロックにおいて次のリングストップ４００４に継続する。そうでない場合、パケットは同じクロック内でリング４０２４を去って、パケットのトランザクションタイプにより暗に示されるいずれかの入口キューによって消費されることになる。
【０２８１】
一般に、ＬＬＣ４００５はＮ個のＬＬＣスライス４００６を含み、Ｎ個のスライス４００６の各々は、ハッシングアルゴリズム、又はハッシュアルゴリズム、又は簡素にハッシュによって決定されるプロセッサ４０００の物理アドレス空間のうち区別可能な約１／Ｎをキャッシュすることについて責任を負う。ハッシュは、入力として物理アドレスをとり、この物理アドレスをキャッシュすることについて責任を負う適切なＬＬＣスライスを選択する関数である。コア４００２又はスヌーピングエージェントのいずれかから、ＬＬＣ４００５に対して要求が行われなければならないとき、この要求は、要求の物理アドレスをキャッシュすることについて責任を負う適切なＬＬＣスライス４００６に送られなければならない。適切なＬＬＣスライス４００６は、要求の物理アドレスにハッシュを適用することによって決定される。
【０２８２】
ハッシュアルゴリズムは全射的関数（surjective  function）であり、そのドメインは、物理アドレスのセット又はそのサブセットであり、その範囲は、現在含まれるＬＬＣスライス４００６の数である。より詳細には、範囲は、ＬＬＣスライス４００６の索引のセットであり、例えば、８個のＬＬＣスライス４００６の場合には０〜７である。上記関数は、物理アドレスビットの適切なサブセットを調べることによって計算されることができる。例えば、８個のＬＬＣスライス４００６を有するシステムにおいて、ハッシングアルゴリズムの出力は単純にＰＡ［１０：８］であってもよく、これは、物理アドレスビットのうちの３ビット、すなわちビット８〜１０である。ＬＬＣスライス４００６の数が８である別の実施形態において、ハッシュの出力は、他のアドレスビット、例えば、｛ＰＡ［１７］，ＰＡ［１４］，ＰＡ［１２］＾ＰＡ［１０］＾ＰＡ［９］｝として生成される３ビットの論理関数である。
【０２８３】
ＬＬＣ４００５のすべての要求元は、いかなるＬＬＣ４００５キャッシングも行われる前に、同じハッシュアルゴリズムを有さなければならない。ハッシュが、アドレスがどこにキャッシュされるかと動作中にスヌープがどこに送られることになるかとを指示するため、ハッシュは、すべてのコア４００２とＬＬＣスライス４００６とスヌーピングエージェントとの間における協調をとおしてのみ変更される。下記で図４２及び図４３を参照してより詳細に説明されるとおり、ハッシュアルゴリズムを更新することは本質的に下記を含む：（１）すべてのコア４００２を同期させて新しいキャッシュ可能アクセスを防止すること、（２）ＬＬＣ４００５に現在含まれるすべてのＬＬＣスライス４００６のライトバック無効化（write-back-invalidate）を行い、それにより、変更を加えられた（modified）キャッシュラインがシステムメモリに書き戻され、すべてのキャッシュラインが無効にされるようにすること（ライトバック無効化は、下記に説明される選択的なライトバック無効化であってもよく、その場合、新しいハッシュアルゴリズムが古いハッシュアルゴリズムとは異なるスライスに対してそのアドレスをハッシュすることになるキャッシュラインだけが追い出され、すなわち無効にされ、変更を加えられている場合は、無効にされる前に書き戻される）、（３）ハッシュ更新メッセージを各コア４００２及びスヌープソースにブロードキャストし、これにより、新しいハッシュに（下記で説明されるとおり、インクルーシブハッシュ（inclusive  hash）からエクスクルーシブハッシュ（exclusive  hash）へか、又はその逆かのいずれか）変更するように各コア４００２及びスヌープソースに命じること、（４）メモリアレイ４１５２に対するアクセスを制御する選択論理４１５８（図４１を参照）へのモード入力４１９９を更新すること、及び（５）新しいハッシュアルゴリズムで実行を再開すること。
【０２８４】
上記で説明されたハッシュアルゴリズムは、ＬＬＣスライス４００６の数Ｎが、２の累乗である８であるときに有用であり、上記アルゴリズムは、他の２の累乗に容易に対応するように変更を加えられることができ、例えば、４つのスライスについてＰＡ［９：８］、又は１６個のスライスについてＰＡ［１１：８］である。しかしながら、ＮＮＵ  ＬＬＣスライス４００６−４がＬＬＣ４００５に含まれるかどうか（及び、コア複合体４０１２の数）に依存して、Ｎは２の累乗である場合も又はそうでない場合もある。ゆえに、下記で図４２及び図４３を参照して説明されるとおり、ＬＬＣスライス４００６の数に依存して、少なくとも２つの異なるハッシュが使用される。すなわち、インクルーシブハッシュと呼ばれる第１のハッシュが、ＮＮＵ  ＬＬＣスライス４００６−４がＬＬＣ４００５に含まれるときに使用され、エクスクルーシブハッシュと呼ばれる第２のハッシュが、ＮＮＵ  ＬＬＣスライス４００６−４がＬＬＣ４００５から除外されるときに使用される。
【０２８５】
あるハッシュアルゴリズムは、ＰＡ［４５：６］  ｍｏｄ  Ｎを出力する。このハッシュは、Ｎの値が２の累乗でないときでさえ、（物理アドレスの比較的均一な分散を仮定して）Ｎ個のＬＬＣスライス４００６にわたり本質的に均衡のとれたやり方で物理アドレスを分散させる（distributing）という利点を有する。Ｎが２の累乗であるとき、上記ｍｏｄ演算は、ＰＡ［４５：６］の下位Ｎ−１ビットを単に出力することによって行うことができる。しかしながら、Ｎが２の累乗でないとき、このｍｏｄ演算は不利なことに整数除算を必要とする。
【０２８６】
ＰＡ  ｍｏｄ  Ｎのハッシュを近似し、しかし物理アドレスのより小さいサブセットのための別のハッシュが、Ｎが２の累乗でないときにハードウェア内により効率的に実装されることができ、Ｎ＝９の場合、
def  calc_hash(PA):
if  (PA[11:8]  ==  0xF)
return  8
else
return  PA[10:8]
として定義される。
【０２８７】
calc_hash()では、ハッシュに対してＰＡ［１１：８］が使用され、しかしＰＡ［１１：８］＞８の場合、ＰＡ［１０：８］が使用され、これは、範囲［０，７］内であることを保証される。観察できるように、calc_hash()は、（物理アドレスの比較的均一な分散を再度仮定して）ＰＡ［４５：６］  ｍｏｄ  Ｎよりも比較的あまり均衡のとれないやり方でＬＬＣスライス４００６間で物理アドレスを分散させ得る。すなわち、スライス０〜６は約８分の１の確率を有し、これに対し、スライス７及び８は、約１６分の１の確率を有する。しかしながら、ＰＡ［４５：６］  ｍｏｄ  Ｎのハッシュアルゴリズムでさえ、完全に均一に均衡のとれた分散を生成しないことが留意されるべきであり、なぜならば、ＰＡ［４５：６］は２の累乗である要素数を有するドメインを表現し、しかしＮは２の累乗でないからである。
【０２８８】
一般に、Ｎが２の累乗でないとき、ハッシュアルゴリズムは、２＾Ｐのとり得る結果の範囲に対して物理アドレスを最初ハッシュし、ここでＰ＝ｃｅｉｌｉｎｇ（ｌｏｇ２（Ｎ））であり、それから、Ｎより大きいか又は等しい最初のハッシュの結果（すなわち、既存のスライス４００６に対応しない結果）を、Ｎより小さい出力に（すなわち、既存のスライス４００６に）マッピングする。
【０２８９】
ハードウェアに比較的効率良く実装される別のハッシュアルゴリズムが、
def  calc_hash_2(PA):
if  (PA[13:11]  ==  0x7)
return  8
else
return  PA[10:8]
として定義される。
【０２９０】
Calc_hash_2()は、（物理アドレスの比較的均一な分散を再度仮定して）calc_hash()よりも比較的より均衡のとれたやり方でＬＬＣスライス４００６間で物理アドレスを分散させ得る。すなわち、スライス０〜７は約７／６４の確率を有し、これに対し、スライス８は約８／６４、すなわち１／８の確率を有する。他の実施形態において、calc_hash()及びcalc_hash_2()のアルゴリズムは、さらに多数の物理アドレスビットを使用することによってさらに比較的より均衡のとれたやり方で物理アドレスを分散させるように変更を加えられてもよい。
【０２９１】
上述のとおり、有利なことに実施形態は２つの異なるハッシュアルゴリズムを採用する。１つは、ＬＬＣスライス４００６としてメモリアレイ４１５２を除外し、１つは、ＬＬＣスライス４００６としてメモリアレイ４１５２を含む。例えば、コア複合体４０１２とその対応するＬＬＣスライス４００６との数が８であるプロセッサ４０００において、メモリアレイ４１５２を除外するハッシュがＰＡ［１０：８］であってもよく、メモリアレイ４１５２を含むハッシュが上述のcalc_hash_2(PA)であってもよく、このハッシュは９つの異なるスライスにマッピングする。一実施形態では、２つのハッシュアルゴリズムは、最適化として選択的である、すなわち、インクルーシブ及びエクスクルーシブハッシュアルゴリズムが異なるスライスに対してハッシュすることになるキャッシュラインのみ追い出す（すなわち、ライトバック無効にする（write-back-invalidates））ライトバック無効化をサポートするように有利に設計されることができる。いくつかの実施形態では、インクルーシブハッシュからエクスクルーシブハッシュへの移行において、上記のことは、ＮＮＵ  ＬＬＣスライス４００６−４のみがライトバック無効にされることを要し（すなわち、非ＮＮＵ  ＬＬＣスライス４００６は、ライトバック無効にされる必要がない）、エクスクルーシブハッシュからインクルーシブハッシュへの移行においては、インクルーシブ及びエクスクルーシブハッシュアルゴリズムが異なるスライスに対してそのアドレスをハッシュすることになる非ＮＮＵ  ＬＬＣスライス４００６のキャッシュラインのみが、追い出される必要がある。このことは下記で図４２及び図４３を参照してより詳細に説明される。エクスクルーシブハッシュがＰＡ［１０：８］又は同様のものであり、インクルーシブハッシュがcalc_hash_2又は同様のものである実施形態が、そのような一実施形態である。
【０２９２】
次に図４１を参照すると、より詳細な図４０のＮＮＵ１２１と図４０のリングストップ４００４−Ｍとを例示するブロック図が示される。図４１のＮＮＵ１２１は、多くの点で上述のＮＮＵ１２１の実施形態と同様であるが、キャッシュ制御論理４１０８、選択論理４１５８、及びメモリアレイ４１５２をさらに含み、これらは、ＮＮＵ１２１の重みＲＡＭ１２４又はデータＲＡＭ１２２によって含まれてもよい。図４１には図示されていないが、ＮＮＵ１２１は、図１のプログラムメモリ１２９、シーケンサ１２８、データＲＡＭ１２２、及び重みＲＡＭ１２４をさらに含む。ＮＮＵ１２１は、図４１に示されるとおり、図１のＮＰＵ１２６のアレイと制御／状態レジスタ１２７とをさらに含む。上記で例えば図３４を参照して説明されたとおり、アレイのＮＰＵ１２６の各々は、上記で詳細に説明されたとおり、命令及びデータを処理するステージのパイプラインを含む。ＮＰＵパイプライン１２６の第１のステージは、メモリアレイ４１５２に書き込まれることになるデータを選択論理４１５８に提供し、第２のステージは、メモリアレイ４１５２からデータを受け取る。一実施形態では、パイプライン１２６は１０個のステージを含み、第６のステージがメモリアレイ４１５２からデータを受け取り、第９のステージがメモリアレイ４１５２に書き込むためのデータを選択論理４１５８に提供する。
【０２９３】
メモリアレイ４１５２は、ＮＰＵアレイパイプライン１２６に結合される。選択論理４１５８は、メモリアレイ４１５２に入力を提供する。選択論理４１５８は、モードを指定するモード入力４１９９によって制御される。好ましくは、モード４１９９入力は、モード４１９９をキャッシュメモリモードからＮＮＵモードに変更するのに書き込まれる制御／状態レジスタ１２７内のビットの出力である。モードは、メモリアレイ４１５２がＮＮＵモード又はキャッシュメモリモードにおいて動作していることを示す。ＮＮＵモードにおいて動作するとき、メモリアレイ４１５２はＮＮＵ１２１の重みＲＡＭ１２４として動作する。（メモリアレイ４１５２が重みＡＭ１２４として機能するという参照が全体をとおして行われるが、別法として、メモリアレイ４１５２はデータＲＡＭ１２２として動作してもよい。）しかしながら、キャッシュメモリモードにおいて動作するとき、メモリアレイ４１５２はキャッシュメモリとして動作する。キャッシュメモリモードの２つの実施形態が説明される。メモリアレイ４１５２が、コア複合体４０１２により共有されるＬＬＣ４００５のスライス４００６として動作する第１の実施形態と、メモリアレイ４１５２が、コア複合体４０１２により共有されるビクティムキャッシュとして動作する第２の実施形態である。モード制御４１９９がＮＮＵモードを指示するとき、選択論理４１５８は、ＮＰＵアレイパイプライン１２６により提供されるデータを選択し、メモリアレイ４１５２は、ＮＰＵアレイパイプライン１２６にデータを書き込み、そのため、メモリアレイ４１５２はＮＮＵ１２１の重みＲＡＭ１２４として機能する。対照的に、モード制御４１９９がキャッシュメモリモードを指示するとき、選択論理４１５８は、キャッシュ制御論理４１０８のデータパイプライン４１４６により提供されるデータを選択し、メモリアレイ４１５２は、キャッシュ制御論理４１０８のデータパイプライン４１４６にデータを書き込む。こうして、メモリアレイ４１５２は、コア４００２により共有されるキャッシュメモリとして、例えば、ビクティムキャッシュ又はＬＬＣスライス４００６−４として機能する。好ましくは、２つのＲＡＭ１２２／１２４のうちより大きい方のメモリアレイが、キャッシュメモリモードにおいて使用される。さらに、重みＲＡＭ１２４とデータＲＡＭ１２２との双方のメモリアレイがコア４００２により共有されるキャッシュメモリとして採用される実施形態が企図される。
【０２９４】
好ましくは、データパイプライン４１４６からメモリアレイ４１５２にデータを提供するデータバスは、６４バイト幅（例えば、キャッシュラインのサイズ）であり、メモリアレイ４１５２からＮＰＵアレイパイプライン１２６にデータを提供するデータバスは、アレイのＮＰＵ１２６の数に等しいワードの数、例えば、１０２４ワードである。反対に、ＮＰＵアレイパイプライン１２６からメモリアレイ４１５２にデータを提供するデータバスは、アレイのＮＰＵ１２６の数に等しいワードの数である。好ましくは、選択論理４１５８とメモリアレイ４１５２との間のバスは、アドレスバス、データ書き込みバス、ＲＤ／ＷＲ制御、及び、（例えば、１０２４バイト幅のメモリアレイと６４バイトのキャッシュラインを仮定して）１６個のキャッシュラインのうちいずれのキャッシュラインがアクセスされているかを示すキャッシュラインイネーブル（cache  line  enables）（ＣＬＥ）を含む。ＮＰＵアレイパイプライン１２６からメモリアレイ４１５２への書き込みの場合、典型的にすべてのＣＬＥが真であることになり、なぜならば、典型的にすべてのＮＰＵ１２６が重みＲＡＭ１２４の行に書き込みをするからである。選択論理（図示せず）が、データがメモリアレイ４１５２に書き込まれているときにＣＬＥを使用して、メモリアレイ４１５２の正しい１つ又は複数のバンクを選択して、読み出し又は書き込みを可能にする。
【０２９５】
図４１の実施形態では、ＮＮＵモードにおいて動作するとき、好ましくは、コア４００２上で実行されるアーキテクチャプログラムは、ＮＮＵ１２１が例えば上記で図１〜図３５を参照して説明された実施形態などのコアの実行ユニットであるというよりも、ＮＮＵ１２１に周辺デバイスとしてリングバス４０２４を通じてアクセスする。好ましくは、図３５のインターフェース論理３５１４（図４１には図示せず）及び制御／状態レジスタ１２７がリングストップ４００４−Ｍに結合され、このことは、コア４００２がインターフェース論理３５１４を介して、（図１４及び図１５のＭＴＮＮ１４００及びＭＦＮＮ１５００命令ではなく）アーキテクチャのロード／記憶命令を使用して、制御／状態レジスタ１２７に読み出し及び書き込みをし、データＲＡＭ１２２、重みＲＡＭ１２４、及びプログラムメモリ１２９に読み出し及び書き込みをすることを可能にする。さらに、データ／重みワードが、ダイレクトメモリアクセス（ＤＭＡ）トランスファーを介してシステムメモリとデータＲＡＭ１２２／重みＲＡＭ１２４との間で伝達され（transferred）てもよい。最後、ＮＮＵ１２１自体がロード／記憶命令を実行してシステムメモリとデータＲＡＭ１２２／重みＲＡＭ１２４との間でデータ／重みを伝達する実施形態が企図される。好ましくは、オペレーティングシステムが、ＮＮＵ１２１を、異なるコア４００２上で稼働するシステムの様々なプロセスにより共有される大域的リソースとして管理し、オペレーティングシステムは、プロセスに、ＮＮＵ１２１を使用する前にＮＮＵ１２１の所有権を取得するように求める。好ましくは、オペレーティングシステムは、ＮＮＵ１２１が動作するモード４１９９を、より詳細にはメモリアレイ４１５２が機能する方法を制御する。このことは下記で図４２〜図４５を参照してより詳細に説明される。一実施形態では、メモリアレイ４１５２は２ＭＢのスタティックＲＡＭアレイであるが、そのサイズがより大きい又はより小さい他の実施形態が企図される。
【０２９６】
キャッシュ制御論理４１０８は、リングストップ４００４−Ｍに、及び、選択論理４１５８及びメモリアレイ４１５２に結合される。キャッシュ制御論理４１０８は、リングストップ４００４−Ｍに結合されたタグパイプライン４１４４と、リングストップ４００４−Ｍに結合されたデータパイプライン４１４６と、タグパイプライン４１４４に結合されたタグ／ＭＥＳＩ／ＬＲＵアレイ４１４２とを含む。キャッシュ制御論理４１０８は外部インターフェース４１４７をさらに含み、外部インターフェース４１４７は、フィルキュー４１２２と、スヌープキュー４１２４と、タグパイプライン４１４４及びデータパイプライン４１４６に対するアクセスについてフィルキュー４１２２及びスヌープキュー４１２４の間で調停するアービタ（arbiter）４１３６とを含む。キャッシュ制御論理４１０８はコアインターフェース４１４８をさらに含み、コアインターフェース４１４８は、ロードキュー４１１２と、追い出しキュー４１１４と、問い合わせキュー４１１６と、タグパイプライン４１３６及びデータパイプライン４１４６に対するアクセスについてロードキュー４１１２、追い出しキュー４１１４、及び問い合わせキュー４１１６の間で調停するアービタ４１３８とを含む。アービタ４１３２が、タグパイプライン４１４４に対するアクセスについて外部インターフェース４１４７とコアインターフェース４１４８との間で調停し、アービタ４１３４が、データパイプライン４１４６に対するアクセスについて外部インターフェース４１４７とコアインターフェース４１４８との間で調停する。一実施形態において、キャッシュ制御論理４１０８は、メモリアレイ４１５２のライトバック無効化動作を、そうするための要求に応答して、例えばコア４００２からのライトバック無効化要求に応答して行うステートマシンをさらに含む。さらに、ステートマシンは、メモリアレイ４１５２の無効化動作を、そうするための要求に応答して、例えばコア４００２からの無効化要求に応答して行う。無効化動作を行うために、ステートマシンは、メモリアレイ４１５２における各キャッシュラインのタグ／ＭＥＳＩアレイ４１４２内のステートを無効ステータスに更新し、メモリアレイ４１５２の各セットについてのＬＲＵアレイ４１４２内の置き換え情報をリセットする。
【０２９７】
タグパイプライン４１４４は、要求及びタグ更新をアービタ４１３２から受け取り、キャッシュラインステータス及び応答をリングストップ４００４−Ｍ並びに外部インターフェース４１４７及びコアインターフェース４１４８に提供する。データパイプライン４１４６は、要求及びデータをアービタ４１３４から受け取り、データを選択論理４１５８及びリングストップ４００４−Ｍに提供する。キャッシュメモリモードにあるとき、タグ／ＭＥＳＩアレイ４１４２は、メモリアレイ４１５２内に記憶されたキャッシュラインについてのタグ及びステータスを記憶する。好ましくは、メモリアレイ４１５２は、キャッシュメモリモードにあるときにセットアソシアティブメモリとして動作し、ＬＲＵアレイ４１４２は、選択されたセットのうちいずれのウェイ（way）を置き換えるかを決定するためのキャッシュライン置き換え情報を記憶する。
【０２９８】
フィルキュー４１２２は、メモリアレイ４１５２への新しい割り振り（リロード要求）とメモリアレイ４１５２からの追い出し（ビクティム要求）とを扱う。ビクティム要求の場合、フィルキュー４１２２は、タグパイプライン４１４４へのアクセスを要求して、もしある場合はいずれのキャッシュラインが追い出される必要があるかを決定し、データパイプライン４１４６へのアクセスを要求して、メモリアレイ４１５２から外へ変更を加えられたデータを読み出して、システムメモリに書き込む。リロード要求の場合、フィルキュー４１２２は、タグパイプライン４１４４へのアクセスを要求して、新たに割り振られたキャッシュラインのアドレスをタグアレイ４１４２に書き込み、ＭＥＳＩアレイ４１４２内に初期ＭＥＳＩステートを設定し、データパイプライン４１４６へのアクセスを要求して、新しいデータをメモリアレイ４１５２に書き込む。スヌープキュー４１２４は、システムバス４０２２に由来するスヌープを扱う。スヌープキュー４１２４は、タグパイプライン４１４４へのアクセスを要求して、スヌープ要求内で指定されるキャッシュラインのステータスを決定し、データパイプライン４１４６へのアクセスを要求して、存在する場合にメモリアレイ４１５２から外へ変更を加えられたデータを読み出して、スヌープ要求に応答する。ロードキュー４１１２は、ロードがすべての下位レベルキャッシュ（下記でより詳細に説明されるとおり、メモリアレイ４１５２及びキャッシュ制御論理４１０８がビクティムキャッシュ４００６−４として動作しているときのＬ３キャッシュ４００５を含む）においてミスするとき、コア４００２のＬ２キャッシュ４００８からの（及び、他のキャッシュ、例えば、Ｌ２キャッシュ４００８がＬ１データ及びＬ１命令についてインクルーシブでない実施形態におけるＬ１データ及びＬ１命令からの）ロードを扱う。ロードキュー４１１２は、タグパイプライン４１４４へのアクセスを要求して、指定されたキャッシュラインがメモリアレイ４１５２内に存在するかどうかを決定し、データパイプライン４１４６へのアクセスを要求して、メモリアレイ４１５２から外へ指定されたデータを読み出して、リングバス４０２４を介して要求しているコア４００２に書き込む。追い出しキュー４１１４は、コアのＬ２キャッシュ４００８からの追い出しを扱う。ビクティムキャッシュ５８０６−４として動作するとき、追い出しキュー４１１４は、タグパイプライン４１１４へのアクセスを要求して、下位レベルキャッシュメモリから追い出されるキャッシュラインのアドレスをタグアレイ４１４２に書き込み、ＭＥＳＩアレイ４１４２内に初期ＭＥＳＩステートを設定する。ＬＬＣ５８０５のスライスとして動作するとき、追い出しキュー４１１４は、追い出されるキャッシュラインが変更を加えられている場合、タグパイプライン４１４４へのアクセスを要求してＭＥＳＩアレイ４１４２内のＭＥＳＩステートを更新する。追い出しキュー４１４４は、さらに、データパイプライン４１４６へのアクセスを要求して、追い出されるキャッシュラインをメモリアレイ４１５２に書き込む。問い合わせキュー４１１６は、コアのＬ２キャッシュ４００８に対するスヌープを扱う。問い合わせキュー４１１６は、コア４００２がＭｏｄｉｆｉｅｄをスヌープに応答した後、タグパイプライン４１４４へのアクセスを要求してＭＥＳＩステートをＭｏｄｉｆｉｅｄに更新し、データパイプライン４１４６へのアクセスを要求して、スヌープ応答からの変更を加えられたキャッシュラインをメモリアレイ４１５２に書き込む。一実施形態では、キャッシュ制御論理４１０８は、コア４００２ごとにコアインターフェース４１４８を含む。一実施形態では、各コアインターフェース４１４８が、ロード、追い出し、及びスヌープをそれぞれ扱う別個のデータ／命令ロードキュー４１１２、追い出しキュー４１１４、及び問い合わせキュー４１１６を、コア４００２の別個のデータ／命令キャッシュと共に含む。
【０２９９】
次に図４２を参照すると、図４１のメモリアレイ４１５２がＬＬＣスライス４００６として使用されるときのキャッシュメモリモードからＮＮＵ１２１の重み／データＲＡＭ１２４／１２２として使用されるときのＮＮＵモードに移行される場合の図４０のプロセッサ４０００の動作を例示する一フローチャートが示される。上記で説明されたとおり、ＮＮＵ１２１は大量のメモリを有し、例えば、重みＲＡＭ１２４は一実施形態において２ＭＢである。図４２及び図４３は、メモリアレイ４１５２が追加的なＬＬＣスライス４００６として動作することを可能にする一実施形態を説明し、ゆえに有利なことに、システム上で稼働するプロセスのいずれによってもＮＮＵ１２１がニューラルネットワークユニットとして使用されていないとき、ＬＬＣ４００５のサイズを大幅に（例えば、２５％まで）増加させることができる。より詳細には、図４２は、メモリアレイ４１５２をＬＬＣスライス４００６として動作するものからＮＮＵ１２１の重みＲＡＭ１２４として動作するものに移行する方法を説明する。有利なことに、図４１のキャッシュ制御論理４１０８並びにメモリアレイ４１５２及び選択論理４１５８は、モード４１９９がキャッシュメモリモードに設定されるとき、図４２及び図４３の実施形態においてＬＬＣスライス４００６として集合的に動作する。フローはブロック４２０２で始まる。
【０３００】
ブロック４２０２において、メモリアレイ４１５２をＬＬＣ４００５のスライス４００６として使用することからメモリアレイ４１５２をＮＮＵ１２１の重みＲＡＭ１２４として使用することへ移行するための要求が行われる。好ましくは、移行は、プロセッサ４０００上で稼働するオペレーティングシステムによって制御される。例えば、プロセッサ４０００上で稼働するアプリケーションプログラムが、ＮＮＵ１２１を使用することをオペレーティングシステムに要求し、オペレーティングシステムは、メモリアレイ４１５２がＬＬＣスライス４００６として現在使用されていることを検出し、ゆえに、キャッシュメモリモードからＮＮＵモードへの移行を必要とする。フローはブロック４２０４に進む。
【０３０１】
ブロック４２０４において、ブロック４２０２における移行要求に応答して、オペレーティングシステムは、すべてのコア４２０２に、それらコア自身を同期させるようにする。すなわち、オペレーティングシステムは、コア４００２に、アーキテクチャ命令を取り出すことを停止させ、メモリにアクセスすることを停止させる。より詳細には、上記のことは、ＬＬＣ４００５に対するアクセスを一時停止し、ＬＬＣ４００５は現在、メモリアレイ４１５２を含んでいる。一実施形態において、オペレーティングシステムは、各コア４００２上で、コア４００２に同期するように命令するアーキテクチャ命令（例えば、ｘ８６ＷＲＭＳＲ）を実行する。代替的な一実施形態において、オペレーティングシステムは、コア４００２のうち１つにおいて命令を実行し、応答において、上記１つのコア４００２が、例えばマイクロコードを介して、他のコア４００２の各々に信号伝達して同期させる。フローはブロック４２０６に進む。
【０３０２】
ブロック４２０６において、ライトバック無効化がＬＬＣ４００５上で行われる。一実施形態において、コア４００２のマイクロコードが、好ましくはオペレーティングシステムのアーキテクチャ命令の実行に応答して、ライトバック無効化を要求する。ライトバック無効化は、（もしあれば）変更を加えられたキャッシュラインを書き戻し、ＮＮＵ  ＬＬＣスライス４００６−４を含むすべてのＬＬＣスライス４００６のすべてのキャッシュラインを無効にする。代替的な一実施形態において、ライトバック無効化は選択的である。一般に、選択的なライトバック無効化は、下記の疑似コードに従って動作することを意味する：
for  each  slice:  //  ０〜Ｎ−１、ここでＮは現在のスライス数である（ＮＮＵスライスを含む）
for  each  cacheline  in  slice:
if  exclusive_hash(cacheline  address)  !=  slice:
evict  cacheline
当然ながら、スライスがＮＮＵスライスであるとき（例えば、８つの非ＮＮＵスライス４００６プラス１つのＮＮＵ  ＬＬＣスライス４００６−４の場合における、スライス＝８）、exclusive_hash(cacheline  address)は、スライスに等しくないことになる。これは、エクスクルーシブハッシュがＮＮＵ  ＬＬＣスライス４００６−４の索引を返さないからであり、ゆえに、ＮＮＵ  ＬＬＣスライス４００６−４内のすべてのキャッシュラインが追い出され、すなわち、変更を加えられている場合は書き戻され、それから、無効化される。採用されるインクルーシブハッシュ及びエクスクルーシブハッシュに依存して、非ＮＮＵ  ＬＬＣスライス４００６からの追い出しを必要とするキャッシュラインの数は変動する。例えば、エクスクルーシブハッシュ及びインクルーシブハッシュが双方、ＰＡ［４５：６］％Ｎであると仮定し、ただし、Ｎは各々について異なり、すなわちＮはインクルーシブハッシュについてよりもエクスクルーシブハッシュについての方が１少なく、Ｎがインクルーシブハッシュについて９、及びエクスクルーシブハッシュについて８であると仮定する。この場合、非ＮＮＵ  ＬＬＣスライス４００６内のキャッシュラインのうち大幅に大きい部分が追い出しを必要とし、例えば、約８８％である。この場合、すべてのＬＬＣスライス４００６のすべてのキャッシュラインを単にライトバック無効にすることと同様の効率であるか、又はその方がより効率的であり得る。対照的に、別の例として、エクスクルーシブハッシュがＰＡ［１０：８］であり、インクルーシブハッシュが上記で説明されたcalc_hash_2であると仮定する。この場合、非ＮＮＵ  ＬＬＣスライス４００６内のキャッシュラインのうちいずれも、インクルーシブハッシュからエクスクルーシブハッシュへの移行において追い出しを必要とせず、これは図４２において行われる移行である。フローはブロック４２０８に進む。
【０３０３】
ブロック４２０８において、キャッシュラインの物理アドレスをＬＬＣスライス４００６にハッシュするのに使用されるハッシングアルゴリズムが、上記で説明されたとおり、ＬＬＣスライス４００５のスライス４００６としてメモリアレイ４１５２を除外するように更新される。好ましくは、ハッシュ更新メッセージが各コア４００２及びスヌープソースに対してブロードキャストされて、そのハッシュアルゴリズムをエクスクルーシブハッシュに、すなわち、ＮＮＵ  ＬＬＣスライス４００６−４を除外するハッシュに変更させる。フローはブロック４２１２に進む。
【０３０４】
ブロック４２１２において、モード４１９９が、ＮＮＵモードを指示するように更新されて、選択論理４１５８に、メモリアレイ４１５２を重みＲＡＭ１２４としての使用に利用可能にするようにさせ、メモリアレイ４１５２は、ＮＰＵ１２６のパイプライン１２４とコア４００２上で実行されるアーキテクチャプログラムとによってアクセスされることになる。一実施形態において、オペレーティングシステム（例えば、デバイスドライバ）は、コア４００２のうち１つにおいてＮＮＵ１２１の制御／状態レジスタ１２７に書き込みをするアーキテクチャ命令を実行して、モード４１９９を制御するビットを更新して、モード４１９９をキャッシュメモリモードからＮＮＵモードに変更する。アーキテクチャ命令は、制御／状態レジスタ１２７に対してメモリマップドＩ／Ｏ書き込みを行う、Ｉ／Ｏ空間への書き込み又はメモリストア命令であり得る。フローはブロック４２１４に進む。
【０３０５】
ブロック４２１４において、コア４００２が動作を再開する。すなわち、コア４００２はもはや同期させられず、代わって、アーキテクチャ命令の取り出し及び実行を開始し、このことは、メモリにアクセスすることを含み得る。一実施形態において、オペレーティングシステムは、各コア４００２上で、動作を再開するようにコア４００２に命令するアーキテクチャ命令を実行する。代替的な一実施形態において、オペレーティングシステムは、コア４００２のうち１つにおいて命令を実行し、応答において、上記１つのコア４００２が、例えばマイクロコードを介して、他のコア４００２の各々に信号伝達して動作を再開させる。フローはブロック４２１４において終了する。
【０３０６】
次に図４３を参照すると、図４１のメモリアレイ４１５２がＮＮＵ１２１の重み／データＲＡＭ１２４／１２２として使用されるときのＮＮＵモードからＬＬＣスライス４００６として使用されるときのキャッシュメモリモードに移行される場合の図４０のプロセッサ４０００の動作を例示する一フローチャートが示される。フローはブロック４３０２において始まる。
【０３０７】
ブロック４３０２において、メモリアレイ４１５２をＮＮＵ１２１の重みＲＡＭ１２４として使用することからメモリアレイ４１５２をＬＬＣ４００５のスライス４００６として使用することへ移行するための要求が行われる。好ましくは、移行は、プロセッサ４０００上で稼働するオペレーティングシステムによって制御される。例えば、プロセッサ４０００上で稼働するアプリケーションプログラムが、オペレーティングシステムに、ＮＮＵ１２１をもはや使用していないことを知らせ、オペレーティングシステムは、メモリアレイ４１５２が重みＲＡＭ１２４として現在使用されていることを検出し、ゆえに、ＮＮＵモードからキャッシュメモリモードへの移行を必要とする。フローはブロック４３０４に進む。
【０３０８】
ブロック４３０４において、ブロック４３０２における移行要求に応答して、オペレーティングシステムは、ブロック４２０４に関して説明されたように、すべてのコア４２０２に、それらコア自身を同期させるようにする。より詳細には、上記のことは、ＬＬＣ４００５に対するアクセスを一時停止し、ＬＬＣ４００５は現在、メモリアレイ４１５２を除外している。フローはブロック４３０６に進む。
【０３０９】
ブロック４３０６において、ライトバック無効化がＬＬＣ４００５上で行われる。ライトバック無効化は、（もしあれば）変更を加えられたキャッシュラインを書き戻し、すべてのＬＬＣスライス４００６（ＮＮＵ  ＬＬＣスライス４００６−４を除く。なぜならば、それはＬＬＣ４００５に現在含まれていないため）のすべてのキャッシュラインを無効にする。代替的な一実施形態において、ライトバック無効化は選択的である。一般に、選択的なライトバック無効化は、下記の疑似コードに従って動作することを意味する：
for  each  slice:  //  ０〜Ｎ−１、ここでＮは現在のスライス数である（ＮＮＵスライスを除く）
for  each  cacheline  in  slice:
if  inclusive_hash(cacheline  address)  !=  slice:
evict  cacheline
【０３１０】
図４３のエクスクルーシブハッシュからインクルーシブハッシュへの移行において、スライスはＮＮＵスライスでなく、ゆえに、ＮＮＵ  ＬＬＣスライス４００６−４内のキャッシュラインは追い出されないことになる。採用されるインクルーシブハッシュ及びエクスクルーシブハッシュに依存して、非ＮＮＵ  ＬＬＣスライス４００６からの追い出しを必要とするキャッシュラインの数は変動する。例えば、エクスクルーシブハッシュ及びインクルーシブハッシュが双方、ＰＡ［４５：６］％Ｎであると仮定し、ただし、Ｎは各々について異なり、すなわちＮはインクルーシブハッシュについてよりもエクスクルーシブハッシュについての方が１少なく、Ｎがインクルーシブハッシュについて９、及びエクスクルーシブハッシュについて８であると仮定する。この場合、非ＮＮＵ  ＬＬＣスライス４００６内のキャッシュラインのうち大幅に大きい部分が追い出しを必要とし、例えば、約８８％である。この場合、すべてのＬＬＣスライス４００６のすべてのキャッシュラインを単にライトバック無効にすることと同様の効率であるか、又はその方がより効率的であり得る。対照的に、別の例として、エクスクルーシブハッシュがＰＡ［１０：８］であり、インクルーシブハッシュが上記で説明されたcalc_hash_2であると仮定する。この場合、非ＮＮＵ  ＬＬＣスライス４００６内のキャッシュラインのうち比較的小さい部分が追い出しを必要とし、例えば、約１２％である。フローはブロック４３０８に進む。
【０３１１】
ブロック４３０８において、キャッシュラインの物理アドレスをＬＬＣスライス４００６にハッシュするのに使用されるハッシングアルゴリズムが、上記で説明されたとおり、ＬＬＣスライス４００５のスライス４００６としてメモリアレイ４１５２を含めるように更新される。すなわち、ハッシュ更新メッセージが各コア４００２及びスヌープソースに対してブロードキャストされて、そのハッシュアルゴリズムをインクルーシブハッシュに、すなわち、ＮＮＵ  ＬＬＣスライス４００６−４を含むハッシュに変更させる。フローはブロック４３１１に進む。
【０３１２】
ブロック４３１１において、キャッシュ制御論理４１０８は、上記で説明されたとおり、ＭＥＳＩアレイ４１４２内のステータスをすべてのキャッシュラインについてＩｎｖａｌｉｄに更新することによって、メモリアレイ４１５２に対する無効化動作を行う。好ましくは、キャッシュ制御論理４１０８は、ＬＲＵアレイ４１４２内の置き換え情報をさらにリセットする。一実施形態において、コア４００２のマイクロコードが、無効化要求を行うようにＮＮＵ  ＬＬＣスライス４００６−４に要求し、応答的にキャッシュ制御論理４１０８がそれを行う。フローはブロック４３１２に進む。
【０３１３】
ブロック４３１２において、モード４１９９が、キャッシュメモリモードを指示するように更新されて、選択論理４１５８に、メモリアレイ４１５２をＬＬＣスライス４００６としての使用に利用可能にするようにさせる。フローはブロック４３１４に進む。
【０３１４】
ブロック４３１４において、コア４００２が動作を再開する。すなわち、ブロック４２１４に関して説明されたように、コア４００２はもはや同期させられず、代わって、アーキテクチャ命令の取り出し及び実行を開始し、このことは、メモリにアクセスすることを含み得る。フローはブロック４３１４において終了する。
【０３１５】
次に図４４を参照すると、図４１のメモリアレイ４１５２がＮＮＵ１２１の重み／データＲＡＭ１２４／１２２として使用されるときのＮＮＵモードからビクティムキャッシュ４００６−４として使用されるときのキャッシュメモリモードに移行される場合の図４０のプロセッサ４０００の動作を例示する一フローチャートが示される。ビクティムキャッシュは、プロセッサ４０００のキャッシュ階層内でより下位のキャッシュメモリによって追い出されたキャッシュラインのみ保持するキャッシュメモリである。例えば、Ｌ２キャッシュ４００８、及び／又はＬ１データ／命令キャッシュが、より下位のレベルのキャッシュである。さらに、メモリアレイ４１５２がビクティムキャッシュ４００６−４として動作し得る実施形態において、ＬＬＣ４００５は、レベル３（Ｌ３）キャッシュと考えられ、ビクティムキャッシュ４００６−４に対してより下位のレベルのキャッシュと考えられ、Ｌ３キャッシュ４００５は、ビクティムキャッシュ４００６−４にキャッシュラインを追い出す。ビクティムキャッシュは、例えばロード要求又はスヌープ要求に応答して、アドレスがビクティムキャッシュ内でヒットするとき、データを提供する。一実施形態において、Ｌ３キャッシュ４００５は、コア複合体４０１２のＬ２キャッシュ４００８と下位レベルキャッシュとについてインクルーシブであり、ビクティムキャッシュは、ヒットしたデータをＬ３キャッシュ４００５に割り振るように提供し、ひいてはＬ３キャッシュ４００５が、データをＬ２キャッシュ４００８に提供し、ひいてはＬ２キャッシュ４００８が、データをその下位のレベルのキャッシュに提供する。別の実施形態において、コア複合体４０１２のＬ３キャッシュ４００５、Ｌ２キャッシュ４００８、及び下位レベルキャッシュは、インクルーシブでなく、ビクティムキャッシュは、ヒットしたデータを、キャッシュの各レベルに直接割り振るように提供する。有利なことに、図４１のキャッシュ制御論理４１０８並びにメモリアレイ４１５２及び選択論理４１５８は、モード４１９９がＮＮＵモードに設定されるとき、図４４及び図４５の実施形態においてビクティムキャッシュ４００６−４として集合的に動作する。一実施形態において、ビクティムキャッシュ４００６−４は、ライトバックキャッシュとして動作することができ、該ビクティムキャッシュ４００６−４へ追い出された、変更を加えられたキャッシュラインをキャッシュする。さらに、ビクティムキャッシュ４００６−４は、ライトスルーキャッシュとして動作することができ、該ビクティムキャッシュ４００６−４へ追い出された、変更を加えられたキャッシュラインをキャッシュすることはしないが、代わって、変更を加えられたキャッシュラインをシステムメモリに転送する（forwards）。ライトスルービクティムキャッシュ４００６−４は、図４５（より詳細には、ブロック４５０６、４５０８、及び４５１２）の説明から観察できるとおり、ＮＮＵモードにおいて重みＲＡＭ１２４としてメモリアレイ４１５２を使用することへのより速い移行という利点を有する。これに対し、ライトバックビクティムキャッシュ４００６−４は、プロセッサ４０００についてのより大きい全体キャッ���ュ効率という利点を有し得る。好ましくは、ビクティムキャッシュ４００６−４は、ライトバックモード又はライトスルーモードのいずれかで構成可能である。フローはブロック４４０２において始まる。
【０３１６】
ブロック４４０２において、メモリアレイ４１５２をＮＮＵ１２１の重みＲＡＭ１２４として使用することからメモリアレイ４１５２をコア複合体４０１２により共有されるビクティムキャッシュ４００６−４として使用することへ移行するための要求が行われる。好ましくは、移行は、上記でブロック４３０２に関して説明されたように、プロセッサ４０００上で稼働するオペレーティングシステムによって制御される。フローはブロック４４０４に進む。
【０３１７】
ブロック４４０４において、モード４１９９が、キャッシュメモリモードを指示するように更新されて、選択論理４１５８に、メモリアレイ４１５２をビクティムキャッシュ４００６−４としての使用に利用可能にするようにさせる。フローはブロック４４０６に進む。
【０３１８】
ブロック４４０６において、バスコントローラ４０１４が、スヌープをビクティムキャッシュ４００６−４に向けることを開始するように命じられ、下位レベルキャッシュが、ロード要求及び追い出し要求をビクティムキャッシュ４００６−４に向けることを開始するように命じられる。フローはブロック４４０８に進む。
【０３１９】
ブロック４４０８において、ビクティムキャッシュ４００６−４は、ビクティムデータをキャッシュすることを開始する。図４１の実施形態において、追い出しキュー４１１４が、要求、例えばキャストアウト（castouts）を受け取って、下位レベルキャッシュ、例えば、Ｌ３キャッシュ４００５、Ｌ２キャッシュ４００８、及び／又はＬ１Ｄ／Ｌ１Ｉキャッシュから、キャッシュラインを追い出す。応答において、ビクティムキャッシュ４００６−４は、追い出されたキャッシュラインをメモリアレイ４１５２に割り振る。フローはブロック４４１２に進む。
【０３２０】
ブロック４４１２において、ビクティムキャッシュ４００６−４は、要求を受け取ってデータにアクセスし、要求のアドレスがビクティムキャッシュ４００６−４内でヒットする場合、データと共に応答する。図４１の実施形態において、スヌープキュー４１２４及びロードキュー４１１２が要求を受け取る。より詳細には、ビクティムキャッシュ４００６−４がスヌープされて、別のキャッシングエージェントが読み出しているキャッシュラインをライトバック無効にする。さらに、ビクティムキャッシュ４００６−４は、下位レベルキャッシュ内でミスするロードについて、下位レベルキャッシュからロード要求を受け取る。要求がビクティムキャッシュ４００６−４内でヒットする場合、ビクティムキャッシュ４００６−４はヒットしたデータを要求元に提供する。フローはブロック４４１２において終了する。
【０３２１】
次に図４５を参照すると、図４１のメモリアレイ４１５２がビクティムキャッシュ４００６−４として使用されるときのキャッシュメモリモードからＮＮＵ１２１の重み／データＲＡＭ１２４／１２２として使用されるときのＮＮＵモードに移行される場合の図４０のプロセッサ４０００の動作を例示する一フローチャートが示される。上述されたとおり、ビクティムキャッシュ４００６−４は、ライトスルータイプキャッシュとしてか又はライトバックタイプキャッシュとして動作することができる。フローはブロック４５０２において始まる。
【０３２２】
ブロック４５０２において、メモリアレイ４１５２をビクティムキャッシュ４００６−４として使用することからメモリアレイ４１５２をＮＮＵ１２１の重みＲＡＭ１２４として使用することに移行するための要求が行われる。好ましくは、移行は、プロセッサ４０００上で稼働するオペレーティングシステムによって制御される。例えば、プロセッサ４０００上で稼働するアプリケーションプログラムが、ＮＮＵ１２１を使用することをオペレーティングシステムに要求し、オペレーティングシステムは、メモリアレイ４１５２がビクティムキャッシュ４００６−４として現在使用されていることを検出し、ゆえに、キャッシュメモリモードからＮＮＵモードへの移行を必要とする。フローはブロック４５０４に進む。
【０３２３】
ブロック４５０４において、バスコントローラ４０１４が、スヌープをビクティムキャッシュ４００６−４に向けることを停止するように命じられる。フローは判定ブロック４５０６に進む。
【０３２４】
判定ブロック４５０６において、ビクティムキャッシュ４００６−４がライトスルータイプキャッシュとして動作している場合、フローはブロック４５１２に進み、そうでない場合、フローはブロック４５０８に進む。
【０３２５】
ブロック４５０８において、キャッシュ制御論理４１０８は、ビクティムキャッシュ４００６−４に対してライトバック無効化を行う。すなわち、ビクティムキャッシュ４００６−４が、その変更を加えられたキャッシュラインをすべてシステムメモリに書き戻し、それから、そのキャッシュラインをすべて無効にする（すべてのキャッシュラインについて、ＭＥＳＩアレイ４１４２内のステータスをＩｎｖａｌｉｄに更新することによる。好ましくは、キャッシュ制御論理４１０８は、ＬＲＵアレイ４１４２内の置き換え情報をさらにリセットする。）。好ましくは、キャッシュ制御論理４１０８は、ライトバック無効化を行う間、ロード要求及びスヌープ要求に応答し続ける。フローはブロック４５１４に進む。
【０３２６】
ブロック４５１２において、キャッシュ制御論理４１０８は、メモリアレイ４１５２に対して無効化動作を行う。すなわち、キャッシュ制御論理４１０８は、メモリアレイ４１５２のすべてのキャッシュラインを無効にする。観察できるように、ビクティムキャッシュ４００６−４がライトスルータイプキャッシュとして動作している場合、メモリアレイ４１５２を重みＲＡＭ１２４として使用することへの移行は、有利なことに、ビクティムキャッシュ４００６−４がライトバックタイプキャッシュとして動作していたときよりもより速い可能性があり、なぜならば、ブロック４５０８におけるＭｏｄｉｆｉｅｄキャッシュラインのライトバックが、行われる必要がないからである（すなわち、ここのブロック４５１２における無効化のみが行われる必要がある）。このことは、ビクティムキャッシュ４００６−４が比較的大きいとき、実質的な節減であり得る。フローはブロック４５１４に進む。
【０３２７】
ブロック４５１４において、下位レベルキャッシュは、ロード要求をビクティムキャッシュ４００６−４に向けることを停止するように命じられ、バスコントローラ４０１４は、スヌープをビクティムキャッシュ４００６−４に向けることを停止するように命じられる。フローはブロック４５１６に進む。
【０３２８】
ブロック４５１６において、ブロック４２１２に関して説明されたように、モード４１９９が、ＮＮＵモードを指示するように更新されて、選択論理４１５８に、メモリアレイ４１５２を重みＲＡＭ１２４としての使用に利用可能にするようにさせ、メモリアレイ４１５２は、ＮＰＵ１２６のパイプライン１２４とコア４００２上で実行されるアーキテクチャプログラムとによってアクセスされることになる。フローはブロック４５１８に進む。
【０３２９】
ブロック４５１８において、キャッシュ制御論理４１０８は、ビクティムデータをキャッシュすることを停止する（このことは、キャッシュ制御論理４１０８がブロック４４０８において行い始めた）。さらに、キャッシュ制御論理４１０８は、自身が受け取るいかなる後のロード、追い出し、又はスヌープ要求も、バスコントローラ４０１４に転送する。最後、コア４００２上で実行されるアーキテクチャプログラムが、ＮＰＵ１２６のパイプライン１２４によりアクセスされる重みＲＡＭ１２４として使用することができる。フローはブロック４５１８において終了する。
【０３３０】
本発明の様々な実施形態を本明細書に記載したが、それらは例として提示されたものであり、制限ではない。関連するコンピュータ技術の当業者には、本発明の範囲から逸脱することなく、本発明の形態及び詳細に様々な変更をなすことが可能であることが明らかであろう。例えば、ソフトウェアが、例えば、本明細書に記載される装置及び方法の機能、製造、モデリング、シミュレーション、記述、及び／又は試験を可能にすることができる。これは、一般的なプログラミング言語（例えば、Ｃ、Ｃ＋＋）、Ｖｅｒｉｌｏｇ  ＨＤＬ、ＶＨＤＬなどを含むハードウェア記述言語（ＨＤＬ）、又は他の利用可能なプログラムの使用を通じて達成することができる。そのようなソフトウェアは、磁気テープ、半導体、磁気ディスク、若しくは光学ディスク（例えば、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ等）、ネットワーク、有線、又は他の通信媒体など、任意の知られているコンピュータ使用可能媒体の中に配置することができる。本明細書に記載される装置及び方法の実施形態は、プロセッサコア（例えば、ＨＤＬで具現化又は規定された）などの半導体の知的財産権コアに含めて、集積回路の作製時にハードウェアに変容させることができる。加えて、本明細書に記載される装置及び方法は、ハードウェアとソフトウェアの組み合わせとして具現化することができる。したがって、本発明は、本明細書に記載される例示的実施形態のいずれによっても制限されるべきではなく、下記の特許請求の範囲とその均等物のみに従って定義されるべきである。具体的には、本発明は、汎用コンピュータで使用されることが可能なプロセッサデバイス中に実装することができる。最後に、当業者は、開示される概念と特定の実施形態を、添付の特許請求の範囲によって定義される本発明の範囲から逸脱することなく、本発明と同じ目的を遂行するための他の構造を設計するための、又はそれに変更を加えるための基礎として容易に使用できることを認識されよう。
【図１】
2018092561.tif 000010
【図２】
2018092561.tif 000011
【図３】
2018092561.tif 000012
【図４】
2018092561.tif 000013
【図５】
2018092561.tif 000014
【図６Ａ】
2018092561.tif 000015
【図６Ｂ】
2018092561.tif 000016
【図７】
2018092561.tif 000017
【図８】
2018092561.tif 000018
【図９】
2018092561.tif 000019
【図１０】
2018092561.tif 000020
【図１１】
2018092561.tif 000021
【図１２】
2018092561.tif 000022
【図１３】
2018092561.tif 000023
【図１４】
2018092561.tif 000024
【図１５】
2018092561.tif 000025
【図１６】
2018092561.tif 000026
【図１７】
2018092561.tif 000027
【図１８】
2018092561.tif 000028
【図１９】
2018092561.tif 000029
【図２０】
2018092561.tif 000030
【図２１】
2018092561.tif 000031
【図２２】
2018092561.tif 000032
【図２３】
2018092561.tif 000033
【図２４】
2018092561.tif 000034
【図２５】
2018092561.tif 000035
【図２６Ａ】
2018092561.tif 000036
【図２６Ｂ】
2018092561.tif 000037
【図２７】
2018092561.tif 000038
【図２８】
2018092561.tif 000039
【図２９Ａ】
2018092561.tif 000040
【図２９Ｂ】
2018092561.tif 000041
【図２９Ｃ】
2018092561.tif 000042
【図３０】
2018092561.tif 000043
【図３１】
2018092561.tif 000044
【図３２】
2018092561.tif 000045
【図３３】
2018092561.tif 000046
【図３４】
2018092561.tif 000047
【図３５】
2018092561.tif 000048
【図３６Ａ】
2018092561.tif 000049
【図３６Ｂ】
2018092561.tif 000050
【図３７】
2018092561.tif 000051
【図３８】
2018092561.tif 000052
【図３９】
2018092561.tif 000053
【図４０】
2018092561.tif 000054
【図４１】
2018092561.tif 000055
【図４２】
2018092561.tif 000056
【図４３】
2018092561.tif 000057
【図４４】
2018092561.tif 000058
【図４５】
2018092561.tif 000059
【外国語明細書】
2018092561000001.pdf