(57)【要約】      （修正有）【課題】入力にフィルタを畳み込んで出力を生成するニューラルネットワークユニットを提供する。【解決手段】ニューラルネットワークユニットが、Ｈ×Ｗ×Ｃ入力にＦ個のＲ×Ｓ×Ｃフィルタを畳み込んで、Ｆ個のＱ×Ｐ出力を生成する。Ｎ個の処理ユニット（ＰＵ）が各々、メモリワードを受け取るレジスタと、メモリワード又は隣接ＰＵ多重化レジスタから循環されたワードを選択的に受け取る多重化レジスタとを有する。Ｎ個のＰＵは、各々がＢ個のＰＵの、Ｇ個のブロックとして論理的に区分され、列‐チャネル‐行の順序で畳み込みをする。各フィルタ列について、Ｎ個のレジスタがメモリ行を読み出し、各ＰＵがレジスタと多重化レジスタとを乗算して積を生成して累算し、多重化レジスタは１だけ循環される。多重化レジスタは、入力ブロックを隣接ＰＵブロックに位置合わせするように循環される。上記のことを各チャネルについて実行される。【選択図】図２
2018092560.tif 000002
【特許請求の範囲】
【請求項１】
Ｈ行×Ｗ列×Ｃチャネルの入力に、各々がＲ行×Ｓ列×ＣチャネルのＦ個のフィルタを畳み込んで、各々がＱ行×Ｐ列のＦ個の出力を生成するように構成されたニューラルネットワークユニット（ＮＮＵ）であって、当該ニューラルネットワークユニットは、
Ｎワードの行を出力する少なくとも１つのメモリであって、Ｎは少なくとも５１２である、メモリと、
Ｎ個の処理ユニット（ＰＵ）のアレイであって、該アレイの各ＰＵは、累算器と、前記少なくとも１つのメモリの行から前記Ｎワードのうちそれぞれのワードを受け取るように構成されたレジスタと、前記少なくとも１つのメモリの行からの前記Ｎワードのうちそれぞれのワード又は論理的に隣接したＰＵの多重化レジスタから循環されたワードを選択的に受け取るように構成された前記多重化レジスタと、前記累算器、レジスタ、及び多重化レジスタに結合された算術論理ユニットと、を有する、アレイと、
を含み、
前記Ｎ個のＰＵは、各々がそれぞれＢ個のＰＵの、Ｇ個のブロックとして論理的に区分され、Ｂは、少なくともＷと同じ大きさの、Ｎの最小の因数であり、
前記Ｑ個の出力行の各出力行について、
前記Ｒ個のフィルタ行の各フィルタ行について、
当該ＮＮＵは、ＰＵの前記Ｇ個のブロックに対応するＧ個の入力ブロックとして論理的に区分されたＮワードの行を、前記少なくとも１つのメモリから前記Ｎ個の多重化レジスタに読み出し、前記Ｇ個の入力ブロックのうち少なくともＣ個が、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含み、
前記Ｃチャネルの少なくとも各チャネルについて、
前記Ｓ個のフィルタ列の各フィルタ列について、
当該ＮＮＵは、前記Ｇ個の入力ブロックに対応するＧ個のフィルタブロックとして論理的に区分されたＮワードの行を、前記少なくとも１つのメモリから前記Ｎ個のレジスタに読み出し、前記Ｇ個のフィルタブロックのうちＦ個のフィルタブロックの各々が、前記Ｆ個のフィルタのうちそれぞれのフィルタに対応し、前記フィルタ列と前記フィルタ行と対応する入力ブロックの前記それぞれのチャネルとにおける前記それぞれのフィルタの重みの、少なくともＱ個のコピーを含み、
前記アレイの各ＰＵが、前記レジスタと前記多重化レジスタとを乗算して積を生成し、前記積を前記累算器で累算し、
当該ＮＮＵは、前記多重化レジスタを１だけ循環させ、
当該ＮＮＵは、前記多重化レジスタを循環させて、前記Ｇ個の入力ブロックを、Ｂ個のＰＵの、前記の隣接したＧ個のブロックに位置合わせし、
当該ＮＮＵは、前記Ｎ個の累算器を前記少なくとも１つのメモリに書き込む、
ニューラルネットワークユニット。
【請求項２】
当該ＮＮＵは、前記Ｑ個の出力行の前記各出力行についての前記レジスタと前記多重化レジスタとの前記乗算のうちいずれかを実行する前、前記累算器をクリアする、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項３】
前記多重化レジスタは、前記論理的に隣接したＰＵ以外の１つ以上のＰＵの前記多重化レジスタから循環されたワードを選択的に受け取るようにさらに構成され、
前記多重化レジスタを循環させて、前記Ｇ個の入力ブロックをＢ個のＰＵの前記隣接したＧ個のブロックに位置合わせするために、当該ニューラルネットワークユニットは、前記多重化レジスタに、前記論理的に隣接したＰＵ以外の前記１つ以上のＰＵの前記多重化レジスタから循環された前記ワードを受け取らせる、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項４】
前記少なくとも１つのメモリは、
前記入力の前記Ｎワードの幅の行が記憶される、前記Ｎ個の多重化レジスタに結合された第１のメモリと、
前記重みの前記Ｎワードの幅の行が記憶される、前記Ｎ個のレジスタに結合された第２のメモリと、
を含む、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項５】
当該ＮＮＵは、行内の前記Ｎワードのうち個々のサブユニットでなく、前記Ｎワードの行全体としてのみ前記少なくとも１つのメモリを読み出すように構成される、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項６】
ＰＵの数Ｎは当該ＮＮＵのハードウェアに基づいて静的であり、しかし、Ｗはニューラルネットワークのハイパーパラメータであり、その入力に当該ＮＮＵが前記フィルタを畳み込んで前記出力を生成し、ゆえにＢ及びＧは動的である、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項７】
前記Ｇ個の入力ブロックの各々は、前記入力の前記Ｃチャネルのうちのチャネルの行を含む、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項８】
前記Ｇ個の入力ブロックのうちのいくつかは、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含まず、しかし代わってヌル値を含み、したがって、生成される前記積は前記累算器で累算されるヌル値である、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項９】
前記Ｃチャネルの少なくとも各チャネルについて、は、Ｃ＋Ｘチャネルについて、を含み、Ｘは、ヌル値を含む前記Ｇ個の入力ブロックのうちの前記いくつか、の数である、
ことをさらに含む請求項８に記載のニューラルネットワークユニット。
【請求項１０】
前記Ｇ個の入力ブロックのうちＸ個は、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含まず、
前記Ｘ個の入力ブロックに対応する前記Ｇ個のフィルタブロックのうちＸ個は、ヌル値を含み、したがって、生成される前記積は前記累算器で累算されるヌル値である、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項１１】
前記Ｑ個の出力行の各出力行についてに関して、前記出力行はゼロ基準の出力行索引を有し、
前記Ｒ個のフィルタ行の各フィルタ行についてに関して、前記フィルタ行はゼロ基準のフィルタ行索引を有し、
当該ＮＮＵが前記多重化レジスタに読み出す前記入力の前記それぞれのチャネルの前記行は、前記出力行索引及び前記フィルタ行索引の和であるゼロ基準の索引を有する、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項１２】
当該ＮＮＵが、前記多重化レジスタを循環させて、前記Ｇ個の入力ブロックをＮ個のＰＵの前記隣接したＧ個のブロックに位置合わせすることは、当該ＮＮＵが、Ｂ引くＳ足す１だけ前記多重化レジスタを循環させることを含む、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項１３】
前記少なくとも１つのメモリから前記Ｎ個の多重化レジスタに読み出される前記Ｎワードの各々は、第１のビット幅を有し、前記Ｎ個の累算器の各々は、前記第１のビット幅より大きい第２のビット幅を有し、
当該ＮＮＵが、前記Ｎ個の累算器を前記少なくとも１つのメモリに書き込むことは、当該ＮＮＵが、前記第２のビット幅の対応するＮ個の累算器のより低い精度表現である前記第１のビット幅のＮワードを、前記少なくとも１つのメモリに書き込むことを含む、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項１４】
前記Ｑ個の出力行の各出力行について、当該ＮＮＵは、中間部分和を前記少なくとも１つのメモリに書き込むことと前記中間部分和を前記少なくとも１つのメモリから後に読み出すこととに起因して精度を損なうことなく、前記Ｎ個の累算器を前記少なくとも１つのメモリに書き込んで、前記出力の前記Ｑ行のうちの前記出力行を生成する、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項１５】
ＰＵの数Ｎは当該ＮＮＵのハードウェアに基づいて静的であり、しかし、Ｆはニューラルネットワークのハイパーパラメータであり、その入力に当該ＮＮＵが前記フィルタを畳み込んで前記出力を生成し、
ＦがＧより大きいとき、前記Ｑ個の出力行の各出力行についてがＴ回行われ、Ｔは、Ｇで割ったＦの商の天井関数である、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項１６】
ＰＵの数Ｎは当該ＮＮＵのハードウェアに基づいて静的であり、しかし、Ｃはニューラルネットワークのハイパーパラメータであり、その入力に当該ＮＮＵが前記フィルタを畳み込んで前記出力を生成し、
ＣがＧの半分より小さいとき、前記Ｇ個の入力ブロックのうちのＣ個からなるＶ個の異なるグループが、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含み、
Ｖは、Ｃで割ったＧの商の床関数である、
ことをさらに含む請求項１に記載のニューラルネットワークユニット。
【請求項１７】
Ｈ行×Ｗ列×Ｃチャネルの入力に、各々がＲ行×Ｓ列×ＣチャネルのＦ個のフィルタを畳み込んで、各々がＱ行×Ｐ列のＦ個の出力を生成するように構成されたニューラルネットワークユニット（ＮＮＵ）を動作させる方法であって、前記ニューラルネットワークユニットは、Ｎワードの行を出力する少なくとも１つのメモリであって、Ｎは少なくとも５１２である、メモリと、Ｎ個の処理ユニット（ＰＵ）のアレイであって、該アレイの各ＰＵは、累算器と、前記少なくとも１つのメモリの行から前記Ｎワードのうちそれぞれのワードを受け取るように構成されたレジスタと、前記少なくとも１つのメモリの行からの前記Ｎワードのうちそれぞれのワード又は論理的に隣接したＰＵの多重化レジスタから循環されたワードを選択的に受け取るように構成された前記多重化レジスタと、前記累算器、レジスタ、及び多重化レジスタに結合された算術論理ユニットと、を有する、アレイと、を含み、前記Ｎ個のＰＵは、各々がそれぞれＢ個のＰＵの、Ｇ個のブロックとして論理的に区分され、Ｂは、少なくともＷと同じ大きさの、Ｎの最小の因数であり、当該方法は、
前記Ｑ個の出力行の各出力行について、
前記Ｒ個のフィルタ行の各フィルタ行について、
前記ＮＮＵにより、ＰＵの前記Ｇ個のブロックに対応するＧ個の入力ブロックとして論理的に区分されたＮワードの行を、前記少なくとも１つのメモリから前記Ｎ個の多重化レジスタに読み出すことであって、前記Ｇ個の入力ブロックのうち少なくともＣ個が、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含む、ことと、
前記Ｃチャネルの少なくとも各チャネルについて、
前記Ｓ個のフィルタ列の各フィルタ列について、
前記ＮＮＵにより、前記Ｇ個の入力ブロックに対応するＧ個のフィルタブロックとして論理的に区分されたＮワードの行を、前記少なくとも１つのメモリから前記Ｎ個のレジスタに読み出すことであって、前記Ｇ個のフィルタブロックのうちＦ個のフィルタブロックの各々が、前記Ｆ個のフィルタのうちそれぞれのフィルタに対応し、前記フィルタ列と前記フィルタ行と対応する入力ブロックの前記それぞれのチャネルとにおける前記それぞれのフィルタの重みの、少なくともＱ個のコピーを含む、ことと、
前記アレイの各ＰＵにより、前記レジスタと前記多重化レジスタとを乗算して積を生成することと、前記積を前記累算器で累算することと、
前記ＮＮＵにより、前記多重化レジスタを１だけ循環させることと、
前記ＮＮＵにより、前記多重化レジスタを循環させて、前記Ｇ個の入力ブロックを、Ｂ個のＰＵの、前記の隣接したＧ個のブロックに位置合わせすることと、
前記ＮＮＵにより、前記Ｎ個の累算器を前記少なくとも１つのメモリに書き込むことと、
を含む方法。
【請求項１８】
前記ＮＮＵにより、前記Ｑ個の出力行の前記各出力行についての前記レジスタと前記多重化レジスタとの乗算のうちいずれかを実行する前、前記累算器をクリアすること、
をさらに含む請求項１７に記載の方法。
【請求項１９】
前記多重化レジスタにより、前記論理的に隣接したＰＵ以外の１つ以上のＰＵの前記多重化レジスタから循環されたワードを選択的に受け取ること、
をさらに含み、
前記多重化レジスタを循環させて、前記Ｇ個の入力ブロックをＢ個のＰＵの前記隣接したＧ個のブロックに位置合わせすることは、前記多重化レジスタにより、前記論理的に隣接したＰＵ以外の前記１つ以上のＰＵの前記多重化レジスタから循環された前記ワードを受け取ることを含む、
請求項１７に記載の方法。
【請求項２０】
ＰＵの数Ｎは前記ＮＮＵのハードウェアに基づいて静的であり、しかし、Ｗはニューラルネットワークのハイパーパラメータであり、その入力に前記ＮＮＵが前記フィルタを畳み込んで前記出力を生成し、ゆえにＢ及びＧは動的である、
ことをさらに含む請求項１７に記載の方法。
【請求項２１】
前記Ｇ個の入力ブロックの各々は、前記入力の前記Ｃチャネルのうちのチャネルの行を含む、
ことをさらに含む請求項１７に記載の方法。
【請求項２２】
前記Ｇ個の入力ブロックのうちのいくつかは、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含まず、しかし代わってヌル値を含み、したがって、生成される前記積は前記累算器で累算されるヌル値である、
ことをさらに含む請求項１７に記載の方法。
【請求項２３】
前記Ｃチャネルの少なくとも各チャネルについて、は、Ｃ＋Ｘのチャネルについて、を含み、Ｘは、ヌル値を含む前記Ｇ個の入力ブロックのうちの前記いくつか、の数である、
ことをさらに含む請求項２２に記載の方法。
【請求項２４】
前記Ｇ個の入力ブロックのうちＸ個は、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含まず、
前記Ｘ個の入力ブロックに対応する前記Ｇ個のフィルタブロックのうちＸ個は、ヌル値を含み、したがって、生成される前記積は前記累算器で累算されるヌル値である、
ことをさらに含む請求項１７に記載の方法。
【請求項２５】
前記Ｑ個の出力行の各出力行についてに関して、前記出力行はゼロ基準の出力行索引を有し、
前記Ｒ個のフィルタ行の各フィルタ行についてに関して、前記フィルタ行はゼロ基準のフィルタ行索引を有し、
前記ＮＮＵが前記多重化レジスタに読み出す前記入力の前記それぞれのチャネルの前記行は、前記出力行索引及び前記フィルタ行索引の和であるゼロ基準の索引を有する、
ことをさらに含む請求項１７に記載の方法。
【請求項２６】
前記多重化レジスタを循環させて、前記Ｇ個の入力ブロックをＮ個のＰＵの前記隣接したＧ個のブロックに位置合わせすることは、Ｂ引くＳ足す１だけ前記多重化レジスタを循環させることを含む、
ことをさらに含む請求項１７に記載の方法。
【請求項２７】
前記少なくとも１つのメモリから前記Ｎ個の多重化レジスタに読み出される前記Ｎワードの各々は、第１のビット幅を有し、前記Ｎ個の累算器の各々は、前記第１のビット幅より大きい第２のビット幅を有し、
前記Ｎ個の累算器を前記少なくとも１つのメモリに書き込むことは、前記第２のビット幅の対応するＮ個の累算器のより低い精度表現である前記第１のビット幅のＮワードを、前記少なくとも１つのメモリに書き込むことを含む、
ことをさらに含む請求項１７に記載の方法。
【請求項２８】
前記Ｑ個の出力行の各出力行について、中間部分和を前記少なくとも１つのメモリに書き込むことと前記中間部分和を前記少なくとも１つのメモリから後に読み出すこととに起因して精度を損なうことなく、前記Ｎ個の累算器を前記少なくとも１つのメモリに書き込んで、前記出力の前記Ｑ行のうちの前記出力行を生成する、
ことをさらに含む請求項１７に記載の方法。
【請求項２９】
ＰＵの数Ｎは前記ＮＮＵのハードウェアに基づいて静的であり、しかし、Ｆはニューラルネットワークのハイパーパラメータであり、その入力に前記ＮＮＵが前記フィルタを畳み込んで前記出力を生成し、
ＦがＧより大きいとき、前記Ｑ個の出力行の各出力行についてがＴ回行われ、Ｔは、Ｇで割ったＦの商の天井関数である、
ことをさらに含む請求項１７に記載の方法。
【請求項３０】
ＰＵの数Ｎは前記ＮＮＵのハードウェアに基づいて静的であり、しかし、Ｃはニューラルネットワークのハイパーパラメータであり、その入力に前記ＮＮＵが前記フィルタを畳み込んで前記出力を生成し、
ＣがＧの半分より小さいとき、前記Ｇ個の入力ブロックのうちのＣ個からなるＶ個の異なるグループが、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含み、
Ｖは、Ｃで割ったＧの商の床関数である、
ことをさらに含む請求項１７に記載の方法。
【請求項３１】
コンピューティングデバイスでの使用のための少なくとも１つの非一時的コンピュータ使用可能媒体内に符号化されたコンピュータプログラムであって、
Ｈ行×Ｗ列×Ｃチャネルの入力に、各々がＲ行×Ｓ列×ＣチャネルのＦ個のフィルタを畳み込んで、各々がＱ行×Ｐ列のＦ個の出力を生成するように構成されたニューラルネットワークユニット（ＮＮＵ）を規定するための、前記媒体内に具現化されたコンピュータ使用可能プログラムコードを含み、前記コンピュータ使用可能プログラムコードは、
Ｎワードの行を出力する少なくとも１つのメモリを規定するための第１のプログラムコードであって、Ｎは少なくとも５１２である、第１のプログラムコードと、
Ｎ個の処理ユニット（ＰＵ）のアレイを規定するための第２のプログラムコードであって、前記アレイの各ＰＵは、累算器と、前記少なくとも１つのメモリの行から前記Ｎワードのうちそれぞれのワードを受け取るように構成されたレジスタと、前記少なくとも１つのメモリの行からの前記Ｎワードのうちそれぞれのワード又は論理的に隣接したＰＵの多重化レジスタから循環されたワードを選択的に受け取るように構成された前記多重化レジスタと、前記累算器、レジスタ、及び多重化レジスタに結合された算術論理ユニットと、を有する、第２のプログラムコードと、
を含み、
前記Ｎ個のＰＵは、各々がそれぞれＢ個のＰＵの、Ｇ個のブロックとして論理的に区分され、Ｂは、少なくともＷと同じ大きさの、Ｎの最小の因数であり、
前記Ｑ個の出力行の各出力行について、
前記Ｒ個のフィルタ行の各フィルタ行について、
前記ＮＮＵは、ＰＵの前記Ｇ個のブロックに対応するＧ個の入力ブロックとして論理的に区分されたＮワードの行を、前記少なくとも１つのメモリから前記Ｎ個の多重化レジスタに読み出し、前記Ｇ個の入力ブロックのうち少なくともＣ個が、前記入力の前記Ｃチャネルのうちそれぞれのチャネルの行を含み、
前記Ｃチャネルの少なくとも各チャネルについて、
前記Ｓ個のフィルタ列の各フィルタ列について、
前記ＮＮＵは、前記Ｇ個の入力ブロックに対応するＧ個のフィルタブロックとして論理的に区分されたＮワードの行を、前記少なくとも１つのメモリから前記Ｎ個のレジスタに読み出し、前記Ｇ個のフィルタブロックのうちＦ個のフィルタブロックの各々が、前記Ｆ個のフィルタのうちそれぞれのフィルタに対応し、前記フィルタ列と前記フィルタ行と対応する入力ブロックの前記それぞれのチャネルとにおける前記それぞれのフィルタの重みの、少なくともＱ個のコピーを含み、
前記アレイの各ＰＵが、前記レジスタと前記多重化レジスタとを乗算して積を生成し、前記積を前記累算器で累算し、
前記ＮＮＵは、前記多重化レジスタを１だけ循環させ、
前記ＮＮＵは、前記多重化レジスタを循環させて、前記Ｇ個の入力ブロックを、Ｂ個のＰＵの、前記の隣接したＧ個のブロックに位置合わせし、
前記ＮＮＵは、前記Ｎ個の累算器を前記少なくとも１つのメモリに書き込む、
コンピュータプログラム。
【発明の詳細な説明】
【背景技術】
【０００１】
関連出願の相互参照
本願は、以下の米国正規出願に関連し、それらの出願はそれぞれ全体が参照により本明細書に取り込まれる。
【０００２】
【表１】
2018092560.tif 000003
上記の正規出願はそれぞれ、以下の米国仮出願に基づく優先権を主張し、それらの出願はそれぞれ全体が参照により本明細書に取り込まれる。
【０００３】
【表２】
2018092560.tif 000004
本願は、以下の同時に出願された米国正規出願にも関連し、それらの出願はそれぞれ全体が参照により本明細書に取り込まれる。
【０００４】
【表３】
2018092560.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）を引き起こすことに留意されたい。次いでループ本体について説明する。
【０１５１】
アドレス１にあるのは、データＲＡＭ１２２の行０を指定し、現在の重みＲＡＭ１２４の行を暗黙的に使用する積和命令であり、上記現在の行は、好ましくは、シーケンサ１２８に保持される（また、ループ本体の最初の通過のために、アドレス０の命令によってゼロに初期化される）。すなわち、アドレス１の命令は、ＮＰＵ１２６の各々に、各自の対応するワードをデータＲＡＭ１２２の行０から読み出させ、各自の対応するワードを現在の重みＲＡＭ１２４の行から読み出させ、その２つのワードに対する積和演算を行わせる。したがって、例えば、ＮＰＵ５は、Ｃ０，０とＤｘ，５とを乗算し（「ｘ」は現在の重みＲＡＭ１２４の行）、その結果を累算器２０２の値２１７に加算し、その和を累算器２０２に書き戻す。
【０１５２】
アドレス２にあるのは、データＲＡＭ１２２の行を増分（すなわち、行１に増分）してから、増分されたアドレスにおける行をデータＲＡＭ１２２から読み出すように指定する積和命令である。この命令はさらに、各ＮＰＵ１２６のｍｕｘ−ｒｅｇ７０５内の値を隣接するＮＰＵ１２６に循環させることを指定し、これは、この場合、アドレス１の命令に応答して重みＲＡＭ１２４から読み出されたばかりのデータ行列２４０６の値の行である。図２４〜図２６の実施形態では、ＮＰＵ１２６は、図３、図７、及び図１９に関連して上記で説明したように、ｍｕｘ−ｒｅｇ７０５の値を左に、すなわち、ＮＰＵ  ＪからＮＰＵ  Ｊ＋１へではなくＮＰＵ  ＪからＮＰＵ  Ｊ−１に循環させるように構成される。ＮＰＵ１２６が右に循環するように構成される実施形態では、同様の畳み込み結果を達成するために、アーキテクチャプログラムは、畳み込みカーネル２０４２の係数値をデータＲＡＭ１２２に、異なる順序で（例えば、中央の列を中心に循環させる）書き込むことができることを理解されたい。さらに、アーキテクチャプログラムは、必要に応じて、畳み込みカーネル２０４２の追加的な事前処理（例えば、互換）を行ってもよい。加えて、命令は、２のカウント値を指定する。したがって、アドレス２の命令は、ＮＰＵ１２６の各々に、各自の対応するワードをデータＲＡＭ１２２の行１から読み出させ、循環されたワードをｍｕｘ−ｒｅｇ７０５へと受け取らせ、その２つのワードに対する積和演算を行わせる。カウント値が２であるために、命令はさらに、ＮＰＵ１２６の各々にすぐ上記で説明した動作を繰り返させる。すなわち、シーケンサ１２８は、データＲＡＭ１２２の行アドレス１２３を増分（すなわち行２に増分）し、各ＮＰＵ１２６は、各自の対応するワードをデータＲＡＭ１２２の行２から読み出し、循環されたワードをｍｕｘ−ｒｅｇ７０５へと受け取り、その２つのワードに積和演算を行う。したがって、例えば、現在の重みＲＡＭ１２４の行が２７であると仮定すると、アドレス２の命令を実行した後、ＮＰＵ５は、自身の累算器２０２の中に、Ｃ０，１とＤ２７，６との積、及びＣ０，２とＤ２７，７との積を累算していることになる。したがって、アドレス１及び２における命令の完了後、Ｃ０，０とＤ２７，５との積、Ｃ０，１とＤ２７，６との積、及びＣ０，２とＤ２７，７との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器２０２に累算されていることになる。
【０１５３】
アドレス３及び４の命令は、アドレス１及び２の命令と同様の動作を行うが、重みＲＡＭ１２４の行増分インディケータがあるために、重みＲＡＭ１２４の次の行に対して動作を行い、またデータＲＡＭ１２２の次の３つの行、すなわち行３〜５に対して動作を行う。すなわち、例えばＮＰＵ５に関しては、アドレス１〜４の命令の完了後、Ｃ０，０とＤ２７，５との積、Ｃ０，１とＤ２７，６との積、Ｃ０，２とＤ２７，７との積、Ｃ１，０とＤ２８，５との積、Ｃ１，１とＤ２８，６との積、及びＣ１，２とＤ２８，７との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器２０２に累算されていることになる。
【０１５４】
アドレス５及びの６命令は、アドレス３及び４の命令と同様の動作を行うが、重みＲＡＭ１２４の次の行、及びデータＲＡＭ１２２の次の３つの行、すなわち行６〜８について行う。すなわち、例えばＮＰＵ５に関しては、アドレス１〜６の命令の完了後、Ｃ０，０とＤ２７，５との積、Ｃ０，１とＤ２７，６との積、Ｃ０，２とＤ２７，７との積、Ｃ１，０とＤ２８，５との積、Ｃ１，１とＤ２８，６との積、Ｃ１，２とＤ２８，７との積、Ｃ２，０とＤ２９，５との積、Ｃ２，１とＤ２９，６との積、及びＣ２，２とＤ２９，７との積が、先行するループ本体の通過で生じたその他の累算値すべてと共に、累算器２０２に累算されていることになる。すなわち、アドレス１〜６の命令の完了後、そしてループ本体の開始時の重みＲＡＭ１２４の行が２７であったと仮定すると、例えばＮＰＵ５は、畳み込みカーネル２０４２を使用して、以下の３×３の部分行列の畳み込みを行っていることになる。
（外１）
2018092560.tif 000006
より一般的には、アドレス１〜６の命令の完了後、５１２個のＮＰＵ１２６の各々は、畳み込みカーネル２０４２を使用して、以下の３×３の部分行列の畳み込みを行っていることになる。
（外２）
2018092560.tif 000007
ここで、ｒはループ本体の開始時の重みＲＡＭ１２４の行アドレス値であり、ｎはＮＰＵ１２６の番号である。
【０１５５】
アドレス７の命令は、ＡＦＵ２１２を通じて、累算器２０２の値２１７をパススルーする。このパススルー関数は、データＲＡＭ１２２及び重みＲＡＭ１２４から読み出されるワードのサイズ（ビット単位）（すなわち、本例では１６ビット）であるワードをパススルーする。好ましくは、下記でより詳細に説明するように、ユーザが、出力の形式、例えば、出力ビットのうちいくつが小数ビットであるかを指定することができる。或いは、パススルー活性化関数を指定するのではなく、除算活性化関数が指定され、これは、例えば図２９Ａ及び図３０に関連して本明細書に記載されるように、例えば図３０の「除算器」３０１４／３０１６の１つを使用して累算器２０２の値２１７を除数で割る。例えば、上記のガウスぼかしカーネルの１６分の１係数などの係数を伴う畳み込みカーネル２０４２の場合、パススルー関数ではなく、アドレス７の活性化関数命令が、除算（例えば、１６で割る）活性化関数を指定することができる。或いは、アーキテクチャプログラムは、データＲＡＭ１２２に畳み込みカーネル２０４２の係数を書き込む前に、これらに１６による除算を行い、このことに応じて畳み込みカーネル２４０２の値について、例えば下記の図２９のデータの２進小数点２９２２を使用して、２進小数点の場所を調節することができる。
【０１５６】
アドレス８の命令は、ＡＦＵ２１２の出力を、出力行レジスタの現在の値で指定される重みＲＡＭ１２４の行に書き込む。上記出力行レジスタは、アドレス０の命令で初期化されており、この命令中に増分インディケータがあるため、ループを通過するたびに増分される。
【０１５７】
３×３の畳み込みカーネル２４０２を有する図２４〜図２６の例から判断できるように、ＮＰＵ１２６は、約３クロックサイクルごとに重みＲＡＭ１２４を読み出してデータ行列２４０６の行を読み出し、畳み込み結果行列を書き込むためにおよそ１２クロックサイクルごとに重みＲＡＭ１２４に書き込みをする。加えて、図１７のバッファ１７０４など、読み出し及び書き込みバッファを含んでいる実施形態を仮定すると、ＮＰＵ１２６が読み出し及び書き込みを行うのと同時に、プロセッサ１００が重みＲＡＭ１２４の読み出し及び書き込みを行い、その結果、バッファ１７０４は、約１６クロックサイクルごとに重みＲＡＭ１２４の１回の書き込みと１回の読み出しとを行って、それぞれ、データ行列２４０６を書き込み、畳み込みの結果行列を読み出す。したがって、重みＲＡＭ１２４の帯域幅の約半分が、ＮＮＵ１２１が畳み込み演算を行うハイブリッドな仕方によって消費される。この例は３×３の畳み込みカーネル２０４２を含むが、２×２、４×４、５×５、６×６、７×７、８×８等の行列など、他のサイズの畳み込みカーネルが用いられることも可能であり、その場合はＮＮＵプログラムが変化する。より大きな畳み込みカーネルの場合、より小さいパーセンテージの重みＲＡＭ１２４の帯域幅が、消費される。これは、ＮＰＵ１２６がより小さいパーセンテージの時間、重みＲＡＭを読み出すためであり、なぜならば、積和命令の循環バージョンにおけるカウントが（例えば、図２６Ａのプログラムのアドレス２、４、及び６、並びにより大きい畳み込みカーネルの場合に必要となるであろう追加的な同様の命令において）より大きいからである。
【０１５８】
或いは、畳み込みの結果を重みＲＡＭ１２４の異なる行（例えば、９００〜１２９９及び１３００〜１６９９）に書き戻すのではなく、アーキテクチャプログラムは、入力データ行列２４０６の行を、それらの行が必要でなくなった後に上書きするようにＮＮＵプログラムを構成する。例えば、３×３の畳み込みカーネルの場合、データ行列２４０６を重みＲＡＭ１２４の行０〜３９９に書き込むのではなく、アーキテクチャプログラムは、データ行列２４０６を行２〜４０１に書き込み、ＮＮＵプログラムは、畳み込みの結果を、重みＲＡＭ１２４の行０から始めてループ本体を通過するたびに増分する行に書き込むように構成される。このようにして、ＮＮＵプログラムは、もう必要でなくなった行だけを上書きする。例えば、ループ本体の１回目の通過の後（より具体的には、重みＲＡＭ１２４の行０にロードするアドレス１の命令の実行後）、行０にあるデータは上書きできるようになるが、行１〜３にあるデータは、ループ本体を２回目に通過する際に必要になり、したがってループ本体の１回目の通過では上書きされない。同様に、ループ本体の２回目の通過後には、行１にあるデータが上書きできるようになるが、行２〜４にあるデータは、ループ本体を２回目に通過する際に必要となり、したがってループ本体の２回目の通過では上書きされず、以下同様に続く。そのような実施形態では、各データ行列２４０６（チャンク）の高さは、より大きくてよく（例えば、８００行）、結果として、より少ないチャンク数がもたらされる。
【０１５９】
或いは、畳み込みの結果を重みＲＡＭ１２４に書き戻すのではなく、アーキテクチャプログラムは、畳み込みの結果を畳み込みカーネル２４０２より上の（例えば、行８より上の）データＲＡＭ１２２の行に書き戻すようにＮＮＵプログラムを構成し、アーキテクチャプログラムは、ＮＮＵ１２１が結果を書き込むとき、それをデータＲＡＭ１２２から読み出す（例えば、下記の図２６Ｂの一番最近書き込まれたデータＲＡＭ１２２の行２６０６のアドレスを使用する）。この代替法は、重みＲＡＭ１２４がシングルポートでありデータＲＡＭ１２２がデュアルポートである実施形態で有利である可能性がある。
【０１６０】
図２４〜図２６Ａの実施形態によるＮＮＵ１２１の動作から観察できるように、図２６Ａのプログラムの各実行は、約５０００クロックサイクルを要し、その結果、図２４の２５６０×１６００のデータ配列２４０４全体を畳み込むには、約１００，０００クロックサイクルを要し、これは、同様の作業を従来の方法で行うために必要なクロックサイクル数よりもかなり少ない可能性がある。
【０１６１】
次いで図２６Ｂを参照すると、一実施形態による図１のＮＮＵ１２１の制御レジスタ１２７の特定のフィールドを図示するブロック図が示される。状態レジスタ１２７は、ＮＰＵ１２６によって書き込まれた重みＲＡＭ１２４の一番最近の行のアドレスを指示するフィールド２６０２、ＮＰＵ１２６によって書き込まれたデータＲＡＭ１２２の一番最近の行のアドレスを指示するフィールド２６０６、ＮＰＵ１２６によって読み出された重みＲＡＭ１２４の一番最近の行のアドレスを指示するフィールド２６０４、及び、ＮＰＵ１２６によって読み出されたデータＲＡＭ１２２の一番最近の行のアドレスを指示するフィールド２６０８を含む。これにより、プロセッサ１００で実行されているアーキテクチャプログラムは、ＮＮＵ１２１がデータＲＡＭ１２２及び／又は重みＲＡＭ１２４の読み出し及び／又は書き込みを進めるとき、ＮＮＵ１２１の進捗を決定することができる。上記のように入力データ行列を上書きする（又は上述のようにデータＲＡＭ１２２に結果を書き込む）選択肢と併せてこの能力を用いると、図２４のデータ配列２４０４は、以下のように、例えば、２０個の５１２×４００チャンクではなく、５個の５１２×１６００チャンクとして処理することができる。プロセッサ１００は、最初の５１２×１６００のチャンクを重みＲＡＭ１２４の行２から書き込み、ＮＮＵプログラム（１６００回のループカウント、及び初期化された０の重みＲＡＭ１２４の出力行を有する）を開始する。ＮＮＵ１２１がＮＮＵプログラムを実行するとき、プロセッサ１００は、重みＲＡＭ１２４の出力の場所／アドレスを監視して、（１）ＮＮＵ１２１によって書き込まれた有効な畳み込み結果を持つ重みＲＡＭ１２４の行（行０から開始する）を（ＭＦＮＮ１５００命令を使用して）読み出し、（２）有効な畳み込み結果がすでに読み出された後、該畳み込み結果の上に２番目の５１２×１６００のデータ行列２４０６を書き込む（行２から開始する）。それにより、ＮＮＵ１２１が最初の５１２×１６００チャンクに対してＮＮＵプログラムを完了するとき、プロセッサ１００は必要に応じて直ちにＮＮＵプログラムを更新し、ＮＮＵプログラムを再度開始して２番目の５１２×１６００チャンクを処理することができる。このプロセスは、残りの３つの５１２×１６００のチャンクに対してもう３回繰り返されて、ＮＮＵ１２１の高い利用率を達成する。
【０１６２】
有利な点として、一実施形態では、特に図２９Ａ及び図２９Ｂ及び図３０に関連して下記でより詳細に説明するように、ＡＦＵ２１２は、累算器２０２の値２１７の有効な除算を効率的に行う能力を備える。例えば、累算器２０２の値２１７を１６で割る活性化関数ＮＮＵ命令が、上記のガウスぼかし行列に使用できる。
【０１６３】
図２４の例で使用される畳み込みカーネル２４０２は、データ配列２４０４全体に適用される小さい静的な畳み込みカーネルであるが、他の実施形態では、畳み込みカーネルは、畳み込みニューラルネットワークに一般的に見られるような、データ配列２４０４の異なるデータ値に関連付けられた固有の重みを有する大きな行列であってもよい。ＮＮＵ１２１がそのようにして使用される場合、アーキテクチャプログラムは、データ行列の場所と畳み込みカーネルの場所とを入れ替えることができ、すなわち、データＲＡＭ１２２にデータ行列を、重みＲＡＭ１２４に畳み込みカーネルを置いてもよく、ＮＮＵプログラムの所与の実行で処理できる行の数は、相対的により少なくなる可能性がある。
【０１６４】
次いで図２７を参照すると、図１のＮＮＵ１２１によってプーリング演算が行われる入力データが投入された、図１の重みＲＡＭ１２４の一例を図示するブロック図が示される。人工ニューラルネットワークのプーリング層によって行われるプーリング演算は、入力行列の部分領域又は部分行列を取り出すことと、その部分行列の最大値又は平均値のどちらかを計算することとにより、入力データ（例えば、画像又は畳み込み画像）の行列の次元数を減らし、上記最大値又は平均値は、結果得られる行列、すなわちプーリングされた行列になる。図２７及び図２８の例では、プーリング演算は、各部分行列の最大値を計算する。プーリング演算は、例えばオブジェクト分類や検出を行う人工ニューラルネットワークで特に有用である。一般に、プーリング演算は、調べる部分行列内の要素数の因数によって（by  a  factor  of）、演算の入力行列のサイズを効果的に減らし、特に、各次元の入力行列を、部分行列の対応する次元にある要素数だけ減らす。図２７の例では、入力データは、重みＲＡＭ１２４の行０〜１５９９に記憶された、ワイドワード（例えば、１６ビット）の５１２×１６００行列である。図２７では、ワードは、各自の行、列の場所で表され、例えば、行０及び列０にあるワードはＤ０，０と表され、行０及び列１にあるワードはＤ０，１と表され、行０及び列２にあるワードはＤ０，２と表され、以下同様に続き、行０及び列５１１にあるワードはＤ０，５１１と表される。同様に、行１及び列０にあるワードはＤ１，０と表され、行１及び列１にあるワードはＤ１，１と表され、行１及び列２にあるワードはＤ１，２と表され、以下同様に続き、行１及び列５１１にあるワードはＤ１，５１１と表され、以下同様に続き、行１５９９及び列０にあるワードはＤ１５９９，０と表され、行１５９９及び列１にあるワードはＤ１５９９，１と表され、行１５９９及び列２にあるワードはＤ１５９９，２と表され、以下同様に続き、行１５９９及び列５１１にあるワードはＤ１５９９，５１１と表される。
【０１６５】
次いで図２８を参照すると、図２７の入力データ行列のプーリング演算を行い、それを重みＲＡＭ１２４に書き戻すＮＮＵプログラムのプログラムリストが示される。図２８の例では、プーリング演算は、入力データ行列の部分行列のそれぞれの４×４部分行列の最大値を計算する。プログラムは、アドレス１〜１０の命令のループ本体を複数回ループする。アドレス０にあるＮＰＵ初期化命令が、各ＮＰＵ１２６がループ本体を実行する回数を指定し、ループ本体は、図２８の例では４００のループカウント値を有し、ループの最後（アドレス１１）にあるループ命令は、現在のループカウント値を減分し、その結果が非ゼロである場合、ループ本体の先頭に（すなわちアドレス１の命令に）制御を戻す。重みＲＡＭ１２４内の入力データ行列は、ＮＮＵプログラムにより、４つの隣接する行、すなわち行０〜３、行４〜７、行８〜１１、及び以下同様に行１５９６〜１５９９までの４００個の相互に排他的なグループとして、効果的に扱われる。４つの隣接する行からなる各グループは、１２８個の４×４部分行列、すなわち、あるグループの４つの行と、それに隣接する４つの列、すなわち列０〜３、４〜７、８〜１１、及び以下同様に列５０８〜５１１との、交差によって形成される要素の４×４部分行列を含む。５１２個のＮＰＵ１２６のうち、５１２個のＮＰＵ１２６の４つごとのＮＰＵ１２６（すなわち１２８個）が、それぞれの４×４部分行列にプーリング演算を行い、ＮＰＵ１２６の他の４分の３は使用されない。より具体的には、ＮＰＵ０、４、８、及び以下同様にＮＰＵ５０８までが各々、そのそれぞれの４×４部分行列にプーリング演算を行い、該部分行列の一番左の列番号がＮＰＵ番号に対応し、該部分行列の下側の行が現在の重みＲＡＭ１２４の行値に対応する。上記現在の重みＲＡＭ１２４の行値は、下記でより詳細に説明するように、アドレス０の初期化命令によってゼロに初期化され、ループ本体が反復されるたびに４だけ増分される。ループ本体の４００回の反復は、図２７の入力データ行列の４×４部分行列からなるグループの数に対応している（入力データ行列の１６００行÷４）。ＮＰＵ初期化命令はさらに、累算器２０２をゼロにクリアする。好ましくは、アドレス１１のループ命令がさらに、累算器２０２をゼロにクリアする。或いは、アドレス１のｍａｘｗａｃｃ命令が累算器２０２をゼロにクリアすることを指定する。
【０１６６】
プログラムのループ本体が反復されるたびに、１２８個の使用されるＮＰＵ１２６が同時に、入力データ行列の現在の４行グループの１２８個のそれぞれの４×４部分行列の、１２８のプーリング演算を行う。より具体的には、プーリング演算は、４×４部分行列の１６個の要素のうち、最大値の要素を決定する。図２８の実施形態では、使用される１２８個のＮＰＵ１２６の各ＮＰＵ  ｙについて、４×４部分行列の左下の要素が、図２７の要素Ｄｘ，ｙであり、ｘは、ループ本体の開始時における現在の重みＲＡＭ１２４の行番号であり、これが、図２８のプログラムのアドレス１にあるｍａｘｗａｃｃ命令によって読み出される（さらに、行番号は、アドレス０のＮＰＵ初期化命令によって初期化され、アドレス３、５、及び７のｍａｘｗａｃｃ命令の各々で増分される）。プログラムのループごとに、使用される１２８個のＮＰＵ１２６は、現在の行のグループのそれぞれの１２８個の４×４部分行列のうち、その対応する最大値の要素を、重みＲＡＭ１２４の指定された行に書き戻す。次いでループ本体について説明する。
【０１６７】
アドレス１にあるのは、現在の重みＲＡＭ１２４の行を暗黙的に使用するｍａｘｗａｃｃ命令であり、現在の重みＲＡＭ１２４の行は、好ましくは、シーケンサ１２８に保持される（また、ループ本体の最初の通過のために、アドレス０の命令によってゼロに初期化される）。アドレス１の命令は、ＮＰＵ１２６の各々に、その対応するワードを重みＲＡＭ１２４の現在の行から読み出させ、該ワードを累算器２０２の値２１７と比較させ、累算器２０２に２つの値のうち最大値を記憶させる。したがって、例えば、ＮＰＵ８は、累算器２０２の値２１７とデータワードＤｘ，８（「ｘ」は現在の重みＲＡＭ１２４の行）とのうち最大値を決定し、その最大値を累算器２０２に書き戻す。
【０１６８】
アドレス２にあるのは、各ＮＰＵ１２６のｍｕｘ−ｒｅｇ７０５にある値を隣接するＮＰＵ１２６に循環させるように指定するｍａｘｗａｃｃ命令であり、これは、この場合、アドレス１の命令に応答して重みＲＡＭ１２４から読み出されたばかりの入力データ行列値の行である。図２７〜図２８の実施形態では、ＮＰＵ１２６は、上記で図２４〜図２６に関連して説明したように、ｍｕｘ−ｒｅｇ７０５の値を左に、すなわちＮＰＵ  ＪからＮＰＵ  Ｊ−１に循環させるように構成される。加えて、命令は、３のカウント値を指定する。したがって、アドレス２の命令は、ＮＰＵ１２６各々に、循環されたワードをｍｕｘ−ｒｅｇ７０５に受け取らせ、循環されたワードと累算器２０２の値２１７とのうち最大値を決定させ、次いでその動作をもう２回繰り返させる。すなわち、各ＮＰＵ１２６は、３回、循環されたワードをｍｕｘ−ｒｅｇ７０５中に受け取り、循環されたワードと累算器２０２の値２１７とのうちの最大値を決定する。したがって、例えば、ループ本体の開始時における現在の重みＲＡＭ１２４の行が３６であると仮定すると、アドレス１及び２の命令を実行した後、例えばＮＰＵ８は、自身の累算器２０２の中に、ループ本体の開始時の累算器２０２と、４つの重みＲＡＭ１２４ワード、Ｄ３６，８及びＤ３６，９及びＤ３６，１０及びＤ３６，１１とのうちの、最大値を記憶していることになる。
【０１６９】
アドレス３及び４のｍａｘｗａｃｃ命令は、アドレス１及び２の命令と同様の動作を行うが、重みＲＡＭ１２４の行増分インディケータがあるために、重みＲＡＭ１２４の次の行について動作を行う。すなわち、ループ本体の開始時における現在の重みＲＡＭ１２４の行が３６であると仮定すると、アドレス１〜４の命令の完了後、例えばＮＰＵ８は、自身の累算器２０２の中に、ループ本体の開始時の累算器２０２と、８つの重みＲＡＭ１２４ワード、Ｄ３６，８及びＤ３６，９及びＤ３６，１０及びＤ３６，１１及びＤ３７，８及びＤ３７，９及びＤ３７，１０及びＤ３７，１１とのうちの、最大値を記憶していることになる。
【０１７０】
アドレス５〜８のｍａｘｗａｃｃ命令は、アドレス３及び４の命令と同様の動作を行うが、重みＲＡＭ１２４の次の２つの行について動作を行う。すなわち、ループ本体の開始時における現在の重みＲＡＭ１２４の行が３６であると仮定すると、アドレス１〜８の命令の完了後、例えばＮＰＵ８は、自身の累算器２０２の中に、ループ本体の開始時の累算器２０２と、１６個の重みＲＡＭ１２４ワード、Ｄ３６，８及びＤ３６，９及びＤ３６，１０及びＤ３６，１１及びＤ３７，８及びＤ３７，９及びＤ３７，１０及びＤ３７，１１及びＤ３８，８及びＤ３８，９及びＤ３８，１０及びＤ３８，１１及びＤ３９，８及びＤ３９，９及びＤ３９，１０及びＤ３９，１１とのうちの、最大値を記憶していることになる。すなわち、アドレス１〜８の命令の完了後、そしてループ本体の開始時の重みＲＡＭ１２４の行が３６であったと仮定すると、例えばＮＰＵ８は、次の４×４部分行列の最大値を決定していることになる。
（外３）
2018092560.tif 000008
より一般的には、アドレス１〜８の命令の完了後、使用される１２８個のＮＰＵ１２６の各々は、次の４×４部分行列の最大値を決定していることになる。
（外４）
2018092560.tif 000009
ここで、ｒはループ本体の開始時の重みＲＡＭ１２４の行アドレス値であり、ｎはＮＰＵ１２６の番号である。
【０１７１】
アドレス９の命令は、累算器２０２の値２１７を、ＡＦＵ２１２を通じてパススルーする。このパススルー関数は、重みＲＡＭ１２４から読み出されるワードのサイズ（ビット単位）（すなわち、本例では１６ビット）であるワードをパススルーする。好ましくは、下記でより詳細に説明するように、ユーザが、出力の形式、例えば、出力ビットのうちいくつが小数ビットであるかを指定することができる。
【０１７２】
アドレス１０の命令は、累算器２０２の値２１７を、出力行レジスタの現在の値で指定される重みＲＡＭ１２４の行に書き込む。上記出力行レジスタは、アドレス０の命令で初期化されており、この命令中に増分インディケータがあるために、ループを通過するたびに増分される。より具体的には、アドレス１０の命令は、累算器２０２のワイドワード（例えば、１６ビット）を重みＲＡＭ１２４に書き込む。好ましくは、下記の図２９Ａ及び図２９Ｂに関連して下記でより詳細に説明するように、この命令は、出力２進小数点２９１６で指定されるように１６ビットを書き込む。
【０１７３】
観察できるように、ループ本体の反復によって重みＲＡＭ１２４に書き込まれる各行は、無効なデータを有する穴を含んでいる。すなわち、結果的に得られる１３３個のワイドワード、１〜３、５〜７、９〜１１、及び以下同様にワイドワード５０９〜５１１は、無効であり、すなわち使用されない。一実施形態では、ＡＦＵ２１２は、出力重みＲＡＭ１２４の行に書き戻すために、図１１の行バッファ１１０４などの行バッファの隣接するワードに結果をパックできるようにするｍｕｘを含む。好ましくは、活性化関数命令が各穴にあるワードの数を指定し、穴内のワード数が使用されて、ｍｕｘを制御して結果をパックする。一実施形態では、穴の数は、プーリングの３×３、４×４、５×５、６×６、又は７×７の部分行列の出力をパックするために、２から６の値として指定することができる。或いは、プロセッサ１００で実行されているアーキテクチャプログラムが、結果として生じる疎な（すなわち穴を含んでいる）結果行を重みＲＡＭ１２４から読み出し、例えばｘ８６  ＳＳＥ命令などのアーキテクチャパック命令を使用するメディアユニットなどの他の実行ユニット１１２を使用して、パック関数を行う。有利な点として、上記の仕方に似ると共にＮＮＵ１２１のハイブリッド的な性質を利用する同時的な仕方で、プロセッサ１００で実行されているアーキテクチャプログラムは、状態レジスタ１２７を読み出して、重みＲＡＭ１２４の一番最近書き込まれた行を監視し（例えば、図２６Ｂのフィールド２６０２）て、結果として生じる疎な行を読み出し、その行をパックし、これを重みＲＡＭ１２４の同じ行に書き戻すことができる。その結果、上記行は、畳み込み層や典型的なニューラルネットワーク層（すなわち積和層）など、ニューラルネットワークの次の層のための入力データ行列として使用できる状態になる。さらに、プーリング演算を４×４の部分行列に行う実施形態が記載されるが、図２８のＮＮＵプログラムは、３×３、５×５、６×６、又は７×７の部分行列など、他のサイズの部分行列にプーリング演算を行うように変更を加えられてもよい。
【０１７４】
さらに観察されるように、重みＲＡＭ１２４に書き込まれる結果行の数は、入力データ行列の行の数の４分の１である。最後、この例では、データＲＡＭ１２２は使用されない。しかし、別法として、重みＲＡＭ１２４ではなく、データＲＡＭ１２２がプーリング演算を行うために使用されてもよい。
【０１７５】
図２７及び図２８の例では、プーリング演算は、部分領域の最大値を計算する。しかし、図２８のプログラムは、例えば、ｍａｘｗａｃｃ命令をｓｕｍｗａｃｃ命令（重みワードを累算器２０２の値２１７に足す）に置き換えることと、アドレス９の活性化関数命令を変更して、累算されている結果を、この例では１６である各部分領域の要素数で（好ましくは下記のように逆数乗算を介して）割ることとにより、部分領域の平均値を計算するように変更を加えられてもよい。
【０１７６】
図２７及び図２８の実施形態によるＮＮＵ１２１の動作から観察できるように、図２８のプログラムの各実行は、図２７の５１２×１６００のデータ行列全体のプーリング演算を行うために約６０００クロックサイクルを要し、これは、同様の作業を従来の方法で行うために必要なクロックサイクル数よりもかなり少ない可能性がある。
【０１７７】
或いは、プーリング演算の結果を重みＲＡＭ１２４に書き戻すのではなく、アーキテクチャプログラムは、結果をデータＲＡＭ１２２の行に書き戻すようにＮＮＵプログラムを構成し、アーキテクチャプログラムは、ＮＮＵ１２１が結果を書き込むとき、その結果をデータＲＡＭ１２２から読み出す（例えば、図２６Ｂの一番最近書き込まれたデータＲＡＭ１２２の行２６０６のアドレスを使用して）。この代替法は、重みＲＡＭ１２４がシングルポートでありデータＲＡＭ１２２がデュアルポートである実施形態で有利である可能性がある。
【０１７８】
ユーザ供給の２進小数点による固定小数点算術、最大精度の固定小数点累算、ユーザ指定の逆数値、累算器値の確率的丸め、及び選択可能な活性化／出力関数
一般的に言って、デジタルコンピューティングデバイス内で算術を行うハードウェアユニットは、それぞれ整数及び浮動小数点数に算術演算を行うことから一般に「整数」ユニット及び「浮動小数点」ユニットと呼ばれるものに分けることができる。浮動小数点数は、大きさ（又は仮数）及び指数、並びに通例は符号を有する。指数は、大きさに対する小数点（通例は２進小数点）の場所を示すものである。対して、整数は指数を持たず、大きさのみを持ち、しばしば符号を有する。浮動小数点ユニットの利点の１つは、プログラマが、極めて大きな範囲内の異なる値をとり得る数を扱えることであり、ハードウェアが、必要に応じて数の指数値の調節を担い、プログラマは調節を行う必要がない。例えば、２つの浮動小数点数、０．１１１×１０２９と０．８１×１０３１が乗算されると仮定する。（ここでは１０進、すなわち１０を底とする例が使用されるが、浮動小数点ユニットは、最も一般的には２を底とする浮動小数点数を扱う。）浮動小数点ユニットは、仮数を乗算し、指数を加算し、次いで結果を基準化して．８９９１×１０５９の値に戻すことを自動的に担う。別の例として、上記の同じ２つの浮動小数点数が加算されると仮定する。浮動小数点ユニットは、これらを加算する前に仮数の２進小数点を位置合わせして、結果として得られる和の．８１１１１×１０３１の値を生成することを自動的に担う。
【０１７９】
しかし、浮動小数点ユニットに伴う複雑性とその結果生じるサイズ、電力消費、命令当たりのクロック数の増大及び／又はサイクル時間の延長はよく知られている。実際、この理由のために、多くのデバイス（例えば、組み込みプロセッサ、マイクロコントローラ、並びに、比較的低コスト及び／又は低電力のマイクロプロセッサ）は、浮動小数点ユニットを含んでいない。上記の例から観察できるように、浮動小数点ユニットの複雑性の一部には、浮動小数点の加算及び乗算／除算に関連する指数算出を行う論理（オペランドの指数を加算／減算して、結果得られる浮動小数点乗算／除算の指数値を生成する加算器、オペランドの減算指数を決定して、浮動小数点加算のための２進小数点位置合わせシフト量を決定する減算器）、浮動小数点加算のために仮数の２進小数点位置合わせを達成するシフタ、浮動小数点の結果を基準化するシフタが含まれる。加えて、ブロックユニットに対するフロー進行は、通例、浮動小数点結果の丸めを行う論理、整数形式と浮動小数点形式との間、又は異なる浮動小数点精度形式（例えば、拡張精度、倍精度、単精度、半精度）間の変換を行う論理、先行ゼロ及び先行１の検出器、並びに、非正規化数、ＮＡＮ、及び無限大などの特殊な浮動小数点数を扱う論理を必要とする。
【０１８０】
さらに、浮動小数点ユニットの正確さを検証する際の複雑性が著しいという不都合があり、これは主として、設計を検証しなければならない数空間が増大するためであり、それにより、製品の開発サイクルと市場で販売するまでの時間が長くなる可能性がある。さらには、上記のように、浮動小数点算術は、計算に関係する浮動小数点数ごとに別個の仮数フィールドと指数フィールドを記憶及び使用することを示唆し、それにより、必要とされる記憶域の量が増大する、且つ／又は、整数を記憶するために等しい量の記憶域を想定したときに精度が低下する可能性がある。これらの不都合点の多くは、整数に算術演算を行う整数ユニットの使用によって回避される。
【０１８１】
しばしば、プログラマは、小数、すなわち自然数でない数を処理するプログラムを書く。そのプログラムは、浮動小数点ユニットを備えないプロセッサで稼働する可能性もあり、又は、備えている場合でも、プロセッサの整数ユニットによって実行される整数命令の方がより速い可能性がある。整数ユニットに伴う潜在的な性能の利点を活用するために、プログラマは、一般に固定小数点算術として知られるものを固定小数点数に用いる。そのようなプログラムは、整数ユニットに実行されて整数又は整数データを処理する命令を含んでいる。ソフトウェアは、データが小数であることを認識しており、また、整数データに例えば位置合わせシフトなどの演算を行って、データが実際には小数である事実に対処する命令を含んでいる。基本的に、固定小数点ソフトウェアは、浮動小数点ユニットが行う機能の一部又はすべてを手動で行う。
【０１８２】
本開示で使用される場合、「固定小数点」数（又は値又はオペランド又は入力又は出力）は、その記憶のビットが、本明細書で「小数ビット」と呼ばれる、当該固定小数点数の小数部分を表すビットを含んでいると理解される数である。固定小数点数の記憶のビットは、メモリ又はレジスタに含まれ、例えば、メモリ又はレジスタ内の８ビット又は１６ビットのワードである。さらに、固定小数点数の記憶のビットはすべて、大きさを表すために使用され、場合によっては、１ビットが符号を表すために使用されるが、固定小数点数の記憶ビットのうち、その数の指数を表すために使用される記憶ビットはない。さらに、固定小数点数の小数ビットの数又は２進小数点の場所は、固定小数点数の記憶ビットとは別個の記憶域において指定され、この記憶域は、固定小数点数が属する固定小数点数のセット、例えば、処理ユニットのアレイの入力オペランド、累算値、又は出力結果のセットなどについて、小数ビットの数又は２進小数点の場所を、共有されたやり方又は大域的なやり方で指示する。
【０１８３】
有利な点として、ＡＬＵは整数ユニットであるが、活性化関数ユニットが固定小数点算術のハードウェア支援又は加速を含む実施形態が、本明細書に記載される。これにより、ＡＬＵ部分を小型化及び高速化することができ、それにより、ダイ上の所与の空間内により多くのＡＬＵを持つことが容易になる。これは、ダイ空間当たりのニューロン数が増えることを示唆し、これは特にニューラルネットワークユニットで有利である。
【０１８４】
さらに有利な点として、浮動小数点数ごとに指数記憶ビットを必要とする浮動小数点数と対照的に、記載される実施形態では、固定小数点数が、数のセット全体について、小数ビットである記憶のビット数の指示を用いて表され、ただしこの指示は、セット全体のすべての数について小数ビットの数を大域的に指示する、単一の共有された記憶域に置かれる。上記数のセットは、例えば、一連の演算への入力のセット、その一連の演算の累算値のセット、出力のセットである。好ましくは、ＮＮＵのユーザが、数のセットに対して小数記憶ビットの数を指定できるようにされる。したがって、多くの文脈（例えば、一般の数学）では、用語「整数」は符号付きの自然数、すなわち小数部分を持たない数を指すが、本開示の文脈における用語「整数」は、小数部分を持つ数を指す場合もあることを理解されたい。さらに、本開示の文脈における用語「整数」は、個々の記憶のビットの一部が浮動小数点数の指数を表すために使用される浮動小数点数から区別することが意図される。同様に、整数ユニットによって行われる整数の乗算又は加算又は比較などの整数算術演算は、オペランドが指数を持たないことを仮定し、したがって、整数ユニットの整数要素、例えば整数乗算器、整数加算器、整数比較器は、指数を扱う論理を含んでおらず、例えば、加算又は比較演算のために仮数をシフトして２進小数点を位置合わせすることをせず、乗算演算のために指数を加算することをしない。
【０１８５】
加えて、精度の低下なく大きな一続きの整数演算（例えば、１０００回前後の積和）を累算する大きなハードウェア整数累算器を含む実施形態が、本明細書に記載される。それにより、ＮＮＵが浮動小数点数を扱うことを回避できるようになり、同時に、累算された値の最大精度を維持することができ、累算値を飽和させる必要がなく、又はオーバーフローが原因となって不正確な結果を招くことがない。一続きの整数演算が結果を最大精度の累算器に累算すると、固定小数点ハードウェア支援が、下記でより詳細に説明するように、ユーザによって指定された、累算値の小数ビット数の指示と、望まれる出力値中の小数ビット数とを使用して、必要なスケーリング及び飽和を行って最大精度の累算値を出力値に変換する。
【０１８６】
下記でより詳細に説明するように、好ましくは、活性化関数ユニットは、活性化関数への入力として使用するため又はパススルーのために、累算器値を最大精度の形式から圧縮するときに、選択的に累算器値に確率的丸めを行うことができる。最後、ＮＰＵは、ニューラルネットワークの所与の層の種々の必要性により指示されるとおり、異なる活性化関数を適用するように、且つ／又は各種の異なる形式の累算器値を出力するように、選択的に命令されることができる。
【０１８７】
次いで図２９Ａを参照すると、図１の制御レジスタ１２７の一実施形態を図示するブロック図が示される。制御レジスタ１２７は、複数の制御レジスタ１２７を含むことができる。制御レジスタ１２７は、示されるように、以下のフィールド、構成２９０２、符号付きデータ２９１２、符号付き重み２９１４、データ２進小数点２９２２、重み２進小数点２９２４、ＡＬＵ関数２９２６、丸め制御２９３２、活性化関数２９３４、逆数２９４２、シフト量２９４４、出力ＲＡＭ２９５２、出力の２進小数点２９５４、及び出力コマンド２９５６を含む。制御レジスタ１２７値は、ＭＴＮＮ命令１４００と、開始命令などのＮＮＵプログラムの命令との両方によって書き込まれる可能性がある。
【０１８８】
構成２９０２値は、上記のようにＮＮＵ１２１がナロー構成であるか、ワイド構成であるか、又はじょうご構成であるかを指定する。構成２９０２は、データＲＡＭ１２２及び重みＲＡＭ１２４から受け取られる入力ワードのサイズを示唆する。ナロー構成及びじょうご構成では、入力ワードのサイズはナローであり（例えば、８ビット又は９ビット）、対してワイド構成では、入力ワードのサイズはワイドである（例えば、１２ビット又は１６ビット）。さらに、構成２９０２は、入力ワードのサイズと同じである出力結果１３３のサイズを示唆する。
【０１８９】
符号付きデータ値２９１２は、真の場合は、データＲＡＭ１２２から受け取られるデータワードが符号付きの値であることを指示し、偽の場合は、符号なしの値であることを指示する。符号付きの重み値２９１４は、真の場合は、重みＲＡＭ１２４から受け取られる重みワードが符号付きの値であることを指示し、偽の場合は、符号なしの値であることを指示する。
【０１９０】
データ２進小数点２９２２の値は、データＲＡＭ１２２から受け取られるデータワードについて、２進小数点の場所を指示する。好ましくは、データ２進小数点２９２２値は、２進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、データ２進小数点２９２２は、データワードの最下位（least  significant）ビットのうちいくつが小数ビットであるか、すなわち２進小数点の右側にあるかを指示する。同様に、重み２進小数点２９２４値は、重みＲＡＭ１２４から受け取られる重みワードについて、２進小数点の場所を指示する。好ましくは、ＡＬＵ関数２９２６が積和又は累算器出力である場合、ＮＰＵ１２６は、累算器２０２に保持されている値について、２進小数点の右側にあるビットの数を、データ２進小数点２９２２と重み２進小数点２９２４との和として判定する。したがって、例えば、データ２進小数点２９２２の値が５で、重み２進小数点２９２４の値が３である場合には、累算器２０２内の値は、２進小数点の右側に８ビットを有する。ＡＬＵ関数２９２６が、累算器とデータワード／重みワードとの和／最大値、又はデータワード／重みワードのパススルーである場合、ＮＰＵ１２６は、累算器２０２に保持されている値について、２進小数点の右側にあるビットの数を、それぞれデータ／重みの２進小数点２９２２／２９２４として判定する。下記で図２９Ｂに関連して説明する代替実施形態では、個々のデータ２進小数点２９２２及び重み２進小数点２９２４を指定するのではなく、単一の累算器２進小数点２９２３が指定される。
【０１９１】
ＡＬＵ関数２９２６は、ＮＰＵ１２６のＡＬＵ２０４によって行われる関数を指定する。上記のように、ＡＬＵ関数２９２６は、これらに限定されないが、データワード２０９と重みワード２０３とを乗算して積を累算器２０２と累算すること、累算器２０２と重みワード２０３とを足すこと、累算器２０２とデータワード２０９とを足すこと、累算器２０２とデータワード２０９とのうちの最大値、累算器２０２と重みワード２０３とのうちの最大値、累算器２０２を出力すること、データワード２０９をパススルーすること、重みワード２０３をパススルーすること、ゼロを出力すること、を含むことができる。一実施形態では、ＡＬＵ関数２９２６は、ＮＮＵ開始命令によって指定され、実行命令（図示せず）に応答してＡＬＵ２０４によって使用される。一実施形態では、ＡＬＵ関数２９２６は、上記の積和命令やｍａｘｗａｃｃ命令などの個々のＮＮＵ命令によって指定される。
【０１９２】
丸め制御２９３２は、（図３０の）丸め器３００４によって使用されるべき丸めの形式を指定する。一実施形態では、指定されることが可能な丸めモードは、これらに限定されないが、丸めなし、最近接丸め、及び確率的丸めを含む。好ましくは、プロセッサ１００は、（図３０の）ランダムビットソース３００３を含み、ランダムビットソース３００３は、サンプリングされ、確率的丸めを行うのに使用されるランダムビット３００５を生成して、丸めバイアスの可能性を低減する。一実施形態では、丸めビット３００５が１で、スティッキービットがゼロの場合、ＮＰＵ１２６は、サンプリングされたランダムビット３００５が真であれば切り上げ、ランダムビット３００５が偽であれば切り上げない。一実施形態では、ランダムビットソース３００３は、半導体ダイオード又はレジスタ中の熱雑音など、プロセッサ１００のランダムな電気的特性のサンプリングに基づいてランダムビット３００５を生成するが、他の実施形態が企図される。
【０１９３】
活性化関数２９３４は、ＮＰＵ１２６の出力１３３を生成するために累算器２０２の値２１７に適用される関数を指定する。上記で説明し、下記でより詳細に説明するように、活性化関数２９３４には、これらに限定されないが、シグモイド、ハイパーボリックタンジェント、ソフトプラス、正規化、指定された２の累乗による除算、有効な除算を達成するためのユーザ指定の逆数値による乗算、全累算器のパススルー、及び、下記で詳細に説明する基準サイズとしての累算器のパススルーが含まれる。一実施形態では、活性化関数は、ＮＮＵ活性化関数命令によって指定される。或いは、活性化関数は、開始命令によって指定され、出力命令、例えば図４のアドレス４にあるＡＦＵ出力書き出し命令に応答して適用され、そのような実施形態では、図４のアドレス３の活性化関数命令は、出力命令に包含される。
【０１９４】
逆数２９４２値は、累算器２０２の値２１７の除算を達成するために、累算器２０２の値２１７で乗算される値を指定する。すなわち、ユーザは、実際の所望される除数の逆数として、逆数２９４２値を指定する。これは、例えば、本明細書に記載されるように畳み込み演算及びプーリング演算に関連して有用である。好ましくは、下記で図２９Ｃに関連してより詳細に説明するように、ユーザは、逆数２９４２値を２つの部分で指定する。一実施形態では、制御レジスタ１２７は、複数の組み込み除数値の１つによる除算をユーザが指定できるフィールド（図示せず）を含み、上記組み込み除数値は、一般に使用される畳み込みカーネルのサイズ、例えば９、２５、３６、又は４９である。そのような実施形態では、ＡＦＵ２１２は、累算器２０２の値２１７で乗算するために組み込み除数の逆数を記憶することができる。
【０１９５】
シフト量２９４４は、２の累乗による除算を達成するために、ＡＦＵ２１２のシフタが累算器２０２の値２１７を右にシフトするビット数を指定する。このこともまた、サイズが２の累乗である畳み込みカーネルに関連して有用である可能性がある。
【０１９６】
出力ＲＡＭ２９５２値は、データＲＡＭ１２２と重みＲＡＭ１２４のどちらが出力結果１３３を受け取るかを指定する。
【０１９７】
出力２進小数点２９５４値は、出力結果１３３について２進小数点の場所を指示する。好ましくは、出力２進小数点２９５４は、出力結果１３３の２進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、出力２進小数点２９５４は、出力結果１３３の最下位ビットのうちいくつが小数ビットであるか、すなわち２進小数点の右にあるかを指示する。ＡＦＵ２１２は、出力２進小数点２９５４の値に基づいて（並びに、大半の場合は、データ２進小数点２９２２、重み２進小数点２９２４、活性化関数２９３４、及び／又は構成２９０２の値に基づいて）、丸め、圧縮、飽和、及びサイズコンバージョンを行う。
【０１９８】
出力コマンド２９５６は、出力結果１３３の諸面を制御する。一実施形態では、ＡＦＵ２１２は、基準サイズの概念を用い、これは、構成２９０２で指定される幅のサイズ（ビット単位）の２倍である。したがって、例えば、構成２９０２が、データＲＡＭ１２２及び重みＲＡＭ１２４から受け取られる入力ワードのサイズが８ビットであると示唆する場合、基準サイズは１６ビットである。別の例として、構成２９０２が、データＲＡＭ１２２及び重みＲＡＭ１２４から受け取られる入力ワードのサイズが１６ビットであると示唆する場合、基準サイズは３２ビットである。本明細書に記載されるように、中間計算、例えばそれぞれ１０２４回及び５１２回のＮＮＵ積和命令の最大精度を保つために、累算器２０２のサイズは大きい（例えば、ナロー累算器２０２Ｂは２８ビットであり、ワイド累算器２０２Ａは４１ビットである）。その結果、累算器２０２の値２１７は、基準サイズよりも大きく（ビット単位で）、ＡＦＵ２１２（例えば、下記で図３０に関連して説明するＣＣＳ３００８）は、活性化関数２９３４の大半の値について（全累算器のパススルーを除く）、累算器２０２の値２１７を、基準サイズの値まで圧縮する。出力コマンド２９５６の第１の所定の値は、指定された活性化関数２９３４を行って、元の入力ワードと同じサイズ、すなわち基準サイズの半分である内部結果を生成し、その内部結果を出力結果１３３として出力するようにＡＦＵ２１２に命令する。出力コマンド２９５６の第２の所定の値は、指定された活性化関数２９３４を行って、元の入力ワードの２倍のサイズ、すなわち基準サイズである内部結果を生成し、その内部結果の下位半分を出力結果１３３として出力するようにＡＦＵ２１２に命令する。出力コマンド２９５６の第３の所定の値は、基準サイズの内部結果の上位半分を出力結果１３３として出力するようにＡＦＵ２１２に命令する。図８〜図１０に関連して上記で説明したように、出力コマンド２９５６の第４の所定の値は、累算器２０２の未処理最下位ワード（その幅は構成２９０２で指定される）を出力結果１３３として出力するようにＡＦＵ２１２に命令し、第５の所定の値は、累算器２０２の未処理中位（middle-significant）ワードを出力結果１３３として出力するようにＡＦＵ２１２に命令し、第６の所定の値は、累算器２０２の未処理最上位（most-significant）ワードを出力結果１３３として出力するようにＡＦＵ２１２に命令する。上記のように、全累算器２０２のサイズ又は基準サイズの内部結果を出力することは、例えば、プロセッサ１００の他の実行ユニット１１２がソフトマックス活性化関数などの活性化関数を行えるようにするために有利である可能性がある。
【０１９９】
図２９Ａ（及び図２９Ｂ及び図２９Ｃ）のフィールドは、制御レジスタ１２７に存在するものと記載されるが、他の実施形態では、それらのフィールドの１つ又は複数は、ＮＮＵ１２１の他の部分に存在してもよい。好ましくは、フィールドの多くは、ＮＮＵ命令自体に含められ、シーケンサ１２８によって復号されて、ＡＬＵ２０４及び／又はＡＦＵ２１２を制御する（図３４の）マイクロ操作３４１６を生成する。加えて、フィールドは、ＡＬＵ２０４及び／又はＡＦＵ２１２メディアレジスタ１１８を制御するメディアレジスタ１１８に記憶される（図３４の）マイクロ操作３４１４に含まれてもよい。そのような実施形態では、ＮＮＵ初期化命令の使用が最小になり、他の実施形態では、ＮＮＵ初期化命令が除去される。
【０２００】
上記のように、ＮＮＵ命令は、メモリオペランド（例えば、データＲＡＭ１２２及び／若しくは重みＲＡＭ１２４にあるワード）、又は循環されたオペランド（例えば、ｍｕｘ−ｒｅｇ２０８／７０５にあるもの）へのＡＬＵ演算を実行するよう指定することができる。一実施形態では、ＮＮＵ命令はさらに、オペランドを、活性化関数のレジスタからの出力として指定することができる（例えば、図３０のレジスタ３０３８の出力）。加えて、上記のように、ＮＮＵ命令は、データＲＡＭ１２２又は重みＲＡＭ１２４の現在の行アドレスを増分するよう指定することができる。一実施形態では、ＮＮＵ命令は、１以外の値による増分又は減分を達成するために現在の行に加算される即値符号付き整数差分値を指定することができる。
【０２０１】
次いで図２９Ｂを参照すると、代替的な一実施形態による、図１の制御レジスタ１２７の実施形態を図示するブロック図が示される。図２９Ｂの制御レジスタ１２７は、図２９Ａの制御レジスタ１２７に似ているが、図２９Ｂの制御レジスタ１２７は、累算器２進小数点２９２３を含んでいる。累算器２進小数点２９２３は、累算器２０２について２進小数点の場所を指示する。好ましくは、累算器２進小数点２９２３値は、２進小数点の場所について、右からのビット位置の数を指示する。別の表現をすると、累算器２進小数点２９２３は、累算器２０２の最下位ビットのうちいくつが小数ビットであるか、すなわち２進小数点の右であるかを指示する。この実施形態では、上記で図２９Ａの実施形態に関連して説明したように、累算器２進小数点２９２３は、暗黙的に決定されるのではなく、明示的に指定される。
【０２０２】
次いで図２９Ｃを参照すると、一実施形態による、２つの部分として記憶される図２９Ａの逆数２９４２の実施形態を図示するブロック図が示される。第１の部分２９６２は、ユーザが累算器２０２の値２１７で乗算することを望む真の逆数値の中の、抑制された先行ゼロの数２９６２を指示するシフト値である。先行ゼロの数は、２進小数点のすぐ右側にある連続したゼロの数である。第２の部分２６９４は、先行ゼロを抑制された逆数２９６４値、すなわち、すべての先行ゼロが除去された真の逆数値である。一実施形態では、抑制された先行ゼロの数２９６２は４ビットとして記憶され、先行ゼロを抑制された逆数２９６４値は、８ビットの符号なしの値として記憶される。
【０２０３】
例による説明として、ユーザが、累算器２０２の値２１７を４９の逆数で乗算したいと仮定する。１３個の小数ビットで表された４９の逆数の２進表現は、０．０００００１０１００１１１であり、５個の先行ゼロがある。この場合、ユーザは、抑制された先行ゼロの数２９６２に５の値を入れ、先行ゼロを抑制された逆数２９６４に１０１００１１１の値を入れる。逆数乗算器の「除算器Ａ」３０１４（図３０の）が、累算器２０２の値２１７と、先行ゼロを抑制された逆数２９６４の値とを乗算した後、除算器Ａは、得られた積を、抑制された先行ゼロの数２９６２だけ右シフトする。そのような実施形態は、有利に、逆数２９４２値を表すために使用されるビット数を比較的少なくして、高い精度を達成することができる。
【０２０４】
次いで図３０を参照すると、図２のＡＦＵ２１２の実施形態をより詳細に図示するブロック図が示される。ＡＦＵ２１２は、図１の制御レジスタ１２７；累算器２０２の値２１７を受け取る正形式変換器（ｐｏｓｉｔｉｖｅ  ｆｏｒｍ  ｃｏｎｖｅｒｔｅｒ：ＰＦＣ）及び出力２進小数点位置合わせ器（ｏｕｔｐｕｔ  ｂｉｎａｒｙ  ｐｏｉｎｔ  ａｌｉｇｎｅｒ：ＯＢＰＡ）３００２；累算器２０２の値２１７とＯＢＰＡ３００２によって外へシフトされたビット数の指示とを受け取る丸め器３００４；上記のようにランダムビット３００５を生成するランダムビットソース３００３；ＰＦＣ及びＯＢＰＡ３００２の出力と丸め器３００４の出力とを受け取る第１のｍｕｘ３００６；第１のｍｕｘ３００６の出力を受け取る、基準サイズへの圧縮器（ｃｏｍｐｒｅｓｓｏｒ  ｔｏ  ｃａｎｏｎｉｃａｌ  ｓｉｚｅ：ＣＣＳ）及び飽和器３００８；ＣＣＳ及び飽和器３００８の出力を受け取る、ビット選択器及び飽和器３０１２；ＣＣＳ及び飽和器３００８の出力を受け取る正規化器（rectifier）３０１８；ＣＣＳ及び飽和器３００８の出力を受け取る逆数乗算器３０１４；ＣＣＳ及び飽和器３００８の出力を受け取る右シフタ３０１６；ビット選択器及び飽和器３０１２の出力を受け取るハイパーボリックタンジェント（ｔａｎｈ）モジュール３０２２；ビット選択器及び飽和器３０１２の出力を受け取るシグモイドモジュール３０２４；ビット選択器及び飽和器３０１２の出力を受け取るソフトプラスモジュール３０２６；ｔａｎｈモジュール３０２２、シグモイドモジュール３０２４、ソフトプラスモジュール３０２６、正規化器３１０８、逆数乗算器３０１４、及び右シフタ３０１６の出力と、ＣＣＳ及び飽和器３００８のパススルーされた基準サイズ出力３０２８と、を受け取る第２のｍｕｘ３０３２；第２のｍｕｘ３０３２の出力を受け取る符号復元器３０３４；符号復元器３０３４の出力を受け取る、サイズ変換器及び飽和器３０３６；サイズ変換器及び飽和器３０３６の出力と累算器の出力２１７とを受け取る第３のｍｕｘ３０３７；並びに、ｍｕｘ３０３７の出力を受け取り、出力が図１の結果１３３である出力レジスタ３０３８、を含む。
【０２０５】
ＰＦＣ及びＯＢＰＡ３００２は、累算器２０２の値２１７を受け取る。好ましくは、累算器２０２の値２１７は、上記のように最大精度値である。すなわち、累算器２０２は、整数乗算器２４２によって生成された一連の積の、整数加算器２４４によって生成される和である累算値を保持するのに十分なビット数の記憶を有し、乗算器２４２の個々の積又は加算器２４４の和のビットのうちいずれも破棄することがなく、よって精度の低下がない。好ましくは、累算器２０２は、少なくとも、ＮＮＵ１２１が行うようにプログラムされることが可能な最大数の積の累算を保持するのに十分なビット数を有する。例えば、図４のプログラムを参照して説明すると、ワイド構成のときにＮＮＵ１２１が行うようにプログラム可能な積の累算の最大数は５１２であり、累算器２０２のビット幅は４１である。別の例として、図２０のプログラムを参照して説明すると、ナロー構成のときにＮＮＵ１２１が行うようにプログラム可能な積累算の最大数は１０２４であり、累算器２０２のビット幅は２８である。一般化すると、最大精度の累算器２０２は少なくともＱビットを含み、Ｑは、Ｍとｌｏｇ２Ｐとの和であり、Ｍは、乗算器２４２の整数積のビット幅であり（例えば、ナロー乗算器２４２では１６ビット、又はワイド乗算器２４２では３２ビット）、Ｐは、累算器２０２中に累算されることが可能な整数積の最大許容数である。好ましくは、積累算の最大数は、ＮＮＵ１２１のプログラマへのプログラミングの仕様を介して指定される。一実施形態では、シーケンサ１２８は、データワード／重みワード２０６／２０７の行をデータＲＡＭ／重みＲＡＭ１２２／１２４からロードする、１つの前の積和命令（例えば、図４のアドレス１にある命令）を仮定して、積和ＮＮＵ命令（例えば、図４のアドレス２にある命令）のカウントの最大値、例えば５１１を強制する。
【０２０６】
有利な点として、許容される累算の最大数に対して最大精度値を累算するのに十分に大きいビット幅を持つ累算器２０２を含めることにより、ＮＰＵ１２６のＡＬＵ２０４部分の設計が簡略化される。詳細には、それにより、整数加算器２４４によって生成される和を飽和させる論理の必要性が緩和され、上記生成される和は、より小さい累算器であればオーバーフローを生じさせる可能性があり、また、累算器の２進小数点の場所を追跡して、オーバーフローが発生したかどうかを決定して、飽和が必要であったかを知ることを必要とする可能性がある。非最大精度の累算器を含んでいたが、代わりに非最大精度の累算器のオーバーフローに対処する飽和論理を含んでいる設計の問題を、例として説明するために、以下を仮定する。
（１）データワード値の範囲は０と１の間であり、すべての記憶ビットを使用して小数ビットを記憶する。重みワードの範囲は−８と＋８の間であり、記憶ビットのうち３ビットを除くすべてのビットを使用して小数ビットを記憶する。そして、ハイパーボリックタンジェント活性化関数に入力するための累算値の範囲は−８と＋８の間であり、記憶ビットのうち３ビットを除くすべてのビットを使用して小数ビットを記憶する。
（２）累算器のビット幅は、非最大精度である（例えば、積のビット幅のみ）。
（３）累算器が最大精度であったと仮定すると、最終的な累算値は、−８と＋８の間のいずれかの値（例えば、＋４．２）になるが、列中の「点Ａ」よりも前の積は、より高頻度に正になる傾向があり、対して点Ａより後の積はより高頻度に負になる傾向がある。
このような状況では、不正確な結果（すなわち＋４．２以外の結果）が得られる可能性がある。その理由は、点Ａより前のいずれかの点で、累算器が、例えば＋８．２のようなより大きな値でなければならないときに最大の＋８の値に飽和される可能性があり、それにより、残りの＋０．２の損失を引き起こす可能性があるためである。累算器は、より多くの積の累算について飽和値のままになる可能性すらあり、その結果、さらに多くの正の値が失われる可能性がある。そのため、累算器の最終値は、累算器が最大精度のビット幅を持っていた場合になるはずよりも小さな数（すなわち、＋４．２未満）になる可能性がある。
【０２０７】
ＰＦＣ３００２は、累算器２０２の値２１７が負である場合には、値を正形式に変換し、元の値が正であったか又は負であったかを指示する付加ビットを生成し、そのビットは、値と共にＡＦＵ２１２のパイプラインで渡される。正形式に変換することで、ＡＦＵ２１２による後の動作を簡略化する。例えば、それにより、正の値だけがｔａｎｈ３０２２及びシグモイド３０２４モジュールに入力されることが可能になり、したがって、それらのモジュールを簡略化することができる。加えて、このことは、丸め器３００４及び飽和器３００８を簡略化する。
【０２０８】
ＯＢＰＡ３００２は、正形式の値を右にシフト又はスケーリングして、制御レジスタ１２７中で指定される出力２進小数点２９５４と位置合わせする。好ましくは、ＯＢＰＡ３００２は、出力の小数ビットの数（例えば、出力２進小数点２９５４によって指定される）を、累算器２０２の値２１７の小数ビットの数（例えば、累算器２進小数点２９２３によって指定されるか、又はデータ２進小数点２９２２と重み２進小数点２９２４との和）から引いた差として、シフト量を算出する。したがって、例えば、累算器２０２の２進小数点２９２３が８で（上記の例のように）、出力の２進小数点２９５４が３である場合には、ＯＢＰＡ３００２は、正形式の値を右に５ビットシフトして、ｍｕｘ３００６及び丸め器３００４に提供される結果を生成する。
【０２０９】
丸め器３００４は、累算器２０２の値２１７を丸める。好ましくは、丸め器３００４は、ＰＦＣ及びＯＢＰＡ３００２によって生成された正形式の値を丸めたバージョンを生成し、その丸められたバージョンをｍｕｘ３００６に提供する。丸め器３００４は、上記の丸め制御２９３２に従って丸めを行い、この丸めは、上記及び下記で説明するように、ランダムビット３００５を使用した確率的丸めを含むことができる。ｍｕｘ３００６は、丸め制御２９３２（本明細書に記載されるように確率的丸めを含み得る）に基づいて、自身の入力のうち１つ、すなわち、ＰＦＣ及びＯＢＰＡ３００２からの正形式の値か、又は丸め器３００４からのその値の丸められたバージョンかのどちらかを選択し、選択した値をＣＣＳ及び飽和器３００８に提供する。好ましくは、丸め制御２９３２が丸めなしを指定する場合、ｍｕｘ３００６は、ＰＦＣ及びＯＢＰＡ３００２の出力を選択し、それ以外の場合、丸め器３００４の出力を選択する。ＡＦＵ２１２が追加的な丸めを行う他の実施形態が企図される。例えば、一実施形態では、ビット選択器３０１２が、ＣＣＳ及び飽和器３００８の出力のビットを圧縮するときに、失われた低次ビットに基づいて丸めを行う（下記で説明する）。別の例として、一実施形態では、逆数乗算器３０１４（下記で説明する）の積が丸められる。さらに別の例として、一実施形態では、サイズ変換器３０３６が、適正な出力サイズに変換するときに丸めを行い（下記で説明する）、これは、丸めの決定で使用された低次ビットを失うことを伴う場合もある。
【０２１０】
ＣＣＳ３００８は、ｍｕｘ３００６の出力値を基準サイズに圧縮する。したがって、例えば、ＮＰＵ１２６がナロー構成又はじょうご構成２９０２である場合、ＣＣＳ３００８は、２８ビットのｍｕｘ３００６の出力値を１６ビットに圧縮し、ＮＰＵ１２６がワイド構成２９０２である場合、ＣＣＳ３００８は、４１ビットのｍｕｘ３００６の出力値を３２ビットに圧縮する。ただし、基準サイズに圧縮する前に、事前に圧縮された値が、基準形式で表すことが可能な最大値よりも大きい場合、飽和器３００８が、事前に圧縮された値を飽和させて、基準形式で表すことが可能な最大値にする。例えば、最上位の基準形式ビットの左側にある事前に圧縮された値のビットのいずれかが１の値を有する場合には、飽和器３００８は、最大値に（例えば、すべて１に）飽和させる。
【０２１１】
好ましくは、ｔａｎｈ３０２２、シグモイド３０２４、及びソフトプラス３０２６モジュールは、参照表、例えば、プログラム可能ロジックアレイ（ＰＬＡ）、読み出し専用メモリ（ＲＯＭ）、組み合わせ論理ゲートなどを備える。一実施形態では、モジュール３０２２／３０２４／３０２６を簡略化してサイズを減らすために、それらには、３．４の形式、すなわち３つの整数ビットと４つの小数ビットを持つ入力値が提供され、すなわち、入力値は、２進小数点の右側に４ビット、及び２進小数点の左側に３ビットを有する。それらの値が選択される理由は、３．４形式の入力値範囲（−８、＋８）の極値では、出力値が、その最小値／最大値に漸近的に近づくためである。ただし、２進小数点を異なる場所に置く、例えば４．３形式又は２．５形式の他の実施形態が企図される。ビット選択器３０１２は、３．４形式の基準を満たすＣＣＳ及び飽和器３００８の出力のビットを選択し、このことは圧縮を含み、すなわち一部のビットが失われる。これは、基準形式の方がビット数が多いためである。ただし、ＣＣＳ及び飽和器３００８の出力値を選択／圧縮する前に、事前に圧縮された値が３．４形式で表すことが可能な最大値よりも大きい場合、飽和器３０１２が、事前に圧縮された値を、３．４形式で表すことが可能な最大値に飽和させる。例えば、３．４形式の最上位ビットの左側にある事前に圧縮された値のビットのいずれかが１の値を有する場合、飽和器３０１２は、最大値に（例えば、すべて１に）飽和させる。
【０２１２】
ｔａｎｈ３０２２、シグモイド３０２４、及びソフトプラス３０２６モジュールは、各自の活性化関数（上記で説明した）を、ＣＣＳ及び飽和器３００８から出力された３．４形式の値に行って、結果を生成する。好ましくは、ｔａｎｈ３０２２及びシグモイド３０２４モジュールの結果は、０．７形式の７ビットの結果であり、すなわち、ゼロ個の整数ビット及び７つの小数ビットがあり、すなわち、入力値は２進小数点の右側に７ビットを有する。好ましくは、ソフトプラスモジュール３０２６の結果は、３．４形式の７ビットの結果であり、例えば、モジュール３０２６への入力と同じ形式である。好ましくは、ｔａｎｈ３０２２、シグモイド３０２４、及びソフトプラス３０２６モジュールの出力は、基準形式に合わせて拡張され（例えば、必要に応じて先行ゼロが追加され）、出力２進小数点２９５４の値によって指定される２進小数点を持つように位置合わせされる。
【０２１３】
正規化器３０１８は、ＣＣＳ及び飽和器３００８の出力値の正規化バージョンを生成する。すなわち、ＣＣＳ及び飽和器３００８の出力値（その符号は上記のようにして渡される）が負である場合、正規化器３０１８はゼロの値を出力し、それ以外の場合、正規化器３０１８は自身の入力値を出力する。好ましくは、正規化器３０１８の出力は、基準形式であり、出力２進小数点２９５４値によって指定される２進小数点を有する。
【０２１４】
逆数乗算器３０１４は、ＣＣＳ及び飽和器３００８の出力に、逆数値２９４２で指定されるユーザ指定の逆数値を乗算して基準サイズの積を生成し、これは、効果的に、ＣＣＳ及び飽和器３００８の出力と、逆数２９４２値の逆数である除数との商である。好ましくは、逆数乗算器３０１４の出力は、基準形式であり、出力２進小数点２９５４値によって指定される２進小数点を有する。
【０２１５】
右シフタ３０１６は、ＣＣＳ及び飽和器３００８の出力を、シフト量の値２９４４で指定される、ユーザ指定のビット数だけシフトして、基準サイズの商を生成する。好ましくは、右シフタ３０１６の出力は、基準形式であり、出力２進小数点２９５４値によって指定される２進小数点を有する。
【０２１６】
ｍｕｘ３０３２は、活性化関数２９３４値によって指定される適切な入力を選択し、選択したものを符号復元器３０３４に提供し、符号復元器３０３４は、元の累算器２０２の値２１７が負値であった場合、ｍｕｘ３０３２の正形式の出力を負形式に、例えば２の補数の形式に変換する。
【０２１７】
サイズ変換器３０３６は、出力コマンド２９５６の値に基づいて、符号復元器３０３４の出力を適切なサイズに変換する。出力コマンド２９５６の値については、上記で図２９Ａに関連して説明している。好ましくは、符号復元器３０３４の出力は、出力２進小数点２９５４値によって指定される２進小数点を有する。好ましくは、出力コマンド２９５６の第１の所定の値について、サイズ変換器３０３６は、符号復元器３０３４の出力の上位半分のビットを破棄する。さらに、符号復元器３０３４の出力が正で、且つ構成２９０２で指定されるワードサイズで表すことが可能な最大値を超えているか、又は、負で、且つそのワードサイズで表すことが可能な最小値未満である場合、飽和器３０３６は、出力を、当該ワードサイズで表すことが可能なそれぞれの最大値又は最小値に飽和させる。第２及び第３の所定の値の場合、サイズ変換器３０３６は、符号復元器３０３４の出力をパススルーする。
【０２１８】
ｍｕｘ３０３７は、出力コマンド２９５６に基づいて、サイズ変換器及び飽和器３０３６の出力か、又は累算器２０２の出力２１７かのどちらかを、出力レジスタ３０３８に提供するために選択する。より具体的には、出力コマンド２９５６の第１及び第２の所定の値について、ｍｕｘ３０３７は、サイズ変換器及び飽和器３０３６の出力の下位ワード（そのサイズは構成２９０２によって指定される）を選択する。第３の所定の値について、ｍｕｘ３０３７は、サイズ変換器及び飽和器３０３６の出力の上位ワードを選択する。第４の所定の値について、ｍｕｘ３０３７は、未処理の累算器２０２の値２１７の下位ワードを選択し、第５の所定の値について、ｍｕｘ３０３７は、未処理の累算器２０２の値２１７の中位ワードを選択し、第６の所定の値について、ｍｕｘ３０３７は、未処理の累算器２０２の値２１７の上位ワードを選択する。上記のように、好ましくは、ＡＦＵ２１２は、未処理の累算器２０２の値２１７の上位ワードの上位ビットをパディングしてゼロにする。
【０２１９】
次いで図３１を参照すると、図３０のＡＦＵ２１２の動作の例が示される。示されるように、構成２９０２は、ＮＰＵ１２６のナロー構成に設定されている。加えて、符号付きデータ２９１２及び符号付き重み２９１４値は真である。加えて、データ２進小数点２９２２値は、データＲＡＭ１２２ワードの２進小数点が、２進小数点の右に７ビットがあるように配置されることを指示し、ＮＰＵ１２６の１つによって受け取られた第１のデータワードの例示的な値が、０．１００１１１０と示されている。さらには、重み２進小数点２９２４値は、重みＲＡＭ１２４のワードの２進小数点が、２進小数点の右に３ビットがあるように配置されることを指示し、ＮＰＵ１２６の１つによって受け取られた第１のデータワードの例示的な値が、００００１．０１０と示されている。
【０２２０】
第１のデータワードと重みワードとの１６ビットの積（累算器２０２の初期ゼロ値と共に累算されている）は、００００００．１１００００１１００と示されている。データ２進小数点２９１２が７であり、重み２進小数点２９１４が３であるため、示唆される累算器２０２の２進小数点は、２進小数点の右に１０ビットがあるように配置される。ナロー構成の場合、累算器２０２は、この例示的実施形態では、２８ビット幅である。この例では、すべてのＡＬＵ演算（例えば、図２０の１０２４回の積和すべて）が行われた後の累算器２０２の０００００００００００００００００１．１１０１０１０１００という値２１７が示されている。
【０２２１】
出力２進小数点２９５４値は、出力の２進小数点が、２進小数点の右に７ビットがあるように配置されることを指示している。したがって、ＯＢＰＡ３００２及びＣＣＳ３００８を通過した後に、累算器２０２の値２１７は、スケーリングされ、丸められ、及び圧縮されて、００００００００１．１１０１０１１の基準形式値にされる。この例では、出力２進小数点の場所は７つの小数ビットを指示し、累算器２０２の２進小数点の場所は１０個の小数ビットを指示する。したがって、ＯＢＰＡ３００２は、３の差を算出し、累算器２０２の値２１７を、右に３ビットシフトすることによってスケーリングする。これは、図３１では、累算器２０２の値２１７の最下位３ビット（２進の１００）が失われることによって示されている。さらにこの例では、丸め制御２９３２値は、確率的丸めを使用することを指示しており、この例では、サンプリングされたランダムビット３００５が真であると仮定される。その結果最下位ビットが切り上げられたが、これは、上記の説明によれば、累算器２０２の値２１７の丸めビット（累算器２０２の値２１７のスケーリングによってシフトされて消えた３ビットの最上位ビット）が１であり、スティッキービット（累算器２０２の値２１７のスケーリングによってシフトされて消えた３ビットのうち最下位２ビットのブールＯＲ）がゼロであったためである。
【０２２２】
活性化関数２９３４は、この例ではシグモイド関数の使用を指示している。その結果、ビット選択器３０１２は、基準形式値のビットを選択し、そのため、上記のようにシグモイドモジュール３０２４への入力が３つの整数ビット及び４つの小数ビットを持つようになり、すなわち、示されるように００１．１１０１の値となる。シグモイドモジュール３０２４は、示されるように、０００００００００．１１０１１１０の基準形式にされた値を出力する。
【０２２３】
この例における出力コマンド２９５６は、第１の所定の値を指定し、すなわち構成２９０２によって指示されるワードサイズを出力することを指定し、この場合のワードサイズはナローワード（８ビット）である。その結果、サイズ変換器３０３６は、基準シグモイド出力値を、２進小数点の右側に７ビットがあるように配置された、示唆される２進小数点を持つ８ビット量に変換して、示されるように０１１０１１１０の出力をもたらす。
【０２２４】
次いで図３２を参照すると、図３０のＡＦＵ２１２の動作の第２の例が示される。図３２の例は、活性化関数２９３４が累算器２０２の値２１７を基準サイズでパススルーすることを指示する場合のＡＦＵ２１２の動作を図示している。示されるように、構成２９０２は、ＮＰＵ１２６のナロー構成に設定されている。
【０２２５】
この例では、累算器２０２は２８ビット幅であり、累算器２０２の２進小数点は、２進小数点の右側に１０ビットがあるように配置される（この理由は、上記のように、一実施形態によれば、データ２進小数点２９１２と重み２進小数点２９１４との和が１０であるためか、又は、代替実施形態によれば、累算器の２進小数点２９２３が１０の値を持つように明示的に指定されるためか、のどちらかである）。この例では、図３２は、すべてのＡＬＵ演算が行われた後の累算器２０２の０００００１１００００００１１０１１．１１０１１１１０１０という値２１７を示している。
【０２２６】
この例では、出力２進小数点２９５４値は、出力の２進小数点が、２進小数点の右側に４ビットがあるように配置されることを指示している。したがって、ＯＢＰＡ３００２及びＣＣＳ３００８を通過した後、示されるように、累算器２０２の値２１７が飽和及び圧縮されて１１１１１１１１１１１１．１１１１の基準形式値にされ、これが、ｍｕｘ３０３２によって基準サイズのパススルー値３０２８として受け取られる。
【０２２７】
この例では、２つの出力コマンド２９５６が示されている。第１の出力コマンド２９５６は、第２の所定の値を指定し、すなわち基準形式サイズの下位ワードを出力することを指定している。構成２９０２によって指示されるサイズはナローワード（８ビット）であり、これは１６ビットの基準サイズを示唆することから、サイズ変換器３０３６は、示されるように、基準サイズのパススルー値３０２８の下位８ビットを選択して、１１１１１１１１の８ビット値を生じる。第２の出力コマンド２９５６は、第３の所定の値を指定し、すなわち基準形式サイズの上位ワードを出力することを指定している。その結果、サイズ変換器３０３６は、示されるように、基準サイズのパススルー値３０２８の上位８ビットを選択して、１１１１１１１１の８ビット値を生じる。
【０２２８】
次いで図３３を参照すると、図３０のＡＦＵ２１２の動作の第３の例が示される。図３３の例は、活性化関数２９３４が、未処理の累算器２０２の値２１７をすべてパススルーすることを指示する場合のＡＦＵ２１２の動作を図示している。示されるように、構成２９０２は、ＮＰＵ１２６のワイド構成（例えば、１６ビットの入力ワード）に設定されている。
【０２２９】
この例では、累算器２０２は４１ビット幅であり、累算器２０２の２進小数点は、２進小数点の右に８ビットがあるように配置されている（この理由は、上記のように、一実施形態によれば、データ２進小数点２９１２と重み２進小数点２９１４との和が８であるためか、又は代替実施形態によれば、累算器の２進小数点２９２３が８の値を持つように明示的に指定されるためか、のどちらかである）。この例では、図３３は、すべてのＡＬＵ演算が行われた後の累算器２０２の００１０００００００００００００００００１１００００００１１０１１．１１０１１１１０という値２１７を示している。
【０２３０】
この例では、３つの出力コマンド２９５６が示されている。第１の出力コマンド２９５６は、第４の所定の値を指定し、すなわち未処理累算器２０２値の下位ワードを出力することを指定し、第２の出力コマンド２９５６は、第５の所定の値を指定し、すなわち未処理累算器２０２値の中位ワードを出力することを指定し、第３の出力コマンド２９５６は、第６の所定の値を指定し、すなわち未処理累算器２０２値の上位ワードを出力することを指定している。構成２９０２で指示されるサイズがワイドワード（１６ビット）であるため、図３３は、第１の出力コマンド２９５６に応答して、ｍｕｘ３０３７が０００１１０１１１１０１１１１０の１６ビット値を選択し、第２の出力コマンド２９５６に応答して、ｍｕｘ３０３７が０００００００００００１１０００の１６ビット値を選択し、第３の出力コマンド２９５６に応答して、ｍｕｘ３０３７が、０００００００００１００００００の１６ビット値を選択することを示している。
【０２３１】
上述のように、有利な点として、ＮＮＵ１２１は、浮動小数点データではなく、整数データに演算する。これには、各ＮＰＵ１２６、又は少なくともＡＬＵ２０４部分を簡略化するという利点がある。例えば、ＡＬＵ２０４は、浮動小数点実装であれば乗算器２４２について被乗数の指数を加算するために必要とされるであろう加算器を、含む必要がない。同様に、ＡＬＵ２０４は、浮動小数点実装であれば加算器２３４について加数の２進小数点を位置合わせするために必要とされるであろうシフタを、含む必要がない。当業者が理解するように、浮動小数点ユニットは一般に非常に複雑である。そのため、上記はＡＬＵ２０４の簡略化の例に過ぎず、関連する２進小数点をユーザが指定できるようにするハードウェアの固定小数点支援を用いるこの整数実施形態によって、他の簡略化が享受される。ＡＬＵ２０４が整数ユニットであることの結果、有利な点として、浮動小数点の実施形態に比べてＮＰＵ１２６がより小さく（且つより高速に）なる可能性があり、それにより、さらに、有利な点として、ＮＰＵ１２６の大きなアレイをＮＮＵ１２１に組み込むことが容易になる。ＡＦＵ２１２部分は、好ましくは、累算値中で望まれるユーザ指定の小数ビットの数と、出力値中で望まれる小数ビットの数とに基づいて、累算器２０２の値２１７のスケーリング及び飽和を扱う。有利な点として、ＡＦＵ２１２の固定小数点ハードウェア支援の追加的な複雑性と、それに伴うサイズ、電力消費、及び／又は時間の増大は、生じた場合には、例えば図１１の実施形態に関連して説明するように、ＡＦＵ２１２をＡＬＵ２０４部分間で共有することによって償却される可能性がある。これは、ＡＦＵ１１１２の数は、共有実施形態では減らすことができるためである。
【０２３２】
有利な点として、本明細書に記載される実施形態は、浮動小数点の算術ユニットと比べて、ハードウェアの整数算術ユニットの複雑性が低減することに伴う利益の多くを享受することができ、一方で、小数、すなわち２進小数点を持つ数に対する算術演算を依然として提供する。浮動小数点算術の利点は、個々の値が非常に広い値の範囲（効果的に、非常に大きい可能性のある指数範囲のサイズによってのみ制限される）内のいずれかの値であり得るデータへの算術演算に対応できることである。すなわち、各浮動小数点数は、その独自の、可能性として固有の指数値を有する。ただし、本明細書に記載される実施形態は、入力データが高度に並列化されており、それらの値が比較的狭い範囲内にあって、すべての並列化された値の「指数」が同じである場合がある特定の応用例が存在する、という事実を認識し、活用する。したがって、そのような実施形態は、ユーザが、すべての入力値及び／又は累算値に対して２進小数点の場所を一回指定することを可能にする。同様に、そのような実施形態は、並列化された出力の類似する範囲特性を認識及び活用して、ユーザが、すべての出力値に対して２進小数点の場所を一回指定することを可能にする。人工ニューラルネットワークはそのような応用例の一例であるが、それらの実施形態を用いて他の応用例のための計算を行うことができる。個々の各入力数に対してではなく、入力に対して２進小数点の場所を一回指定することにより、それらの実施形態は、浮動小数点実装と比べてメモリ空間のより効率的な使用をもたらし（例えば、必要とするメモリの減少）、且つ／又は、ほぼ同じ量のメモリに対して精度の向上をもたらす。これは、浮動小数点実装であれば指数に使用されることになるビットが、より高い大きさの精度を指定するために使用できるためである。
【０２３３】
さらに有利な点として、上記実施形態は、整数演算の大きな連続の累算中に経験し得る潜在的な精度の低下（例えば、より低い有意性（significance）の小数ビットのオーバーフロー又は損失）を認識し、主として、精度の低下を回避するのに十分に大きい累算器の形で解決法を提供する。
【０２３４】
ＮＮＵマイクロ操作の直接実行
次いで図３４を参照すると、図１のプロセッサ１００、及び図１のＮＮＵ１２１のより詳細な部分を図示するブロック図が示される。ＮＮＵ１２１は、ＮＰＵ１２６のパイプラインステージ３４０１を含んでいる。パイプラインステージ３４０１は、ステージングレジスタによって分離され、ブール論理ゲート、多重化器、加算器、乗算器、比較器など、本明細書に記載されるＮＰＵ１２６の演算を達成する組み合わせ論理を含んでいる。パイプラインステージ３４０１は、ｍｕｘ３４０２からマイクロ操作３４１８を受け取る。マイクロ操作３４１８は、パイプラインステージ３４０１を流れて行き、それらステージの組み合わせ論理を制御する。マイクロ操作３４１８は、ビットの集まりである。好ましくは、マイクロ操作３４１８は、例えば、とりわけ、データＲＡＭ１２２のメモリアドレス１２３、重みＲＡＭ１２４のメモリアドレス１２５、プログラムメモリ１２９のメモリアドレス１３１、ｍｕｘ−ｒｅｇ２０８／７０５の制御信号２１３／７１３、ｍｕｘ８０２の制御信号８０３、及び制御レジスタ１２７のフィールドのうち（例えば、図２９Ａ〜図２９Ｃのうち）多く、のビットを含む。一実施形態では、マイクロ操作３４１８は約１２０ビットからなる。ｍｕｘ３４０２は、３つの異なるソースからマイクロ操作を受け取り、これらのうち１つを、パイプラインステージ３４０１に提供するためのマイクロ操作３４１８として選択する。
【０２３５】
ｍｕｘ３４０２へのマイクロ操作ソースの１つは、図１のシーケンサ１２８である。シーケンサ１２８は、プログラムメモリ１２９から受け取られたＮＮＵ命令を復号し、それに応答して、ｍｕｘ３４０２の第１の入力に提供されるマイクロ操作３４１６を生成する。
【０２３６】
ｍｕｘ３４０２への第２のマイクロ操作ソースは、図１のリザベーションステーション１０８からのマイクロ命令１０５を、ＧＰＲ１１６及びメディアレジスタ１１８からのオペランドと共に受け取る復号器３４０４である。好ましくは、マイクロ命令１０５は、上記のように、ＭＴＮＮ命令１４００及びＭＦＮＮ命令１５００を翻訳するのに応答して、命令トランスレータ１０４によって生成される。マイクロ命令１０５は、即値フィールドを含むことができ、このフィールドは、特定の関数（ＭＴＮＮ命令１４００又はＭＦＮＮ命令１５００によって指定された関数）を指定し、この特定の関数は、上記のように、プログラムメモリ１２９内のプログラムの実行を開始及び停止すること、メディアレジスタ１１８からマイクロ操作を直接実行すること、又はＮＮＵ１２１のメモリの読み出し／書き込みなどである。復号器３４０４は、マイクロ命令１０５を復号し、それに応答して、ｍｕｘ３４０２の第２の入力に提供されるマイクロ操作３４１２を生成する。好ましくは、ＭＴＮＮ／ＭＦＮＮ１４００／１５００命令のいくつかの関数１４３２／１５３２に応答して、復号器３４０４は、パイプライン３４０１に送り出すマイクロ操作３４１２を生成する必要がなく、例えば、制御レジスタ１２７への書き込み、プログラムメモリ１２９にあるプログラムの実行の開始、プログラムメモリ１２９にあるプログラムの実行の一時停止、プログラムメモリ１２９内のプログラムの実行の完了の待機、状態レジスタ１２７からの読み出し、及び、ＮＮＵ１２１のリセットである。
【０２３７】
ｍｕｘ３４０２への第３のマイクロ操作ソースは、メディアレジスタ１１８自体である。好ましくは、上記で図１４に関連して説明したように、ＭＴＮＮ命令１４００は、メディアレジスタ１１８からｍｕｘ３４０２の第３の入力に提供されるマイクロ操作３４１４を直接実行するようにＮＮＵ１２１に命令する関数を指定することができる。アーキテクチャメディアレジスタ１１８から提供されるマイクロ操作３４１４の直接の実行は、検査、例えばＮＮＵ１２１の組み込み自己テスト（ＢＩＳＴ）やデバッグに特に有用である可能性がある。
【０２３８】
好ましくは、復号器３４０４は、ｍｕｘ３４０２の選択を制御するモードインディケータ３４２２を生成する。ＭＴＮＮ命令１４００が、プログラムメモリ１２９からのプログラムの稼働を開始する関数を指定するとき、復号器３４０４は、エラーが発生するまで、又は、復号器３４０４が、プログラムメモリ１２９からのプログラムの実行を停止する関数を指定するＭＴＮＮ命令１４００に遭遇するまで、ｍｕｘ３４０２にシーケンサ１２８からのマイクロ操作３４１６を選択させるモードインディケータ３４２２値を生成する。ＭＴＮＮ命令１４００が、メディアレジスタ１１８から提供されるマイクロ操作３４１４を直接実行するようにＮＮＵ１２１に命令する関数を指定するとき、復号器３４０４は、ｍｕｘ３４０２に、指定されたメディアレジスタ１１８からのマイクロ操作３４１４を選択させるモードインディケータ３４２２値を生成する。それ以外の場合、復号器３４０４は、ｍｕｘ３４０２に復号器３４０４からのマイクロ操作３４１２を選択させるモードインディケータ３４２２値を生成する。
【０２３９】
可変レートのニューラルネットワークユニット
ＮＮＵ１２１がプログラムを稼働させ、その後、次のプログラムを稼働できるようになる前、ＮＮＵ１２１が必要とする何らかのことをプロセッサ１００が行うのを待って、アイドル状態になる状況があり得る。例えば、図３〜図６Ａに関連して記載した状況と似た、ＮＮＵ１２１が、積和活性化関数プログラム（フィードフォワードニューラルネットワーク層プログラムと呼ばれる場合もある）の２つ以上の連続したインスタンスを稼働させる状況を仮定する。プロセッサ１００が、ＮＮＵプログラムの次の稼働で使用されることになる５１２ＫＢ分の重み値を重みＲＡＭ１２４に書き込むには、ＮＮＵ１２１がそのプログラムを稼働させるためにかかる時間よりも、大幅に長い時間がかかる可能性がある。別の表現をすると、ＮＮＵ１２１はプログラムを比較的短い時間量で稼働させ、その後、プロセッサ１００がそのプログラムの次の稼働のために次の重み値を重みＲＡＭ１２４に書き込み終える間、アイドル状態になる可能性がある。この状況を図３６Ａに視覚的に図示しており、これについては下記でより詳細に説明する。そのような状況では、ＮＮＵ１２１をより遅いレートで稼働させ、より長い時間をかけてプログラムを実行し、それにより、ＮＮＵ１２１がプログラムを稼働させるために必要とされるエネルギー消費をより長い時間にわたって分散させると有利である可能性があり、そのようにすると、一般に、ＮＮＵ１２１及び恐らくはプロセッサ１００の温度をより低く保つ傾向がある可能性がある。この状況を緩和モードと呼び、図３６Ｂに視覚的に図示している。これについては下記でより詳細に説明する。
【０２４０】
次いで図３５を参照すると、可変レートのＮＮＵ１２１を含むプロセッサ１００を図示するブロック図が示される。プロセッサ１００は、図１のプロセッサ１００と多くの点で似ており、同様の参照符号を付した要素は類似する。図３５のプロセッサ１００は、クロック生成論理３５０２をさらに含み、これは、プロセッサ１００の機能ユニット、すなわち、命令取出しユニット１０１、命令キャッシュ１０２、命令トランスレータ１０４、リネームユニット１０６、リザベーションステーション１０８、ＮＮＵ１２１、その他の実行ユニット１１２、メモリサブシステム１１４、汎用レジスタ１１６、及びメディアレジスタ１１８に結合されている。クロック生成論理３５０２は、基本クロック（primary  clock）レート又はクロック周波数を有するクロック信号を生成する、位相ロックループ（ＰＬＬ）などのクロック生成器を含む。例えば、基本クロックレートは、１ＧＨｚ、１．５ＧＨｚ、２ＧＨｚなどであり得る。クロックレートは、１秒当たりのクロック信号のサイクル数、例えばハイ状態とロー状態との間の振動数を指示する。好ましくは、クロック信号は、均衡のとれたデューティサイクルを有する、すなわちサイクルの半分がハイでサイクルのもう半分がローであるか、或いは、クロック信号は、クロック信号がロー状態よりも長くハイ状態にあるか又はその逆である不均衡なデューティサイクルを有する。好ましくは、ＰＬＬは、複数のクロックレートで基本クロック信号を生成するように構成可能である。好ましくは、プロセッサ１００は、各種の要因に基づいて自動的に基本クロックレートを調節する電力管理モジュールを含み、そのような要因には、動的に検出されるプロセッサ１００の動作温度、利用率、並びに、要求される性能及び／又は電力節減指標を指示するシステムソフトウェア（例えば、オペレーティングシステム、ＢＩＯＳ）からのコマンドが含まれる。一実施形態では、電力管理モジュールは、プロセッサ１００のマイクロコードを含む。
【０２４１】
クロック生成論理３５０２は、クロック分配ネットワーク、又はクロックツリーをさらに含む。クロックツリーは、基本クロック信号をプロセッサ１００の機能ユニットに分配し（distributes）、これは図３５では、命令取出しユニット１０１へのクロック信号３５０６−１、命令キャッシュ１０２へのクロック信号３５０６−２、命令トランスレータ１０４へのクロック信号３５０６−１０、リネームユニット１０６へのクロック信号３５０６−９、リザベーションステーション１０８へのクロック信号３５０６−８、ＮＮＵ１２１へのクロック信号３５０６−７、他の実行ユニット１１２へのクロック信号３５０６−４、メモリサブシステム１１４へのクロック信号３５０６−３、汎用レジスタ１１６へのクロック信号３５０６−５、及び、メディアレジスタ１１８へのクロック信号３５０６−６として示され、これらを集合的にクロック信号３５０６と呼ぶ。クロックツリーは、基本クロック信号３５０６をそれぞれの機能ユニットに送信するノード、又は配線を含んでいる。加えて、好ましくは、クロック生成論理３５０２は、クロックバッファを含み、これは、特に長いノードの場合に、必要に応じて基本クロック信号を再生成してよりクリーンなクロック信号を提供する、且つ／又は基本クロック信号の電圧レベルを昇圧する。加えて、各機能ユニットが、必要に応じて、各々が受け取るそれぞれの基本クロック信号３５０６を再生成及び／又は昇圧する、独自の部分クロックツリーをさらに含むことが可能である。
【０２４２】
ＮＮＵ１２１は、クロック低減論理３５０４を含み、クロック低減論理３５０４は、緩和インディケータ３５１２を受け取り、基本クロック信号３５０６−７を受け取り、それに応答して副クロック（secondary  clock）信号を生成する。副クロック信号は、基本クロックレートと同じクロックレートであるクロックレートを有するか、又は、緩和モード時には、基本クロックレートに対して、緩和インディケータ３５１２中にプログラムされた量だけ低減させたクロックレートを有し、これは熱に関する利益をもたらす可能性がある。クロック低減論理３５０４は、副クロック信号をＮＮＵ１２１の様々なブロックに分配するクロック分配ネットワーク、又はクロックツリーを含んでいる点で、多くの点でクロック生成論理３５０２に似ており、この副クロック信号は、ＮＰＵ１２６のアレイへのクロック信号３５０８−１、シーケンサ１２８へのクロック信号３５０８−２、及びインターフェース論理３５１４へのクロック信号３５０８−３として示されており、これらを集合的に又は個々に、副クロック信号３５０８と呼ぶ。好ましくは、ＮＰＵ１２６は、図３４に関連して説明するように複数のパイプラインステージ３４０１を含み、これは、クロック低減論理３５０４から副クロック信号３５０８−１を受け取るパイプラインステージングレジスタを含んでいる。
【０２４３】
ＮＮＵ１２１は、基本クロック信号３５０６−７及び副クロック信号３５０８−３を受け取るインターフェース論理３５１４をさらに含んでいる。インターフェース論理３５１４は、プロセッサ１００のフロントエンドの下方部分（例えば、リザベーションステーション１０８、メディアレジスタ１１８、及び汎用レジスタ１１６）と、ＮＮＵ１２１の様々なブロック、すなわち、クロック低減論理３５０４、データＲＡＭ１２２、重みＲＡＭ１２４、プログラムメモリ１２９、及びシーケンサ１２８との間に結合される。インターフェース論理３５１４は、データＲＡＭバッファ３５２２、重みＲＡＭバッファ３５２４、図３４の復号器３４０４、及び緩和インディケータ３５１２を含む。緩和インディケータ３５１２は、そのようにさせる場合に、ＮＰＵ１２６のアレイがＮＮＵプログラム命令をどれほどゆっくり実行するかを指定する値を保持する。好ましくは、緩和インディケータ３５１２は、除数値Ｎを指定し、クロック低減論理３５０４は、その除数値で基本クロック信号３５０６−７を割って副クロック信号３５０８を生成し、副クロック信号３５０８が１／Ｎであるレートを持つようにする。好ましくは、Ｎの値は、複数の異なる所定の値のいずれか１つにプログラムされて、クロック低減論理３５０４に、基本クロックレートよりも小さい、対応する複数の異なるレートで副クロック信号３５０８を生成させることができる。
【０２４４】
一実施形態では、クロック低減論理３５０４は、基本クロック信号３５０６−７を緩和インディケータ３５１２の値で割るクロック分周回路を備える。一実施形態では、クロック低減論理３５０４は、基本クロック信号３５０６−７を、基本クロック信号３５０６−７のＮ回のサイクルごとに一回だけ真になるイネーブル信号でゲートするクロックゲート（例えば、ＡＮＤゲート）を備える。例えば、Ｎまでカウントするカウンタを含んだ回路が使用されて、イネーブル信号を生成することができる。付随する論理が、カウンタの出力がＮと一致することを検出すると、その論理は、副クロック信号３５０８に真のパルスを生成し、カウンタをリセットする。好ましくは、緩和インディケータ３５１２の値は、図１４のＭＴＮＮ１４００命令などのアーキテクチャ命令によってプログラム可能である。好ましくは、図３７に関してより詳細に説明するように、プロセッサ１００で稼働しているアーキテクチャプログラムが、ＮＮＵプログラムの稼働を開始するようにＮＮＵ１２１に命令する直前に、緩和値を緩和インディケータ３５１２にプログラムする。
【０２４５】
重みＲＡＭバッファ３５２４は、重みＲＡＭ１２４とメディアレジスタ１１８との間に結合されて、それらの間のデータの伝達をバッファリングする。好ましくは、重みＲＡＭバッファ３５２４は、図１７のバッファ１７０４の実施形態の１つ又は複数に似ている。好ましくは、メディアレジスタ１１８からデータを受け取る重みＲＡＭバッファ３５２４の部分は、基本クロックレートの基本クロック信号３５０６−７によってクロック制御され、重みＲＡＭ１２４からデータを受け取る重みＲＡＭバッファ３５２４の部分は、副クロックレートの副クロック信号３５０８−３によってクロック制御され、副クロックレートは、緩和インディケータ３５１２にプログラムされた値に依存して、すなわちＮＮＵ１２１が緩和モードで動作しているか又は通常モードで動作しているかに依存して、基本クロックレートに対して低減される場合も低減されない場合もある。一実施形態では、重みＲＡＭ１２４は、図１７に関連して上記で説明したようにシングルポートであり、重みＲＡＭバッファ３５２４を介してメディアレジスタ１１８によって、及び図１１のＮＰＵ１２６又は行バッファ１１０４によっての双方で、調停されるやり方でアクセス可能である。代替的な一実施形態では、重みＲＡＭ１２４は、図１６に関連して上記で説明したようにデュアルポートであり、各ポートは、重みＲＡＭバッファ３５２４を介してメディアレジスタ１１８によって、及びＮＰＵ１２６又は行バッファ１１０４によっての双方で、同時的なやり方でアクセス可能である。
【０２４６】
同様に、データＲＡＭバッファ３５２２は、データＲＡＭ１２２とメディアレジスタ１１８との間に結合されて、それらの間のデータの伝達をバッファリングする。好ましくは、データＲＡＭバッファ３５２２は、図１７のバッファ１７０４の実施形態の１つ又は複数に似ている。好ましくは、メディアレジスタ１１８からデータを受け取るデータＲＡＭバッファ３５２２の部分は、基本クロックレートの基本クロック信号３５０６−７でクロック制御され、データＲＡＭ１２２からデータを受け取るデータＲＡＭバッファ３５２２の部分は、副クロックレートの副クロック信号３５０８−３でクロック制御され、副クロックレートは、緩和インディケータ３５１２にプログラムされた値に依存して、すなわちＮＮＵ１２１が緩和モードで動作しているか又は通常モードで動作しているかに依存して、基本クロックレートに対して低減される場合もされない場合もある。一実施形態では、データＲＡＭ１２２は、図１７に関連して上記で説明したようにシングルポートであり、データＲＡＭバッファ３５２２を介してメディアレジスタ１１８によって、及び図１１のＮＰＵ１２６又は行バッファ１１０４によっての双方で、調停されるやり方でアクセス可能である。代替的な一実施形態では、データＲＡＭ１２２は、上記で図１６に関連して説明したようにデュアルポートであり、各ポートは、データＲＡＭバッファ３５２２を介してメディアレジスタ１１８によって、及びＮＰＵ１２６又は行バッファ１１０４によっての双方で、同時的なやり方でアクセス可能である。
【０２４７】
好ましくは、インターフェース論理３５１４は、基本クロックドメインと副クロックドメインとの間の同期をもたらすために、データＲＡＭ１２２及び／又は重みＲＡＭ１２４がシングルポートであるか又はデュアルポートであるかに関係なく、データＲＡＭバッファ３５２２及び重みＲＡＭバッファ３５２４を含む。好ましくは、データＲＡＭ１２２、重みＲＡＭ１２４、及びプログラムメモリ１２９の各々は、それぞれの読み出しイネーブル信号、書き込みイネーブル信号、及びメモリ選択信号を含む静的ＲＡＭ（ＳＲＡＭ）を含む。
【０２４８】
上記のように、ＮＮＵ１２１は、プロセッサ１００の実行ユニットである。実行ユニットは、図１のアーキテクチャ命令１０３が翻訳されたマイクロ命令１０５など、アーキテクチャ命令が翻訳されたマイクロ命令を実行するか、又はアーキテクチャ命令１０３自体を実行する、プロセッサの機能ユニットである。実行ユニットは、ＧＰＲ１１６やメディアレジスタ１１８など、プロセッサの汎用レジスタからオペランドを受け取る。実行ユニットは、マイクロ命令又はアーキテクチャ命令を実行するのに応答して、汎用レジスタに書き込まれ得る結果を生成することができる。アーキテクチャ命令１０３の例は、それぞれ図１４及び図１５に関連して説明した、ＭＴＮＮ命令１４００及びＭＦＮＮ命令１５００である。マイクロ命令は、アーキテクチャ命令を実装する。より具体的には、アーキテクチャ命令が翻訳された１つ又は複数のマイクロ命令の実行ユニットによる集合的な実行は、そのアーキテクチャ命令で指定される入力に、アーキテクチャ命令で指定される演算を行って、アーキテクチャ命令によって定義される結果を作り出す。
【０２４９】
次いで図３６Ａを参照すると、ＮＮＵ１２１が通常モード、すなわち基本クロックレートで動作している、プロセッサ１００の動作の例を図示するタイミング図が示される。時間は、タイミング図中の左から右へと進行する。プロセッサ１００は、アーキテクチャプログラムを基本クロックレートで稼働させている。より具体的には、プロセッサ１００のフロントエンド（例えば、命令取出しユニット１０１、命令キャッシュ１０２、命令トランスレータ１０４、リネームユニット１０６、リザベーションステーション１０８）が、基本クロックレートで、アーキテクチャ命令を取り出し、復号し、ＮＮＵ１２１及び他の実行ユニット１１２に発行する。
【０２５０】
最初、アーキテクチャプログラムは、フロントエンド１００がＮＮＵ１２１に対して発行するアーキテクチャ命令（例えば、ＭＴＮＮ命令１４００）を実行し、この命令は、ＮＮＵ１２１に、そのプログラムメモリ１２９内のＮＮＵプログラムの稼働を開始するように命令する。それに先立って、アーキテクチャプログラムは、アーキテクチャ命令を実行して、緩和インディケータ３５１２に、基本クロックレートを指定する値、すなわちＮＮＵ１２１を通常モードにする値を書き込んでいる。より具体的には、緩和インディケータ３５１２にプログラムされた値により、クロック低減論理３５０４は、副クロック信号３５０８を、基本クロック信号３５０６の基本クロックレートで生成する。好ましくは、この場合、クロック低減論理３５０４のクロックバッファは、単に基本クロック信号３５０６を昇圧する。また、先立って、アーキテクチャプログラムは、アーキテクチャ命令を実行して、データＲＡＭ１２２及び重みＲＡＭ１２４に書き込みをし、ＮＮＵプログラムをプログラムメモリ１２９に書き込んでいる。ＮＮＵプログラム開始のＭＴＮＮ命令１４００に応答して、ＮＮＵ１２１は、ＮＮＵプログラムを基本クロックレートで稼働させ始める。これは、緩和インディケータ３５１２が基本レート値でプログラムされたためである。ＮＮＵ１２１の稼働を開始した後、アーキテクチャプログラムは、アーキテクチャ命令を基本クロックレートで実行し続け、このアーキテクチャ命令は、主として、ＮＮＵプログラムの次のインスタンス、又はＮＮＵプログラムの呼び出し若しくは稼働の準備として、データＲＡＭ１２２及び重みＲＡＭ１２４の書き込み及び／又は読み出しを行うＭＴＮＮ命令１４００を含む。
【０２５１】
図３６Ａの例に示されるように、ＮＮＵ１２１は、アーキテクチャプログラムがデータＲＡＭ１２２及び重みＲＡＭ１２４の書き込み／読み出しを終えるために要するよりも大幅に少ない時間（例えば、その時間の４分の１）で、ＮＮＵプログラムの稼働を終了する。例えば、ＮＮＵ１２１は、ＮＮＵプログラムを稼働させるのに約１０００クロックサイクルを要する可能性があるのに対して、アーキテクチャプログラムは、稼働に約４０００クロックサイクルを要し、両方とも基本クロックレートである。その結果、ＮＮＵ１２１は、その時間の残りはアイドル状態になり、これはこの例では大幅に長い時間であり、例えば、約３０００基本クロックレートサイクルである。図３６Ａの例に示されるように、このパターンはもう１回継続し、また、ニューラルネットワークのサイズ及び構成に依存して、もう数回継続する可能性がある。ＮＮＵ１２１は、プロセッサ１００のうち比較的大きくトランジスタ密度が高い機能ユニットである可能性があるため、特に基本クロックレートで稼働している時に、著しい量の熱を発生する可能性がある。
【０２５２】
次いで図３６Ｂを参照すると、ＮＮＵ１２１が緩和モード、すなわち基本クロックレート未満のレートで動作している、プロセッサ１００の動作の例を図示するタイミング図が示される。図３６Ｂのタイミング図は、プロセッサ１００がアーキテクチャプログラムを基本クロックレートで稼働させている点において、多くの点で図３６Ａのタイミング図に似ている。そして、この例では、図３６Ｂのアーキテクチャプログラム及びＮＮＵプログラムが、図３６Ａと同じであると仮定される。ただし、ＮＮＵプログラムを開始する前に、アーキテクチャプログラムは、ＭＴＮＮ命令１４００を実行し、その命令で、クロック低減論理３５０４に基本クロックレート未満の副クロックレートの副クロック信号３５０８を生成させる値を、緩和インディケータ３５１２にプログラムしている。すなわち、アーキテクチャプログラムは、ＮＮＵ１２１を、図３６Ａのように通常モードにするのではなく、図３６Ｂでは緩和モードにする。その結果、ＮＰＵ１２６は、ＮＮＵプログラムを副クロックレートで実行し、副クロックレートは、緩和モードでは基本クロックレート未満である。この例では、緩和インディケータ３５１２には、副クロックレートが基本クロックレートの４分の１であることを指定する値がプログラムされると仮定する。その結果、図３６Ａと図３６Ｂを比較することで分かるように、ＮＮＵ１２１は、ＮＮＵプログラムを緩和モードで稼働させるには、ＮＮＵプログラムを通常モードで稼働させる場合に比べて約４倍長い時間を要し、ＮＮＵ１２１がアイドルになる時間量が比較的短くなる。したがって、ＮＮＵプログラムを稼働させるために使用されるエネルギーは、ＮＮＵ１２１が図３６Ａでプログラムを通常モードで稼働させた場合と比べて約４倍長い期間にわたって、図３６ＢのＮＮＵ１２１によって消費される。そのため、ＮＮＵ１２１がＮＮＵプログラムを稼働させるために発生させる熱が図３６Ｂでは図３６Ａのおよそ４分の１の割合になり、これは、本明細書に記載されるように熱に関する利益を有する可能性がある。
【０２５３】
次いで図３７を参照すると、図３５のプロセッサ１００の動作を図示するフローチャートが示される。このフローチャートは、多くの点で、上記で図３５、図３６Ａ、及び図３６Ｂに関連して説明した動作に似ている動作を図示している。フローはブロック３７０２で開始する。
【０２５４】
ブロック３７０２で、プロセッサ１００が、ＭＴＮＮ命令１４００を実行して、重みＲＡＭ１２４に重みを書き込み、データＲＡＭ１２２にデータを書き込む。フローはブロック３７０４に進む。
【０２５５】
ブロック３７０４で、プロセッサ１００が、ＭＴＮＮ命令１４００を実行して、緩和インディケータ３５１２に、基本クロックレートよりも低いレートを指定する値をプログラムし、すなわちＮＮＵ１２１を緩和モードにする。フローはブロック３７０６に進む。
【０２５６】
ブロック３７０６で、プロセッサ１００は、ＭＴＮＮ命令１４００を実行して、ＮＮＵ１２１に、図３６Ｂに視覚化されたのと同様にしてＮＮＵプログラムの稼働を開始するように命令する。フローはブロック３７０８に進む。
【０２５７】
ブロック３７０８で、ＮＮＵ１２１が、ＮＮＵプログラムの稼働を開始する。並行して、プロセッサ１００は、ＭＴＮＮ命令１４００を実行して、重みＲＡＭ１２４に新しい重みを書き込み（且つ、場合によってはデータＲＡＭ１２２に新しいデータを書き込み）、且つ／又はＭＦＮＮ命令１５００を実行して、データＲＡＭ１２２から（及び場合によっては重みＲＡＭ１２４から）結果を読み出す。フローはブロック３７１２に進む。
【０２５８】
ブロック３７１２で、プロセッサ１００は、ＭＦＮＮ命令１５００（例えば、状態レジスタ１２７の読み出し）を実行して、ＮＮＵ１２１がそのプログラムの稼働を終えたことを検出する。アーキテクチャプログラムが緩和インディケータ３５１２の適切な値を選択したと仮定すると、図３６Ｂに視覚化されるように、ＮＮＵ１２１がＮＮＵプログラムを実行するには、プロセッサ１００が重みＲＡＭ１２４及び／又はデータＲＡＭ１２２にアクセスするアーキテクチャプログラムの部分を実行するためにかかる時間量とおよそ同じ時間量を要するはずである。フローはブロック３７１４に進む。
【０２５９】
ブロック３７１４で、プロセッサ１００は、ＭＴＮＮ命令１４００を実行して、緩和インディケータ３５１２に、基本クロックレートを指定する値をプログラムし、すなわちＮＮＵ１２を通常モードにする。フローはブロック３７１６に進む。
【０２６０】
ブロック３７１６で、プロセッサ１００は、ＭＴＮＮ命令１４００を実行して、ＮＮＵ１２１に、図３６Ａに視覚化されたのと同様にしてＮＮＵプログラムの稼働を開始するように命令する。フローはブロック３７１８に進む。
【０２６１】
ブロック３７１８で、ＮＮＵ１２１は、ＮＮＵプログラムを通常モードで稼働させ始める。フローはブロック３７１８で終了する。
【０２６２】
上記のように、ＮＮＵプログラムを緩和モードで稼働させると、ＮＮＵがプログラムを稼働させる時間が、ＮＮＵがプログラムを通常モードで（すなわち、プロセッサの基本クロックレートで）稼働させる時間と比べて延び、これは熱に関する利益をもたらす可能性がある。より具体的には、デバイス（例えば、トランジスタ、キャパシタ、配線）は、ＮＮＵがプログラムを緩和モードで稼働させている間は、より低い温度で動作する可能性が高い。これは、ＮＮＵが、ＮＮＵ（例えば、半導体素子、金属層、下にある基板）並びに周辺パッケージ及び冷却対策（例えば、ヒートシンク、ファン）によって放散される熱を発生させるレートがよりゆっくりになるためである。これにより、一般には、プロセッサダイの他の部分にあるデバイスの温度も下げることができる。デバイスの動作温度、特にデバイスの接合部の温度の低下は、漏洩電流の減少という利益も有する可能性がある。さらに、単位時間当たりに消費される電流の量が減るため、誘導雑音及びＩＲ低下雑音を低減させることができる。さらには、より低い温度は、プロセッサのＭＯＳＦＥＴの負バイアス温度不安定性（ＮＢＴＩ）及び正バイアス温度不安定性（ＰＢＴＩ）に好影響を与える可能性があり、それにより、デバイス及びその結果プロセッサ部分の信頼性及び／又は寿命を向上させる。温度の低下は、プロセッサの金属層におけるジュール加熱及びエレクトロマイグレーションも低減することができる。
【０２６３】
ＮＮＵの共有リソースに関するアーキテクチャプログラムと非アーキテクチャプログラムとの間の通信機構
例えば図２４〜図２８及び図３５〜図３７に関連して上記で説明したように、データＲＡＭ１２２及び重みＲＡＭ１２４は、共有リソースである。ＮＰＵ１２６とプロセッサ１００のフロントエンドとの両方が、データＲＡＭ１２２及び重みＲＡＭ１２４を共有する。より具体的には、ＮＰＵ１２６と、プロセッサ１００のフロントエンド、例えばメディアレジスタ１１８との両方が、データＲＡＭ１２２及び重みＲＡＭ１２４の書き込み及び読み出しを行う。別の表現をすると、プロセッサ１００で稼働しているアーキテクチャプログラムは、データＲＡＭ１２２及び重みＲＡＭ１２４を、ＮＮＵ１２１で稼働しているＮＮＵプログラムと共有し、状況によっては、これは、上記のようにアーキテクチャプログラムとＮＮＵプログラムとの間のフローの制御を必要とする。このリソース共有は、プログラムメモリ１２９にもある程度当てはまる。なぜならば、アーキテクチャプログラムがプログラムメモリ１２９に書き込み、シーケンサ１２８がプログラムメモリ１２９を読み出すためである。アーキテクチャプログラムとＮＮＵプログラムの間の共有リソースへのアクセスのフローを制御する、高性能の解決法を提供する実施形態が上記及び下記に記載される。
【０２６４】
ＮＮＵプログラムが非アーキテクチャプログラムとも呼ばれ、ＮＮＵ命令が非アーキテクチャ命令とも呼ばれ、ＮＮＵ命令セット（上記ではＮＰＵ命令セットとも呼んでいる）が非アーキテクチャ命令セットとも呼ばれる実施形態が記載される。非アーキテクチャ命令セットは、アーキテクチャ命令セットとは別のものである。プロセッサ１００がアーキテクチャ命令をマイクロ命令に翻訳する命令トランスレータ１０４を含んでいる実施形態では、非アーキテクチャ命令セットは、マイクロ命令セットとも別のものである。
【０２６５】
次いで図３８を参照すると、ＮＮＵ１２１のシーケンサ１２８をより詳細に図示するブロック図が示される。シーケンサ１２８は、上記のように、メモリアドレス１３１をプログラムメモリ１２９に提供して、シーケンサ１２８に提供される非アーキテクチャ命令を選択する。メモリアドレス１３１は、図３８に示されるように、シーケンサ１２８のプログラムカウンタ３８０２に保持される。シーケンサ１２８は、一般に、シーケンサ１２８がループ命令や分岐命令などの非アーキテクチャ制御命令に遭遇しない限り、プログラムメモリ１２９の順次アドレスを通じて増分して行き、非アーキテクチャ制御命令に遭遇した場合、シーケンサ１２８は、プログラムカウンタ３８０２を、制御命令の目標アドレス、すなわち制御命令のターゲットにある非アーキテクチャ命令のアドレスに更新する。したがって、プログラムカウンタ３８０２に保持されているアドレス１３１は、ＮＰＵ１２６による実行のために現在取り出されている非アーキテクチャプログラムの非アーキテクチャ命令の、プログラムメモリ１２９内のアドレスを指定する。有利な点として、プログラムカウンタ３８０２の値は、図３９に関連して下記で説明するように、状態レジスタ１２７のＮＮＵプログラムカウンタフィールド３９１２を介して、アーキテクチャプログラムによって取得されることが可能である。これにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データＲＡＭ１２２及び／又は重みＲＡＭ１２４のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。
【０２６６】
シーケンサ１２８は、ループカウンタ３８０４をさらに含み、これは、例えば、図２６Ａのアドレス１０にあるＬＯＯＰ  ＴＯ  １命令や、図２８のアドレス１１にあるＬＯＯＰ  ＴＯ  １命令などの非アーキテクチャループ命令との関係で使用される。図２６Ａ及び図２８の例では、ループカウンタ３８０４には、アドレス０の非アーキテクチャ初期化命令で指定される値、例えば４００の値がロードされる。シーケンサ１２８がループ命令に遭遇して目標命令（例えば、図２６Ａのアドレス１の積和命令、又は図２８のアドレス１のｍａｘｗａｃｃ命令）にジャンプするたびに、シーケンサ１２８はループカウンタ３８０４を減分する。ループカウンタ３８０４がゼロに達すると、シーケンサ１２８は、次の順次非アーキテクチャ命令に進む。代替的な一実施形態では、ループ命令に最初に遭遇した時に、ループカウンタ３８０４は、そのループ命令で指定されるループカウント値をロードされ、非アーキテクチャ初期化命令を介してループカウンタ３８０４を初期化する必要がなくされる。したがって、ループカウンタ３８０４の値は、非アーキテクチャプログラムのループ本体があと何回実行されることになるかを指示する。有利な点として、ループカウンタ３８０４の値は、図３９に関連して下記で説明するように、状態レジスタ１２７のループカウント３９１４フィールドを介して、アーキテクチャプログラムによって取得されることが可能である。それにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データＲＡＭ１２２及び／又は重みＲＡＭ１２４のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。一実施形態では、シーケンサ１２８は、非アーキテクチャプログラム中の入れ子構造のループに対応するための３つの追加的なループカウンタを含み、これら他の３つのループカウンタの値も、状態レジスタ１２７を介して読み出すことが可能である。ループ命令中の１ビットが、４つのループカウンタのうちどれが当該ループ命令に使用されるかを指示する。
【０２６７】
シーケンサ１２８は、反復カウンタ３８０６をさらに含む。反復カウンタ３８０６は、例えば、図４、図９、図２０、及び図２６Ａのアドレス２の積和命令や、図２８アドレス２のｍａｘｗａｃｃ命令などの非アーキテクチャ命令との関連で使用され、これらを以後「実行」命令と呼ぶ。上記の例では、実行命令の各々は、それぞれ５１１、５１１、１０２３、２、及び３の反復回数を指定する。シーケンサ１２８が、非ゼロの反復回数を指定する実行命令に遭遇すると、シーケンサ１２８は、反復カウンタ３８０６に、指定される値をロードする。加えて、シーケンサ１２８は、適切なマイクロ操作３４１８を生成して、図３４のＮＰＵ１２６のパイプラインステージ３４０１中の論理を実行のために制御し、反復カウンタ３８０６を減分する。反復カウンタ３８０６がゼロより大きい場合、シーケンサ１２８は、再度適切なマイクロ操作３４１８を生成して、ＮＰＵ１２６内の論理を制御し、反復カウンタ３８０６を減分する。シーケンサ１２８は、反復カウンタ３８０６がゼロに達するまで、このようにして継続する。したがって、反復カウンタ３８０６の値は、非アーキテクチャ実行命令の中で指定される演算（例えば、累算器及びデータワード／重みワードの、積和、最大値、和）があと何回行われることになるかを指示する。有利な点として、反復カウンタ３８０６の値は、図３９に関連して下記で説明するように、状態レジスタ１２７の反復カウント３９１６フィールドを介して、アーキテクチャプログラムによって取得されることが可能である。それにより、アーキテクチャプログラムは、非アーキテクチャプログラムの進捗に基づいて、データＲＡＭ１２２及び／又は重みＲＡＭ１２４のどこからデータを読み出すか、又はどこにデータを書き込むかを決定することができる。
【０２６８】
次いで図３９を参照すると、ＮＮＵ１２１の制御及び状態レジスタ１２７の特定のフィールドを図示するブロック図が示される。それらのフィールドが含むのは、非アーキテクチャプログラムを実行しているＮＰＵ１２６によって一番最近書き込まれた重みＲＡＭ行２６０２のアドレス、非アーキテクチャプログラムを実行しているＮＰＵ１２６によって一番最近読み出された重みＲＡＭ行２６０４のアドレス、非アーキテクチャプログラムを実行しているＮＰＵ１２６によって一番最近書き込まれたデータＲＡＭ行２６０６のアドレス、及び、非アーキテクチャプログラムを実行しているＮＰＵ１２６によって一番最近読み出されたデータＲＡＭ行２６０４のアドレス、であり、これらについては上記で２６Ｂに関連して説明した。加えて、これらのフィールドは、ＮＮＵプログラムカウンタ３９１２、ループカウント３９１４、及び反復カウント３９１６をさらに含んでいる。上記のように、状態レジスタ１２７は、アーキテクチャプログラムによって、例えばＭＦＮＮ命令１５００で、ＮＮＵプログラムカウンタ３９１２、ループカウント３９１４、及び反復カウント３９１６フィールド値を含めて、メディアレジスタ１１８及び／又は汎用レジスタ１１６へと読み出すことができる。プログラムカウンタ３９１２値は、図３８のプログラムカウンタ３８０２の値を反映する。ループカウント３９１４値は、ループカウンタ３８０４の値を反映する。反復カウント３９１６値は、反復カウンタ３８０６の値を反映する。一実施形態では、シーケンサ１２８は、プログラムカウンタ３８０２、ループカウンタ３８０４、又は反復カウンタ３８０６に変更を加えるたびに、プログラムカウンタ３９１２、ループカウント３９１４、及び反復カウント３９１６フィールドの値を更新して、アーキテクチャプログラムが読み出す時にそれらのフィールド値が現在の値であるようにする。別の実施形態では、ＮＮＵ１２１が、状態レジスタ１２７を読み出すアーキテクチャ命令を実行する時、ＮＮＵ１２１は、単に、プログラムカウンタ３８０２、ループカウンタ３８０４、及び反復カウンタ３８０６の値を取得し、それらをアーキテクチャ命令に（例えば、メディアレジスタ１１８又は汎用レジスタ１１６に）返す。
【０２６９】
前述から観察できるように、図３９の状態レジスタ１２７のフィールドの値は、ＮＮＵ１２１によって実行されている間の非アーキテクチャプログラムの進捗を指示する情報と特徴づけることができる。非アーキテクチャプログラムの進捗の特定の態様について上記で説明したが、それらは、プログラムカウンタ３８０２値、ループカウンタ３８０４値、反復カウンタ３８０６値、重みＲＡＭ１２４のアドレス１２５のうち一番最近書き込まれた／読み出されたアドレス２６０２／２６０４、及びデータＲＡＭ１２２のアドレス１２３のうち一番最近書き込まれた／読み出されたアドレス２６０６／２６０８などである。プロセッサ１００で実行されているアーキテクチャプログラムは、図３９の非アーキテクチャプログラムの進捗値を状態レジスタ１２７から読み出し、その情報を使用して、例えば比較及び分岐命令などのアーキテクチャ命令によって決定を行うことができる。例えば、アーキテクチャプログラムは、データ／重みをデータＲＡＭ１２２及び／又は重みＲＡＭ１２４に書き込む行、又は読み出す行を決定して、特に大きなデータセットについて及び／又は異なる非アーキテクチャプログラムの重なった実行インスタンスについて、データＲＡＭ１２２又は重みＲＡＭ１２４に出入りするデータのフローを制御する。アーキテクチャプログラムによってなされる決定の例については、上記及び下記で説明している。
【０２７０】
例えば、上記で図２６Ａに関連して説明したように、アーキテクチャプログラムは、畳み込みの結果を畳み込みカーネル２４０２より上の（例えば、行８より上）データＲＡＭ１２２の行に書き戻すように非アーキテクチャプログラムを構成し、アーキテクチャプログラムは、ＮＮＵ１２１が結果を書き込むと、一番最近書き込まれたデータＲＡＭ１２２の行２６０６のアドレスを使用して、その結果をデータＲＡＭ１２２から読み出す。
【０２７１】
別の例として、上記で図２６Ｂに関連して説明したように、アーキテクチャプログラムは、図３８の状態レジスタ１２７のフィールドからの情報を使用して、非アーキテクチャプログラムの進捗を決定して、図２４のデータ配列２４０４の畳み込みを、５つの５１２×１６００のチャンクで行う。アーキテクチャプログラムは、２５６０×１６００のデータ配列２４０４のうち最初の５１２×１６００チャンクを重みＲＡＭ１２４に書き込み、非アーキテクチャプログラムを開始し、このプログラムは、１６００のループカウント、及び初期化された重みＲＡＭ１２４の０の出力行を有する。ＮＮＵ１２１が非アーキテクチャプログラムを実行するとき、アーキテクチャプログラムは、状態レジスタ１２７を読み出して、一番最近書き込みがされた重みＲＡＭの行２６０２を決定し、そのため、非アーキテクチャプログラムによって書き込まれた有効な畳み込み結果を読み出し、アーキテクチャプログラムがその畳み込み結果を読み出した後に、次の５１２×１６００チャンクをその有効な畳み込み結果の上に書き込むことができる。それにより、ＮＮＵ１２１が、最初の５１２×１６００チャンクへの非アーキテクチャプログラムを完了すると、プロセッサ１００は直ちに、必要に応じて非アーキテクチャプログラムを更新し、そのプログラムを再度開始して、次の５１２×１６００チャンクを処理することができる。
【０２７２】
別の例として、アーキテクチャプログラムが、重みが重みＲＡＭ１２４に記憶され、結果がデータＲＡＭ１２２に書き戻される一続きの典型的なニューラルネットワーク積和活性化関数演算を、ＮＮＵ１２１に行わせていると仮定する。その場合、非アーキテクチャプログラムが重みＲＡＭ１２４のある行を読み出すと、そのプログラムはその行を再び読み出すことはない。そのため、アーキテクチャプログラムは、現在の重みが非アーキテクチャプログラムによって読み出される／使用されると、重みＲＡＭ１２４にある重みを、非アーキテクチャプログラムの次の実行インスタンスのための（例えば、次のニューラルネットワーク層に関する）新しい重みで上書きし始めるように構成することができる。その場合、アーキテクチャプログラムは、状態レジスタ１２７を読み出して、一番最近読み出された重みＲＡＭ行２６０４のアドレスを取得して、新しい重みのセットを重みＲＡＭ１２４内でどこに書き込めるかを決定する。
【０２７３】
別の例として、アーキテクチャプログラムが、非アーキテクチャプログラムの中に、図２０のアドレス２の非アーキテクチャ積和命令など、大きな反復回数を有する実行命令が含まれていることを知っていると仮定する。そのような場合、アーキテクチャプログラムは、その非アーキテクチャ命令を完了するのにあと約何回のクロックサイクルを要するかを知って、アーキテクチャプログラムが２つ以上の動作のどちらを行うかを決定できるようにするために、反復カウント３９１６を知る必要がある可能性がある。例えば、アーキテクチャプログラムは、その時間が長い場合は、オペレーティングシステムなどの別のアーキテクチャプログラムに制御を引き渡すことがある。同様に、アーキテクチャプログラムが、図２８の非アーキテクチャプログラムなど、非アーキテクチャプログラムの中に比較的大きいループ回数を持つループ本体が含まれることを知っていると仮定する。そのような場合、アーキテクチャプログラムは、その非アーキテクチャプログラムを完了するのにあと約何回のクロックサイクルを要するかを知って、アーキテクチャプログラムが２つ以上の動作のどちらを行うかを決定できるようにするために、ループカウント３９１４を知る必要がある可能性がある。
【０２７４】
別の例として、アーキテクチャプログラムＮＮＵ１２１が、プーリング対象のデータが重みＲＡＭ１２４に記憶され、結果が重みＲＡＭ１２４に書き戻される、図２７及び図２８に関連して説明したのと同様のプーリング演算をＮＮＵ１２１に行わせていると仮定する。ただし、図２７及び図２８の例とは異なり、結果が重みＲＡＭ１２４の先頭の４００行、例えば、行１６００から１９９９に書き戻されると仮定する。この場合、非アーキテクチャプログラムが、自身がプールする重みＲＡＭ１２４の４つの行を読み出すと、その非アーキテクチャプログラムはその行を再び読み出すことはない。そのため、アーキテクチャプログラムは、現在の４つの行が非アーキテクチャプログラムによって読み出される／使用されると、重みＲＡＭ１２４にあるデータを、新しいデータ（例えば、プーリングされたデータに典型的な積和活性化関数演算を行うための、例えば、非アーキテクチャプログラムの次の実行インスタンスのための重み）で上書きし始めるように構成することができる。その場合、アーキテクチャプログラムは、状態レジスタ１２７を読み出して、一番最近読み出された重みＲＡＭ行２６０４のアドレスを取得して、新しい重みのセットを重みＲＡＭ１２４内でどこに書き込めるかを決定する。
【０２７５】
リカレントニューラルネットワークの加速
伝統的なフィードフォワードニューラルネットワークは、ネットワークへの以前の入力の記憶を含まない。フィードフォワードニューラルネットワークは、一般に、時間の経過に伴うネットワークへの様々な入力が、出力と同様に、互いから独立している作業を行うために使用される。それに対して、リカレントニューラルネットワーク（ＲＮＮ）は、一般に、時間の経過に伴うネットワークへの入力の順番に重要性がある作業を行うのに役立つ。（この順番は、普通、時間ステップと呼ばれる。）その結果、ＲＮＮは、順番において前の入力に応答してネットワークによって行われる算出に基づく情報を保持する、記憶又は内部ステートの概念を備え、ＲＮＮの出力は、内部ステート並びに次の時間ステップの入力に依存する。音声認識、言語のモデル化、テキスト生成、言語翻訳、画像記述の生成、及びある種の形態の手書き認識は、ＲＮＮによって上手く行える傾向のある作業の例である。
【０２７６】
３つのよく知られている例は、Ｅｌｍａｎ  ＲＮＮ、Ｊｏｒｄａｎ  ＲＮＮ、及びロングショートタームメモリ（Ｌｏｎｇ  Ｓｈｏｒｔ  Ｔｅｒｍ  Ｍｅｍｏｒｙ：ＬＳＴＭ）ネットワークである。Ｅｌｍａｎ  ＲＮＮは、現在の時間ステップについてＲＮＮの隠れ層のステートを覚えておくコンテキストノードを含み、そのステートは、次の時間ステップについての隠れ層に入力として提供される。Ｊｏｒｄａｎ  ＲＮＮは、コンテキストノードが隠れ層ではなくＲＮＮの出力層のステートを覚えておくことを除いて同様である。ＬＳＴＭネットワークは、ＬＳＴＭセルのＬＳＴＭ層を含んでいる。各ＬＳＴＭセルは、現在の時間ステップの現在のステート及び現在の出力と、新しい、すなわち次の時間ステップの新しいステート及び新しい出力とを有する。ＬＳＴＭセルは、入力ゲート及び出力ゲート、並びにセルにそのセルが覚えているステートを忘れさせる忘却ゲートを含んでいる。これら３種類のＲＮＮについて下記でより詳細に説明する。
【０２７７】
本開示の文脈では、ＥｌｍａｎやＪｏｒｄａｎ  ＲＮＮなどのリカレントニューラルネットワーク（ＲＮＮ）に関して、ＮＮＵは、そのインスタンスごとに入力層ノード値のセットを取り出す時間ステップを行い、それらの値をＲＮＮを通じて伝搬させて出力層ノード値並びに隠れ層及びコンテキスト層ノード値を生成するために必要な計算を行う。したがって、入力層ノード値は、それらが隠れ層、出力層、及びコンテキスト層のノード値を計算するために使用される時間ステップに関連付けられ、隠れ層、出力層、及びコンテキスト層のノード値は、それらが生成される時間ステップに関連付けられる。入力層ノード値は、ＲＮＮによってモデル化しようとするシステムのサンプリングされた値、例えば、画像、音声サンプル、金融市場データのスナップショットである。ＬＳＴＭネットワークに関連して、ＮＮＵは、そのインスタンスごとにメモリセル入力値のセットを取り出す時間ステップを行い、メモリセル出力値（並びにセル状態及び入力ゲート、忘却ゲート及び出力ゲート値）を生成するために必要な計算を行い、これは、セル入力値を、ＬＳＴＭ層のセルを通じて伝搬させる、と表現されることもある。したがって、セル入力値は、それらがセル状態並びに入力ゲート、忘却ゲート、及び出力ゲート値を計算するために使用される時間ステップに関連付けられ、セル状態並びに入力ゲート、忘却ゲート、及び出力ゲート値は、それらが生成される時間ステップに関連付けられる。
【０２７８】
コンテキスト層ノード値は、状態ノードとも呼ばれ、ニューラルネットワークの状態であり、この状態は、現在の時間ステップに関連付けられた入力層ノード値だけでなく、前の時間ステップに関連付けられた入力層ノード値に基づく。ある時間ステップについてＮＮＵによって行われる計算（例えば、Ｅｌｍａｎ又はＪｏｒｄａｎ  ＲＮＮの隠れ層ノード値の計算）は、その前の時間ステップに生成されたコンテキスト層ノード値の関数である。したがって、ある時間ステップの開始時におけるネットワークの状態（コンテキストノード値）は、その時間ステップ中に生成される出力層ノード値に影響する。さらに、その時間ステップの終了時におけるネットワークの状態は、その時間ステップの入力ノード値と、その時間ステップの開始時におけるネットワークの状態との両方に影響される。同様に、ＬＳＴＭセルに関して、セル状態値は、現在の時間ステップに関連付けられたメモリセル入力値だけでなく、前の時間ステップに関連付けられたメモリセル入力値に基づく。ある時間ステップについてＮＮＵによって行われる計算（例えば、次のセル状態）は、前の時間ステップに生成されたセル状態値の関数であるので、その時間ステップの開始時におけるネットワークの状態（セル状態値）は、その時間ステップ中に生成されるセル出力値に影響し、時間ステップの終了時におけるネットワークの状態は、その時間ステップのセル入力値と、前のネットワークの状態との両方に影響される。
【０２７９】
次いで図４０を参照すると、Ｅｌｍａｎ  ＲＮＮの例を図示するブロック図が示される。図４０のＥｌｍａｎ  ＲＮＮは、Ｄ０、Ｄ１〜Ｄｎと表され、集合的には入力層ノードＤと呼ばれ、個々には総称して入力層ノードＤと呼ばれる入力層ノード又はニューロンと、Ｚ０、Ｚ１〜Ｚｎと表され、集合的には隠れ層ノードＺと呼ばれ、個々には総称して隠れ層ノードＺと呼ばれる隠れ層ノード／ニューロンと、Ｙ０、Ｙ１〜Ｙｎと表され、集合的には出力層ノードＹと呼ばれ、個々には総称して出力層ノードＹと呼ばれる出力層ノード／ニューロンと、Ｃ０、Ｃ１〜Ｃｎと表され、集合的にはコンテキスト層ノードＣと呼ばれ、個々には総称してコンテキスト層ノードＣと呼ばれるコンテキスト層ノード／ニューロンとを含んでいる。図４０の例示的なＥｌｍａｎ  ＲＮＮでは、隠れ層ノードＺの各々は、入力層ノードＤの各々の出力との間に入力接続を有し、また、コンテキスト層ノードＣの各々の出力との間に入力接続を有する。出力層ノードＹの各々は、隠れ層ノードＺの各々の出力との間に入力接続を有する。コンテキスト層ノードＣの各々は、対応する隠れ層ノードＺの出力との間に入力接続を有する。
【０２８０】
多くの点で、Ｅｌｍａｎ  ＲＮＮは、伝統的なフィードフォワード人工ニューラルネットワークと同じように動作する。すなわち、所与のノードには、そのノードへの各入力接続に関連付けられた重みがあり、ある入力接続でノードによって受け取られた値が、そのノードに関連付けられた重みで乗算されて積を生成し、ノードは、すべての入力接続に関連付けられた積を加算して和を生成する（和に含められるバイアス項が存在する場合もある）。通例は、活性化関数がその和に行われてノードの出力値を生成し、これは時にノードの活性化と呼ばれる。伝統的なフィードフォワードネットワークの場合、データは常に一方向に、すなわち入力層から出力層へと流れる。すなわち、入力層は値を隠れ層（通例は複数の隠れ層）に提供し、隠れ層は出力値を生成し、それが出力層に提供され、出力層は、捕捉されることが可能な出力を生成する。
【０２８１】
ただし、伝統的なフィードフォワードネットワークと対照的に、Ｅｌｍａｎ  ＲＮＮは、後ろにフィードバックするいくつかの接続、すなわち、図４０の隠れ層ノードＺからコンテキスト層ノードＣへの接続を含んでいる。Ｅｌｍａｎ  ＲＮＮは、入力層ノードＤが新しい時間ステップに入力値を隠れ層ノードＺに提供するとき、コンテキストノードＣが、前の入力に応答して隠れ層ノードＺの出力値であった値を隠れ層Ｚに提供するように動作し、これが現在の時間ステップと呼ばれる。この意味で、Ｅｌｍａｎ  ＲＮＮのコンテキストノードＣは、前の時間ステップの入力値に基づくメモリである。図４０のＥｌｍａｎ  ＲＮＮに関連する計算を行うためのＮＮＵ１２１の実施形態の動作について、次いで図４１及び図４２との関連で説明する。
【０２８２】
本開示の目的には、Ｅｌｍａｎ  ＲＮＮは、少なくとも、入力ノード層、隠れノード層、出力ノード層、及びコンテキストノード層を備えたリカレントニューラルネットワークである。所与の時間ステップについて、コンテキストノード層は、隠れノード層によってコンテキストノード層にフィードバックされた、隠れノード層が前の時間ステップに生成した結果を記憶する。コンテキスト層にフィードバックされる結果は、活性化関数の結果である場合も、又は、活性化関数を実行せずに隠れノード層によって行われた累算の結果である場合もある。
【０２８３】
次いで図４１を参照すると、ＮＮＵ１２１が図４０のＥｌｍａｎ  ＲＮＮに関連する算出を行う際のＮＮＵ１２１のデータＲＡＭ１２２及び重みＲＡＭ１２４内のデータのレイアウトの例を図示するブロック図が示される。図４１の例では、図４０のＥｌｍａｎ  ＲＮＮが、５１２個の入力ノードＤ、５１２個の隠れノードＺ、５１２個のコンテキストノードＣ、及び５１２個の出力ノードＹを有すると仮定される。さらに、Ｅｌｍａｎ  ＲＮＮは完全に接続されていると仮定され、すなわち５１２個の入力ノードＤすべてが、隠れノードＺの各々への入力として接続され、５１２個のコンテキストノードＣすべてが、隠れノードＺの各々への入力として接続され、５１２個の隠れノードＺのすべてが、出力ノードＹの各々への入力として接続されている。加えて、ＮＮＵ１２１は、例えばワイド構成において、５１２個のＮＰＵ１２６、又はニューロンとして構成される。最後に、コンテキストノードＣから隠れノードＺへの接続に関連付けられた重みはすべて１の値を持つと仮定され、したがって、それらの単位的な（unitary）重み値を記憶する必要はない。
【０２８４】
重みＲＡＭ１２４の下５１２行（行０〜５１１）は、示されるように、入力ノードＤと隠れノードＺとの間の接続に関連付けられた重み値を保持する。より具体的には、示されるように、行０は、入力ノードＤ０から隠れノードＺへの入力接続に関連付けられた重みを保持し、すなわちワード０は、入力ノードＤ０と隠れノードＺ０との間の接続に関連付けられた重みを保持し、ワード１は、入力ノードＤ０と隠れノードＺ１との間の接続に関連付けられた重みを保持し、ワード２は、入力ノードＤ０と隠れノードＺ２との間の接続に関連付けられた重みを保持し、以下同様に続き、ワード５１１は、入力ノードＤ０と隠れノードＺ５１１との間の接続に関連付けられた重みを保持する。行１は、入力ノードＤ１から隠れノードＺへの入力接続に関連付けられた重みを保持し、すなわち、ワード０は、入力ノードＤ１と隠れノードＺ０との間の接続に関連付けられた重みを保持し、ワード１は、入力ノードＤ１と隠れノードＺ１との間の接続に関連付けられた重みを保持し、ワード２は、入力ノードＤ１と隠れノードＺ２との間の接続に関連付けられた重みを保持し、以下同様に続き、ワード５１１は、入力ノードＤ１と隠れノードＺ５１１との間の接続に関連付けられた重みを保持する。最後、行５１１は、入力ノードＤ５１１から隠れノードＺへの入力接続に関連付けられた重みを保持し、すなわち、ワード０は、入力ノードＤ５１１と隠れノードＺ０との間の接続に関連付けられた重みを保持し、ワード１は、入力ノードＤ５１１と隠れノードＺ１との間の接続に関連付けられた重みを保持し、ワード２は、入力ノードＤ５１１と隠れノードＺ２との間の接続に関連付けられた重みを保持し、以下同様に続き、ワード５１１は、入力ノードＤ５１１と隠れノードＺ５１１との間の接続に関連付けられた重みを保持する。これは、上記で図４〜図６Ａに関して説明したレイアウト及び使用と同様である。
【０２８５】
同様にして、図示されるように、重みＲＡＭ１２４の次の５１２行（行５１２〜１０２３）は、隠れノードＺと出力ノードＹとの間の接続に関連付けられた重み値を保持する。
【０２８６】
データＲＡＭ１２２は、時間ステップの連続についてＥｌｍａｎ  ＲＮＮのノード値を保持する。より具体的には、３行からなる三つ組が、所与の時間ステップについてのノード値を保持する。データＲＡＭ１２２が６４行を有する一実施形態では、データＲＡＭ１２２は、示されるように、２０個の異なる時間ステップについてノード値を保持することができる。図４１の例では、行０〜２は時間ステップ０のノード値を保持し、行３〜５は時間ステップ１のノード値を保持し、以下同様に続き、行５７〜５９は時間ステップ１９のノード値を保持する。三つ組のうち第１の行は、その時間ステップの入力ノードＤ値を保持する。三つ組のうち第２の行は、その時間ステップの隠れノードＺ値を保持する。三つ組のうち第３の行は、その時間ステップの出力ノードＹ値を保持する。示されるように、データＲＡＭ１２２の各列は、その対応するニューロン、又はＮＰＵ１２６のノード値を保持する。すなわち、下記で図４２に関連してより詳細に説明するように、列０は、その計算がＮＰＵ０によって行われるノードＤ０、Ｚ０、及びＹ０に関連付けられたノード値を保持し、列１は、その計算がＮＰＵ１によって行われるノードＤ１、Ｚ１、及びＹ１に関連付けられたノード値を保持し、以下同様に続き、列５１１は、その計算がＮＰＵ５１１によって行われるノードＤ５１１、Ｚ５１１、及びＹ５１１に関連付けられたノード値を保持する。
【０２８７】
図４１に示されるように、所与の時間ステップに関連付けられた三つ組の第２の行にある隠れノードＺ値は、次の時間ステップのコンテキストノードＣ値である。すなわち、ＮＰＵ１２６がその時間ステップ中に計算して書き込むＺ値は、次の時間ステップ中にＺ値を計算するために（次の時間ステップの入力ノードＤ値と併せて）ＮＰＵ１２６によって使用されるＣ値になる。コンテキストノードＣの初期値（すなわち、時間ステップ０の行１のＺ値を計算するために使用されるＣ値）は、ゼロであると仮定する。これについては、図４２の非アーキテクチャプログラムに関連して、下記でより詳細に説明する。
【０２８８】
好ましくは、入力ノードＤ値（図４１の例における、行０、３、及び以下同様に５７まで）は、プロセッサ１００で稼働しているアーキテクチャプログラムにより、ＭＴＮＮ命令１４００を介してデータＲＡＭ１２２に書き込まれ／投入され、図４２の非アーキテクチャプログラムなど、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって読み出される／使用される。逆に、隠れノード／出力ノードＺ／Ｙ値（図４１の例における行１及び２、４及び５、並びに以下同様に５８及び５９まで）は、ＮＮＵ１２１で稼働している非アーキテクチャプログラムにより、データＲＡＭ１２２に書き込まれ／投入され、プロセッサ１００で稼働しているアーキテクチャプログラムにより、ＭＦＮＮ命令１５００を介して読み出される／使用される。図４１の例は、アーキテクチャプログラムが、（１）データＲＡＭ１２２に、２０個の異なる時間ステップについての入力ノードＤ値を投入し（行０、３、及び以下同様に５７まで）、（２）図４２の非アーキテクチャプログラムを開始し、（３）非アーキテクチャプログラムが完了したことを検出し、（４）データＲＡＭ１２２から出力ノードＹ値（行２、５、及び以下同様に５９まで）を読み出し、（５）作業、例えば携帯電話のユーザによってなされた発話の認識を行うために使用される計算を完了するのに必要とされる回数だけステップ（１）〜（４）を繰り返す、と仮定する。
【０２８９】
代替の一手法では、アーキテクチャプログラムは、（１）データＲＡＭ１２２に、単一の時間ステップについての入力ノードＤ値を投入し（例えば、行０）、（２）非アーキテクチャプログラム（ループを必要とせず、データＲＡＭ１２２の行の単一の三つ組にアクセスする、図４２の変更を加えられたバージョン）を開始し、（３）非アーキテクチャプログラムが完了したことを検出し、（４）データＲＡＭ１２２から出力ノードのＹ値（例えば、行２）を読み出し、（５）作業を完了するのに必要とされる回数だけステップ（１）〜（４）を繰り返す。ＲＮＮへの入力値がサンプリングされる仕方に依存して、上記２つの手法のうちいずれかがより好ましい可能性がある。例えば、作業が、入力を複数の時間ステップ（例えば、２０前後）にわたってサンプリングし、計算を行うことを許容する場合、第１の手法が好ましい可能性がある。それは、その方が計算リソースが効率的で、且つ／又は性能が高い可能性が高いためである。対して、作業が単一の時間ステップでのサンプリングしか許容できない場合は、第２の手法が要求される可能性がある。
【０２９０】
第３の実施形態が企図され、これは第２の手法に似るが、データＲＡＭ１２２の行の三つ組を１つだけ使用するのではなく、非アーキテクチャプログラムが、行の三つ組を複数個使用し、すなわち、第１の手法と同様に時間ステップごとに異なる三つ組を使用する。第３の実施形態では、好ましくは、アーキテクチャプログラムは、ステップ（２）の前に、例えば、アドレス１の命令内のデータＲＡＭ１２２の行を、次の三つ組をポイントするように更新することにより、非アーキテクチャプログラムを開始する前にそれを更新するステップを含む。
【０２９１】
次いで図４２を参照すると、ＮＮＵ１２１のプログラムメモリ１２９に記憶され、ＮＮＵ１２１によって実行されてＥｌｍａｎ  ＲＮＮを達成し、図４１の編成によるデータ及び重みを使用するプログラムを図示する表が示される。図４２（並びに図４５、図４８、図５１、図５４、及び図５７）の非アーキテクチャプログラムの命令のいくつかについては、上記で詳細に説明しており（例えば、ＭＵＬＴ−ＡＣＣＵＭ、ＬＯＯＰ、ＩＮＩＴＩＡＬＩＺＥ命令）、断らない限りそれらの説明を以下の説明で仮定する。
【０２９２】
図４２の例示的プログラムは、アドレス０〜１２に１３個の非アーキテクチャ命令を含んでいる。アドレス０の命令（ＩＮＩＴＩＡＬＩＺＥ  ＮＰＵ，ＬＯＯＰＣＮＴ＝２０）は、累算器２０２をクリアし、ループカウンタ３８０４を２０の値に初期化して、ループ本体（アドレス４〜１１の命令）を２０回行わせる。好ましくは、この初期化命令はさらに、ＮＮＵ１２１をワイド構成にして、ＮＮＵ１２１が５１２個のＮＰＵ１２６として構成されるようにする。下記の説明から観察できるように、５１２個のＮＰＵ１２６は、アドレス１〜３及び７〜１１の命令の実行中は、５１２個の隠れ層ノードＺに対応し、５１２個の隠れ層ノードＺとして動作し、アドレス４〜６の命令の実行中は、５１２個の出力層ノードＹに対応し、５１２個の出力層ノードＹとして動作する。
【０２９３】
アドレス１〜３の命令は、プログラムのループ本体の外側であり、一度だけ実行される。それらの命令は、隠れ層ノードＺの初期値を計算し、それらをデータＲＡＭ１２２の行１に書き込み、それらの初期値は、第１の時間ステップ（時間ステップ０）の出力層ノードＹを算出するために、アドレス４〜６の命令の１回目の実行インスタンスによって使用される。加えて、アドレス１〜３の命令によって計算されてデータＲＡＭ１２２の行１に書き込まれた隠れ層ノードＺ値は、第２の時間ステップ（時間ステップ１）の隠れ層ノードＺ値の算出において、アドレス７及び８の命令の１回目の実行インスタンスによって使用されるコンテキスト層ノードＣ値になる。
【０２９４】
アドレス１及び２の命令の実行中、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、データＲＡＭ１２２の行０にある５１２個の入力ノードＤ値と、重みＲＡＭ１２４の行０〜５１１からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って、それぞれのＮＰＵ１２６の累算器２０２に累算される５１２個の積を生成する。アドレス３の命令の実行中、５１２個のＮＰＵ１２６の５１２個の累算器２０２値がパススルーされ、データＲＡＭ１２２の行１に書き込まれる。すなわち、アドレス３の出力命令は、データＲＡＭ１２２の行１に、初期隠れ層Ｚ値である５１２個のＮＰＵ１２６各々の累算器２０２値を書き込み、その後累算器２０２をクリアする。
【０２９５】
図４２の非アーキテクチャプログラムのアドレス１〜２にある命令によって行われる動作は、多くの点で、図４の非アーキテクチャプログラムのアドレス１〜２にある命令によって行われる動作と似ている。より具体的には、アドレス１の命令（ＭＵＬＴ−ＡＣＣＵＭ  ＤＲ  ＲＯＷ０）は、５１２個のＮＰＵ１２６各々に、各自のｍｕｘ−ｒｅｇ２０８にデータＲＡＭ１２２の行０の各自のワードを読み込み、各自のｍｕｘ−ｒｅｇ７０５に重みＲＡＭ１２４の行０の各自のワードを読み込み、そのデータワードと重みワードとを乗算して積を生成し、その積を累算器２０２に加算するように命令する。アドレス２の命令（ＭＵＬＴ−ＡＣＣＵＭ  ＲＯＴＡＴＥ，ＷＲ  ＲＯＷ＋１，ＣＯＵＮＴ＝５１１）は、５１２個のＮＰＵ１２６各々に、各自のｍｕｘ−ｒｅｇ２０８に、隣接するＮＰＵ１２６からのワードを循環させ（直前にデータＲＡＭ１２２の行がアドレス１の命令によって読み込まれた、ＮＮＵ１２１の５１２個のｍｕｘ−ｒｅｇ２０８の集合的な動作によって形成される５１２ワード循環器を使用する）、各自のｍｕｘ−ｒｅｇ７０５に、重みＲＡＭ１２４の次の行の各自のワードを読み込み、そのデータワードと重みワードとを乗算して積を生成し、その積を累算器２０２に加算し、この動作を５１１回行うように命令する。
【０２９６】
さらに、図４２のアドレス３の単一の非アーキテクチャ出力命令（ＯＵＴＰＵＴ  ＰＡＳＳＴＨＲＵ，ＤＲ  ＯＵＴ  ＲＯＷ  １，ＣＬＲ  ＡＣＣ）は、図４のアドレス３及び４の活性化関数命令と出力書き出し命令の動作を組み合わせたものである（ただし、図４２のプログラムでは、累算器２０２の値がパススルーされるのに対し、図４のプログラムでは活性化関数が累算器２０２の値に行われる。）すなわち、図４２のプログラムでは、存在する場合には、累算器２０２値に行われる活性化関数が、図４のプログラムのように別個の非アーキテクチャ活性化関数命令内ではなく、出力命令内で（またアドレス６及び１１の出力命令でも）指定される。図４（並びに図２０、図２６Ａ、及び図２８）の非アーキテクチャプログラムの代替実施形態が企図され、ここでは、活性化関数命令と出力書き出し命令（例えば、図４のアドレス３及び４）の動作が組み合わせられて、図４２のように単一の非アーキテクチャ出力命令とされる。図４２の例は、隠れ層（Ｚ）のノードは累算器値に活性化関数を行わないと仮定する。ただし、隠れ層（Ｚ）が累算器値に活性化関数を行う他の実施形態が企図され、その場合はアドレス３及び１１の命令がそのように、例えばシグモイド、ｔａｎｈ、正規化を行う。
【０２９７】
アドレス１〜３の命令の実行インスタンスが１回であるのと対照的に、アドレス４〜１１の命令は、プログラムのループ本体の内側であり、ループカウントで指示される回数（例えば、２０回）実行される。アドレス７〜１１の命令の最初の１９回の実行インスタンスは、隠れ層ノードＺの値を計算し、それらをデータＲＡＭ１２２に書き込み、それらの値は、残りの時間ステップ（時間ステップ１〜１９）の出力層ノードＹを計算するためにアドレス４〜６の命令の２回目〜２０回目の実行インスタンスによって使用される。（アドレス７〜１１の命令の最後／２０回目の実行インスタンスは、隠れ層ノードＺの値を計算し、それらをデータＲＡＭ１２２の行６１に書き込むが、それらの値は使用されない。）
【０２９８】
アドレス４及び５の命令（ＭＵＬＴ−ＡＣＣＵＭ  ＤＲ  ＲＯＷ＋１，ＷＲ  ＲＯＷ  ５１２、及び、ＭＵＬＴ−ＡＣＣＵＭ  ＲＯＴＡＴＥ，ＷＲ  ＲＯＷ＋１，ＣＯＵＮＴ＝５１１）の１回目の実行インスタンス中（時間ステップ０について）、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、データＲＡＭ１２２の行１にある５１２個の隠れノードＺ値（アドレス１〜３の命令の１回の実行インスタンスで生成され、書き込まれたもの）と、重みＲＡＭ１２４の行５１２〜１０２３からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って、それぞれのＮＰＵ１２６の累算器２０２に累算される５１２個の積を生成する。アドレス６の命令（ＯＵＴＰＵＴ  ＡＣＴＩＶＡＴＩＯＮ  ＦＵＮＣＴＩＯＮ，ＤＲ  ＯＵＴ  ＲＯＷ＋１，ＣＬＲ  ＡＣＣ）の１回目の実行インスタンス中に、活性化関数（例えば、シグモイド、ｔａｎｈ、正規化）が５１２個の累算値に行われて出力ノードＹ層の値を計算し、その結果がデータＲＡＭ１２２の行２に書き込まれる。
【０２９９】
アドレス４及び５の命令の２回目の実行インスタンス中（時間ステップ１について）、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、データＲＡＭ１２２の行４にある５１２個の隠れノードＺ値（アドレス７〜１１の命令の１回目の実行インスタンスで生成され、書き込まれたもの）と、重みＲＡＭ１２４の行５１２〜１０２３からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って、それぞれのＮＰＵ１２６の累算器２０２に累算される５１２個の積を生成する。アドレス６の命令の２回目の実行インスタンス中に、活性化関数が５１２個の累算値に行われて、出力ノードＹ層値を計算し、それらがデータＲＡＭ１２２の行５に書き込まれる。アドレス４及び５の命令の３回目の実行インスタンス中（時間ステップ２について）、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、データＲＡＭ１２２の行７にある５１２個の隠れノードＺ値（アドレス７〜１１の命令の２回目の実行インスタンスで生成され、書き込まれたもの）と、重みＲＡＭ１２４の行５１２〜１０２３からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って、それぞれのＮＰＵ１２６の累算器２０２に累算される５１２個の積を生成する。アドレス６の命令の３回目の実行インスタンス中に、活性化関数が５１２個の累算値に行われて、出力ノードＹ層値を計算し、それらがデータＲＡＭ１２２の行８に書き込まれる。以下同様に続き、最後、アドレス４及び５の命令の２０回目の実行インスタンス中（時間ステップ１９について）、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、データＲＡＭ１２２の行５８にある５１２個の隠れノードＺ値（アドレス７〜１１の命令の１９回目の実行インスタンスで生成され、書き込まれたもの）と、重みＲＡＭ１２４の行５１２〜１０２３からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って、それぞれのＮＰＵ１２６の累算器２０２に累算される５１２個の積を生成する。アドレス６の命令の２０回目の実行インスタンス中に、活性化関数が５１２個の累算値に行われて、出力ノードＹ層値を計算し、その結果がデータＲＡＭ１２２の行５９に書き込まれる。
【０３００】
アドレス７及び８の命令の１回目の実行インスタンス中に、５１２個のＮＰＵ１２６の各々は、各自の累算器２０２に、アドレス１〜３の命令の１回の実行インスタンスで生成された、データＲＡＭ１２２の行１にある５１２個のコンテキストノードＣ値を累算する。より具体的には、アドレス７の命令（ＡＤＤ＿Ｄ＿ＡＣＣ  ＤＲ  ＲＯＷ＋０）は、５１２個のＮＰＵ１２６各々に、各自のｍｕｘ−ｒｅｇ２０８に、データＲＡＭ１２２の現在の行（１回目の実行インスタンスの間は行０）のそれぞれのワードを読み込み、そのワードを累算器２０２に加算するように命令する。アドレス８の命令（ＡＤＤ＿Ｄ＿ＡＣＣ  ＲＯＴＡＴＥ，ＣＯＵＮＴ＝５１１）は、５１２個のＮＰＵ１２６各々に、各自のｍｕｘ−ｒｅｇ２０８に、隣接するＮＰＵ１２６からのワードを循環させ（データＲＡＭ１２２の行が直前にアドレス７の命令によって読み込まれた、ＮＮＵ１２１の５１２個のｍｕｘ−ｒｅｇ２０８の集合的な動作によって形成される５１２ワード循環器を使用する）、そのワードを累算器２０２に加算し、この動作を５１１回行うように命令する。
【０３０１】
アドレス７及び８の命令の２回目の実行インスタンス中に、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、各自の累算器２０２に、データＲＡＭ１２２の行４の５１２個のコンテキストノードＣ値を累算し、それらの値は、アドレス９〜１１の命令の１回目の実行インスタンスによって生成されて書き込まれたものである。アドレス７及び８の命令の３回目の実行インスタンス中に、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、各自の累算器２０２に、データＲＡＭ１２２の行７の５１２個のコンテキストノードＣ値を累算し、それらの値は、アドレス９〜１１の命令の２回目の実行インスタンスによって生成されて書き込まれたものである。以下同様に続き、最後、アドレス７及び８の命令の２０回目の実行インスタンス中に、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、各自の累算器２０２に、データＲＡＭ１２２の行５８の５１２個のコンテキストノードＣ値を累算し、それらの値は、アドレス９〜１１の命令の１９回目の実行インスタンスによって生成されて書き込まれたものである。
【０３０２】
上記で述べたように、図４２の例は、コンテキストノードＣから隠れ層ノードＺへの接続に関連付けられた重みがすべて、単位的な値を有すると仮定している。ただし、それらの接続が非ゼロの重み値を有する代替実施形態のＥｌｍａｎ  ＲＮＮでは、重みは、図４２のプログラムの実行前に重みＲＡＭ１２４に入れられ（例えば、行１０２４〜１５３５）、アドレス７のプログラム命令は、ＭＵＬＴ−ＡＣＣＵＭ  ＤＲ  ＲＯＷ＋０，ＷＲ  ＲＯＷ  １０２４であり、アドレス８のプログラム命令は、ＭＵＬＴ−ＡＣＣＵＭ  ＲＯＴＡＴＥ，ＷＲ  ＲＯＷ＋１，ＣＯＵＮＴ＝５１１である。好ましくは、アドレス８の命令は、重みＲＡＭ１２４にアクセスするのではなく、代わりに、アドレス７の命令によって重みＲＡＭ１２４からｍｕｘ−ｒｅｇ７０５に読み込まれた値を循環させる。アドレス８の命令の実行の５１１回のクロックサイクル中に重みＲＡＭ１２４にアクセスしないことは、アーキテクチャプログラムが重みＲＡＭ１２４にアクセスするための帯域幅をより多く残すことから、有利である可能性がある。
【０３０３】
アドレス９及び１０の命令（ＭＵＬＴ−ＡＣＣＵＭ  ＤＲ  ＲＯＷ＋２，ＷＲ  ＲＯＷ  ０、及びＭＵＬＴ−ＡＣＣＵＭ  ＲＯＴＡＴＥ，ＷＲ  ＲＯＷ  ＋１，ＣＯＵＮＴ＝５１１）の１回目の実行インスタンス中（時間ステップ１について）、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、データＲＡＭ１２２の行３にある５１２個の入力ノードＤ値と、重みＲＡＭ１２４の行０〜５１１からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って５１２個の積を生成し、それらの積は、アドレス７及び８の命令によって行われる５１２個のコンテキストＣノード値の累算と併せて、それぞれのＮＰＵ１２６の累算器２０２に累算されて、隠れノードＺ層値を計算する。アドレス１１の命令（ＯＵＴＰＵＴ  ＰＡＳＳＴＨＲＵ，ＤＲ  ＯＵＴ  ＲＯＷ  ＋２，ＣＬＲ  ＡＣＣ）の１回目の実行中に、５１２個のＮＰＵ１２６の５１２個の累算器２０２値がパススルーされ、データＲＡＭ１２２の行４に書き込まれ、累算器２０２がクリアされる。アドレス９及び１０の命令の２回目の実行インスタンス中（時間ステップ２について）、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、データＲＡＭ１２２の行６にある５１２個の入力ノードＤ値と、重みＲＡＭ１２４の行０〜５１１からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って５１２個の積を生成し、それらの積は、アドレス７及び８の命令によって行われる５１２個のコンテキストＣノード値の累算と併せて、それぞれのＮＰＵ１２６の累算器２０２に累算されて、隠れノードＺ層値を計算する。アドレス１１の命令の２回目の実行中に、５１２個のＮＰＵ１２６の５１２個の累算器２０２値がパススルーされ、データＲＡＭ１２２の行７に書き込まれ、累算器２０２がクリアされる。以下同様に続き、最後、アドレス９及び１０の命令の１９回目の実行インスタンス中（時間ステップ１９について）、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、データＲＡＭ１２２の行５７にある５１２個の入力ノードＤ値と、重みＲＡＭ１２４の行０〜５１１からのＮＰＵ１２６個々の重みの列との５１２回の乗算演算を行って５１２個の積を生成し、それらの積は、アドレス７及び８の命令によって行われる５１２個のコンテキストＣノード値の累算と併せて、それぞれのＮＰＵ１２６の累算器２０２に累算されて、隠れノードＺ層値を計算する。アドレス１１の命令の１９回目の実行中に、５１２個のＮＰＵ１２６の５１２個の累算器２０２値がパススルーされ、データＲＡＭ１２２の行５８に書き込まれ、累算器２０２がクリアされる。上記で暗に触れたように、アドレス９及び１０の命令の２０回目の実行インスタンス中に生成されて、データＲＡＭ１２２の行６１に書き込まれる隠れノードＺ層値は、使用されない。
【０３０４】
アドレス１２の命令（ＬＯＯＰ  ４）は、ループカウンタ３８０４を減分し、新しいループカウンタ３８０４値がゼロより大きければアドレス４の命令にループバックする。
【０３０５】
次いで図４３を参照すると、Ｊｏｒｄａｎ  ＲＮＮの例を図示するブロック図が示される。図４３のＪｏｒｄａｎ  ＲＮＮは、入力層ノード／ニューロンＤ、隠れ層ノード／ニューロンＺ、出力層ノード／ニューロンＹ、及びコンテキスト層ノード／ニューロンＣを含む点において、多くの点で図４０のＥｌｍａｎ  ＲＮＮに似ている。ただし、図４３のＪｏｒｄａｎ  ＲＮＮでは、コンテキスト層ノードＣは、図４０のＥｌｍａｎ  ＲＮＮのように隠れ層ノードＺの出力からではなく、対応する出力層ノードＹの出力から後ろにフィードバックする入力接続を有する。
【０３０６】
本開示の目的には、Ｊｏｒｄａｎ  ＲＮＮは、少なくとも、入力ノード層、隠れノード層、出力ノード層、及びコンテキストノード層を備えるリカレントニューラルネットワークである。所与の時間ステップの開始時に、コンテキストノード層は、出力ノード層が前の時間ステップに生成した、出力ノード層からコンテキストノード層にフィードバックされた結果を含んでいる。コンテキスト層にフィードバックされる結果は、活性化関数の結果である場合も、又は、活性化関数を実行せずに出力ノード層によって行われた累算の結果である場合もある。
【０３０７】
次いで図４４を参照すると、ＮＮＵ１２１が図４３のＪｏｒｄａｎ  ＲＮＮに関連する算出を行う際の、ＮＮＵ１２１のデータＲＡＭ１２２及び重みＲＡＭ１２４内のデータのレイアウトの例を図示するブロック図が示される。図４４の例では、図４３のＪｏｒｄａｎ  ＲＮＮは、５１２個の入力ノードＤ、５１２個の隠れノードＺ、５１２個のコンテキストノードＣ、及び５１２個の出力ノードＹを有すると仮定される。さらに、このＪｏｒｄａｎ  ＲＮＮは完全に接続されていると仮定され、すなわち、５１２個の入力ノードＤすべてが、隠れノードＺ各々への入力として接続され、５１２個のコンテキストノードＣすべてが隠れノードＺ各々への入力として接続され、５１２個の隠れノードＺすべてが出力ノードＹ各々への入力として接続されている。図４４の例示的なＪｏｒｄａｎ  ＲＮＮでは、活性化関数が累算器２０２値に適用されて出力層ノードＹ値を生成するが、実際の出力層ノードＹ値ではなく、活性化関数を適用する前の累算器２０２値が、コンテキスト層ノードＣにパススルーされると仮定される。加えて、ＮＮＵ１２１は、例えばワイド構成において、５１２個のＮＰＵ１２６、又はニューロンとして構成される。最後、コンテキストノードＣから隠れノードＺへの接続に関連付けられた重みはすべて１の値を持つと仮定され、したがって、それらの単位的な重み値を記憶する必要はない。
【０３０８】
図４１の例と同様に、示されるように、重みＲＡＭ１２４の下５１２行（行０〜５１１）は、入力ノードＤと隠れノードＺとの間の接続に関連付けられた重み値を保持し、重みＲＡＭ１２４の次の５１２行（行５１２〜１０２３）は、隠れノードＺと出力ノードＹとの間の接続に関連付けられた重み値を保持する。
【０３０９】
データＲＡＭ１２２は、図４１の例と同様に、時間ステップの連続についてＪｏｒｄａｎ  ＲＮＮのノード値を保持するが、図４４の例では、４行からなる四つ組が、所与の時間ステップについてのノード値を保持する。データＲＡＭ１２２が６４行を持つ実施形態では、示されるように、データＲＡＭ１２２は、１５個の異なる時間ステップについてノード値を保持することができる。図４４の例では、行０〜３は時間ステップ０のノード値を保持し、行４〜７は時間ステップ１のノード値を保持し、以下同様に続き、行６０〜６３は時間ステップ１５のノード値を保持する。四つ組のうち第１の行は、その時間ステップの入力ノードＤ値を保持する。四つ組のうち第２の行は、その時間ステップの隠れノードＺ値を保持する。四つ組のうち第３の行は、その時間ステップのコンテキストノードＣ値を保持する。四つ組のうち第４の行は、その時間ステップの出力ノードＹ値を保持する。示されるように、データＲＡＭ１２２の各列は、それに対応するニューロン、又はＮＰＵ１２６のノード値を保持する。すなわち、下記で図４４に関連してより詳細に説明するように、列０は、その計算がＮＰＵ０によって行われるノードＤ０、Ｚ０、Ｃ０、及びＹ０に関連付けられたノード値を保持し、列１は、その計算がＮＰＵ１によって行われるノードＤ１、Ｚ１、Ｃ１、及びＹ１に関連付けられたノード値を保持し、以下同様に続き、列５１１は、その計算がＮＰＵ５１１によって行われるノードＤ５１１、Ｚ５１１、Ｃ５１１、及びＹ５１１に関連付けられたノード値を保持する。
【０３１０】
所与の時間ステップについて図４４に示されるコンテキストノードＣ値は、その時間ステップに生成され、次の時間ステップに入力として使用される。すなわち、ＮＰＵ１２６がその時間ステップ中に計算して書き込むＣ値は、次の時間ステップ中にＺ値を計算するために（次の時間ステップの入力ノードＤ値と併せて）ＮＰＵ１２６によって使用されるＣ値になる。コンテキストノードＣの初期値（すなわち、時間ステップ０の行１のＺ値を計算するために使用されるＣ値）は、ゼロであると仮定する。これについては、図４５の非アーキテクチャプログラムに関連して、下記でより詳細に説明する。
【０３１１】
上記で図４１に関連して説明したように、好ましくは、入力ノードＤ値（図４４の例では、行０、４、及び以下同様に６０まで）は、プロセッサ１００で稼働しているアーキテクチャプログラムにより、ＭＴＮＮ命令１４００を介してデータＲＡＭ１２２に書き込まれ／投入され、図４５の非アーキテクチャプログラムなど、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって読み出される／使用される。逆に、隠れノード／コンテキストノード／出力ノードＺ／Ｃ／Ｙ値（図４４の例では、行１／２／３、４／５／６、及び以下同様に６０／６１／６２まで）は、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって、データＲＡＭ１２２に書き込まれ／投入され、プロセッサ１００で稼働しているアーキテクチャプログラムにより、ＭＦＮＮ命令１５００を介して読み出される／使用される。図４４の例は、アーキテクチャプログラムが、（１）データＲＡＭ１２２に、１５個の異なる時間ステップについての入力ノードＤ値を投入し（行０、４、及び以下同様に６０まで）、（２）図４５の非アーキテクチャプログラムを開始し、（３）非アーキテクチャプログラムが完了したことを検出し、（４）データＲＡＭ１２２から、出力ノードＹ値（行３、７、及び以下同様に６３まで）を読み出し、（５）作業、例えば携帯電話のユーザによってなされた発話の認識を行うために使用される計算を完了するのに必要とされる回数だけステップ（１）〜（４）を繰り返す、と仮定する。
【０３１２】
代替の一手法では、アーキテクチャプログラムは、（１）データＲＡＭ１２２に、単一の時間ステップの入力ノードＤ値を投入し（例えば、行０）、（２）非アーキテクチャプログラム（ループを必要とせず、データＲＡＭ１２２の行の単一の四つ組にアクセスする、図４５の変更を加えられたバージョン）を開始し、（３）非アーキテクチャプログラムが完了したことを検出し、（４）データＲＡＭ１２２から出力ノードＹ値（例えば、行３）を読み出し、（５）作業を完了するのに必要とされる回数だけステップ（１）〜（４）を繰り返す。ＲＮＮへの入力値がサンプリングされる仕方に依存して、上記２つの手法のうちいずれかがより好ましい可能性がある。例えば、作業が、入力を複数の時間ステップ（例えば、１５前後）にわたってサンプリングし、計算を行うことを許容する場合には、第１の手法の方が好ましい可能性がある。それは、その方が計算リソースが効率的で、且つ／又は性能が高い可能性が高いためである。対して、作業が単一の時間ステップでのサンプリングしか許容できない場合は、第２の手法が要求される可能性がある。
【０３１３】
第３の実施形態が企図され、これは第２の手法に似るが、データＲＡＭ１２２の行の四つ組を１つだけ使用するのではなく、非アーキテクチャプログラムが、行の四つ組を複数個使用し、すなわち第１の手法と同様に時間ステップごとに異なる四つ組を使用する。第３の実施形態では、好ましくは、アーキテクチャプログラムは、ステップ（２）の前に、例えば、アドレス１の命令内のデータＲＡＭ１２２の行を、次の四つ組をポイントするように更新することにより、非アーキテクチャプログラムを開始する前にそれを更新するステップを含む。
【０３１４】
次いで図４５を参照すると、ＮＮＵ１２１のプログラムメモリ１２９に記憶され、ＮＮＵ１２１によって実行されてＪｏｒｄａｎ  ＲＮＮを達成し、図４４の編成によるデータ及び重みを使用するプログラムを図示する表が示される。違いを説明するが、図４５の非アーキテクチャプログラムは、多くの点で図４２の非アーキテクチャプログラムに似ている。
【０３１５】
図４５の例示的プログラムは、アドレス０〜１３に１４個の非アーキテクチャ命令を含んでいる。アドレス０の命令は、累算器２０２をクリアし、ループカウンタ３８０４を１５の値に初期化して、ループ本体（アドレス４〜１２の命令）を１５回行わせる初期化命令である。好ましくは、この初期化命令はさらに、ＮＮＵ１２１をワイド構成にして、ＮＮＵ１２１が５１２個のＮＰＵ１２６として構成されるようにする。観察できるように、５１２個のＮＰＵ１２６は、アドレス１〜３及び８〜１２の命令の実行中は、５１２個の隠れ層ノードＺに対応すると共に５１２個の隠れ層ノードＺとして動作し、アドレス４、５、及び７の命令の実行中は、５１２個の出力層ノードＹに対応すると共に５１２個の出力層ノードＹとして動作する。
【０３１６】
アドレス１〜５及び７の命令は、図４２のアドレス１〜６の命令と同じであり、同じ関数を行う。アドレス１〜３の命令は、隠れ層ノードＺの初期値を計算し、それらをデータＲＡＭ１２２の行１に書き込み、それらの初期値は、第１の時間ステップ（時間ステップ０）の出力層ノードＹを算出するために、アドレス４、５、及び７の命令の１回目の実行インスタンスによって使用される。
【０３１７】
アドレス６の出力命令の１回目の実行インスタンス中に、アドレス４及び５の命令によって累算された５１２個の累算器２０２値（後に、出力ノードＹ層値を計算して書き込むアドレス７の命令によって使用される）は、パススルーされ、データＲＡＭ２２の行２に書き込まれ、それらは、第１の時間ステップ（時間ステップ０）に作り出され、第２の時間ステップ（時間ステップ１）中に使用されるコンテキスト層ノードＣ値である。アドレス６の出力命令の２回目の実行インスタンス中に、アドレス４及び５の命令によって累算された５１２個の累算器２０２値（後に、出力ノードＹ層値を計算して書き込むアドレス７の命令によって使用される）は、パススルーされ、データＲＡＭ２２の行６に書き込まれ、それらは、第２の時間ステップ（時間ステップ１）に生成され、第３の時間ステップ（時間ステップ２）中に使用されるコンテキスト層ノードＣ値である。以下同様に続き、最後、アドレス６の出力命令の１５回目の実行インスタンス中に、アドレス４及び５の命令によって累算された５１２個の累算器２０２値（後に、出力ノードＹ層値を計算して書き込むアドレス７の命令によって使用される）は、パススルーされ、データＲＡＭ２２の行５８に書き込まれ、それらは、第１５の時間ステップ（時間ステップ１４）に作り出される（また、アドレス８の命令によって読み出されるが、使用されない）コンテキスト層ノードＣ値である。
【０３１８】
アドレス８〜１２の命令は、図４２のアドレス７〜１１の命令と同じであるが、１つの違いがあり、同じ関数を行う。違いは、図４５のアドレス８にある命令では、データＲＡＭ１２２の行が１だけ増分される（ＡＤＤ＿Ｄ＿ＡＣＣ  ＤＲ  ＲＯＷ＋１）のに対して、図４２のアドレス７の命令では、データＲＡＭ１２２の行がゼロ増分されることである（ＡＤＤ＿Ｄ＿ＡＣＣ  ＤＲ  ＲＯＷ＋０）。これは、データＲＡＭ１２２内のデータのレイアウトの差に起因するものであり、具体的には、図４４のレイアウトは、コンテキスト層ノードＣ値の四つ組に別個の行（例えば、行２、６、１０など）を含むのに対し、図４１のレイアウトは、コンテキスト層ノードＣ値の三つ組に別個の行を含んでおらず、代わりに、コンテキスト層ノードＣ値は、隠れ層ノードＺ値と行を共有する（例えば、行１、４、７など）。アドレス８〜１２の命令の１５回の実行インスタンスは、隠れ層ノードＺの値を計算し、それらの値をデータＲＡＭ１２２に（行５、９、１３、及び以下同様に５７に）書き込み、それらは、第２〜第１５の時間ステップ（時間ステップ１〜１４）の出力層ノードＹを算出するために、アドレス４、５、及び７の命令の２回目〜１６回目の実行インスタンスによって使用される。（アドレス８〜１２の命令の最後／１５回目の実行インスタンスは、隠れ層ノードＺの値を計算し、それらの値をデータＲＡＭ１２２の行６１に書き込むが、それらの値は使用されない。）
【０３１９】
アドレス１３のループ命令は、ループカウンタ３８０４を減分し、新しいループカウンタ３８０４値がゼロより大きければアドレス４の命令にループバックする。
【０３２０】
代替的な一実施形態では、Ｊｏｒｄａｎ  ＲＮＮは、コンテキストノードＣが、出力ノードＹの活性化関数値、すなわち活性化関数が行われた累算値を保持するように設計される。そのような実施形態では、アドレス６の非アーキテクチャ命令は、非アーキテクチャプログラムに含まれない。それは、出力ノードＹの値がコンテキストノードＣの値と同じであるためである。したがって、消費されるデータＲＡＭ１２２の行がより少なくなる。より正確には、コンテキストノードＣ値を保持する図４４の各行（例えば、２、６、５９）が存在しない。加えて、各時間ステップは、データＲＡＭ１２２の行を３行しか必要とせず、そのため、１５個ではなく２０個の時間ステップに対応でき、図４５の非アーキテクチャプログラムの命令のアドレス指定が適宜変更を加えられる。
【０３２１】
ＬＳＴＭセル
リカレントニューラルネットワークで使用するためのロングショートタームメモリ（ＬＳＴＭ）セルの概念は、長年知られている。例えば、共にＭＩＴ  Ｐｒｅｓｓ  Ｊｏｕｒｎａｌｓから入手可能な、Ｌｏｎｇ  Ｓｈｏｒｔ−Ｔｅｒｍ  Ｍｅｍｏｒｙ，  Ｓｅｐｐ  Ｈｏｃｈｒｅｉｔｅｒ  ａｎｄ  Ｊｕｒｇｅｎ  Ｓｃｈｍｉｄｈｕｂｅｒ，  Ｎｅｕｒａｌ  Ｃｏｍｐｕｔａｔｉｏｎ，  Ｎｏｖｅｍｂｅｒ  １５，１９９７，  Ｖｏｌ．９，  Ｎｏ．８，  Ｐａｇｅｓ  １７３５−１７８０；Ｌｅａｒｎｉｎｇ  ｔｏ  Ｆｏｒｇｅｔ：  Ｃｏｎｔｉｎｕａｌ  Ｐｒｅｄｉｃｔｉｏｎ  ｗｉｔｈ  ＬＳＴＭ，  Ｆｅｌｉｘ  Ａ．  Ｇｅｒｓ，  Ｊｕｒｇｅｎ  Ｓｃｈｍｉｄｈｕｂｅｒ，ａｎｄ  Ｆｒｅｄ  Ｃｕｍｍｉｎｓ，Ｎｅｕｒａｌ  Ｃｏｍｐｕｔａｔｉｏｎ，Ｏｃｔｏｂｅｒ  ２０００，Ｖｏｌ．１２，Ｎｏ．１０，Ｐａｇｅｓ  ２４５１−２４７１を参照されたい。ＬＳＴＭセルは、様々な形態に構築可能である。下記で図４６に関連して説明するＬＳＴＭセル４６００は、ＬＳＴＭ  Ｎｅｔｗｏｒｋｓ  ｆｏｒ  Ｓｅｎｔｉｍｅｎｔ  Ａｎａｌｙｓｉｓと題された、ｈｔｔｐ：／／ｄｅｅｐｌｅａｒｎｉｎｇ．ｎｅｔ／ｔｕｔｏｒｉａｌ／ｌｓｔｍ．ｈｔｍｌで得られる指導書に記載されるＬＳＴＭセルの後を追って、モデル化されたものである。この文献のコピーは、２０１５年１０月１９日にダウンロードされ（以降「ＬＳＴＭ指導書」）、本明細書と共に提供される情報開示陳述書（ＩＤＳ）に提供されている。ＬＳＴＭセル４６００は、ＬＳＴＭに一般に関連する計算を効率的に行う、本明細書に記載されるＮＮＵ１２１の実施形態の能力を例証する手段として提供される。図４９に関連して説明される実施形態を含むＮＮＵ１２１を用いて、図４６に記載される計算以外のＬＳＴＭセルに関連する計算を効率的に行うことが可能であることを理解されたい。
【０３２２】
好ましくは、ＮＮＵ１２１を用いて、他の層に接続されたＬＳＴＭセルの層を含むリカレントニューラルネットワークのための計算を行うことができる。例えば、ＬＳＴＭ指導書では、ネットワークは、ＬＳＴＭ層のＬＳＴＭセルの出力（Ｈ）を受け取る中間プーリング層（mean  pooling  layer）と、中間プーリング層の出力を受け取るロジスティック回帰層（logistic  regression  layer）とを含んでいる。
【０３２３】
次いで図４６を参照すると、ＬＳＴＭセル４６００の実施形態を図示するブロック図が示される。
【０３２４】
ＬＳＴＭセル４６００は、示されるように、メモリセル入力（Ｘ）、メモリセル出力（Ｈ）、入力ゲート（Ｉ）、出力ゲート（Ｏ）、忘却ゲート（Ｆ）、セル状態（Ｃ）、及び候補セル状態（Ｃ’）を含む。入力ゲート（Ｉ）は、メモリセル入力（Ｘ）をセル状態（Ｃ）にゲートし、出力ゲート（Ｏ）は、セル状態（Ｃ）をメモリセル出力（Ｈ）にゲートする。セル状態（Ｃ）は、時間ステップの候補セル状態（Ｃ’）としてフィードバックされる。忘却ゲート（Ｆ）は、フィードバックされた候補セル状態（Ｃ’）をゲートし、それが次の時間ステップのセル状態（Ｃ）になる。
【０３２５】
図４６の実施形態では、以下の式が、上記で指定された様々な値を計算するために使用される。
【０３２６】
（１）Ｉ＝ＳＩＧＭＯＩＤ（Ｗｉ＊Ｘ＋Ｕｉ＊Ｈ＋Ｂｉ）
【０３２７】
（２）Ｆ＝ＳＩＧＭＯＩＤ（Ｗｆ＊Ｘ＋Ｕｆ＊Ｈ＋Ｂｆ）
【０３２８】
（３）Ｃ’＝ＴＡＮＨ（Ｗｃ＊Ｘ＋Ｕｃ＊Ｈ＋Ｂｃ）
【０３２９】
（４）Ｃ＝Ｉ＊Ｃ’＋Ｆ＊Ｃ
【０３３０】
（５）Ｏ＝ＳＩＧＭＯＩＤ（Ｗｏ＊Ｘ＋Ｕｏ＊Ｈ＋Ｂｏ）
【０３３１】
（６）Ｈ＝Ｏ＊ＴＡＮＨ（Ｃ）
【０３３２】
Ｗｉ及びＵｉは、入力ゲート（Ｉ）に関連付けられた重み値であり、Ｂｉは、入力ゲート（Ｉ）に関連付けられたバイアス値である。Ｗｆ及びＵｆは、忘却ゲート（Ｆ）に関連付けられた重み値であり、Ｂｆは、忘却ゲート（Ｆ）に関連付けられたバイアス値である。Ｗｏ及びＵｏは、出力ゲート（Ｏ）に関連付けられた重み値であり、Ｂｏは、出力ゲート（Ｏ）に関連付けられたバイアス値である。示されるように、式（１）、（２）、及び（５）は、それぞれ入力ゲート（Ｉ）、忘却ゲート（Ｆ）、及び出力ゲート（Ｏ）を計算する。式（３）は、候補セル状態（Ｃ’）を計算し、式（４）は、現在のセル状態（Ｃ）を入力として使用して、すなわち現在の時間ステップのセル状態（Ｃ）を使用して、候補セル状態（Ｃ’）を計算する。式（６）は、セル出力（Ｈ）を計算する。入力ゲート、忘却ゲート、出力ゲート、候補セル状態、セル状態、及びセル出力に異なる計算を用いるＬＳＴＭセルの他の実施形態が企図される。
【０３３３】
本開示の目的には、ＬＳＴＭセルは、メモリセル入力、メモリセル出力、セル状態、候補セル状態、入力ゲート、出力ゲート、及び忘却ゲートを備える。時間ステップごとに、入力ゲート、出力ゲート、忘却ゲート、及び候補セル状態は、現在の時間ステップのメモリセル入力及び前の時間ステップのメモリセル出力、並びに関連する重みの関数である。時間ステップのセル状態は、前の時間ステップのセル状態、候補セル状態、入力ゲート、及び忘却ゲートの関数である。この意味で、セル状態は、フィードバックされ、次の時間ステップのセル状態の算出で使用される。時間ステップのメモリセル出力は、その時間ステップに対して計算されるセル状態及び出力ゲートの関数である。ＬＳＴＭネットワークは、ＬＳＴＭセルの層を含んでいるニューラルネットワークである。
【０３３４】
次いで図４７を参照すると、ＮＮＵ１２１が図４６の１２８個のＬＳＴＭセル４６００の層に関連する算出を行う際の、ＮＮＵ１２１のデータＲＡＭ１２２及び重みＲＡＭ１２４内のデータのレイアウトの例を図示するブロック図が示される。図４７の例では、ＮＮＵ１２１は、例えばワイド構成において、５１２個のＮＰＵ１２６又はニューロンとして構成されるが、１２８個のＮＰＵ１２６（例えば、ＮＰＵ０〜１２７）のみによって生成される値が使用される。これは、この例では、ＬＳＴＭ層には１２８個のＬＳＴＭセル４６００しかないためである。
【０３３５】
示されるように、重みＲＡＭ１２４は、ＮＮＵ１２１の対応するＮＰＵ０〜１２７についての重み、バイアス、及び中間値を保持する。重みＲＡＭ１２４の列０〜１２７は、ＮＮＵ１２１の対応するＮＰＵ０〜１２７についての重み、バイアス、及び中間値を保持する。行０〜１４は各々、ＮＰＵ０〜１２７に提供するための上記の式（１）〜（６）の以下のそれぞれの値、すなわち、Ｗｉ、Ｕｉ、Ｂｉ、Ｗｆ、Ｕｆ、Ｂｆ、Ｗｃ、Ｕｃ、Ｂｃ、Ｃ’、ＴＡＮＨ（Ｃ）、Ｃ、Ｗｏ、Ｕｏ、Ｂｏを１２８個保持する。好ましくは、重み及びバイアス値、すなわち、Ｗｉ、Ｕｉ、Ｂｉ、Ｗｆ、Ｕｆ、Ｂｆ、Ｗｃ、Ｕｃ、Ｂｃ、Ｗｏ、Ｕｏ、Ｂｏ（行０〜８及び１２〜１４）は、プロセッサ１００で稼働しているアーキテクチャプログラムによりＭＴＮＮ命令１４００を介して重みＲＡＭ１２４に書き込まれ／投入され、図４８の非アーキテクチャプログラムなど、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって読み出される／使用される。好ましくは、下記でより詳細に説明するように、中間値、すなわちＣ’、ＴＡＮＨ（Ｃ）、Ｃ（行９〜１１）は、重みＲＡＭ１２４に書き込まれ／投入され、また、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって読み出される／使用される。
【０３３６】
示されるように、データＲＡＭ１２２は、時間ステップの連続について、入力（Ｘ）、出力（Ｈ）、入力ゲート（Ｉ）、忘却ゲート（Ｆ）、及び出力ゲート（Ｏ）の値を保持する。より具体的には、５つの行からなる五つ組が、所与の時間ステップについてのＸ、Ｈ、Ｉ、Ｆ、及びＯ値を保持する。データＲＡＭ１２２が６４行を有する一実施形態では、データＲＡＭ１２２は、示されるように、１２個の異なる時間ステップについてのセル値を保持することができる。図４７の例では、行０〜４は、時間ステップ０のセル値を保持し、行５〜９は時間ステップ１のセル値を保持し、以下同様に続き、行５５〜５９は時間ステップ１１のセル値を保持する。五つ組のうち第１の行は、その時間ステップのＸ値を保持する。五つ組のうち第２の行は、その時間ステップのＨ値を保持する。五つ組のうち第３の行は、その時間ステップのＩ値を保持する。五つ組のうち第４の行は、その時間ステップのＦ値を保持する。五つ組のうち第５の行は、その時間ステップのＯ値を保持する。示されるように、データＲＡＭ１２２の各列は、それに対応するニューロン、又はＮＰＵ１２６の値を保持する。すなわち、下記で図４８に関連してより詳細に説明するように、列０は、計算がＮＰＵ０によって行われるＬＳＴＭセル０に関連付けられた値を保持し、列１は、計算がＮＰＵ１によって行われるＬＳＴＭセル１に関連付けられた値を保持し、以下同様に続き、列１２７は、計算がＮＰＵ１２７によって行われるＬＳＴＭセル１２７に関連付けられた値を保持する。
【０３３７】
好ましくは、Ｘ値（行０、５、９、及び以下同様に５５まで）は、プロセッサ１００で稼働しているアーキテクチャプログラムにより、ＭＴＮＮ命令１４００を介してデータＲＡＭ１２２に書き込まれ／投入され、図４８の非アーキテクチャプログラムなど、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって読み出される／使用される。好ましくは、下記でより詳細に説明するように、Ｉ、Ｆ、及びＯ値（行２／３／４、７／８／９、１２／１３／１４、及び以下同様に５７／５８／５９まで）は、データＲＡＭ１２２に書き込まれ／投入され、また、ＮＮＵ１２１で稼働している非アーキテクチャプログラムにより、読み出される／使用される。好ましくは、Ｈ値（行１、６、１０、及び以下同様に５６まで）は、データＲＡＭ１２２に書き込まれ／投入され、また、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって読み出され／使用され、プロセッサ１００で稼働しているアーキテクチャプログラムにより、ＭＦＮＮ命令１５００を介して読み出される。
【０３３８】
図４７の例は、アーキテクチャプログラムが、（１）データＲＡＭ１２２に、１２個の異なる時間ステップについての入力Ｘ値を投入し（行０、５、及び以下同様に５５まで）、（２）図４８の非アーキテクチャプログラムを開始し、（３）非アーキテクチャプログラムが完了したことを検出し、（４）データＲＡＭ１２２から出力Ｈ値（行１、６、及び以下同様に５９まで）を読み出し、（５）作業、例えば携帯電話のユーザによってなされた発話の認識を行うために使用される計算を完了するのに必要とされる回数だけステップ（１）〜（４）を繰り返す、と仮定する。
【０３３９】
代替の一手法では、アーキテクチャプログラムは、（１）データＲＡＭ１２２に、単一の時間ステップの入力Ｘ値を投入し（例えば、行０）、（２）非アーキテクチャプログラム（ループを必要とせず、データＲＡＭ１２２の行の単一の五つ組にアクセスする、図４８の変更を加えられたバージョン）を開始し、（３）非アーキテクチャプログラムが完了したことを検出し、（４）データＲＡＭ１２２から出力Ｈ値（例えば、行１）を読み出し、（５）作業を完了するのに必要とされる回数だけステップ（１）〜（４）を繰り返す。ＬＳＴＭ層への入力Ｘ値がサンプリングされる仕方に依存して、上記２つの手法のうちいずれかがより好ましい可能性がある。例えば、作業が、入力を複数の時間ステップ（例えば、１２前後）にわたってサンプリングし、計算を行うことを許容する場合には、第１の手法が好ましい可能性がある。それは、その方が計算リソースが効率的で、且つ／又は性能が高い可能性が高いためである。対して、作業が単一の時間ステップでのサンプリングしか許容できない場合は、第２の手法が要求される可能性がある。
【０３４０】
第３の実施形態が企図され、これは第２の手法に似るが、データＲＡＭ１２２の行の五つ組を１つだけ使用するのではなく、非アーキテクチャプログラムが、行の五つ組を複数個使用し、すなわち第１の手法と同様に時間ステップごとに異なる五つ組を使用する。第３の実施形態では、好ましくは、アーキテクチャプログラムは、ステップ（２）の前に、例えば、アドレス０の命令内のデータＲＡＭ１２２の行を、次の五つ組をポイントするように更新することにより、非アーキテクチャプログラムを開始する前にそれを更新するステップを含む。
【０３４１】
次いで図４８を参照すると、ＮＮＵ１２１のプログラムメモリ１２９に記憶されＮＮＵ１２１によって実行されて、ＬＳＴＭセル層に関連し、図４７の編成によるデータ及び重みを使用する計算を達成するプログラムを図示する表が示される。図４８の例示的プログラムは、アドレス０〜２３に２４個の非アーキテクチャ命令を含んでいる。アドレス０の命令（ＩＮＩＴＩＡＬＩＺＥ  ＮＰＵ，ＣＬＲ  ＡＣＣ，ＬＯＯＰＣＮＴ＝１２，ＤＲ  ＩＮ  ＲＯＷ＝−１，ＤＲ  ＯＵＴ  ＲＯＷ＝２）は、累算器２０２をクリアし、ループカウンタ３８０４を１２の値に初期化して、ループ本体（アドレス１〜２２の命令）を１２回行わせる。この初期化命令はさらに、読み出されるデータＲＡＭ１２２行（例えば、図２６／３９のレジスタ２６０８）を−１の値に初期化し、この値は、アドレス１の命令の１回目の実行インスタンスによってゼロに増分されることになる。初期化命令はさらに、書き込まれるデータＲＡＭ１２２行（例えば、図２６／３９のレジスタ２６０６）を行２に初期化する。好ましくは、初期化命令はさらに、ＮＮＵ１２１をワイド構成にして、ＮＮＵ１２１が５１２個のＮＰＵ１２６として構成されるようにする。下記の説明から観察できるように、５１２個のＮＰＵ１２６のうち１２８個が、アドレス０〜２３の命令の実行中に、１２８個のＬＳＴＭセル４６００に対応し、１２８個のＬＳＴＭセル４６００として動作する。
【０３４２】
図４７に示されるように、アドレス１〜４の命令の１回目の実行インスタンス中、１２８個のＮＰＵ１２６（すなわち、ＮＰＵ１２６  ０〜１２７）の各々は、第１の時間ステップ（時間ステップ０）についての各自の対応するＬＳＴＭセル４６００の入力ゲート（Ｉ）値を計算し、そのＩ値を、データＲＡＭ１２２の行２の対応するワードに書き込む。アドレス１〜４の命令の２回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第２の時間ステップ（時間ステップ１）についての各自の対応するＬＳＴＭセル４６００のＩ値を計算し、そのＩ値を、データＲＡＭ１２２の行７の対応するワードに書き込む。以下同様に続き、最後、アドレス１〜４の命令の１２回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第１２の時間ステップ（時間ステップ１１）について各自の対応するＬＳＴＭセル４６００のＩ値を計算し、そのＩ値を、データＲＡＭ１２２の行５７の対応するワードに書き込む。
【０３４３】
より具体的には、アドレス１の積和命令は、現在の時間ステップに関連付けられたセル入力（Ｘ）値を含んでいる現在のデータＲＡＭ１２２行の後の次の行（１回目の実行インスタンス時は行０、２回目の実行インスタンス時は行５、及び以下同様に１２回目の実行インスタンス時は行５５）を読み出し、Ｗｉ値を含んでいる重みＲＡＭ１２４の行０を読み出し、それらを乗算して、累算器２０２に累算される第１の積を生成し、累算器２０２は、アドレス０の初期化命令又はアドレス２２の命令のどちらかによってちょうどクリアされている。次に、アドレス２の積和命令が、現在の時間ステップに関連付けられたセル出力（Ｈ）値を含んでいる次のデータＲＡＭ１２２行（１回目の実行インスタンス時は行１、２回目の実行インスタンス時は行６、及び以下同様に１２回目の実行インスタンスの行５６）を読み出し、Ｕｉ値を含んでいる重みＲＡＭ１２４の行１を読み出し、それらを乗算して、累算器２０２に加算される第２の積を生成する。アドレス２の命令（並びにアドレス６、１０、及び１８の命令）によってデータＲＡＭ１２２から読み出される現在の時間ステップに関連付けられているＨ値は、前の時間ステップの間に生成され、アドレス２２の出力命令によってデータＲＡＭ１２２に書き込まれたものであるが、アドレス２の命令の１回目の実行インスタンス時の場合には、データＲＡＭ１２２の行１にあるＨ値には初期値が書き込まれている。好ましくは、アーキテクチャプログラムは、図４８の非アーキテクチャプログラムを開始する前に、（例えば、ＭＴＮＮ命令１４００を使用して）初期Ｈ値をデータＲＡＭ１２２の行１に書き込む。ただし、非アーキテクチャプログラムが初期Ｈ値をデータＲＡＭ１２２の行１に書き込む初期命令を含んでいる他の実施形態が企図される。一実施形態では、初期Ｈ値はゼロである。次に、アドレス３の重みワードを累算器に加算する命令（ＡＤＤ＿Ｗ＿ＡＣＣ  ＷＲ  ＲＯＷ  ２）が、Ｂｉ値を含んでいる重みＲＡＭ１２４の行２を読み出し、それらを累算器２０２に加算する。最後、アドレス４の出力命令（ＯＵＴＰＵＴ  ＳＩＧＭＯＩＤ，ＤＲ  ＯＵＴ  ＲＯＷ＋０，ＣＬＲ  ＡＣＣ）がシグモイド活性化関数を累算器２０２値に行い、その結果を現在のデータＲＡＭ１２２の出力行（１回目の実行インスタンスでは行２、２回目の実行インスタンスでは行７、及び以下同様に１２回目の実行インスタンスでは行５７）に書き込み、累算器２０２をクリアする。
【０３４４】
図４７に示されるように、アドレス５〜８の命令の１回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第１の時間ステップ（時間ステップ０）についての各自の対応するＬＳＴＭセル４６００の忘却ゲート（Ｆ）値を計算し、そのＦ値を、データＲＡＭ１２２の行３の対応するワードに書き込む。アドレス５〜８の命令の２回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第２の時間ステップ（時間ステップ１）についての各自の対応するＬＳＴＭセル４６００のＦ値を計算し、そのＦ値を、データＲＡＭ１２２の行８の対応するワードに書き込む。以下同様に続き、最後、アドレス５〜８の命令の１２回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第１２の時間ステップ（時間ステップ１１）についての各自の対応するＬＳＴＭセル４６００のＦ値を計算し、そのＦ値を、データＲＡＭ１２２の行５８の対応するワードに書き込む。アドレス５〜８の命令は、上記のアドレス１〜４の命令と同じようにしてＦ値を計算するが、アドレス５〜７の命令は、Ｗｆ、Ｕｆ、及びＢｆ値を、重みＲＡＭ１２４のそれぞれ行３、４、及び５から読み出して、乗算及び／又は加算演算を行う。
【０３４５】
アドレス９〜１２の命令の１２回の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、対応する時間ステップについての各自の対応するＬＳＴＭセル４６００の候補セル状態（Ｃ’）値を計算し、そのＣ’値を、重みＲＡＭ１２４の行９の対応するワードに書き込む。アドレス９〜１２の命令は、上記のアドレス１〜４の命令と同じようにしてＣ’値を計算するが、アドレス９〜１１の命令は、Ｗｃ、Ｕｃ、及びＢｃ値を、重みＲＡＭ１２４のそれぞれ行６、７、及び８から読み出して乗算及び／又は加算演算を行う。加えて、アドレス１２の出力命令は、シグモイド活性化関数（アドレス４の出力命令が行うように）ではなく、ｔａｎｈ活性化関数を行う。
【０３４６】
より具体的には、アドレス９の積和命令は、現在の時間ステップに関連付けられたセル入力（Ｘ）値を含んでいる現在のデータＲＡＭ１２２行（１回目の実行インスタンス時は行０、２回目の実行インスタンス時は行５、及び以下同様に１２回目の実行インスタンス時の行５５）を読み出し、Ｗｃ値を含んでいる重みＲＡＭ１２４の行６を読み出し、それらを乗算して、累算器２０２に累算される第１の積を生成し、累算器２０２は、アドレス８の命令によってちょうどクリアされている。次に、アドレス１０の積和命令は、現在の時間ステップに関連付けられたセル出力（Ｈ）値を含んでいる次のデータＲＡＭ１２２行（１回目の実行インスタンス時は行１、２回目の実行インスタンス時は行６、及び以下同様に１２回目の実行インスタンスの行５６）を読み出し、Ｕｃ値を含んでいる重みＲＡＭ１２４の行７を読み出し、それらを乗算して、累算器２０２に加算される第２の積を生成する。次に、アドレス１１の重みワードを累算器に加算する命令が、Ｂｃ値を含んでいる重みＲＡＭ１２４の行８を読み出し、それらを累算器２０２に加算する。最後、アドレス１２の出力命令（ＯＵＴＰＵＴ  ＴＡＮＨ，ＷＲ  ＯＵＴ  ＲＯＷ  ９，ＣＬＲ  ＡＣＣ）がｔａｎｈ活性化関数を累算器２０２値に行い、その結果を重みＲＡＭ１２４の行９に書き込み、累算器２０２をクリアする。
【０３４７】
アドレス１３〜１６の命令の１２回の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、対応する時間ステップについての各自の対応するＬＳＴＭセル４６００の新しいセル状態（Ｃ）値を計算し、新しいＣ値を、重みＲＡＭ１２４の行１１の対応するワードに書き込み、ｔａｎｈ（Ｃ）を計算し、それを重みＲＡＭ１２４の行１０の対応するワードに書き込む。より具体的には、アドレス１３の積和命令は、現在の時間ステップに関連付けられた入力ゲート（Ｉ）値を含んでいる現在のデータＲＡＭ１２２行の後の次の行（１回目の実行インスタンス時は行２、２回目の実行インスタンス時は行７、及び以下同様に１２回目の実行インスタンスの行５７）を読み出し、候補セル状態（Ｃ’）値（アドレス１２の命令によって直前に書き込まれた）を含んでいる重みＲＡＭ１２４の行９を読み出し、それらを乗算して、累算器２０２に累算される第１の積を生成し、累算器２０２は、アドレス１２の命令によってちょうどクリアされている。次に、アドレス１４の積和命令が、現在の時間ステップに関連付けられた忘却ゲート（Ｆ）値を含んでいる次のデータＲＡＭ１２２行（１回目の実行インスタンス時は行３、２回目の実行インスタンス時は行８、及び以下同様に１２回目の実行インスタンスの行５８）を読み出し、前の時間ステップに計算された現在のセル状態（Ｃ）値（アドレス１５の命令の一番最近の実行インスタンスによって書き込まれた）を含んでいる重みＲＡＭ１２４の行１１を読み出し、それらを乗算して、累算器２０２に加算される第２の積を生成する。次に、アドレス１５の出力命令（ＯＵＴＰＵＴ  ＰＡＳＳＴＨＲＵ，ＷＲ  ＯＵＴ  ＲＯＷ１１）が、累算器２０２値をパススルーし、それらを重みＲＡＭ１２４の行１１に書き込む。アドレス１４の命令によってデータＲＡＭ１２２の行１１から読み出されるＣ値は、アドレス１３〜１５の命令の一番最近の実行インスタンスによって生成され、書き込まれたＣ値であることを理解されたい。アドレス１５の出力命令は、累算器２０２をクリアせず、そのため、累算器２０２の値はアドレス１６の命令により使用することができる。最後、アドレス１６の出力命令（ＯＵＴＰＵＴ  ＴＡＮＨ，ＷＲ  ＯＵＴ  ＲＯＷ  １０，ＣＬＲ  ＡＣＣ）は、ｔａｎｈ活性化関数を累算器２０２値に行い、その結果を、セル出力（Ｈ）値を計算するアドレス２１の命令による使用のために、重みＲＡＭ１２４の行１０に書き込む。アドレス１６の命令は、累算器２０２をクリアする。
【０３４８】
図４７に示されるように、アドレス１７〜２０の命令の１回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第１の時間ステップ（時間ステップ０）についての各自の対応するＬＳＴＭセル４６００の出力ゲート（Ｏ）値を計算し、そのＯ値を、データＲＡＭ１２２の行４の対応するワードに書き込む。アドレス１７〜２０の命令の２回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第２の時間ステップ（時間ステップ１）についての各自の対応するＬＳＴＭセル４６００のＯ値を計算し、そのＯ値を、データＲＡＭ１２２の行９の対応するワードに書き込む。以下同様に続き、最後、アドレス１７〜２０の命令の１２回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第１２の時間ステップ（時間ステップ１１）についての各自の対応するＬＳＴＭセル４６００のＯ値を計算し、そのＯ値を、データＲＡＭ１２２の行５８の対応するワードに書き込む。アドレス１７〜２０の命令は、上記のアドレス１〜４の命令と同じようにしてＯ値を計算するが、アドレス１７〜１９の命令は、Ｗｏ、Ｕｏ、及びＢｏ値を、重みＲＡＭ１２４のそれぞれ行１２、１３、及び１４から読み出して乗算及び／又は加算演算を行う。
【０３４９】
図４７に示されるように、アドレス２１〜２２の命令の１回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第１の時間ステップ（時間ステップ０）についての各自の対応するＬＳＴＭセル４６００のセル出力（Ｈ）値を計算し、そのＨ値を、データＲＡＭ１２２の行６の対応するワードに書き込む。アドレス２１〜２２の命令の２回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第２の時間ステップ（時間ステップ１）についての各自の対応するＬＳＴＭセル４６００のＨ値を計算し、そのＨ値を、データＲＡＭ１２２の行１１の対応するワードに書き込む。以下同様に続き、最後、アドレス２１〜２２の命令の１２回目の実行インスタンス中、１２８個のＮＰＵ１２６の各々は、第１２の時間ステップ（時間ステップ１１）についての各自の対応するＬＳＴＭセル４６００のＨ値を計算し、そのＨ値を、データＲＡＭ１２２の行６０の対応するワードに書き込む。
【０３５０】
より具体的には、アドレス２１の積和命令は、現在の時間ステップに関連付けられた出力ゲート（Ｏ）値を含んでいる現在のデータＲＡＭ１２２行の３つ後の行（１回目の実行インスタンス時は行４、２回目の実行インスタンス時は行９、及び以下同様に１２回目の実行インスタンス時は行５９）を読み出し、ｔａｎｈ（Ｃ）値（アドレス１６の命令によって書き込まれた）を含んでいる重みＲＡＭ１２４の行１０を読み出し、それらを乗算して、累算器２０２に累算される積を生成し、累算器２０２は、アドレス２０の命令によってちょうどクリアされている。そして、アドレス２２の出力命令が、累算器２０２値をパススルーし、それらをデータＲＡＭ１２２の２つ後の出力行１１（１回目の実行インスタンス時は行６、２回目の実行インスタンス時は行１１、及び以下同様に１２回目の実行インスタンス時は行６１）に書き込み、累算器２０２をクリアする。アドレス２２の命令によってデータＲＡＭ１２２の行（１回目の実行インスタンス時は行６、２回目の実行インスタンス時は行１１、及び以下同様に１２回目の実行インスタンスの行６１）に書き込まれるＨ値は、アドレス２、６、１０、及び１８の命令の次の実行インスタンスによって消費される／読み出されるＨ値であることを理解されたい。ただし、１２回目の実行インスタンスの行６１に書き込まれるＨ値は、アドレス２、６、１０、及び１８の命令の実行インスタンスによって消費されず／読み出されず、むしろ、好ましくはアーキテクチャプログラムによって消費される／読み出される。
【０３５１】
アドレス２３の命令（ＬＯＯＰ  １）は、ループカウンタ３８０４を減分し、新しいループカウンタ３８０４値がゼロより大きい場合には、アドレス１の命令にループバックする。
【０３５２】
次いで図４９を参照すると、出力バッファのマスキングとＮＰＵグループ内のフィードバック能力を伴うＮＮＵ１２１の一実施形態を図示するブロック図が示される。図４９は、４つのＮＰＵ１２６からなる単一のＮＰＵグループ４９０１を図示している。図４９は、単一のＮＰＵグループ４９０１を図示するが、ＮＮＵ１２１のＮＰＵ１２６各々はＮＰＵグループ４９０１に含まれており、そのためＮ／Ｊ個のＮＰＵグループ４９０１があり、ＮはＮＰＵ１２６の数であり（例えば、ワイド構成では５１２、又はナロー構成では１０２４）、Ｊは、グループ４９０１中のＮＰＵ１２６の数（例えば、図４９の実施形態では４）であることを理解されたい。図４９は、ＮＰＵグループ４９０１の４つのＮＰＵ１２６を、ＮＰＵ０、ＮＰＵ１、ＮＰＵ２、及びＮＰＵ３として参照している。
【０３５３】
図４９の実施形態における各ＮＰＵ１２６は、上記で図７に関連して説明したＮＰＵ１２６と似ており、同様の参照符号を付した要素は類似する。ただし、ｍｕｘ−ｒｅｇ２０８は、４つの追加的な入力４９０５を含むように変更を加えられ、ｍｕｘ−ｒｅｇ７０５は、４つの追加的な入力４９０７を含むように変更を加えられ、選択入力２１３は、出力２０９での提供について元の入力２１１及び２０７並びに追加的な入力４９０５の中から選択するように変更を加えられ、選択入力７１３は、出力２０３での提供について元の入力７１１及び２０６並びに追加的な入力４９０７の中から選択するように変更を加えられている。
【０３５４】
図４９で出力バッファ１１０４として参照される、図１１の行バッファ１１０４の一部が示されている。より具体的には、出力バッファ１１０４のワード０、１、２、及び３が示されており、これらは、ＮＰＵ０、１、２、及び３に関連付けられた４つのＡＦＵ２１２のそれぞれの出力を受け取る。ＮＰＵグループ４９０１に対応するＮ個のワードを含む出力バッファ１１０４の部分を、出力バッファワードグループと呼ぶ。図４９の実施形態では、Ｎは４である。出力バッファ１１０４の４つのワードは、ｍｕｘ−ｒｅｇ２０８への４つの追加的な入力４９０５として、及びｍｕｘ−ｒｅｇ７０５への４つの追加的な入力４９０７として、フィードバックされ、受け取られる。出力バッファワードグループをそれぞれのＮＰＵグループ４９０１にフィードバックすることにより、非アーキテクチャプログラムの算術命令が、自身の入力として、ＮＰＵグループ４９０１に関連付けられた出力バッファ１１０４の（すなわち出力バッファワードグループの）ワードのうち１つ又は２つを選択する能力がもたらされ、その例は、下記で図５１の例えばアドレス４、８、１１、１２、及び１５にある非アーキテクチャプログラムとの関連で説明する。すなわち、非アーキテクチャ命令内で指定される出力バッファ１１０４のワードが、選択入力２１３／７１３に生成される値を決定する。この能力により、効果的に出力バッファ１１０４がいわばスクラッチパッドメモリの役割を果たすことができ、それにより、非アーキテクチャプログラムが、例えば中間的に生成され使用される値の、データＲＡＭ１２２及び／又は重みＲＡＭ１２４への書き込みと、その後行われるそれらからの読み出しの回数を減らせる可能性がある。好ましくは、出力バッファ１１０４、又は行バッファ１１０４が、１０２４個のナローワード又は５１２個のワイドワードのどちらかを記憶するように構成できるレジスタの１次元アレイを備える。好ましくは、出力バッファ１１０４は、１クロックサイクルで読み出され、１クロックサイクルで書き込まれることが可能である。アーキテクチャプログラムと非アーキテクチャプログラムの両方からアクセスできるデータＲＡＭ１２２及び重みＲＡＭ１２４と異なり、出力バッファ１１０４は、アーキテクチャプログラムによってアクセス可能でなく、代わりに、非アーキテクチャプログラムによってのみアクセス可能である。
【０３５５】
出力バッファ１１０４は、マスク入力４９０３を受け取るように変更を加えられている。好ましくは、マスク入力４９０３は、ＮＰＵグループ４９０１の４つのＮＰＵ１２６に関連付けられた出力バッファ１１０４の４つのワードに対応する４ビットを含む。好ましくは、出力バッファ１１０４のワードに対応するマスク入力４９０３のビットが真である場合、出力バッファ１１０４の該ワードは現在の値を保有し、そうでない場合、出力バッファ１１０４の該ワードは、ＡＦＵ２１２の出力で更新される。すなわち、出力バッファ１１０４のワードに対応するマスク入力４９０３のビットが偽である場合は、ＡＦＵ２１２の出力が、出力バッファ１１０４の該ワードに書き込まれる。これは、非アーキテクチャプログラムの出力命令が、ＡＦＵ２１２の出力を出力バッファ１１０４のいくつかのワードに選択的に書き込みをし、出力バッファ１１０４の他のワードの現在の値を保有する能力をもたらす。この例については、下記で、図５１の非アーキテクチャプログラムの、例えばアドレス６、１０、１３、及び１４の命令に関連して説明する。すなわち、非アーキテクチャ命令で指定される出力バッファ１１０４のワードが、マスク入力４９０３に生成される値を決定する。
【０３５６】
簡潔のために、図４９は、ｍｕｘ−ｒｅｇ２０８／７０５への入力１８１１（例えば、図１８、図１９、及び図２３の）は示していない。しかし、動的に構成可能なＮＰＵ１２６及び出力バッファ１１０４のフィードバック／マスキングの両方をサポートする実施形態が企図される。好ましくは、そのような実施形態では、出力バッファワードグループはそれに応じて動的に構成可能である。
【０３５７】
ＮＰＵグループ４９０１内のＮＰＵ１２６の数が４である実施形態を説明するが、この数がそれより多い又は少ない他の実施形態が企図されることを理解されたい。さらに、図５２に示すような共有ＡＦＵ１１１２を含んでいる実施形態では、ＮＰＵグループ４９０１内のＮＰＵ１２６の数と、ＡＦＵ２１２グループ内のＮＰＵ１２６の数との間に相乗作用的な関係があってよい。出力バッファ１１０４のマスキング及びＮＰＵグループ内のフィードバック能力は、図５０及び図５１に関連してより詳細に説明するように、ＬＳＴＭセル４６００に関連する計算を効率的に行うために特に有益である。
【０３５８】
次いで図５０を参照すると、図４９のＮＮＵ１２１が図４６の１２８個のＬＳＴＭセル４６００の層に関連する算出を行う際の、ＮＮＵ１２１のデータＲＡＭ１２２、重みＲＡＭ１２４、及び出力バッファ１１０４内のデータのレイアウトの例を図示するブロック図が示される。図５０の例では、ＮＮＵ１２１は、例えばワイド構成において、５１２個のＮＰＵ１２６、又はニューロンとして構成されている。図４７及び図４８の例と同じように、図５０及び図５１の例ではＬＳＴＭ層に１２８個のＬＳＴＭセル４６００しかない。ただし、図５０の例では、５１２個のＮＰＵ１２６（例えば、ＮＰＵ０〜１２７）のすべてによって生成された値が使用される。有利な点として、各ＮＰＵグループ４９０１は、図５１の非アーキテクチャプログラムを実行するとき、集合的にＬＳＴＭセル４６００として動作する。
【０３５９】
示されるように、データＲＡＭ１２２は、時間ステップの連続について、セル入力（Ｘ）値及び出力（Ｈ）値を保持する。より具体的には、２つの行からなるペアが、所与の時間ステップについてのＸ及びＨ値を保持する。データＲＡＭ１２２が６４個の行を有する一実施形態では、データＲＡＭ１２２は、示されるように、３１個の異なる時間ステップについてのセル値を保持することができる。図５０の例では、行２及び３が時間ステップ０の値を保持し、行４及び５が時間ステップ１のセル値を保持し、以下同様に続き、行６２及び６３が時間ステップ３０のセル値を保持する。ペアのうち第１の行が当該時間ステップのＸ値を保持し、ペアのうち第２の行が当該時間ステップのＨ値を保持する。示されるように、データＲＡＭ１２２内のＮＰＵグループ４９０１に対応する４つの列からなる各グループは、そのグループの対応するＬＳＴＭセル４６００についての値を保持する。すなわち、下記で図５１との関連でより詳細に説明するように、列０〜３は、計算がＮＰＵ０〜３、すなわちＮＰＵグループ０によって行われるＬＳＴＭセル０に関連付けられた値を保持し、列４〜７は、計算がＮＰＵ４〜７、すなわちＮＰＵグループ１によって行われるＬＳＴＭセル１に関連付けられた値を保持し、以下同様に続き、列５０８〜５１１は、計算がＮＰＵ５０８〜５１１、すなわちＮＰＵグループ１２７によって行われるＬＳＴＭセル１２７に関連付けられた値を保持する。示されるように、行１は使用されず、行０は、好ましくはアーキテクチャプログラムによってゼロ値が投入された初期セル出力（Ｈ）値を保持するが、非アーキテクチャプログラムの初期命令が行０の初期セル出力（Ｈ）値を投入する実施形態が企図される。
【０３６０】
好ましくは、Ｘ値（行２、４、６、及び以下同様に６２まで）は、プロセッサ１００で稼働しているアーキテクチャプログラムにより、ＭＴＮＮ命令１４００を介してデータＲＡＭ１２２に書き込まれ／投入され、図５０の非アーキテクチャプログラムなど、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって読み出される／使用される。好ましくは、Ｈ値（行３、５、７、及び以下同様に６３まで）は、下記でより詳細に説明するように、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって、データＲＡＭ１２２に書き込まれ／投入され、さらに読み出される／使用される。好ましくは、Ｈ値はさらに、プロセッサ１００で稼働しているアーキテクチャプログラムによって、ＭＦＮＮ命令１５００を介して読み出される。図５１の非アーキテクチャプログラムは、ＮＰＵグループ４９０１に対応する４つの列からなる各グループ（例えば、列０〜３、４〜７、５〜８、及び以下同様に５０８〜５１１まで）内で、所与の行の４つのＸ値が（例えば、アーキテクチャプログラムによって）同じ値を投入されると仮定していることに留意されたい。同様に、図５１の非アーキテクチャプログラムは、所与の行のＮＰＵグループ４９０１に対応する４つの列からなる各グループ内で、４つのＨ値に対して同じ値を計算し、書き込む。
【０３６１】
示されるように、重みＲＡＭ１２４は、ＮＮＵ１２１のＮＰＵについての、重み、バイアス、及びセル状態（Ｃ）値を保持する。ＮＰＵグループ４９０１に対応する４つの列からなる各グループ（例えば、列０〜３、４〜７、５〜８、及び以下同様に５０８〜５１１まで）内で、（１）索引ｍｏｄ４が３に等しい列が、それぞれ行０、１、２、及び６にＷｃ、Ｕｃ、Ｂｃ、及びＣ値を保持し、（２）索引ｍｏｄ４が２に等しい列が、それぞれ行３、４、及び５にＷｏ、Ｕｏ、及びＢｏ値を保持し、（３）索引ｍｏｄ４が１に等しい列が、それぞれ行３、４、及び５にＷｆ、Ｕｆ、及びＢｆ値を保持し、（４）索引ｍｏｄ４が０に等しい列が、それぞれ行３、４、及び５にＷｉ、Ｕｉ、及びＢｉ値を保持する。好ましくは、重み及びバイアス値、すなわち、Ｗｉ、Ｕｉ、Ｂｉ、Ｗｆ、Ｕｆ、Ｂｆ、Ｗｃ、Ｕｃ、Ｂｃ、Ｗｏ、Ｕｏ、Ｂｏ（行０〜５）は、プロセッサ１００で稼働しているアーキテクチャプログラムにより、ＭＴＮＮ命令１４００を介して重みＲＡＭ１２４に書き込まれ／投入され、図５１の非アーキテクチャプログラムなど、ＮＮＵ１２１で稼働している非アーキテクチャプログラムによって読み出される／使用される。好ましくは、下記でより詳細に説明するように、中間Ｃ値は、ＮＮＵ１２１で稼働している非アーキテクチャプログラムにより重みＲＡＭ１２４に書き込まれ／投入され、そのプログラムによって読み出される／使用される。
【０３６２】
図５０の例は、アーキテクチャプログラムが、（１）データＲＡＭ１２２に３１個の異なる時間ステップについての入力Ｘ値を投入し（行２、４、及び以下同様に６２まで）、（２）図５１の非アーキテクチャプログラムを開始し、（３）非アーキテクチャプログラムが完了したことを検出し、（４）データＲＡＭ１２２から出力Ｈ値（行３、５、及び以下同様に６３まで）を読み出し、（５）作業、例えば携帯電話のユーザによってなされた発話の認識を行うために使用される計算を完了するのに必要とされる回数だけステップ（１）〜（４）を繰り返す、と仮定している。
【０３６３】
代替の一手法では、アーキテクチャプログラムは、（１）データＲＡＭ１２２に単一の時間ステップの入力Ｘ値を投入し（例えば、行２）、（２）非アーキテクチャプログラム（ループを必要とせず、データＲＡＭ１２２行の単一のペアにアクセスする、図５１の変更を加えられたバージョン）を開始し、（３）非アーキテクチャプログラムが完了したことを検出し、（４）データＲＡＭ１２２から出力Ｈ値（例えば、行３）を読み出し、（５）作業を完了するのに必要とされる回数だけステップ（１）〜（４）を繰り返す。ＬＳＴＭ層への入力Ｘ値がサンプリングされる仕方に応じて、上記２つの手法のうちいずれかがより好ましい可能性がある。例えば、作業が、入力を複数の時間ステップ（例えば、３１前後）にわたってサンプリングし、計算を行うことを許容する場合には、第１の手法が好ましい可能性がある。それは、その方が計算リソースが効率的で、且つ／又は性能が高い可能性が高いためである。対して、作業が単一の時間ステップでのサンプリングしか許容できない場合は、第２の手法が要求される可能性がある。
【０３６４】
第３の実施形態が企図され、これは第２の手法に似るが、データＲＡＭ１２２行のペアを１つだけ使用するのではなく、非アーキテクチャプログラムが行のペアを複数個使用し、すなわち第１の手法と同様に時間ステップごとに異なるペアを使用する。第３の実施形態では、好ましくは、アーキテクチャプログラムは、ステップ（２）の前に、例えば、アドレス１の命令内のデータＲＡＭ１２２行を、次のペアをポイントするように更新することにより、非アーキテクチャプログラムを開始する前にそれを更新するステップを含む。
【０３６５】
示されるように、出力バッファ１１０４は、示されるように、図５１の非アーキテクチャプログラムの種々のアドレスにある命令の実行後、ＮＮＵ１２１の対応するＮＰＵ０〜５１１について、セル出力（Ｈ）、候補セル状態（Ｃ’）、入力ゲート（Ｉ）、忘却ゲート（Ｆ）、出力ゲート（Ｏ）、セル状態（Ｃ）、及びｔａｎｈ（Ｃ）の中間値を保持している。各出力バッファワードグループ（例えば、ＮＰＵグループ４９０１に対応する出力バッファ１１０４の４つのワードからなるグループ、例えば、ワード０〜３、４〜７、５〜８、及び以下同様に５０８〜５１１）の中で、索引ｍｏｄ４が３に等しいワードをＯＵＴＢＵＦ［３］と参照し、索引ｍｏｄ４が２に等しいワードをＯＵＴＢＵＦ［２］と参照し、索引ｍｏｄ４が１に等しいワードをＯＵＴＢＵＦ［１］と参照し、索引ｍｏｄ４が０に等しいワードをＯＵＴＢＵＦ［０］と参照する。
【０３６６】
示されるように、図５１の非アーキテクチャプログラムのアドレス２の命令の実行後、各ＮＰＵグループ４９０１について、出力バッファ１１０４の４つのワードすべてが、対応するＬＳＴＭセル４６００の初期セル出力（Ｈ）値を書き込まれている。アドレス６の命令の実行後、各ＮＰＵグループ４９０１について、ＯＵＴＢＵＦ［３］は、対応するＬＳＴＭセル４６００の候補セル状態（Ｃ’）値を書き込まれており、出力バッファ１１０４のその他の３つのワードは各自の以前の値を保有している。アドレス１０の命令の実行後、各ＮＰＵグループ４９０１について、対応するＬＳＴＭセル４６００について、ＯＵＴＢＵＦ［０］は入力ゲート（Ｉ）値を書き込まれ、ＯＵＴＢＵＦ［１］は忘却ゲート（Ｆ）値を書き込まれ、ＯＵＴＢＵＦ［２］は出力ゲート（Ｏ）値を書き込まれており、ＯＵＴＢＵＦ［３］は、以前の値を保有している。アドレス１３の命令の実行後、各ＮＰＵグループ４９０１について、ＯＵＴＢＵＦ［３］は、対応するＬＳＴＭセル４６００の新しいセル状態（Ｃ）値を書き込まれており（スロット３にＣ値を含んでいる出力バッファ１１０４は、重みＲＡＭ１２４の行６に書き込まれるため。これについては図５１に関連して下記でより詳細に説明する）、出力バッファ１１０４のその他の３つのワードは各自の以前の値を保有している。アドレス１４の命令の実行後、各ＮＰＵグループ４９０１について、ＯＵＴＢＵＦ［３］は、対応するＬＳＴＭセル４６００のｔａｎｈ（Ｃ）値を書き込まれており、出力バッファ１１０４のその他の３つのワードは各自の以前の値を保有している。アドレス１６の命令の実行後、各ＮＰＵグループ４９０１について、出力バッファ１１０４の４つのワードすべてが、対応するＬＳＴＭセル４６００の新しいセル出力（Ｈ）値を書き込まれている。このパターンは、プログラムがアドレス１７でアドレス３にループバックするのに伴って、アドレス６からアドレス１６まで（すなわち、プログラムループの外側にあるためアドレス２における実行を除く）、もう３０回繰り返す。
【０３６７】
次いで図５１を参照すると、図４９のＮＮＵ１２１のプログラムメモリ１２９に記憶され、ＮＮＵ１２１によって実行されて、ＬＳＴＭセル層に関連し、図５０の編成によるデータ及び重みを使用する計算を達成するプログラムを図示する表が示される。図５１の例示的プログラムは、アドレス０〜１７に１８個の非アーキテクチャ命令を含んでいる。アドレス０の命令は、累算器２０２をクリアし、ループカウンタ３８０４を３１の値に初期化して、ループ本体（アドレス１〜１７の命令）を３１回行わせる初期化命令である。この初期化命令はさらに、書き込まれるデータＲＡＭ１２２の行（例えば、図２６／３９のレジスタ２６０６）を１の値に初期化し、この値は、アドレス１６の命令の１回目の実行インスタンスで３に増分されることになる。好ましくは、初期化命令はさらに、ＮＮＵ１２１をワイド構成にして、ＮＮＵ１２１が５１２個のＮＰＵ１２６として構成されるようにする。下記の説明から観察できるように、５１２個のＮＰＵ１２６の１２８個のＮＰＵグループ４９０１の各々は、アドレス０〜１７の命令の実行中、１２８個のＬＳＴＭセル４６００の１つに対応し、１２８個のＬＳＴＭセル４６００の１つとして動作する。
【０３６８】
アドレス１及び２の命令はループ本体の外側であり、一度だけ実行される。それらの命令は、初期セル出力（Ｈ）値（例えば、ゼロ値）を生成し、それを出力バッファ１１０４のすべてのワードに書き込む。アドレス１の命令は、データＲＡＭ１２２の行０から初期Ｈ値を読み出し、それを累算器２０２に入れ、累算器２０２は、アドレス０の命令によってクリアされている。アドレス２の命令（ＯＵＴＰＵＴ  ＰＡＳＳＴＨＲＵ，ＮＯＰ，ＣＬＲ  ＡＣＣ）は、図５０に示されるように、累算器２０２値を出力バッファ１１０４にパススルーする。アドレス２の出力命令（及び図５１の他の出力命令）中の「ＮＯＰ」の表記は、出力される値が出力バッファ１１０４だけに書き込まれ、メモリには書き込まれず、すなわちデータＲＡＭ１２２にも重みＲＡＭ１２４にも書き込まれないことを意味する。アドレス２の命令はさらに、累算器２０２をクリアする。
【０３６９】
アドレス３〜１７の命令はループ本体の内側であり、ループカウントの回数（例えば、３１）だけ実行される。
【０３７０】
アドレス３〜６の命令の各実行インスタンスは、現在の時間ステップのｔａｎｈ（Ｃ’）値を計算し、ＯＵＴＢＵＦ［３］に書き込み、この値は、アドレス１１の命令によって使用されることになる。より具体的には、アドレス３の積和命令は、当該時間ステップに関連付けられたセル入力（Ｘ）値を、現在のデータＲＡＭ１２２の読み出し行（例えば、２、４、６及び以下同様に６２まで）から読み出し、Ｗｃ値を重みＲＡＭ１２４の行０から読み出し、それらを乗算して、累算器２０２に加算される積を生成し、累算器２０２は、アドレス２の命令でクリアされている。
【０３７１】
アドレス４の積和命令（ＭＵＬＴ−ＡＣＣＵＭ  ＯＵＴＢＵＦ［０］，ＷＲ  ＲＯＷ  １）は、ＯＵＴＢＵＦ［０］からＨ値を読み出し（すなわちＮＰＵグループ４９０１の４つのＮＰＵ１２６すべて）、重みＲＡＭ１２４の行１からＵｃ値を読み出し、それらを乗算して、累算器２０２に加算される第２の積を生成する。
【０３７２】
アドレス５の重みワードを累算器に加算する命令（ＡＤＤ＿Ｗ＿ＡＣＣ  ＷＲ  ＲＯＷ２）は、重みＲＡＭ１２４の行２からＢｃ値を読み出し、それらを累算器２０２に加算する。
【０３７３】
アドレス６の出力命令（ＯＵＴＰＵＴ  ＴＡＮＨ、ＮＯＰ，ＭＡＳＫ［０：２］，ＣＬＲ  ＡＣＣ）は、ｔａｎｈ活性化関数を累算器２０２値に行い、その結果は、ＯＵＴＢＵＦ［３］だけに書き込まれ（すなわち、ＮＰＵグループ４９０１の中で索引ｍｏｄ４が３に等しいＮＰＵ１２６だけが結果を書き込む）、累算器２０２がクリアされる。すなわち、アドレス６の出力命令は、図５０に示されるように、ＯＵＴＢＵＦ［０］、ＯＵＴＢＵＦ［１］、及びＯＵＴＢＵＦ［２］をマスクして（ＭＡＳＫ［０：２］の表記法で示されるように）、それらに各自の現在の値を保有させる。加えて、アドレス６の出力命令は、メモリへの書き込みをしない（ＮＯＰの表記法で示されるように）。
【０３７４】
アドレス７〜１０の命令の各実行インスタンスは、現在の時間ステップの入力ゲート（Ｉ）、忘却ゲート（Ｆ）、及び出力ゲート（Ｏ）値を計算して、それぞれＯＵＴＢＵＦ［０］、ＯＵＴＢＵＦ［１］、ＯＵＴＢＵＦ［２］に書き込み、それらの値は、それぞれアドレス１１、１２、及び１５の命令によって使用されることになる。より具体的には、アドレス７の積和命令は、当該時間ステップに関連付けられたセル入力（Ｘ）値を現在のデータＲＡＭ１２２の読み出し行（例えば、２、４、６、及び以下同様に６２まで）から読み出し、重みＲＡＭ１２４の行３からＷｉ、Ｗｆ、及びＷｏ値を読み出し、それらを乗算して、累算器２０２に加算される積を生成し、累算器２０２は、アドレス６の命令によってクリアされている。より具体的には、ＮＰＵグループ４９０１の中で、索引ｍｏｄ４が０に等しいＮＰＵ１２６がＸとＷｉの積を計算し、索引ｍｏｄ４が１に等しいＮＰＵ１２６がＸとＷｆの積を計算し、索引ｍｏｄ４が２に等しいＮＰＵ１２６がＸとＷｏの積を計算する。
【０３７５】
アドレス８の積和命令は、ＯＵＴＢＵＦ［０］からＨ値を読み出し（すなわちＮＰＵグループ４９０１の４つのＮＰＵ１２６すべて）、重みＲＡＭ１２４の行４からＵｉ、Ｕｆ、及びＵｏ値を読み出し、それらを乗算して、累算器２０２に加算される第２の積を生成する。より具体的には、ＮＰＵグループ４９０１の中で、索引ｍｏｄ４が０に等しいＮＰＵ１２６がＨとＵｉの積を計算し、索引ｍｏｄ４が１に等しいＮＰＵ１２６がＨとＵｆの積を計算し、索引ｍｏｄ４が２に等しいＮＰＵ１２６がＨとＵｏの積を計算する。
【０３７６】
アドレス９の重みワードを累算器に加算する命令は、重みＲＡＭ１２４の行５からＢｉ、Ｂｆ、及びＢｏ値を読み出し、それらを累算器２０２に加算する。より具体的には、ＮＰＵグループ４９０１の中で、索引ｍｏｄ４が０に等しいＮＰＵ１２６がＢｉ値を加算し、索引ｍｏｄ４が１に等しいＮＰＵ１２６がＢｆ値を加算し、索引ｍｏｄ４が２に等しいＮＰＵ１２６がＢｏ値を加算する。
【０３７７】
アドレス１０の出力命令（ＯＵＴＰＵＴ  ＳＩＧＭＯＩＤ，ＮＯＰ，ＭＡＳＫ［３］，ＣＬＲ  ＡＣＣ）は、シグモイド活性化関数を累算器２０２値に行い、計算されたＩ、Ｆ、及びＯ値をそれぞれＯＵＴＢＵＦ［０］、ＯＵＴＢＵＦ［１］、及びＯＵＴＢＵＦ［２］に書き込み、メモリには書き込まずに累算器２０２をクリアする。すなわち、アドレス１０の出力命令は、図５０に示されるように、ＯＵＴＢＵＦ［３］をマスクして（ＭＡＳＫ［３］の表記法で示されるように）、それに現在の値（Ｃ’である）を保有させる。
【０３７８】
アドレス１１〜１３の命令の各実行インスタンスは、現在の時間ステップで生成された新しいセル状態（Ｃ）値を計算し、重みＲＡＭ１２４の行６、より具体的には、ＮＰＵグループ４９０１に対応する４つの列のうち索引ｍｏｄ４が３に等しい行６のワードに書き込み、それは次の時間ステップに（すなわち、次のループ反復中にアドレス１２の命令によって）使用される。加えて、アドレス１４の命令の各実行インスタンスは、ｔａｎｈ（Ｃ）値をＯＵＴＢＵＦ［３］に書き込み、これはアドレス１５の命令によって使用されることになる。
【０３７９】
より具体的には、アドレス１１の積和命令（ＭＵＬＴ−ＡＣＣＵＭ  ＯＵＴＢＵＦ［０］，ＯＵＴＢＵＦ［３］）は、ＯＵＴＢＵＦ［０］から入力ゲート（Ｉ）値を読み出し、ＯＵＴＢＵＦ［３］から候補セル状態（Ｃ’）値を読み出し、それらを乗算して、累算器２０２に加算される第１の積を生成し、累算器２０２は、アドレス１０の命令によってクリアされている。より具体的には、ＮＰＵグループ４９０１内の４つのＮＰＵ１２６の各々が、ＩとＣ’の第１の積を計算する。
【０３８０】
アドレス１２の積和命令（ＭＵＬＴ−ＡＣＣＵＭ  ＯＵＴＢＵＦ［１］，ＷＲ  ＲＯＷ  ６）は、ＮＰＵ１２６に命令して、ＯＵＴＢＵＦ［１］から忘却ゲート（Ｆ）値を読み出させ、各自のワードを重みＲＡＭ１２４の行６から読み出させ、それらを乗算して、アドレス１１の命令で生成された累算器２０２内の第１の積に加算される第２の積を生成する。より具体的には、行６から読み出されるワードは、ＮＰＵグループ４９０１の中で索引ｍｏｄ４が３に等しいＮＰＵ１２６の場合には、前の時間ステップに計算された現在のセル状態（Ｃ）値であり、そのため第１の積と第２の積との和が新しいセル状態（Ｃ）になる。しかし、行６から読み出されるワードは、ＮＰＵグループ４９０１中の他の３つのＮＰＵ１２６にとっては無関係値（don’t-care  values）である。なぜならば、それらから得られる累算値はその後使用されないためであり、すなわち、アドレス１３及び１４の命令によって出力バッファ１１０４に入れられず、またアドレス１４の命令によってクリアされることになるためである。すなわち、ＮＰＵグループ４９０１の中で索引ｍｏｄ４が３に等しいＮＰＵ１２６によって生成された、結果得られた新しいセル状態（Ｃ）値だけが、使用され、すなわちアドレス１３及び１４の命令を通じて使用される。アドレス１２の命令の２回目〜３１回目の実行インスタンスの場合は、重みＲＡＭ１２４の行６から読み出されるＣ値は、ループ本体の前の反復中にアドレス１３の命令によって書き込まれたものである。しかし、アドレス１２の命令の１回目の実行インスタンスでは、行６のＣ値は、図５１の非アーキテクチャプログラムを開始する前のアーキテクチャプログラム、又は変更を加えられたバージョンの非アーキテクチャプログラムのいずれかによって、初期値を書き込まれている。
【０３８１】
アドレス１３の出力命令（ＯＵＴＰＵＴ  ＰＡＳＳＴＨＲＵ，ＷＲ  ＲＯＷ  ６，ＭＡＳＫ［０：２］）は、図５０に示されるように、累算器２０２値、すなわち計算されたＣ値を、ＯＵＴＢＵＦ［３］だけにパススルーし（すなわちＮＰＵグループ４９０１の中で索引ｍｏｄ４が３に等しいＮＰＵ１２６だけが計算したＣ値を出力バッファ１１０４に書き込む）、重みＲＡＭ１２４の行６は、更新された出力バッファ１１０４を書き込まれる。すなわち、アドレス１３の出力命令は、ＯＵＴＢＵＦ［０］、ＯＵＴＢＵＦ［１］、及びＯＵＴＢＵＦ［２］をマスクして、それらに各自の現在の値（Ｉ、Ｆ、及びＯである）を保有させる。上記のように、ＮＰＵグループ４９０１に対応する４つの列からなる各グループの中で、索引ｍｏｄ４が３に等しい行６のワードにあるＣ値だけが使用され、すなわちアドレス１２の命令によって使用される。したがって、非アーキテクチャプログラムは、図５０に示されるように、重みＲＡＭ１２４の行６の列０〜２、４〜６、及び以下同様に５０８〜５１０にある値（Ｉ、Ｆ、及びＯ値である）には関心を持たない。
【０３８２】
アドレス１４の出力命令（ＯＵＴＰＵＴ  ＴＡＮＨ，ＮＯＰ，ＭＡＳＫ［０：２］，ＣＬＲ  ＡＣＣ）は、ｔａｎｈ活性化関数を累算器２０２値に行い、計算されたｔａｎｈ（Ｃ）値をＯＵＴＢＵＦ［３］に書き込み、メモリには書き込まずに累算器２０２をクリアする。アドレス１４の出力命令は、アドレス１３の出力命令と同じように、図５０に示されるように、ＯＵＴＢＵＦ［０］、ＯＵＴＢＵＦ［１］、及びＯＵＴＢＵＦ［２］をマスクして、それらに各自の現在の値を保有させる。
【０３８３】
アドレス１５〜１６の命令の各実行インスタンスは、現在の時間ステップで生成されたセル出力（Ｈ）値を計算し、それをデータＲＡＭ１２２の現在の出力行の後の２つ後の行に書き込み、その値は、アーキテクチャプログラムによって読み出され、次の時間ステップで（すなわち次のループ反復時にアドレス３及び７の命令により）使用されることになる。より具体的には、アドレス１５の積和命令は、ＯＵＴＢＵＦ［２］から出力ゲート（Ｏ）値を読み出し、ＯＵＴＢＵＦ［３］からｔａｎｈ（Ｃ）値を読み出し、それらを乗算して、累算器２０２に加算される積を生成し、累算器２０２は、アドレス１４の命令によってクリアされている。より具体的には、ＮＰＵグループ４９０１内の４つのＮＰＵ１２６の各々がＯとｔａｎｈ（Ｃ）の積を計算する。
【０３８４】
アドレス１６の出力命令は、図５０に示されるように、累算器２０２値をパススルーし、計算されたＨ値を１回目の実行インスタンス中には行３に、２回目の実行インスタンス中には行５に、以下同様に続き、３１回目の実行インスタンス中には行６３に書き込み、それらはその後アドレス４及び８の命令によって使用される。加えて、図５０に示されるように、計算されたＨ値は、後でアドレス４及び８の命令で使用するために出力バッファ１１０４に入れられる。アドレス１６の出力命令はさらに、累算器２０２をクリアする。一実施形態では、ＬＳＴＭセル４６００は、アドレス１６の出力命令（及び／又は図４８のアドレス２２の出力命令）が累算器２０２値をパススルーするのではなく、活性化関数、例えばシグモイド又はｔａｎｈを有するように設計される。
【０３８５】
アドレス１７のループ命令は、ループカウンタ３８０４を減分し、新しいループカウンタ３８０４値がゼロより大きければアドレス３の命令にループバックする。
【０３８６】
観察できるように、図５１の非アーキテクチャプログラムのループ本体内の命令の数は、図４８の非アーキテクチャよりも約３４％少なく、これは、図４９のＮＮＵ１２１の実施形態の出力バッファ１１０４のフィードバック及びマスキング能力によって容易になる。加えて、図５１の非アーキテクチャプログラムのデータＲＡＭ１２２のメモリレイアウトは、図４８の約３倍の数の時間ステップに対応することができ、これも、図４９のＮＮＵ１２１の実施形態の出力バッファ１１０４のフィードバック及びマスキング能力によって容易になる。ＮＮＵ１２１を用いてＬＳＴＭセル層の計算を行う特定のアーキテクチャプログラムアプリケーションに依存して、これらの向上が有用である場合があり、特にＬＳＴＭ層のＬＳＴＭセル４６００の数が１２８より小さいか又は等しいアプリケーションでそうである。
【０３８７】
図４７〜図５１の実施形態では、重み及びバイアス値が複数時間ステップにわたり同じままであると仮定している。ただし、重み及びバイアス値が複数時間ステップにわたり変化する他の実施形態が企図され、その場合は、図４７及び図５０に示されるように重みＲＡＭ１２４が重み及びバイアス値の単一のセットを投入されるのではなく、重みＲＡＭ１２４は、時間ステップごとに重み及びバイアス値の異なるセットを投入され、図４８及び図５１の非アーキテクチャプログラムの重みＲＡＭ１２４のアドレスはそれに応じて変更を加えられる。
【０３８８】
図４７〜図５１の実施形態が説明され、これらの実施形態では、一般的に言って、重み、バイアス、及び中間値（例えば、Ｃ、Ｃ’）が重みＲＡＭ１２４に記憶され、入力値及び出力値（例えば、Ｘ、Ｈ）がデータＲＡＭ１２２に記憶される。これは、データＲＡＭ１２２がデュアルポートで重みＲＡＭ１２４がシングルポートである実施形態に有利である可能性がある。なぜならば、非アーキテクチャ及びアーキテクチャプログラムからデータＲＡＭ１２２へ、より多くのトラフィックがあるためである。しかし、重みＲＡＭ１２４がより大きいため、それらの値が記憶されるメモリ（すなわちデータＲＡＭ１２２及び重みＲＡＭ１２４）を入れ替えるように非アーキテクチャプログラム及びアーキテクチャプログラムが書かれる実施形態が企図される。すなわち、Ｗ、Ｕ、Ｂ、Ｃ’、ｔａｎｈ（Ｃ）、及びＣ値がデータＲＡＭ１２２に記憶され、Ｘ、Ｈ、Ｉ、Ｆ、及びＯ値が重みＲＡＭ１２４に記憶される（図４７の変更を加えられた実施形態）。また、Ｗ、Ｕ、Ｂ、Ｃ値がデータＲＡＭ１２２に記憶され、Ｘ及びＨ値が重みＲＡＭ１２４に記憶される（図５０の変更を加えられた実施形態）。そのような実施形態の場合は、重みＲＡＭ１２４がより大きいため、より多くの数の時間ステップを一括して共に処理することができる。これは、より多い数の時間ステップから利益が得られ、且つシングルポートメモリ（例えば、重みＲＡＭ１２４）で十分な帯域幅が得られる計算を、ＮＮＵ１２１を利用して行う任意のアーキテクチャプログラムアプリケーションに有利である可能性がある。
【０３８９】
次いで図５２を参照すると、出力バッファマスキングとＮＰＵグループ内のフィードバック能力とを伴い、共有ＡＦＵ１１１２を用いるＮＮＵ１２１の実施形態を図示するブロック図が示される。図５２のＮＮＵ１２１は、多くの点で図４９のＮＮＵ１２１に似ており、同様の参照符号を付した要素は類似する。しかし、図４９の４つのＡＦＵ２１２が単一の共有ＡＦＵ１１１２に置き換えられており、このＡＦＵ１１１２は、４つの累算器２０２の４つの出力２１７を受け取り、ＯＵＴＢＵＦ［０］、ＯＵＴＢＵＦ［１］、ＯＵＴＢＵＦ［２］、及びＯＵＴＢＵＦ［３］への４つの出力を生成する。図５２のＮＮＵ１２１は、共有ＡＦＵ１１１２の動作に関しては、図４９〜図５１に関連して上記で説明した仕方と同様に、また図１１〜図１３に関連して上記で説明した仕方と同様に動作する。
【０３９０】
次いで図５３を参照すると、代替的な一実施形態による、図４６の１２８個のＬＳＴＭセル４６００の層に関連する算出を行う際の、図４９のＮＮＵ１２１のデータＲＡＭ１２２、重みＲＡＭ１２４、及び出力バッファ１１０４内のデータのレイアウトの例を図示するブロック図が示される。図５３の例は、多くの点で図５０の例に似ている。ただし、図５３では、Ｗｉ、Ｗｆ、及びＷｏ値は行０にあり（図５０のように行３ではなく）、Ｕｉ、Ｕｆ、及びＵｏ値は行１にあり（図５０のように行４ではなく）、Ｂｉ、Ｂｆ、及びＢｏ値は行２にあり（図５０のように行５ではなく）、Ｃ値は行３にある（図５０のように行６ではなく）。加えて、出力バッファ１１０４の内容は、図５３では図５０と同じであるが、第３の行の内容（すなわちＩ、Ｆ、Ｏ、及びＣ’値）が、７にある命令（図５０の１０ではなく）の実行後に出力バッファ１１０４に存在し、第４の行の内容（すなわちＩ、Ｆ、Ｏ、及びＣ値）が、１０にある命令（図５０の１３ではなく）の実行後に出力バッファ１１０４に存在し、第５の行の内容（すなわちＩ、Ｆ、Ｏ、及びｔａｎｈ（Ｃ）値）が、１１にある命令（図５０の１４ではなく）の実行後に出力バッファ１１０４に存在し、第６の行の内容（すなわちＨ値）が、１３にある命令（図５０の１６ではなく）の実行後に出力バッファ１１０４に存在する。これは、図５４の非アーキテクチャプログラムと図５１のそれとの違いに起因し、これについては下記でより詳細に説明する。
【０３９１】
次いで図５４を参照すると、図４９のＮＮＵ１２１のプログラムメモリ１２９に記憶され、ＮＮＵ１２１によって実行されて、ＬＳＴＭセル層に関連し、図５３の編成によるデータ及び重みを使用する計算を達成するプログラムを図示する表が示される。図５４の例示的プログラムは、多くの点で図５１のプログラムに似ている。より具体的には、アドレス０〜５の命令は図５４と図５１で同じである。図５４のアドレス７及び８の命令は、図５１のアドレス１０及び１１の命令と同じであり、図５４のアドレス１０〜１４の命令は、図５１のアドレス１３〜１７の命令と同じである。
【０３９２】
ただし、図５４のアドレス６の命令は累算器２０２をクリアしない（それに対して、図５１のアドレス６の命令はクリアする）。さらに、アドレス７〜９の命令は、図５４の非アーキテクチャプログラムには存在しない。最後、図５４のアドレス９の命令は、図５４のアドレス９の命令は重みＲＡＭ１２４の行３から読み出すのに対して図５１のアドレス１２の命令は重みＲＡＭ１２４の行６から読み出す点を除いては、図５１のアドレス１２の命令と同じである。
【０３９３】
図５４と図５１の非アーキテクチャプログラム間の違いの結果、図５３のレイアウトは、使用する重みＲＡＭ１２４の行が３行少なく、プログラムループ中に含む命令が３つ少ない。実際、図５４の非アーキテクチャプログラムのループ本体のサイズは、本質的に図４８の非アーキテクチャプログラムのループ本体のサイズの半分であり、図５１の非アーキテクチャプログラムのループ本体のサイズの約８０％である。
【０３９４】
次いで図５５を参照すると、代替的な一実施形態によるＮＰＵ１２６の部分を図示するブロック図が示される。より具体的には、図４９のＮＰＵ１２６のうち単一のＮＰＵ１２６について、ｍｕｘ−ｒｅｇ２０８とその関連付けられた入力２０７、２１１、及び４９０５、並びにｍｕｘ−ｒｅｇ７０５とその関連付けられた入力２０６、７１１、及び４９０７が示されている。図４９の入力に加えて、ＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８及びｍｕｘ−ｒｅｇ７０５は各々、ｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９を受け取る。ｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９は、そのＮＰＵグループ４９０１内での特定のＮＰＵ１２６の索引を指示する。したがって、例えば、各ＮＰＵグループ４９０１に４つのＮＰＵ１２６がある実施形態では、各ＮＰＵグループ４９０１の中で、ＮＰＵ１２６の１つがそのｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９でゼロの値を受け取り、ＮＰＵ１２６の１つがそのｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９で１の値を受け取り、ＮＰＵ１２６の１つがそのｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９で２の値を受け取り、ＮＰＵ１２６の１つがそのｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９で３の値を受け取る。別の表現をすると、ＮＰＵ１２６によって受け取られるｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９の値は、ＮＮＵ１２１内でのそのＮＰＵ１２６の索引ｍｏｄＪであり、Ｊは、ＮＰＵグループ４９０１中のＮＰＵ１２６の数である。したがって、例えば、ＮＰＵ７３はｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９で１の値を受け取り、ＮＰＵ３５３はｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９で３の値を受け取り、ＮＰＵ６はｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９で２の値を受け取る。
【０３９５】
加えて、制御入力２１３が本明細書で「ＳＥＬＦ」と呼ばれる所定の値を指定するとき、ｍｕｘ−ｒｅｇ２０８は、ｉｎｄｅｘ＿ｗｉｔｈｉｎ＿ｇｒｏｕｐ入力５５９９の値に対応する出力バッファ１１０４の入力４９０５を選択する。したがって、有利な点として、非アーキテクチャ命令が、ＳＥＬＦの値を持つ出力バッファ１１０４からデータを受け取ることを指定するとき（図５７のアドレス２及び７の命令中のＯＵＴＢＵＦ［ＳＥＬＦ］で表される）、各ＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８は、その対応するワードを出力バッファ１１０４から受け取る。したがって、例えば、ＮＮＵ１２１が図５７のアドレス２及び７の非アーキテクチャ命令を実行するとき、ＮＰＵ７３のｍｕｘ−ｒｅｇ２０８は、４つの入力４９０５のうち２番目（索引１）を選択して出力バッファ１１０４からワード７３を受け取り、ＮＰＵ３５３のｍｕｘ−ｒｅｇ２０８は、４つの入力４９０５のうち４番目（索引３）を選択して出力バッファ１１０４からワード３５３を受け取り、ＮＰＵ６のｍｕｘ−ｒｅｇ２０８は、４つの入力４９０５のうち３番目（索引２）を選択して出力バッファ１１０４からワード６を受け取る。図５７の非アーキテクチャプログラムでは用いられないが、非アーキテクチャ命令が、ＳＥＬＦの値を持つ出力バッファ１１０４（ＯＵＴＢＵＦ［ＳＥＬＦ］）からデータを受け取ることを指定して、制御入力７１３に所定の値を指定させて、各ＮＰＵ１２６のｍｕｘ−ｒｅｇ７０５に、その対応するワードを出力バッファ１１０４から受け取らせることができる。
【０３９６】
次いで図５６を参照すると、図４３のＪｏｒｄａｎ  ＲＮＮに関連する算出を行う際の、ただし図５５の実施形態によって得られる利益を用いるＮＮＵ１２１のデータＲＡＭ１２２及び重みＲＡＭ１２４内のデータのレイアウトの例を図示するブロック図が示される。重みＲＡＭ１２４内の重みのレイアウトは図４４と同じである。データＲＡＭ１２２内の値のレイアウトは、各時間ステップが、図４４のように行の四つ組ではなく、入力層ノードＤ値及び出力層ノードＹ値を保持する関連付けられた行のペアを持つ点を除いて図４４と似ている。すなわち、隠れ層Ｚ及びコンテキスト層Ｃ値は、データＲＡＭ１２２に書き込まれない。代わりに、出力バッファ１１０４が、隠れ層Ｚ及びコンテキスト層Ｃ値のためのスクラッチパッドとして使用される。これについては、図５７の非アーキテクチャプログラムとの関連でより詳細に説明する。有利な点として、ＯＵＴＢＵＦ［ＳＥＬＦ］の出力バッファ１１０４のフィードバック機能により、場合によっては、非アーキテクチャプログラムをより高速にすることができ（データＲＡＭ１２２の２回の書き込みと２回の読み出しを、出力バッファ１１０４の２回の書き込みと２回の読み出しに置き換えるため）、各時間ステップが使用するデータＲＡＭ１２２空間を減らすことができ、それにより、示されるように、データＲＡＭ１２２が、図４４及び図４５の実施形態の約２倍の数の時間ステップ、詳細には３２個の時間ステップを保持できるようになる。
【０３９７】
次いで図５７を参照すると、ＮＮＵ１２１のプログラムメモリ１２９に記憶され、ＮＮＵ１２１によって実行されてＪｏｒｄａｎ  ＲＮＮを達成し、図５６の編成によるデータ及び重みを使用するプログラムを図示する表が示される。図５７の非アーキテクチャプログラムは、いくつかの点で図４５の非アーキテクチャプログラムに似ており、違いを説明する。
【０３９８】
図５７の例示的プログラムは、アドレス０〜１１に１２個の非アーキテクチャ命令を含んでいる。アドレス０の初期化命令は、累算器２０２をクリアし、ループカウンタ３８０４を３２の値に初期化して、ループ本体（アドレス２〜１１の命令）を３２回行わせる。アドレス１の出力命令は、累算器２０２のゼロ値（アドレス０の初期化命令によってクリアされた）を出力バッファ１１０４に入れる。観察できるように、５１２個のＮＰＵ１２６は、アドレス２〜６の命令の実行中、５１２個の隠れ層ノードＺに対応し、５１２個の隠れ層ノードＺとして動作し、アドレス７〜１０の命令の実行中、５１２個の出力層ノードＹに対応し、５１２個の出力層ノードＹとして動作する。すなわち、アドレス２〜６の命令の３２回の実行インスタンスは、３２個の対応する時間ステップについての隠れ層ノードＺの値を計算し、該値を出力バッファ１１０４に入れ、それらは、対応するアドレス７〜９の命令の３２回の実行インスタンスによって使用されて、３２個の対応する時間ステップについての出力層ノードＹが算出され、データＲＡＭ１２２に書き込まれ、それらは、アドレス１０の命令の対応する３２回の実行インスタンスによって使用されて、対応する３２個の時間ステップのコンテキスト層ノードＣが出力バッファ１１０４に入れられる。（出力バッファ１１０４に入れられた３２回目の時間ステップのコンテキスト層ノードＣは使用されない。）
【０３９９】
アドレス２及び３の命令（ＡＤＤ＿Ｄ＿ＡＣＣ  ＯＵＴＢＵＦ［ＳＥＬＦ］、及びＡＤＤ＿Ｄ＿ＡＣＣ  ＲＯＴＡＴＥ，ＣＯＵＮＴ＝５１１）の１回目の実行インスタンス中、５１２個のＮＰＵ１２６の各々は、その累算器２０２に、出力バッファ１１０４の５１２個のコンテキストノードＣ値を累算し、それらの値は、アドレス０〜１の命令の実行によって生成され、書き込まれたものである。アドレス２及び３の命令の２回目及びそれ以降の実行インスタンス中、５１２個のＮＰＵ１２６の各々は、その累算器２０２に、出力バッファ１１０４の５１２個のコンテキストノードＣ値を累算し、それらの値は、アドレス７〜８及び１０の命令の実行によって生成され、書き込まれたものである。より具体的には、アドレス２の命令は、上記のように、各ＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８に、その対応する出力バッファ１１０４のワードを選択して、それを累算器２０２に加算するように命令する。アドレス３の命令は、ＮＰＵ１２６に、５１２個のＮＰＵ１２６の接続されたｍｕｘ−ｒｅｇ２０８によって集合的に形成される５１２個のワード循環器内で、コンテキストノードＣ値を５１２個のＮＰＵ１２６間で循環させるように命令して、各ＮＰＵ１２６がその累算器２０２に５１２個のコンテキストノードＣ値を累算できるようにする。アドレス３の命令は累算器２０２をクリアせず、そのため、アドレス４及び５の命令は、入力層ノードＤ（各自の対応する重みが乗算された）を、アドレス２及び３の命令の実行で累算されたコンテキストノードＣ値と共に累算することができる。
【０４００】
アドレス４及び５の命令（ＭＵＬＴ−ＡＣＣＵＭ  ＤＲ  ＲＯＷ＋２，ＷＲ  ＲＯＷ０、及びＭＵＬＴ−ＡＣＣＵＭ  ＲＯＴＡＴＥ，ＷＲ  ＲＯＷ＋１，ＣＯＵＮＴ＝５１１）の各実行インスタンス中、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、現在の時間ステップに関連付けられているデータＲＡＭ１２２の行（例えば、時間ステップ０では行０、時間ステップ１では行２、及び以下同様に時間ステップ３１では行６２）にある５１２個の入力ノードＤ値と、重みＲＡＭ１２４の行０〜５１１からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って、５１２個の積を生成し、それらの積は、アドレス２及び３の命令によって行われた５１２個のコンテキストＣノード値の累算と併せて、それぞれのＮＰＵ１２６の累算器２０２に累算されて、隠れノードＺ層値を計算する。
【０４０１】
アドレス６の命令（ＯＵＴＰＵＴ  ＰＡＳＳＴＨＲＵ，ＮＯＰ，ＣＬＲ  ＡＣＣ）の各実行中、５１２個のＮＰＵ１２６の５１２個の累算器２０２値はパススルーされ、出力バッファ１１０４のそれぞれのワードに書き込まれ、累算器２０２がクリアされる。
【０４０２】
アドレス７及び８の命令（ＭＵＬＴ−ＡＣＣＵＭ  ＯＵＴＢＵＦ［ＳＥＬＦ］，ＷＲ  ＲＯＷ５１２、及びＭＵＬＴ−ＡＣＣＵＭ  ＲＯＴＡＴＥ，ＷＲ  ＲＯＷ＋１，ＣＯＵＮＴ＝５１１）の各実行インスタンス中、５１２個のＮＰＵ１２６の各ＮＰＵ１２６は、出力バッファ１１０４にある５１２個の隠れノードＺ値（アドレス２〜６の命令の対応する実行インスタンスで生成され、書き込まれたもの）と、重みＲＡＭ１２４の行５１２〜１０２３からのＮＰＵ１２６それぞれの重みの列との５１２回の乗算演算を行って５１２個の積を生成し、それらの積は、それぞれのＮＰＵ１２６の累算器２０２に累算される。
【０４０３】
アドレス９の命令（ＯＵＴＰＵＴ  ＡＣＴＩＶＡＴＩＯＮ  ＦＵＮＣＴＩＯＮ，ＤＲ  ＯＵＴ  ＲＯＷ＋２）の各実行インスタンス中、活性化関数（例えば、ｔａｎｈ、シグモイド、正規化）が５１２個の累算値に行われて出力ノードＹ層値を計算し、その値は、現在の時間ステップに関連付けられたデータＲＡＭ１２２の行（例えば、時間ステップ０では行１、時間ステップ１では行３、及び以下同様に時間ステップ３１では行６３）に書き込まれる。アドレス９の出力命令は累算器２０２をクリアしない。
【０４０４】
アドレス１０の命令（ＯＵＴＰＵＴ  ＰＡＳＳＴＨＲＵ，ＮＯＰ，ＣＬＲ  ＡＣＣ）の各実行インスタンス中、アドレス７及び８の命令によって累算された５１２個の値が、アドレス２及び３の命令の次の実行インスタンスで使用するために出力バッファ１１０４に入れられ、累算器２０２がクリアされる。
【０４０５】
アドレス１１のループ命令は、ループカウンタ３８０４を減分し、新しいループカウンタ３８０４値がゼロより大きければアドレス２の命令にループバックする。
【０４０６】
図４４に関連して説明したように、図５７の非アーキテクチャプログラムによって行われる例示的なＪｏｒｄａｎ  ＲＮＮでは、活性化関数を累算器２０２値に適用して出力層ノードＹ値を生成するが、実際の出力層ノードＹ値ではなく、活性化関数を適用する前の累算器２０２値がコンテキスト層ノードＣにパススルーされると仮定している。ただし、活性化関数が累算器２０２値に適用されてコンテキスト層ノードＣを生成するＪｏｒｄａｎ  ＲＮＮの場合には、アドレス１０の命令が図５７の非アーキテクチャプログラムから除去されることになる。Ｅｌｍａｎ又はＪｏｒｄａｎ  ＲＮＮが単一の隠れノード層を含んでいる実施形態（例えば、図４０及び図４２）を説明してきたが、プロセッサ１００及びＮＮＵ１２１の実施形態は、本明細書に記載されるのと同様の仕方で複数の隠れ層を含んでいるＲＮＮに関連する計算を効率的に行うように構成されることを理解されたい。
【０４０７】
上記で図２との関連で説明したように、有利な点として、各ＮＰＵ１２６が、人工ニューラルネットワーク内のニューロンとして動作するように構成され、ＮＮＵ１２１のすべてのＮＰＵ１２６が大規模に並列したやり方で動作して、ネットワークの層についてのニューロン出力値を効率的に計算する。特に集合的なＮＰＵのｍｕｘ−ｒｅｇ循環器を用いてＮＮＵが動作するこの並列方式は、恐らくは、ニューロン層の出力値を計算する従来の仕方と直感的に反している。より具体的には、従来の方法は、通例、単一のニューロン、又はニューロンの比較的小さなサブセットに関連する計算を行い（例えば、並列の算術ユニットを使用して乗算及び加算を行う）、次いで層内の次のニューロンに関連する計算に移り、以下同様に層内のすべてのニューロンについて計算が行われるまで直列方式で計算を行うことを伴う。それと対照的に、各クロックサイクルに、ＮＮＵ１２１のすべてのＮＰＵ１２６（ニューロン）が、すべてのニューロン出力の生成に関連する計算の小さなサブセット（例えば、１回の積和）を並列して行う。有利な点として、約Ｍクロックサイクルの終わりまでに、ＮＮＵ１２１は全ニューロンの出力を計算しており、Ｍは現在の層に接続されたノードの数である。多くの人工ニューラルネットワーク構成に対しては、ＮＰＵ１２６の数が多いために、ＮＮＵ１２１は、Ｍクロックサイクルの終わりまでに層全体の全ニューロンのニューロン出力値を計算できる可能性がある。本明細書における説明から観察できるように、この計算効率はあらゆる種類の人工ニューラルネットワーク計算に有用であり、そのようなニューラルネットワークには、これらに限定されないが、Ｅｌｍａｎ、Ｊｏｒｄａｎ、及びＬＳＴＭネットワークなどのフィードフォワード及びリカレントニューラルネットワークが含まれる。最後、ＮＮＵ１２１が５１２個のＮＰＵ１２６として（例えば、ワイドワード構成において）構成されてリカレントニューラルネットワーク計算を行う実施形態を説明したが、ＮＮＵ１２１が１０２４個のＮＰＵ１２６として（例えば、ナローワード構成において）構成されてリカレントニューラルネットワーク計算を行う他の実施形態が企図され、また、上記のように、５１２又は１０２４個とは異なる数のＮＰＵ１２６を有するＮＮＵ１２１の実施形態が企図される。
【０４０８】
３次元畳み込みニューラルネットワーク
畳み込みニューラルネットワークは、ディープラーニングの分野で普及しつつあり、画像認識の領域で優れた結果を生んでおり、自然言語処理、推薦システム、及びゲームプレーなどの他の領域における結果を約束している。畳み込みニューラルネットワークは、入力にフィルタを畳み込んで出力を作り出す畳み込み層を少なくとも１つ含んでいる。通例、畳み込みニューラルネットワークは、一続きのそのような畳み込み層を含んでおり、その中では、ある畳み込み層の出力が後続の畳み込み層への入力として提供され、恐らくはその間にプーリング層がある。
【０４０９】
畳み込みニューラルネットワークの着想は、動物の視覚皮質の性質の研究にあるとされており、個々のニューロンが動物の眼の視野の部分領域内で受け取られる光に対して反応する。この部分領域はニューロンの受容野と呼ばれる。視覚皮質のニューロンの重なり合った受容野が、視野を構成する。より具体的には、ニューロンは、受容野の中で、例えば特定の向きを持つ直線状のエッジや特定の色のかたまりなど、特定の形状を検出することができる。視野にわたり同様のニューロンが並ぶことに起因して、動物の脳は、視野内での形状の場所に関係なく、特定の形状を検出することができる。この現象は並進不変性と呼ばれることがある。多くの畳み込みニューラルネットワークは、入力データが並進不変であるときに特に有用であるように思われる。なぜならば、フィルタ重みが入力全体（例えば、画像全体）に関係するためである。並進不変特性は、フィルタを入力全体にわたって再使用することを可能にし、それにより、上記では典型的なニューラルネットワーク層又は積和層とも呼んでいる、例えば完全に接続された層と比べて、必要とされる重みの数が激減する。本明細書に記載されるのは、上記のＮＮＵ１２１の実施形態における畳み込みニューラルネットワークに関連する計算の実行を加速する方法の実施形態、並びに追加的な実施形態である。
【０４１０】
上記で述べたように、畳み込み演算は、第１の行列に第２の行列を畳み込む演算である。上記では、第２の行列を畳み込みカーネルと呼んでいるが、以下で説明する図との関連では、第２の行列を、通例、重み、パラメータ、要素、又は値のフィルタと呼ぶ。加えて、上記で図２４〜図２６との関連で説明した第１及び第２の行列は２次元（２Ｄ）行列であるが、以下では第１及び第２の行列が３次元（３Ｄ）行列である畳み込み演算を説明する。これは、３Ｄ畳み込みは畳み込みニューラルネットワークで頻繁に用いられるためである。すなわち、次いで図５８との関連で説明するように、入力は３Ｄ行列であり、フィルタは複数の３Ｄ行列である。
【０４１１】
次いで図５８を参照すると、畳み込みニューラルネットワークなどによって広く行われる、３次元（３Ｄ）畳み込み計算作業を図示するブロック図が示される。より具体的には、３Ｄ入力５８０２に複数のフィルタ５８０４を畳み込んで、出力５８０８を生成する。一般に、入力５８０２は、Ｗ個の列、Ｈ個の行、及びＣ個のチャネルを有する。Ｆ個のフィルタ５８０４があり、各フィルタは、Ｓ個の列、Ｒ個の行、及びＣ個のチャネル（入力５８０２のＣ個のチャネルに対応する）を有する。そして、Ｆ個の出力５８０８があり（Ｆ個のフィルタ５８０４に対応する）、各出力は、Ｐ個の列及びＱ個の行を有する。Ｗ、Ｈ、Ｃ、Ｆ、Ｓ、Ｒ、Ｑ、及びＰは、ＮＮＵ１２１のハードウェアによって実行されている特定のニューラルネットワークのハイパーパラメータである。ニューラルネットワークのハイパーパラメータは、それらを実行するハードウェアに対して動的である。というのは、ハードウェアの特性は静的である（例えば、算術論理ユニットの数、メモリ幅）が、ハイパーパラメータは、ＮＮＵ１２１が実行する種々のニューラルネットワークごとに異なり得るためである。例えば、あるニューラルネットワークは画像認識を行うように設計される場合があるのに対し、別のニューラルネットワークは碁を打つために設計される場合がある。さらに、画像認識／碁のネットワークのうちでも、各ネットワークは異なるハイパーパラメータを有する可能性があり、それらには、層の数、層の大きさ（ノード及び相互接続の数）、並びに層のタイプ（例えば、完全接続、畳み込み、プーリング、ＬＳＴＭ）、が含まれる。
【０４１２】
説明のための例として、入力５８０２は、Ｗ＝１２列、Ｈ＝１２行、及びＣ＝２０チャネルを含むことができ、５０個のフィルタ５８０４があってよく、各フィルタがＳ＝５列及びＲ＝５行を有し、５０個の出力５８０８があってよく、各出力はＰ＝８列及びＱ＝８行を有する。これらは、手書きの数字を分類するために設計された、よく知られているニューラルネットワークの畳み込み層の入力、フィルタ、及び出力のハイパーパラメータあり、そのようなニューラルネットワークは、よく知られているＭＮＩＳＴデータベース、すなわち、ＬｅＣｕｎ，Ｙ．，Ｂｏｔｔｏｕ，Ｌ．，Ｂｅｎｇｉｏ，Ｙ．，ａｎｄ  Ｈａｆｆｎｅｒ，Ｐ．（１９９８），Ｇｒａｄｉｅｎｔ−ｂａｓｅｄ  ｌｅａｒｎｉｎｇ  ａｐｐｌｉｅｄ  ｔｏ  ｄｏｃｕｍｅｎｔ  ｒｅｃｏｇｎｉｔｉｏｎ，Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  ＩＥＥＥ，８６（１１），２２７８−２３２４に記載されるＬｅＮｅｔ  ５の変形例などを使用してトレーニングできる。以下で図５９〜図６９との関連で、ＮＮＵ１２１が畳み込み計算を行って１２×１２×２０の入力５８０２に５０個の５×５フィルタ５８０４を畳み込んで５０個の８×８出力５８０８を生成する方法の実施形態を説明して、ＮＮＵ１２１により３Ｄ入力に３Ｄフィルタを畳み込んで出力を生成するより一般的な方法を、例としてさらに説明する。ＮＮＵ１２１は、特に、本明細書に記載されるように、データＲＡＭ１２２から受け取られた入力データの行を、ＮＰＵ１２６のアレイを回って循環させる能力を提供するように構成されたｍｕｘ−ｒｅｇ（例えば２０８）を備えているＮＰＵ１２６のアレイを有するニューラルネットワークユニットである。ただし、次いで、解くべき一般的な問題、すなわち、Ｗ×Ｈ×Ｃの入力５８０２にＦ個のＳ×Ｒ×Ｃフィルタ５８０４を畳み込んで、Ｆ個のＰ×Ｑ出力５８０８を生成する数学的処理を図５８との関連で説明する。より具体的には、Ｗ×Ｈ×Ｃの入力５８０２に単一のＳ×Ｒ×Ｃフィルタ５８０４を畳み込んで、単一のＰ×Ｑ出力５８０８を生成する数学的処理を次いで説明する。
【０４１３】
図２４〜図２６の文脈では、畳み込みは、３×３の畳み込みカーネルのうちの要素と、その対応する、それぞれの部分行列のうちの要素との、９つの積の和であった。同様に、図５８の文脈では、畳み込みは、Ｓ×Ｒ×Ｃフィルタ５８０４のうちの要素と、その対応する、入力５８０２のそれぞれのＳ×Ｒ×Ｃ部分行列のうちの要素との、Ｓ×Ｒ×Ｃ個の積の和である。その結果得られる和、すなわち畳み込みは、出力５８０８のＰ×Ｑ個の値のうちの１つである。より具体的には、フィルタ５８０４のＳ個の列及びＲ個の行のゼロ基準の索引値を仮定すると、結果得られる畳み込みは、出力５８０８の場所［ｓ，ｒ］にあり、ｓは列の索引であり、ｒは、畳み込まれる入力５８０２のＳ×Ｒ×Ｃ部分行列の左上の要素の行の索引である。そのため、例えば、Ｙ［ｓ，ｒ］を出力５８０８の要素として表し、Ｘ［ｉ，ｊ，ｋ］を入力５８０２の要素として表し、Ｆ［ｍ，ｎ，ｋ］をフィルタ５８０４の要素として表す。ここで、ｉは入力５８０２の列の索引であり、ｊは行の索引であり、ｍはフィルタ５８０４の列の索引であり、ｎは行の索引であり、ｋはチャネルの索引である。すると以下になる。
（外５）
2018092560.tif 000010
したがって、例えば、Ｓ＝Ｒ＝５且つＣ＝２０の場合、出力５８０８のＰ×Ｑ個の値の各値は、５×５×２０＝５００個の積の和になる。
【０４１４】
上記の説明は、入力５８０２の境界周囲のパディングは使用されないことを仮定しており、これは、一般に「有効」な畳み込み（「同一サイズ」の畳み込みに対して）と呼ばれる。その結果、出力５８０８の大きさは、入力５８０２の列及び行の大きさよりも小さくなる。より具体的には、Ｐ＝Ｗ−Ｓ＋１、且つＱ＝Ｈ−Ｒ＋１である。同一サイズの畳み込みの場合は、パディングを使用して（例えば、ゼロパディング）、出力５８０８の大きさを入力５８０２の列及び行の大きさと同じにし、すなわちＰ＝Ｗ且つＱ＝Ｈにする。
【０４１５】
次いで図５９を参照すると、入力ブロック５９０２へのデータＲＡＭ１２２行の区分、フィルタブロック５９０４への重みＲＡＭ１２４行の区分、ＮＰＵブロック５９０６へのＮＰＵアレイ１２６の区分、及び出力ブロック５９０８へのデータＲＡＭ１２２行の区分を図示するブロック図が示される。図５９の実施形態では、ＮＮＵ１２１にあるＮＰＵ１２６の数をＮと表記し、それに対応して、データＲＡＭ１２２の一行から受け取られるワードの数はＮであり、重みＲＡＭ１２４の一行から受け取られるワードの数はＮである。Ｎ個のＮＰＵ１２６、及びデータＲＡＭ１２２／重みＲＡＭ１２４から受け取られるＮ個のワードは、示されるように０〜Ｎ−１と表記する。
【０４１６】
示されるように、ブロック５９０２／５９０４／５９０６／５９０８の数をＧと表記し、Ｇ個のブロックは０〜Ｇ−１と表記する。Ｇは、ＮとＢとの商として計算される。Ｂはブロックサイズである。Ｂは、少なくともＷと同じ大きさの、Ｎの最小の因数であり、Ｗは、図５８の入力５８０２の列の数である。例えば、Ｎが１０２４でＷが１２である場合には、Ｂは１６になる。これは、１６が、１２よりも大きい１０２４の最小の因数であるためである。そして、Ｇ＝１０２４／１６＝６４となる。
【０４１７】
図５９に示されるように、データＲＡＭ１２２／重みＲＡＭ１２４の行のＮ個のワードは、Ｇ個のブロックのうち１番目のブロックでは０、１、２〜Ｂ−１と表記され、Ｇ個のブロックのうち２番目のブロックではＢ、Ｂ＋１〜２Ｂ−１と表記され、以下同様に続き、ブロックＧ−１では、Ｎ−Ｂ、Ｎ−Ｂ＋１〜Ｎ−１と表記される。様々な番号が振られたブロックは、互いに対応する。すなわち、ＮＰＵブロック０は、データＲＡＭ１２２からの入力ブロック０と、重みＲＡＭ１２４からのフィルタブロック０とを受け取り、出力ブロック０を生成する。ＮＰＵブロック１は、データＲＡＭ１２２からの入力ブロック１と、重みＲＡＭ１２４からのフィルタブロック１とを受け取り、出力ブロック１を生成する。以下同様に続き、ＮＰＵブロックＮ−１は、データＲＡＭ１２２からの入力ブロックＮ−１と、重みＲＡＭ１２４からのフィルタブロックＮ−１とを受け取り、出力ブロックＮ−１を生成する。ＮＰＵブロック５９０６内の個々のＮＰＵ１２６による出力ブロック５９０８の結果の生成については、以下で説明する。
【０４１８】
ＮＰＵ１２６のアレイ、データＲＡＭ１２２の行、重みＲＡＭ１２４の行、及びデータＲＡＭ１２２の行を、それぞれサイズがＢである、それぞれのＧ個のＮＰＵブロック５９０６、入力ブロック５９０２、フィルタブロック５９０４、及び出力ブロック５９０８に区分すると、ＮＮＵ１２１が効率的な仕方で入力５８０２にフィルタ５８０４を畳み込んで出力５８０８を生成することが容易になる。詳細には、データＲＡＭ１２２及び重みＲＡＭ１２４内の入力データ及びフィルタ重みのレイアウトと併せて区分を行うと、固有の入れ子ループ構造が容易になり、このループ構造は、有利な点として、ＮＮＵ１２１の循環器ｍｕｘ−ｒｅｇ２０８構造を使用して、入力５８０２のＣ個のチャネルすべてに関連付けられた入力ブロック５９０２を循環させ、その結果、Ｆ個のフィルタ５８０４に関連付けられたＧ個のＮＰＵブロック５９０６のうちＦ個の各々は、その対応するフィルタ５８０４を畳み込むための入力５８０２のＣ個のチャネルすべてが「見える」（すなわち受け取る）。より具体的には、ＮＮＵ１２１は、データＲＡＭ１２２の行の入力ブロック５９０２をｍｕｘ−ｒｅｇ２０８の中に読み込んでから、ｍｕｘ−ｒｅｇ２０８によって形成される循環器を使用して、入力ブロック５９０２を、少なくともＣ個の隣接するＮＰＵブロック５９０６を通して循環させる。これにより、各ＮＰＵ１２６は、その対応するフィルタ５８０４の一行のチャネルすべてと、入力５８０２の行のチャネルすべてとの積和演算を行うことができ（例えば、下記で図６０との関連で説明するように、列チャネル和を行う）、その後、入力５８０２の別の行がｍｕｘ−ｒｅｇ２０８に読み込まれる。これについては、図６０の疑似コードとの関連でより詳細に説明する。ＮＮＵ１２１の使用は、上記の式（７）の考察に基づいて適用される可能性のある、より直感的な従来の方法に対して、固有であり、また効率的である。
【０４１９】
上述から、Ｎは静的であるが、Ｂ、及びしたがってＧは動的であることが観察できよう。これは、Ｂ及びＧが、ＮだけでなくＷの関数でもあるためであり、Ｗは、ＮＮＵ１２１に実行される特定のニューラルネットワークのハイパーパラメータである。Ｇ及びＢの値は、下記でより詳細に説明するように、ＮＮＵ１２１で実行されて畳み込み演算を行う非アーキテクチャプログラムに組み込まれる。
【０４２０】
次いで図６０を参照すると、ＮＮＵ１２１で実行されている非アーキテクチャプログラムによって行われて、図５８に示されるような３Ｄ畳み込み作業を行う計算を図示する疑似コードが示される。この疑似コードリストは、説明を容易にするためにライン番号を含んでいる。図６０では、ライン番号は２で始まり、ライン番号４、１６、１８、２１〜２２、及び２５はスキップされている。それにより図６０の疑似コードを図６３、図６７、及び図６９の疑似コードと比較しやすくしており、図６３、図６７、及び図６９では、疑似コードの同様の命令は対応するライン番号を持つ。また、図６７及び図６９ではライン１８及び２２をスキップしているのに対し、図６３及び図６５にはライン１〜２６のすべてが含まれていることに留意されたい。
【０４２１】
図６０の疑似コードを考察しながら、例えば上記で図１〜図４８との関連で説明したように、同じ命令又は演算がＮＮＵ１２１のＮＰＵ１２６のすべてによって同時に行われることを念頭に置かれたい。したがって、図６０の一部については、畳み込みニューラルネットワーク層の単一のニューロンとして機能して出力５８０８の単一の要素すなわち畳み込み結果を生成する単一のＮＰＵ１２６に関連して説明する場合があるが、図６０の疑似コードに従ってすべてのＮＰＵ１２６が同時に動作して結果を生成することを理解されたい。ただし、多くの場合には、畳み込みニューラルネットワーク層のハイパーパラメータに依存して、ＮＰＵブロック５９０６内のＮＰＵ１２６の一部が、使用されない結果を生成する場合もあることも念頭に置かれたい。さらに、所与の出力ブロック５９０８における出力５８０８のＱ行のうちの行のＰ個の畳み込み結果は共にパックされるが、出力ブロック５９０８の境界に、使用されない結果がいくつか存在する場合もある。その結果、Ｎ個の結果が書き込まれるデータＲＡＭ１２２（又は重みＲＡＭ１２４）の行（例えば、図６０のライン２４）の中では、Ｆ×Ｐ個の畳み込み結果は、通例、すべてが共にパックされる訳ではない。好ましくは、別の非アーキテクチャプログラム（又は同じ非アーキテクチャプログラムの追加的な部分）が、ニューラルネットワークの次の層に入力するために、パックされない畳み込み結果を集めてまとめる。最後、図６０は、データＲＡＭ１２２内の入力５８０２のレイアウト、及び重みＲＡＭ１２４内のフィルタ５８０４のレイアウトの文脈でより完全に理解することができ、その４つの実施形態を下記で図６１〜図６９との関連で説明する。
【０４２２】
疑似コードは４つの入れ子ループを含んでおり、それらは、ループ１、ループ２、ループ３、及びループ４と表される。ループ１が外側ループであり、ループ４が内側ループである。ループ１は、出力５８０８のＱ個の出力行の各々について反復する。ループ２は、フィルタ５８０４のＲ個のフィルタ行の各々について反復する。ループ３は、少なくとも、入力５８０２のＣ個のチャネルの各々について反復する。下記でより詳細に説明するように、ループ３は、Ｃ個のチャネルに加えて、存在する場合にはギャップ入力ブロックグループ（例えば図６１Ｂの６１０３を参照）の数だけ反復する。ループ４は、フィルタ５８０４のＳ個のフィルタ列の各々について反復する。Ｓ列、Ｒ行、Ｃチャネルのフィルタ５８０４を、入力５８０２のボリュームのうち対応するサイズの部分の上に空間的に重ねて視覚化した場合、４つのループは、次の段落で一般化することができ、それに続いて各ループをより詳細に解説する。非アーキテクチャプログラムは、図２６Ａ、図２８、図４２、図４５、図４８、図５１、図５４、又は図５７のＩＮＩＴＩＡＬＩＺＥ及びＬＯＯＰ命令など、ＩＮＩＴＩＡＬＩＺＥ命令と併せてＬＯＯＰ命令を使用することによりループを達成することができる。ループ１は、ＬＯＯＰＣＮＴをＱに代入することによって達成することができる。好ましくは、３つの外側ループ（ループ１、２、及び３）は、ＩＮＩＴＩＡＬＩＺＥ及びＬＯＯＰ命令を使用して達成できるのに対し、内側ループ（ループ４）は、図４、図９、図２０、図２６Ａ、図４２、図４５、又は図５７のＭＵＬＴ−ＡＣＣＵＭ命令などの積和命令に関連付けられたＣＯＵＮＴ値を使用して達成することができる。
【０４２３】
内側ループであるループ４に従い、各ＮＰＵ１２６は、各自の累算器２０２に、各自の対応するフィルタ５８０４の行のＳ個の重みと、Ｓ個のオーバーレイされた入力５８０４要素との、Ｓ個の積の和を累算し、その和をここでは列和（column-sum）と呼ぶことにする。ループ３に従い、ループ４は、累算器２０２に、Ｃ個のチャネルのうち第１のチャネルについての第１の列和を累算し、次いで、累算器２０２に、第２のチャネルについての第２の列和を、第１の列和と共に累算し、以下同様に続き、最終的には、フィルタ５８０４のＣ個のチャネルすべてについてのＣ個の列和を累算している。場合によっては、ハイパーパラメータに依存して、ループ３は、累算器２０２に、ギャップ入力ブロックグループ６１０３及びギャップフィルタブロックグループ６１０４に関連付けられた追加的なゼロ値の列和を累算する場合もある（図６１を参照）。（チャネルが処理される順序は、ＮＰＵブロック５９０６の中でのそのフィルタのＮＰＵブロック５９０６の場所に依存して、詳細には、そのフィルタのＮＰＵブロック５９０６の索引とチャネルの数Ｃとのモジュロに依存して、フィルタ５８０４ごとに変化する。これについては下記でより詳細に説明する。）したがって、ループ３の一インスタンスの完了時に、ＮＮＵ１２１は、フィルタ５８０４の水平方向の（horizontal）２Ｄスライスと、それに対応する入力５８０２の２Ｄのオーバーレイされた水平方向の２Ｄスライスとの、Ｓ×Ｃ個の積の和を累算していることになり、この和をここでは列チャネル和（column-channel-sum）と呼ぶことにする。ループ２に従い、ループ３は、累算器２０２に、フィルタ５８０４の行０についての第１の列チャネル和を累算し、次いで、累算器２０２に、フィルタ５８０４の行１についての第２の列チャネル和を累算し、以下同様に続き、最終的には、フィルタ５８０４のＲ個の行すべてについてのＲ個の列チャネル和を累算している。したがって、ループ２の一インスタンスの完了時に、ＮＮＵ１２１は、フィルタ５８０４と、それに対応する入力５８０２のオーバーレイされたボリュームとについての、Ｓ×Ｃ×Ｒ個の積の和を累算していることになり、この和をここでは列チャネル行和（column-channel-row-sums）と呼ぶことにし、これが、出力５８０６のＱ行のうち１つの行の最終的な畳み込み結果である。ループ２の終わりに、ＮＰＵ１２６は、Ｆ個の列チャネル行和をデータＲＡＭ１２２の行に書き込む。観察できるように、この列チャネル行和は、従来の列−行−チャネルの順序に対して、列−チャネル−行の順に計算される。これは、ＮＮＵ１２１の幅Ｎのｍｕｘ−ｒｅｇ２０８循環器能力を活用できるため有利である。ループ１に従い、ループ２は、累算器２０２に、出力５８０６の行０についての第１の列チャネル行和を累算し、次いで出力５８０６の行１についての第２の列チャネル行和を累算し、以下同様に続き、最終的に出力５８０６のＱ行すべてについての列チャネル行和を生成し、データＲＡＭ１２２に出力している。
【０４２４】
図６０の非アーキテクチャプログラムについては、一般に外から中へ、すなわち外側ループに関して、次いでそれに続く内側ループに関して説明するが、理解を助けるために、最も内側のループであるループ４を最初に説明する。
【０４２５】
ループ４は、各ＮＰＵ１２６の乗算器２４２に、Ｓ回の乗算を行わせてＳ個の積を生成させる。Ｓ個の積の各々が作り出されるとき、その積は累算器２０２に累算される。したがって、ループ４の完了時に、累算器２０２は、ループ４の開始前に保持していたよりもＳ個多い積の中間和を保持しており、すなわち、別の列和を保持している。各ＮＰＵ１２６によるループ４のＳ回の乗算の各々は、第１のオペランドとして、入力５８０２のＷ列のうちの各自の列とＣチャネルのうちのチャネルとＨ行のうちの行との中の入力５８０２の要素を取り出す。Ｗ個の列のうちの列は、ループ４のどの回の反復が行われているかと、ＮＰＵブロック５９０６内でのＮＰＵ１２６の場所とに依存する。Ｃ個のチャネルのうちのチャネル（存在する場合にはギャップ入力ブロックグループの数を含む）は、ループ３のどの回の反復が行われているかと、そのＮＰＵ１２６を含むＮＰＵブロック５９０６の場所とに依存する。Ｈ個の行のうちの行は、ループ１のどの回の反復が行われているかとループ２のどの回の反復が行われているかとの組み合わせに依存する。第１のオペランドである入力５８０２の要素は、データＲＡＭ１２２からｍｕｘ−ｒｅｇ２０８に読み込まれるか（例えば図６０のライン８）、又は、隣接するＮＰＵ１２６からｍｕｘ−ｒｅｇ２０８に循環されるか（例えば図６０のライン１５若しくはライン１９）のいずれかである。Ｓ回の乗算の各々は、第２のオペランドとして、そのＮＰＵ１２６を含んでいるＮＰＵブロック５９０６に対応するフィルタブロック５９０４に関連付けられたフィルタ５８０４のＳ個の列のうちの各自の列とＣ個のチャネルのうちのチャネルとＲ個の行のうちの行との中の重みを取り出す。Ｓ個の列のうちの列は、ループ４のどの回の反復が行われているかに依存する。Ｃ個のチャネルのうちのチャネル（存在する場合にはギャップ入力ブロックグループの数を含む）は、ループ３のどの回の反復が行われているかと、そのＮＰＵ１２６を含むＮＰＵブロック５９０６の場所とに依存する。Ｒ個の行のうちの行は、ループ２のどの回の反復が行われているかに依存する。第２のオペランドである重みは、重みＲＡＭ１２４からレジスタ２０５（又はｍｕｘ−ｒｅｇ７０５）に読み込まれる（例えば図６０のライン１３）。
【０４２６】
一実施形態では、ループ４の実行インスタンスは、Ｓのカウントを指定し、ｍｕｘ−ｒｅｇ２０８への入力２１１（すなわち隣接するＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８からの循環された入力５８０２要素のワード）を第１の乗算器２４２入力として指定し、重みワードを重みＲＡＭ１２４からレジスタ２０５に第２の乗算器２４２入力として読み込むことを指定する、単一のＭＵＬＴ−ＡＣＣＵＭ／実行非アーキテクチャ命令によって達成することができる。或いは、非アーキテクチャプログラムは、ＭＵＬＴ−ＡＣＣＵＭ／実行の非アーキテクチャ命令のペアを含んで、ループ４の実行インスタンスを達成してもよい。例えば、第１の１つ又は複数の命令が、１のカウントを指定し、ｍｕｘ−ｒｅｇ２０８への入力２１１−２、２１１−４、及び／又は２１１−８（すなわち、それぞれ２つ、４つ、及び／又は８つ離れたＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８からの循環された入力５８０２要素のワードであり、それにより、図７０及び図７１のマルチワード（multi-word）距離循環動作に関連してより詳細に説明するように、マルチワード循環を達成する）を第１の乗算器２４２入力として指定し、重みＲＡＭ１２４からワードを第２の乗算器２４２入力としてレジスタ２０５に読み込むことを指定する。第２の命令は、Ｓ−１のカウントを指定し、ｍｕｘ−ｒｅｇ２０８への入力２１１を第１の乗算器２４２入力として指定し、重みＲＡＭ１２４からワードを第２の乗算器２４２入力としてレジスタ２０５に読み込むことを指定する。第１の命令は、１よりも大きい循環を指定することにより、ループ３の１回目の反復を除くすべての反復について、図６０のライン１９に記載されるブロックの位置合わせを効果的に達成するのに使用することができる。次いで外側ループについて説明する。
【０４２７】
ループ１の各反復は、Ｎ個のＮＰＵ１２６のＮ個の累算器２０２をクリアする。非アーキテクチャプログラムは、上記で（例えば図４との関連で）説明したようなＩＮＩＴＩＡＬＩＺＥ命令又は「実行」命令を使用して累算器２０２をクリアすることができる。そして、ループ１の各反復がループ２を行い、それにより、Ｎ個の累算器２０２に結果を累算する。最後、ループ１の各反復が、ループ２で生成された列チャネル行和を、Ｎ個の累算器２０２からデータＲＡＭ１２２の行に（又は、それに代えて重みＲＡＭ１２４の行に）書き込む。ループ２の一回の実行インスタンスが完了した時の累算器２０２内の列チャネル行和は、上記の式（７）で説明した畳み込みと数学的に同等の畳み込みを含んでいる。累算器２０２内の畳み込み列チャネル行和は、Ｆ個の出力５８０８のＱ行のうちの一行である。より具体的には、Ｇ個のＮＰＵブロック５９０６のうちＦ個が、Ｆ個の対応する出力ブロック５９０８を作り出し、Ｆ個の出力ブロック５９０８の各々は、Ｆ個の出力５８０８のうちの対応する出力５８０８に関して、その対応する出力５８０８のＱ行のうちの行を含んでいる。ＦがＧ未満である場合には、ＮＰＵブロック５９０６のうちＧ−Ｆ個の累算器２０２の結果は使用されない。Ｑ行のうちの行のＰ個の畳み込み列チャネル行和は、関連するＮＰＵブロック５９０６のＢ個のＮＰＵ１２６の累算器２０２のサブセットから提供され、その他の累算器２０２は使用されない。ループ１の各反復は、出力５８０８のＱ行のうち異なる行を作り出し、Ｆ個のＮＰＵブロック５９０６の各々は、Ｆ個のＮＰＵブロック５９０６に対応するＧ個の出力ブロック５９０８のうちＦ個の対応するもの内の、Ｆ個の出力５８０８のうち異なるものを作り出す。
【０４２８】
ＮＰＵブロック５９０６内の累算器２０２の有効な／使用されるサブセットは、特に、ブロックサイズＢと入力列の数Ｗとの間に差がある場合にはその差、及び、「有効」な畳み込み出力が生成されるか又は「同一サイズ」の畳み込み出力が生成されるかに依存する。ＷがＢに等しく、同一サイズの畳み込みが要求される場合には、サブセットは、ＮＰＵブロック５９０６の累算器２０２のうちＢ個すべてを含み、この場合はＰもまたＢ及びＷに等しくなる。累算器２０２のサブセットについては、下記で図６２の実施形態との関連でより詳細に説明するが、出力５８０８の各個々の要素、すなわち畳み込み列チャネル行和は、単一のＮＰＵ１２６によってその累算器２０２内で生成されることを覚えておかれたい。
【０４２９】
さらに、好ましくは、個々の畳み込み列チャネル行和は、ＮＰＵ１２６の累算器２０２の中で完全に生成され、データＲＡＭ１２２（又は重みＲＡＭ１２４）に中間の部分和を書き込んで後にそれらを読み出すことはない。これは、有利な点として、畳み込み列チャネル行和の精度を損なうことを回避する。上記のように、好ましくは、累算器２０２の幅は、データＲＡＭ１２２及び／又は重みＲＡＭ１２４から入力される、且つ／又はそれらに書き込まれる個々のワードの幅よりも大幅に広い。好ましくは、累算器２０２値は、データＲＡＭ１２２に書き込まれる前に、データＲＡＭ１２２／重みＲＡＭ１２４のワードのサイズに変換され、飽和され、且つ／又は圧縮される。例えば、２８ビットであり得る累算器２０２値が、上記で例えば図３０〜図３３との関連で説明したように、データＲＡＭ１２２に書き込まれる前に、８ビットワードに変換され、飽和され、且つ／又は圧縮されることができる。
【０４３０】
ループ２の各反復は、Ｎ個のｍｕｘ−ｒｅｇ２０８に、データＲＡＭ１２２の一行を読み込む。より具体的には、Ｇ個のＮＰＵブロック５９０６は、各自のｍｕｘ−ｒｅｇ２０８に、データＲＡＭ１２２の行が区分されたＧ個の入力ブロック５９０２のうち各自の入力ブロックを読み込む。Ｇ個の入力ブロック５９０２は、ＮＮＵ１２１を回って、ｍｕｘ−ｒｅｇ２０８の循環器を使用して、ループ３によって異なるＮＰＵブロック２９０６へと循環される。非アーキテクチャプログラムは、上記のようなＭＵＬＴ−ＡＣＣＵＭ命令又は「実行」命令を使用して、データＲＡＭ１２２行をｍｕｘ−ｒｅｇ２０８に読み出すことができる。ＭＵＬＴ−ＡＣＣＵＭ／実行命令は、ループ４との関連でより詳細に説明するように、重みＲＡＭ１２４から行を読み出すことをさらに指定することができる。データＲＡＭ１２２行を読み出した後、次いでループ２の各反復がループ３を行う。
【０４３１】
ループ３の各反復はループ４を行ってから、ｍｕｘ−ｒｅｇ２０８を循環させて、入力ブロック５９０２を次の隣接するＮＰＵブロック５９０６と位置合わせする。有利な点として、これにより、各ＮＰＵ１２６ブロックが、Ｃ個のチャネルのうち異なるチャネルについての、すなわち、ＮＰＵブロック５９０６との位置合わせへと今回循環された入力ブロック５９０２に関連付けられたチャネルについての、新たな列和を累算することができる。好ましくは、ループ４の完了時、ｍｕｘ−ｒｅｇ２０８内の入力ブロック５９０２は、下記でさらに説明するように、Ｓワードだけ循環されたことになる。したがって、入力ブロック５９０２を次の隣接するＮＰＵブロック５９０６に位置合わせするために、非アーキテクチャプログラムは、好ましくは、ｍｕｘ−ｒｅｇ２０８を、Ｂ−Ｓワードだけ循環させる。ただし、非アーキテクチャプログラムの実装に依存して、また特にループ４で、位置合わせする循環は、ｍｕｘ−ｒｅｇ２０８を、Ｂ−Ｓ＋１ワードだけ循環させることを必要とする場合もある。非アーキテクチャプログラムは、上記のような１つ又は複数のＭＵＬＴ−ＡＣＣＵＭ命令又は「実行」命令を使用してｍｕｘ−ｒｅｇ２０８を循環させて、入力ブロック５９０２を次の隣接するＮＰＵブロック５９０６に位置合わせすることができる。下記で図７０及び図７１との関連で説明するように、１つ又は複数の非アーキテクチャ命令は、マルチワード距離循環を含むことができる。したがって、観察できるように、ループ２の各反復は、Ｆ個の列チャネル行和、すなわち畳み込みを作り出し、それらをデータＲＡＭ１２２の行に書き込む。
【０４３２】
「有効な」畳み込みが行われる実施形態が説明されるが、「同一サイズ」の畳み込みが行われる他の実施形態が企図される。有効な畳み込みと同一サイズの畳み込みとの違いは、入力５８０２の端がどのように扱われるかに関係し、それはひいては出力５８０８のサイズに影響する。有効な畳み込みは、入力５８０２よりもより少ない数の行及び列を持つ出力５８０８を作り出すのに対し、同一サイズの畳み込みは、入力５８０２と同じ数の行及び列を持つ出力５８０８を作り出す。例えば、１２×１２の入力と５×５のフィルタとの有効な畳み込みを行うと８×８の出力が生成されるのに対し、１２×１２の入力と５×５のフィルタとの同一サイズの畳み込みを行うと１２×１２の出力が生成される。これを達成するために、有効な畳み込み演算は、入力のうち実際に存在する値、すなわち「有効な」値だけに積和を行い、対して、同一サイズの畳み込み演算は、入力に実際には存在しない４行及び４列の値、すなわち「無効な」値を仮定しなければならない。同一サイズの畳み込み演算は、いくつかの無効な値（例えば、通例はゼロ）を仮定しなければならない。これは、５×５のフィルタが１２×１２の入力にかけられる時、乗算される対応する入力５８０２の要素がない４つの行が右端（若しくは左端又はそれらの組み合わせ）に存在するためである。
【０４３３】
次いでまとめて図６１と参照される図６１Ａ及び図６１Ｂを参照すると、１２×１２×２０の入力５８０２に５０個の５×５フィルタ５８０４を畳み込んで５０個の８×８出力５８０８を生成する一実施形態による、データＲＡＭ１２２内の入力ブロック５９０２のグループのレイアウト６１０１、及び重みＲＡＭ１２４内のフィルタブロック５９０４のグループのレイアウト６１０２を図示するブロック図が示される。図６１の例は、１０２４個のＮＰＵ１２６を持つＮＮＵ１２１を仮定しており、すなわちＮ＝１０２４である（図５９参照）。その結果、ハイパーパラメータＷ＝１２であるので、Ｂ＝１６になり、これはすなわち、少なくともＷと同じ大きさの、Ｎの最小の因数である。また、Ｂ＝１６であるので、Ｇ＝１０２４／１６＝６４となる。したがって、６４個のＮＰＵブロック５９０６があり、データＲＡＭ１２２の行当たり６４個の入力ブロック５９０２があり、重みＲＡＭ１２４の行当たり６４個のフィルタブロック５９０４がある。図６１は、ゼロ基準の入力ブロック索引０〜６３及びフィルタブロック索引０〜６３を示しており、これらは、図５９に関連して上記で説明したように、ＮＰＵブロック索引０〜６３に対応している。すなわち、０の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引０を持つＮＰＵブロック５９０６によって受け取られ、１の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引１を持つＮＰＵブロック５９０６によって受け取られ、以下同様に続き、６３の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引６３を持つＮＰＵブロック５９０６によって受け取られる。図６１の実施形態では、索引０にある入力ブロックは、データＲＡＭ１２２のワード０〜１５を含んでおり、索引１にある入力ブロックは、データＲＡＭ１２２のワード１６〜３１を含んでおり、以下同様に続き、索引６３にある入力ブロックは、データＲＡＭ１２２のワード１００８〜１０２３を含んでいる。同様に、索引０にあるフィルタブロックは、重みＲＡＭ１２４のワード０〜１５を含んでおり、索引１にあるフィルタブロックは、重みＲＡＭ１２４のワード１６〜３１を含んでおり、以下同様に続き、索引６３にあるフィルタブロックは、重みＲＡＭ１２４のワード１００８〜１０２３を含んでいる。
【０４３４】
図６１は、６４個の入力ブロックグループを示している。入力ブロックグループのうち６０個は、入力ブロック索引０〜５９にあり、総称してＩ［ｃ］と表され、ｃは、Ｃ＝２０個のチャネルのチャネル索引を表す。Ｃ＝２０個のチャネルに関連付けられた２０個の入力ブロックグループ、すなわちＩ［０］〜Ｉ［１９］の、３つのインスタンス又はコピーが、下記でより詳細に説明するように、入力ブロック索引０〜５９にわたって並べられている。入力ブロックグループのうち４つは、ギャップ入力ブロックグループ６１０３と呼ばれ、Ｉ［Ｇ］と表され、入力ブロック索引６０〜６３にある。好ましくは、ギャップ入力ブロックグループ６１０３はゼロ値を含んでいる。入力ブロックグループＩ［ｃ］は、データＲＡＭ１２２のＨ個の異なる行にあるＨ個の入力ブロック５９０２からなるグループであり、すべて、データＲＡＭ１２２内で同じ入力／フィルタ／ＮＰＵブロック索引に配置される。したがって、ある入力ブロックグループのすべての入力ブロック５９０２は、同じＮＰＵブロック５９０６に提供される。さらに、各入力ブロックグループＩ［ｃ］は、下記で説明するように、入力５８０２のチャネルｃについてのＨ×Ｗの縦方向（vertical）スライスの要素を保持するか、又は、ギャップ入力ブロックグループ６１０３の場合はゼロを保持する。より具体的には、入力ブロックグループＩ［ｃ］のＨ個の入力ブロック５９０２の各入力ブロック５９０２は、入力５８０２のチャネルｃのＨ×Ｗ縦方向スライスの要素の各自の行を保持する。
【０４３５】
図６１の文脈では、入力ブロックグループＩ［ｃ］は、データＲＡＭ１２２の１２個の異なる行にある１２個の入力ブロック５９０２からなるグループである。（図６１の実施形態では、１２個の行はデータＲＡＭ１２２内で隣接しており、すなわち行０〜１１にあるが、それらの行が隣接しておらず、非アーキテクチャプログラムがそれに応じて、入力ブロック５９０２があるデータＲＡＭ１２２の行をアドレス指定するように変更を加えられる他の実施形態が企図される。）したがって、各入力ブロックグループは、入力ブロック当たり１６ワード×１２行＝データＲＡＭ１２２の１９２ワードを有する。ただし、図６２に示されるように、各入力ブロック５９０２は、入力５８０２のうち各自の行ｈ及びチャネルｃのＷ＝１２個の要素だけを保持し、入力ブロック５９０２のうち残りのＢ−Ｗ＝１６−１２＝４ワードは使用されない（且つ一実施形態ではゼロである）。より具体的には、各入力ブロックグループＩ［ｃ］は、入力５８０２のチャネルｃについての１２×１２縦方向スライスの要素（図６２の６２１５参照）、又はギャップ入力ブロックグループ６１０３の場合はゼロを保持する。図６１の入力ブロックグループＩ［ｃ］の１２個の入力ブロック５９０２の各々は、入力５８０２のチャネルｃの１２×１２縦方向スライス６２１５の要素の各自の行を保持する。入力ブロックグループＩ［ｃ］については、図６２との関連でより詳細に説明する。図６１及び図６２の例は、データＲＡＭ１２２の行０〜１１に記憶された入力ブロックグループを示しているが、入力ブロックグループは他の行に記憶されてもよい。すなわち、図６１では、入力ブロックグループＩ［ｃ］を保持するデータＲＡＭ１２２の行の行番号は、入力５８０２の行番号に対応しているが、これは偶然であり、他のデータＲＡＭ１２２行が入力ブロックグループを記憶する場合もあり、また上述のように、データＲＡＭ１２２行は、実施形態によっては隣接しない場合もある。
【０４３６】
図６１の例では、データＲＡＭ１２２は、６４個の入力ブロックグループを保持しており、各グループに１２個の入力ブロック５９０２があり、図６１の例では合計で７６８個の入力ブロック５９０２があり、それが、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで５０個の８×８出力５８０６を作り出す。しかし、６４個の入力ブロック索引があり、チャネルは２０個だけなので、２０個のチャネルは、入力ブロック索引０〜５９にわたって３回並べられ、入力ブロック索引６０〜６３の入力ブロックグループは、入力５８０２からの要素ではなく、ゼロ値を保持する。すなわち、示されるように、入力ブロックグループＩ［０］が入力ブロック索引０にあり、入力ブロックグループＩ［１］が入力ブロック索引１にあり、以下同様に続き、入力ブロックグループＩ［１９］が入力ブロック索引１９にある。次いで、このパターンが繰り返され、すなわち、入力ブロックグループＩ［０］が入力ブロック索引２０にあり、入力ブロックグループＩ［１］が入力ブロック索引２１にあり、以下同様に続き、入力ブロックグループＩ［１９］が入力ブロック索引３９にある。次いで、このパターンがもう１回繰り返され、すなわち、入力ブロックグループＩ［０］が入力ブロック索引４０にあり、入力ブロックグループＩ［１］が入力ブロック索引４１にあり、以下同様に続き、入力ブロックグループＩ［１９］が入力ブロック索引５９にある。入力ブロック索引６０〜６３にあるギャップ入力ブロックグループ６１０３はゼロを投入され、そのため、それらから生成される列和はゼロになり、したがって、累算器２０２内で累算された時に、最終的な列チャネル行和に寄与しない。
【０４３７】
ハイパーパラメータによって必要とされる場合には、下記でより詳細に説明するように、ギャップ入力ブロックグループ６１０３及びギャップフィルタブロックグループ６１０４が存在し、Ｎ個のｍｕｘ−ｒｅｇ２０８からなる循環器を使用した、ＮＮＵ１２１を回る入力ブロック５９０２の循環を容易にする。
【０４３８】
図６１は、６４×２４＝１５３６個のフィルタブロックグループを示しており、これは総称してＦ［ｆ，ｃ］と表され、ここでｆは、Ｆ個のフィルタ５８０４のうちのフィルタを表し、ｃは、Ｃ＝２０個のチャネルのチャネル索引を表し、又は、Ｆ［Ｇ］と表され、Ｆ［Ｇ］は、ギャップフィルタブロックグループ６１０４を表す。好ましくは、ギャップフィルタブロックグループ６１０４はゼロ値を含んでいる。ギャップフィルタブロックグループＦ［Ｇ］の目的は、それにギャップ入力ブロックグループＩ［Ｇ］を畳み込むことである。フィルタブロックグループＦ［ｆ，ｃ］は、重みＲＡＭ１２４のＲ×Ｓ個の異なる行にあるＲ×Ｓ個のフィルタブロック５９０４からなるグループであり、すべてが、重みＲＡＭ１２４内で同じ入力／フィルタ／ＮＰＵブロック索引内に配置される。したがって、フィルタｆのすべてのフィルタブロックグループのすべてのフィルタブロック５９０４が、同じＮＰＵブロック５９０６に提供される。さらに、各フィルタブロックグループＦ［ｆ，ｃ］は、フィルタ５８０４、ｆのチャネルｃについてのＲ×Ｓ縦方向スライスの重み（図６２の６２０９参照）か、又はギャップフィルタブロックグループＦ［Ｇ］の場合はゼロを保持する。より具体的には、図６２との関連でより詳細に説明するように、フィルタブロックグループＦ［ｆ，ｃ］のＲ×Ｓ個のフィルタブロック５９０４の各フィルタブロック５９０４は、フィルタ５８０４、ｆのチャネルｃのＲ×Ｓ縦方向スライス６２０９の異なる重みのＰ個のコピーを保持する。
【０４３９】
図６１の文脈では、フィルタブロックグループＦ［ｆ，ｃ］は、重みＲＡＭ１２４の２５個の異なる行にある２５個のフィルタブロック５９０４からなるグループである。（図６１の実施形態では、２５個の行は、重みＲＡＭ１２４内で隣接しており、すなわち０〜２４、２５〜４９などにあるが、それらの行が隣接しておらず、非アーキテクチャプログラムがそれに応じて、フィルタブロック５９０４がある重みＲＡＭ１２４の行をアドレス指定するように変更を加えられる他の実施形態が企図される。）図６６及び図６８は、フィルタブロックグループ及びフィルタブロックグループ内でのフィルタブロック５９０４の編成が異なる実施形態を説明している。したがって、図６１の各フィルタブロックグループＦ［ｆ，ｃ］は、フィルタブロック当たり１６ワード×フィルタブロックグループ当たり２５個のフィルタブロック５９０４（重みＲＡＭ１２４の２５行にある）＝重みＲＡＭ１２４の４００ワードを有する。ただし、図６２に示されるように、各フィルタブロック５９０４は、フィルタ５８０４、ｆのうち各自の列ｓ、各自の行ｒ、及びチャネルｃの重みのコピーをＰ＝８個のみ保持しており、フィルタブロック５９０４の残りのＢ−Ｐ＝１６−８＝８個のワードは使用されない（且つ一実施形態ではゼロである）。より具体的には、各フィルタブロックグループＦ［ｆ，ｃ］は、フィルタ５８０４、ｆのチャネルｃについての５×５縦方向スライス６２０９の重み、又はギャップフィルタブロックグループ６１０４の場合はゼロを保持する。より具体的には、図６２との関連でより詳細に説明するように、フィルタブロックグループＦ［ｆ，ｃ］の２５個のフィルタブロック５９０４の各フィルタブロック５９０４は、フィルタ５８０４、ｆのチャネルｃの５×５縦方向スライス６２０９のうち異なる重みのコピーを８つ保持する。
【０４４０】
図６１の例では、重みＲＡＭ１２４は、６４×２４＝１５３６個のフィルタブロックグループを保持しており、各グループに２５個のフィルタブロック５９０４があり、図６１の例では合計で３８，４００個のフィルタブロック５９０４があり、それが、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで５０個の８×８出力５８０６を作り出す。しかし、フィルタ５８０４は５０個しかないので、６４−５０＝１４個のＮＰＵブロック５９０６は、使用されない畳み込みを作り出し、したがって、示されるように、フィルタブロック索引５０〜６３のフィルタブロックグループは、無関係値を含んでいる。示されるように、フィルタブロックグループＦ［０，０］〜Ｆ［０，１９］及び４つのギャップフィルタブロックグループＦ［Ｇ］がフィルタブロック索引０にあり、フィルタブロックグループＦ［１，０］〜Ｆ［１，１９］及び４つのギャップフィルタブロックグループＦ［Ｇ］がフィルタブロック索引１にあり、以下同様に続き、フィルタブロックグループＦ［４９，０］〜Ｆ［４９，１９］及び４つのギャップフィルタブロックグループＦ［Ｇ］がフィルタブロック索引４９にある。そして、フィルタブロック索引５０〜６３にあるフィルタブロックグループは無関係値である。
【０４４１】
上述のように、入れ子ループ構造は、有利な点として、ＮＮＵ１２１の循環器ｍｕｘ−ｒｅｇ２０８構造を使用して、入力５８０２のＣ個のチャネルすべてに関連付けられた入力ブロック５９０２を循環させ、その結果、Ｆ個のフィルタ５８０４に関連付けられたＧ個のＮＰＵブロック５９０６のうちＦ個の各々は、自身の対応するフィルタ５８０４を畳み込む入力５８０２のＣ個のチャネルすべてが見える。ただし、ブロックの数Ｇ＝６４がチャネルの数Ｃ＝２０で割り切れないことから、ギャップ入力ブロックグループＩ［Ｇ］の存在の必要性と、非アーキテクチャプログラムのループ３が、Ｃ＝２０個のチャネルに対する２０回を超えて４回多く（６４％２０＝４。これがギャップ入力ブロックグループＩ［Ｇ］の数である）反復する必要性が生じる。より具体的には、右への循環を仮定すると、索引１９〜４９にあるＮＰＵブロック５９０６には、チャネル０〜１９の入力ブロック５９０２がすべて見えるのに対し、索引０〜１８にあるＮＰＵブロック５９０６には見えないことになる。例えば、索引１８にあるＮＰＵブロック５９０６にはチャネル０〜１８は見えるが、チャネル１９は、チャネル１９が入力ブロック索引６０〜６３の１つに含まれているのでない限り、見えないことになる。別の例として、索引０にあるＮＰＵブロック５９０６にはチャネル０及び５〜１９は見えるが、チャネル１〜４は、チャネル１〜４が入力ブロック索引６０〜６３に含まれているのでない限り、見えないことになり、その場合、チャネル１９を入力ブロック索引６０〜６３の１つに含めて索引１８のＮＰＵブロック５９０６を満足させることはできない。
【０４４２】
この問題に対処するために、ギャップ入力ブロックグループＩ［Ｇ］を導入して、それらを使用して生成される列和がゼロ値を有する（ギャップ入力ブロックグループＩ［Ｇ］内のゼロ値及び／又はそれらに対応するギャップフィルタブロックグループＦ［Ｇ］内のゼロ値のために）ことを保証し、よって、結果得られるゼロ値の列チャネル和が、最終的な列チャネル行和には寄与しないものの、ギャップ入力ブロックグループＩ［Ｇ］の数の追加的なループ３の反復の結果、十分な回数の循環を可能にして、すべてのＮＰＵブロック５９０６が２０個のチャネルすべてを見えるようにする。したがって、図６３のループ３の反復カウントがＣ＝２０ではなく２４であるために、各ＮＰＵ１２６は、１つの列チャネル行和当たり、すなわち畳み込み結果当たり、ギャップがない場合（例えば図６４〜図６５及び図６８〜図６９の実施形態）に必要となるのに比べて、５×４×５＝１００個の追加的な列和を生成する。ただし、有利な点として、ギャップ入力ブロックグループＩ［Ｇ］及び／又はギャップフィルタブロックグループＦ［Ｇ］のゼロ値は、ＮＰＵ１２６に、列チャネル行和当たりの追加的な１００個の列和について、ゼロ値を生成させる。
【０４４３】
非アーキテクチャプログラムは、入力５８０２の対応する要素がＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８に存在するときには、該当するフィルタ５８０４の適切な重みをレジスタ７０５に読み出すように、重みＲＡＭ１２４をアドレス指定する。非アーキテクチャプログラムによる重みＲＡＭ１２４のアドレス指定は、重みＲＡＭ１２４内のフィルタ５８０４の重みのレイアウトと連携される。非アーキテクチャプログラムによる重みＲＡＭ１２４のアドレス指定及びそれに連携した重みのレイアウトの様々な実施形態が企図され、図６１及び図６６は、ギャップが含まれる２つの異なる実施形態を記載しており、図６４及び図６８は、ギャップが含まれない２つの異なる実施形態を記載している。
【０４４４】
図６１の例に示されるように、フィルタブロック索引０については、Ｆ［０，０］が重みＲＡＭ１２４の行０〜２４を占め、ギャップフィルタブロックグループＦ［Ｇ］が行２５〜１２４を占め、Ｆ［０，１９］が行１２５〜１４９を占め、Ｆ［０，１８］が行１５０〜１７４を占め、以下同様に続き、Ｆ［０，１］が行５７５〜５９９を占める。フィルタブロック索引１については、Ｆ［１，１］が行０〜２４を占め、Ｆ［１，０］が行２５〜４９を占め、ギャップフィルタブロックグループＦ［Ｇ］が行５０〜１４９を占め、Ｆ［１，１９］が行１５０〜１７４を占め、Ｆ［１，１８］が行１７５〜１９９を占め、以下同様に続き、Ｆ［１，２］が行５７５〜５９９を占める。以下同様に続き、フィルタブロック索引１９については、Ｆ［１９，１９］が行０〜２４を占め、Ｆ［１９，１８］が行２５〜４９を占め、Ｆ［１９，１７］が行５０〜７４を占め、以下同様に続き、Ｆ［１９，００］が行４７５〜４９９を占め、ギャップフィルタブロックグループＦ［Ｇ］が行５００〜５９９を占める。フィルタブロック索引２０については、Ｆ［２０，０］が行０〜２４を占め、Ｆ［２０，１９］が行２５〜４９を占め、Ｆ［２０，１］が行５０〜７４を占め、以下同様に続き、Ｆ［２０，１］が行４７５〜４９９を占め、ギャップフィルタブロックグループＦ［Ｇ］が行５００〜５９９を占める。フィルタブロック索引２１については、Ｆ［２１，１］が行０〜２４を占め、Ｆ［２１，００］が行２５〜４９を占め、Ｆ［２１，１９］が行５０〜７４を占め、以下同様に続き、Ｆ［２１，２］が行４７５〜４９９を占め、ギャップフィルタブロックグループＦ［Ｇ］が行５００〜５９９を占める。以下同様に続き、フィルタブロック索引３９については、Ｆ［３９，１９］が行０〜２４を占め、Ｆ［３９，１８］が行２５〜４９を占め、Ｆ［３９，１７］が行５０〜７４を占め、以下同様に続き、Ｆ［３９，００］が行４７５〜４９９を占め、ギャップフィルタブロックグループＦ［Ｇ］が行５００〜５９９を占める。フィルタブロック索引４０については、Ｆ［４０，０］が行０〜２４を占め、Ｆ［４０，１９］が行２５〜４９を占め、Ｆ［４０，１］が行５０〜７４を占め、以下同様に続き、Ｆ［４０，１］が行４７５〜４９９を占め、ギャップフィルタブロックグループＦ［Ｇ］が行５００〜５９９を占める。フィルタブロック索引４１については、Ｆ［４１，１］が行０〜２４を占め、Ｆ［４１，００］が行２５〜４９を占め、Ｆ［４１，１９］が行５０〜７４を占め、以下同様に続き、Ｆ［４１，２］が行４７５〜４９９を占め、ギャップフィルタブロックグループＦ［Ｇ］が行５００〜５９９を占める。以下同様に続き、フィルタブロック索引４９については、Ｆ［４９，０９］が行０〜２４を占め、Ｆ［４９，０８］が行２５〜４９を占め、Ｆ［４９，０７］が行５０〜７４を占め、以下同様に続き、Ｆ［４９，１０］が行４７５〜４９９を占め、ギャップフィルタブロックグループＦ［Ｇ］が行５００〜５９９を占める。フィルタブロック索引５０〜６３のフィルタブロックグループ内の値は、無関係である。図６１の例は、重みＲＡＭ１２４の行０〜５９９に記憶されたフィルタブロックグループを示しているが、フィルタブロックグループＦ［ｆ，ｃ］が他の行に記憶される他の実施形態が企図される。
【０４４５】
ＮＰＵ１２６に図６１の様々なフィルタブロックグループの重みを読み込むための重みＲＡＭ１２４のアドレス指定については、図６３との関連でより詳細に説明する。一般に、所与のフィルタブロック索引のフィルタブロックグループＦ［ｆ，ｃ］のチャネルｃの値を上から下へと見たときに、列値ｃの順序（ギャップを考慮に入れる）が、入力ブロックグループがＮＮＵ１２１を回って循環される時に、索引がフィルタブロック索引に対応するＮＰＵブロック５９０６によって、入力ブロックグループのチャネルｃ（ギャップを考慮に入れる）が見られる順序であることが観察できよう。さらに、入力ブロック５９０２の循環と、図６３の疑似コードに従って非アーキテクチャプログラムによって行われる重みＲＡＭ１２４のアドレス指定とにより、ギャップフィルタブロックグループＦ［Ｇ］とギャップ入力ブロックグループＩ［Ｇ］を同時にＮＰＵ１２６内に存在させ、したがってゼロ値の列和を生成させる。
【０４４６】
ゼロと任意の値との積はゼロであるので、ギャップ入力ブロック６１０３とギャップフィルタブロック６１０４の両方ではなく、一方だけがゼロを含んでいることが必要である。したがって、フィルタ５８０４の重みは事前に決定されるが、入力５８０２はネットワークの前の層によって動的にサンプリング又は生成される実施形態では、ギャップフィルタブロックグループ６１０４にゼロ値を持たせて、ギャップ入力ブロックグループ６１０３をゼロアウトする必要を回避すると有利である可能性がある。ただし、ギャップ入力ブロックグループ６１０３がゼロである他の実施形態が企図される。
【０４４７】
次いで図６２を参照すると、図６１の入力ブロックグループＩ［ｃ］、フィルタ５８０４、ｆ、及びチャネルｃの５×５縦方向スライス６２０９、図６１のフィルタブロックグループＦ［ｆ，ｃ］、並びに図５９の出力ブロック５９０８を図示するブロック図が示される。
【０４４８】
図６２に示される入力ブロックグループＩ［ｃ］は、１２個の行及び１６個の列を含んでいる。１６個の列は、０〜１５と索引が付けられ、入力ブロック５９０２の１６ワードに対応する。図６２に示されるように、各列索引値は、Ｂ＝１６を法とした（modulo）データＲＡＭ１２２の列番号である。したがって、例えば、図６２の入力ブロックグループＩ［ｃ］が、入力ブロック索引２１にある図６１の入力ブロックグループＩ［０１］のコピーに対応すると仮定する。入力ブロック索引２１にある入力ブロック５９０２は、データＲＡＭ１２２の列３３６〜３５１にある。したがって、列３３９の入力ブロック索引２１にある入力ブロックグループＩ［０１］のワードは、入力ブロックグループ索引３３９％１６＝３にある。図６２の例では、入力ブロックグループＩ［ｃ］の１２個の行は、データＲＡＭ１２２の行０〜１１にあるものと示されているが、データＲＡＭ１２２の他の行にあってもよい。入力ブロックグループＩ［ｃ］の１２個の行及び列０〜１１から構成される２Ｄ行列は、チャネルｃに対応する入力５８０２の１２×１２縦方向スライス６２１５を投入される。縦方向スライス６２１５は、所与のチャネルｃにおける入力５８０２の１２個の行及び１２個の列の要素である。
【０４４９】
入力ブロックグループＩ［ｃ］の列１２〜１５は使用されない。ただし、ハイパーパラメータＷが１２より大きいネットワークでは、それらの列のいくつか又はすべてが使用される可能性があることに留意されたい。例えば、Ｗが１４である場合は、列１２及び１３が使用されることになる。加えて、ネットワークが有効な畳み込みではなく同一サイズの畳み込みを行う場合には、パディング要素（例えばゼロ）を列１２〜１５並びに行１２〜１５に含めることができるが、パディング要素を、例えば実際の入力５８０２要素の端にある異なる行及び／又は列に入れる他のパディング実施形態が企図され、その場合、パディング要素は、入力ブロックグループＩ［ｃ］の左右及び上下の端に沿って比較的均等に分散される。
【０４５０】
所与のチャネルｃにおけるフィルタ５８０４、ｆの５×５縦方向スライス６２０９は、チャネルｃにおけるフィルタ５８０４の５個の行及び５個の列の重みから構成される。フィルタブロックグループの説明で使用するために、５×５縦方向スライス６２０９の２５個の要素の各々を０〜２４と標記する。より具体的には、左から右へと、行０の要素は０〜４と標記され、行１の要素は５〜９と標記され、行２の要素は１０〜１４と標記され、行３の要素は１５〜１９と標記され、行４の要素は２０〜２４と標記される。
【０４５１】
図６２のフィルタブロックグループＦ［ｆ，ｃ］は、２５個の行及び１６個の列を含んでいる。１６個の列は、０〜１５の索引が付けられ、フィルタブロック５９０４の１６ワードに対応する。図６２に示されるように、各列索引値は、Ｂ＝１６を法とした重みＲＡＭ１２４の列番号である。したがって、例えば、図６２のフィルタブロックグループＦ［ｆ，ｃ］が、フィルタブロック索引２１にある図６１のフィルタブロックグループＦ［２１，１７］に対応すると仮定する。フィルタブロック索引２１にあるフィルタブロック５９０４は、重みＲＡＭ１２４の列３３６〜３５１にある。したがって、列３３９のフィルタブロック索引２１にあるフィルタブロックグループＦ［２１，１７］のワードは、フィルタブロックグループ索引３３９％１６＝３にある。図６２の例では、フィルタブロックグループＦ［ｆ，ｃ］の２５個の行は、重みＲＡＭ１２４の行０〜２４にあるものと示されているが、重みＲＡＭ１２４の他の行にあってもよい。
【０４５２】
フィルタブロックグループＦ［ｆ，ｃ］の２５個の行の各行は、フィルタブロック索引４〜１１に、５×５縦方向スライス６２０９の２５個の重みのそれぞれの重みのコピーをＰ＝８個含んでいる。行０〜２４を順に取り上げると、それぞれの重みは行０及び列４で開始して列０を通り、次いで行１及び列４から列０を通り、以下同様に続き、行４及び列４から列０を通る。したがって、行０は重み４の８個のコピーを含み、行１は重み３の８個のコピーを含み、以下同様に続き、行４は重み０の８個のコピーを含んでいる。行５は重み９の８個のコピーを含み、行６は重み８の８個のコピーを含み、以下同様に続き、行９は重み５の８個のコピーを含んでいる。行１０は重み１４の８個のコピーを含み、行１１は重み１３の８個のコピーを含み、以下同様に続き、行１４は重み１０の８個のコピーを含んでいる。行１５は重み１９の８個のコピーを含み、行１６は重み１８の８個のコピーを含み、以下同様に続き、行１９は重み１５の８個のコピーを含んでいる。そして、行２０は重み２４の８個のコピーを含み、行２１は重み２３の８個のコピーを含み、以下同様に続き、行２４は重み２０の８個のコピーを含んでいる。入力ブロックグループＩ［ｃ］内での入力５８０２の要素の編成と併せた、フィルタブロックグループＦ［ｆ，ｃ］内の縦方向スライス６２０９の重みのこの編成は、入力ブロック５９０２の入力５８０２要素が内側ループ４に従ってＮＰＵブロック５９０６をとおして循環されるとき、５×５縦方向スライス６２０９の対応する重みが、縦方向スライス６２０９によりオーバーレイされる入力５８０２の５×５部分行列の対応する要素によって乗算されることをもたらす。
【０４５３】
フィルタブロックグループＦ［ｆ，ｃ］の列０〜３及び１２〜１５は、有効な畳み込みが行われる実施形態では使用されない。ただし、ハイパーパラメータＷが１２より大きいネットワークでは、それらの列のいくつか又はすべてが使用される可能性があることに留意されたい。例えば、Ｗが１４である場合は、列１２及び１３も重みのコピーを含むことになる。加えて、ネットワークが有効な畳み込みではなく同一サイズの畳み込みを行う場合には、重みのコピーを列０〜３及び１２〜１５の１つ又は複数に含めて、パディング要素で乗算することができる。
【０４５４】
図６２の出力ブロック５９０８は、１つの行及び１６個の列を含んでいる。１６個の列は０〜１５の索引が付けられ、出力ブロック５９０８の１６ワードに対応する。図６２に示されるように、各列索引値は、Ｂ＝１６を法としたＮＰＵ１２６の番号又はデータＲＡＭ１２２（若しくは重みＲＡＭ１２４）の列番号である。したがって、例えば、図６２の出力ブロック５９０８が出力ブロック索引２１に対応すると仮定する。出力ブロック索引２１にある出力ブロック５９０８は、データＲＡＭ１２２（又は重みＲＡＭ１２４）の列３３６〜３５１にある。したがって、列３３９の出力ブロック索引２１にある出力ブロック５９０８のワードは、出力ブロックグループ索引３３９％１６＝３にある。出力ブロック５９０８のワードは、列４〜１１に、８個の畳み込み結果、すなわち列チャネル行和として示されており、それらはＲ０〜Ｒ７と表され、それぞれ出力５８０６のＰ＝８個の列の列０〜７に対応する。すなわち、各ＮＰＵブロック５９０６内で、ＮＰＵ４が、出力ブロック５９０８の列４に対応する出力５８０６の列０についての畳み込み結果、すなわち列チャネル行和を生成し、ＮＰＵ５が、出力ブロック５９０８の列５に対応する出力５８０６の列１についての畳み込み結果を生成し、以下同様に続き、ＮＰＵ１１は、出力ブロック５９０８の列５に対応する出力５８０６の列７についての畳み込み結果を生成し、ＮＰＵ０〜３及び１２〜１５は、使用されない結果を生成する。上記の入力ブロックグループＩ［ｃ］及びフィルタブロックグループＦ［ｆ，ｃ］と同じように、ネットワークのハイパーパラメータが異なる場合、且つ／又は有効な畳み込みではなく同一サイズの畳み込みが生成される場合には、列０〜３及び１２〜１５が使用されることもある。
【０４５５】
次いで図６３を参照すると、Ｎ＝１０２４個のＮＰＵ１２６を有するＮＮＵ１２１で実行される非アーキテクチャプログラムによって行われて、図６１のデータＲＡＭ１２２及び重みＲＡＭ１２４のレイアウトを併用して、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで５０個の８×８出力５８０６を生成する計算を図示する疑似コードが示される。図６３の疑似コードは、多くの点で図６０の疑似コードに似ているが、少なくとも３つの点が異なる。第１に、図６３の疑似コードは、図６１に示されるように、４つのギャップ入力ブロックグループＩ［Ｇ］を仮定している。第２に、図６３の疑似コードは、図６１のメモリレイアウトを仮定したデータＲＡＭ１２２及び重みＲＡＭ１２４のアドレス指定の仕様を含んでいる。第３に、図６３の疑似コードは、上述のハイパーパラメータ及びＮの値を仮定している。したがって、ライン２ではＱ＝８であり、ライン６ではＲ＝５であり、ライン９ではＣ＝２０であり、ギャップの数＝４であり、合計で２４回の反復があり、ライン１１ではＳ＝５であり、ライン１９では位置合わせ循環量が１１である。図６０については上記で広範に説明したため、図６３のラインのうち図６０と異なるラインのみを説明する。
【０４５６】
ライン１で、すなわち疑似コードの開始時に、データＲＡＭ１２２行がゼロに初期化され、ライン４で重みＲＡＭ１２４行がゼロに初期化される。
【０４５７】
ライン９で、ループ３の反復回数は２４回である。これは、２４が、Ｃ＝２０個のチャネルと、４であるギャップ数との和であるためである。２４の反復カウントにより、すべてのＮＰＵブロック５９０６、詳細には例えば索引０〜１８にあるものが、２０個のチャネルすべてについて入力ブロックグループＩ［ｃ］を見えるようになる。
【０４５８】
ライン１６で、重みＲＡＭ１２４行が１だけ増分され、そのため、ループ４の次の反復では、重みＲＡＭ１２４の次の行がレジスタ７０５に読み出され、この行は、図６２のフィルタブロックグループＦ［ｆ，ｃ］の次の行の重みのコピーを８個含んでいる。ループ４の１回の実行インスタンスにつき、フィルタブロックグループＦ［ｆ，ｃ］の２５行のうち５行だけが、現在のチャネルｃについてレジスタ７０５に読み込まれる。
【０４５９】
ライン１８で、重みＲＡＭ１２４行が２０だけ増分され、２０は、Ｒ＝５とＳ＝５との積からＳ＝５を引いたものである。このことは、重みＲＡＭ１２４行を、次のチャネルｃについての次のフィルタブロックグループＦ［ｆ，ｃ］に向け、そのため、ループ３の次の反復（ループ４の次の実行インスタンス）で、フィルタブロックグループＦ［ｆ，ｃ］の２５行のうちもう５行が、次のチャネルｃのためにレジスタ７０５に読み込まれる。この理由は、各フィルタブロックグループＦ［ｆ，ｃ］はその上にあるフィルタブロックグループＦ［ｆ，ｃ］から重みＲＡＭ１２４の２５行分だけオフセットしているものの、ループ４の実行インスタンスが、ループ４によるライン１６の５回の実行インスタンスに従って重みＲＡＭ１２４行を５だけ増分したためである。したがって、ループ４の実行インスタンスごとに、フィルタブロックグループＦ［ｆ，ｃ］の行のうち５分の１（一般には、１／Ｒ）だけが読み出され、使用される。フィルタブロックグループＦ［ｆ，ｃ］の残りの行は、ループ２についての後の反復で読み出され、使用される。
【０４６０】
ライン１９で、ｍｕｘ−ｒｅｇ２０８が１１だけ循環され、１１は、Ｂ＝１６とＳ＝５とにおける差である。このことは、入力ブロック５９０２を次の隣接するＮＰＵブロック５９０６に位置合わせする。この理由は、ＮＰＵブロック５９０６の幅はＮ＝１６であるが、入力ブロック５９０２は、ループ４によるライン１５の５回の実行インスタンスに従って、すでに５だけ循環されているためである。上述のように、１１の循環は、ＲＯＴＡＴＥ  ｂｙ  ８命令、ＲＯＴＡＴＥ  ｂｙ  ２命令、及びＲＯＴＡＴＥ  ｂｙ  １命令の組み合わせによって達成することができる。ループ４及び／又はループ３の１回の反復を展開してライン１９で１２の循環が行われるようにする実施形態が企図され、これはＲＯＴＡＴＥ  ｂｙ  ８命令とＲＯＴＡＴＥ  ｂｙ  ４命令の組み合わせによって達成することができる。
【０４６１】
ライン２１で、データＲＡＭ１２２行が１だけ増分され、そのため、ループ２の次の反復で、ライン１３においてデータＲＡＭ１２２の次の行がｍｕｘ−ｒｅｇ２０８に読み出され、この行は、図６１に示されるように、入力５８０２の次の行、すなわち各入力ブロック索引にある入力ブロックグループＩ［ｃ］の次の入力ブロック５９０２を含んでいる。
【０４６２】
ライン２２で、重みＲＡＭ１２４行が５７５だけ減分され、５７５は２５と２３との積である。値２５はＲ＝５とＳ＝５との積であり、２５は、各フィルタブロックグループＦ［ｆ，ｃ］の行の数である。より具体的には、ループ３の各反復は、重みＲＡＭ１２４行を２５だけ増分し、それによりループ３の次の反復を、フィルタブロックグループＦ［ｆ，ｃ］の先頭に向ける。値２３は、Ｃ＝２０と４つのギャップとの和から１を引いたものである。この理由は、ループ２の実行インスタンスごとに、ループ３が、２４個のフィルタブロックグループすべてを通って反復するためである。５７５の減分により、重みＲＡＭ１２４行が、各フィルタブロック索引内で先頭のフィルタブロックグループＦ［ｆ，ｃ］をポイントするようになり、フィルタブロックグループＦ［ｆ，ｃ］の中で、ループ２の現在の反復が始まった行から５行下の行をポイントするようになる。
【０４６３】
ライン２５で、データＲＡＭ１２２行が４だけ減分され、４はＲ＝５から１を引いたものである。このことは、データＲＡＭ１２２行を、ループ１の現在の反復で畳み込まれる入力５８０２の１番目の行の後の、入力５８０２の次の行に向け、そのため、ループ１の次の反復中に、入力５８０２のうち次の下にある部分行列を畳み込むために、３Ｄフィルタ５８０４が効果的に入力５８０２の１行分だけ下にずらされる。例えば、ループ１の現在の反復が入力５８０２の行３〜７にフィルタ５８０４を畳み込んで累算器２０２を出力ブロック５９０８に書き込んだ場合、ライン２５は、ループ１の次の反復に、入力５８０２の行４〜８にフィルタ５８０４を畳み込ませるように動作する。
【０４６４】
次いで、まとめて図６４と参照される図６４Ａ及び図６４Ｂを参照すると、ギャップ入力／フィルタブロックグループを含まずに、１２×１２×２０入力５８０２に５０個の５×５フィルタ５８０４を畳み込んで５０個の８×８出力５８０８を生成するための代替的な一実施形態による、データＲＡＭ１２２内の入力ブロック５９０２のグループのレイアウト６４０１、及び重みＲＡＭ１２４内のフィルタブロックのグループ５９０４のレイアウト６４０２を図示するブロックが示される。図６４の例は、多くの点で図６１と似ているが、違いを説明する。
【０４６５】
図６４の例は、２０４８個のＮＰＵ１２６を有するＮＮＵ１２１を仮定しており、すなわちＮ＝２０４８である。その結果、ハイパーパラメータがＷ＝１２であるので、Ｂ＝１６となり、これはすなわち、少なくともＷと同じ大きさの、Ｎの最小の因数である。またＢ＝１６であるので、Ｇ＝２０４８／１６＝１２８となる。したがって、１２８個のＮＰＵブロック５９０６があり、データＲＡＭ１２２の行当たり１２８個の入力ブロック５９０２があり、重みＲＡＭ１２４の行当たり１２８個のフィルタブロック５９０４がある。図６４は、ゼロ基準の入力ブロック索引０〜１２７及びフィルタブロック索引０〜１２７を示しており、これらは、上記で図５９との関連で説明したように、ＮＰＵブロック索引０〜１２７に対応している。すなわち、０の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引０を持つＮＰＵブロック５９０６によって受け取られ、１の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引１を持つＮＰＵブロック５９０６によって受け取られ、以下同様に続き、１２７の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引１２７を持つＮＰＵブロック５９０６によって受け取られる。図６４の実施形態では、索引０にある入力ブロックは、データＲＡＭ１２２のワード０〜１５を含んでおり、索引１にある入力ブロックは、データＲＡＭ１２２のワード１６〜３１を含んでおり、以下同様に続き、索引１２７にある入力ブロックは、データＲＡＭ１２２のワード２０３２〜２０４７を含んでいる。同様に、索引０にあるフィルタブロックは、重みＲＡＭ１２４のワード０〜１５を含んでおり、索引１にあるフィルタブロックは、重みＲＡＭ１２４のワード１６〜３１を含んでおり、以下同様に続き、索引１２７にあるフィルタブロックは、重みＲＡＭ１２４のワード２０３２〜２０４７を含んでいる。
【０４６６】
図６４は、６９個の入力ブロックグループを示している。６９個の入力ブロックグループは、入力ブロック索引０〜４９及び１０９〜１２７にあり、総称してＩ［ｃ］と表され、ｃは、Ｃ＝２０個のチャネルのチャネル索引を表す。２０個の入力ブロックグループＩ［０］〜Ｉ［１９］が、入力ブロック索引０〜１９にある。加えて、２０個の入力ブロックグループＩ［０］〜Ｉ［１９］が、入力ブロック索引２０〜３９にある。さらに、１０個の入力ブロックグループＩ［０］〜Ｉ［９］が、入力ブロック索引４０〜４９にある。最後に、１９個の入力ブロックグループＩ［１］〜Ｉ［１９］が、入力ブロック索引１０９〜１２７にある。入力ブロック索引５０〜１０８にある入力ブロック５９０２は使用されない。ギャップ入力ブロックグループ６１０３は、図６４の実施形態には含まれない。
【０４６７】
図６４は、５０×２０＝１０００個のフィルタブロックグループを示し、これを総称してＦ［ｆ，ｃ］と表し、ｆは、Ｆ個のフィルタ５８０４のうちのフィルタを表し、ｃは、Ｃ＝２０個のチャネルのチャネル索引を表す。ギャップフィルタブロックグループ６１０４は、図６４の実施形態には含まれない。図６４の例では、重みＲＡＭ１２４は１２８×２０＝２５６０個のフィルタブロックグループを保持し、各グループに２５個のフィルタブロック５９０４があり、図６４の例では合計で６４，０００個のフィルタブロック５９０４があり、それが、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで５０個の８×８出力５８０６を作り出す。しかし、フィルタ５８０４は５０個しかないので、１２８−５０＝７８個のＮＰＵブロック５９０６は、使用されない畳み込みを作り出し、したがって、示されるように、フィルタブロック索引５０〜１２７のフィルタブロックグループは無関係値を含んでいる。示されるように、フィルタブロックグループＦ［０，０］〜Ｆ［０，１９］はフィルタブロック索引０にあり、フィルタブロックグループＦ［１，０］〜Ｆ［１，１９］はフィルタブロック索引１にあり、以下同様に続き、フィルタブロックグループＦ［４９，０］〜Ｆ［４９，１９］はフィルタブロック索引４９にあり、フィルタブロック索引５０〜１２７にあるフィルタブロックグループは、無関係値である。あるフィルタブロック索引にあるフィルタブロックグループの縦方向の順序付けは、ギャップフィルタブロックグループがない場合の図６１の順序付けと同じである。したがって、図６１で１００行を占める４つのギャップフィルタブロックグループが存在しないことに起因して、行０〜４９９だけが使用される。
【０４６８】
上述のように、入れ子ループ構造は、有利な点として、ＮＮＵ１２１の循環器ｍｕｘ−ｒｅｇ２０８構造を使用して、入力５８０２のＣ個のチャネルすべてに関連付けられた入力ブロック５９０２を循環させ、その結果、Ｆ個のフィルタ５８０４に関連付けられたＧ個のＮＰＵブロック５９０６のうちＦ個の各々は、自身の対応するフィルタ５８０４を畳み込む入力５８０２のＣ個のチャネルすべてが見える。有利な点として、上記のように、入力ブロックグループＩ［１］〜Ｉ［１９］は、入力ブロック索引１０９〜１２７にあり、そのため、入力ブロックグループＩ［０］（すなわちチャネル０の入力５８０２）に加えて、索引０のＮＰＵブロック５９０６は、入力ブロックグループＩ［１］〜Ｉ［１９］をさらに見ることができる。なぜならば、それらがＮＰＵブロック０まで循環されるためである。同様に、入力ブロックグループＩ［２］〜Ｉ［１９］は、入力ブロック索引１１０〜１２７にあり、そのため、入力ブロックグループＩ［０］及びＩ［１］に加えて、索引１のＮＰＵブロック５９０６は、入力ブロックグループＩ［２］〜Ｉ［１９］をさらに見ることができる。なぜならば、それらがＮＰＵブロック１まで循環されるためである。以下同様に続き、入力ブロックグループＩ［１９］は、入力ブロック索引１２７にあり、そのため、入力ブロックグループＩ［０］〜Ｉ［１８］に加えて、索引１８のＮＰＵブロック５９０６は、入力ブロックグループＩ［１９］をさらに見ることができる。なぜならば、それがＮＰＵブロック１８まで循環されるためである。したがって、ブロックの数Ｇ＝１２８がチャネルの数Ｃ＝２０で割り切れないことによって、ギャップ入力ブロックグループＩ［Ｇ］の存在の必要性も、また、非アーキテクチャプログラムのループ３がＣ＝２０個のチャネルに対応する２０回より多く反復する必要性も生じない。その理由は、ハイパーパラメータが、入力ブロック索引１０９〜１２７に追加的な入力ブロックグループＩ［１］〜Ｉ［１９］があってもよいようなものであるためである。図６４の例では、Ｆ＝５０、Ｃ＝２０、Ｎ＝２０４８、且つＷ＝１２であり、そのためＢ＝１６且つＧ＝１２８となるが、十分な余裕が存在して追加的な入力ブロックグループが高い値の入力ブロック索引にあることができ、そのためギャップ入力／フィルタブロックグループを含める必要がなく、またループ３の追加的な反復を行う必要がないようなニューラルネットワークの他の例が存在し得ることを理解されたい。例えばＦ＝４０、Ｃ＝２０、Ｎ＝１０２４、且つＷ＝１２であるＮＮＵ１２１では、入力ブロックグループＩ［１］〜Ｉ［１９］が入力ブロック索引４５〜６３にあることが可能になるため、ギャップ入力／フィルタブロックグループは必要ないことになる。言い換えると、図６４の例には図６１の例よりも多くの数のＮＰＵ１２６（Ｎ）があるという事実から、ギャップ入力／フィルタブロックグループを回避するにはより多くの数のＮＰＵ１２６が必要になると推論すべきではなく、むしろ、Ｎ並びに関係するニューラルネットワークのハイパーパラメータを検討しなければならない。
【０４６９】
ＮＰＵ１２６に図６４の様々なフィルタブロックグループの重みを読み込むための重みＲＡＭ１２４のアドレス指定については、図６５との関連でより詳細に説明する。所与のフィルタブロック索引のフィルタブロックグループＦ［ｆ，ｃ］のチャネルｃの値を上から下へと見たときに、列値ｃの順序が、入力ブロックグループがＮＮＵ１２１を回って循環されるときに、索引がフィルタブロック索引に対応するＮＰＵブロック５９０６によって、入力ブロックグループのチャネルｃが見られる順序であることが観察できよう。
【０４７０】
次いで図６５を参照すると、Ｎ＝２０４８個のＮＰＵ１２６を有するＮＮＵ１２１で実行される非アーキテクチャプログラムによって行われて、図６４のデータＲＡＭ１２２及び重みＲＡＭ１２４のレイアウトを併用して、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで、５０個の８×８出力５８０６を作り出す計算を図示する疑似コードが示される。図６５の疑似コードは、多くの点で図６３の疑似コードに似ているが、図６５の疑似コードは、図６４に示されるようにギャップ入力／フィルタブロックグループがないことを仮定している点が異なる。したがって、ライン９ではＣ＝２０回の反復になる（図６３のライン９における２４回に対して）。加えて、ライン２２で、重みＲＡＭ１２４行が４７５だけ減分され、４７５は２５と１９との積である（図６３の５７５に対して）。図６３と同様に、値２５はＲ＝５とＳ＝５との積であり、これは、各フィルタブロックグループＦ［ｆ，ｃ］の行の数である。値１９は、Ｃ＝２０−１である。この理由は、ループ２の実行インスタンスごとに、ループ３が、２０個のフィルタブロックグループすべてを通って反復するためである。４７５の減分により、重みＲＡＭ１２４行が、各フィルタブロック索引内で先頭のフィルタブロックグループＦ［ｆ，ｃ］をポイントするようになり、フィルタブロックグループＦ［ｆ，ｃ］の中で、ループ２の現在の反復が始まった行の５行下にある行をポイントするようになる。
【０４７１】
次いで、まとめて図６６と参照される図６６Ａ及び図６６Ｂを参照すると、１２×１２×２０の入力５８０２に５０個の５×５フィルタ５８０４を畳み込んで５０個の８×８出力５８０８を生成するための代替的な一実施形態による、重みＲＡＭ１２４内のフィルタブロック５９０４のグループのレイアウト６６０２を図示するブロック図が示される。図６６の実施形態は、図６１の入力ブロックグループのレイアウトを仮定している。図６６の例は、多くの点で図６１の例に似ているが、違いを説明する。一般的に言って、図６６の実施形態と図６１の実施形態との主要な違いは、図６３及び図６７の疑似コードを具現化する非アーキテクチャプログラムが、重みＲＡＭ１２４を異なるやり方でアドレス指定する点である。
【０４７２】
より具体的には、図６６の実施形態では、各フィルタグループＦ［ｆ，ｃ，ｒ］は、フィルタ５８０４の各自のフィルタｆ、各自のチャネルｃ、及びＲ行のうちの各自の行ｒによって決定され、Ｓ＝５個のフィルタブロック５９０４を有する（重みＲＡＭ１２４のそれぞれの５行にある）。それに対して、図６１の実施形態では、各フィルタグループＦ［ｆ，ｃ］は、各自のフィルタｆ及び各自のチャネルｃによって決定され、Ｒ×Ｓ＝５×５＝２５個のフィルタブロック５９０４を有する（重みＲＡＭ１２４のそれぞれの２５行にある）。図６１のレイアウト６１０２にある同じフィルタブロック５９０４は、図６６のレイアウト６６０２にあるが、それらは、重みＲＡＭ１２４の異なるアドレス、すなわち行に編成されている。別の表現をすると、同じフィルタブロック５９０４が各フィルタブロック索引にあるが、それらは、異なる順序で縦方向に編成され、図６３及び図６７の疑似コードは、それらを別様にアドレス指定する。したがって、図６１及び図６６両方のフィルタブロックグループは、重みＲＡＭ１２４の６００行を占める。図６１と同様に、ギャップフィルタブロックは図６６ではＦ［Ｇ］と表されるが、フィルタブロック５９０４を５つしか有さない（重みＲＡＭ１２４のそれぞれの５行にある）。
【０４７３】
図６６は、６４×１２０＝７６８０個のフィルタブロックグループを示しており、これは総称してＦ［ｆ，ｃ，ｒ］と表され、ｆは、Ｆ個のフィルタ５８０４のうちのフィルタを表し、ｃは、Ｃ＝２０個のチャネルのチャネル索引を表し、ｒは、フィルタ５８０４の行を表し、又は、Ｆ［Ｇ］と表され、Ｆ［Ｇ］は、ギャップフィルタブロックグループを表す。図６６（及び図６８）の文脈におけるフィルタブロックグループＦ［ｆ，ｃ，ｒ］は、重みＲＡＭ１２４のＳ個の異なる行にあるＳ個のフィルタブロック５９０４からなるグループであり、すべてが、重みＲＡＭ１２４内で同じ入力／フィルタ／ＮＰＵブロック索引内に配置される。したがって、フィルタｆのすべてのフィルタブロックグループのすべてのフィルタブロック５９０４が、同じＮＰＵブロック５９０６に提供される。さらに、各フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、フィルタ５８０４、ｆのチャネルｃについてのＲ×Ｓ縦方向スライスの行の重み（例えば、図６２の縦方向スライス６２０９の行）か、又は、ギャップフィルタブロックグループＦ［Ｇ］の場合はゼロを保持する。より具体的には、フィルタブロックグループＦ［ｆ，ｃ，ｒ］のＳ個のフィルタブロック５９０４の各フィルタブロック５９０４は、フィルタ５８０４、ｆのチャネルｃのＲ×Ｓ縦方向スライス６２０９の行ｒにある異なる重みのＰ個のコピーを保持する。
【０４７４】
図６６の文脈では、フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、重みＲＡＭ１２４の５つの異なる行にある５個のフィルタブロック５９０４からなるグループである。（図６６の実施形態では、５つの行は、重みＲＡＭ１２４内で隣接しており、すなわち０〜４、５〜９などにあるが、それらの行が隣接しておらず、非アーキテクチャプログラムがそれに応じて、フィルタブロック５９０４がある重みＲＡＭ１２４の行をアドレス指定するように変更を加えられる他の実施形態が企図される。）したがって、図６６の各フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、フィルタブロック当たり１６ワード×フィルタブロックグループ当たり５つのフィルタブロック５９０４（重みＲＡＭ１２４の５行にある）＝重みＲＡＭ１２４の８０ワードを有する。図６１と同様に、各フィルタブロック５９０４は、フィルタ５８０４、ｆの各自の列ｓ、各自の行ｒ、及びチャネルｃの重みのコピーをＰ＝８個保持し、フィルタブロック５９０４のうち残りのＢ−Ｐ＝１６−８＝８個のワードは使用されない（且つ一実施形態ではゼロである）。より具体的には、各フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、フィルタ５８０４、ｆのチャネルｃについての５×５縦方向スライス６２０９の行ｒの重み、又はギャップフィルタブロックグループの場合はゼロを保持する。より具体的には、フィルタブロックグループＦ［ｆ，ｃ，ｒ］の５個のフィルタブロック５９０４の各フィルタブロック５９０４は、フィルタ５８０４、ｆのチャネルｃの５×５縦方向スライス６２０９の行ｒにある異なる重みのコピーを８個保持する。すなわち、各フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、図６２に示される５セットの隣接した５行のうちの１つである。例えば、フィルタブロックグループＦ［ｆ，ｃ，０］は、図６２のフィルタブロックグループＦ［ｆ，ｃ］の行０〜４に対応し、フィルタブロックグループＦ［ｆ，ｃ，１］は行５〜９に対応し、フィルタブロックグループＦ［ｆ，ｃ，２］は行１０〜１４に対応し、フィルタブロックグループＦ［ｆ，ｃ，３］は行１５〜１９に対応し、フィルタブロックグループＦ［ｆ，ｃ，４］は行２０〜２４に対応する。ただし、図６６に示されるように、それらは、重みＲＡＭ１２４の隣接した２５行にあるのではなく、代わりに、隣接した５行からなる、５つの異なる離間したグループにある。より具体的には、Ｒ＝５個の行のうち所与の行ｒについての５行フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、隣接してグループにされ、Ｃ＝２０個のチャネルｃは、その所与の行についてインターリーブされる。さらに、当該所与の行について、フィルタブロックグループＦ［ｆ，ｃ，ｒ］内でのチャネルの順序は、図６１と同じである。
【０４７５】
図６６の例では、重みＲＡＭ１２４は、６４×１２０＝７６８０個のフィルタブロックグループを保持し、各グループに５個のフィルタブロック５９０４があり、図６６の例では合計で３８，４００個のフィルタブロック５９０４があり、それが、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで５０個の８×８出力５８０６を作り出す。しかし、フィルタ５８０４は５０個しかないので、６４−５０＝１４個のＮＰＵブロック５９０６は、使用されない畳み込みを作り出し、したがって、示されるように、フィルタブロック索引５０〜６３のフィルタブロックグループは無関係値を含んでいる。示されるように、フィルタブロック索引０にあるのは、フィルタブロックグループＦ［０，０，０］〜Ｆ［０，１９，０］及び４つのギャップフィルタブロックグループＦ［Ｇ］、フィルタブロックグループＦ［０，０，１］〜Ｆ［０，１９，１］及び４つのギャップフィルタブロックグループＦ［Ｇ］、並びに以下同様にフィルタブロックグループＦ［０，０，４］〜Ｆ［０，１９，４］及び４つのギャップフィルタブロックグループＦ［Ｇ］である。フィルタブロック索引１にあるのは、フィルタブロックグループＦ［１，０，０］〜Ｆ［１，１９，０］及び４つのギャップフィルタブロックグループＦ［Ｇ］、フィルタブロックグループＦ［１，０，１］〜Ｆ［１，１９，１］及び４つのギャップフィルタブロックグループＦ［Ｇ］、並びに以下同様にフィルタブロックグループＦ［１，０，４］〜Ｆ［１，１９，４］及び４つのギャップフィルタブロックグループＦ［Ｇ］である。以下同様に続き、フィルタブロック索引４９にあるのは、フィルタブロックグループＦ［４９，０，０］〜Ｆ［４９，１９，０］及び４つのギャップフィルタブロックグループＦ［Ｇ］、フィルタブロックグループＦ［４９，０，１］〜Ｆ［４９，１９，１］及び４つのギャップフィルタブロックグループＦ［Ｇ］、並びに以下同様にフィルタブロックグループＦ［４９，０，４］〜Ｆ［４９，１９，４］及び４つのギャップフィルタブロックグループＦ［Ｇ］である。そして、フィルタブロック索引５０〜６３にあるフィルタブロックグループは無関係値である。
【０４７６】
ギャップフィルタブロックグループＦ［ｆ，ｃ，ｒ］を置くことは、それらを使用して生成される列和がゼロ値を有する（ギャップフィルタブロックグループＦ［Ｇ］のゼロ値、及び／又はそれらに対応するギャップ入力ブロックグループＩ［Ｇ］のゼロ値のために）との保証に一致し、そのため、結果得られるゼロ値の列チャネル和が、最終的な列チャネル行和には寄与しないものの、ギャップ入力ブロックグループＩ［Ｇ］の数の追加的なループ３の反復の結果、十分な回数の循環を可能にして、すべてのＮＰＵブロック５９０６が２０個のチャネルすべてを見えるようにする。
【０４７７】
図６６の例に示されるように、フィルタブロック索引０については、Ｆ［０，０，０］が重みＲＡＭ１２４の行０〜４を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行５〜２４を占め、Ｆ［０，１９，０］が行２５〜２９を占め、Ｆ［０，１８，０］が行３０〜３４を占め、以下同様に続き、Ｆ［０，１，０］が行１１５〜１１９を占める。Ｆ［０，０，１］が行１２０〜１２４を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行１２５〜１４４を占め、Ｆ［０，１９，１］が行１４５〜１４９を占め、Ｆ［０，１８，１］が行１５０〜１５４を占め、以下同様に続き、Ｆ［０，１，１］が行２３５〜２３９を占める。Ｆ［０，０，２］が行２４０〜２４４を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行２４５〜２６４を占め、Ｆ［０，１９，２］が行２６５〜２６９を占め、Ｆ［０，１８，２］が行２７０〜２７４を占め、以下同様に続き、Ｆ［０，１，２］が行３５５〜３５９を占める。Ｆ［０，０，３］が行３６０〜３６４を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行３６５〜３８４を占め、Ｆ［０，１９，３］が行３８５〜３８９を占め、Ｆ［０，１８，３］が行３９０〜３９４を占め、以下同様に続き、Ｆ［０，１，３］が行４７５〜４７９を占める。そして、Ｆ［０，０，４］が行４８０〜４８４を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行４８５〜５０４を占め、Ｆ［０，１９，４］が行５０５〜５０９を占め、Ｆ［０，１８，４］が行５１０〜５１４を占め、以下同様に続き、Ｆ［０，１，４］が行５９５〜５９９を占める。フィルタブロック索引１については、Ｆ［１，１，０］が行０〜４を占め、Ｆ［１，０，０］が行５〜９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行１０〜２９を占め、Ｆ［１，１９，０］が行３０〜３４を占め、以下同様に続き、Ｆ［１，２，０］が行１１５〜１１９を占める。Ｆ［１，１，１］が行１２０〜１２４を占め、Ｆ［１，０，１］が行１２５〜１２９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行１３０〜１４９を占め、Ｆ［１，１９，１］が行１５０〜１５４を占め、以下同様に続き、Ｆ［１，２，１］が行２３５〜２３９を占める。Ｆ［１，１，２］が行２４０〜２４４を占め、Ｆ［１，０，２］が行２４５〜２４９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行２５０〜２６９を占め、Ｆ［１，１９，２］が行２７０〜２７４を占め、以下同様に続き、Ｆ［１，２，２］が行３５５〜３５９を占める。Ｆ［１，１，３］が行３６０〜３６４を占め、Ｆ［１，０，３］が行３６５〜３６９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行３７０〜３８９を占め、Ｆ［１，１９，３］が行３９０〜３９４を占め、以下同様に続き、Ｆ［１，２，３］が行４７５〜４７９を占める。Ｆ［１，１，４］が行４８０〜４８４を占め、Ｆ［１，０，４］が行４８５〜４８９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行４９０〜５０９を占め、Ｆ［１，１９，４］が行５１０〜５１４を占め、以下同様に続き、Ｆ［１，２，４］が行５９５〜５９９を占める。このパターンは、フィルタブロック索引１９まで続き、Ｆ［１９，１９，０］が行０〜４を占め、Ｆ［１９，１８，０］が行５〜９を占め、以下同様に続き、Ｆ［１９，０，０］が行９５〜９９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行１００〜１１９を占める。Ｆ［１９，１９，１］が行１２０〜１２４を占め、Ｆ［１９，１８，１］が行１２５〜１２９を占め、以下同様に続き、Ｆ［１９，０，１］が行２１５〜２１９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行２２０〜２３９を占める。Ｆ［１９，１９，２］が行２４０〜２４４を占め、Ｆ［１９，１８，２］が行２４５〜２４９を占め、以下同様に続き、Ｆ［１９，０，２］が行３３５〜３３９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行３４０〜３５９を占める。Ｆ［１９，１９，３］が行３６０〜３６４を占め、Ｆ［１９，１８，３］が行３６５〜３６９を占め、以下同様に続き、Ｆ［１９，０，３］が行４７５〜４７９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行４６０〜４７９を占める。Ｆ［１９，１９，４］が行４８０〜４８４を占め、Ｆ［１９，１８，４］が行４８５〜４８９を占め、以下同様に続き、Ｆ［１９，０，４］が行５９５〜５９９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行５８０〜５９９を占める。Ｆ［２０，０，０］が行０〜４を占め、Ｆ［２０，１９，０］が行５〜９を占め、以下同様に続き、Ｆ［２０，１，０］が行９５〜９９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行１００〜１１９を占める。Ｆ［２０，０，１］が行１２０〜１２４を占め、Ｆ［２０，１９，１］が行１２５〜１２９を占め、以下同様に続き、Ｆ［２０，１，１］が行２１５〜２１９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行２２０〜２３９を占める。Ｆ［２０，０，２］が行２４０〜２４４を占め、Ｆ［２０，１９，２］が行２４５〜２４９を占め、以下同様に続き、Ｆ［２０，１，２］が行３３５〜３３９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行３４０〜３５９を占める。Ｆ［２０，０，３］が行３６０〜３６４を占め、Ｆ［２０，１９，３］が行３６５〜３６９を占め、以下同様に続き、Ｆ［２０，１，３］が行４７５〜４７９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行４６０〜４７９を占める。Ｆ［２０，０，４］が行４８０〜４８４を占め、Ｆ［２０，１９，４］が行４８５〜４８９を占め、以下同様に続き、Ｆ［２０，１，４］が行５９５〜５９９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行５８０〜５９９を占める。このパターンは、フィルタブロック索引４９まで続き、Ｆ［４９、９，０］が行０〜４を占め、Ｆ［４９，８，０］が行５〜９を占め、以下同様に続き、Ｆ［４９，１０，０］が行９５〜９９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行１００〜１１９を占める。Ｆ［４９，９，１］が行１２０〜１２４を占め、Ｆ［４９，８，１］が行１２５〜１２９を占め、以下同様に続き、Ｆ［４９，１０，１］が行２１５〜２１９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行２２０〜２３９を占める。Ｆ［４９，９，２］が行２４０〜２４４を占め、Ｆ［４９，８，２］が行２４５〜２４９を占め、以下同様に続き、Ｆ［４９，１０，２］が行３３５〜３３９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行３４０〜３５９を占める。Ｆ［４９，９，３］が行３６０〜３６４を占め、Ｆ［４９，８，３］が行３６５〜３６９を占め、以下同様に続き、Ｆ［４９，１０，３］が行４７５〜４７９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行４６０〜４７９を占める。Ｆ［４９，９，４］が行４８０〜４８４を占め、Ｆ［４９，８，４］が行４８５〜４８９を占め、以下同様に続き、Ｆ［４９，１０，４］が行５９５〜５９９を占め、４つのギャップフィルタブロックグループＦ［Ｇ］が行５８０〜５９９を占める。フィルタブロック索引５０〜６３のフィルタブロックグループ内の値は無関係である。図６６の例は、重みＲＡＭ１２４の行０〜５９９に記憶されたフィルタブロックグループを示しているが、フィルタブロックグループＦ［ｆ，ｃ，ｒ］が他の行に記憶される、他の実施形態が企図される。
【０４７８】
ＮＰＵ１２６に図６６の様々なフィルタブロックグループの重みを読み込むための重みＲＡＭ１２４のアドレス指定については、図６７との関連でより詳細に説明する。一般に、所与のフィルタブロック索引のフィルタブロックグループＦ［ｆ，ｃ，ｒ］のチャネルｃの値を上から下へと見たときに、列値ｃの順序（ギャップを考慮に入れる）が、入力ブロックグループがＮＮＵ１２１を回って循環されるときに、索引がフィルタブロック索引に対応するＮＰＵブロック５９０６によって、入力ブロックグループのチャネルｃ（ギャップを考慮に入れる）が見られる順序であることが観察できよう。さらに、入力ブロック５９０２の循環と、図６７の疑似コードに従って非アーキテクチャプログラムによって行われる重みＲＡＭ１２４のアドレス指定とにより、ギャップフィルタブロックグループＦ［Ｇ］とギャップ入力ブロックグループＩ［Ｇ］を同時にＮＰＵ１２６内に存在させ、したがってゼロ値の列和を生成させる。
【０４７９】
次いで図６７を参照すると、Ｎ＝１０２４個のＮＰＵ１２６を有するＮＮＵ１２１で実行される非アーキテクチャプログラムによって行われて、図６１のデータＲＡＭ１２２のレイアウト６１０１及び図６６の重みＲＡＭ１２４のレイアウト６６０２を併用して、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで５０個の８×８出力５８０６を生成する計算を図示する疑似コードが示される。図６７の疑似コードは、多くの点で図６５の疑似コードに似ているが、図６７の疑似コードは、図６１及び図６６に示されるようにギャップ入力／フィルタブロックグループを仮定しており、また図６６のレイアウト６６０２と連携するために異なった重みＲＡＭ１２４のアドレス指定を有する点が異なる。したがって、ライン９で、Ｃ＝２０＋４つのギャップ＝２４回の反復になる（図６５のライン９における２０回に対して）。加えて、図６７にはライン１８及び２２が存在しない。これは、フィルタブロック５９０４が、図６６のフィルタブロックグループＦ［ｆ，ｃ，ｒ］の中で、ライン１６で重みＲＡＭ１２４行を１だけ増分すれば正しい行をアドレス指定するのに足りるようにレイアウトされているためであり、それにより、重みＲＡＭ１２４行を（例えば、図６５のライン１８で）増分し、重みＲＡＭ１２４行を（例えば、図６５のライン２２で）減分する必要性を緩和する。
【０４８０】
次いで、まとめて図６８と参照される図６８Ａ及び図６８Ｂを参照すると、ギャップ入力／フィルタブロックグループを含まずに、１２×１２×２０の入力５８０２に５０個の５×５フィルタ５８０４を畳み込んで５０個の８×８出力５８０８を生成するための代替的な一実施形態による、重みＲＡＭ１２４内のフィルタブロック５９０４のグループのレイアウト６８０２を図示するブロック図が示される。図６８の実施形態は、図６４の入力ブロックグループのレイアウトを仮定している。図６８の例は、多くの点で図６４の例に似ているが、違いを説明する。一般的に言って、図６８の実施形態と図６４の実施形態との主要な違いは、図６９及び図６５の疑似コードを具現化する非アーキテクチャプログラムが、重みＲＡＭ１２４を異なるやり方でアドレス指定する点である。
【０４８１】
図６４の例と同じように、図６８の例は、２０４８個のＮＰＵ１２６を有するＮＮＵ１２１を仮定し、すなわちＮ＝２０４８である。その結果、ハイパーパラメータＷ＝１２であるので、Ｂ＝１６となり、これはすなわち、少なくともＷと同じ大きさの、Ｎの最小の因数である。またＢ＝１６であるので、Ｇ＝２０４８／１６＝１２８となる。したがって、１２８個のＮＰＵブロック５９０６があり、データＲＡＭ１２２の行当たり１２８個の入力ブロック５９０２があり、重みＲＡＭ１２４の行当たり１２８個のフィルタブロック５９０４がある。図６８は、ゼロ基準のフィルタブロック索引０〜１２７を示しており、これらは、上記で図５９との関連で説明したように、ＮＰＵブロック索引０〜１２７に対応している。すなわち、０の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引０を持つＮＰＵブロック５９０６によって受け取られ、１の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引１を持つＮＰＵブロック５９０６によって受け取られ、以下同様に続き、１２７の索引を持つ各入力ブロック５９０２及びフィルタブロック５９０４は、索引１２７を持つＮＰＵブロック５９０６によって受け取られる。図６８の実施形態では、索引０にある入力ブロックは、データＲＡＭ１２２のワード０〜１５を含んでおり、索引１にある入力ブロックは、データＲＡＭ１２２のワード１６〜３１を含んでおり、以下同様に続き、索引１２７にある入力ブロックは、データＲＡＭ１２２のワード２０３２〜２０４７を含んでいる。同様に、索引０にあるフィルタブロックは、重みＲＡＭ１２４のワード０〜１５を含んでおり、索引１にあるフィルタブロックは、重みＲＡＭ１２４のワード１６〜３１を含んでおり、以下同様に続き、索引１２７にあるフィルタブロックは、重みＲＡＭ１２４のワード２０３２〜２０４７を含んでいる。
【０４８２】
図６８の実施形態では、図６６の実施形態と同様に、各フィルタグループＦ［ｆ，ｃ，ｒ］は、フィルタ５８０４のうち各自のフィルタｆ、各自のチャネルｃ、及びＲ行のうちの各自の行ｒによって決定され、Ｓ＝５個のフィルタブロック５９０４を有する（重みＲＡＭ１２４のそれぞれの５行にある）。図６４のレイアウト６４０２にある同じフィルタブロック５９０４は、図６８のレイアウト６８０２にあるが、それらは、重みＲＡＭ１２４の異なるアドレス、又は行に編成されている。別の表現をすると、同じフィルタブロック５９０４は、各フィルタブロック索引にあるが、それらは、異なる順序で縦方向に編成され、図６５及び図６９の疑似コードはそれらを別様にアドレス指定する。したがって、図６４及び図６８両方のフィルタブロックグループは、重みＲＡＭ１２４の５００行を占める。図６８のレイアウトは、図６４のレイアウトと同様に、ギャップフィルタブロックが存在しない。したがって、図６９の疑似コードによる重みＲＡＭ１２４内のレイアウト６８０２のアドレス指定は、多くの点で図６７の疑似コードによる重みＲＡＭ１２４内のレイアウト６６０２のアドレス指定と似るが、図６９の疑似コードは、ギャップフィルタ／入力ブロックグループがないことを考慮に入れるように変更を加えられている。
【０４８３】
図６８の文脈では、図６６と同様に、フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、重みＲＡＭ１２４の５つの異なる行にある５つのフィルタブロック５９０４からなるグループであり、各フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、フィルタブロック当たり１６ワード×フィルタブロックグループ当たり５つのフィルタブロック５９０４（重みＲＡＭ１２４の５行にある）＝重みＲＡＭ１２４の８０ワードを有する。各フィルタブロック５９０４は、フィルタ５８０４、ｆの各自の列ｓ、各自の行ｒ、及びチャネルｃの重みのコピーをＰ＝８個保持し、フィルタブロック５９０４のうち残りのＢ−Ｐ＝１６−８＝８個のワードは使用されない（且つ一実施形態ではゼロである）。そして、各フィルタブロックグループＦ［ｆ，ｃ，ｒ］は、フィルタ５８０４、ｆのチャネルｃについての５×５縦方向スライス６２０９の行ｒの重み、又はギャップフィルタブロックグループの場合はゼロを保持する。
【０４８４】
図６８の例では、重みＲＡＭ１２４は、１２８×１００＝１２，８００個のフィルタブロックグループを保持し、各グループに５つのフィルタブロック５９０４があり、図６８の例では合計で６４，０００個のフィルタブロック５９０４があり、それが、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで、５０個の８×８出力５８０６を作り出す。しかし、フィルタ５８０４は５０個しかないので、１２８−５０＝７８個のＮＰＵブロック５９０６は、使用されない畳み込みを作り出し、したがって、示されるように、フィルタブロック索引５０〜１２７のフィルタブロックグループは無関係値を含んでいる。示されるように、フィルタブロック索引０にあるのは、フィルタブロックグループＦ［０，０，０］〜Ｆ［０，１９，０］、フィルタブロックグループＦ［０，０，１］〜Ｆ［０，１９，１］、及び以下同様にフィルタブロックグループＦ［０，０，４］〜Ｆ［０，１９，４］である。フィルタブロック索引１にあるのは、フィルタブロックグループＦ［１，０，０］〜Ｆ［１，１９，０］、フィルタブロックグループＦ［１，０，１］〜Ｆ［１，１９，１］、及び以下同様にフィルタブロックグループＦ［１，０，４］〜Ｆ［１，１９，４］である。以下同様に続き、フィルタブロック索引４９にあるのは、フィルタブロックグループＦ［４９，０，０］〜Ｆ［４９，１９，０］、フィルタブロックグループＦ［４９，０，１］〜Ｆ［４９，１９，１］、及び以下同様にフィルタブロックグループＦ［４９，０，４］〜Ｆ［４９，１９，４］である。そして、ギャップフィルタブロックグループＦ［Ｇ］はなく、フィルタブロック索引５０〜１２７にあるフィルタブロックグループは無関係値である。
【０４８５】
図６８の例に示されるように、フィルタブロック索引に関しては、図６６のギャップフィルタブロックグループが存在せず、また図６６でギャップフィルタブロックグループの下にあったフィルタブロックグループがいずれも上にずらされて、存在しないギャップフィルタブロックグループによって空いた重みＲＡＭ１２４行を占めている。その結果、図６８のフィルタブロックグループは、重みＲＡＭ１２４の５００行を占め、これは、同じくギャップ入力／フィルタブロックグループがない図６４の実施形態と同様である。図６８の例は、重みＲＡＭ１２４の行０〜４９９に記憶されたフィルタブロックグループを示しているが、フィルタブロックグループＦ［ｆ，ｃ，ｒ］が他の行に記憶される他の実施形態が企図される。ＮＰＵ１２６に図６８の様々なフィルタブロックグループの重みを読み込むための重みＲＡＭ１２４のアドレス指定については、図６９との関連でより詳細に説明する。
【０４８６】
次いで図６９を参照すると、Ｎ＝２０４８個のＮＰＵ１２６を有するＮＮＵ１２１で実行される非アーキテクチャプログラムによって行われて、図６４のデータＲＡＭ１２２のレイアウト６４０１及び図６８の重みＲＡＭ１２４のレイアウト６８０２を併用して、１２×１２×２０の入力５８０２に５０個の５×５×２０フィルタ５８０４を畳み込んで、５０個の８×８出力５８０６を作り出す計算を図示する疑似コードが示される。図６９の疑似コードは、多くの点で図６７の疑似コードに似ているが、図６７の疑似コードは図６１及び図６６に示されるようにギャップ入力／フィルタブロックグループを仮定するのに対して、図６９の疑似コードはギャップを仮定しない点が異なる。したがって、ライン９ではＣ＝２０回の反復になる（図６７のライン９における２４回に対して）。
【０４８７】
好ましくは、アーキテクチャプログラムは、重みを重みＲＡＭ１２４（例えば、フィルタブロック５９０４として論理的に区分されている）にロードし、入力データをデータＲＡＭ１２２（例えば入力ブロック５９０２として論理的に区分されている）にロードする。アーキテクチャプログラムは、例えば上記で図２５との関連で説明したのと同様にして重み及びデータをＲＡＭ１２２／１２４にロードすることができるが、図２５の説明では、データＲＡＭ１２２が重みを保持し、重みＲＡＭ１２４が入力データ及び結果データを保持するのに対し、３Ｄ畳み込みを行うために記載される実施形態では、データＲＡＭ１２２が入力及び出力データを保持し、重みＲＡＭ１２４が重みを保持する。
【０４８８】
入力ブロック５９０２の入力データは動的であるのに対し、フィルタブロック５９０４の重みは静的であることが観察できよう。すなわち、入力データは、ニューラルネットワークが実行されるたび、例えば、新しい画像又は新しい画像のセットがＮＮＵ１２１に入力され、処理されるたびに、変わる可能性がある。それに対して、重みは、ニューラルネットワークの開発（例えば、トレーニング）時に生成され、ニューラルネットワークの各実行インスタンスについて同じままである。したがって、所望されるようにフィルタブロック５９０４内に重みを編成するコストは一度のみ発生し、あらかじめオフラインで編成することができる。そのため、入力にフィルタを畳み込んで出力を生成することを達成するために必要な実行を非アーキテクチャプログラムが行うのにかかる時間を最小にするように、重みをフィルタブロック５９０４内に編成すると有利である可能性がある。さらに、図６４〜図６５及び図６８〜図６９の実施形態（すなわちギャップがない）の非アーキテクチャプログラムは、行うべき循環動作及び積和演算がより少ないため、より少ないクロックサイクルで実行することができるが、（例えばアーキテクチャプログラムにより）入力ブロック５９０２内に入力データを適切に編成するために追加的な時間を要する可能性があり、入力にフィルタを畳み込んで出力を生成するのにかかる合計時間は、ギャップを用いる実施形態よりも少ない可能性がある。どちらの方法がより速いかは複数の要因に依存する可能性があり、そのような要因には、ギャップのサイズ、ニューラルネットワークのハイパーパラメータ、アーキテクチャプロセッサの可用性、及びメモリサブシステムの特性が含まれる。
【０４８９】
Ｃ（チャネルの数）がＧ（ブロックの数）の因数であるとき、ギャップ入力／フィルタブロックグループ（ギャップ）は必要でないことが観察できよう。さらに、ＣがＧの因数ではないとき、Ｇ−Ｆの差がＣ−１以上である場合はギャップは必要でなく、そのためチャネル０を除く入力５８０２の全チャネルのコピーを、データＲＡＭ１２２行の最後にある不使用ブロックに置くことができる。
【０４９０】
データＲＡＭ１２２の一行にわたって含まれる入力５８０２のＣ個のチャネルのコピーの数、すなわち、データＲＡＭ１２２行に含まれるＣ個のチャネル各々に対応する入力ブロック５９０２のコピーの数に関する、動的なハイパーパラメータ及び静的なＮＮＵ１２１のハードウェア構成に関連する様々な状況に関して、以下のことも観察できよう。例えば、図６１及び図６４の実施形態では、データＲＡＭ１２２の一行にわたって含まれる入力５８０２のＣ個のチャネルのコピーの数は３つである。また、必要とされるギャップの数、及びそれに付随するループ３の反復カウントに対する影響、すなわち上記で疑似コードに関連して説明したチャネル反復ループに関して、以下のことも観察できる。
【０４９１】
第１の状況では、ＣはＧの２分の１未満であり、ＦはＧ未満である。データＲＡＭ１２２の一行にわたって含まれる入力５８０２のＣ個のチャネルのコピーの数は、Ｇ÷Ｃの床関数である。したがって、図６１及び図６４の例では、Ｃ＝２０且つＧ＝６４且つＦ＝５０であり、これは第１の状況の基準を満たし、Ｇ÷Ｃの床関数＝ｆｌｏｏｒ（６４／２０）＝３になり、これが、データＲＡＭ１２２の一行にわたって含まれる入力５８０２のＣ個のチャネルのコピーの数である。ギャップの数はＧ  ｍｏｄｕｌｏ  Ｃであり、例えば図６１及び図６６の例では６４％２０＝４である。さらに、不使用のＮＰＵブロック５９０６の数はＧ−Ｆである。これは、それらを使用するフィルタがないためであり、例えば図６１及び図６６の例では、６４−５０＝１４となる。
【０４９２】
第２の状況では、Ｃは、Ｇの２分の１とＧの間にあり、ＦはＧ未満である。入力５８０２のＣ個のチャネルのコピーは１つのみが、データＲＡＭ１２２の一行にわたって含まれる。第１の状況と同様に、ギャップの数は、第２の状況ではＧ  ｍｏｄｕｌｏ  Ｃである。
【０４９３】
第３の状況では、ＣはＧより大きく、ＦはＧ未満である。入力５８０２のＨ行の各行についてのＣ個のチャネルが、データＲＡＭ１２２のＮ行にわたって分割され、Ｎは２以上である。すなわち、各々の水平方向２Ｄ入力スライス（すなわち、入力５８０２のＨ行のうち所与の行のＣ個のチャネルすべて）について、データＲＡＭ１２２のＮ行が使用されて、その所与の入力５８０２行のＣ個のチャネルについての入力ブロック５９０２を保持し、Ｃ個のチャネルは、データＲＡＭ１２２のＮ行に振り分けられる。Ｃ個のチャネルが分割されるデータＲＡＭ１２２の行の数であるＮは、Ｃ÷Ｇの天井関数である。例えば、Ｃ＝２００及びＧ＝６４と仮定すると、Ｎ＝ｃｅｉｌｉｎｇ（２００／６４）＝データＲＡＭ１２２の４つの異なる行が使用されて、入力５８０２のＨ行のうち所与の行に関連付けられた所与の水平方向２ＤスライスのＣ＝２００個のチャネルすべてについての入力ブロック５９０２を保持し、合計でデータＲＡＭ１２２のＨ×Ｎ個の行が使用されて、入力５８０２のＨ個の行の全行のＣ＝２００個のチャネルすべてについての入力ブロック５９０２を保持する。これは、Ｃ＝２０がＧ＝６４未満であるためにデータＲＡＭ１２２の行が１行で済む図６１及び図６４の例と対照的である。最初のＮ−１行の各々については、ギャップがなく、すべてのＮＰＵブロック５９０６が使用されて畳み込み結果を生成する。しかし、データＲＡＭ１２２のＮ行のうち最後の行に関しては、ＣがＧの因数でない場合、データＲＡＭ１２２の最後の行に保持すべきチャネルの残りの数はＧ未満になり、その場合、Ｎ行の最後の行は、上記で説明した第１又は第２の状況と同じように扱われる。第３の状況では、図６０の疑似コードが変更を加えられて、ループ２の内部に入れ子になった第５のループを追加する。すなわち、第５のループは、ループ３と、ループ３の前のライン８におけるｍｕｘ−ｒｅｇｓ２０８へのデータＲＡＭ１２２行の読み込みとを包含する。第５のループはＮ回反復し、そのため、データＲＡＭ１２２のＮ行の各行について、その行がｍｕｘ−ｒｅｇ２０８に読み込まれ、ループ３の実行インスタンスがその行に行われる。第５のループの最初のＮ−１回の反復では、ループ３の反復カウントはＧであり、第５のループのＮ回の反復のうち最後の反復では、ループ３の反復カウントは、Ｃ  ｍｏｄｕｌｏ  Ｇに、存在する場合にはギャップの数を足した数となる。したがって、第５のループの実行インスタンスの完了時に（例えば、ループ２の反復ごとに）、各ＮＰＵ１２６の累算器２０２は、新たな列チャネル和を累算していることになる。別の表現をすると、ループ２の各反復は、水平方向の２Ｄ入力スライス（すなわち、入力５８０２のＨ行のうち所与の行のＣ個のチャネルすべて）と、水平方向の２Ｄフィルタスライス（すなわち、フィルタ５８０４のＲ行のうち所与の行のＣ個のチャネルすべて）とに関与する。列チャネル和は、Ｃ個のチャネルすべての各チャネルについて、関与する水平方向の２Ｄ入力スライスのうちそのチャネルの部分と、関与する水平方向の２Ｄフィルタスライスのうちそのチャネルの部分とを畳み込んで列和を生成し、継続的にＣ個のチャネルの列和すべてを累算して���チャネル和を作り出した結果である。
【０４９４】
第４の状況では、ＦがＧより大きい。Ｆ個のフィルタは、Ｇ個のフィルタのＮ−１個のグループと、Ｆ  ｍｏｄｕｌｏ  Ｇ個のフィルタの最後のＮ番目のグループとに分割され、Ｇ（又はＦ％Ｇ）個のフィルタの各グループは、チャネルの数に依存して、３つの状況のうち該当するものに従って上記のように処理される。第１の実施形態では、フィルタのＮ個のグループのうち所与のグループについて、Ｑ個の出力行すべて（すなわち、Ｑ個の列チャネル行和、又は畳み込み結果のすべて）が計算され、データＲＡＭ１２２に書き込まれた後に、次のフィルタのグループに移る。すなわち、疑似コードの１回目の実行インスタンスは、Ｎ個のグループのうち１番目のグループに対して行われ、次いで、疑似コードの２回目の実行インスタンスがＮ個のグループのうち２番目のグループに対して行われ、以下同様に続き、最後には、疑似コードの実行インスタンスが、Ｆ個のフィルタのＮ個のグループすべてに行われる。第２の実施形態では、フィルタのＮ個のグループすべてについてのＱ個の出力行の１つが、計算され、書き込まれた後に、Ｑ個の出力行の次の行に移る。すなわち、ループ１の１回目の反復は、Ｆ個のフィルタのＮ個のグループの各々について、Ｑ個の出力行のうち第１の出力行を生成し、次いで、ループ１の２回目の反復が、Ｆ個のフィルタのＮ個のグループの各々について、Ｑ個の出力行の第２の出力行を生成し、以下同様に続き、最後には、ループ１の反復が、Ｆ個のフィルタのＮ個のグループの各々について、Ｑ個の出力行すべての出力行を生成する。２つの実施形態のうちどちらが好ましいかは様々な要因に依存する可能性があり、それらの要因には、非アーキテクチャプログラム及び／又はアーキテクチャプログラムによるデータＲＡＭ１２２及び重みＲＡＭ１２４へのアクセスの量が含まれる。ただし、好ましくは、上記のように、個々の畳み込み列チャネル行和は、ＮＰＵ１２６の累算器２０２の内部で完全に生成され、データＲＡＭ１２２（又は重みＲＡＭ１２４）に中間の部分和を書き込み、後でそれを読み出すことはしない。これにより、有利な点として、畳み込み列チャネル行和の精度の損失を回避することができる。また、有利な点として、データＲＡＭ１２２及び／又は重みＲＡＭ１２４へのアクセスは高コストであり得るため、時間を節減することもできる。
【０４９５】
観察できるように、列−チャネル−行の順序で畳み込みを行い、ｍｕｘ−ｒｅｇ２０８の循環器を使用して異なる入力ブロック５９０２をＮＰＵブロック５９０６間で循環させる本明細書に記載される実施形態は、ｍｕｘ−ｒｅｇ２０８の循環器の利益を受けずに列−行−チャネルの順序で畳み込みを行う従来の方法を上回る利点を有する可能性がある。潜在的な利点の１つは、それらの実施形態では、入力５８０２データを読み出すためのメモリへのアクセス回数がより少なくて済む可能性があることである。図６０の疑似コードを参照すると、Ｓ×Ｃ回の積和演算は、データＲＡＭ１２２からの１回の読み出しの入力５８０２データを使用して行うことができ、これは、例えば図６４の実施形態では５×２０＝１００回の積和演算になる。別の潜在的な利点は、それらの実施形態が、入力５８０２データを記憶するために必要とされるメモリの量を減らせることである。なぜならば、従来の方法では、列−行−チャネルの順序の畳み込みに対応するために入力５８０２データの複製を必要とし得るためである。従来の方法で必要とされる入力５８０２データの複製は、アーキテクチャプログラムからの追加的な帯域幅を必要とし、より多くのメモリ帯域幅を消費する可能性もある。
【０４９６】
ＮＮＵ１２１が重みＲＡＭ１２４及びデータＲＡＭ１２２を別個のメモリとして含んでいる実施形態を記載したが、重みと入力データがＮＮＵ１２１の単一のメモリに記憶される他の実施形態が企図される。この実施形態はよりコスト効果が高い可能性があるが、別個の重みＲＡＭ１２４及びデータＲＡＭ１２２を含む実施形態で２つのメモリに並列してアクセスできる能力と比較して、単一のメモリに関する競合とそのメモリへのアクセスの直列化に起因して性能の低下が生じる可能性がある。さらに、ニューラルネットワークがハイパーパラメータの特定のセット（例えば、Ｈ＝Ｗ＝１２、Ｃ＝２０、Ｆ＝５０、Ｒ＝Ｓ＝５、Ｐ＝Ｑ＝８、有効な畳み込み）を持ち、特定のＮＮＵ１２１構成（例えば、１０２４個又は２０４８個のＮＰＵ１２６）に実行される実施形態を説明したが、それらの実施形態の説明は、説明の目的で提供されるものであり、異なるハイパーパラメータのセット及び異なるＮＮＵ１２１のハードウェア構成を備える他の実施形態が企図され、この実施形態はそれでも、列−チャネル−行のループ順序を併用して、ＮＰＵ／入力／フィルタブロック及びｍｕｘ−ｒｅｇ２０８の循環器動作を効率的に用いて、入力ブロック５９０２をＮＮＵ１２１内で循環させて、列チャネル行和、すなわち畳み込み結果を生成する。
【０４９７】
マルチワード距離循環
次いで図７０を参照すると、マルチワード距離循環動作を支援する代替的な一実施形態によるＮＰＵ１２６の一部を図示するブロック図が示される。図７０は、ＮＰＵ１２６のｍｕｘ−ｒｅｇ２０８を含んでいる。ＮＰＵ１２６は、ＮＰＵ  Ｊと表され、ＮＮＵ１２１のＮ個のＮＰＵ１２６のアレイの１つである。多くの点で、図７０のｍｕｘ−ｒｅｇ２０８は図７のｍｕｘ−ｒｅｇ２０８に似ており、データＲＡＭ１２２からデータワードを受け取る入力２０７を備え、制御入力２１３及び出力２０９を有する。ただし、図７の実施形態のように隣接するＮＰＵ１２６から受け取られる単一の入力２１１を有するのではなく、図７０の実施形態のｍｕｘ−ｒｅｇ２０８は、５つの異なる隣接するＮＰＵ１２６からの５つの入力を有する。第１の入力２１１−１は、図７の実施形態の入力２１１のように、ＮＰＵ  Ｊ−１、すなわち当該ＮＰＵ１２６から１つ離れたＮＰＵ１２６の出力２０９からである。第２の入力２１１−２は、ＮＰＵ  Ｊ−２、すなわち当該ＮＰＵ１２６から２つ離れたＮＰＵ１２６の出力２０９からである。第３の入力２１１−４は、ＮＰＵ  Ｊ−４、すなわち当該ＮＰＵ１２６から４つ離れたＮＰＵ１２６の出力２０９からである。第４の入力２１１−８は、ＮＰＵ  Ｊ−８、すなわち当該ＮＰＵ１２６から８つ離れたＮＰＵ１２６の出力２０９からである。第５の入力２１１−１６は、ＮＰＵ  Ｊ−１６、すなわち当該ＮＰＵ１２６から１６個離れたＮＰＵ１２６の出力２０９からである。制御入力２１３は、入力２０７、２１１−１、２１１−２、２１１−４、２１１−８、又は２１１−１６の１つを、出力２０９で提供するために選択するように動作する。それにより、有利な点として、ＮＮＵ１２１によって実行される非アーキテクチャ命令がマルチワード距離循環動作を達成することができ、すなわち、制御入力が入力２１１−２、２１１−４、２１１−８、又は２１１−１６の１つを出力２０９で提供するために選択するときである。これは、図６０、図６３、図６５、図６７、及び図６９のライン１９における位置合わせのための循環動作など、上記で説明したような３Ｄ畳み込みを行う非アーキテクチャプログラムのサイズを減少させ、効率を増大させるために特に有益である可能性がある。
【０４９８】
図７０の実施形態では、ｍｕｘ−ｒｅｇ２０８は、１、２、４、８、及び１６個離れた、５つの異なる隣接するＮＰＵ１２６からの出力２０９を受け取る５つの入力を有するが、ｍｕｘ−ｒｅｇ２０８が、異なる数の隣接するＮＰＵ１２６からの出力２０９を受け取り、異なる距離のＮＰＵ１２６だけ離れた、より多くの又はより少ない入力（例えば、３つ、４つ、６つ、７つ）を有する他の実施形態が企図される。例えば、一実施形態では、ｍｕｘ−ｒｅｇ２０８は、入力２１１−２も２１１−１６も備えない。さらに、図７０の実施形態における距離は２の累乗であるが、距離のいくつかが２の累乗ではない他の実施形態が企図される。
【０４９９】
他の実施形態では、ｍｕｘ−ｒｅｇ２０８は、図２３の隣接するナローワード入力１８１１を受け取り、選択して、ナロー／じょうご構成機能をサポートするか、且つ／又は図４９の出力バッファ１１０４の入力４９０５を受け取り、選択して、出力バッファ１１０４のフィードバック機能をサポートするようにさらに構成されるが、それらの入力は簡潔のために図７０には示していない。さらには、図示していないが、重みｍｕｘ−ｒｅｇ７０５は、図７０のｍｕｘ−ｒｅｇ２０８と同様に、すなわち、マルチワード離れた隣接するＮＰＵ１２６の出力２０３を受け取り、選択するように構成されてもよい。
【０５００】
次いで図７１を参照すると、図７０のようなｍｕｘ−ｒｅｇ２０８を有するＮＰＵ１２６を含むＮＮＵ１２１のマルチワード距離循環機能を図示する４つの命令が示される。４つの命令の各々は積和ＡＬＵ演算を指定し、その演算は、その演算の重みワードを現在の重みＲＡＭ１２４行の後の重みＲＡＭ１２４の次の行から受け取り、その演算のデータワードを、それぞれ２、４、８、又は１６の距離だけ離れたところにある隣接するＮＰＵ１２６から、図７０のｍｕｘ−ｒｅｇ２０８を介して受け取る。すなわち、４つの命令のうち第１の命令は、Ｎ個のＮＰＵ１２６の各々に、それぞれ入力２１１−２、２１１−４、２１１−８、又は２１１−１６を（例えば、制御入力２１３を介して）選択するように命令する。こうした命令の１つ又は複数を、上記のような図６０、図６３、図６５、図６７、及び図６９の疑似コードなどの疑似コードを実装する非アーキテクチャプログラムに含めて、ライン１９の位置合わせする循環を行うことができる。非アーキテクチャ命令は、積和に加えて他のＡＬＵ演算を行ってもよく、上記で説明したような例えば加算、乗算、最大値、最小値、ノーオペレーションを行うことができる。詳細には、ノーオペレーションＡＬＵ演算を使用して、累算器２０２に影響を与えることなく、Ｎ個のＮＰＵ１２６間でデータＲＡＭ１２２からの行の読み出しを単純に循環させることができ、これは、位置合わせ循環（例えばライン１９の）の循環量（すなわち循環させるワード数）がｍｕｘ−ｒｅｇ２０８によって直接はサポートされない場合に特に有用である可能性がある。例えば、循環量が１１である場合には、１のノーオペレーション循環を行った後に２のノーオペレーション循環を行い、その後８の積和循環を行うことが必要となり得る。加えて、ＮＰＵ１２６の重みワードが、図７のｍｕｘ−ｒｅｇ７０５などのｍｕｘ−ｒｅｇに保持される実施形態が企図され、ｍｕｘ−ｒｅｇは、重みＲＡＭ１２４から受け取られる重みの行を循環させるためのＮワード循環器に含めることができ、図７０のｍｕｘ−ｒｅｇ２０８と同様に、複数距離（例えば、１、２、４、８、及び１６）離れた複数の異なる隣接するＮＰＵ１２６からの出力２０９から入力を受け取る様に強化される。さらに、マルチワード距離循環動作を指定する非アーキテクチャ命令は、図４のアドレス２の非アーキテクチャ命令で指定されるＣＯＵＮＴ＝５１１など、１より大きいカウントを指定することができる。
【０５０１】
本発明の様々な実施形態を本明細書に記載したが、それらは例として提示されたものであり、制限ではないことを理解されたい。関連するコンピュータ技術の当業者には、本発明の範囲から逸脱することなく、本発明の形態及び詳細に様々な変更をなすことが可能であることが明らかであろう。例えば、ソフトウェアが、例えば、本明細書に記載される装置及び方法の機能、製造、モデリング、シミュレーション、記述、及び／又は試験を可能にすることができる。これは、一般的なプログラミング言語（例えば、Ｃ、Ｃ＋＋）、Ｖｅｒｉｌｏｇ  ＨＤＬ、ＶＨＤＬなどを含むハードウェア記述言語（ＨＤＬ）、又は他の利用可能なプログラムの使用を通じて達成することができる。そのようなソフトウェアは、磁気テープ、半導体、磁気ディスク、若しくは光学ディスク（例えば、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ等）、ネットワーク、有線、又は他の通信媒体など、任意の知られているコンピュータ使用可能媒体の中に配置することができる。本明細書に記載される装置及び方法の実施形態は、プロセッサコア（例えば、ＨＤＬで具現化又は規定された）などの半導体の知的財産権コアに含めて、集積回路の作製時にハードウェアに変容させることができる。加えて、本明細書に記載される装置及び方法は、ハードウェアとソフトウェアの組み合わせとして具現化することができる。したがって、本発明は、本明細書に記載される例示的実施形態のいずれによっても制限されるべきではなく、下記の特許請求の範囲とその均等物のみに従って定義されるべきである。具体的には、本発明は、汎用コンピュータで使用されることが可能なプロセッサデバイス中に実装することができる。最後に、当業者は、開示される概念と特定の実施形態を、添付の特許請求の範囲によって定義される本発明の範囲から逸脱することなく、本発明と同じ目的を遂行するための他の構造を設計するための、又はそれに変更を加えるための基礎として容易に使用できることを認識されよう。
【図１】
2018092560.tif 000011
【図２】
2018092560.tif 000012
【図３】
2018092560.tif 000013
【図４】
2018092560.tif 000014
【図５】
2018092560.tif 000015
【図６Ａ】
2018092560.tif 000016
【図６Ｂ】
2018092560.tif 000017
【図７】
2018092560.tif 000018
【図８】
2018092560.tif 000019
【図９】
2018092560.tif 000020
【図１０】
2018092560.tif 000021
【図１１】
2018092560.tif 000022
【図１２】
2018092560.tif 000023
【図１３】
2018092560.tif 000024
【図１４】
2018092560.tif 000025
【図１５】
2018092560.tif 000026
【図１６】
2018092560.tif 000027
【図１７】
2018092560.tif 000028
【図１８】
2018092560.tif 000029
【図１９】
2018092560.tif 000030
【図２０】
2018092560.tif 000031
【図２１】
2018092560.tif 000032
【図２２】
2018092560.tif 000033
【図２３】
2018092560.tif 000034
【図２４】
2018092560.tif 000035
【図２５】
2018092560.tif 000036
【図２６Ａ】
2018092560.tif 000037
【図２６Ｂ】
2018092560.tif 000038
【図２７】
2018092560.tif 000039
【図２８】
2018092560.tif 000040
【図２９Ａ】
2018092560.tif 000041
【図２９Ｂ】
2018092560.tif 000042
【図２９Ｃ】
2018092560.tif 000043
【図３０】
2018092560.tif 000044
【図３１】
2018092560.tif 000045
【図３２】
2018092560.tif 000046
【図３３】
2018092560.tif 000047
【図３４】
2018092560.tif 000048
【図３５】
2018092560.tif 000049
【図３６Ａ】
2018092560.tif 000050
【図３６Ｂ】
2018092560.tif 000051
【図３７】
2018092560.tif 000052
【図３８】
2018092560.tif 000053
【図３９】
2018092560.tif 000054
【図４０】
2018092560.tif 000055
【図４１】
2018092560.tif 000056
【図４２】
2018092560.tif 000057
【図４３】
2018092560.tif 000058
【図４４】
2018092560.tif 000059
【図４５】
2018092560.tif 000060
【図４６】
2018092560.tif 000061
【図４７】
2018092560.tif 000062
【図４８】
2018092560.tif 000063
【図４９】
2018092560.tif 000064
【図５０】
2018092560.tif 000065
【図５１】
2018092560.tif 000066
【図５２】
2018092560.tif 000067
【図５３】
2018092560.tif 000068
【図５４】
2018092560.tif 000069
【図５５】
2018092560.tif 000070
【図５６】
2018092560.tif 000071
【図５７】
2018092560.tif 000072
【図５８】
2018092560.tif 000073
【図５９】
2018092560.tif 000074
【図６０】
2018092560.tif 000075
【図６１Ａ】
2018092560.tif 000076
【図６１Ｂ】
2018092560.tif 000077
【図６２】
2018092560.tif 000078
【図６３】
2018092560.tif 000079
【図６４Ａ】
2018092560.tif 000080
【図６４Ｂ】
2018092560.tif 000081
【図６５】
2018092560.tif 000082
【図６６Ａ】
2018092560.tif 000083
【図６６Ｂ】
2018092560.tif 000084
【図６７】
2018092560.tif 000085
【図６８Ａ】
2018092560.tif 000086
【図６８Ｂ】
2018092560.tif 000087
【図６９】
2018092560.tif 000088
【図７０】
2018092560.tif 000089
【図７１】
2018092560.tif 000090
【外国語明細書】
2018092560000001.pdf