説明

内積演算装置および内積演算方法

【課題】乗算器を使用しないハードウェア量の少ない演算器構成で、高並列に適したサイクルタイムの高速化が図れるとともに、ROMを用いなくても内積演算が効率よくかつ精度低下なく行うことができる内積演算装置および内積演算方法を提供する。
【解決手段】複数の入力ベクトル要素を格納する入力要素レジスタ2と、定数ベクトル要素の2のべき乗項と入力ベクトル要素との部分積を求めるバレルシフタ3と、部分積の累算を行う加減算器4と、加減算器の累算結果が格納されるアキュムレータ5と、アキュムレータ5に格納された累算途中の結果の切捨てを行うシフタ6と、定数ベクトル要素の最下位の2のべき乗項の同じ項にかかる全ての入力ベクトル要素の部分積の累算を行わせて順次高位の2のべき乗項にかかる部分積の累算を繰り返して最上位の2のべき乗項まで繰り返させる演算制御手段と、を備えている。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、離散コサイン変換などの直交変換において行われるベクトル内積を演算する内積演算装置および内積演算方法に関する。
【背景技術】
【0002】
ベクトル内積演算は、画像圧縮処理などの分野で多用される離散コサイン変換に代表される直交変換の中核をなす演算であるが、その演算量が膨大となるため実時間処理など高速処理の要求に応えるためには、一般的には大規模なハードウェア量が必要となり装置のコストは増大する傾向にある。以下に内積演算の応用される離散コサイン変換(Discrete Cosine Transform:以下、DCTという)処理について簡単に説明を行う。以下の式が1次元の数列に対する、N次DCTの一般式である。
【0003】
【数1】

【0004】
前記式をN=8とした8次のDCT処理は以下の行列積の式で表される。
【0005】
【数2】

【0006】
この式の右辺の行列はDCT係数行列と称され、小数点数値表現すると以下の行列となる。
【0007】
【数3】

【0008】
このような行列式をデジタルハードウェア演算装置で処理するために、例えば固定小数点演算用に正負符号と10ビット桁の整数で表すと以下の整数行列式となる。
【0009】
【数4】

