以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
図1は、専用の積和演算回路を有するシステム10の一例である。同図のシステム10は、CPU11とDMAC12、メモリ13、専用の積和演算回路14(以下、積和演算器)、その他のハードウェア15を有する。CPU11は、メモリ13から読み出した命令をバス16を介して積和演算回路14に送り、積和演算回路はバス16を介して演算結果をCPU11に送る。DMAC12は、その他のハードウェア15とメモリ13間等のCPU11を介さないデータ転送を制御する。
具体的に、CPU11は、積和演算器14とのデータのやり取りを、積和演算器14に割り振られたアドレスに対する読み出し及び書き込み処理によって行う。例えば、CPU11から積和演算器14にデータを書き込む場合、CPU11は、バス16に対して積和演算器14のアドレス、書き込みデータ、タイミング信号、書き込みモード信号を発行する。積和演算器14は、これらの信号を検出して発行されたアドレスが積和演算器14のアドレスであることを判定し、バス16からデータを取り込む。一方、積和演算器14からデータを出力する場合、CPU11は、バス16に対して、積和演算器14のアドレス及びタイミング信号を発行し、積和演算器14から供給されたデータをバス16から取り込む。
積和演算回路14は、一般的に、次の式1に基づいて積和演算値を算出する。式1において、積和演算値「S」は、値「a」「b」の積和演算値である。
値「a」は、n個の要素「a0,a1,…,an−1」、値「b」はn個の要素「b0,b1,…,bn−1」をそれぞれ有する。式1では、各値のi(0≦i≦n−1)番目の要素同士の組の乗算値「ai×bi」が順次加算されることにより、積和演算値「S」が算出される。
図2は、式1において「n=8」とした場合の積和演算器の一例を表す図である。同図の積和演算器において、値「a」の各要素a0〜a7はレジスターR00〜R07に入力され、値「b」の各要素b0〜b7はレジスターR10〜R17に入力される。同図の積和演算器では、値「a」「b」の全てまたは一部の要素が入力信号inputとして入力され、対応するレジスターに書き込まれる。続いて、レジスターに保持された全ての値「a」「b」の要素データを用いて演算が行われ、出力レジスターOUTに積和演算値「S」が出力される。
図2の積和演算器において、まず、演算対象の各要素データ(入力更新データ)が入力信号inputとして入力され、入力更新データに対応するレジスターがライト信号write_0_0〜write_1_7に応答し、当該レジスターに入力更新データが書き込まれる。全ての入力更新データが書き込まれると、入力信号startがカウンターCNTと遅延器DELAに入力される。カウンターCNTは入力信号startに応答して、クロックの立ち上がり毎に0から順にインクリメントした信号を、比較器COMと選択器SELA、SELBに出力する。
選択器SELA、SELBは、それぞれ、カウンターCNTからのセレクト信号select1(0〜7)に応答して、当該セレクト信号select1に対応するレジスターが保持するデータを乗算器MULへ出力する。具体的に、例えば、セレクト信号select1が「0」の場合、選択器SELAはレジスターR00のデータ、選択器SELBはレジスターR10のデータを乗算器MULに出力する。乗算器MULは同時に入力された値「a」「b」の対応する要素の組の各データを乗算して加算器ADDに順次出力し、加算器ADDは出力された乗算値と、前回の加算器ADDの出力とを順次加算する。
一方、比較器COMはカウンターCNTからのセレクト信号select1が「7」の場合、遅延器DELBに信号を出力する。遅延器DELBは、比較器COMからの出力信号を全組の乗算結果が加算されるタイミングに遅延させて、出力レジスターOUTへ書き込み信号writeを出力する。なお、遅延器DELAは、入力信号startを初めの組の乗算値が加算される直前に合わせて遅延させ、加算器ADDにリセット信号resetを出力し予め「0」で初期化しておく。
図3は、図2の積和演算器をバスに接続する回路の一例を表す図である。同図において、図1のバス16が、制御バスCB、データバスDB、アドレスバスABを有する。図2の積和演算器にアクセスが発生すると、積和演算器に割り振られたアドレスがアドレスバスABに、有効なアドレスが流れたタイミングを表す信号が制御バスCBに出力される。
そして、ゲートG1は有効アドレスを検出し、比較器C00〜C17は、それぞれ検出アドレスと対応するレジスター(レジスターR00〜R07)に割り振られたアドレスとを比較し、一致した場合に、当該アドレスに対応するライト信号write_*_*(write_0_0〜write_1_7)を図2の積和演算器に送る。また、比較器C20は、検出アドレスと入力信号startを発行するためのアドレスとを比較し、一致した場合に、図2の積和演算器に入力信号startを送る。
また、ゲートG4は、データバスDBから送信されるデータと、有効なデータが検出されたタイミングを表す信号を制御バスCBから検出し、データバスDBの入力データを入力信号inputとして出力する。また、ゲートG2は有効アドレスを検出し、比較器C30は、検出アドレスと積和演算器の出力レジスターOUTのアドレスとを比較し、一致した場合に、出力レジスターOUTの出力値outputをゲートG3からデータバスDBに出力する。
図4は、「a0〜a7」が更新される場合の図2の積和演算器における動作波形を表す図である。この例において、レジスターR10〜R17には「b0〜b7」が予め保持されている。また、「pi」は各組の要素の乗算値「ai×bi」であり、「Si」はi番目の組までの積和演算値を表す。
図4の動作波形図において、まず、入力信号inputとして「a0」が入力されると共に、ライト信号write_0_0に応答して、次のクロックの立ち上がりタイミングでレジスターR00に「a0」が書き込まれる。同様にして、入力信号inputとして「a1〜a7」が順次入力され、「a1〜a7」がレジスターR01〜レジスターR07に書き込まれる。そして、「a7」の入力の次のクロックの立ち上がりタイミングで、入力信号startがカウンターCNTに出力される。
カウンターCNTは入力信号startに応答して、クロックの立ち上がりタイミング毎に0から順に7までインクリメントした各信号を選択器SELA、SELBと比較器COMに出力する。最初、セレクト信号select1「0」に応答して、選択器SELAはレジスターR00のデータ「a0」を、選択器SELBはレジスターR10のデータ「b0」を選択し乗算器MULに出力する。続いて、次のクロックの立ち上がりタイミングで、乗算器MULは、「a0」「b0」を乗算し、乗算値「p0=a0×b0」を加算器ADDに出力する。
また、遅延器DELAはスタート信号startに応答して加算器ADDにリセット信号resetを出力し、最初の組の乗算値「p0」が入力される前に加算器ADDを「0」に初期化しておく。従って、加算器ADDは、最初、初期値「0」と乗算器MULから出力された乗算値「p0」との加算値「S0=0+p0」を出力する。同様にして、次のクロックで、加算器ADDは、乗算器MULからの出力「pi=ai×bi」と、1つ前のクロックの加算器ADDからの出力値「pi−1」とを加算した値「Si=pi−1+pi」を出力する。また、比較器COMは、カウンターCNTの出力信号が7になると遅延器DELBに比較信号を出力し、遅延器DELBは、全ての組の乗算結果「p0〜p7」が加算されたタイミングに、出力レジスターへの書き込み信号writeを出力する。
上記のように、図2の積和演算器は、全ての入力更新データ「a0〜a7」がレジスターに蓄えられてから積和演算を開始するため、演算結果が得られるまで時間がかかっていた。これにより、図2の積和演算器は、データ「a0〜a7」が入力され始めてから積和演算値「S7」が算出されるまで20サイクル要していた。続いて、「a0〜a7」のうちひとつのデータのみが更新された場合について述べる。
図5は、「a0〜a7」のうち「a2」のみが更新される場合の図2の積和演算回路における動作波形を表す図である。この例において、レジスターR10〜R17に「b0〜b7」が、レジスターR02を除くレジスターR00〜R07に、「a2」を除く「a0〜a7」が予め保持されている。なお、「pi」、「Si」については図4の動作波形図と同様である。
図5の動作波形図において、まず、入力信号inputとして「a2」が入力されると共に、ライト信号write_0_2に応答して、次のクロックの立ち上がりタイミングでレジスターR02に「a2」が書き込まれる。そして、「a2」の入力のつぎのクロックの立ち上がりタイミングで、入力信号startがカウンターCNTに出力され、カウンターCNTは、0から順にインクリメントした信号を選択器SELA、SELBと比較器COMとに出力する。そして、図4と同様にして、選択器SELA、SELBは、「0〜7」のセレクト信号select1に対応するレジスターが保持するデータの組を選択して順次乗算器MULに出力し、乗算器MULは各組のデータの乗算値「pi(=ai×bi)」を順次加算器ADDに出力する。加算器ADDは、全ての組の乗算値「pi」を順次加算し、積和演算値「S7」を出力レジスターOUTに出力する。
このように、図2の積和演算器は、例え「a0〜a7」のうち「a2」のみが更新される場合であっても、レジスターに保持された全てのデータについて積和演算し直していた。また、図2の積和演算器は、演算対象の全てのデータについて積和演算し直すため、全てのデータがレジスターに書き込まれてから演算を開始していた。
これにより、図2の積和演算器は、レジスターに保持された全てのデータを、当該全てのデータがレジスターに格納されてから積和演算し直すため、全ての入力更新データがレジスターに蓄えられるまでのデータ転送時間と、乗算と加算の全てのデータの演算時間とを要し、積和演算値が得られるまで時間を要していた。このため、図2の積和演算器では、「a2」のみが更新される場合であっても、データ「a2」が入力され始めてから積和演算値「S7」が算出されるまで13サイクル要していた。
<第1の実施の形態例>
そこで、本実施の形態例の演算回路は、N個の要素を有する第1の値を保持する第1のレジスターと、N個の要素を有する第2の値を保持する第2のレジスターと、第1、第2の値が積和演算された積和演算値を保持する出力レジスターとを有する。そして、本実施の形態例の演算回路は、入力された第1の値の1つの要素から、当該要素に対応する第1のレジスター内の第1の値の要素を減算する減算器と、減算器の出力と入力された第1の値の要素に対応する第2のレジスター内の第2の値の要素とを乗算する乗算器と、乗算器の出力と出力レジスターの積和演算値とを加算して前記出力レジスターに出力する加算器とを有する。
本実施の形態例の積和演算器は、次の式2に基づいて積和演算値を算出する。式2において、値「a´=(a0´,a1´,a2´,…,an−1´)」は、前回積和演算された古い値「a=(a0,a1,a2,…,an−1)」である前回データに対してj番目の要素が更新されているものとする。なお、値「a」「a´」のj番目以外の要素は変更なく同一である。そして、「S」は「a」と「b」の積和演算値(以下、前回の積和演算値)であり、「S´」は「a´」と「b」の積和演算値(以下、更新後の積和演算値)を表す。
式2では、更新後の積和演算値「S´」を、前回の積和演算値「S」に、「S´」と「S」の差分値を加算することによって求める。具体的に、更新後の積和演算値「S´」は、前回の積和演算値「S」から値「a」「b」のj番目の要素の乗算値「aj×bj」を減算し、値「a´」「b」のj番目の要素の乗算値「aj´×bj」を加算した値(S´=S−(aj×bj)+(aj´×bj))である。この演算式は「S´=S+(aj´−aj)×bj」のようにまとめられる。従って、更新後の積和演算値「S´」は、前回の積和演算値「S」に差分値「(aj´−aj)×bj」が加算されることにより算出される。
式1と式2とを比較すると、値の一部の要素が更新される場合、式1に対して式2の演算量は少ない。従って、式2は、式1に対してより少ない処理サイクルで更新後の積和演算値「S」を算出することができる。
図6は、式2において「n=8」とした場合の本実施の形態例における積和演算器の一例を表す図である。図2の積和演算値と同様に、図6の積和演算器において、値「a´」の各要素a0´〜a7´はレジスターR00〜R07に、値「b」の各要素b0〜b7はレジスターR10〜R17に格納される。また、本実施の形態例における積和演算器は、レジスターR00〜R17に前回データ「a0〜a7、b0〜b7」を、出力レジスターに前回の積和演算値「S」を保持する。
また、図6の積和演算器において、updateする組の番号s10は、入力信号inputとして入力される入力更新データに対応する組を表す。そして、write_0_0からwrite_0_7の論理和s0はレジスターR00〜R07のいずれかに格納される入力更新データの有無を表し、write_0_0からwrite_0_7の論理和s0がHレベルの場合、入力更新データがレジスターR00〜R07のいずれかに格納されることを、Lレベルの場合はいずれにも格納されないことを示す。同様に、write_1_0からwrite_1_7の論理和s1は、レジスターR10〜R17のいずれかに格納される入力更新データの有無を表す。
図6の積和演算器において、値「a」または値「b」いずれかの入力更新データが入力信号inputとして入力される。そして、入力更新データinputと、入力更新データに基づく前回データの差分値が演算され、当該差分値が前回の積和演算値に加算されることによって更新後の積和演算値が算出される。
まず、入力信号inputとしてデータが入力されると、入力更新データを書き込む前に、updateする組の番号s10に対応するレジスターが予め保持する前回データを、選択器SEL1は遅延器DEL2と減算器SUB1に、選択器SEL2は遅延器DEL3と減算器SUB2にそれぞれ出力する。同時に、入力更新データに対応するレジスターがライト信号write_0_0〜write_1_7に応答し、当該レジスターに入力更新データが書き込まれる。
続いて、減算器SUB1は、入力更新データinputから、選択器SEL1から出力された前回データを減算した減算値を選択器SEL3に出力する。また、遅延器DEL2は、選択器SEL1から出力された前回データを減算器SUB1の出力に合わせて遅延させ、選択器SEL3に出力する。また、遅延器DEL1は、write_0_0からwrite_0_7の論理和s0を減算器SUB1の出力に合わせて遅延させ、セレクト信号select3として選択器SEL3に出力する。そして、選択器SEL3は、セレクト信号select3がHレベルの場合は減算器SUB1からの出力を、セレクト信号select3がLレベルの場合は遅延器DEL2から出力された入力更新データの組の前回データを、乗算器MUL1に出力する。選択器SEL4についても同様である。
前述したとおり、値「a」または値「b」いずれかのデータが入力されるため、例えば、値「a」のデータが更新される場合、write_0_0からwrite_0_7の論理和s0はHレベル、write_1_0からwrite_1_7の論理和s1はLレベルとなる。この場合、乗算器MUL1は、値「a」に係る選択器SEL3による減算器SUB1からの減算値(aj´−aj)と、値「b」に係る選択器SEL4による遅延器DEL3からの前回データ(bj)とを乗算する。一方、値「b」のデータが更新される場合、write_0_0からwrite_0_7の論理和s0はLレベル、write_1_0からwrite_1_7の論理和s1はHレベルとなり、乗算器MUL1は、値「a」に係る選択器SEL3による遅延器DEL2からの前回データ(aj)と、値「b」に係る選択器SEL4による減算器SUB2からの減算値(bj´−bj)とを乗算する。
そして、乗算器MUL1は、乗算結果を前回の積和演算値からの差分値として加算器ADD1に出力する。この差分値は、上述した式2における「(aj´−aj)×bj」(値「a」のデータが更新される場合)に対応する。続いて、加算器ADD1は、当該差分値と、出力レジスターOUTが保持する前回の積和演算値とを加算して、出力レジスターOUTに出力する。ただし、連続するクロックサイクルで入力更新データが入力される場合、前回の積和演算値を出力レジスターから入力すると、次の加算器ADD1の演算に間に合わない。そこで、連続するクロックサイクルで更新データが入力される場合、選択器SEL5は、出力レジスターOUTではなく加算器ADD1からの出力を直接加算器ADD1に入力する。
点線で囲んだ連続入力検出回路EC1は、連続するクロックサイクルで入力更新データが発生したか否かを判定する回路である。連続入力検出回路EC1は、遅延器DEL6及び論理積器AND1によって、Hレベルのwrite_0_0からwrite_0_7の論理s0またはwrite_1_0からwrite_1_7の論理和s1が連続することが検出されると、Hレベルのセレクト信号select5を出力する。つまり、連続するクロックサイクルで入力更新データが発生する場合はHレベルのセレクト信号select5を、そうでない場合はLレベルのセレクト信号select5を選択器SEL5に出力する。そして、選択器SEL5は、セレクト信号select5がHレベルの場合は加算器ADD1からの前回の出力を、セレクト信号select5がLレベルの場合は出力レジスターOUTからの出力を加算器ADD1に入力する。
そして、遅延器DEL5は、データが入力されたことを表す論理和器LD1のHレベルの信号を積和演算値が算出されるタイミングに遅延させ、出力レジスターOUTに書き込み信号writeを出力する。なお、図6の積和演算器において、入力レジスター(レジスターR00〜R17)と出力レジスターOUTは、初期状態では「0」に初期化されているものとする。そして、これらのレジスターが一旦初期化された後、入力レジスターが保持する各データの積和演算値が出力レジスターに保持される間は、再度初期化が行われる必要はない。
このように、図6の積和演算器は、前回の積和演算値に対して、更新された任意の要素データ(入力更新データ)に基づいて前回の積和演算値との差分値((aj´−aj)×bj)を加算することによって、更新後の積和演算値を算出する。このため、図6の積和演算器は、演算対象の全ての値の要素データを積和演算し直す必要がなく、また、全ての入力更新データが対応するレジスターに蓄えられるのを待たずに演算を開始することができる。これにより、図6の積和演算器は、図2の積和演算器に対して、少ない処理サイクルで積和演算値を算出することができる。
ところで、図6の積和演算器は、図2の積和演算器と同様に、入力レジスター及び出力レジスターを有する。ただし、図2の積和演算器は、入力レジスター及び出力レジスターがない場合でも演算可能であるのに対し、本実施の形態例の積和演算器は、入力レジスター及び出力レジスターがない場合は演算できない。というのも、図2の積和演算器では、入力更新データは入力レジスターを介さずに選択器SELA、SELBに出力されてもよく、加算器ADDの出力は出力レジスターOUTを介さずに出力されてもよい。それに対し、本実施の形態例の積和演算器は、前回データ及び前回の積和演算値を演算に用いるため、それらのデータを予め保持しておく入力レジスター及び出力レジスターは必要不可欠である。
図7は、図6の積和演算器をバスに接続する回路を表す図である。同図において、図3のバス接続回路と同じ部分については、同じ引用番号が付与されている。本実施の形態例における積和演算器のバス接続回路は、さらに、3つの信号(ライト信号write_0_0〜write_0_7s0、write_1_0からwrite_1_7の論理和s1、updateする組の番号s10)を生成して図6の演算回路に出力する。
図7のバス接続回路において、論理和器L10は、ライト信号write_0_0〜write_0_7の論理和に基づいてwrite_0_0からwrite_0_7の論理和s0を生成する。具体的に、ライト信号write_0_0〜write_0_7のいずれかの信号がHレベルの場合、write_0_0からwrite_0_7の論理和s0はHレベルとなる。同様にして、論理和器L20は、ライト信号write_1_0〜write_1_7の論理和に基づいてwrite_1_0からwrite_1_7の論理和s1を生成する。また、論理和器L00〜L07は、各論理和器に対応する組の信号(例えば、論理和器L00の場合、write_0_0、write_1_0)の論理和をそれぞれエンコーダーE1に出力する。エンコーダーE1は、Hレベルの信号を出力する論理和器を、updateする組の番号s10として数値化し、図6の積和演算器に出力する。
図8は、入力更新データとして「a0´〜a7´」が更新される場合の図6の積和演算器における動作波形を表す図である。ここでは入力更新データ「a0´〜a7´」と前回データである「b0〜b7」との積和演算が行われる。同図の例において、レジスターR00〜R07には前回データ「a0〜a7」が、レジスターR10〜R17には前回データ「b0〜b7」が、出力レジスターには前回の積和演算値「S7 8」が予め保持される。また、「di」は入力更新データ「ai´」から当該入力更新データに対応する前回データ「ai」の減算値「di(=ai´−ai)」であり、「qi」は入力更新データに対応する組の値「bi」の要素データと減算値「di」との乗算値「qi(=di(=ai´−ai)×bi)」である。そして、「S7 8−i」は、「i」番目の組までの積和演算値を表す。
レジスターR00には、予め前回データ「a0」が保持される。そして、入力信号inputとして「a0´」が入力されると、選択器SEL1は、入力更新データ「a0」に対応するupdateする組の番号s10(=0)に基づいて、レジスターR00が予め保持する前回データ「a0」を次のクロックの立ち上がりタイミングで遅延器DEL2と減算器SUB1に出力する。同時に、ライト信号write_0_0に応答して、レジスターR00に「a0´」が書き込まれる。
減算器SUB1は、入力更新データ「a0´」から、選択器SEL1から出力された前回データ「a0」を減算し、減算値「d0(=a0´−a0)」を選択器SEL3に出力する。また、入力更新データ「a0´」はレジスターR00に対応するためwrite_0_0からwrite_0_7の論理和s0はHレベルとなり、遅延器DEL1はHレベルのセレクト信号select1を選択器SEL3に出力する。そのため、選択器SEL3は、Hレベルのセレクト信号select1に基づいて、減算器SUB1からの出力「d0」を選択し乗算器MUL1に出力する。
一方、選択器SEL2は、updateする組の番号s10(=0)に基づいて、レジスターR10に保持された前回データ「b0」を選択して減算器SUB2と遅延器DEL3に出力する。この場合、入力更新データ「a0´」はレジスターR10〜R17には対応しないため、選択器SEL4にLレベルのセレクト信号select4が出力され、選択器SEL4は、セレクト信号select4に基づいて遅延器DEL3からの前回データ「b0」を選択し乗算器MUL1に出力する。
そして、次のクロックの立ち上がりタイミングで、乗算器MUL1は、選択器SEL3から出力された減算値「d0」と、選択器SEL4から出力された前回データ「b0」とを乗算し、乗算した値「q0(=d0(=a0´−a0)×b0)」を加算器ADD1に出力する。この例では複数のデータa0´〜a7´が連続するクロックサイクルで入力されるものの入力更新データ「a0´」は最初の入力である。そのため、連続入力検出回路EC1はLレベルのセレクト信号select5を選択器SEL5に出力し、選択器SEL5は、出力レジスターOUTから出力される前回の積和演算値「S7 8」を加算器ADD1に入力する。
次のクロックの立ち上がりタイミングで、加算器ADD1は、乗算器MUL1から入力された前回の積和演算結果からの差分値「q0」と前回の積和演算値「S7 8」とを加算し、加算値「S7 7(=S7 8+q0)」を出力レジスターOUTに出力する。これにより、出力レジスターOUTに入力更新データ「a0´」が反映された積和演算値「S7 7」が書き込まれる。
「a0´」に続いて入力される入力更新データ「a1´〜a7´」についても同様である。ただし、「a1´〜a7´」の演算時は、連続クロックサイクルで入力更新データが発生する場合に該当するため、加算器ADD1は、入力更新データ「ai´(i=1〜7)」に基づく差分値「qi」と、加算器ADD1から出力された前回の積和演算値「S7 8−i」とを加算し、出力レジスターOUTに出力する。そして、遅延器DEL5は、それぞれの入力更新データが反映された積和演算値が出力レジスターOUTに出力される都度、出力レジスターOUTに書き込み信号writeを出力する。
このように、本実施の形態例の積和演算器は、複数のデータを連続して入力する場合であっても、入力と演算のパイプライン処理によりそれぞれの入力更新データに基づく差分値を前回の積和演算値に順次加算することによって、それぞれ入力更新データに対応する更新後の積和演算値をその都度算出する。このため、本実施の形態例の積和演算値は、複数の入力更新データ「a0´〜a7´」がレジスターに蓄えられるのを待たずに演算を開始することができ、全ての入力更新データがレジスターに蓄えられるまでのデータ転送時間を要しない。これにより、図2の積和演算器が、積和演算値の演算にデータ「a0´〜a7´」が入力され始めてから20サイクル要するのに対し、本実施の形態例における積和演算器は12サイクルで積和演算値を算出することができる。
図9は、入力更新データとして「a2´」のみが更新される場合の図6の積和演算器における動作波形を表す図である。図8と同様にして、レジスターR00〜R07には前回データ「a0〜a7」が、レジスターR10〜R17には前回データ「b0〜b7」が、出力レジスターには前回の積和演算値「S7」が予め保持される。「di」、「qi」については図8と同様であり、「S7」は前回の積和演算値を、「S7´」は更新後の積和演算値を表す。
入力信号inputとして「a2´」が入力されると、選択器SEL1は、入力更新データ「a2´」に対応するupdateする組の番号s10(=2)に基づいて、レジスターR02が予め保持する前回データ「a2」を次のクロックの立ち上がりタイミングで遅延器DEL2と減算器SUB1に出力する。同時に、ライト信号write_0_2に応答して、レジスターR02に「a2´」が書き込まれる。
減算器SUB1は、入力更新データ「a2´」から、選択器SEL1から出力された前回データ「a2」を減算し、減算値「d2(=a2´−a2)」を選択器SEL3に出力する。そして、選択器SEL3は、遅延器DEL1からのHレベルのセレクト信号select3に基づいて、減算器SUB1からの出力「d2」を選択し乗算器MUL1に出力する。一方、選択器SEL4は、遅延器DEL4からのLレベルのセレクト信号select4に基づいて、遅延器DEL3からの前回データ「b2」を選択し乗算器MUL1に出力する。
そして、次のクロックの立ち上がりタイミングで、乗算器MUL1は、選択器SEL3から出力された減算値「d2」と、選択器SEL4から出力された前回データ「b2」とを乗算し、乗算値「q2(=(d2(=a2´−a2)×b2)」を加算器ADD1に出力する。この例は、連続するクロックサイクルで入力更新データが発生しない場合に該当するため、選択器SEL5は出力レジスターOUTから出力される前回の積和演算値「S7」を加算器ADD1に入力する。そして、加算器ADD1は、次のクロックの立ち上がりタイミングで、前回の積和演算値「S7」と乗算器MUL1からの出力「q2」とを加算し、加算値「S7´(=S7+q2)」を出力レジスターOUTに出力する。
このように、本実施の形態例の積和演算器は、演算対象の全ての値の要素データを積和演算し直す必要がなく、入力更新データ「a2´」がレジスターR02に蓄えられるのを待たずに演算を開始することができるため、特に、一部の要素「a2´」だけが更新された場合に、より少ない処理サイクルで積和演算値を算出することができる。これにより、図2の積和演算器が積和演算値の演算にデータ「a2´」が入力され始めてから13サイクル要していたのに対し、本実施の形態例における積和演算器は5サイクルで積和演算値を算出することができる。
従って、本実施の形態例の積和演算器は、演算対象の全ての要素データがレジスターに蓄えられるまでのデータ転送時間、及び、全ての要素データの演算時間を要しないことにより、図2の積和演算器に対してより少ない処理サイクルで積和演算値を算出することができる。
<第2の実施の形態例>
第1の実施の形態例では、2つの値「a」「b」の積和演算値を算出する積和演算器について述べたが、第2の実施の形態例では、さらに、値「c」を加えた値「a」「b」「c」の積和演算値を演算する積和演算器について述べる。第2の実施の形態例の積和演算器は、次の式3に基づいて積和演算値を算出する。
式3における、値「a」、値「a´」及び、値「b」については、式2と同様である。ただし、式3において、「S」は「a」と「b」と「c」の積和演算値(以下、前回の積和演算値)であり、「S´」は「a´」と「b」と「c」との積和演算値(以下、更新後の積和演算値)を表す。式3において、更新後の積和演算値「S´」は、前回の積和演算値「S」に対して、差分値「(aj´−aj)×bj×cj」が加算されることによって算出される。
図10は、式3において「n=8」とした場合の本実施の形態例における積和演算器の一例を表す図である。図6と同様に、同図の積和演算器では、値「a」の各要素a0〜a7はレジスターR00〜R07に、値「b」の各要素b0〜b7はレジスターR10〜R17に、値「c」の各要素c0〜c7はレジスターR20〜R27に格納される。また、本実施の形態例における積和演算器は、入力レジスター(レジスターR00〜R27)に前回データを、出力レジスターOUTに前回の積和演算値を保持する。
また、図10の積和演算器において、図6と同じ部分については同様の引用番号が付与される。同図の積和演算器は、さらに、レジスターR20〜R27、write_2_0からwrite_2_7の論理和s2、選択器SEL6、SEL7、減算器SUB3、遅延器DEL7、DEL8を有する。write_2_0からwrite_2_7の論理和s2はレジスターR20〜R27のいずれかに格納される入力更新データの有無を表す。また、同図の積和演算器では、入力信号inputとして、値「a」「b」「c」のいずれかの更新データが入力される。
図10の積和演算器の動作は、図6と同様である。同10の積和演算器では、値「a」「b」「c」のいずれかのデータが入力されるため、例えば、値「a´」のデータが入力された場合、write_0_0からwrite_0_7の論理和s0はHレベル、write_1_0からwrite_1_7の論理和s1、及びwrite_2_0からwrite_2_7の論理和s2はLレベルとなる。従って、乗算器MUL1は、値「a」に係る選択器SEL3による減算器SUB1からの減算値(aj´−aj)と、値「b」に係る選択器SEL4による遅延器DEL3からの前回データ(bj)と、値「c」に係る選択器SEL7による遅延器DEL7からの前回データ(cj)とを乗算する。
そして、乗算器MUL1は、乗算結果を前回の積和演算値からの差分値として加算器ADD1に出力する。この差分値は、上述した式3における「(aj´−aj)×bj×cj」に対応する。そして、加算器ADD1は、当該差分値と、出力レジスターOUTまたは前回の加算器ADD1からの出力のいずれかを加算し、更新後の積和演算値として出力レジスターOUTに出力する。
このように、本実施の形態例の積和演算器は、値「a」「b」に、さらに値「c」を加えた3つの値の積和演算値についても、図6の積和演算器と同様に、入力と演算のパイプライン処理により、前回の積和演算値に対して、更新された任意の要素データ(入力更新データ)に基づく前回の積和演算値との差分値を加算することによって、更新後の積和演算値を算出する。このため、積和演算器は、演算対象の全ての値「a」「b」「c」の要素データを積和演算し直す必要がなく、また、全ての入力更新データが対応するレジスターに蓄えられるのを待たずに演算を開始することができる。
これにより、本実施の形態例の積和演算器は、3つの値の積和演算値を算出する場合についても、演算対象の全ての要素データがレジスターに蓄えられるまでのデータ転送時間、及び、全ての要素データの演算時間を要しないことにより、より少ない処理サイクルで積和演算値を算出することができる。なお、本実施の形態例では3つの値の積和演算を行う場合について述べたが、本実施の形態例の積和演算器は、4つ以上の値の積和演算を行う場合にも有効である。
<第3の実施の形態例>
第1の実施の形態例では、値「a」「b」のいずれかの要素データが入力される積和演算器について述べたが、第3の実施の形態例では、値「a」「b」の同組の要素データが同時に入力される積和演算器について述べる。
第3の実施の形態例の積和演算器は、次の式4に基づいて積和演算値を算出する。式4において、値「a」、「a´」は式2と同様であり、値「b´=(b0´,b1´,b2´,…,an−1´)」は前回積和演算された古い値「b=(b0,b1,b2,…,bn−1)」である前回データに対してj番目の要素が更新されているものとする。そして、「S」は「a」と「b」の積和演算値(以下、前回の積和演算値)であり、「S´」は「a´」と「b´」の積和演算値(以下、更新後の積和演算値)を表す。
式4では、式2と同様に、更新後の積和演算値「S´」を、前回の積和演算値「S」に、「S´」と「S」の差分値を加算することによって求める。具体的に、更新後の積和演算値「S´」は、前回の積和演算値「S」から値「a」「b」のj番目の要素の乗算値「aj×bj」を減算し、値「a´」「b´」のj番目の要素の乗算値「aj´×bj´」を加算した値(S´=S−(aj×bj)+(aj´×bj´))である。従って、更新後の積和演算値「S´」は、前回の積和演算値「S」に差分値「−(aj×bj)+(aj´×bj´)」が加算されることにより算出される。
式1と式4とを比較すると、値の一部の要素が更新される場合、式1に対して式4の演算量は少ない。従って、式4は、式1に対してより少ない処理サイクルで更新後の積和演算値「S」を算出することができる。
図11は、式4において「n=8」とした場合の本実施の形態例における積和演算器の一例を表す図である。図6の積和演算器と同様に、同図の積和演算器では、値「a」の各要素a0〜a7はレジスターR00〜R07に格納され、値「b」の各要素b0〜b7はレジスターR10〜R17に格納される。また、同図の積和演算器では、各入力レジスターに前回データを、出力レジスターOUTに前回の積和演算値を保持する。また、同図の積和演算器には、値「a」「b」の同じ組の更新後のデータが同時に入力されるため、値「a」に対応する入力信号input_0と、値「b」に対応する入力信号inout_1とが入力される。
図11の積和演算器において、入力信号input_0として、値「a」に係る入力更新データが入力されると、入力更新データを書き込む前に、選択器SEL1はupdateする組の番号s10に対応するレジスターが予め保持する前回データを選択器SEL8と乗算器MUL3とに出力する。同時に、入力更新データに対応するレジスターがライト信号write_0_0〜write_0_7に応答して、対応するレジスターR00〜R07に入力更新データが書き込まれる。
同様にして、入力信号input_0と同じ組のデータであって、値「b」に係るデータが入力信号input_1として入力されると、入力更新データを書き込む前に、選択器SEL2はupdateする組の番号s10に対応するレジスターが予め保持する前回データを選択器SEL9と乗算器MUL3とに出力する。同時に、入力更新データに対応するレジスターがライト信号write_1_0〜write_1_7に応答して、対応するレジスターR10〜R17に入力更新データが書き込まれる。
続いて、選択器SEL8は、セレクト信号select8(write_0_0からwrite_0_7の論理和s0)に基づいて、入力更新データinput_0と、選択器SEL1から出力された入力更新データに対応する前回データのいずれかを選択し乗算器MUL2に出力する。具体的に、選択器SEL8は、セレクト信号select8がHレベルの場合は入力更新データinput_0を、セレクト信号select8がLレベルの場合は選択器SEL1から出力された前回データを乗算器MUL2に出力する。選択器SEL9についても同様である。
前述したとおり、本実施の形態例の積和演算器では、値「a」「b」の同組のデータが同時に入力されるため、write_0_0からwrite_0_7の論理和s0と、write_1_0からwrite_1_7の論理和s1とが、同時にHレベルとなる。この場合、乗算器MUL2は、両入力更新データinput_0、input_1を乗算した乗算値を(aj´×bj´)、乗算器MUL3は両入力更新データに対応する前回データを乗算した乗算値(aj×bj)を、それぞれ減算器SUB4に出力する。
そして、減算器SUB4は、乗算器MUL2が出力する両入力更新データの乗算値(aj´×bj´)から、乗算器MUL3からの出力である各前回データの乗算値(aj×bj)を減算し、前回の積和演算結果からの差分値として加算器ADD1に出力する。この差分値は、上述した式4における「−(aj×bj)+(aj´×bj´)」に対応する。そして、加算器ADD1は、当該差分値と、出力レジスターOUTまたは前回の加算器ADD1からの出力のいずれかを加算し、更新後の積和演算値として出力レジスターOUTに出力する。
このように、本実施の形態例の積和演算器は、値「a」「b」の任意の同組の要素データ(入力更新データ)を同時に更新する場合の積和演算値において、入力と演算のパイプライン処理により、前回の積和演算値に入力更新データに基づく前回の積和演算値との差分値を加算することにより、更新後の積和演算値を順次算出することができる。このため、積和演算器は、演算対象の全ての組の要素データを積和演算し直す必要がなく、また、全ての入力更新データが対応するレジスターに蓄えられるのを待たずに演算を開始することができる。
これにより、本実施の形態例の積和演算器は、値「a」「b」の任意の同組の要素データを同時に更新する場合において、演算対象の全ての要素データがレジスターに蓄えられるまでのデータ転送時間、及び、全ての要素データの演算時間を要しないことにより、より少ない処理サイクルで積和演算値を算出することができる。
<第4の実施の形態例>
第1の実施の形態例では、1セットの入力レジスター及び出力レジスターを有する積和演算器について述べたが、第4の実施の形態例では、複数の入力レジスター及び出力レジスター(以下、レジスターセット)を保持する積和演算器について述べる。第4の実施の形態例では、例えば、mセットの入力レジスター(レジスターR00_i〜R17_i(0≦i≦m−1))及び出力レジスター(OUT_i)を有する。そして、それぞれのレジスターセットに共有の演算部により、各レジスターセットの値「a」「b」の積和演算を行う。
図12は、第4の実施の形態例における積和演算器の一例を表す図である。同図の積和演算器は、さらに、updateするレジスターセットの番号s20を有する。updateするレジスターセットの番号s20とは、積和演算対象のレジスターセットの識別番号である。また、同図の積和演算器では、入力信号inputとして、updateするレジスターセットの番号s20で指定されたレジスターセットの値「a」「b」のいずれかの更新後のデータが入力される。
図12の積和演算値において、入力信号inputとしてデータが入力される際に、updateするレジスターセットの番号s20に基づいて、積和演算対象のレジスターセットが選択される。そして、updateするレジスターセットの番号s20で指定されたレジスターセットのレジスターR00_i〜R17_iに保持された前回データが選択器SEL1、SEL2を介して遅延器DEL2、DEL3及び減算器SUB1、SUB2に出力されると共に、当該レジスターに入力更新データが書き込まれる。その後、乗算器MUL1の差分値の演算処理までは、図6の積和演算器と同様である。
続いて、加算器ADD1は、乗算器MUL1から出力された差分値と、連続入力検出回路EC2の出力するセレクト信号select11に基づく前回の積和演算値とを加算する。連続入力検出回路EC2は、連続するクロックサイクルでデータが入力されたか否かに加え、updateするレジスターセットの番号c20が1つ前のクロックサイクルと同じか否かを判定する。連続入力検出回路EC2は、2つの条件が真の場合、選択器SEL11にHレベルのセレクト信号select11を出力し、2つの条件のいずれかまたは両方が真ではない場合は、選択器SEL11にLレベルのセレクト信号select11を出力する。
そして、選択器SEL11は、Hレベルのセレクト信号select11が出力された場合、加算器ADD1からの出力を再度加算器ADD1に入力し、Lレベルのセレクト信号select11が出力された場合、遅延器DEL9から入力されたupdateするレジスターセットの番号s20に基づく出力レジスターOUT_iが保持する前回の積和演算値を、加算器ADD1に入力する。つまり、加算器ADD1は、連続するクロックサイクルで入力更新データが発生し、かつ、1つ前のクロックサイクルとレジスターセット番号が同じである場合は加算器ADD1の前回の出力を、それ以外の場合はレジスターセット番号に対応する出力レジスターOUT_iの出力を、前回の積和演算値として入力とする。
そして、遅延器DEL10は、updateするレジスターセットの番号s20を入力更新データに対応する積和演算値が算出されるタイミングに遅延させ、updateするレジスターセットの番号s20に基づく出力レジスターOUT_iを選択し書き込み信号writeを出力する。
このように、本実施の形態例の積和演算器は、複数のレジスターセットを有し、更新された任意の要素データ(入力更新データ)に対応するレジスターセットの積和演算値を算出する場合についても、入力と演算のパイプライン処理により、前回の積和演算値に対して、入力更新データに基づく前回の積和演算値との差分値を加算することによって、当該レジスターセットの更新後の積和演算値を算出することができる。このため、積和演算器は、演算対象の全ての値の要素データを積和演算し直す必要がなく、また、全ての入力更新データが対応するレジスターに蓄えられるのを待たずに演算を開始することができる。
これにより、本実施の形態例の積和演算器は、演算対象の全ての要素データがレジスターに蓄えられるまでのデータ転送時間、及び、全ての要素データの演算時間を要しないことにより、複数のレジスターセットそれぞれの値「a」「b」の積和演算値をより少ない処理サイクルで高速に算出することができる。
<第5の実施の形態例>
図13、図14は、第5の実施の形態例における積和演算器の一例を表す図である。本実施の形態例は、図13の演算回路と、m個の図14の演算回路を有する。図13の演算回路は、入力信号data_0、data_iを、各図14の演算回路に出力する。入力信号data_0は入力更新データに対応する第1のレジスターセット(レジスターR00〜R07)の前回データであり、入力信号data_iは入力更新データに対応する第2のレジスターセット(レジスターR10_i〜R17_i(1≦i≦m))の前回データである。
第5の実施の形態例では、1組の第1のレジスターセット(レジスターR00〜R07)と、m組の第2のレジスターセット(レジスターR10_i〜R17_i)及び出力レジスターOUT_iを有する積和演算器について述べる。第5の実施の形態例では、例えば、m個の第2のレジスターセットの値と、第2のレジスターセットそれぞれに共有の第1のレジスターセットの値とをそれぞれ積和したm個の積和演算値を出力レジスターOUT_iに出力する。本実施の形態例における積和演算器は、例えば、行列とベクトルとの積を求める場合に有効である。この場合、第1のレジスターセットはベクトルに当たり、m個の第2のレジスターセットは「m×8」行列に当たる。
式5は、第2のレジスターセットを「m×8」行列(b1,0,b1,1,……,bm,7)、第1のレジスターセットをベクトル(a0,a1,…,a7)とした場合の行列とベクトルの積の演算を表す式である。式5の演算では、行列の各行とベクトルの演算「(bi,0×a0)+(bi,1×a1)+…+(bi,7×a7)」が行われ、「output_i」として算出される。
図13は、入力更新データに対応する各レジスターセットの前回データdata_0、data_iを出力する演算回路である。同図の演算回路において、第1のレジスターセット(レジスターR00〜R07)または第2のレジスターセット(レジスターR10_i〜R17_i)のいずれかの値が入力される。同図の演算回路において、入力信号inputとしてデータが入力されると、入力更新データが書き込まれる前に、選択器SELm0〜mmは各レジスターセットのupdateする組の番号s10に対応するレジスターが予め保持する前回データdata_0、data_iを出力する。同時に、入力更新データに対応するレジスターがライト信号write_0_0〜write_m_7に応答し、当該レジスターに入力更新データが書き込まれる。
図14は、第1のレジスターセットと、m個のうちの1つの第2のレジスターセットの積和演算値を算出する演算回路である。同図の演算回路は、例えば、行列とベクトルの積を求める演算の場合、行列内のある行とベクトルとの積の演算に当たる。また、write_0_0からwrite_0_7の論理和s0はレジスターR00〜R07のいずれかに格納される入力更新データの有無を、write_i_0からwrite_i_7の論理和siはレジスターR10_i〜R17_iのいずれかに格納される入力更新データの有無を表す。
図14の演算回路において、まず、入力更新データinputに加えて、入力更新データinputに対応する第1のレジスターセットの前回データdata_0が、入力更新データに対応する第2のレジスターセットの前回データdata_iが入力される。例えば、第1のレジスターセットに対応するデータが入力された場合、write_0_0からwrite_0_7の論理和s0はHレベル、write_i_0からwrite_i_7の論理和siはLレベルとなる。この場合、選択器SEL3は、減算器SUB1から入力される入力更新データinputから前回データdata_0の減算値を乗算器MUL1に出力し、選択器SEL4は、遅延器DEL3から入力される入力更新データに対応する第2のレジスターセットの前回データdata_iを乗算器MUL1に出力する。
そして、乗算器MUL1は、それぞれの選択器SEL3、SEL4からの入力を乗算し差分値として加算器ADD1に出力する。続いて、加算器ADD1は、当該差分値と、出力レジスターOUT_iまたは前回の加算器ADD1からの出力のいずれかを加算し、更新後の積和演算値として出力レジスターOUT_iに出力する。
図15は、図13及び図14の回路をバスに接続する回路を表す図である。同図において、図7のバス接続回路と同じ部分については、同様の引用番号が付与される。本実施の形態例におけるバス接続回路は、さらに、m(1≦i≦m)個の第2のレジスターセットのwrite_i_0からwrite_i_7の論理和siを対応する演算回路(図14)に出力する。なお、図15中ではs1からs(m-1)までの回路を省略し、smの回路で代表させている。また、論理和器L00〜L07は、各論理和器に対応する組のライト信号write_0_i、write_1_i、…、write_m_iの論理和をそれぞれエンコーダーE2に出力する。エンコーダーE2は、Hレベルの信号を出力する論理和器をupdateする組の番号s10として数値化し、図13の演算回路に出力する。
また、比較器C30は、検出アドレスがm個の図14の出力レジスターOUT_i(1≦i≦m)のアドレスに該当するかを比較し、一致する場合にゲートG3に読み出し信号を出力する。また、論理積器AND2は、検出アドレスに対応する出力レジスターOUT_iを選択するセレクト信号select20を選択器SEL20に出力する。具体的に、論理積器AND2は、例えば、連続するアドレスを付与した各出力レジスターOUT_iのアドレスの下所定数桁と、当該所定数の各桁に「1」を保持する値との論理積値を、セレクト信号select20として選択器SEL20に出力する。そして、選択器SEL20は、セレクト信号select20に基づいて、検出アドレスに対応する出力レジスターOUT_iが保持する値output_iをゲートG3からデータバスDBに出力する。
このように、本実施の形態例における積和演算器は、複数セットの第2のレジスター及び出力レジスターと共有の第1のレジスターセットを有し、更新された任意の要素データ(入力更新データ)に対応する複数セットの積和演算値を算出する場合についても有効である。本実施の形態例の積和演算器は、演算とパイプライン処理により、複数セットの前回の積和演算値に対してそれぞれ、入力更新データに基づく前回の積和演算値との差分値を加算することによって、当該複数セットの更新後の積和演算値を算出することができる。このため、積和演算器は、演算対象の全ての値の要素データを積和演算し直す必要がなく、また、全ての入力更新データが対応するレジスターに蓄えられるのを待たずに演算を開始することができる。
これにより、本実施の形態例の積和演算器は、複数セットの第2のレジスターセットと共有の第1のレジスターセットとの複数の積和演算値を算出する場合において、演算対象の全ての要素データがレジスターに蓄えられるまでのデータ転送時間、及び、全ての要素データの演算時間を要しないことにより、より少ない処理サイクルで複数セットそれぞれの積和演算値を算出することができる。このように、本実施の形態例における積和演算器は、例えば、行列とベクトルの積を高速に求めることができる。
<第6の実施の形態例>
第1の実施の形態例から第5の実施の形態例にかけて、積和演算値を算出する積和演算器について述べた。しかしながら、本発明の演算回路は、積和演算に限定されるものではなく、他の演算に対しても有効である。そこで、第6の実施の形態例では、積和演算以外の演算回路について述べる。
本実施の形態例では、例えば、値「a=(a0,a1,a2,…,an−1)」と値「b=(b0,b1,b2,…,bn−1)」の各組のそれぞれの論理積を排他的論理和する論理和・排他的論理和演算回路(以下、AND・XOR演算回路)について述べる。AND・XOR演算回路は、一般的に、次の式6に基づいてAND・XOR演算値を演算する。
式6において、関数fは論理積を求める関数であり、「A」は、値「a」と値「b」の各組の論理積がさらに排他的論理和された値である。式6に基づく演算回路では、例えば、値「a」のうち一部の要素のみが更新された場合に、値「a」「b」の全ての要素について論理積と排他的論理和をし直していた。
そこで、本実施の形態例の演算回路は、次の式7に基づいてAND・XOR演算値を求める。式7において、値「a´=(a0´,a1´,a2´,…,an−1´)」は、前回演算された古い値「a=(a0,a1,a2,…,an−1)」である前回データに対してj番目の要素が更新されているものとする。また、「A」は、値「a」と値「b」のAND・XOR演算値(以下、前回のAND・XOR演算値)であり、「A´」は値「a´」と値「b」のAND・XOR演算値(以下、更新後のAND・XOR演算値)を表す。
式7において、更新後のAND・XOR演算値「A´」は、「値「a」「b」のj番目の要素の論理積(f(aj,bj))と、値「a´」「b」のj番目の要素の論理積(f(aj´,bj))との排他的論理和」と前回のAND・XOR演算値「A」との排他的論理和によって求められる(A´=A^(f(aj,bj))^(f(aj´,bj)))。この演算式は、「A´=A^(f(aj^aj´,bj))」のようにまとめられる。従って、更新後のAND・XOR演算値「A´」は、前回のAND・XOR演算値「A」と、「f(aj^aj´,bj)」との排他的論理和によって求められる。
式6と式7とを比較すると、値の一部の要素が更新される場合、式6に対して式7の演算量は少ない。従って、式7は、式6に対してより少ない処理サイクルで更新後のAND・XOR演算値「A´」を算出することができる。
図16は、式7において「n=8」とした場合の本実施の形態例における回路の一例を表す図である。同図の演算回路において、値「a」の各要素a0〜a7はレジスターR00〜R07に、値「b」の各要素b0〜b7はレジスターR10〜R17に格納される。また、同様にして、本実施の形態例における演算回路は、レジスターR00〜R17に前回データを、出力レジスターに前回のAND・XOR演算値を保持する。また、値「a」または値「b」のいずれかの更新後のデータが入力信号inputとして入力される。
なお、図16の演算回路の式7「A^f(aj^aj´,bj)」と、図6の積和演算器の式2「S+(aj´−aj)×bj」において、式7の論理積は式2の積算に、式7の排他的論理和は式2の加減算に対応する。そのため、図16の演算回路は、図6の積和演算回路に対して、減算器SUB1、SUB2の代わりに排他的論理和器XOR1、XOR2を、乗算器MUL1の代わりに論理積器AND3を、加算器ADD1の代わりに排他的論理和器XOR3を有する。
図16の演算回路において、例えば、値「a´」のデータ(aj´)が入力信号inputとして入力された場合、排他的論理和器XOR1は、入力更新データinputと、選択器SEL1から出力された入力更新データに対応する前回データ(aj)との排他的論理和を演算して選択器SEL3に出力する(aj^aj´)。そして、選択器SEL3は、遅延器DEL1からのHレベルのセレクト信号select3に基づいて、排他的論理和器XOR1からの出力を選択して論理積器AND3に出力する。一方、選択器SEL4は、Lレベルのセレクト信号select4に基づいて、遅延器DEL3からの入力である、入力更新データに対応する前回データ(bj)を選択して論理積器AND3に出力する。
続いて、論理積器AND3は、選択器SEL3による排他的論理和器XOR1からの出力(aj^aj´)と、選択器SEL4による遅延器DEL3からの前回データ(bj)との論理積を演算し、排他的論理和器XOR3に出力する。この出力は、上述した式7における「f(aj^aj´,bj」に対応する。そして、排他的論理和器XOR3は、論理積器AND3からの出力と、出力レジスターOUTまたは前回の排他的論理和器XOR3からの出力のいずれかとの排他的論理和を求め、更新後のAND・XOR演算値として出力レジスターOUTに出力する。
このように、本実施の形態例の演算回路は、値「a」と値「b」のAND・XOR演算値を求める場合についても、入力と演算のパイプライン処理により、前回のAND・XOR演算値に基づいて更新後のAND・XOR演算値を求めることができる。このため、本実施の形態例の演算回路は、演算対象の全ての値の要素データを演算し直す必要がなく、また、全ての入力更新データが対応するレジスターに蓄えられるのを待たずに演算を開始することができる。これにより、本実施の形態例の演算回路は、値「a」と値「b」のAND・XOR演算値を求める場合について、演算対象の全ての要素データがレジスターに蓄えられるまでのデータ転送時間、及び、全ての要素データの演算時間を要しないことにより、より少ない処理サイクルでAND・XOR演算値を算出することができる。
このように、本発明の演算回路は、積和演算以外の演算回路にも有効である。このような演算回路は、次のように一般化される。
まず、演算回路は、N個の要素を有する第1の値(a)、第2の値(b)とを保持するレジスターと、第1、2の値に対して「第1演算(積算、論理積)」したN個の第1演算値を、さらに「第2演算(加減算、排他的論理和)」した演算結果値(S、A)を保持するレジスターとを有する。
また、演算回路は、「入力された第1の値の1つの前記要素(aj´(=入力更新データ))と、当該要素に対応する第1の値の要素(aj)とに対して「第2演算(加減算、排他的論理和)」を行う第1の演算器」と、「第1の演算器の出力と、入力された第1の値の要素に対応する第2の値の要素(bj)とに対して「第1演算(積算、論理積)」を行う第2の演算器」を有する。さらに、演算回路は、第2の演算器の出力と、出力レジスターの演算結果値(S、A)とに対して「第2演算(加減算、排他的論理和)」を行って出力レジスターに出力する第3の演算器とを有する。
そして、前述の第2の演算器による演算は、「入力された第1の値の要素に対応する第1のレジスター内の第1の値の要素(aj)と当該要素に対応する第2の値の要素(bj)とに対する「第1演算(積算、論理積)」の結果を第2演算に基づいて打ち消す値と…(1)」、「入力された第1の値の要素(aj´)と当該要素に対応する第2の値の要素(bj)とに対する「第1演算(積算、論理積)」の結果…(2)」と、に対する「第2演算(加減算、排他的論理和)」…(3)について分配法則を満たす。
以下、上記の一般化された構成を第1の実施の形態例、及び、第6の実施の形態例に対応させて説明する。まず、第1の実施の形態例の積和演算器において、第1演算は積算、第2演算は加減算に当たる。また、演算結果値「S」は、値「a」と値「b」の各要素データの積算値を、さらに加算した積和演算値に当たる。
(1)について、「入力された第1の値の要素に対応する第1のレジスター内の第1の値の要素(aj)」と「当該要素に対応する第2の値の要素(bj)」とに対する積算の結果とは、「aj×bj」である。そして、「aj×bj」を加減算に基づいて打ち消す値とは、「aj×bj」に加減算することによって「0」となる値、即ち、「−(aj×bj)」を示す。そして、(2)について、「入力された第1の値の要素(aj´)」と「当該要素に対応する第2の値の要素(bj)」とに対する積算の結果は、「aj´×bj」であるため、(3)は「−(aj×bj)+(aj´×bj)」である。
第1の実施の形態例における第2の演算器の演算は「(aj´−aj)×bj」であり、当該演算は(3)「−(aj×bj)+(aj´×bj)」に対して分配法則を満たしている。従って、第1の実施の形態例における演算回路は、上記の構成に該当する。
続いて、第6の実施の形態例の積和演算器において、第1演算は論理積、第2演算は排他的論理和に当たる。また、演算結果値「A」は、値「a」と値「b」の各要素データの各論理積を、さらに排他的論理和したAND・XOR演算値に当たる。
(1)について、「入力された第1の値の要素に対応する第1のレジスター内の第1の値の要素(aj)」と「当該要素に対応する第2の値の要素(bj)」とに対する論理積の結果とは、「f(aj,bj)」である。そして、「f(aj,bj)」を排他的論理和に基づいて打ち消す値とは、「f(aj,bj)」との排他的論理和が「0」となる値である。排他的論理和演算において、同じ値の排他的論理和は「0」となる。従って、「f(aj,bj)」を排他的論理和に基づいて打ち消す値は同値、即ち「f(aj,bj)」である。そして、(2)について、「入力された第1の値の要素(aj´)」と「当該要素に対応する第2の値の要素(bj)」とに対する論理積の結果は、「f(aj´,bj)」であるため、(3)は「(f(aj,bj))^(f(aj´,bj))」である。
第6の実施の形態例における第2の演算器の演算「f(aj^aj´,bj)」であり、当該演算は(3)「(f(aj,bj))^(f(aj´,bj))」に対して分配法則を満たしている。従って、第6の実施の形態例における演算回路は、上記の構成に該当する。
第1の実施の形態例の積和演算器、及び、第6の実施の形態例の演算回路は、上記のように一般化される。従って、本発明の演算回路は、上記の一般化した構成に該当する他の演算回路についても有効であり、当該演算回路は同様にして任意の値が更新された入力データに対する演算結果をより少ない処理サイクルで高速に求めることができる。
以上の実施の形態をまとめると、次の付記のとおりである。
(付記1)
N個の要素を有する第1の値を保持する第1のレジスターと、
N個の要素を有する第2の値を保持する第2のレジスターと、
前記第1の値と前記第2の値とが積和演算された積和演算値を保持する出力レジスターと、
入力された前記第1の値の1つの前記要素から、当該要素に対応する前記第1のレジスター内の前記第1の値の前記要素を減算する第1の減算器と、
前記第1の減算器の出力と、前記入力された第1の値の要素に対応する前記第2のレジスター内の前記第2の値の前記要素とを乗算する乗算器と、
前記乗算器の出力と、前記出力レジスターの前記積和演算値とを加算して前記出力レジスターに出力する加算器と、
を有することを特徴とする演算回路。
(付記2)
付記1において、さらに、
前記入力された第1の値の要素に対応する前記第1のレジスター内の第1の値の要素を選択して前記第1の減算器に出力する第1の選択器を有することを特徴とする演算回路。
(付記3)
付記1または2において、さらに、
入力された前記第2の値の1つの前記要素から、当該要素に対応する前記第2のレジスター内の前記第2の値の前記要素を減算する第2の減算器を有し、
前記乗算器は、前記第2の減算器の出力と、前記入力された第2の要素に対応する前記第1のレジスター内の前記第1の値の前記要素とを乗算することを特徴とする演算回路。
(付記4)
付記3において、さらに、
前記第1の値の要素が入力された場合は前記第1の減算器の出力を選択して前記乗算器に出力し、前記第2の値の要素が入力された場合は当該要素に対応する前記第1のレジスター内の前記第1の値の前記要素を選択して前記乗算器に出力することを特徴とする演算回路。
(付記5)
付記1または2において、さらに、
N個の要素を有する第3の値を保持する第3のレジスターを有し、
前記出力レジスターは、前記第1の値と前記第2の値に加え、前記第3の値が積和演算された積和演算値を保持し、
前記乗算器は、前記第1の減算器の出力と前記入力された第1の値の要素に対応する前記第2のレジスター内の前記第2の値の前記要素に加えて、前記第3のレジスター内の前記第3の値の前記要素を乗算することを特徴とする演算回路。
(付記6)
付記1または2において、
前記第1のレジスターは、前記第1の値を複数セット保持し、
前記第2のレジスターは、前記第2の値を複数セット保持し、
前記出力レジスターは、前記複数セットの第1、第2の値それぞれの前記積和演算値を保持し、
前記第1の減算器は、入力された前記複数セットのうち第1セットの前記第1の値の1つの要素から、当該要素に対応する前記第1セットの前記第1のレジスター内の第1の値の要素を減算し、
前記乗算器は、前記第1の減算器の出力と、前記第1セットの第1の値の要素に対応する前記第1セットの前記第2のレジスター内の第2の値の要素とを乗算し、
前記加算器は、前記乗算器の出力と、前記第1セットの前記出力レジスターの前記積和演算値とを加算することを特徴とする演算回路。
(付記7)
付記1または2において、
前記第2のレジスターは、前記第2の値を複数セット保持し、
前記出力レジスターは、第1の値と前記複数セットの第2の値それぞれとの前記積和演算値を保持し、
前記乗算器は、前記複数セット毎に、前記第1の減算器の出力と、前記入力された第1の値の要素に対応する当該複数セットのそれぞれの前記第2のレジスター内の第2の値の要素とを乗算し、
前記加算器は、前記複数セット毎に、前記乗算器の出力と、当該複数セットそれぞれの出力レジスターの前記積和演算値とを加算して当該出力レジスターに出力することを特徴とする演算回路。
(付記8)
N個の要素を有する第1の値を保持する第1のレジスターと、
N個の要素を有する第2の値を保持する第2のレジスターと、
前記第1の値と前記第2の値とが積和演算された積和演算値を保持する出力レジスターと、
入力された前記第1の値の1つの前記要素と、当該要素に対応し、入力された前記第2の値の1つの前記要素とを乗算する第1の乗算器と、
前記入力された第1の値の要素に対応する前記第1のレジスター内の前記第1の値の前記要素と、前記入力された第2の値の要素に対応する前記第2のレジスター内の前記第2の値の前記要素とを乗算する第2の乗算器と、
前記第1の乗算器の出力から前記第2の乗算器の出力を減算する減算器と、
前記減算器の出力と、前記出力レジスターの前記積和演算値とを加算して前記出力レジスターに出力する加算器と、
を有することを特徴とする演算回路。
(付記9)
N個の要素を有する第1の値を保持する第1のレジスターと、
N個の要素を有する第2の値を保持する第2のレジスターと、
前記第1の値と前記第2の値とに対して第1演算したN個の第1演算値を、さらに第2演算した演算結果値を保持する出力レジスターと、
入力された前記第1の値の1つの前記要素と、当該要素に対応する前記第1のレジスター内の前記第1の値の前記要素とに対して前記第2演算を行う第1の演算器と、
前記第1の演算器の出力と、前記入力された第1の値の要素に対応する前記第2のレジスター内の前記第2の値の前記要素とに対して前記第1演算を行う第2の演算器と、
前記第2の演算器の出力と、前記出力レジスターの前記演算結果値とに対して前記第2演算を行って前記出力レジスターに出力する第3の演算器と、
を有し、
前記第2の演算器による演算は、前記入力された第1の値の要素に対応する前記第1のレジスター内の第1の値の要素と、当該要素に対応する前記第2のレジスター内の第2の値の要素とに対する前記第1演算の結果を前記第2演算に基づいて打ち消す値と、前記入力された第1の値の要素と、当該要素に対応する前記第2のレジスター内の第2の値の要素とに対する前記第1演算の結果と、に対する前記第2演算について分配法則を満たすことを特徴とする演算回路。
(付記10)
付記9において、
前記第1演算は論理積であり、前記第2演算は排他的論理和であることを特徴とする演算回路。
(付記11)
付記9において、
前記第1演算は積であり、前記第2演算は加減であることを特徴とする演算回路。