(57)【要約】【課題】効率よく積和演算を行う積和演算装置、積和演算方法、及びシステムを提供する。【解決手段】本実施形態に係る積和演算装置１００は、複数の被乗算要素を格納して、入力データに対して積和演算を実行する複数のメモリブロック１０２であって、１つのメモリブロック１０２は、複数の被乗算要素の同じビット桁の１ビット値を第１のビット値として格納する複数のメモリブロック１０２と、複数の乗算要素から同じビット桁の第２のビット値を抽出することで、入力データを生成する入力データ生成部２０７と、メモリブロックの積和演算に応じた値を累積加算する制御部１０６と、累積加算により得られた累積加算値を、次の積和演算の乗算要素として格納するデータメモリ１０４と、を備えている。【選択図】図１
2020042399.tif 000002
【特許請求の範囲】
【請求項１】
複数の被乗算要素を格納して、入力データに対して積和演算を実行する複数のメモリブロックであって、１つの前記メモリブロックは、複数の前記被乗算要素の同じビット桁の１ビット値を第１のビット値として格納する複数のメモリブロックと、
複数の乗算要素から同じビット桁の第２のビット値を抽出することで、前記入力データを生成する入力データ生成部と、
前記メモリブロックの前記積和演算に応じた値を累積加算する制御部と、
前記累積加算により得られた累積加算値を、次の積和演算の前記乗算要素として格納するデータメモリと、を備えた積和演算装置。
【請求項２】
前記被乗算要素における前記第１のビット値の桁数に応じた第１の桁情報を保持する第１の保持部と、
前記乗算要素における前記第２のビット値の桁数に応じた第２の桁情報を保持する第２の保持部と、をさらに備え、
前記制御部は、前記メモリブロックの前記積和演算での演算値に、前記第１及び第２の桁情報に応じた値を乗じた乗算値を求め、前記乗算値を累積加算する請求項１に記載の積和演算装置。
【請求項３】
前記入力データ生成部が、
前記データメモリからのワード長Ｗ（Ｗは１以上の整数）のデータを格納する入力バッファと、
前記入力バッファに格納されたワード長Ｗのデータから、データ長Ｎ（Ｎは１以上、Ｗ以下の整数）のデータを選択する選択回路と、
前記選択回路で選択されたデータ長Ｎのデータをまとめて、前記メモリブロックに出力する出力バッファと、を備えており、
前記乗算要素の最大データ長をＫ＿maxとし、ｋ（ｋは０以上Ｋ以下の任意の整数であり、Ｋは２の累乗の整数）を乗算要素の桁数とした場合に、前記データメモリの１ワードのｉ番目（ｉは、０以上、Ｗ未満の整数）に格納されるデータａｋｉｎｄｅｘが以下の式（１）を満たす順番で格納されている請求項１に記載の積和演算装置（ただし、ｉ／Ｋ＿max、Ｗ／Ｋ＿max、及び、(ｉ mod Ｋ＿max）／Ｋの値は小数点以下を切り捨てた整数値とする）。
【数２】
2020042399.tif 000004
【請求項４】
前記乗算要素の書き込みアドレスを、設定されたオフセットアドレスに応じてシフトするアドレスシフト部をさらに備えた請求項１に記載の積和演算装置。
【請求項５】
請求項４に記載の積和演算装置と、
前記乗算要素の書き込みアドレスを変え前記積和演算装置の演算結果を評価する評価装置と、を備えた積和演算システムであって、
前記評価装置が、前記前記乗算要素の書き込みアドレスを変えていったときの評価結果に基づいて、前記オフセットアドレスを求める積和演算システム。
【請求項６】
データメモリから複数の乗算要素を読み出すステップと、
複数の被乗算要素の同じビット桁の１ビット値を第１のビット値として格納する複数のメモリブロックから、１つのメモリブロックを選択するステップと。
前記複数の乗算要素から同じビット桁の第２のビット値を抽出することで、入力データを生成するステップと、
前記入力データを、選択された前記１つのメモリブロックに入力するステップと、
前記メモリブロックが、前記第１のビット値と前記第２のビット値とを用いて、積和演算を行うステップと、
メモリブロックの前記積和演算に応じた値を累積加算するステップと、
前記累積加算により得られた累積加算値を、次の積和演算の前記乗算要素として、前記データメモリに格納するステップと、を備えた積和演算方法。
【請求項７】
前記被乗算要素における前記第１のビット値の桁数に応じた第１の桁情報が保持されており、
前記乗算要素における前記第２のビット値の桁数に応じた第２の桁情報が保持されており、
前記メモリブロックの前記積和演算での演算値に、前記第１及び第２の桁情報に応じた値を乗じた乗算値を求め、前記乗算値を累積加算する請求項６に記載の積和演算方法。
【請求項８】
前記入力データを生成するステップでは、
前記データメモリからのワード長Ｗ（Ｗは１以上の整数）のデータを読み出し、
前記ワード長Ｗのデータから、データ長Ｎ（Ｎは１以上、Ｗ以下の整数）のデータを選択し、
選択されたデータ長Ｎのデータをまとめて、前記メモリブロックに出力し、
前記乗算要素の最大データ長をＫ＿maxとし、ｋ（ｋは０以上Ｋ以下の任意の整数であり、Ｋは２の累乗の整数）を乗算要素の桁数とした場合に、前記データメモリの１ワードのｉ番目（ｉは、０以上、Ｗ未満の整数）に格納されるデータａｋｉｎｄｅｘが以下の式（１）を満たすを満たす順番で格納されている請求項６に記載の積和演算方法（ただし、ｉ／Ｋ＿max、Ｗ／Ｋ＿max、及び、(ｉ mod Ｋ＿max）／Ｋの値は小数点以下を切り捨てた整数値とする）。
【数３】
2020042399.tif 000005
【請求項９】
前記乗算要素の書き込みアドレスを、設定されたオフセットアドレスに応じてシフトする請求項６に記載の積和演算方法。
【請求項１０】
前記乗算要素の書き込みアドレスを変えていったときの、前記積和演算の演算結果が評価されており、
前記オフセットアドレスが前記乗算要素の書き込みアドレスを変えていったときの評価結果に基づいて、求められている請求項９に記載の積和演算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は積和演算装置、積和演算方法、及びシステムに関する。
【背景技術】
【０００２】
ＤＮＮ（Ｄｅｅｐ  Ｎｅｕｒａｌ  Ｎｅｔｗｏｒｋ）において、多数の要素の積和演算が処理時間の支配的な要因として知られている。非特許文献１には、メモリアレイ内部で積和演算を行う技術が提案されている。非特許文献１では、メモリセルアレイ構成を利用し、縦方向に共通化されたビット線に対して、複数のメモリセルを同時に駆動して、充放電させている。このようにすることで、複数の乗算結果を同時に加算する構成となっている。
【０００３】
一般的にメモリセルアレイへのアクセスを行うワード線の入力は０／１のデジタル値であり、１ビット入力による積和演算は一般物体認識などのアプリケーションにおいて、認識精度の低下を引き起こす可能性がある。そこで、多値ビット入力による積和演算を行うことで認識精度を向上させることができる。但し、通常のメモリセルアレイでは多値ビットを入力とした演算に対応するためにはメモリサイズを増加させる必要がある。例えば、符号なし４ビットの多値入力に対応させるためには、同一ビット線方向２４＝１６個のセルに対して被乗算要素を格納することとなる。特許文献１では、多値ビット入力に対応させるため、入力部にＤＡＣ(Digital to Analog Converter)を設けている。そして、ワード線に与える電圧を多値ビットに対応するようにアナログ値として制御することで多値入力での乗算処理を表現している。
【０００４】
特許文献１には、ＤＮＮを対象としたデジタルのアーキテクチャレベルの技術が開示されている。特許文献１では、入力データ部にシフトレジスタが設けられている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１７−７９０１７号公報
【非特許文献】
【０００６】
【非特許文献１】In-Memory Computation of a Machine-Learning Classifier in a Standard 6T SRAM Array
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ところで、ＤＮＮアルゴリズムの特徴の一つとして、同じデータを何度も繰り返しアクセスする点が挙げられる。このため、特許文献１では、上記のシフトレジスタを用いることによってデータをローカルのレジスタで再利用している。これにより、メインメモリへのアクセス回数を削減し、冗長なメモリアクセスやそれに関わる電力オーバーヘッド等を抑えることができる。また、特許文献１では、積和演算時に累積加算する要素を乗算するタイミングをずらし、シフトさせながら累積加算する方法を取っている。
【０００８】
特許文献１では、累積加算の要素となる乗算を行うタイミングをずらしている。しかしながら、特許文献１で示された同時に積和演算を行う非特許文献１のような積和演算アレイに適用することは困難である。
【０００９】
非特許文献１において多ビット演算を行う場合、メモリの入力部にＤＡＣ等の回路が必要となる。メモリアレイ内部での積和演算における電力効率は高まるが、メモリアレイへの入力データを生成する際、エネルギーを消費する問題がある。また、積和演算をメモリセルアレイで実行する場合、多数のワード線を同時に駆動する必要がある。このため、アレイの列ごとにＤＡＣ回路が必要となり、消費エネルギー増の他、面積オーバーヘッドの増加につながる。さらに、アナログ入力による演算は、演算結果がばらつきの影響を受けやすく、演算結果の信頼性低下につながる問題が発生する。すなわち、ＤＡＣ回路を用いて多値ビットに対応させた場合でも、アプリケーション上の認識精度を向上に繋がらないおそれがある。
【００１０】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１１】
一実施の形態によれば、積和演算装置は、複数の被乗算要素を格納して、入力データに対して積和演算を実行する複数のメモリブロックであって、１つの前記メモリブロックは、複数の前記被乗算要素の同じビット桁の１ビット値を第１のビット値として格納する複数のメモリブロックと、複数の乗算要素から同じビット桁の第２のビット値を抽出することで、前記入力データを生成する入力データ生成部と、を備えている。
【発明の効果】
【００１２】
前記一実施の形態によれば、効率よく積和演算を行うことができる。
【図面の簡単な説明】
【００１３】
【図１】本実施の形態１にかかる積和演算装置の構成を示すブロック図である。
【図２】制御部の構成を示すブロック図である。
【図３】デコーダの構成を示すブロック図である。
【図４】メモリブロック間のデータ格納方式を説明するための図である。
【図５】メモリブロックの演算フローを示す図である。
【図６】メモリブロックの演算フローにおける各ステップでのビット桁、及びブロックアドレスを示す表である。
【図７】メモリブロック内の演算を示す図である。
【図８】入力データ生成部での処理を説明するための図である。
【図９】比較例にかかる入力データ生成部を示す図である。
【図１０】実施の形態２に係る入力データ生成部を示す図である。
【図１１】Ｋ＝２ビットの場合のメモリブロックの演算フローを示す図である。
【図１２】Ｋ＝２ビットの場合の乗算要素のビット桁と、ブロックアドレスを示す表である。
【図１３】Ｋ＝１ビットの場合のメモリブロックの演算フローを示す図である。
【図１４】Ｋ＝１ビットの場合の乗算要素のビット桁と、ブロックアドレスを示す表である。
【図１５】実施の形態３にかかるシステムを示すブロック図である。
【図１６】アドレスをシフトして、最適アドレスを求める処理を説明するための図である。
【図１７】最適アドレスを求めるための処理を示すフローチャートである。
【図１８】実施の形態３におけるデコーダを示すブロック図である。
【図１９】その他の実施の形態にかかる積和演算装置を示すブロック図である。
【発明を実施するための形態】
【００１４】
説明の明確化のため、以下の記載及び図面は、適宜、省略、及び簡略化がなされている。また、様々な処理を行う機能ブロックとして図面に記載される各要素は、ハードウェア的には、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、メモリ、その他の回路で構成することができ、ソフトウェア的には、メモリにロードされたプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。なお、各図面において、同一の要素には同一の符号が付されており、必要に応じて重複説明は省略されている。
【００１５】
以下の説明では、乗算要素と被乗算要素とに対して積和演算を行う積和演算装置、及び積和演算方法について説明を行う。例えば、積和演算装置は、ＣＮＮ(Convolution Neural Network)に用いられる重み付けパラメータを被乗算要素とし、入力データを乗算要素とする。被乗算要素は、ディープラーニングなどの機械学習によって、得られた値である。乗算要素は、例えば、カメラ等のセンサで検出された検出データに基づいて得られた特徴量等である。
【００１６】
乗算要素と被乗算要素は、それぞれ、多ビット又は１ビットのデータである。積和演算装置は、複数の乗算要素と複数の被乗算要素との積和演算を実行する。そして、積和演算により得られた値が、ＣＮＮの次の層の積和演算に用いられる乗算要素となる。
【００１７】
例えば、積和演算装置は、１回の積和演算において、ｍ個（ｍは２以上の整数）の被乗算要素と、ｍ個の乗算要素の積和演算を行う。つまり、積和演算装置は、ｍ個の乗算要素を、対応するｍ個の被乗算要素のデータに乗じて、ｍ個の積を求める。そして、積和演算装置は、ｍ個の積の総和を、積和演算値として求める。この積和演算値が、次の積和演算の乗算要素となる。例えば、積和演算値が、ＣＮＮの次の層の積和演算に用いられる。このようにして、積和演算装置は、積和演算を繰り返し行う。そのため、本実施の形態では、積和演算装置は、積和演算を行うメモリブロックを複数備えている。
【００１８】
実施の形態１
実施の形態１にかかる積和演算装置１００の構成について、図１を用いて説明する、図１は、積和演算装置１００の構成を示すブロック図である。積和演算装置１００は、メモリセル１０１と、メモリブロック１０２と、ブロックアレイ１０３と、データメモリ１０４と、デコーダ１０５と、制御部１０６と、命令メモリ１０７とを備えている。
【００１９】
メモリセル１０１は、被乗算要素のビットデータを格納する。具体的には、１つのメモリセル１０１は、１ビットのデータを格納する。メモリセルは例えば、ＳＲＡＭ（Static Random Access Memory）、フラッシュメモリ、ＭＲＡＭ（Magnetoresistive Random Access Memory）、ＲｅＲＡＭ（Resistive Random Access Memory）、ＦｅＲＡＭ（Ferroelectric Random Access Memory）等のメモリセルを用いることが可能である。
【００２０】
メモリブロック１０２は、複数のメモリセル１０１を備えている。メモリブロック１０２では、メモリセル１０１がアレイ状に配置されている。メモリブロック１０２は、複数のワード線、及び複数のビット線を備えている。さらに、メモリブロック１０２は、積和演算機能を有している。具体的には、メモリブロック１０２は、メモリセルのデータに同時にアクセスする機能を備えており、複数のメモリセル１０１の格納データを読み出す機能を備えている。さらに、それぞれのメモリブロック１０２は、ビット線電位に対応する出力値をデジタル値に変換するＡ／Ｄ（Ａｎａｌｏｇ  ｔｏ  Ｄｉｇｉｔａｌ）変換器などを備えている。
【００２１】
それぞれのメモリブロック１０２は、複数の被乗算要素の同一桁のデータをまとめて格納している。したがって、１つのメモリブロック１０２は、積和演算に用いられる被乗算要素の同じ桁のデータを格納する。
【００２２】
ブロックアレイ１０３は、複数のメモリブロック１０２を備えている。なお、図１では、３×３、つまり９個のメモリブロック１０２を備えているが、ブロックアレイ１０３に含まれるメモリブロック１０２の数は特に限定されるものではない。
【００２３】
データメモリ１０４は、乗算要素を格納するメインメモリである。データメモリ１０４は、データの読み出し機能と書き込み機能とを備えている。データメモリ１０４は、メモリブロック１０２の演算結果に基づく積和演算値を次の積和演算の乗算要素として格納する。
【００２４】
デコーダ１０５は、データメモリ１０４から複数の乗算要素を受け取る。そして、デコーダ１０５は、複数の乗算要素の同一桁の値を選択して、入力データとする。デコーダ１０５は、指定されたアドレスのメモリブロック１０２に入力データを出力する。入力データは複数の乗算要素に含まれる同一桁から構成される。例えば、入力データは１回の積和演算に用いられる乗算要素の数に対応するビット数のデータから構成される。
【００２５】
制御部１０６は、積和演算装置１００の全体を制御する。具体的には、データメモリ１０４から乗算要素のデータを読み出す。制御部１０６は、データメモリ１０４から読み出したデータをデコーダ１０５に供給する。制御部１０６はデコーダ１０５が選択する乗算要素の桁を制御する。さらに、制御部１０６は、ブロックアドレスや入力データの選択を制御する。制御部１０６は、入力データが供給されるメモリブロック１０２のブロックアドレスを指定するための情報をデコーダ１０５に出力する。さらに、制御部１０６は、メモリブロック１０２から積和演算結果である演算値を受け取る。
図２は、制御部１０６の構成を示すブロック図である。制御部１０６は、コントローラ１０６１と、書き込みデータ生成部１０６４と、累積加算器１０６３と、ビットシフタ１０６２とを備えている。コントローラ１０６１は積和演算装置１００の全体を制御するものである。ビットシフタ１０６２は、メモリブロック１０２から受け取った演算値を乗算要素と被乗算要素の桁に応じてシフト演算を行い、累積加算器１０６３に供給する。累積加算器１０６３は前ステップまでの累積加算値に対して、ビットシフタ１０６２の値を加算し、保存する。そして、制御部１０６は、全ての桁の積和演算が終了すると、指定された乗算要素の桁と演算値に基づいて、書き込みデータを書き込みデータ生成部１０６４にて生成する。制御部１０６は、データメモリ１０４の指定アドレスに、書き込みデータを書き込む。データメモリ１０４に書き込まれた書き込みデータが次の積和演算の乗算要素となる。
【００２６】
命令メモリ１０７は、乗算要素のビット数、及び被乗算要素のビット数を格納する。命令メモリ１０７は、データメモリ１０４の書き込みアドレス、及び読み出しアドレスを格納する。命令メモリ１０７は、メモリブロック１０２のアドレス情報を格納する。制御部１０６は、命令メモリ１０７に格納されたビット数やアドレス等のデータを順番に読み出す。そして、制御部１０６は、ビット数やアドレス等のデータに基づいて、積和演算に関する制御を行う。これにより、制御部１０６が適切なブロックアドレスのメモリブロック１０２に適切な入力データを供給することができる。
【００２７】
次に、図３を用いて、デコーダ１０５について説明する。図３は、デコーダ１０５の構成を示すブロック図である。デコーダ１０５は、第２ビットカウンタ２０２と、第１ビットカウンタ２０３と、アドレス保持部２０４と、ブロックアドレス生成部２０５と、セレクタ２０６と、入力データ生成部２０７と、を備えている。
【００２８】
第１ビットカウンタ２０３は、被乗算要素のビット桁（単に桁ともいう）に応じた第１のビット桁情報を保持する第１の保持部である。第２ビットカウンタ２０２は、乗算要素のビット桁に応じた第２のビット桁情報を保持する第２の保持部である。アドレス保持部２０４は、データメモリ１０４から読み出された乗算要素のメモリアドレスを保持する。ブロックアドレス生成部２０５は、メモリアドレスと第１のビット桁情報とを参照して、メモリブロックを指定するブロックアドレスを生成する。ブロックアドレス生成部２０５は、ブロックアドレスをセレクタ２０６に出力する。
【００２９】
入力データ生成部２０７は、データメモリ１０４からの乗算要素を一時的に保持する。そして、入力データ生成部２０７は、乗算要素のビット数、及びメモリアドレスに基づいて、乗算要素をビット桁ごとに分割する。そして、入力データ生成部２０７は、乗算要素のビット桁を選択して、指定されたメモリブロックへの入力データを生成する。入力データは、複数の乗算要素の同一ビット桁のデータの集合となる。つまり、入力データ生成部２０７複数の乗算要素から同じビット桁のデータを抽出して、入力データとして、セレクタ２０６に出力する。
【００３０】
セレクタ２０６は、入力データ生成部２０７からの入力データを該当するメモリブロック１０２に出力する。つまり、セレクタ２０６は、ブロックアドレス生成部２０５で生成されたブロックアドレスのメモリブロック１０２に、入力データを出力する。
【００３１】
図４は、メモリブロック１０２における被乗算要素のデータ格納方式を示す。図４では、被乗算要素が４ビットデータである例を示している。ここで、ａｉは、乗算要素の１つのデータであり、ｗｊｉが被乗算要素の１つのデータである。なお、ｉは、１〜ｍまでの任意の整数であり、ｊは１〜ｎの任意の整数となっている。１回の積和演算において、ｍ個（ｍは２以上の整数）の被乗算要素と、ｍ個の乗算要素の積和演算を行う。つまり、ｍ個の乗算要素を、対応する被乗算要素に乗じて、ｍ個の積を求める。ｍ個の積の総和が、ｗｊ，ｉとａｉの積和演算により求められた１つの積和演算値ｏｊとなる。
【００３２】
ｗｎ，ｉは、４ビットデータであり、０〜３のビット桁（単に桁とも称する）のデータで構成されているとする。ｗｎ，ｉにおいて、０桁目のデータをｗ０ｎ，ｉとし、１桁目のデータをｗ１ｎ，ｉとし、２桁目のデータをｗ２ｎ，ｉとし、３桁目のデータをｗ３ｎ，ｉとする。なお、ｗｊ，ｉもｗｎ，ｉと同様に示すことができる。
【００３３】
各桁のデータは、１ビットであるため、ｗｋｎ，ｉは、０又は１のどちらかを示す。なお、ｋはビット桁を示す値であり、０〜３までの任意の整数である。ｗｎ，ｉは以下の式で示される。
ｗｎ，ｉ＝２３・ｗ３ｎ，ｉ＋２２・ｗ２ｎ，ｉ＋２１・ｗ１ｎ，ｉ＋２０・ｗ０ｎ，ｉ
【００３４】
ｗｊ，ｉは、ビット桁に応じて、異なるメモリブロック１０２に格納されている。例えば、１つのメモリブロック１０２は、３桁目のデータｗ３１，１〜ｗ３ｎ，ｍ、つまり、ｍ×ｎ個の１ビッデータを格納している。ｗ３１，１〜ｗ３ｎ，ｍ、を一般化して、ｗ３ｉ，ｊと示す。次のメモリブロック１０２は、２桁目のデータｗ２ｉ，ｊ（つまり、ｗ２１，１〜ｗ２ｎ，ｍ）を格納している。その他の２つのメモリブロック１０２は、１桁目のデータｗ１ｉ，ｊ（つまり、ｗ１１，１〜ｗ１ｎ，ｍ）と、０桁目のデータｗ０ｉ，ｊ（つまり、ｗ０１，１〜ｗ０ｎ，ｍ）をそれぞれ格納している。１つのメモリブロック１０２は、（ｎ×ｍ）個の１ビットデータ、つまり、（ｎ×ｍ）ビットのデータを格納している。
【００３５】
このため、１つのメモリブロック１０２は、（ｍ×ｎ）個のメモリセル１０１を備えており、それぞれのメモリセル１０１が１ビットのデータを格納する。１つのメモリブロック１０２は、ｎ本のビット線１０２ｂと、ｍ本のワード線１０２ｗを備えている。１本のビット線１０２ｂに対応するｍ個のセルに、ｍ個の被乗算要素の同じビット桁のデータが格納されている。例えば、図４は、被乗算要素ｗ３１，１〜ｗ３ｎ，ｍを格納するメモリブロック１０２を示している。図４に示すように、１本目のビット線１０２ｂに対応するメモリセル１０１には、ｗ３１，１〜ｗ３１，ｍが格納されている。本構成において、ｍ個の乗算要素の入力に対して、メモリブロック１０２がｎ行の被乗算要素との積和演算を同時に行うため、（ｍ×ｎ）個の積和演算が同時に実行されることとなる。
【００３６】
ｍ本のワード線１０２ｗから、ｍ個の乗算要素の同じビット桁のデータがまとめてメモリセル１０１に供給される。この時、乗算要素の値に１が格納されている行のワード線が駆動され、被乗算要素が保存されたメモリセルの値に応じてビット線に対して充放電が行われる。乗算要素の値に０が格納されている行のワード線は駆動されず、被乗算要素が保存されたメモリセルの値に関わらず、ビット線に対する充放電は発生しない。このようにすることで、１回の積和演算に用いられるｍ個の被乗算要素の同じビット桁のデータｗ３１，１〜ｗ３１，ｍ対して、ｍ個の乗算要素の同じビット桁のデータを同時に供給することができる。図示しない読み出し回路が、ビット線電位を読み出して、Ａ／Ｄ変換を行う。そして、デジタル値を制御部１０６に出力する。
【００３７】
このように、１つの被乗算要素が桁毎に異なるメモリブロック１０２に格納される。１つの被乗算要素が４ビットのデータである場合、１つの被乗算要素が、４つのメモリブロック１０２に分散して格納されている。なお、一般的なメモリ格納形式の場合、データ単位（積和演算における乗算の１要素単位）で同一のメモリブロックにデータを格納する。異なるブロックに一つの被乗算要素データを桁毎に分散して格納すると、デジタル演算器ベースの使用方法において複数回のアクセスと冗長なデータの読出しが発生するためである。したがって、一般的には、４ビット形式で保存したデータは同一のメモリブロックに格納される。
【００３８】
図５〜図８を用いて、メモリブロックでの演算処理について説明する。図５は、メモリブロックにおける積和演算のフローを示す図である。図６は、ステップ毎のブロックアドレスとビット桁を示す表である。図７は、１つのメモリブロック１０２における演算を示す図である。図８は、デコーダで生成される入力データを示す図である。
【００３９】
なお、以下の説明では、１つの乗算要素ａｉが４ビットデータであるとしている。ａｉは０〜３のビット桁のデータで構成されているとする。ａｉにおいて、０桁目のデータをａ０ｉとし、１桁目のデータをａ１ｉとし、２桁目のデータをａ２ｉとし、３桁目のデータをａ３ｉとする。ａｋｉは、０又は１のどちらかを示す。なお、ｉは１〜ｍの任意の整数であり、ｋは０〜３までの任意の整数である。ａｉは以下の式で示される。
ａｉ＝２３・ａ３ｉ＋２２・ａ２ｉ＋２１・ａ１ｉ＋２０・ａ０ｉ
【００４０】
ここでは、図５に示すように、ブロックアレイ１０３が、９個のメモリブロック１０２を備えており，それらのブロックアドレスが０〜８であるとする。そして、ブロックアドレス３のメモリブロック１０２は、被乗算要素ｗｊ，ｉの０桁目のデータｗ０ｊ，ｉを格納している。ブロックアドレス４のメモリブロック１０２は、被乗算要素ｗｊ，ｉの１桁目のデータｗ１ｊ，ｉを格納している。同様に、ブロックアドレス５、６のメモリブロック１０２は、被乗算要素ｗｊ，ｉの２桁目のデータｗ２ｊ，ｉ、及び３桁目のデータｗ３ｊ，ｉをそれぞれ格納している。
【００４１】
乗算要素のビット桁をｃ、被乗算要素のビット桁をｄとする。ｃ、ｄはそれぞれ、０以上の整数である。ここでは、乗算要素、及び被乗算要素が４ビットであるため、ｃ、ｄは、それぞれ０，１、２，又は３となる。被乗算要素及び乗算要素が４ビットのデータであるため、積和演算装置１００は、１６回（＝４×４）のステップ（以下、ステップ１〜ステップ１６）を繰り返す。つまり、１回の積和演算が、１６回のステップに時分割されて実行される。
【００４２】
まず、ステップ１では、図８に示すように、デコーダ１０５は、複数の乗算要素ａｉの０ビット目のデータａ００〜ａ０ｍをまとめた入力データを生成する。ｍ個のデータａ００〜ａ０ｍをまとめて、入力データａ０ｉとする。デコーダ１０５はブロックアドレス３のメモリブロック１０２に、入力データａ０ｉを出力する。ブロックアドレス３のメモリブロック１０２は、ａ０ｉとｗ０ｊ，ｉとの積和演算結果（第１のステップ演算値Ｏ０＿０１とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第１のステップ演算値Ｏ０＿０１に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値を求める。乗算値は累積加算器１０６３に加算される。制御部１０６は、累積加算器１０６３において乗算値を累積加算値として保存する。ステップ１での累積加算値はＯ０＿０１である。
【００４３】
ステップ２では、ステップ１と同様に、データａ００〜ａ０ｍが入力データとなる。デコーダ１０５はブロックアドレス４のメモリブロック１０２に、入力データａ０ｉを出力する。ブロックアドレス４のメモリブロック１０２は、ａ０ｉとｗ１ｊ，ｉとの積和演算結果（第２のステップ演算値Ｏ０＿１１とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第２のステップ演算値Ｏ０＿１１に、乗算要素のビット桁ｃ（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝１）に応じた値（２＝２ｄ）を乗じて、乗算値ｃｄＯ０＿１１を求める。そして、制御部１０６は、累積加算器１０６３において乗算値ｃｄＯ０＿１１を第１のステップでの累積加算値に加算して、累積加算値を更新する。ステップ２での累積加算値は、２×Ｏ０＿１１＋Ｏ０＿０１となる。
【００４４】
ステップ３では、ステップ１、２と同様に、データａ００〜ａ０ｍが入力データとなる。デコーダ１０５はｗ２ｊ，ｉを格納しているブロックアドレス５のメモリブロック１０２に、入力データａ０ｉを出力する。ブロックアドレス５のメモリブロック１０２は、ａ０ｉとｗ２ｊ，ｉとの積和演算結果（第３のステップ演算値Ｏ０＿２１とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第３のステップ演算値Ｏ０＿２１に乗算要素のビット桁ｃ（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝２）に応じた値（４＝２ｄ）を乗じて、乗算値ｃｄＯ０＿２１とする。そして、制御部１０６は、累積加算器１０６３において乗算値ｃｄＯ０＿２１を第２のステップでの累積加算値に加算して、累積加算値を更新する。ステップ３での累積加算値は、４×Ｏ０＿２１＋２×Ｏ０＿１１＋Ｏ０＿０１となる。
【００４５】
ステップ４では、ステップ１、２と同様に、データａ００〜ａ０ｍが入力データとなる。デコーダ１０５はｗ３ｊ，ｉを格納しているブロックアドレス６のメモリブロック１０２に、入力データａ０ｉを出力する。ブロックアドレス６のメモリブロック１０２は、ａ０ｉとｗ３ｊ，ｉとの積和演算結果（第４のステップ演算値Ｏ０＿３１とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第４のステップ演算値に乗算要素のビット桁ｃに応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝３）に応じた値（８＝２ｄ）を乗じて、乗算値ｃｄＯ０＿３１とする。そして、制御部１０６は、累積加算器１０６３において乗算値ｃｄＯ０＿３１を第３のステップでの累積加算値に加算して、累積加算値を更新する。ステップ４での累積加算値は、８×Ｏ０＿３１＋４×Ｏ０＿２１＋２×Ｏ０＿１１＋Ｏ０＿０１となる。
【００４６】
ステップ５では、デコーダ１０５は、複数の乗算要素ａｉの０ビット目のデータａ１０〜ａ０ｍをまとめた入力データを生成する。ｍ個のデータａ１０〜ａ１ｍをまとめて、入力データａ１ｉとする。デコーダ１０５はｗ０ｊ，ｉを格納しているブロックアドレス３のメモリブロック１０２に、入力データａ１ｉを出力する。ブロックアドレス３のメモリブロック１０２は、ａ１ｉとｗ０ｊ，ｉとの積和演算結果（第５のステップ演算値Ｏ１＿０１とする）を制御部１０６に出力する。
【００４７】
制御部１０６は、ビットシフタ１０６２において第５のステップ演算値Ｏ１＿０１に乗算要素のビット桁ｃ（ｃ＝１）に応じた値（２＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値ｃｄＯ１＿０１とする。そして、制御部１０６は、累積加算器１０６３において乗算値ｃｄＯ１＿０１を第４のステップでの累積加算値に加算して、累積加算値を更新する。ステップ５での累積加算値は、２×Ｏ１＿０１＋８×Ｏ０＿３１＋４×Ｏ０＿２１＋２×Ｏ０＿１１＋Ｏ０＿０１となる。
【００４８】
以下、積和演算装置１００は、上記の処理をステップ１６まで繰り返し行う。図６は、ステップ１〜１６における乗算要素のビット桁と、ブロックアドレスを示している。図６に示すビット桁とブロックアドレスに従って、ステップ６〜１６が実施される。また、制御部１０６は、ビットシフタ１０６２において各ステップでの積和演算結果Ｏｃ＿ｄｊに、乗算要素のビット桁ｃに対応する値（２ｃ）と、被乗算要素のビット桁ｄに対応する値（２ｄ）とを乗じて、乗算値を求めている。そして、制御部１０６は、累積加算器１０６３において乗算値を累積加算して、累積加算値を上書き保存する。ステップ１６までの処理が完了した後、制御部１０６は、書き込みデータ生成部１０６４にて、累積加算結果を乗算要素の最大ビット桁のデータに変換し、データメモリ１０４に保存する。積和演算装置１００は、積和演算と累積加算を繰り返すことによって、メモリブロック１０２を用いた多値ビットでの積和演算を実現する。
【００４９】
上記の処理を行うため、デコーダ１０５は、ｍ個の乗算要素の同じビット桁となるｍ個の１ビットデータを抽出して、入力データとする。ｍビットデータである入力データは、メモリブロック１０２の列方向に並べられて、メモリブロック１０２に供給される。
【００５０】
メモリブロック１０２の列方向には、被乗算要素の同じビット桁のデータが格納されている。そして、メモリブロック１０２の列方向に複数の乗算要素の同じビット桁のデータが入力される。メモリブロック１０２は、被乗算要素のあるビット桁と、乗算要素のあるビット桁のデータの積和を取る。そして、メモリブロック１０２は、ビット桁の組み合わせを順番に変えていくことで、積和を繰り返し求めている。さらに、積和にビット桁に応じた値を乗じた乗算値の総和が、次の層の積和演算の乗算要素となる。このようにすることで、畳み込み演算のための積和演算を効率よく行うことができる。積和演算装置１００は、次の乗算要素を用いて、同様に積和演算を行う。
【００５１】
本実施形態では、被乗算要素をビット桁毎に分割して、各ビットを異なるメモリブロックに保存している。さらに、入力データとなる乗算要素を桁毎に分割して、各桁のデータを時分割でメモリブロック１０２に供給している。これにより、メモリブロックを用いた多値ビットの積和演算を実現することができる。
【００５２】
この構成を用いることで、メモリ素子を用いた積和演算回路アレイを含むプロセッサに対して、デジタル表現のまま多値入力データを生成することができる。よって、ＤＡＣ等の追加コスト無しで多ビットの積和演算が実現可能となる。例えば、メモリブロックに入力データを入力する入力段において、ＤＡＣを設ける必要がなくなる。
【００５３】
上記の説明では、被乗算要素、及び乗算要素の各桁のデータを降順に処理する例を説明したが、データの処理する順番は特に限定されるものではない。例えば、デコーダ１０５が、被乗算要素、及び乗算要素の各桁のデータを降順に処理されるように、データをブロックアレイ１０３に供給してもよい。具体的には、被乗算要素の桁を降順に処理する場合、入力データが被乗算要素の３桁目のデータを格納するメモリブロック１０２に供給された後、２桁目のデータを格納するメモリブロック１０２に供給されればよい。また、乗算要素の桁を降順に処理する場合、デコーダが、複数の乗算要素の３桁目のデータを入力データとして生成した後、２桁目のデータを入力データとして生成すればよい。
【００５４】
また、本実施の形態では、乗算要素、及び被乗算要素のデータが４ビットデータであるとして説明したが、これらのデータは４ビットに限られるものではない。被乗算要素を格納するブロックメモリを増やすことで、被乗算要素の桁数を任意に拡張する事が可能である。また、入力とする乗算要素のビット数も時分割数（ステップ数）を増やすことで任意に拡張可能であり、同一のハードウェア構成を用いながら、アプリケーション毎に認識精度や処理速度に応じて最適なビット数を設定可能となる。
【００５５】
実施の形態２．
本実施の形態では、データメモリ１０４の保存形式と、入力データ生成部２０７の構成とが実施の形態１と異なっている。なお、データメモリ１０４の保存形式と入力データ生成部２０７以外の基本的な構成は、実施の形態１と同様である。例えば、メモリブロック１０２におけるデータの保存形式は、実施の形態１と同様である。実施の形態１と同様の内容については、適宜説明を省略する。
【００５６】
本実施の形態では、データメモリ１０４の保存形式を改良し、ビットスケーラビリティを実現している。さらに、デコーダ１０５の回路構成を簡素化して、面積・速度について改善させることができる。図９は、比較例にかかる入力データ生成部２０７の構成を示すブロック図である。図１０は、実施の形態２にかかる入力データ生成部２０７の構成を示すブロック図である。
【００５７】
入力データ生成部２０７は、入力バッファ３０１と、選択回路３０２と、出力バッファ３０３と、を備えている。ここで、入力バッファ３０１のサイズは、１６ビットとなっており、出力バッファ３０３のサイズが４ビットとなっている。以下、乗算要素のビット長Ｋ＝１、２、４ビットと変える場合について説明する。
【００５８】
入力バッファ３０１には、データメモリ１０４からの乗算要素のデータが入力される。入力バッファ３０１は、乗算要素の各ビット桁のデータを格納する。データメモリの保存形式に応じた順番で入力バッファ３０１がデータを格納している。図９、図１０では、Ｋ＝１、２、４とした場合のデータメモリ１０４内における１６ビットのデータの格納順が示されている。
【００５９】
選択回路３０２は、入力バッファ３０１に入力されたデータを選択して、出力バッファ３０３に出力する。選択回路３０２は、入力バッファ３０１に格納された１６ビットのデータから、４ビットのデータを選択する。出力バッファ３０３は、選択回路３０２が選択したデータを格納する。出力バッファ３０３は、格納したデータをまとめてメモリブロック１０２に出力する。出力バッファ３０３から出力されたデータは、１つのメモリブロック１０２に供給される。そして、メモリブロック１０２が、実施の形態１と同様に、積和演算を行う。
【００６０】
以下の説明では、入力データのデータ長をＮ、データメモリ１０４のワード長をＷ、乗算要素のデータ長をＫと示す。入力データのデータ長Ｎは、出力バッファ３０３のサイズに対応しており、図９、図１０ではＮ＝４となっている。データメモリ１０４では、ワード長Ｗ単位で、データの書き込み、及び読み出しが行われる。データメモリ１０４のワード長Ｗは、入力バッファ３０１のサイズに対応しており、図９、図１０では、ワード長Ｗ＝１６（＝２４）となっている。乗算要素のデータ長Ｋは、乗算要素のビット桁数に対応している。乗算要素のデータ長Ｋは２の累乗、つまり、２ｎで示される整数とする（ｎは０以上の整数）。そして、
【００６１】
図９に示す入力データ生成部２０７では、入力バッファ３０１が隣接するビットに同一の乗算要素を格納している。さらに、データメモリ１０４は、一般的なデータ格納フォーマットと同様に乗算要素順にデータを格納している。例えば、乗算要素が４ビットデータの場合（Ｋ＝４）、１つの乗算要素ａ１のデータａ０１、ａ１１、ａ２１、ａ３１が連続する４ビットに格納される。乗算要素ａ１の隣には、次の乗算要素ａ２のデータａ０２、ａ１２、ａ２２、ａ３２が連続する４ビットに格納される。同様に、乗算要素が２ビットデータの場合（Ｋ＝２）、１つの乗算要素のデータａ０１、ａ１１が隣接する２ビットに格納される。乗算要素ａ１の隣には、次の乗算要素ａ２のデータａ０２、ａ１２が連続する２ビットに格納される。乗算要素が１ビットデータの場合（Ｋ＝１）、乗算要素ａ１〜ａ１６のａ０１〜ａ０１６がこの順番で格納されている。
【００６２】
入力データ生成部２０７の入力バッファ３０１が１６ビットとなっている。選択回路３０２は、１６ビットのデータからデータを選択して、出力バッファ３０３に出力する。このとき、選択回路３０２は、同じビット桁のデータが連続するように、データの並び順を変える必要がある。つまり、選択回路３０２は、連続する４つの乗算要素の同じビット桁のデータを選択する。よって、入力データ生成部２０７を異なるデータ長Ｋに対応させる場合、図９に示すように、選択回路３０２が複雑となる。よって、面積増加や速度低下を生じるおそれがある。
【００６３】
従って、本実施の形態では、図１０に示すような順番でデータメモリ１０４がデータを格納している。乗算要素のデータ長Ｋ＝４ビットの場合は、図９と同様である。つまり、データメモリ１０４において、１つの乗算要素のデータは連続して格納され、かつ、乗算要素順にデータが格納されている。なお、乗算要素のビット桁は、０、１、２、３のように、昇順となっているが、降順となっていてもよい。
【００６４】
乗算要素のデータ長Ｋ＝２ビットの場合、データメモリ１０４において、図１０に示すように、ａ０１、ａ１１、ａ０５、ａ１５、ａ０２、ａ１２、ａ０６、ａ１６、・・・の順番でデータが格納されている。つまり、データメモリ１０４において、１つの乗算要素のデータは連続して格納されているが、乗算要素順ではない順番でデータが格納されている。例えば、乗算要素ａ１の隣には、次の乗算要素ａ２ではない乗算要素ａ５のデータが格納されている。なお、乗算要素のビット桁は、０、１のように、昇順となっているが、降順となっていてもよい。
【００６５】
乗算要素のデータ長Ｋ＝１ビットの場合、データメモリ１０４において、図１０に示すように、ａ０１、ａ０５、ａ０９、ａ０１３、ａ０２、ａ０６、・・・の順番でデータが格納されている。つまり、データメモリ１０４において、乗算要素順ではない順番でデータが格納されている。例えば、乗算要素ａ１の隣には、次の乗算要素ａ２ではない乗算要素ａ５のデータが格納されている。
【００６６】
データメモリ１０４のワード長Ｗ、乗算要素のデータ長Ｋ、乗算要素の最大データ長Ｋ＿maxを用いると、１ワードのｉ番目（０以上、Ｗ未満の整数）のデータａｋｉｎｄｅｘは、下記の式（１）で一般化することができる。
【数１】
2020042399.tif 000003
【００６７】
なお、ＹｍｏｄＸは、ＹをＸで割った時の剰余であり、式（１）における商（つまり、i／Ｋ＿max、Ｗ／Ｋ＿max、及び、(i mod Ｋ＿max）/Ｋ）の値は少数点以下を切り捨てた整数値とする。乗算要素のデータ長Ｋが２ｎの場合、（ｎ＋１）パターンのビットスケーラビリティを有するデコーダ１０５を実装することができる。１ワードのデータａｋｉｎｄｅｘの格納順が式（１）を満たすように、データメモリ１０４が乗算要素を格納する。つまり、制御部１０６が、式（１）を満たすような書き込み順で、複数の乗算要素の各ビットのデータをデータメモリ１０４に書き込む。また、式（１）ではｋが昇順となっているが、降順となっていてもよい。
【００６８】
以下、実施の形態２における処理について、説明する。図１１は、メモリブロック１０２の演算フローを示す図である。図１２は、各ステップにおける乗算要素のビット桁と、ブロックアドレスを示す表である。図１１、図１２では、乗算要素のデータ長Ｋ＝２とし、被乗算要素を２ビットデータとしている。積和演算装置１００は、８回のステップ（以下、ステップ１〜ステップ８）を繰り返す。Ｍは、ワード長Ｗに含まれる乗算要素の数とする。図１０のＫ＝２ビットの例では、入力バッファ３０１にａ１〜ａ８の乗算要素が格納されるため、Ｍ＝８となる。典型的には、Ｍ＝Ｗ／Ｋとなる。
【００６９】
ブロックアドレス３〜６の４つのメモリブロック１０２には、被乗算要素のデータｗｊ，ｉが格納されている。ブロックアドレス３のメモリブロック１０２には被乗算要素の０桁目のｗ１０ｊ，ｉが格納されている。ブロックアドレス４のメモリブロック１０２には、被乗算要素の１桁目のデータｗ１１ｊ，ｉが格納されている。ブロックアドレス５のメモリブロック１０２には被乗算要素の０桁目のｗ２０ｊ，ｉが格納されている。ブロックアドレス６のメモリブロック１０２には、被乗算要素の１桁目のデータｗ２１ｊ，ｉが格納されている。
【００７０】
１つの積和演算に用いられる被乗算要素の同じビット桁のデータが２つのメモリブロック１０２に分割されて格納されている。具体的には、ブロックアドレス３，５のメモリブロック１０２は、１つの積和演算に用いられる被乗算要素の０ビット目のデータを格納する。ブロックアドレス４、６のメモリブロック１０２は、１つの積和演算に用いられる被乗算要素の１ビット目のデータを格納する。ブロックアドレス３、４のメモリブロック１０２は、複数の被乗算要素の異なるビット桁のデータを格納する。ブロックアドレス５、６のメモリブロック１０２は、複数の被乗算要素の異なるビット桁のデータを格納する。
【００７１】
ステップ１では、デコーダ１０５が、１からＭ／２番目までの複数の乗算要素に対して、０桁目のデータをまとめて、入力データとする。ここでは、上記のように、入力データ生成部２０７が、入力バッファ３０１のデータの一部を選択して、入力データとする。そして、ブロックアドレス３のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第１のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第１のステップ演算値に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて乗算値とする。制御部１０６は、累積加算器１０６３において乗算値を累積加算値として保存する。
【００７２】
ステップ２では、ステップ１と同様に、１からＭ／２番目までの複数の乗算要素の０桁目のデータが入力データとなる。ブロックアドレス４のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第２のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第２のステップ演算値に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝１）に応じた値（２＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。
【００７３】
ステップ３では、デコーダ１０５が、１からＭ／２番目までの複数の乗算要素に対して、１桁目のデータをまとめて、入力データとする。ブロックアドレス３のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第３のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第３のステップ演算値に乗算要素のビット桁（ｃ＝１）に応じた値（２＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。
【００７４】
ステップ４では、ステップ３と同様に、１からＭ／２番目までの複数の乗算要素の１桁目のデータが入力データとなる。ブロックアドレス４のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第４のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第４のステップ演算値に乗算要素のビット桁（ｃ＝１）に応じた値（２＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝１）に応じた値（２＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。
【００７５】
ステップ５では、デコーダ１０５が、（Ｍ／２＋１）からＭ番目までの複数の乗算要素に対して、０桁目のデータをまとめて、入力データとする。ブロックアドレス５のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第５のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第５のステップ演算値に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。
【００７６】
ステップ６では、ステップ５と同様に、（Ｍ／２＋１）からＭ番目までの複数の乗算要素の０桁目のデータが入力データとなる。ブロックアドレス６のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第６のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第６のステップ演算値に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝１）に応じた値（２＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。
【００７７】
ステップ７では、デコーダ１０５が、（Ｍ／２＋１）からＭ番目までの複数の乗算要素に対して、１桁目のデータをまとめて、入力データとする。ブロックアドレス５のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第７のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第７のステップ演算値に乗算要素のビット桁（ｃ＝１）に応じた値（２＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。
【００７８】
ステップ８では、ステップ７と同様に、（Ｍ／２＋１）からＭ番目までの複数の乗算要素の１桁目のデータが入力データとなる。ブロックアドレス６のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第８のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第８のステップ演算値に乗算要素のビット桁（ｃ＝１）に応じた値（２＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝１）に応じた値（２＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。ステップ８までの処理が完了した後、制御部１０６は、書き込みデータ生成部１０６４にて、累積加算結果を乗算要素の最大ビット桁のデータに変換し、データメモリ１０４に保存する。
【００７９】
次に、乗算要素のデータ長Ｋ＝１の場合について、図１３，及び図１４を用いて説明する。図１３は、メモリブロックの演算フローを示す図である。図１４は、各ステップにおける乗算要素のビット桁と、ブロックアドレスを示す表である。図１３、図１４では、乗算要素のデータ長Ｋ＝１とし、被乗算要素を１ビットデータとしている。積和演算装置１００は、４回のステップ（以下、ステップ１〜ステップ４）を繰り返す。以下の説明では、Ｍは、ワード長Ｗに含まれる乗算要素の数とする。図１０のＫ＝１ビットの例では、入力バッファ３０１にａ１〜ａ１６の乗算要素が格納されているため、Ｍ＝１６となる。
【００８０】
ブロックアドレス３〜６の４つのメモリブロック１０２には、被乗算要素のデータｗｊ，ｉが格納されている。ブロックアドレス３のメモリブロック１０２には被乗算要素の０桁目のｗ１０ｊ，ｉが格納されている。ブロックアドレス４のメモリブロック１０２には、被乗算要素の０桁目のデータｗ２０ｊ，ｉが格納されている。ブロックアドレス５のメモリブロック１０２には被乗算要素の０桁目のｗ３０ｊ，ｉが格納されている。ブロックアドレス６のメモリブロック１０２には、被乗算要素の０桁目のデータｗ４１ｊ，ｉが格納されている。
【００８１】
１つの積和演算に用いられる被乗算要素の同じビット桁のデータが４つのメモリブロック１０２に分割されて格納されている。具体的には、ブロックアドレス３〜６のメモリブロック１０２は、全て、１回の積和演算に用いられる被乗算要素の０ビット目のデータを格納している。
【００８２】
ステップ１では、デコーダ１０５が、１からＭ／４番目までの複数の乗算要素に対して、０桁目のデータをまとめて、入力データとする。ここでは、上記のように、入力データ生成部２０７が、入力バッファ３０１のデータの一部を選択して、入力データとする。そして、ブロックアドレス３のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第１のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第１のステップ演算値に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において乗算値を累積加算値として保存する。
【００８３】
ステップ２では、デコーダ１０５が、（Ｍ／４＋１）からＭ／２番目までの複数の乗算要素に対して、０桁目のデータをまとめて、入力データとする。ブロックアドレス４のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第２のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第２のステップ演算値に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。
【００８４】
ステップ３では、デコーダ１０５が、（Ｍ／２＋１）から（３Ｍ／４）番目までの複数の乗算要素に対して、０桁目のデータをまとめて、入力データとする。ブロックアドレス５のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第３のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第３のステップ演算値に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。
【００８５】
ステップ４では、デコーダ１０５が、（３Ｍ／４＋１）からＭ番目までの複数の乗算要素に対して、０桁目のデータをまとめて、入力データとする。ブロックアドレス６のメモリブロック１０２に、セレクタ２０６が入力データを供給する。メモリブロック１０２は、入力データと、メモリブロック１０２に格納されたデータとの積和演算結果（第４のステップ演算値とする）を制御部１０６に出力する。制御部１０６は、ビットシフタ１０６２において第４のステップ演算値に乗算要素のビット桁（ｃ＝０）に応じた値（１＝２ｃ）と、被乗算要素のビット桁ｄ（ｄ＝０）に応じた値（１＝２ｄ）を乗じて、乗算値とする。制御部１０６は、累積加算器１０６３において前のステップで得られた累積加算値に乗算値を加えることで、累積加算値を更新する。ステップ４までの処理が完了した後、制御部１０６は、書き込みデータ生成部１０６４にて、累積加算結果を乗算要素の最大ビット桁のデータに変換し、データメモリ１０４に保存する。
【００８６】
本実施の形態では、ｋ（ｋは０以上Ｋ以下の任意の整数であり、Ｋは２の累乗の整数）を乗算要素の桁数とした場合に、データメモリ１０４の１ワードのｉ番目（ｉは、０以上、Ｗ未満の整数）に格納されるデータａｋｉｎｄｅｘが上記の式（１）を満たすように格納されている。
【００８７】
これにより、メモリブロックに対する入力データを生成する回路の規模や速度遅延を抑えつつ、ビットスケーラビリティを実現する事が可能となる。入力データ生成部２０７の選択回路３０２が容易に適切なデータを選択することができる。例えば、Ｋ＝１，２，４のスケラ−ビリティを有する場合、図１０では、選択回路３０２が、入力バッファ３０１の４つのビットから１つのビットを選択すればよい。これに対して、図９の構成では、選択回路３０２が選択する入力バッファ３０１のビットが多数となる。よって、本実施の形態にかかる構成により、回路の規模や速度遅延を抑制することができる・
【００８８】
実施の形態３．
一般的にメモリセルアレイを用いた積和演算技術において、素子特性ばらつきの影響によって計算結果に対して誤差が生じるおそれがある。このような誤差によって、アプリケーションにおける性能劣化を引き起こすことが懸念される。チップ毎に異なる素子のランダムなばらつきに対する方法として、実デバイスの入出力結果を用いて再度機械学習を行うという手法が用いられている。
【００８９】
機械学習を行う場合、アプリケーションによっては、数万個のデータを用いて、以下の（ａ）〜（ｃ）の処理を数百回繰り返す必要がある。
（ａ）暫定パラメータでの演算を行う。
（ｂ）期待値との誤差を計算する。
（ｃ）パラメータを調整する。
このため、ニューラルネットワークの規模が大きくなる程、学習に長時間を要する。また、チップ個別に再学習をかける場合のコストは非常に大きい。
【００９０】
実施形態３においては、再学習は行わず、ばらつきによる認識精度低下を防ぐ手法を示す。図１５に実施形態３にかかる積和演算装置１００のシステム構成図を示す。図１５に示す積和演算装置１００では、図１の構成に対して、ＣＰＵ１１１と、書き込み制御部１１２と、チップ１１０と、評価装置１２０とが追加されている。具体的には、チップ１１０は、実施の形態１の積和演算装置１００と、書き込み制御部１１２とを備えている。そして、評価装置１２０がチップ１１０と接続されている。評価装置１２０は、積和演算装置１００の演算結果を評価する。
【００９１】
メモリ素子アレイを用いた積和演算技術においては、事前に機械学習で得たパラメータが被乗算要素としてメモリ領域に書き込まれている。本実施形態においては書き込み制御部１１２が、乗算要素の書き込み先のアドレスのみを変化させる。つまり、書き込み制御部１１２が、書き込み先のアドレスをシフトさせる。積和演算装置１００は、それぞれのアドレス毎に積和演算を行う。そして、評価装置１２０が、積和演算結果を用いて、シフトされたアドレス毎に、認識精度の評価を行っている。
【００９２】
評価装置１２０は、例えば、チップ１１０とは別に設けられたパーソナルコンピュータなど処理装置であってもよい。あるいは、チップ１１０上に搭載されたＣＰＵ１１１が評価の一部、または全てを行ってもよい。例えば、積和演算装置１００が画像認識用ニューラルネットワークの積和演算を行う場合、認識された画像の精度が最も高くなるオフセットアドレスを変えていく。
【００９３】
図１６に書き込みデータのアドレスシフトと、その評価イメージを示す。被乗算要素は０／１の組み合わせである。そして、被乗算要素は、特性ばらつきの大きいメモリ素子に対して、１のデータが格納された場合に演算結果に対する誤差が大きくなる。一方で、ニューラルネットワーク向けのパラメータは０を中心に分布させる手法が広く使われており、多くのデータが０という傾向がある。従って、被乗算要素を書き込むアドレスを行単位、もしくはブロック単位でシフトさせる。例えば、図１６では、書き込みアドレス４０１を１行ずつずらしている。
このようにすることで、演算精度に致命的な悪影響を及ぼす特性ばらつきの大きい素子に対して０が書き込まれることになる。つまり、書き込みアドレス４０１をずらすことで、積和演算結果に差が生じるため、認識精度に差分が発生する。例えば、評価装置１２０は、素子特性の大きいメモリ素子に対して、０が書き込まれるようなオフセットアドレスを求める。このオフセットアドレスは、認識精度が最も高くなる最適アドレスとなる。
【００９４】
図１７は、演算精度調整フローを示す。まず、書き込み制御部１１２がアドレスを設定する（Ｓ１１）。ここでは、初期値として、オフセットが０となるアドレスが指定される。次に、積和演算装置１００が演算を実行する（Ｓ１２）。ここでは、実施の形態１で示した積和演算が実施される。そして、積和演算装置１００が繰り返しの積和演算を行って、最終的な演算結果を評価装置１２０に出力する。
【００９５】
次に、評価装置１２０が、演算結果を評価する（Ｓ１３）。つまり、評価装置１２０が積和演算の演算結果に基づいて、認識精度を評価する。例えば、積和演算装置１００が、画像認識用ニューラルネットワークにおける積和演算を行う場合、複数の画像サンプルが用意されている。そして、積和演算装置１００が、１つの画像サンプルに基づくデータをデータメモリに格納する。Ｓ１２では、積和演算装置１００がそれぞれの画像サンプルに対して、積和演算を行う。１つのオフセットアドレスを用いて、画像のそれぞれに対する積和演算を行う。評価装置１２０が、複数の画像に対して、画像認識を行って、それぞれの画像が正しく認識されたか否かを評価する。そして、評価装置１２０は、それぞれの画像の認識結果を評価して、認識精度を示す数値を保存する。
【００９６】
次に、書き込み制御部１１２がアドレスシフトの探索が終了したか否かを判定する（Ｓ１４）。探索が終了していない場合（Ｓ１４のＮＯ）、書き込み制御部１１２がアドレスをシフトさせる（Ｓ１５）。そして、シフトしたアドレスで、Ｓ１２、及びＳ１３の処理が実行される。これにより、評価装置１２０が、シフトしたアドレスでの認識精度を評価することができる。なお、シフトさせるアドレスは、ブロックアドレスでもよく、ブロックアドレスの行アドレスでもよい。あるいは、書き込み制御部１１２は、ブロックアドレスと行アドレスの両方を順番にシフトさせてもよい。
【００９７】
探索が終了した場合（Ｓ１４のＹＥＳ）、評価装置１２０は、最適アドレスの設定を保存する（Ｓ１６）。つまり、書き込み制御部１１２がアドレスを順番にシフトさせていき、評価装置１２０が、全てのシフトアドレスに対して、認識精度を評価する。そして、評価装置１２０は、全シフトアドレスの中から、最も認識精度が高くなったアドレスをオフセットアドレスとして記録する。このようにして、事前テストが終了する。
【００９８】
図１８は、本実施の形態にかかるデコーダ１０５の構成を示すブロック図である。デコーダ１０５は、図３の構成に対して、アドレスシフト部２２０が追加されている。アドレスシフト部２２０は、書き込みアドレスをシフトする機能を有している。評価装置１２０は、事前テストで得られた最適なオフセットアドレスの情報が積和演算装置１００に出力する。
【００９９】
例えば、アドレスシフト部２２０は、事前テストで得られた最適なオフセットアドレスの情報を制御部１０６から受け取る。そして、アドレスシフト部２２０は、乗算要素の書き込み先をオフセットアドレス情報に応じてシフトさせる。このようにすることで、一度学習させたパラメータを利用しながらメモリ素子の特性ばらつきの影響を抑えることが可能となる。本実施形態では、再学習無しで認識精度劣化を抑制する事が可能となる。よって、メモリデバイスごとにＤＮＮによる推論プログラムを実装するための開発時間の短縮が可能となる。
【０１００】
本実施の形態１〜３にかかる積和演算装置１００は、自動運転や監視カメラ等において、エンドポイントでのＤＮＮ処理用の積和演算処理に好適である。本実施の形態にかかる積和演算装置、及び方法によって、電力効率を向上する。さらに、積和演算装置１００を用いることで、画像認識などのアプリケーション全体を効率よく動作させることができる。特に、積和演算装置１００は、ロボット、監視カメラ、ドローンなどの自動制御等の応用に好適である。
【０１０１】
上記の積和演算装置１００の一部、又は全部は、半導体メモリなどの半導体回路を有するハードウェアにより実現することが可能となる。さらには、積和演算装置１００の一部の機能は、ソフトウェアプログラムにより実現されていてもよい。
【０１０２】
その他の実施の形態
図１９は、その他の実施の形態にかかる積和演算装置１００の構成を示すブロック図である。積和演算装置１００は、複数のメモリブロック１０２と、入力データ生成部２０７と、制御部１０６と、データメモリ１０４とを備えている。複数のメモリブロック１０２は、複数の被乗算要素を格納して、入力データに対して積和演算を実行する。１つのメモリブロック１０２は、複数の前記被乗算要素の同じビット桁の第１のビット値を１ビット値として格納する。入力データ生成部２０７は、複数の乗算要素から同じビット桁の第２のビット値を抽出することで、前記入力データを生成する。データメモリ１０４は、メモリブロック１０２の積和演算に応じた値を累積加算する。データメモリ１０４は、前記累積加算により得られた累積加算値を、次の積和演算の前記乗算要素として格納する。これにより、効率よく積和演算を行うことができる。
【０１０３】
積和演算方法は、以下のステップ（Ａ）〜（Ｇ）を備えている。
（Ａ）データメモリから複数の乗算要素を読み出すステップ。
（Ｂ）複数の被乗算要素の同じビット桁の第１のビット値を１ビット値として格納する複数のメモリブロックから、１つのメモリブロックを選択するステップ。
（Ｃ）前記複数の乗算要素から同じビット桁の第２のビット値を抽出することで、入力データを生成するステップ。
（Ｄ）前記入力データを、選択された前記１つのメモリブロックに入力するステップ。
（Ｅ）前記メモリブロックが、前記第１ビット値と前記第２のビット値とを用いて、積和演算を行うステップ。
（Ｆ）メモリブロックの前記積和演算に応じた値を累積加算するステップ。
（Ｇ）前記累積加算により得られた累積加算値を、次の積和演算の前記乗算要素として、前記データメモリに格納するステップ。
これにより、効率よく積和演算を行うことができる。
【０１０４】
また、上述したプログラムは、様々なタイプの非一時的なコンピュータ可読媒体を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【０１０５】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変更が可能であることはいうまでもない。
【符号の説明】
【０１０６】
１００  積和演算装置
１０１  メモリセル
１０２  メモリブロック
１０３  ブロックアレイ
１０４  データメモリ
１０５  デコーダ
１０６  制御部
１０７  命令メモリ
１１１  ＣＰＵ
１１２  書き込み制御部
１２０  評価用ＰＣ
２０２  第２ビットカウンタ
２０３  第１ビットカウンタ
２０４  アドレス保持部
２０５  ブロックアドレス生成部
２０６  セレクタ
２０７  入力データ生成部
【図１】
2020042399.tif 000006
【図２】
2020042399.tif 000007
【図３】
2020042399.tif 000008
【図４】
2020042399.tif 000009
【図５】
2020042399.tif 000010
【図６】
2020042399.tif 000011
【図７】
2020042399.tif 000012
【図８】
2020042399.tif 000013
【図９】
2020042399.tif 000014
【図１０】
2020042399.tif 000015
【図１１】
2020042399.tif 000016
【図１２】
2020042399.tif 000017
【図１３】
2020042399.tif 000018
【図１４】
2020042399.tif 000019
【図１５】
2020042399.tif 000020
【図１６】
2020042399.tif 000021
【図１７】
2020042399.tif 000022
【図１８】
2020042399.tif 000023
【図１９】
2020042399.tif 000024