【0010】
平面画像信号を対象とするDCT処理は前記式のごとく8次のものが多く、例えばJPEG(Joint Photographic Experts Group)方式で用いられるDCTは水平方向8画素、垂直方向8画素の8×8画素について、垂直方向の1次元DCTを施したのち水平方向の1次元DCTを施して8×8の2次元平面上の周波数成分に分解する、所謂2次元DCTとして採用されている。以降、説明を容易にするため、入力ベクトルの要素は画素値として一般的な8ビット整数値、DCT係数は典型的なハードウェア構成として一般的な8から16ビット程度の固定小数点表現とする。
【0011】
ここで数4において、出力ベクトルZの要素であるZ1の計算に着目するとDCT係数行列の2行目の枠で囲まれた部分行ベクトル(502,426,284,100,−100,−284,−426,−502)と入力ベクトル(X0,X1,X2,X3,X4,X5,X6,X7)の内積演算に他ならず、8回の乗算と7回の加減算が必要となる。このように内積演算は多くの乗算と加算を内包しその演算量が多く、高速に処理するためのハードウェアが多く考案されている。
【0012】
図15に従来の内積演算装置の例を示す。図15に示された内積演算装置100は、加減算器101、102、103、104と、レジスタ105、106、107、108と、乗算器109、110、111、112と、並列加算器113と、備えている。
【0013】
図15の内積演算装置100は、入力ベクトルXの各要素とDCT係数の乗算を入力ベクトルXの要素ごとに乗算器109、110、111、112で並列に実行し、それぞれの乗算結果を並列加算器113で総和することで内積演算を実行する。入力ベクトルの要素X0〜X7は一括してそれぞれの乗算器109、110、111、112に並列に入力され、DCT係数は定数であることからレジスタに置かれ乗算器109、110、111、112に入力される。なお、DCT係数はROMに格納しても良い。
【0014】
ここで、内積にかかるDCT係数行列の部分行ベクトルを(C0,C1,C2,C3,C4,C5,C6,C7)とすると、DCT係数の性質上C0とC7、C1とC6、C2とC5,C3とC4の絶対値が対称関係となるため、対称な係数に対応する入力Xの要素すなわちX0とX7、X1とX6、X2とX5,X3とX4の加算または減算を係数の正負符号にあわせて先に行うことで(バタフライ演算)、乗算回数を4回に減じたハードウェア構成となっている。
【0015】
しかしながら上述した構成は乗算回数分の複数の乗算器が必要となることが本質であり、乗算器は一般的にハードウェア規模が大きく、費やす素子数、回路面積、消費電力が大きいうえに、演算桁数が増えると回路内の伝播遅延によりサイクルタイムが低下する問題点がある。また、処理の高速化のために複数の内積結果を複数の内積演算器で同時並列に実行しうるように並列化した演算器構成を構築することもできるが、個々の演算器のハードウェア規模が大きいと、ハードウェア資源であるシリコン面積、電子プリント基板面積は、有限かつ小型化を求められるため大規模に並列化することが困難となる問題点もある。さらに、回路規模の制約から、乗算器や加減算器の桁数の制限がある場合は、入力桁を丸めたり、あるいは積項の乗算結果を丸めたりする必要があり、真の下位桁からの部分積の累算が行われず演算精度が低下するという欠点があった。
【0016】
また、乗算器を使用しない内積演算装置としては、例えば特許文献1や2に記載のものが提案されている。図16に乗算器を使用しない内積演算装置の例を示す。図16に示された内積演算装置200は、ROM201と、加減算器202と、アキュムレータ203と、シフタ204と、備えている。
【0017】
図16に示された内積演算装置200は、A〜Dが入力ベクトル要素で4ビット幅、定数ベクトル要素C0〜C3は16ビット幅としている。内積演算装置200では、定数ベクトルの各要素が固定値であることから、入力ベクトルとの内積演算において、入力ベクトルが4ビット幅であることからこれをb3,b2,b1,b0と二進値で表すと、入力ベクトルにおける最下位のビットスライスはA(b0),B(b0),C(b0),D(b0)と表され、これに対する部分内積は、C0×A(b0)+C1×B(b0)+C2×C(b0)+C3×D(b0)となる。
【0018】
A(b0),B(b0),C(b0),D(b0)はそれぞれ、1か0の2値の値しかとらないため、ビットスライスに対する部分内積はC0〜C3の単純な加減算に帰結する。C0〜C3は固定値の定数ベクトルであるから、ビットスライスA(b0),B(b0),C(b0),D(b0)の出現パターンにしたがって、予め計算された部分内積をROM201に格納しておき、演算では入力ベクトルのビットスライスのビットパターンによりROM201を読み出すことにより部分内積を読み出すことができる。これをROMアキュムレータと称しRACと略称される。内積演算では、最下位のビットスライスから始めて上位に向かって部分内積を累算してゆくことで内積演算が達成される。部分内積の累算は加減算器202とアキュムレータ203で行われ、アキュムレータ203をシフタ204で右シフトして上位桁の累算を開始する。
【0019】
図16に示された内積演算装置200では、シフトと加減算で内積演算が実現可能でありハードウェア量が少ないこと、部分内積の演算がRACとしてROM化されているので高速に動作すること、下位桁の部分内積から順に累算してゆくので必要な結果精度に応じて、演算器の語長を選択できてかつそれが乗算の演算語長より小さな桁の構成であっても、下位桁からの部分内積の累算を完遂しているので演算精度が確保される利点がある。
【発明の概要】
【発明が解決しようとする課題】
【0020】
上述したように、従来の専用の乗算回路と加減算器とアキュムレータとを有するような積和演算装置では、乗算回路の回路量が大きくなり、コストが増大する問題点があった。乗算回路は特に配列型の乗算器を有する場合は、その回路内容が複雑で規則性が低下し、かつ個々のハードウェア量が大きいことから、複数演算器を大規模に並列に構成するようなSIMD(Single Instruction-stream Multiple Data-stream)型の演算器構成を選択することが困難であった。また、乗算回路を有する装置では乗算回路が複雑かつ大規模であるために信号伝播時間が増大し演算装置全体のサイクルタイムが低下する問題点があった。さらに、小規模な演算ブロックを大規模高並列に構成して内積演算装置を構成する場合や、既定のマイクロプロセッサなどの演算装置で内積演算をプログラミングするような場合などでは、演算桁数に制限があることから入力自身の桁数を落としたり、あるいは積項の乗算結果を丸めたりして途中の演算桁を制限せざるを得ず、内積演算の精度が落ちてしまうという問題点があった。
【0021】
また、ROMアキュムレータを用いて部分内積の累積加減算とシフト動作によって内積演算を行う内積演算装置は、下位桁から順に部分内積を累算してゆく構造であるため、積項の演算精度がすべて保証され、内積演算の精度低下はないが、ROMアキュムレータの有するROMの容量は、入力の語長と内積を行うベクトルの要素数すなわち積項の数が増大するにしたがって増大してしまうという問題点があった。このことは、大規模な並列演算器を構成する場合、同一のROMを多数複製せざるを得ず、ハードウェア面積の利用効率も悪く並列化の規模が制限されてしまう問題点もあった。
【0022】
本発明はかかる問題を解決することを目的としている。
【0023】
すなわち、本発明は、乗算器を使用しないハードウェア量の少ない演算器構成で、高並列に適してサイクルタイムの高速化が図れるとともに、ROMを用いなくても内積演算が精度低下なく行うことができる内積演算装置および内積演算方法を提供することを目的としている。
【課題を解決するための手段】
【0024】
上記課題を解決するためになされた請求項1に記載された発明は、所定のビット語長を有する複数の入力ベクトル要素から構成される入力ベクトルと複数の定数ベクトル要素から構成される定数ベクトルとの内積を求める内積演算装置において、前記複数の入力ベクトル要素を格納する格納手段と、前記格納手段から前記入力ベクトル要素を選択して、選択された前記入力ベクトルを左ビットシフトさせることにより前記定数ベクトル要素の2のべき乗項と入力ベクトル要素との部分積を求めるシフト手段と、前記シフト手段が求めた前記部分積を累算するとともに、前記入力ベクトル要素と前記定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成された加減算手段と、前記加減算手段の累算結果を格納するアキュムレータと、予め定めた桁数のビットシフトにより前記加減算手段による累算途中の前記アキュムレータに格納された結果の切り捨てを行って演算結果の丸めを行う丸め手段と、前記加減算手段に、前記定数ベクトル要素の最下位の2のべき乗項の同じ項にかかる全ての入力ベクトル要素の部分積の累算を行わせて前記アキュムレータに格納させて、以降、順次高位の2のべき乗項にかかる部分積の累算を繰り返して最上位の2のべき乗項まで繰り返させるとともに、前記加減算手段の桁あふれが発生する前に前記丸め手段により類算途中の前記アキュムレータに格納された結果の下位桁を切捨てさせて、以降の累算の初期値とするように動作させる演算制御手段と、を備えていることを特徴とする内積演算装置である。
【0025】
請求項2に記載された発明は、請求項1に記載された発明において、前記演算制御手段が、予め定めたテーブルに基づいて、前記シフト手段に対して前記入力ベクトル要素の2ビット毎に前記部分積を求めさせ、前記加減算手段に対して該部分積を累算させることを特徴とするものである。
【0026】
請求項3に記載された発明は、請求項1または2に記載された発明において、前記丸め手段が前記加減算手段による累算途中の前記アキュムレータに格納された結果の切り捨てを行うビット桁数は、前記加減算手段のビット語長から前記入力ベクトル要素のビット語長および前記入力ベクトル要素数の2を底とする対数を減じた数以下のビット桁数として予め定められていることを特徴とするものである。
【0027】
請求項4に記載された発明は、所定のビット語長を有する複数の入力ベクトル要素から構成される入力ベクトルと複数の定数ベクトル要素から構成される定数ベクトルとの内積を求める内積演算装置において、前記複数の入力ベクトル要素を格納する格納手段と、前記格納手段から前記入力ベクトル要素を選択して、前記定数ベクトル要素の2のべき乗項と選択された前記入力ベクトル要素との部分積を求めて累算するとともに、前記入力ベクトル要素と前記定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成された加減算手段と、前記加減算手段の累算結果を自身の上位桁側に格納するアキュムレータと、前記アキュムレータの内容を下位桁方向に右ビットシフトして以降の累算値とするとともに、前記入力ベクトル要素と前記定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成された第一シフト手段と、前記加減算手段に、前記定数ベクトル要素の同じ桁の2のべき乗項の同じ項にかかる全ての入力ベクトル要素の部分積の累算を行わせて前記アキュムレータに格納させて、前記第一シフト手段に前記アキュムレータに格納された累算結果を右ビットシフトさせる動作を前記定数ベクトル要素の2のべき乗項の最上位桁まで繰り返させる演算制御手段と、を備えていることを特徴とする内積演算装置である。
【0028】
請求項5に記載された発明は、請求項4に記載された発明において、前記格納手段に格納された前記入力ベクトル要素を2倍する第二シフト手段を備え、前記演算制御手段が、予め定めたテーブルに基づいて、前記格納手段に格納された前記入力ベクトル要素または前記第二シフト手段が2倍にした入力ベクトル要素のいずれかを選択して前記加減算手段に累算させるとともに、前記第一シフト手段に2ビットシフトさせることを特徴とするものである。
【0029】
請求項6に記載された発明は、所定のビット語長を有する複数の入力ベクトル要素から構成される入力ベクトルを格納する格納手段と、前記入力ベクトルを左ビットシフトさせることにより複数の定数ベクトル要素から構成される定数ベクトルの2のべき乗項と前記入力ベクトル要素との部分積を求めるシフト手段と、前記シフト手段が求めた前記部分積を累算するとともに、前記入力ベクトル要素と前記定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成された加減算手段と、前記加減算手段の累算結果を格納するアキュムレータと、を備えたマイクロプロセッサでオペランドの加減算とシフトが一体に実行可能な命令を用いて前記入力ベクトルと前記定数ベクトルとの内積を求める内積演算方法において、前記シフト手段が前記格納手段から前記入力ベクトル要素を選択して前記部分積を求める第一の工程と、前記加減算手段に、前記定数ベクトル要素の最下位の2のべき乗項の同じ項にかかる全ての前記入力ベクトル要素の前記部分積の累算を行わせて前記アキュムレータに格納させる第二の工程と、前記加減算手段の桁あふれが発生する前に前記アキュムレータに格納させている類算途中の前記アキュムレータに格納された結果の下位桁を切捨てて、以降の累算の初期値とする第三の工程と、を備え、前記第一の工程と前記第二の工程を順次高位の2のべき乗項にかかる部分積の累算を繰り返して最上位の2のべき乗項まで繰り返すとともに、前記第一の工程と前記第二の工程の繰り返しの途中に少なくとも前記第三の工程を1回以上行うことを特徴とする内積演算方法である。
【0030】
請求項7に記載された発明は、請求項6に記載された発明において、前記第一の工程は、前記入力ベクトル要素自身または前記入力ベクトル要素の2倍の値のいずれかを選択して前記部分積を求め、前記第二の工程は、前記部分積の累算を2ビット毎に行うことを特徴とするものである。
【0031】
請求項8に記載された発明は、請求項6または7に記載の発明において、前記第三の工程で前記加減算手段による累算途中の前記アキュムレータに格納された結果の切り捨てを行うビット桁数は、前記加減算手段のビット語長から前記入力ベクトル要素のビット語長および前記入力ベクトル要素数の2を底とする対数を減じた数以下のビット桁数として予め定められていることを特徴とするものである。
【発明の効果】
【0032】
請求項1に記載の発明によれば、乗算回路を使用せず、加減算手段とアキュムレータとシフト手段とを有する累積加減算構造で装置を構成するために、規則性が高く、高並列に適したハードウェア量の小さい演算装置を構成できる。また、下位桁から順に部分積の累算を実行し、上位桁に必ず下記桁の部分積和結果が反映されるので演算精度が低下することなく内積演算を行うことができる。また、累算途中でアキュムレータの内容を丸め手段によって右シフトして丸めることができるので、積項の乗算語長より小さい桁数の加減算器とアキュムレータであっても桁あふれを起こすことなく精度低下のない内積演算を行うことができる。
【0033】
請求項2に記載の発明によれば、演算制御手段が、ブースのアルゴリズムを適用して、定数ベクトルの2ビット毎の部分積の累算を行わせることができ、制御ステップが削減され、さらに少ないサイクル数で演算することができる。
【0034】
請求項3に記載の発明によれば、積項の乗算語長より小さい桁数の加減算器とアキュムレータであっても、確実に桁あふれを起こさずに内積演算を行うことができる。
【0035】
請求項4に記載の発明によれば、乗算回路を使用せず、加減算手段とアキュムレータと、シフト手段を有する累積加減算構造で装置を構成するために、規則性が高く、高並列に適したハードウェア量の小さい演算装置を構成できる。また、下位桁から順に部分積の累算を実行するよう動作するため、上位桁に必ず下位桁の部分積和結果が完遂し反映されるので演算精度が低下することなく内積演算を行うことができる。また、累算途中でアキュムレータの内容を右シフトして丸めることができるので、積項の乗算語長より小さい桁数の加減算器とアキュムレータを有する演算装置であっても桁あふれを起こすことなく、精度低下のない内積演算を行うことができる。さらに、入力を任意桁左シフトするためのバレルシフタを有しないので、さらに回路規模を小さくすることができる。
【0036】
請求項5に記載の発明によれば、演算制御手段が、ブースのアルゴリズムを適用して、定数ベクトルの2ビット毎の部分積の累算を行うことができ、制御ステップが削減され、さらに少ないサイクル数で演算することができる。
【0037】
請求項6に記載の発明によれば、オペランドのシフトが一体となった加減算命令を持つマイクロプロセッサにおいて、下位桁から順に部分積の累算を実行するので、上位桁に必ず下記桁の部分積和結果が完遂し反映されるために演算精度が低下することなく内積演算を行うことができる。また、累算途中でアキュムレータの内容を右シフトして丸める第三のステップを備えるのでので、積項の乗算語長より小さい桁数の加減算器とアキュムレータを有する演算装置でも桁あふれを起こすことなく精度低下のない内積演算を行うことができる方法が提供できる。
【0038】
請求項7に記載の発明によれば、ブースのアルゴリズムを適用して、定数ベクトルの2ビット毎の部分積の累算を行うので、累算すべき部分積の数が削減され、実行命令数をさらに少なくすることができる。
【0039】
請求項8に記載の発明によれば、積項の乗算語長より小さい桁数の加減算器とアキュムレータを備えた演算装置であっても、確実に桁あふれを起こさずに内積演算を行うことができる。
【図面の簡単な説明】
【0040】
【図1】本発明の第1の実施形態にかかる内積演算装置の構成図である。
【図2】図1に示された内積演算装置の内積演算動作を示したプログラムリストである。
【図3】本発明の第2の実施形態にかかる内積演算装置に適用されるブースのアルゴリズム表である。
【図4】本発明の第2の実施形態にかかる内積演算装置の内積演算動作を示したプログラムリストである。
【図5】本発明の第3の実施形態にかかる内積演算装置の構成図である。
【図6】図5に示された内積演算装置の内積演算動作を示したプログラムリストである。
【図7】本発明の第4の実施形態にかかる内積演算装置の構成図である。
【図8】図7に示された内積演算装置の内積演算動作を示したプログラムリストである。
【図9】本発明の第5の実施形態にかかる内積演算方法を実行するマイクロプロセッサの演算器部分の構成図である。
【図10】図9に示したマイクロプロセッサの機械語命令コードフォーマットである。
【図11】図9に示したマイクロプロセッサの内積演算動作を示したプログラムリストの一の部分である。
【図12】図9に示したマイクロプロセッサの内積演算動作を示したプログラムリストの他の部分である。
【図13】図9に示したマイクロプロセッサで動作する内積演算方法のフローチャートである。
【図14】本発明の第6の実施形態にかかるマイクロプロセッサの内積演算動作を示したプログラムリストである。
【図15】従来の内積演算装置を示した構成図である。
【図16】従来の内積演算装置を示した構成図である。
【発明を実施するための形態】
【0041】
(第1実施形態)
以下、本発明の第1の実施形態を、図1および図2を参照して説明する。図1は、本発明の第1の実施形態にかかる内積演算装置の構成図である。図2は、図1に示された内積演算装置の内積演算動作を示したプログラムリストである。
【0042】
図1に本発明の第1の実施形態にかかる内積演算装置1を示す。図1に示した内積演算装置1は、入力要素レジスタ2と、バレルシフタ3と、加減算器4と、アキュムレータ5と、シフタ6と、セレクタ7と、制御部8と、を備えている。
【0043】
格納手段としての入力要素レジスタ2は、8ビット語長でR0〜R7までの8つのレジスタから構成される。各レジスタに入力ベクトル要素(例えば、数4のX0〜X7)が格納され、制御部8からの制御信号により1つのレジスタが選択されバレルシフタ3に出力される。
【0044】
シフト手段としてのバレルシフタ3は、入力された入力ベクトル要素を任意の桁数の左シフトを行い、加減算器4の一方の入力に接続される。本実施例では、入力8ビット出力16ビット語長で、0〜9ビット桁の符号拡張付きの左シフト機能を有する。バレルシフタ3のシフト量は、制御部8からの制御信号によりサイクル毎に選択される。
【0045】
加減算手段としての加減算器4は、制御部8からの制御信号によりサイクル毎に加算か減算かの動作が選択される入出力とも16ビットの語長を有する演算器である。すなわち、入力ベクトル要素と定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成されている。加減算器4の出力は、アキュムレータ5に接続される。
【0046】
アキュムレータ5は、加減算器4による途中および最終の演算結果が格納される16ビットのレジスタである。アキュムレータ5の出力はシフタ6に接続される。
【0047】
丸め手段としてのシフタ6は、16ビット語長で、アキュムレータ5に格納された演算結果を、制御部8からの制御信号により5ビット固定桁の右シフトを行い、演算途中結果の切捨て丸めを行うことができる構成となっている。
【0048】
セレクタ7は、制御部8からの制御信号によりシフタ6の出力とアキュムレータ5の出力とを選択して加減算器4の他方の入力に接続されるとともに、演算結果として外部へ出力する。
【0049】
演算制御手段としての制御部8は、内積演算装置1の演算動作を制御し、演算動作ステップに応じて制御信号を、入力要素レジスタ2、バレルシフタ3、加減算器4、アキュムレータ5、シフタ6、セレクタ7に出力する。
【0050】
上述した構成の内積演算装置1は、ベクトル内積演算を行うために複数の入力ベクトル要素を格納するレジスタとそれを選択する手段を備えた入力要素レジスタ2を備え、乗算語長より小さい桁数の加減算器4を備えて、さらに、部分積の累算途中で加減算演算がオーバーフローしないように、累算が終了して不要となった下位桁を切り捨てるためのシフタ6を備えている。
【0051】
次に、上述した内積演算装置1の積和演算(内積演算)の処理の内容について説明する。
【0052】
例えば、符号付8ビット表現された入力ベクトルの要素X0、X1、X2、…X7と定数ベクトルの要素C0、C1、C2、…C7との内積演算が上述した内積演算装置1でどのようになされるかを説明する。定数ベクトルは、DCT処理のコサイン係数に相当する。以下、数4のDCT処理を表す整数行列式の出力要素Z1の内積演算方法を例示して説明する。
【0053】
以下の数値は10ビット固定小数点表現で表されたDCT係数行列の第2行ベクタ(数4の2行目)を抜き出してその整数値と符号および絶対値を2進表現したものである。
C0= 502 (+)1_1111_0110
C1= 426 (+)1_1010_1010
C2= 284 (+)1_0001_1100
C3= 100 (+)0_0110_0100
C4=−100 (−)0_0110_0100
C5=−284 (−)1_0001_1100
C6=−426 (−)1_1010_1010
C7=−502 (−)1_1111_0110
【0054】
これらの絶対値を2のべき乗項の多項式で表すと以下のとおりとなる(以降の式で*は乗算を示し、また、例えば2^1は2の1乗を示す)。
【0055】
【数5】

