(57)【要約】      （修正有）【課題】外積を計算し、各積を連続的に累算するためのプロセッサを提供する。【解決手段】プロセッサは、ｒビットのビット幅を有するレジスタファイルと、行および列に配置された乗算器１６のアレイ１５とを有する。ベクトル乗数オペランドとベクトル被乗数オペランドとの外積を実行するために、乗数オペランドおよび被乗数オペランドを各乗算器にロードし、その結果、アレイ内の位置［ｉ，ｊ］にある乗算器が、乗数オペランドｉおよび被乗数オペランドｊを受け取る。各乗算器において、乗数オペランドｉと被乗数オペランドｊとの第１の乗算が実行され、ｒビットよりも広い第１の乗算結果ｉ＊ｊが生成される。第１の乗算結果はその後、その乗算器に関連付けられた累算器１８に供給され、累算器に格納された任意の以前の乗算結果に加算される。結果は、ベクトル乗数オペランドのすべての要素と、ベクトル被乗数オペランドのすべての要素との乗算である。【選択図】図１
2018055677.tif 000002
【特許請求の範囲】
【請求項１】
各々ｂビットのビット幅を有し、かつｒビットの集合幅を有する複数ｎ個の乗数オペランドであって、ｒ＝ｎ＊ｂである、乗数オペランドの各々の１つと、各々ｂビットのビット幅を有し、かつｒビットの集合幅を有する複数ｎ個の被乗数オペランドであって、ｒ＝ｎ＊ｂである、被乗数オペランドの各々の１つとを乗算するためのプロセッサであって、
ｒビットのビット幅を有するレジスタファイルと、
行および列に配置された乗算器のアレイであって、各列は１つの乗数オペランドを受け取るように結合されており、各行は１つの被乗数オペランドを受け取るように結合されており、それによって、各乗算器は乗数オペランドおよび被乗数オペランドを受け取り、それらをともに乗算して、ｒビットより大きい集合ビット幅を有する複数ｎ２個の乗算結果を提供する、乗算器のアレイと、
行および列に配置された加算器のアレイであって、各加算器は対応する乗算器に結合されている、加算器のアレイと、
行および列に配置された累算器のアレイであって、各累算器は対応する加算器に結合されている、累算器のアレイと
を備え、
各乗算器からの前記乗算結果は、前記累算器に格納されている任意の以前の乗算結果に加算され、対応する前記累算器に供給され、それによって累算結果を提供する、プロセッサ。
【請求項２】
単一の命令が、前記プロセッサに、前記オペランドの乗算および前記乗算の累算を実行させる、請求項１に記載のプロセッサ。
【請求項３】
前記累算器は、冗長形式で値を保持する、請求項１に記載のプロセッサ。
【請求項４】
出力段のアレイをさらに備え、各出力段は、前記累算結果を前記プロセッサから転送する前に前記累算結果を格納するために対応する前記累算器に結合されている、請求項１に記載のプロセッサ。
【請求項５】
前記出力段に供給されるデータを制御するために、各累算器とその対応する出力段との間に結合されているスイッチング回路のアレイをさらに備える、請求項４に記載のプロセッサ。
【請求項６】
前記スイッチング回路は、前記アレイ内の別の累算器からのデータが前記出力段に提供されることを可能にする、請求項５に記載のプロセッサ。
【請求項７】
行および列に配列された追加のデータ処理回路のアレイをさらに備え、前記追加のデータ処理回路は、各累算器と、対応する出力段との間に結合されており、前記追加のデータ処理回路は、前記累算器内のデータに対するさらなる演算を実行する、請求項４に記載のプロセッサ。
【請求項８】
前記追加のデータ処理回路は、前記累算器内の前記データの一部の抽出、前記累算器内の前記データの丸め、または前記累算器内の前記データの関数の適用のうちの少なくとも１つを可能にする、請求項７に記載のプロセッサ。
【請求項９】
前記データが前記累算器から前記アレイを出て転送されるときに、前記累算器内の前記データの一部の抽出、前記累算器内の前記データの丸め、または前記累算器内の前記データへの関数の適用のうちの少なくとも１つを可能にするために、前記アレイに結合されている少なくとも１つのデータ処理回路をさらに備える、請求項４に記載のプロセッサ。
【請求項１０】
前記少なくとも１つのデータ処理回路は複数のデータ処理回路を含み、各データ処理回路は前記アレイ内のすべての前記累算器よりも少ないサブセットに結合される、請求項９に記載のプロセッサ。
【請求項１１】
各々ｂビットのビット幅を有し、かつｒビットの集合幅を有する複数ｎ個の乗数オペランドであって、ｒ＝ｎ＊ｂである、乗数オペランドの各々の１つと、各々ｂビットのビット幅を有し、かつｒビットの集合幅を有する複数ｎ個の被乗数オペランドであって、ｒ＝ｎ＊ｂである、被乗数オペランドの各々の１つとを乗算するためのプロセッサにおける、前記プロセッサのタイルであって、
複数ｎ個の乗数オペランドのうちの１つおよび複数ｎ個の被乗数オペランドのうちの１つを受け取り、これらを乗算して、ｒビットより大きいビット幅を有する乗算結果を提供するように結合された乗算器と、
前記乗算器に結合された加算器と、
前記加算器に結合された累算器と
を備え、
前記乗算器からの前記乗算結果は前記加算器に提供され、前記累算器に格納されている任意の以前の乗算結果に加算され、それによって累算結果を提供する、タイル。
【請求項１２】
前記累算結果を格納するために前記累算器に結合された出力段をさらに備える、請求項１１に記載のタイル。
【請求項１３】
前記出力段に供給されるデータを選択するために、前記累算器と前記出力段との間に結合されているスイッチング回路をさらに備える、請求項１２に記載のタイル。
【請求項１４】
前記スイッチング回路は、別のタイルからのデータが前記出力段に提供されることを可能にする、請求項１３に記載のタイル。
【請求項１５】
プロセッサであって、行および列に配置された乗算器のアレイと、行および列に配置された累算器のアレイと、行および列に配置された加算器のアレイとを有し、各乗算器は、関連付けられている加算器および関連付けられている累算器を有し、前記プロセッサはｒビットのビット幅を有するレジスタファイルを有するプロセッサにおいて、ベクトル乗数オペランドとベクトル被乗数オペランドとの外積を実行する方法であって、
前記乗算器の各々に第１の乗数オペランドおよび第１の被乗数オペランドをロードするステップであって、前記乗算器は、前記アレイ内の位置［ｉ，ｊ］において、第１の乗数オペランドｉおよび第１の被乗数オペランドｊを受け取る、ステップと、
各乗算器において、前記第１の乗数オペランドｉと前記第１の被乗数オペランドｊとの乗算を実行して、ｒビットよりも広い第１の乗算結果ｉ＊ｊを生成するステップと、
前記第１の乗算結果を前記関連付けられている加算器に供給するステップと、
前記第１の乗算結果を任意の以前の乗算結果に加算して、累算乗算結果を前記関連付けられている累算器に供給するステップと
を含む、方法。
【請求項１６】
前記乗算器の各々に第２の乗数オペランドおよび第２の被乗数オペランドをロードするステップであって、前記アレイ内の位置［ｉ，ｊ］にある前記乗算器が、第２の乗数オペランドｉおよび第２の被乗数オペランドｊを受け取る、ステップと、
各乗算器において、前記第２の乗数オペランドｉと前記第２の被乗数オペランドｊとの乗算を実行してｒビットよりも広い第２の乗算結果ｉ＊ｊを生成するステップと、
各乗算器において、前記第２の乗算結果を前記関連付けられている加算器に供給するステップと、
各乗算器において、前記関連付けられている累算器からの前記第１の乗算結果を前記関連付けられている加算器に供給するステップと、
前記第２の乗算結果を前記第１の乗算結果に加算して新たな累算結果を提供するステップと、
前記関連付けられている累算器に前記新たな累算結果を格納するステップと
をさらに含む、請求項１５に記載の方法。
【請求項１７】
単一の命令が、前記プロセッサに、前記オペランドの乗算および前記乗算の累算を実行させる、請求項１６に記載の方法。
【請求項１８】
前記プロセッサは、出力段のアレイをさらに含み、各出力段は、関連付けられている累算器に結合され、前記方法は、前記新たな累算結果を前記出力段に格納するステップをさらに含む、請求項１６に記載の方法。
【請求項１９】
前記プロセッサは、前記出力段に供給されるデータを制御するために、各累算器とその対応する出力段との間に結合されているスイッチング回路のアレイをさらに備える、請求項１６に記載の方法。
【請求項２０】
前記スイッチング回路は、前記アレイ内の別の累算器からのデータが、異なる累算器に関連付けられている前記出力段に提供されることを可能にする、請求項１９に記載の方法。
【請求項２１】
（ｉ）前記累算器内のデータの一部の抽出、（ｉｉ）前記累算器内のデータの丸め、または（ｉｉｉ）前記累算器内のデータへの関数の適用のうちの少なくとも１つのステップをさらに含む、請求項１８に記載の方法。
【請求項２２】
前記プロセッサは、行および列に配列された追加のデータ処理回路のアレイをさらに備え、前記追加のデータ処理回路は、各累算器と各出力段との間に結合されており、前記追加のデータ処理回路は、前記累算器内のデータに対するさらなる演算を実行する、請求項１８に記載の方法。
【請求項２３】
前記追加のデータ処理回路は、前記累算器内のデータの一部の抽出、前記累算器内のデータの丸め、または前記累算器内のデータへの関数の適用のうちの少なくとも１つを実行する、請求項２２に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
[01]本発明は、コンピュータ技術に関し、外積演算および外積累算演算を実行するためのプロセッサおよび方法に関する。
【背景技術】
【０００２】
[02]通信製品は、ソフトウェアでリアルタイムにデジタル信号を処理するために計算性能を向上させることを必要としている。過去２０年間の性能の向上は、トランジスタ技術およびプロセッサ設計の改善によってもたらされた。トランジスタの数は、ムーアの法則に従って約２年ごとに２倍になり、１チップあたり数百万から数十億個のトランジスタへと、千倍に増加している。プロセッサの設計は、アーキテクチャの技術革新によって命令当たりの最高性能を向上させており、これによって、約４年ごとにデータ経路幅が実質的に倍増しており、過去２０年ほどで３２ビット（例えばＩｎｔｅｌのＰｅｎｔｉｕｍ）から１０２４ビット（例えばＱｕａｌｃｏｍｍのＨｅｘａｇｏｎ  ＨＶＸ）へと増大している。
【０００３】
[03]デジタル通信は、通常、３２ビット精度以下でデータを乗算して加算する線形アルゴリズムに依拠する。実際、デジタルビデオおよび無線処理は、通常、１６ビットまたはさらには８ビットのデータでも動作する。データ経路幅がこれらのデータ幅をはるかに超えて増加するにつれて、実質的にピーク使用は、例えば、本願と同一出願人による米国特許第５，７４２，８４０号明細書、米国特許第５，７９４，０６０号明細書、米国特許第５，７９４，０６１号明細書、米国特許第５，８０９，３２１号明細書および米国特許第５，８２２，６０３号明細書に広範に扱われている様々な方法を用いてオペランドおよびデータ経路を分割することによって維持されている。
【０００４】
[04]これらの特許は、命令のクラスを追加することによってプロセッサの利用を強化するためのシステムおよび方法を記載している。これらの命令のクラスは、レジスタをデータ経路ソースとして使用し、オペランドを指定されたサイズのシンボルに分割し、並列に演算を実行し、結果を連結し、連結した結果をレジスタに配置する。これらの特許および他の同一出願人による特許には、有意な並列性を使用してデータストリームを処理および送信するために最適化されたプロセッサが記載されている。
【０００５】
[05]当方の以前の米国特許第５，９５３，２４１号明細書では、４つの乗数オペランドａ、ｂ、ｃ、およびｄの各々の１つに４つの被乗数オペランドｅ、ｆ、ｇおよびｈのうちの対応するものを乗算して、積ａ＊ｅ、ｂ＊ｆ、ｃ＊ｇ、ｄ＊ｈを生成するするグループ乗加算演算が記載されている（当該特許文献の第４列）。例えば、当該特許文献の図１および図３を参照されたい。また、乗算の積にオペランドｉ、ｊ、ｋ、ｌを加算して結果ａ＊ｅ＋ｉ、ｂ＊ｆ＋ｊ、ｃ＊ｇ＋ｋ、ｄ＊ｈ＋ｌを生成する積和演算も記載されている。例えば、図２および図４を参照されたい。これらの演算は、固定小数点オペランドと浮動小数点オペランドの両方について記述されている。
【０００６】
[06]他では、ベクトル×スカラー乗減算が実行されるプロセッサが開発されている。例えば、ＳＩＭＤ拡張を備えたＱｕａｌｃｏｍｍ  ＨＶＸアーキテクチャを参照されたい。このプロセッサは、４つのベクトルオペランドのグループが１つのスカラーオペランドと乗算されることを可能にし、４つの結果が合計される。例えば、ｈｔｔｐ：／／ｗｗｗ．ｈｏｔｃｈｉｐｓ．ｏｒｇ／ｗｐ−ｃｏｎｔｅｎｔ／ｕｐｌｏａｄｓ／ｈｃ＿ａｒｃｈｉｖｅｓ／ｈｃ２７／ＨＣ２７．２４−Ｍｏｎｄａｙ−Ｅｐｕｂ／ＨＣ２７．２４．２０−Ｍｕｌｔｉｍｅｄｉａ−Ｅｐｕｂ／ＨＣ２７．２４．２１１−Ｈｅｘａｇｏｎ６８０−Ｃｏｄｒｅｓｃｕ−Ｑｕａｌｃｏｍｍ．ｐｄｆから得られる図１１を参照されたい。
【０００７】
[07]しかし、５Ｇ通信、仮想現実、およびニューラルネットワークなどの新興アプリケーションは、これらの技術よりも桁違いに高速で電力効率の高いデジタル処理に対する欲求を生み出している。ムーアの法則は、１０ｎｍ未満のゲート幅が２００個未満のシリコン格子間隔に及ぶと、遅くなっている。これらのアプリケーションの電力性能需要に対応するために、プロセッサ設計の進歩がますます重要になりつつある。
【発明の概要】
【発明が解決しようとする課題】
【０００８】
[08]既存のプロセッサのデータ経路は、通常、プロセッサの総消費電力および面積のわずかな部分しか消費しないため、幅を２倍にすることによって、プロセッサコアの数を２倍にするよりも、効率的にピーク性能が倍増する。しかしながら、レジスタの幅を倍にする数には実用上の制約がある。レジスタ複合体は通常、高いクロック速度で動作するプロセッサの中央トラフィック相互交換を含む。これらのレジスタは、バイパスネットワークを介して複数の実行ユニットに緊密に結合している多くの入出力ポートを有する。より幅の広い実行ユニットは、ボトルネックを回避し、目的のアプリケーションでピーク性能の大部分を維持しなければならない。これらのプロセッサ設計および方法は、５Ｇ通信、仮想現実、およびニューラルネットワークなどの新興アプリケーションによって必要とされるアルゴリズムに対してピーク性能の大部分を維持することができなければならず、同時に面積および電力において非常に効率的でなければならない。
【０００９】
[09]したがって、レジスタ複合体を大きく複雑にすることなくピーク性能の桁違いの増加を可能にするプロセッサ設計および方法が必要とされている。特に、そのようなプロセッサのための多くの実用的なアプリケーション、例えば、機械学習および画像処理は、外積を実行することができるプロセッサの恩恵を受けることになる。外積では、あるベクトルの各要素に別のベクトルの各要素が乗算される。例えば、以下のベクトルＵおよびＶが与えられる。
2018055677.tif 000003
【００１０】
[10]ベクトルＵおよびＶの外積は以下の通りである。
2018055677.tif 000004
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】米国特許第５，７４２，８４０号明細書
【特許文献２】米国特許第５，７９４，０６０号明細書
【特許文献３】米国特許第５，７９４，０６１号明細書
【特許文献４】米国特許第５，８０９，３２１号明細書
【特許文献５】米国特許第５，８２２，６０３号明細書
【特許文献６】米国特許第５，９５３，２４１号明細書
【非特許文献】
【００１２】
【非特許文献１】ｈｔｔｐ：／／ｗｗｗ．ｈｏｔｃｈｉｐｓ．ｏｒｇ／ｗｐ−ｃｏｎｔｅｎｔ／ｕｐｌｏａｄｓ／ｈｃ＿ａｒｃｈｉｖｅｓ／ｈｃ２７／ＨＣ２７．２４−Ｍｏｎｄａｙ−Ｅｐｕｂ／ＨＣ２７．２４．２０−Ｍｕｌｔｉｍｅｄｉａ−Ｅｐｕｂ／ＨＣ２７．２４．２１１−Ｈｅｘａｇｏｎ６８０−Ｃｏｄｒｅｓｃｕ−Ｑｕａｌｃｏｍｍ．ｐｄｆ
【００１３】
[11]本発明は、外積を計算し、各積を連続的に累算するためのプロセッサおよび方法を提供する。  本発明の方法の好ましい実施形態では、プロセッサは、ｒビットのビット幅を有するレジスタファイルと、行および列に配置された乗算器のアレイとを有する。各乗算器は、アレイ内で乗算器と関連付けられている累算器を有する。ベクトル乗数オペランドとベクトル被乗数オペランドとの外積を実行するために、プロセッサは、乗数オペランドおよび被乗数オペランドを各乗算器にロードし、その結果、アレイ内の位置［ｉ，ｊ］にある乗算器が、乗数オペランドｉおよび被乗数オペランドｊを受け取る。各乗算器において、乗数オペランドｉと被乗数オペランドｊとの第１の乗算が実行され、ｒビットよりも広い第１の乗算結果ｉ＊ｊが生成される。第１の乗算結果はその後、その乗算器に関連付けられた累算器に供給され、累算器に格納された任意の以前の乗算結果に加算される。結果は、ベクトル乗数オペランドのすべての要素と、ベクトル被乗数オペランドのすべての要素との乗算である。所望の乗算および累算がすべて完了すると、結果はアレイからコピーされる。
【００１４】
[12]好ましい実施形態では、本発明のプロセッサは、ｒビットのビット幅を有するレジスタファイルを有する。複数ｎ個の乗数オペランドの各々はｂビットのビット幅を有し、ｒビットの集合幅を提供し、ｒ＝ｎ＊ｂであり、複数ｎ個の被乗数オペランドの各々はまた、ｂビットのビット幅を有し、ｒビットの集合幅を提供し、ｒ＝ｎ＊ｂである。乗算器のアレイが行および列に配置され、各列は１つの乗数オペランドを受け取るように結合され、各行は１つの被乗数オペランドを受け取るように結合される。したがって、各乗算器が、乗数オペランドおよび被乗数オペランドを受け取る。プロセッサ内の乗算器は、オペランドを乗算して、ｒビットより大きい集合ビット幅を有する複数ｎ２個の乗算結果を提供する。プロセッサはまた、行および列に配置された対応する累算器のアレイを含み、各累算器は対応する乗算器に結合されている。プロセッサは、各乗算器からの連続乗算を加算するために累算器を使用する。所望の演算が完了すると、各累算器からの結果がアレイからシフトアウトされる。
【００１５】
[13]本発明はまた、アレイ内の各乗算器および累算器「タイル」の実装回路、ならびにアレイにデータをロードし、アレイからデータをシフトアウトするための技術および回路を含む。
【図面の簡単な説明】
【００１６】
【図１】外積を計算するのに有用な関連付けられている累算器を有する乗算器のアレイの図である。
【図２】外積命令の図である。
【図３】図１の乗算器−累算器の１段をより詳細に示す図である。
【図４】アレイの内外へのデータ転送を示す図である。
【図５】スーパータイルを示す図である。
【図６ａ】アレイにおけるＲＣ遅延を克服するための技法を示す図である。
【図６ｂ】アレイにおけるＲＣ遅延を克服するための技法を示す図である。
【図６ｃ】アレイにおけるＲＣ遅延を克服するための技法を示す図である。
【図７ａ】転置回路を示す図である。
【図７ｂ】転置回路を示す図である。
【図７ｃ】転置回路を示す図である。
【図７ｄ】転置回路を示す図である。
【図８ａ】出力回路を示す図である。
【図８ｂ】出力回路を示す図である。
【図９】アレイを使用する畳み込み演算を示す図である。
【図１０】アレイを使用する行列乗算演算を示す図である。
【図１１】従来のベクトルＳＩＭＤ乗算演算を示す図（引用図）である。
【発明を実施するための形態】
【００１７】
[25]実行ユニット結果のサイズが制約されると、単一の命令に応答して合理的に実行できる計算量が制限される可能性がある。結果として、アルゴリズムは、制約内ですべての中間結果を表現することができる一連の単一命令ステップで実装される。しかしながら、この制限を排除することにより、アルゴリズムのより大部分が単一の命令として実装される命令セットを開発することができる。これらの中間結果の少なくとも一部が、アルゴリズムのより大きい構成要素の完了時に保持される必要がない場合、プロセッサは、汎用レジスタファイルから中間結果を格納せず、検索しないことによって、性能の改善および電力消費の低減を提供する。中間結果が汎用レジスタファイルに保持されない場合、プロセッサ命令セットおよび実装されるアルゴリズムも汎用レジスタファイルのサイズによって制約されない。
【００１８】
[26]本発明は、特に、乗算および加算演算に関する。例えば、画像処理および深層学習アプリケーションでは、多数の乗算および加算がしばしば必要とされる。従来のプロセッサでは、これらの演算は望ましくないほど遅く、特定のアプリケーションの有用性を制約している。ここで説明する本発明は、外積累算として知られる乗算および加算の特定のパターンを効率的に実行することを可能にする。各対が１次元ベクトルである乗数および被乗数に外積演算を適用すると、結果は２次元行列である。外積は、本明細書に記載される本発明に関して２つの重要な特性を有する。第１に、乗数オペランドと被乗数オペランドとの間のすべての可能な乗算は、外積内で実行される。第２に、これらの結果はともに加算されない。したがって、外積の計算は、完全に並列的に実行することができる。外積結果は各々連続的に累算されて、積の和が計算される。これらの積の和が、結果、すなわち、外積の累算を形成する。この時点で、この最終結果は、例えば、丸め、シフト、切り捨て、または、これらの結果が外積累算アレイから読み出されるときにこれらの結果に対して単項演算を実行することによって、さらに処理することができる。
【００１９】
[27]アレイ構造
【００２０】
[28]図１は、外積を計算するための本発明のプロセッサの好ましい実施態様を示す。そこに示されるように、装置１０は、乗算器１６の任意の大きさのアレイ１５を含む。各乗算器１６は、関連付けられているレジスタ１１および１２から乗数オペランドおよび被乗数オペランドを受け取るように結合される。これらのレジスタには、キャッシュメモリ、外部システムメモリまたは他のソースからベクトルオペランドが前もってロードされている。レジスタは、バイト幅（または他の幅）のセグメント１１ａ、１１ｂ．．．１１ｎおよび１２ａ、１２ｂ、．．．１２ｎ（ｎは任意の大きさの数）に分割されて示されている。各乗算器１６は、受け取ったオペランドを乗算し、結果を供給する。例えば、位置１９の乗算器はオペランドｘ［ｉ］およびｙ［ｊ］を受け取り、それらを乗算する。本明細書においては、乗算器を「タイル」として含むアレイ内の各タイルを参照する。以下で説明するように、プロセッサの特定のアプリケーションに応じて構成要素を選択することによって、各タイルについて様々な実施形態が存在する。
【００２１】
[29]図１にも示されている好ましい実施形態では、各乗算器１６は、累算器１８に関連付けられている。累算器１８は、乗算器１６からの連続乗算結果の累積和を格納する。したがって、各累算器１８は、最終的に、その関連付けられている乗算器１６によって計算された個々の乗算の和を格納する。より一般的には、乗算器−累算器１９は、オペランドｘ［ｉ］とｙ［ｊ］とをともに乗算し、その後、その結果を累算器の以前の内容に加算する。乗算および累積和により、累算器に格納される結果は入力オペランドの幅よりも大幅に広くなる。これは、周辺回路との乗算器−累算器インターフェースのより詳細な説明と共に、以下でさらに議論される。乗算器および累算器の詳細な回路設計は周知であり、本明細書ではこれ以上説明しない。
【００２２】
[30]典型的には、オペランドがレジスタ１１および１２に格納される前に、データ処理演算がオペランドに対して実行されていることになる。さらに、プロセッサを制御する命令によって指定されているように、乗算−累算の結果に対してさらなる演算を実行することができる。本明細書では、外積が同じ数の乗数および被乗数で計算され、その結果、正方形のアレイ１５がもたらされる典型的な状況について説明する。しかしながら、本明細書に記載の技術を使用して、他の形状のアレイ、例えば、長方形を実装することもできる。
【００２３】
[31]外積の結果のサイズは、入力オペランドｘ［ｉ］およびｙ［ｊ］よりも大きい。レジスタ１１および１２内で、範囲−２（Ｂ−１）．．．２（Ｂ−１）−１の符号付き値または範囲０．．２（Ｂ−１）の符号なし値のいずれかを表す、サイズＢビットの２つのバイナリ値を乗算する場合、一般に、積の値の範囲を表すために２Ｂビットが必要とされる。正方形のアレイでは、Ｎ個の乗数ｎ［０］．．．ｎ［Ｎ−１］およびＮ個の被乗数ｙ［０］．．．ｙ［Ｎ−１］を使用して、Ｎ２個の結果による外積ｘ［ｉ］＊ｙ［ｊ］が生成される。ｉは０．．．Ｎ−１、ｊは０．．．Ｎ−１である。
【００２４】
[32]Ｂが１６ビットでＮが８の場合、乗数および被乗数は各々１２８ビット（Ｂ＊Ｎ）であり、外積は２０４８ビット（２Ｂ＊Ｎ２）になる。乗数および被乗数は１２８ビットのオペランドをサポートするレジスタファイルに収まり得るが、外積は大きすぎて一般的なレジスタファイルに収まらない。レジスタファイルのサイズが例えばＢ＝１６ビットで１０２４ビットに拡張されたとしても、Ｎが６４になり得、したがって、外積は４０９６（Ｎ２）回の乗算を実行し得る。しかし、これは１３１０７２ビットの結果をもたらす（２Ｂ＊Ｎ２）。この結果を１０２４ビットのレジスタファイルに収めるには、１２８個のレジスタが必要である。これは、汎用プロセッサで通常使用される最大のレジスタファイルよりも大きな数である。
【００２５】
[33]しかしながら、外積結果は、プロセッサに関連付けられているレジスタとは対照的に、プロセッサに関連付けられているシステムメモリに格納することができる。この手法は、本明細書においては「ＯｕｔｅｒＰｒｏｄｕｃｔ」として参照される単一の命令が、乗数オペランドおよび被乗数オペランドのレジスタファイル（またはシステムメモリ）アドレスと共に、命令のオペレーションコードを指定することができる。その後、その結果得られた外積をシステムメモリに戻して格納することができる。システムメモリでは、外積は、レジスタファイル内のレジスタから指定されるメモリアドレスおよび／またはサイズによってアクセス可能である。
【００２６】
[34]別の実施形態では、ベクトルレジスタファイルと汎用レジスタファイルとを組み合わせて単一のレジスタファイルにすることができる。さらに、ＢおよびＮの値の指定は、設計が乗算器の精度およびレジスタファイルのサイズ、または命令内のフィールドによって指定されるか、もしくは命令によって指定されるレジスタの内容（またはレジスタの内容のサブフィールド）によって指定される変数に従ってこれらの値を固定することができるため、暗黙的であってもよい。また、ＢおよびＮの値は、オペランド指定子の一部として指定することもできる。さらに、オペランド指定子は、結果のアドレスと結果のサイズの両方を符号化することができ、または、代替的に、ＢおよびＮの値を計算または推定することができる値を符号化することができる。
【００２７】
[35]代替の実施形態では、乗数または被乗数のいずれか単独にのみ依存する乗算器回路の任意の部分を、乗算器アレイの周辺部に配置して、アレイのＮ２からＮへのその部分のコピー数を減らすことができる。
【００２８】
[36]例えば、加算すべき部分積の数を減らすために、乗算器はブースまたは他の符号化を使用して乗数オペランドを符号化することができる。このような実施形態では、ブース符号化値を乗算器に達するように伝送線および／または回路に提示することができ、したがってブース符号化回路のコピー回数が、アレイ内でＮ２からＮまで低減するため、オペランドの単一のブース符号化回路で十分であり得る。
【００２９】
[37]基数４のブース符号化は、元のオペランド（−２ｘ、−ｘ、０、ｘ、２ｘ）のシフトおよび補数として計算することができる被乗数の倍数を組み合わせるが、例えば、３の倍数の計算を必要とする基数８のブース符号化の場合には、代替の実施形態のいくつかの乗算器回路は、被乗数の小さな倍数を必要とする場合がある。外積内のＮ個の被乗数の各々がＮ個の乗算器に送信されるため、各被乗数の小さな倍数の計算は、Ｎ個の乗数に送信される被乗数および結果当たり単一の回路で達成することができ、したがって、小型乗算回路のコピーの回数がアレイ内でＮ２からＮへと低減する。
【００３０】
[38]好ましい実施形態における外積命令のフォーマットを図２に示す。命令内の第１のフィールド２１は、下記にさらに説明するような、演算が実行されるためのオペコード、例えば、ＯｕｔｅｒＰｒｏｄｕｃｔ、ＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ、ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔなどを指定する。フィールド２２は第１のベクトル（例えば乗数）の位置を指定し、フィールド２３は第２のベクトル（例えば被乗数）の位置を指定する。フィールド２４は、結果を格納する位置を指定する。フィールド２５は、本明細書で説明するように、他のフィールドに関連して必要とされ得る他の情報、例えばＢ、Ｆ、Ｈ、Ｋ、Ｌ、ＭおよびＮを格納する。命令フィールドは、メモリ内の位置のアドレス、レジスタ識別情報、メモリへのポインタなどであってもよく、上記の他の情報は、命令の一部、ソースオペランドの一部、または結果オペランドの一部として指定されてもよいことに留意されたい。
【００３１】
[39]単一の命令に対する許容可能なＮの値が、物理ハードウェアＨにおける乗算器−累算器アレイ１５によって可能にされる値よりも大きくなることを可能にすることによって、プロセッサの実施に対するさらなる柔軟性が提供される。この状況では、外積演算は、乗数値および被乗数値のＨ×Ｈサイズの部分にわたる物理ハードウェアの連続的な演算によって実行することができる。そのような実施形態では、抽出または処理された結果は、アレイ内からメモリシステムまたはそのキャッシュに迅速にコピーすることができ、それによって、アレイ内の結果の物理的格納は、累積、抽出、または処理された結果のうちの単一または少数のＨ×Ｈサイズの部分に限定される。
【００３２】
[40]別の実施形態では、外積乗算演算のソースオペランドは、命令オペコードおよび２つのレジスタサイズのオペランドを指定する単一の命令として指定される。この場合、Ｒビットレジスタファイルの１つのレジスタはＮ個の乗数を含み、Ｒビットレジスタファイルの他のレジスタはＮ個の被乗数を含み、各乗数または被乗数はＢビットを使用し、個々の値が、レジスタに収まるように連結される。
【００３３】
[41]代替的に、乗数および被乗数の値は、レジスタＲ＝Ｎ＊Ｂを満たすためにより大きなオペランドによって指定することができる。Ｂの値は、命令によって指定されるレジスタまたはレジスタのビットフィールドによって、または、オペランドの一部によって指定される指定子ブロックのビットフィールドによって、命令の構成要素として指定することができる。本発明の他の実施形態では、命令は、例えば、符号付き整数、符号なし整数、または浮動小数点値など、乗数オペランドおよび被乗数オペランドのフォーマットを指定するビットフィールドを含む。代替的に、フォーマットは、ビットフィールド、レジスタ内のビット値、またはメモリ内の位置への参照によって指定することができる。
【００３４】
[42]乗算器ｍｍ［ｉ］［ｊ］１９が被乗数ｘ［ｉ］および乗数ｙ［ｊ］を受け取り、外積ｐ［ｉ］［ｊ］を生成する図１に示す乗算器の構成の場合、演算を実施するためのコードの一例は、以下の通りである。
Ｆｏｒｅａｃｈ  ｉ：＝［０．．Ｎ−１］，ｊ：＝［０．．Ｎ−１］
ｐ［ｉ］［ｊ］：＝ｘ［ｉ］＊ｙ［ｊ］；
【００３５】
[43]上記の表記法では、好ましい実施形態は、示されたすべての乗算を一度に実行するのに十分なリソースを有し、ｉおよびｊのすべての値ならびにｉおよびｊに依存する値の計算は、独立して並列に実行されることを理解されたい。代替的に、この並列処理は、上記のＨ×Ｈアレイで記述されているように、物理ハードウェアアレイサイズを反映することができる。
【００３６】
[44]上述したように、乗算結果は通常、レジスタファイルにとって大きすぎる。外積結果をメモリに格納することによって、積はメモリマップ状態として保持される。したがって、プロセッサの通常動作が割り込みまたはコンテクストスイッチによって変更される場合であっても、外積は値をコピーするためのさらなる命令を必要とせずに保持される。
【００３７】
[45]画像処理などのアプリケーションでは、外積値の和を計算することが望ましい。第１のＯｕｔｅｒＰｒｏｄｕｃｔ命令を開始した後、別個の乗数値および／または被乗数値を使用して第２の命令を開始し、その後、その結果を前の外積結果に加算して外積値の和を生成することができる。本発明において、この命令は「ＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ」として参照する。この命令は、同じ方法で入力を指定し、その結果を加算演算の入力値として使用することを指定する、ＯｕｔｅｒＰｒｏｄｕｃｔと同様である。したがって、この命令は２つの外積値の和を計算する。ＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄをさらに使用して、任意の数の外積値を合計することができ、本明細書において合計の深さをＤとする。２つの値の和が個別の値よりも大きくなる可能性があり、Ｄ個の外積値の和が各積に必要な２Ｂビットまたは全体の２Ｂ＊Ｎ２ビットよりも大きい場合があるため、追加のｌｏｇ２Ｄビットが、積の各和、または全体のｌｏｇ２Ｄ＊Ｎ２ビットに対して必要になる場合がある。外積結果がオーバーフローするのを避けるために、そのような値は、黙示的に、例えば、各結果のサイズを倍にして結果サイズを４Ｂ＊Ｎ２にするためにＯｕｔｅｒＰｒｏｄｕｃｔおよびＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ命令によって指定することもできる量Ｅビット分だけ、または、命令のサブフィールド２５、もしくは命令のオペランド、もしくはオペランドの１つのサブフィールドにおいて明示的に、実装態様によって固定された他の何らかの量だけ、拡張することができる。代替的に、外積結果は、Ｅ＜ｌｏｇ２Ｄであるときにオーバーフローの可能性を処理するための範囲内に制限されてもよい。
【００３８】
各乗算の結果が外積ａ［ｉ］［ｊ］の以前の和に加算され、ａ［ｉ］［ｊ］の新しい値が生成されるＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ演算を実装するためのコードの例は以下の通りである。
Ｆｏｒｅａｃｈ  ｉ：＝［０．．Ｎ−１］，ｊ：＝［０．．Ｎ−１］
ｐ［ｉ］［ｊ］：＝ｘ［ｉ］＊ｙ［ｊ］；
ａ［ｉ］［ｊ］：＝ａ［ｉ］［ｊ］＋ｐ［ｉ］［ｊ］；
これらの和は連続する外積から形成されるため、地理的に離れた乗算器間の相互接続のための配線を必要とせずに和を計算することができる。
【００３９】
累積和を計算するためのＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ演算の使用の間に、ａ［ｉ］［ｊ］：＝０を実行する演算、または、代替的に、ａ［ｉ］［ｊ］＝ｘ［ｉ］＊［ｊ］を結果として実行するＯｕｔｅｒＰｒｏｄｕｃｔ演算によって、累算器ａ［ｉ］［ｊ］をクリアすることができる。
【００４０】
[48]図３は、図１に示すアレイの１つのタイル３０をより詳細に示す。各々Ｂビット長である、レジスタ１１ｉおよび１２ｊに格納された乗数オペランドおよび被乗数オペランドは、バスを介して乗算器１６に供給される。乗算器１６は受け取ったオペランドを乗算し、２Ｂビット長の積が累算器１８に供給される。ＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ命令が実行されている場合、加算器３３が、乗算の結果を、累算器１８に格納されておりバス３７を介して加算器３３へと受け取られる既存の和に加算する。乗算および加算は、２Ｂ＋Ｅビットを有する結果を生成する。すべての演算が完了すると、最終結果「Ｒｅｓｕｌｔ」が出力レジスタ３５に供給され、出力レジスタ３５において、結果は、アレイを相互接続するバスに転送される。（マルチプレクサ３８が、タイルのアレイからデータをロードおよびアンロードするために使用される。この動作は以下でさらに説明する。）
【００４１】
[49]図１、図２および図３に示すようなＯｕｔｅｒＰｒｏｄｕｃｔまたはＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ演算は、結果のために異なるアドレスでインターリーブすることができ、外積の複数の和または他の関数の計算が重複して計算されることを可能にする。そのような実施形態では、指定された結果位置の各々を、乗算器アレイ内の１つまたは複数の（Ｋ個の）別個の累算器格納位置ａ［ｉ］［ｊ］［ｋ］にマッピングすることができ、ここで、ｋは０．．．Ｋ−１の範囲の値であり、このようにして、累算器値をプロセッサのメモリシステムにコピーしたり、メモリシステムからコピーしたりすることなく、インターリーブ形式でこれらの演算を進めることができる。同様に、外積の和に対する複数のオペランドを追跡することにより、累算器状態の内容をコピーすることなく外積乗算器および累算器にアクセスするために、プロセッサ内の複数の同時またはインターリーブされた複数の実行スレッドをＫ個以下にすることが可能になる。
【００４２】
[50]オペランドのＫ個のアドレスを追跡することができ、以前に追跡されなかったオペランドアドレスに対して（ＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄとは異なる）ＯｕｔｅｒＰｒｏｄｕｃｔ命令が実行されると、Ｋ個の累算器位置の１つ、例えば、以前に使用されていない、または最低使用頻度のものがこのオペランドアドレスに割り当てられる。さらに、累算器に存在しないオペランドに対してＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ命令が実行される場合、Ｋ個のうちの１組の累算器を割り当てることができる。他の代替の実施形態では、累算器、すなわちＫの値の選択は、命令のサブフィールド２５の命令、レジスタのサブフィールドの命令、メモリ内の命令などによって指定することができる。本発明の別の実施形態では、命令は、少なくとも２つの関連するオペコード、すなわち、外積が生成されることを指定する第１のオペコード、および、外積が前の結果に加算され外積和の累算を形成することを指定する第２のオペコードを指定するできる。本発明の別の実施形態では、累算器は、別個のＯｕｔｅｒＰｒｏｄｕｃｔＣｌｅａｒ命令、または、この演算を他の演算（以下に詳述するＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔなど）と組み合わせる命令によってクリアすることができ、それによって、ＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄだけが繰り返し使用されて、外積和の累算が計算される。
【００４３】
[51]オーバーフローまたは早すぎる丸めを考慮しないで正確な合計を計算するには、外積の累積和の精度をさらに高めることが必要である。しかし、外積の和が計算されると、それらの結果を使用する多くのアルゴリズムは、結果の一部のみを必要とし、丸められ、または、切り捨てられて、より低い精度になる。そのような状況では、ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔという追加の命令を実行して、結果の必要な部分を抽出するか、または、元の累積和よりも低い精度で結果を生成することができる。このような演算は、図３に示すようなオプションの追加回路３９を使用して実施することができる。図３の例のように「抽出（Ｅｘｔｒａｃｔ）」とラベル付けされたそのような回路は、タイルが追加の処理、例えば、累算器１８からの結果の一部の抽出、それらの結果の丸め、または以下に記載されるような他の処理を実行することを可能にする。マルチプレクサの後に他の回路を配置することにより、スイッチング回路３８を介して提供される近くのタイルからの結果をさらに処理することもできることに留意されたい。それが位置する個々のタイルからの結果のみを処理することが所望される場合、このような他の回路３９を累算器１８とスイッチング回路３８との間に配置することができる。また、この他の回路は、アレイの各タイルではなく、アレイのエッジに沿って配置することができる。アレイのエッジに回路３９を配置することによって、累算器からのデータは、アレイからシフトアウトされたときに、丸め、抽出、または他の方法で処理することができる。これにより、より少ない回路３９のコピーの使用が可能になり、アレイ内の回路の複雑さが低減される。
【００４４】
[52]結果の特定の部分の選択または抽出するために使用される方法は、典型的には、ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔ命令のフィールド、例えば、フィールド２５として指定される。ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔ命令によって呼び出される演算は、逆正接または双曲線正接関数などの単項演算をも含むことができ、または、この演算は、負の値をゼロ値（ＲｅＬＵ−正規化線形関数のように）または他の固定値にマップすることができ、かつ／または、結果をより低い精度の浮動小数点値に変換することができる。
【００４５】
[53]ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔ命令は、通常、例えばＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ命令を使用して、外積の和を計算した後に実行される。一実施形態では、ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔ命令は、アレイ内の累算器内の各値に対して実行され、その結果を入力と同じ位置に配置し、それにより上書きする。別の実施形態では、ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔ命令は、演算の入力および出力について別個の位置を指定し、結果のサイズは外積の累積和よりも小さい。別の実施形態では、外積の和のための必要な状態は、２つの部分、すなわち、最終的な抽出結果を含むのに十分に大きい一方の部分、および、必要なサイズの残りの部分を構成する他方の部分に分割することができる。ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔ、ＯｕｔｅｒＰｒｏｄｕｃｔ、およびＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ命令はこのとき、外積の和にアクセスするためにオペランドの両方の部分を指定することができ、結果は、最終的な抽出結果を含むオペランドになる。最終的な抽出結果がオペランド当たりＦビット（全体のＦ＊Ｎ２結果）である場合、追加部分は少なくとも（２Ｂ＋Ｅ−Ｆ）＊Ｎ２ビットになる。代替の実施形態では、追加部分は、ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔ命令の実行時にメモリ割り当てから解放され、不必要にメモリシステムにそれをコピーすることがなくなる。上述したように、ＯｕｔｅｒＰｒｏｄｕｃｔＥｘｔｒａｃｔ演算は、代替の実施形態では、抽出時に累算器値をクリアすることができ、それによって、後続のＯｕｔｅｒＰｒｏｄｕｃｔＡｄｄ命令を使用して外積の後続の和を計算することができる。
【００４６】
[54]本発明のさらなる実施形態では、乗数オペランドの連続する値を一緒に連結してより大きなオペランドにし、同様に、被乗数オペランドの連続する値を一緒に連結して別のより大きなオペランドにする。これらの連結されたオペランドは、通常、メモリシステムに格納される。そのように構成された場合、単一命令は、必要に応じて、オペランド乗数、オペランド被乗数、および外積結果、ならびに必要に応じてＢ、Ｎ、Ｆなどの他のパラメータを指定することができる。上述のように、命令は、外積の和の抽出またはさらなる処理を実行し、その結果を外積の抽出または処理された和と指定することもできる。抽出または処理された外積の和は、外積の累積和よりも小さくなり得る。このように指定された場合、単一命令は複数のクロックサイクルにわたって演算して、全体の演算を実行することができる。代替的に、この演算は、プロセッサの他の演算または命令と並行して実行することができ、この演算の広いオペランド結果を利用またはコピーする演算と同期させることができる。
【００４７】
[55]いくつかのアプリケーションでは、１つの命令によって、外積が前に累積された外積の和の結果に加算されることが望ましく、別個の命令が外積の和の結果をクリアし、または代替的に、それらを固定値に設定する。固定小数点演算でＢビット乗数とＢビット被乗数を１回乗算した結果は、表現するのに２Ｂビットを必要とし、外積にＮ２個の値がある。したがって、外積結果は２Ｂ＊Ｎ２ビットを必要とするため、これらの命令は、結果をレジスタファイル内のレジスタにも、レジスタファイル内の一連のレジスタにも直ちに返すことはできない。この制限を克服するために、例えば命令によって指定されるようにメモリに格納されることによって、追加のプログラム状態として命令間で結果を維持することができる。後に、結果は、外積計算および累算回路の近くの専用格納位置にコピーされ、そこからコピーされることができる。
【００４８】
[56]乗数値および被乗数値がＲビットの汎用レジスタのサイズを超える場合、レジスタの内容をまとめて連結することができる。このとき、各々、一連のＲビット被乗数値のうちの１つおよび一連のＲビット乗数値のうちの１つを使用して、一連の外積乗算を実行することができる。その後、命令で指定されているように、抽出、制限、丸め、切り捨て、正規化などによって、結果のサイズを低減することができる。したがって、単一の命令が、メモリ内の被乗数オペランドおよび乗数オペランドを指定し、処理された外積和結果を返すことができる。
【００４９】
[57]代替の実施形態では、外積命令は、命令のビットフィールド内でこれらのオペランドを個別に指定することができ、または、これらのオペランドを組み込む他のオペランドならびにオペランドのサイズおよびフォーマットなどの他の情報を指定することができる。代替的に、乗数値および／または被乗数値の連続するまたは不連続な部分が、連続する乗数値および／または被乗数値を選択することができる。例えば、乗算器のフィールドの選択は、連続外積乗算において畳み込み演算を実行することができる。
【００５０】
[58]上記の演算のいくつかについては、オペランドをインターリーブ形式でアレイに提示することができる。すなわち、乗数または被乗数として表されるＮ要素ベクトルを、Ｎベクトルまたは行列の値からの単一要素を使用して形成することができる。これらの演算のために、外積アレイに提示されるインターリーブされたオペランドが存在する。図４に示す転置回路は、このインターリービングを提供することができる。この回路では、Ｎ２個の値が、例えばレジスタ１２から１次元に沿ってＮ方向並列性を有する記憶アレイにクロックされ、その後、インターリーブされた形で、レジスタ１１への直交次元に沿ったＮ方向並列性を有するアレイから読み出される。この回路の出力は、入力に対する直交次元のＮ個のオペランドを提供する。したがって、これは、乗算器および被乗数が直交次元で同時にアレイに提示されることを必要とする外積アレイと共に使用することができる。データは、アレイに供給される前に転置され得るか、または転置回路が乗算器アレイ内に埋め込まれ得る。アレイ内に埋め込まれている場合、乗数値および被乗数値は、単一の次元に沿って提示することができ、組み合わせ回路に入るときにオペランドの１つがインターリーブまたは転置される。このインターリーブ回路は遅延を課すため、転置されるべきオペランドは、乗数オペランドおよび被乗数オペランドを乗算器回路で同時に満たすことができるように早期に入力されることが好ましい。
【００５１】
[59]図４は、入力データを転置すること、および並列乗算および累算の結果を転送することを示すためのアレイ１５の一部を示す。図示されたアレイの部分では、アレイタイル４０は、図中の矢印で表されるデータバスによって周囲のタイル４１、４２および４３に結合される。乗算で使用されるデータは、最終的にアレイのすべてのタイルの乗算器にロードされる。これは、すべての行のすべてのタイルがデータを充填されるようにデータをすべての行に並列にクロッキングすることによって、または、一度に１行ずつ連続してデータをロードすることによって、実行することができる。いずれの手法を使用しても、最終的に２つのオペランドがアレイのすべてのタイルにロードされる。
【００５２】
[60]入力データを転置するか、または結果を転送するために、アレイ内の各タイル、例えば、タイル４２は、そのタイルへの２つの入力バス上のデータ間での選択を可能にするための、マルチプレクサ３８（図３参照）またはより一般的にはスイッチング回路３８を含むことが好ましい。タイル４２の場合、マルチプレクサ３８は、制御信号に応答して、バス４４とバス４５との間でデータの受信を選択する。その行のタイルにデータがロードされているとき、マルチプレクサ３８がバス４４上のデータを選択するために使用される。例えば、結果を記憶装置１１に転送するためにデータを上方にシフトさせることが望ましい場合、マルチプレクサ３８を使用してバス４５上のデータを選択する。明らかに、マルチプレクサおよびアレイの各垂直列のタイル間の垂直バスを使用することにより、最終的にアレイ内の計算からのすべてのデータを記憶装置１１にロードすることができる。一番上の行（タイル４２を有する）が充填されると、その行のすべてのデータは、好ましくは並列動作で記憶装置１１にクロックアウトすることができ、そのため、その行のすべてのタイルのデータが同時に転送される。代替の実施形態では、結果データをアレイからその反対側にシフトアウトすることを可能にするために、各列の終わりに追加の記憶装置、例えば、対向する記憶装置１２を設けることができる。
【００５３】
[61]物理レイアウトの考慮事項
【００５４】
[62]典型的には、図１に示すように、集積回路として実装されるアレイのレイアウトは、好ましくは、直交する方向に分散された乗数値および被乗数値を有し、乗算器回路は、個々の乗数値と個々の被乗数値とが対角線状に交差するところ、または、その付近に配置される。累算器回路は、好ましくは、相互接続長を最小限にするために、対応する乗算器回路の近くに配置される。乗算器の結果は桁上げ保存加算器を使用し、冗長形式の積を生成することができ、累算器はこの積を取って同じく桁上げ保存加算器を用いて以前の値に加算することができる。この手法は、全体の結果が生成されるまで、長い桁上げの伝播を避けて、累算全体が桁上げ保存演算で実行することを可能にする。必要に応じて、桁上げ伝播加算器を累算器回路の出力に配置し、回路と組み合わせて結果を丸めることができる。例えば、適切なビット位置で結果に丸めビットを加算した後、結果の下位部分を切り捨てることによって丸めを行うことにより、より少ないビット数で結果を通信することができる。代替の実施形態では、結果の下位部分は、丸めの恩恵なしに単純に切り捨てられる。桁上げの完全な伝播は、結果が、バイナリ表現のための最小ビットを使用して通信されることを提供する。アプリケーションに応じて、出力フィールドへのオーバーフローを回避するために出力の最大値を制限するために回路を利用することもできる。さらに、期待される用途に適切であれば、各累算器に、Ｎ２回の並列処理による結果の各オペランドに対して、単項演算、例えば、逆正接関数または正規化線形ユニット（ＲｅＬＵ）関数を実行するための回路を含めることができる。
【００５５】
[63]適切なアプリケーションでは、丸めまたは他の回路がアレイのエッジに設けられ、例えば、図１のブロック１１および１２内に組み込まれ、Ｎ個の値がＮ２個のアレイから一度に読み取られる。このようにして、丸めまたは他の回路のＮ個のコピーのみが必要とされる。このような回路がすべてエッジに移動した場合、冗長な形の累積結果は各オペランドに対して２＊（Ｅ＋２＊Ｂ）ビットが通信されることを必要とし、別々のワイヤまたは差動ワイヤ対を用いるのと同様に、合計Ｎ＊２＊（Ｅ＋Ｂ）ビットが通信されることを必要とする。第１の手法によってそのような追加のワイヤに必要な電力および面積に依存して、Ｎ２個の乗算器−累算器アレイを有する桁上げ伝播加算器、丸め処理、制限および単項関数回路のいずれかまたはすべてのＮ２またはＮ個のコピーを使用することが好ましい場合がある。さらに、Ｎ個のオペランドから成るセットを返すために２つ以上のサイクルを必要とすることと引き換えに、ワイヤの数を減らすことができる。例えば、結果を返すためにＮ＊Ｂ本のワイヤだけが存在する場合、Ｎ２値は依然として通信され得るが、Ｎ個のオペランドのセット当たりＢサイクルが必要であり、ここでＥ≦Ｂであり、値は冗長形式で累算器から提供される。下記の畳み込み演算の場合、６Ｎ≦ＦＸ＊ＦＹである限り、結果の生成速度は遅くならない。
【００５６】
[64]代替的には、乗算器の出力および／または累算器の出力において部分桁上げ伝播を実行することができる。例えば、桁上げは、バイト内で伝搬され、バイト当たり８＋ｅビットの出力を生成することができる。ここで、ｅは、２つ以上のバイトを一緒に加算する結果生じる、桁上げの追加ビットの数である。桁上げのバイト（左に１ビットシフトする）を和のバイト（シフトされていない）に加算すると、和を表すために２つの追加のビットが必要になり得る。それでも、これらの１０ビットは、完全に冗長な結果が必要とする１６ビットよりも小さい。結果のバイト当たりのワイヤ数が８＋ｅである場合、アレイのエッジに通信されるべきＮ値に対して、サイクル数は、ワイヤの数および桁上げが伝搬される度合いに応じて、Ｎ個のオペランドのセット当たりほぼ３サイクルに返され得る。この代替の実施形態からわかるように、これらの中間値が結果のビット当たり整数本のワイヤで桁上げされる必要はなく、Ｎ個のオペランドのセットを通信するのに必要なサイクル数は、ワイヤを有効に利用する任意の有用な数字であってもよい。
【００５７】
[65]乗数オペランドおよび被乗数オペランドがプロセッサの汎用レジスタのサイズと比較して大きいとき、例えば、オペランドがプロセッサ内で１０２４ビットであり、汎用レジスタサイズが１２８ビットである場合、本発明は、乗算器アレイにわたってこれらのオペランドを送信することに関連する遅延を考慮に入れることができる。上の図は、名目上、乗算器と被乗数が１クロックサイクルでアレイ全体にシフトされると仮定しているが、光速度の伝搬遅延および抵抗容量（ＲＣ）遅延がクロック速度を制限する可能性がある。タイルの各行は、各タイルが隣接するタイルに抵抗的に接続されているＲＣネットワークからなると考えることができ、各タイルが、タイルを接続するバスに容量性負荷を課す。一列に複数のタイルがあることによって、ＲＣ負荷は、データが最初に供給される場所から最も離れたタイルにとって有害になる。
【００５８】
[66]これに対する１つの解決策は、タイルのサブグループ、またはすべてのタイルに対して、タイルのグループ間の信号の増幅、ラッチ、または他の処理を提供することである。この手法を図５に示す。図５は、Ｎ×Ｍの「スーパータイル」５０のセットに分割されたアレイ１０を示す。各スーパータイル５０は、上述のようなｎ×ｍタイル３０のセットに分割される。（１つのタイル３０だけを含むスーパータイル５０の場合、ｎ×ｍは１になることに留意されたい。）各スーパータイル５０には、適切なラッチ、コンバータ、増幅器、信号プロセッサなど５８のセットが関連付けられており、その例は以下に説明する。これらの回路５８は、スーパータイル５０内のタイル３０のグループにこれらの信号を供給する前に、必要に応じて行および列バス上の信号を処理する。そのような処理は、必要に応じて各スーパータイルからの結果信号に提供することもできる。
【００５９】
[67]図６ａ、図６ｂおよび図６ｃは、図５に示す回路５８内に含まれ得る典型的な信号処理を示す。図６ａには、行バス４４とスーパータイル５０との間に増幅回路５１が設けられている。代替的に、１つまたは複数の遅延サイクルを除去して、いくつかの乗算器回路が他のものより早く演算を開始できるようにすることができる。累算器の結果を読み出すときが来ると、累算器から出力へのパスに追加のパイプラインステージを追加することで、これらのサイクルを補償することができる。代替的に、アレイの一部分を早く読み出すことによって、アレイ全体の実効待ち時間を減らすことができる。上述したように、次数Ｎの並列処理でアレイ出力を読み取るためにシーケンス回路が使用される場合、アレイの残りの部分を以前の結果に続く連続した流れで読み取ることができるため、結果的に待ち時間が効果的に低減される。
【００６０】
[68]図６ｂに示されている別の信号処理手法は、到来時にデータを保持するレジスタ５３を各スーパータイル５０に提供し、その後、後のクロック信号に応答してそのデータをタイルに転送することである。図６ｃは、第３の手法を示す。待ち時間を修正し、ＲＣ負荷を克服するために、データ経路にレジスタを挿入して、各スーパータイルに到来する信号の遅延を等しくする。例えば、スーパータイル５０ａは、レジスタ５４、５７および５８の３つのレジスタによってアレイの入力側から分離されている。入力からの遅延のための３つのレジスタ、すなわちレジスタ５６および５８もまた、スーパータイル５０ｂを分離する。同様に、行内の第１のスーパータイル５０ｃと入力との間には、遅延のための３つのレジスタ５５がある。
【００６１】
[69]単一のクロックサイクルにおいて、Ｎ個の値のうちのＧだけが単一のサイクルで送信され得ると仮定される、この問題に対処する代替の手法が使用されてもよい。この距離Ｇは、この代替設計において、単一の受信機だけが伝送線路に負荷を与えるという事実によって、向上させられ得る。これに対処するために、普通なら相手側に到着するであろう値に対して追加のクロック遅延を挿入することができる。この分散ネットワークは、乗算器回路に到達する際に乗数値と被乗数値の両方を等しい量だけ遅延させる。使用する上で説明した技術のどれを選択するかは、アレイのサイズ、意図する用途、およびＲＣ問題の程度に依存する。
【００６２】
[70]代替的なタイル
【００６３】
[71]図７ａ〜図７ｄは、タイル内に転置回路を提供するための代替的な手法を示す。乗算器および累算器（ＭＡＣ）は、これらの図には示されていないが、図３に示されているものに対応する。図７ａにおいて、フリップフロップ７１が、入力データ経路とＭＡＣからの出力との間で選択するために使用されるマルチプレクサ７２を用いて、タイル３０との間でデータをクロックするために使用される。図７ｂでは、２つのフリップフロップ７１が再び使用されるが、異なるクロック信号Ｃ１およびＣ２、ならびに信号ＯＥによって制御され、データ経路を選択するために使用される出力イネーブル回路７３を有する。図７ｃは、図７ｂと同様であるが、バイパスバス７４を用いて入力データが次のタイルに供給される。図７ｄは図７ａと同様であるが、バイパスバス７４も使用する。
【００６４】
[72]図８ａおよび図８ｂは、タイル３０の代替出力回路を示す。図８ａにおいて、フリップフロップ７１は累算器８１からの結果を格納し、それを出力に供給する。図８ｂでは、フリップフロップ７１と出力端子との間に出力イネーブル回路７３が設けられている。
【００６５】
[73]畳み込み演算
【００６６】
[74]ここで説明するプロセッサは、畳み込み演算を実行することもできる。図１に示す乗算器アレイ１０は、入力値を表すＤ次元アレイとフィルタ値を表すＮ個のＤ次元アレイとの間でＮ回の畳み込みを実行し、入力値とフィルタ値との畳み込みを表すＮ個のＤ次元アレイを生成する。代替的に、入力値を表すＮ個のＤ次元アレイの間のＮ回の畳み込みが、フィルタ値を表す１つのＤ次元アレイによって畳み込まれ、入力値とフィルタ値との畳み込みを表すＮ個のＤ次元アレイが生成され得る。これらの演算の一例は、図９に関して以下に説明する。畳み込み演算の対称性は、入力値とフィルタ値とを、ある表記上の差だけで交換することをさらに可能にする。Ｄが２である場合、これらの演算は画像を表すことができる２次元値に対応する。この記述の目的のために、Ｎ個のフィルタ値の次元はＦＸ×ＦＹで表され、入力値の次元はＩＸ×ＩＹである。入力アレイの値を拡張または制限せずに畳み込みの完全なセットが計算された場合の結果Ｒの次元は、ＲＸ×ＲＹとして記述される２次元アレイになり、ここで、ＲＸ＝ＩＸ−ＦＸおよびＲＹ＝ＩＹ−ＦＹである。ＦＸ＊ＦＹ長の和が必要であり、乗算の総量はＲＸ＊ＲＹ＊ＦＸ＊ＦＹ＊Ｎであり、これはＮ２回の乗算を並列に計算し、結果的にＲＸ＊ＲＹ＊ＦＸ＊ＦＹ／Ｎサイクルに加えて累算器からの結果をコピーするための追加のサイクルにおいて畳み込みが実行される。
【００６７】
[75]この演算を実装するコードの例は、以下の通りである。
Ｆｏｒｅａｃｈ  ｋ：＝［０．．ＲＸ−１］，ｌ：＝［０．．ＲＹ−１］，ｍ：＝［０．．Ｎ−１］，ｉ：＝［０．．ＦＸ−１］，ｊ：＝［０．．ＦＹ−１］
Ｒ［ｋ，ｌ，ｍ］：＝Ｒ［ｋ，ｌ，ｍ］：＝ｓｕｍ［Ｉ［ｋ＋ｉ，ｌ＋ｊ］＊Ｆ［ｉ，ｊ，ｍ］］
【００６８】
[76]内部演算ループ（単数の入力値とＮ個のフィルタ値）は、入力値の可変シフト対象から選択された乗数としての単一の１次元ベクトルと、Ｎ個のフィルタ値から選択された、被乗数オペランドにおけるＮ個の値のセットとを表す。連続サイクル内で各フィルタ値にわたって反復することによって、ＦＸ＊ＦＹサイクルを使用して、畳み込み全体の一部を表すＮ２個の和が計算される。具体的には、Ｒ［ｋ，ｌ，ｍ］を含むＮ２合計を計算する単一パスであって、ここで、ｋはｋ．．ｋ＋Ｎ−１（Ｎ≦ＲＸと仮定する）に及び、ｌは範囲［０．．ＲＹ−１］内の特定の値であり、ｍは０．．．Ｎ−１に及ぶ、単一パス上で、ＩアレイからのＮ個の値が各サイクルで選択され、乗数Ｘとして外積和アレイに提示される。
Ｎ＜ＩＸであると仮定すると、これらは、ｉおよびｊの特定の値のフィルタ値Ｆ［ｉ，ｊ，ｍ］と調和するための、ｙ座標におけるｌ＋ｊの共通の値、および、ｘ座標におけるｋ＋ｉ．．ｋ＋ｉ＋Ｎ−１の値を有する連続した値であり、ｍは［０．．．Ｎ−１］からの範囲に及び、これらのフィルタ値は、被乗数Ｙとして外積和アレイに提示される。
【００６９】
[77]この演算を実施するコードの例は、以下の通りである。
Ｆｏｒｅａｃｈ  ｋ：＝［０．．ＲＸ−１，ｂｙ  Ｎ］，ｌ：＝［０．．ＲＹ−１］
Ｆｏｒｅａｃｈ  ｉ：＝［０．．ＦＸ−１］，ｊ：＝［０．．ＦＹ−１］
Ｘ［ｎ］：＝Ｉ［ｋ＋ｉ＋ｎ，ｌ＋ｊ］，ｎ：＝［０．．Ｎ−１］
Ｙ［ｍ］：＝Ｆ［Ｉ，ｊ，ｍ］ｍ：＝［０．．Ｎ−１］
ａ［ｎ，ｍ］：＝ａ［ｎ，ｍ］＋Ｘ［ｎ］＊ｙ［ｍ］，ｎ：＝［０．．Ｎ−１］，ｍ：＝［０．．Ｎ−１］
Ｒ［ｋ＋ｎ，ｌ，ｍ］：＝Ｅｘｔｒａｃｔ［ａ［ｎ，ｍ］］，ｎ：＝［０．．Ｎ−１］，ｍ：＝［０．．Ｎ−１］
【００７０】
[78]畳み込みを表す完全な和は累算器で計算されるため、並列転送と順次転送との組み合わせを使用してアレイからコピーすることができる。例えば、幅Ｂ＊Ｎのデータ経路が利用可能である場合、各サイクルでＮ個の累算器からのＢビットをアレイからコピーすることができる。先に説明したように、累算和の抽出（例えば、丸め、制限および／またはシフトによる）後に計算されるＥ＋２Ｂビットまたはサブフィールドを含む和全体は、アレイからコピーされた結果であってもよい。値全体をコピーするとき、Ｅ＜Ｂである場合、アレイからＮ個の値をコピーするには３サイクルで十分であり、アレイ全体を構成するＮ２個の和のセット全体に対して３Ｎサイクルで十分である。アレイから結果をコピーするための回路は、連続する外積セットの計算と同時に動作し、３Ｎ≦ＦＸ＊ＦＹである限り、追加のサイクルを必要としない。代替の実施形態では、アレイからＮ個の値をコピーするために１サイクルしか必要としない抽出結果が得られる場合、Ｎ≦ＦＸ＊ＦＹである限り、追加のサイクルは必要ではない。
【００７１】
[79]畳み込み演算は、Ｎ個のＤ次元フィルタアレイに対して並列なＮ２回の乗算によって並列に実行されることを示したので、このメカニズムはＮ個を超えるフィルタアレイについて、単純に第１の計算に対してＮ個のフィルタアレイを選択し、第２の計算に対して別のＮ個のフィルタアレイを選択し、以下同様にすることによって、拡張することができることは諒解されるべきである。したがって、この技法は、Ｎよりも多くの数のフィルタアレイに対して拡張することができる。同様に、この技法は、１次元アレイのように、２以外の次元のアレイに対して、ｌおよびｊにわたる反復を削除することによって、または、３もしくはそれ以上の次元については、ＲおよびＦの第３またはそれ以上の次元にわたってさらに連続的に反復することによって、拡張することができる。
【００７２】
[80]コードの微細な変更は、ＲＸ＜Ｎであっても、全アレイを利用することができる。Ｒ［ｋ，ｌ，ｍ］値の計算は独立しているので、Ｘオペランド選択がｎの値に対してｋ＋ｉ＋ｎおよびｌ＋ｊの添え字の適切な修正を選択すること、ここで、ｉ＋ｎ＞ＩＸ、ならびに、Ｒ値出力がｋ＋ｎ＞ＲＸの値についてｋ＋ｎおよびｌの添え字を修正することのみが必要である。
【００７３】
[81]図９は、４つの別個の６点フィルタＦ、Ｇ、ＨおよびＩが１次元の時系列にわたって実行される畳み込み演算の一例を示す。説明のために、４×４の外積アレイのみが示されているが、アレイは所望の大きさにすることができる。垂直面９１、９２、９３、９４、９５および９６は、外積アレイの連続するサイクルを表す。オペランドの交点（図中の小球）は各々、乗算−累算演算を表す。したがって、第１の演算中に、フィルタ値Ｆ５と入力値ｘ０とが乗算される。次の演算中に、フィルタ値Ｆ４と値ｘ１とが乗算され、その後、フィルタ値Ｆ３と入力値ｘ２とが乗算され、以下同様である。面６１、６２、．．．、６６を通って伸びる線ｆｙ０、ｆｙ１、ｆｙ２、およびｆｙ３は、フィルタＦの和を表す。
【００７４】
[82]総和のための他の列が並行して実行される。すなわち、Ｇフィルタの総和ｇｙ０、ｇｙ１、ｇｙ２、およびｇｙ３の次の列が同時に実行される。Ｇ、Ｈ、Ｉフィルタのこれらの総和には、図が判読不能にならないようにラベルが付されていない。始まりの４つの値の初期ロード後、Ｘ入力列に沿って１サイクル当たり１つのみの新しい入力が必要とされる。任意のエッジプロセッサの存在に応じて、その次元に沿ったオプションのシフトレジスタを追加することができる。さらに、必要に応じて、内部乗算器は任意の隣接要素シフトファブリックを使用して値を送信することができる。このようにするには、底部に沿ったブロードキャストを有することによって、１つだけの要素が必要となる。
【００７５】
[83]行列乗算演算
【００７６】
[84]各々少なくとも２次元アレイであり、オペランドの少なくとも１つの次元が１対１に一致する２つの入力オペランドを用いて、乗算器アレイは、行列−行列乗算の部分としてＮ２回の乗算を実行することができる。この演算は、ＤＣ次元を共通とする、第１のオペランド、すなわち、Ｄ１次元アレイと、第２のオペランド、すなわち、Ｄ２次元アレイとを乗算する。結果は、ＤＲ＝Ｄ１＋Ｄ２−ＤＣのようなＤＲ次元のアレイになる。このような操作では、共通でない第１のオペランドの次元（Ｄ１−ＤＣ）の積が少なくともＮであり、共通でない第２のオペランドの次元（Ｄ２−ＤＣ）が少なくともＮである場合、アレイの利用率は１００％になる。このような演算は、結果の各Ｎ×Ｎサブセットについて、第１のオペランドおよび第２のオペランドの対応するＮ個の値のすべてを、共通のすべてのＤＣ次元のサイズに等しい数のサイクルにわたって提示することによって進行し、Ｎ２個の積和が生成される。説明の目的のために、本明細書では、次元ＩＸ×ＩＹの第１の２次元アレイに次元ＦＸ×ＦＹの第２の２次元アレイを乗算した例を示す。ここでＩＹおよびＦＸで示される単一の共通の次元は組み合わされて、外積、すなわち、ＲＸ×ＲＹとして記述される２次元アレイＲを形成する。ここでＲＸ＝ＩＸおよびＲＹ＝ＦＹである。
【００７７】
[85]この演算を実施するコードの例は、以下の通りである。
Ｆｏｒｅａｃｈ  ｋ：＝［０．．ＲＸ−１，ｂｙ  Ｎ］，ｌ：＝［０．．ＲＹ−１，ｂｙ  Ｎ］
Ｆｏｒｅａｃｈ  ｉ：＝［０．．ＩＹ−１］
Ｘ［ｎ］：＝Ｉ［ｋ＋ｎ，ｉ］，ｎ：＝［０．．Ｎ−１］
Ｙ［ｍ］：＝Ｆ［ｉ，ｌ＋ｍ］ｍ：＝［０．．Ｎ−１］
ａ［ｎ，ｍ］：＝ａ［ｎ，ｍ］＋Ｘ［ｎ］＊ｙ［ｍ］，ｎ：＝［０．．Ｎ−１］，ｍ：＝［０．．Ｎ−１］
Ｒ［ｋ＋ｎ，ｌ＋ｍ］：＝Ｅｘｔｒａｃｔ［ａ［ｎ，ｍ］］，ｎ：＝［０．．Ｎ−１］，ｍ：＝［０．．Ｎ−１］
【００７８】
[86]内部演算ループは、第１の入力行列Ｉから選択された乗数としての単一の１次元ベクトルと、第２の入力行列Ｆから選択された被乗数としてのＮ個の値のセットを提示する。ベクトル部分集合を選択する際に共通の次元（または一般的な場合の次元）にわたって反復することによって、ＩＹサイクルを使用して、出力行列Ｒの一部を表すＮ２個の積和が計算される。
【００７９】
[0087]図１０は、行列乗算のためのアレイの使用例を示す図である。この例では、簡略化のために、２つの４×４行列が乗算されているが、アレイのサイズは所望の大きさにすることができる。各垂直面１０１、１０２、１０３、１０４は、乗算器アレイの１つの使用を表す。４つのそのような積み重ねられた面１０１、１０２、１０３、および１０４は、時間的に連続する、そのユニットの４つの連続した使用である。図の左側に沿って、ａ［０］［３］からａ［３］［３］に及ぶ入力被乗数オペランドａ［ｉ］［ｊ］が示されており、図の後ろには、ｂ［０］［０］からｂ［３］［３］に及ぶ乗数オペランドｂ［ｉ］［ｊ］が示されている。これらの入力オペランドは行列であり、図は、４サイクルの４ｘ４乗算器アレイを使用する４ｘ４行列乗算を示している。
【００８０】
[88]ａ［ｉ］［ｊ］オペランドとｂ［ｉ］［ｊ］オペランドとの各交差点は、その位置での１つの乗算−累算演算を表す。垂直線１０５は、図７の下部に示されたｒ［０］［０］からｒ［３］［３］に及ぶ結果ｒ［ｉ］［ｊ］を有する総和方向を表す。
【００８１】
[89]図１０では、総和において時間が流れているため、単一行の入力のみが必要であることに留意されたい。アレイには記憶装置があるが、これは累算器の結果を１サイクルから次のサイクルに桁上げするラッチの形で提供することができる。非常に長い積和を含むニューラルネット処理では、より大きいオペランドを行ごとに供給し、メモリを必要とするより少ない数の累積を時間の経過と共に行うことが有利である。
【００８２】
[90]本発明のこの説明は、例示および説明のために提示されている。網羅的であること、または、記載された厳密な形態に本発明を限定することは意図されておらず、上述の教示に照らして多くの修正形態および変形形態が可能である。実施形態は、本発明の原理およびその実際の応用を説明するために選択され、説明された。この説明により、当業者は、様々な実施形態において、また特定の用途に適した様々な変更形態で、本発明を最も有効に活用し実践することが可能になる。本発明の範囲は、添付の特許請求の範囲によって規定される。
【図１】
2018055677.tif 000005
【図２】
2018055677.tif 000006
【図３】
2018055677.tif 000007
【図４】
2018055677.tif 000008
【図５】
2018055677.tif 000009
【図６ａ】
2018055677.tif 000010
【図６ｂ】
2018055677.tif 000011
【図６ｃ】
2018055677.tif 000012
【図７ａ】
2018055677.tif 000013
【図７ｂ】
2018055677.tif 000014
【図７ｃ】
2018055677.tif 000015
【図７ｄ】
2018055677.tif 000016
【図８ａ】
2018055677.tif 000017
【図８ｂ】
2018055677.tif 000018
【図９】
2018055677.tif 000019
【図１０】
2018055677.tif 000020
【図１１】
2018055677.tif 000021
【外国語明細書】
2018055677000001.pdf