【0056】
ここでベクトル内積Zは一般的に、
【0057】
【数6】

【0058】
と表され、DCT結果の出力ベクトルの第2要素であるZ1は、下式で求められる。
【0059】
【数7】

【0060】
上式で502*X0の乗算は、
【0061】
【数8】

【0062】
と表され、これを展開すると、
【0063】
【数9】

【0064】
となる。
【0065】
2^1*X0は定数“502”の2の1乗項の部分積、2^4*X0は定数“502”の2の4乗項の部分積を表し、定数“502”の最上位桁である2の8乗項の部分積まで加算することで502*X0の乗算結果が得られる。
【0066】
つまり、それぞれの部分積はX0の2のべき乗倍となっているため、単純にデータの左シフト演算により求めることができ、それらを加減算器4で累算することで乗算結果が得られる。これが以降のシフトと加減算による積和演算の原理となる。以下に502*X0以外の項についても記載する。
【0067】
【数10】

【0068】
図2に上述した原理に則りZ1を求めるための動作のプログラムリストを示す。このプログラムは制御部8で動作する。図2の左端はステップ番号(行番号)を表し、ステップ番号の右側の部分で実際の制御内容を表している。
【0069】
図2のプログラムリストを説明すると、ステップ001でアキュムレータ5をリセットした後のステップ002〜005にかけて定数ベクトルの各要素の最下位のべき乗項であるbit1、すなわち2の1乗項に対する部分積を、該当する入力ベクトルの各要素を選択して左シフトすることにより求め、サイクルごとに順に累積加減算している。定数ベクトル要素C0,C1,C2,C3は正数、C4,C5,C6,C7は負数なので、その正負に応じて部分積を加算または減算する。このとき3番目の制御項で入力ベクトルの要素を選択し、4番目の制御項でバレルシフタ3による左シフト量、すなわち入力の2のべき乗倍の選択を行う。2番目の制御項は加減算器の加算か、減算か、を選択を表し、定数ベクトルの符号によって、加算か減算かを切替える役割を果たす。
【0070】
つまり、この1つのステップで、バレルシフタ3が、入力要素レジスタ2から入力ベクトル要素を選択して、選択された入力ベクトルを左ビットシフトさせることにより定数ベクトル要素の2のべき乗項と入力ベクトル要素との部分積を求め、加減算器4が、バレルシフタ3が求めた部分積を累算して、加減算器4の累算結果をアキュムレータ5に格納している。
【0071】
したがって、ステップ002〜005は、2^1*X0+2^1*X1+2^1*X6+2^1*X7の演算、すなわち、数10の各式の右端の項(定数ベクトルの各要素の最下位のべき乗項)の累積加減算を行っていることを示している。なお、本実施形態に示した定数ベクトルでは2の0乗項がすべて“0”のため2の1乗項を最下位のべき乗項として演算しているが、定数ベクトルの設定によっては2の0乗項が最下位のべき乗項となる場合もあり、その場合は、2の0乗項の累積加減算から行う。
【0072】
次に、ステップ006〜011にかけて、定数ベクトル各要素の2の2乗項の部分積を生成して累積加減算を行い、以下順にステップ012〜015にかけて2の3乗項の部分積、ステップ016〜019にかけて2の4乗項の部分積の加減算を行っている。
【0073】
この時点でアキュムレータ5の累算結果が最大で16ビット桁に達するため、以降の演算のオーバーフローを回避するために、次のステップ020では、2の5乗項の部分積の累積加減算を開始するにあたり、5番目の制御項でアキュムレータ5の内容をシフタ6で5ビット右シフトさせて、加減算器4に入力することで途中の累算結果の5ビット分、下位桁を切捨て丸めするように動作させる。すなわち、予め定めた桁数のビットシフトにより加減算器4による累算途中のアキュムレータ5に格納された結果の切り捨てを行って演算結果の丸めを行っている。累積加減算する部分積の桁合わせのために、ステップ020以降すなわち定数ベクトルの2の5乗項以降の部分積を求めるためのバレルシフト3のシフト量はゼロから開始される。
【0074】
このように下位桁の部分積から順に累積加減算を行うこと、演算途中で加減算値がオーバーフローしないように既に累積加減算を終えた途中結果の下位桁を右シフトして切捨て丸めを行うことが本発明の特徴である。画像圧縮などで使用されるDCT等の処理をデジタル演算器で処理する場合は、構成する演算器の語長が限られることから、累積加減算の途中結果の切捨て丸めを行うことで桁あふれを起こすことなく、精度低下のない内積演算を行うことができる。
【0075】
次に、ステップ026〜029にかけて2の6乗項の部分積の累積加減算を行い、ステップ030〜033にかけて2の7乗項の部分積の累積加減算を行い、ステップ034〜039にかけて2の8乗項の部分積の累積加減算を行っている。
【0076】
つまり、図2のプログラムリストを実行することで、加減算器4に、定数ベクトル要素の最下位の2のべき乗項の同じ項にかかる全ての入力ベクトル要素の部分積の累算を行わせてアキュムレータ5に格納させて、以降、順次高位の2のべき乗項にかかる部分積の累算を繰り返して最上位の2のべき乗項まで繰り返させるとともに、加減算部4の桁あふれが発生する前にシフタ6により類算途中のアキュムレータ5に格納された結果の下位桁を切捨てさせて、以降の累算の初期値とするように動作させている。
【0077】
この実施形態では、符号付き8ビットの入力ベクトルと、符号なし小数点以下10ビットの固定小数点の定数(係数)ベクトルとの内積演算により最終的には最大で整数部符号付11ビット小数部5ビットで計16ビットの演算結果が得られ、例えば2次元DCTであれば次段のDCT処理の入力として処理されることになる。
【0078】
本実施形態によれば、専用の乗算器をもたず、入力要素レジスタ2と加減算器4とアキュムレータ5とバレルシフタ3およびシフタ6を備えただけなので、ハードウェア量が少なく規則的な演算装置が構成できる。また、内積演算の片方のベクトル要素が定数であることを前提としているので、入力ベクトル要素(レジスタ)の選択、シフト量と加減算の簡単な制御のみで内積演算を実現することができる。また、従来の乗算器を用いた構成であれば、乗算結果の最大語長の加減算精度が必要であったが、同じ桁の部分積を下位から順に累算して行くことにより、乗算の最大語長より小さい語長の演算器構成でも、下位桁累算からの繰り上がりを落とすことなく、すなわち演算精度を確保して内積演算を行うことができる。また、累算途中でアキュムレータ5の内容をシフタ6によって右シフトして丸めることができるので、積項の乗算語長より小さい桁数の加減算器4とアキュムレータ5であっても桁あふれを起こすことなく精度低下のない内積演算を行うことができる。
【0079】
なお、本実施形態では演算途中結果の丸め処理において、演算器構成では5ビット固定の右シフトを行うシフタ6を備えるように構成されている。その切捨て桁数については次のようにして算出される。例えば、入力ベクトル要素の語長が8ビット、ベクトル要素の数が8、加減算器の語長が16ビットであれば、桁あふれを起こさずに累算できる部分積は、定数ベクトル要素の(16−(8+log28))+1=6ビットに相当するものまでである(加減算器4のビット語長から入力ベクトル要素のビット語長および入力ベクトル要素数の2を底とする対数を減じた数以下のビット桁数)。つまり定数ベクトル要素の最大6ビット分に相当する部分積までの累算は桁あふれなく演算可能であり、その時点で、既に累算の終了している6ビット分までの下位桁を切捨てることが可能である。但し本実施形態では内積演算の精度切捨てをなるべく小さくするために最大語長16ビット(整数部11ビット、小数部5ビット)で出力しているので、前記した最大切捨て可能桁である6ビット以下である5ビット固定桁の切捨てを、定数ベクトル要素5ビット分に相当する部分積の累算終了後に実行している。このように丸め桁数を予め決めておくことで、ハードウェア規模の大きな任意桁のバレルシフタを使用することなく固定桁数のシフタ6だけを使って途中累算結果の切捨て処理を行うことができる。
【0080】
(第2実施形態)
次に、本発明の第2の実施形態を図3および図4を参照して説明する。なお、前述した第1の実施形態と同一部分には、同一符号を付して説明を省略する。図3は、本発明の第2の実施形態にかかる内積演算装置に適用されるブースのアルゴリズム表である。図4は、本発明の第2の実施形態にかかる内積演算装置の内積演算動作を示したプログラムリストである。
【0081】
本実施形態は、構成は第1の実施形態と同じであるが、内積演算の制御を変更することで、よりサイクル数の少ない演算としている。本実施形態では2次のブースのアルゴリズムを適用して定数ベクトル要素の2ビットごとに部分積を生成することで、累算すべき部分積の数を減らし、より高速な演算を行うことができる。
【0082】
2次のブースのアルゴリズムでは、定数ベクトルの要素を乗数として10ビット2進値で、b9,b8,b7,b6,b5,b4,b3,b2,b1,b0と表したときに、乗数の各ビットである2のべき乗項ごとに入力ベクトル要素である被乗数との部分積を求めるのではなく、乗数の2ビット分ごと、すなわち下位から(b1,b0)の部分積、(b3,b2)の部分積、(b5,b4)の部分積、(b7,b6)の部分積、(b9,b8)の部分積を順に求めてゆく方法である。ただし、例えば(b1,b0)=(1,1)の場合は、部分積は被乗数の3倍の値となり別途加算器が必要となるがこれを回避するために図3に示した表にしたがって2のべき乗倍の部分積の生成に置き換える。
【0083】
図3に示した表の乗数の3ビットは最下位桁については(b1,b0,“0”)、次桁以降は(b3,b2,b1)、(b5,b4,b3)、(b7,b6,b5)、(b9,b8,b7)のビット値を示している。また、加算すべき部分積の“M”は被乗数自身を示し、“2M”は被乗数を2倍したものすなわち1ビット左シフトしたものを示している。
【0084】
ところでブースのアルゴリズムでは、加減算すべき部分積の数を減じるのみで、乗数側が定数であることから加減算すべき部分積は予めわかっており、本実施形態の場合は、第1の実施形態で示した演算器構成に加えて特別なハードウェアが必要となるわけではなく単に加減算すべき部分積が異なるのみであるので制御ステップを変更すればよい。
【0085】
図4に本実施形態の動作のプログラムリストを示す。図4も図2と同様に数4のZ1を求める場合のものである。このプログラムは制御部8で動作する。
【0086】
図4のプログラムリストを説明すると、ステップ001はアキュムレータ5のリセットを行い、演算をリセットしている。次に、ステップ002〜005は定数ベクトルの最下位2ビットすなわちb1,b0に対応する部分積の総和、すなわち部分内積を計算する。ここで、定数ベクトル要素C0〜C7は、
C0= 502 (+)1_1111_0110
C1= 426 (+)1_1010_1010
C2= 284 (+)1_0001_1100
C3= 100 (+)0_0110_0100
C4=−100 (−)0_0110_0100
C5=−284 (−)1_0001_1100
C6=−426 (−)1_1010_1010
C7=−502 (−)1_1111_0110
であるからそれぞれの定数ベクトル要素の下位2ビットを含む(b1,b0,“0”)のビットパターンと定数ベクトル要素の符号から図3に示したブースのアルゴリズム表を参照して、部分内積の演算を行う。
【0087】
したがって、ステップ002は、定数ベクトル要素C0が正数で(b1,b0,“0”)が“100”であるから図3より“−2M”すなわち被乗数である入力要素X0の2倍を減算している。ステップ003は、定数ベクトル要素C1が正数で(b1,b0,“0”)が“100”であるから図3より“−2M”すなわち被乗数である入力要素X1の2倍を減算している。ステップ004は、定数ベクトル要素C6が負数で(b1,b0,“0”)が“100”であるから図3より“−2M”すなわち被乗数である入力要素X6の2倍を加算している。ステップ005は、定数ベクトル要素C7が負数で(b1,b0,“0”)が“100”であるから“−2M”すなわち被乗数である入力要素X7の2倍を加算している。なお、定数ベクトルC2〜C5は(b1,b0,“0”)が“000”であるので、加減算すべき部分積は無い。つまり、各ステップで、バレルシフタ3が入力ベクトル要素の2ビット毎に部分積を求めて、加減算器4が該部分積を累算している。
【0088】
次に、ステップ006〜013は定数ベクトルの次の2ビットすなわちb3,b2に対応する部分積の総和、すなわち部分内積を計算している。ここで部分積の桁位置は2ビット上位のb2の位置が基準であり、加算すべき部分積“M”とは被乗数を4倍したもの、すなわち被乗数を2ビット左シフトしたものとなり、部分積“2M”とは被乗数を8倍したもの、すなわち被乗数を3ビット左シフトしたものとなる。
【0089】
したがって、ステップ006は、定数ベクトルC0が正数で(b3,b2,b1)が“011”であるから図3より“+2M”すなわち被乗数である入力要素X0の8倍を加算している。ステップ007は、定数ベクトルC1が正数で(b3,b2,b1)が“101”であるから図3より“−M”すなわち被乗数である入力要素X1の4倍を減算している。ステップ008は、定数ベクトルC2が正数で(b3,b2,b1)が“110”であるから図3より“−M”すなわち被乗数である入力要素X2の4倍を減算している。ステップ009は、定数ベクトルC3が正数で(b3,b2,b1)が“010”であるから図3より“+M”すなわち被乗数である入力要素X3の4倍を加算している。ステップ010は、定数ベクトルC4が負数で(b3,b2,b1)が“010”であるから図3より“+M”すなわち被乗数である入力要素X4の4倍を減算している。ステップ011は、定数ベクトルC5が負数で(b3,b2,b1)が“110”であるから図3より“−M”すなわち被乗数である入力要素X5の4倍を加算している。ステップ012は、定数ベクトルC6が負数で(b3,b2,b1)が“101”であるから図3より“−M”すなわち被乗数である入力要素X6の4倍を加算している。ステップ013は、定数ベクトルC7が負数で(b3,b2,b1)が“011”であるから図3より“+2M”すなわち被乗数である入力要素X7の8倍を減算している。
【0090】
次に、ステップ014〜021は定数ベクトルの次の2ビットb5,b4、ステップ022〜025は定数ベクトルの次の2ビットb7,b6、ステップ026〜031は定数ベクトルの次の2ビットb9,b8にそれぞれ対応する部分積の総和すなわち部分内積を累算する。ここで、ステップ018では第1の実施形態と同様に加減算器4でのオーバーフローを回避するために累算の途中結果の下位5ビット固定の切捨て処理を行っている。
【0091】
本実施形態によれば、定数ベクトル要素の2ビットごとに部分内積の累算を行うことで内積演算を遂行しているので、累算すべき部分積の個数が減じられ、制御ステップが削減でき、演算サイクル数をさらに削減できる。例えば第1の実施形態(図2)と本実施形態(図4)とを比較すると、図2では39ステップ必要であるのに対して、図4では31ステップと20%程度の演算速度の改善がなされることが明らかである。
【0092】
(第3実施形態)
次に、本発明の第3の実施形態を図5および図6を参照して説明する。なお、前述した第1、第2の実施形態と同一部分には、同一符号を付して説明を省略する。図5は、本発明の第3の実施形態にかかる内積演算装置の構成図である。図6は、図5に示された内積演算装置の内積演算動作を示したプログラムリストである。
【0093】
本実施形態では、図1に示した内積演算装置1に対して、バレルシフタ3とセレクタ7が削除されている。そして、加減算器4が11ビット語長の加減算器9となり、アキュムレータ5の後段には第一シフト手段としてのシフタ10が設けられている。
【0094】
加減算器9は、制御部8からの制御信号によりサイクル毎に加算か減算かの動作が選択される一方の入力が8ビット、他方の入力が11ビットで出力が11ビットとなっている演算器であり、8ビットの一方の入力には入力要素レジスタ2の出力が接続されている。すなわち、入力ベクトル要素と定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成されている。
【0095】
アキュムレータ5には、加減算器9の出力が上位側の11ビットに入力され、下位側の5ビットは後述するシフタ10の下位5ビットが入力されている。
【0096】
シフタ10は、16ビット語長で、アキュムレータ5に格納された演算結果を、制御部8からの制御信号により1ビット固定桁の右シフトを行う。
【0097】
上述した構成の内積演算装置1は、入力要素レジスタ2には複数の入力ベクトル要素を格納し、制御信号により1つが選択されて、加減算器9の一方に接続される。加減算器9は制御信号により、サイクル毎に加算か減算動作が選択される。加減算器9の出力は、アキュムレータ5に接続されており、途中および最終の演算結果が格納される。アキュムレータ5の出力はシフタ10に接続され、1ビットの右シフトを行い、アキュムレータ5に格納された演算途中結果を1ビット右シフトできる構成となっている。シフタ10は、同じ桁の部分積を累算している間はシフト動作を行わず、同桁の累算の終了後にシフト動作を行い上位桁の累算を開始する。シフト動作の有無は制御信号によって切替えられる。
【0098】
図6に本実施形態の動作のプログラムリストを示す。図6も図2、図4と同様に数4のZ1を求める場合のものである。このプログラムは制御部8で動作する。
【0099】
図6のプログラムリストを説明すると、ステップ001はアキュムレータ5のリセットを行い、演算をリセットしている。次に、ステップ002から005にかけて定数ベクトルの各要素の最下位のべき乗項であるbit1、すなわち2の1乗項に対する部分積を、該当する入力ベクトルの各要素を選択して、サイクルごとに順に累積加減算している。加減算器9の出力はアキュムレータ5の上位11ビットに接続されているので、アキュムレータ5の6ビット目を最下位ビットとして、最初の累算結果が得られる。定数ベクトル要素C0,C1,C2,C3は正数、C4,C5,C6,C7は負数なので、その正負に応じて部分積を加算または減算する。このとき3番目の制御項で入力ベクトルの要素を選択し、4番目の制御項でアキュムレータ出力の右シフトの制御を行う。2番目の制御項は加減算器9の加算か、減算かを選択する項で、定数ベクトル要素の符号によって、加算か減算かを切替える役割を果たす。つまり、この1つのステップで、加減算器9に、定数ベクトル要素の同じ桁の2のべき乗項の同じ項にかかる全ての入力ベクトル要素の部分積の累算を行わせてアキュムレータ5に格納している。
【0100】
次に、ステップ006では上位桁の部分積の累算を開始するためにアキュムレータ5の右シフトが選択されて加減算器9に入力される。このステップ006〜011にかけて、定数ベクトル各要素の2の2乗項の部分積の累積加減算が実行され、以下順にステップ012〜015にかけて2の3乗項、ステップ016〜019にかけて2の4乗項、ステップ020〜025にかけて2の5乗項、ステップ026〜029にかけて2の6乗項、ステップ030〜033にかけて2の7乗項、ステップ034〜039にかけて2の8乗項、の部分積の累積加減算をそれぞれ行う。また、本実施形態の数値例では2の9乗項は存在しない。つまり、シフタ10にアキュムレータ5に格納された累算結果を右ビットシフトさせる動作を行い、上位桁の部分積の累算を行う動作を最上位桁まで繰り返している。
【0101】
ステップ040、041はアキュムレータ5の内容をそれぞれ1ビットずつ右シフトするだけの動作がなされて有効桁の桁合わせが行われる。そして、最終的には整数部符号付11ビット小数部5ビットで計16ビットの演算結果が得られる。
【0102】
本実施形態によれば、個別の乗算器をもたず、入力要素レジスタ2と加減算器9とアキュムレータ5とシフタ10を有するだけなので、ハードウェア量が少なく規則的な演算装置が構成できる。また、内積演算の片方のベクトル要素が定数であることを前提としているので、入力ベクトル要素(レジスタ)の選択、シフト量と加減算の簡単な制御のみで内積演算を実現することができる。また、従来の乗算器を用いた構成であれば、乗算結果の最大語長の加減算精度が必要であったが、下位桁の部分積から順に累積加減算を行い、アキュムレータ5の語長を超えて右シフトされた途中の累算結果は自動的に切捨てられるように動作するので、同じ桁の部分積を下位から順に累算することにより、乗算の最大語長より小さい語長の演算器構成でも、下位桁累算からの繰り上がりを落とすことなく、すなわち演算精度を確保して内積演算を行うことができる。さらに、部分積を求める際にバレルシフタを用いていないので回路規模を小さくすることができる。
【0103】
(第4実施形態)
次に、本発明の第4の実施形態を図7および図8を参照して説明する。なお、前述した第1〜第3の実施形態と同一部分には、同一符号を付して説明を省略する。図7は、本発明の第4の実施形態にかかる内積演算装置の構成図である。図8は、図7に示された内積演算装置の内積演算動作を示したプログラムリストである。
【0104】
本実施形態は、第3の実施形態と基本的な構成は同じであるが、入力要素レジスタ2からの出力が、そのまま出力するか2倍(1ビットシフト)して出力するかを選択するように構成されている。したがって、入力要素レジスタ2の出力を2倍するための符号拡張機能付きの第二シフト手段としてのシフタ11と、セレクタ12が追加され、加減算器13の一方の入力が9ビットとなっている。
【0105】
また、第一シフト手段としてのシフタ14は、アキュムレータ5に格納された演算結果を、制御部8からの制御信号により2ビット固定桁の右シフトを行うように変更されている。
【0106】
本実施形態の基本動作は、第3の実施形態と同等であるが、第2の実施形態の説明のごとく2次のブースのアルゴリズムを採用して、定数ベクトル要素の2ビットごとに、下位ビットを付け加えた3ビットのパターンから加減算すべき部分積すなわち入力ベクトル要素自身“M”もしくは、その2倍値“2M”を累算する。すなわち、入力ベクトル要素またはシフトタ11が2倍にした入力ベクトル要素のいずれかを選択して加減算器13に累算する。自身もしくは2倍値の生成と選択は、シフタ11とセレクタ12をサイクルごとに制御することでこれを行う。定数ベクトル要素の2ビットごとに同位桁の部分積の累算を終了すると、上位桁の累算を開始するためにシフタ14でアキュムレータ5の内容が2ビット右シフトされて、次の加減算の入力となる。
【0107】
図8に本実施形態の動作のプログラムリストを示す。図8も図2、図4、図6と同様に数4のZ1を求める場合のものである。このプログラムは制御部8で動作する。
【0108】
図8のプログラムリストを説明すると、ステップ001はアキュムレータ5のリセットを行い、演算をリセットしている。ステップ002〜005にかけて定数ベクトルの各要素の最下位のべき乗項であるbit1とbit0の2ビットすなわち2の1乗項と2の0乗項に対する加減算すべき部分積として図3に示したブースのアルゴリズム表にしたがって入力ベクトルの各要素自身もしくはその2倍値をサイクルごとに累積加減算している。なお、演算内容については、第2の実施形態と同等であるので説明を省略する。加減算器13の出力はアキュムレータ5の上位11ビットに接続されているので、アキュムレータ5の6ビット目を最下位ビットとして、最初の累算結果が得られる。
【0109】
次に、ステップ006ではブースのアルゴリズムにしたがって、2ビット分上位桁の部分積の累算を開始するためにアキュムレータの内容がシフタ14によって、右シフトされて加減算器13に入力される。ステップ006〜013にかけては、定数ベクトル各要素の2の2乗項と2の3乗項の部分積の累積加減算が実行され、以下順にステップ014〜021にかけて2は4乗項と2の5乗項、ステップ022〜025にかけて2は6乗項と2の7乗項、ステップ026〜031にかけては2の8乗項と2の9乗項の部分積の累積加減算を行っている。
【0110】
ステップ032はアキュムレータ5の内容を2ビットずつ右シフトするだけの動作がなされ、有効桁の桁合わせが行われる。そして、最終的には整数部符号付12ビット小数部4ビットで計16ビットの演算結果が得られる。
【0111】
本実施形態によれば、定数ベクトル要素の2ビットごとに部分内積の累算を行うことで内積演算を遂行するので、累算すべき部分積の個数が減じられ、制御ステップが削減でき、演算サイクル数をさらに削減できる。例えば第3の実施形態(図6)と本実施形態(図8)とを比較すると、図6では41ステップ必要であるのに対して、図8では32ステップと20%程度の演算速度の改善がなされる。
【0112】
(第5実施形態)
次に、本発明の第5の実施形態を図9ないし図13を参照して説明する。なお、前述した第1〜第4の実施形態と同一部分には、同一符号を付して説明を省略する。図9は、本発明の第5の実施形態にかかる内積演算方法を実行するマイクロプロセッサの演算器部分の構成図である。図10は、図9に示したマイクロプロセッサの機械語命令コードフォーマットである。図11は、図9に示したマイクロプロセッサの内積演算動作を示したプログラムリストの一の部分である。図12は、図9に示したマイクロプロセッサの内積演算動作を示したプログラムリストの他の部分である。図13は、図9に示したマイクロプロセッサで動作する内積演算方法のフローチャートである。
【0113】
本実施形態は、マイクロプロセッサなどプログラム命令で実施可能な内積演算方法を示す。特に、専用の乗算回路と命令もしくは内積演算専用の回路と命令を有しないマイクロプロセッサで実現可能な内積演算方法を示す。
【0114】
図3に示した演算装置としてのマイクロプロセッサ20は、論理積・論理和・算術加算・算術減算を行う加減算手段としての算術論理演算器(ALU)22と、ALU22の演算結果が格納されるアキュムレータ24と、バス30を介してアキュムレータ24およびバレルシフタ28と接続される格納手段としてのレジスタ26と、レジスタ26から送り出されたオペランドデータを左シフトしてALU22に送るシフト手段としてのバレルシフタ28と、を備えている。
【0115】
ALU22は、16ビット語長の算術論理演算器で、一方の入力にはバレルシフタ28の出力が接続されており、レジスタ26から送り出されたオペランドデータを左シフトしてALU22に入力する。他方の入力にはアキュムレータ24の出力が接続され、ALU22の出力はアキュムレータ24に接続されて、ALU22の演算結果がアキュムレータ24に蓄積されるようにしてある。
【0116】
アキュムレータ24は、16ビット語長で構成され、ALU22の他方の入力と、8ビット幅のバス30を介してレジスタ26に接続されており、アキュムレータ24に蓄積されたデータがレジスタ26に転送できるようにしてある。
【0117】
レジスタ26は、例えば汎用レジスタとしてR0〜R31の32本の8ビット幅のレジスタを備えている。
【0118】
バレルシフタ28は、レジスタ26に格納されている8ビットデータ(オペランドデータ)を後述する機械語命令コードで指定された分のシフト量のシフトを行い16ビットデータとしてALU22に出力する。
【0119】
機械語命令コード37は、図10に示したように、演算の種類C、符号拡張の指定S、シフト量BSHの情報を含む。演算の種類Cには、加算、減算、論理積、論理和の演算が含まれ、Cの値により区別される。符号拡張Sには、ゼロ拡張と符号拡張があり、ゼロ拡張の場合はSに0が指定され、符号拡張の場合はSに1が指定される。シフト量BSHはゼロ桁から15桁まで指定可能となっている。
【0120】
図11および図12に上述した構成のマイクロプロセッサ20において内積演算行うためのプログラムリストを示す。ここで入力ベクトル要素はレジスタTmR0(レジスタ26のR0)からTmR7(レジスタ26のR7)のラベルのレジスタに格納されているとする。図11および図12に示したプログラムリストも図2、図4、図6、図8と同様に数4のZ1を求める場合のものである。
【0121】
次に、命令ニモニックについて説明する。
lda #0
この命令はアキュムレータ24にゼロ値をロードする命令のニモニックである。
add TmR0:s0
この命令はアキュムレータ24の値にソースオペランドである“TmR0”ラベルのレジスタ値を呼び出して加算する命令のニモニックである。ソースオペランドである“TmR0”の右側に“:s0”と補助コードが付加されているがこれは“s”に続く数字のビット数分の符号およびビット拡張つきの左シフトを行ってレジスタ値を読み出す動作を行うことを意味する。同様に“sub”は減算命令である。
【0122】
“sta”はアキュムレータ24内容をデスティネーションオペランドに書き出す命令で、例えば、
sta TmR12:z5
と記述され、これはデスティネーションオペランドである“TmR12”の右側に“:z5”と補助コードが付加されているが、これは“z”に続くビット数分の右シフトを行ってアキュムレータ24の内容をレジスタ26に転送する動作を行う。“lda”は即値もしくはソースオペランドのレジスタ値をアキュムレータ24に読み出す命令である。
【0123】
図11および図12に示したプログラムリストでセミコロンの付加された行はコメント行であり、その行の命令は実行されない。図中では理解を容易にするためにコメントとして命令ニモニックが残してある。コメント行の命令は定数ベクトルのビット値が“0”である桁の部分積の加減算を表しており、第1の実施形態でも説明したように、これらの部分積の加減算は実行されない。
【0124】
図11および図12に示したプログラムリストの演算動作については、定数ベクトル要素の数値および動作は第1の実施形態と同じであるが、概略動作を図13のフローチャートを参照して説明する。
【0125】
まず、アキュムレータ24にゼロ値ロードしてリセットし(ステップS1、図11の先頭行)、定数ベクトル要素の最下位桁の部分積を求め、部分積を累算し、全定数ベクトル要素の累算が終了するまで繰り返す(ステップS2〜S4、例えば図11のCOEF_bit1 MUL/ADD以下の8ステップ)。すなわち、ステップS2が特許請求の範囲の第一の工程に相当し、ステップS3が特許請求の範囲の第二の工程に相当する。
【0126】
次に、1つ上の桁に移動して(ステップS5)、定数ベクトル要素の最下位桁の部分積を求め、部分積を累算し、全定数ベクトル要素の累算が終了するまで繰り返す(ステップS6〜S8、例えば図11のCOEF_bit2 MUL/ADD以下の8ステップ)。そして、この繰り返しは最上位桁が終了するまで繰り返し、最上位桁まで終了した場合は処理を終了する(ステップS11)。すなわち、ステップS6が特許請求の範囲の第一の工程に相当し、ステップS7が特許請求の範囲の第二の工程に相当する。
【0127】
なお、累算結果がアキュムレータ24の最大桁の達した場合は、5ビット右シフトして切り捨て丸め処理を行う(ステップS9、S10、図11の中間結果/Overflow(16bit)回避の部分)。すなわち、ステップS10が特許請求の範囲の第三の工程に相当する。なお、この切り捨てる5ビットも第1の実施形態と同様に、加減算器4のビット語長から入力ベクトル要素のビット語長および入力ベクトル要素数の2を底とする対数を減じた数以下のビット桁数から算出されて予め決められたものである。
【0128】
また、本実施形態において、演算結果はアキュムレータ24に格納され16ビット幅であるが、次の段階のプログラム命令に渡すために、TmR12(レジスタ26のR12)、TmR13(レジスタ26のR13)のラベルのレジスタに下位、上位に分けて転送している。また、演算途中の5ビット右シフトによる切捨て丸め操作は、レジスタ幅と命令セットの都合上、上位、下位にわけて実施している。
【0129】
本実施形態によれば、専用の乗算回路と命令もしくは内積演算専用の回路と命令を有しないマイクロプロセッサ20において、ソースオペランドのシフトが一体となった加減算命令を使って、同じ桁の部分積を下位から順に累算して行くことにより、下位桁累算からの繰り上がりを落とすことなくすなわち演算精度を確保して内積演算を行うことができる。また累算途中結果を一旦ビットシフトして丸めるステップを備えているので乗算の最大語長より小さい語長の演算器構成のマイクロプロセッサでも精度の良い内積演算を実現できる。
【0130】
(第6実施形態)
次に、本発明の第6の実施形態を図14を参照して説明する。なお、前述した第1〜第5の実施形態と同一部分には、同一符号を付して説明を省略する。図14は、本発明の第6の実施形態にかかるマイクロプロセッサの内積演算動作を示したプログラムリストである。
【0131】
本実施形態は、構成は第5の実施形態と同じであるが、第2、第4の実施形態の説明のごとく2次のブースのアルゴリズムを採用して、定数ベクトル要素の2ビットごとに、下位ビットを付け加えた3ビットのパターンから加減算すべき部分積すなわち入力ベクトル要素自身“M”もしくは、その2倍値“2M”を累算する。すなわち、第一の工程は、入力ベクトル要素自身または入力ベクトル要素の2倍の値のいずれかを選択して部分積を求め、第二の工程は、部分積の累算を2ビット毎に行っている。
【0132】
図14に本実施形態の動作のプログラムリストを示す。図14も図2、図4、図6、図8、図11、図12と同様に数4のZ1を求める場合のものである。なお、演算内容については、第2の実施形態と同等であるので説明を省略する。
【0133】
本実施形態によれば、定数ベクトル要素の2ビットごとに部分内積の累算を行うことで内積演算を遂行するので、累算すべき部分積の個数が減じられ、制御ステップが削減でき、演算サイクル数をさらに削減できる。例えば第5の実施形態(図11、図12)と本実施形態(図14)とを比較すると、図6では48ステップ必要であるのに対して、図8では38ステップと20%程度の演算速度の改善がなされる。
【0134】
なお、本発明は上記実施形態に限定されるものではない。即ち、本発明の骨子を逸脱しない範囲で種々変形して実施することができる。
【符号の説明】
【0135】
1 内積演算装置
2 入力要素レジスタ(格納手段)
3 バレルシフタ(シフト手段)
4 加減算器(加減算手段)
5 アキュムレータ
6 シフタ(丸め手段)
7 セレクタ
8 制御部(演算制御手段)
9 加減算器(加減算手段)
10 シフタ(第一シフト手段)
11 シフタ(第二シフト手段)
12 セレクタ
13 加減算器(加減算手段)
14 シフタ(第一シフト手段)
20 マイクロプロセッサ(演算装置)
22 ALU(加減算手段)
24 アキュムレータ
26 レジスタ(格納手段)
28 バレルシフタ(シフト手段)
【先行技術文献】
【特許文献】
【0136】
【特許文献1】特公平5−26229号公報
【特許文献2】特開2000−132539号公報

【特許請求の範囲】
【請求項1】
所定のビット語長を有する複数の入力ベクトル要素から構成される入力ベクトルと複数の定数ベクトル要素から構成される定数ベクトルとの内積を求める内積演算装置において、
前記複数の入力ベクトル要素を格納する格納手段と、
前記格納手段から前記入力ベクトル要素を選択して、選択された前記入力ベクトルを左ビットシフトさせることにより前記定数ベクトル要素の2のべき乗項と入力ベクトル要素との部分積を求めるシフト手段と、
前記シフト手段が求めた前記部分積を累算するとともに、前記入力ベクトル要素と前記定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成された加減算手段と、
前記加減算手段の累算結果を格納するアキュムレータと、
予め定めた桁数のビットシフトにより前記加減算手段による累算途中の前記アキュムレータに格納された結果の切り捨てを行って演算結果の丸めを行う丸め手段と、
前記加減算手段に、前記定数ベクトル要素の最下位の2のべき乗項の同じ項にかかる全ての入力ベクトル要素の部分積の累算を行わせて前記アキュムレータに格納させて、以降、順次高位の2のべき乗項にかかる部分積の累算を繰り返して最上位の2のべき乗項まで繰り返させるとともに、前記加減算手段の桁あふれが発生する前に前記丸め手段により類算途中の前記アキュムレータに格納された結果の下位桁を切捨てさせて、以降の累算の初期値とするように動作させる演算制御手段と、
を備えていることを特徴とする内積演算装置。
【請求項2】
前記演算制御手段が、予め定めたテーブルに基づいて、前記シフト手段に対して前記入力ベクトル要素の2ビット毎に前記部分積を求めさせ、前記加減算手段に対して該部分積を累算させることを特徴とする請求項1に記載の内積演算装置。
【請求項3】
前記丸め手段が前記加減算手段による累算途中の前記アキュムレータに格納された結果の切り捨てを行うビット桁数は、前記加減算手段のビット語長から前記入力ベクトル要素のビット語長および前記入力ベクトル要素数の2を底とする対数を減じた数以下のビット桁数として予め定められていることを特徴とする請求項1または2に記載の内積演算装置。
【請求項4】
所定のビット語長を有する複数の入力ベクトル要素から構成される入力ベクトルと複数の定数ベクトル要素から構成される定数ベクトルとの内積を求める内積演算装置において、
前記複数の入力ベクトル要素を格納する格納手段と、
前記格納手段から前記入力ベクトル要素を選択して、前記定数ベクトル要素の2のべき乗項と選択された前記入力ベクトル要素との部分積を求めて累算するとともに、前記入力ベクトル要素と前記定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成された加減算手段と、
前記加減算手段の累算結果を自身の上位桁側に格納するアキュムレータと、
前記アキュムレータの内容を下位桁方向に右ビットシフトして以降の累算値とするとともに、前記入力ベクトル要素と前記定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成された第一シフト手段と、
前記加減算手段に、前記定数ベクトル要素の同じ桁の2のべき乗項の同じ項にかかる全ての入力ベクトル要素の部分積の累算を行わせて前記アキュムレータに格納させて、前記第一シフト手段に前記アキュムレータに格納された累算結果を右ビットシフトさせる動作を前記定数ベクトル要素の2のべき乗項の最上位桁まで繰り返させる演算制御手段と、
を備えていることを特徴とする内積演算装置。
【請求項5】
前記格納手段に格納された前記入力ベクトル要素を2倍する第二シフト手段を備え、
前記演算制御手段が、予め定めたテーブルに基づいて、前記格納手段に格納された前記入力ベクトル要素または前記第二シフト手段が2倍にした入力ベクトル要素のいずれかを選択して前記加減算手段に累算させるとともに、前記第一シフト手段に2ビットシフトさせることを特徴とする請求項4に記載の内積演算装置。
【請求項6】
所定のビット語長を有する複数の入力ベクトル要素から構成される入力ベクトルを格納する格納手段と、前記入力ベクトルを左ビットシフトさせることにより複数の定数ベクトル要素から構成される定数ベクトルの2のべき乗項と前記入力ベクトル要素との部分積を求めるシフト手段と、前記シフト手段が求めた前記部分積を累算するとともに、前記入力ベクトル要素と前記定数ベクトル要素とを乗算した際に必要となる乗算精度よりも小さいビット桁数で構成された加減算手段と、前記加減算手段の累算結果を格納するアキュムレータと、を備えたマイクロプロセッサでオペランドの加減算とシフトが一体に実行可能な命令を用いて前記入力ベクトルと前記定数ベクトルとの内積を求める内積演算方法において、
前記シフト手段が前記格納手段から前記入力ベクトル要素を選択して前記部分積を求める第一の工程と、
前記加減算手段に、前記定数ベクトル要素の最下位の2のべき乗項の同じ項にかかる全ての前記入力ベクトル要素の前記部分積の累算を行わせて前記アキュムレータに格納させる第二の工程と、
前記加減算手段の桁あふれが発生する前に前記アキュムレータに格納させている類算途中の前記アキュムレータに格納された結果の下位桁を切捨てて、以降の累算の初期値とする第三の工程と、
を備え、
前記第一の工程と前記第二の工程を順次高位の2のべき乗項にかかる部分積の累算を繰り返して最上位の2のべき乗項まで繰り返すとともに、前記第一の工程と前記第二の工程の繰り返しの途中に少なくとも前記第三の工程を1回以上行う
ことを特徴とする内積演算方法。
【請求項7】
前記第一の工程は、前記入力ベクトル要素自身または前記入力ベクトル要素の2倍の値のいずれかを選択して前記部分積を求め、
前記第二の工程は、前記部分積の累算を2ビット毎に行う
ことを特徴とする請求項6に記載の内積演算方法。
【請求項8】
前記第三の工程で前記加減算手段による累算途中の前記アキュムレータに格納された結果の切り捨てを行うビット桁数は、前記加減算手段のビット語長から前記入力ベクトル要素のビット語長および前記入力ベクトル要素数の2を底とする対数を減じた数以下のビット桁数として予め定められていることを特徴とする請求項6または7に記載の内積演算方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate


【公開番号】特開2012−22363(P2012−22363A)
【公開日】平成24年2月2日(2012.2.2)
【国際特許分類】
【出願番号】特願2010−157564(P2010−157564)
【出願日】平成22年7月12日(2010.7.12)
【出願人】(000006747)株式会社リコー (37,907)
【Fターム(参考)】