JP3579087B2 - 演算器およびマイクロプロセッサ - Google Patents
演算器およびマイクロプロセッサ Download PDFInfo
- Publication number
- JP3579087B2 JP3579087B2 JP15756694A JP15756694A JP3579087B2 JP 3579087 B2 JP3579087 B2 JP 3579087B2 JP 15756694 A JP15756694 A JP 15756694A JP 15756694 A JP15756694 A JP 15756694A JP 3579087 B2 JP3579087 B2 JP 3579087B2
- Authority
- JP
- Japan
- Prior art keywords
- register
- sum
- bits
- multiplier
- partial product
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/38—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
- G06F7/48—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
- G06F7/544—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices for evaluating functions by calculation
- G06F7/5443—Sum of products
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2207/00—Indexing scheme relating to methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F2207/38—Indexing scheme relating to groups G06F7/38 - G06F7/575
- G06F2207/3804—Details
- G06F2207/3808—Details concerning the type of numbers or the way they are handled
- G06F2207/3828—Multigauge devices, i.e. capable of handling packed numbers without unpacking them
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computational Mathematics (AREA)
- Computing Systems (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Complex Calculations (AREA)
Description
【0001】
【産業上の利用分野】
本発明は、画像処理等において用いられる積和演算等の演算処理を高速に行う手段に関する。
【0002】
【従来の技術】
従来、イメージ処理(画像処理)の分野においては、演算処理を行なう際に、高速、高精度等の、高度の演算性能が要求されるため、演算処理を行なうためには、処理内容に応じて、演算処理のための専用演算器を製作し、イメージ処理に応用してきた。
【0003】
このような専用演算器を、イメージ処理の内容に応じて製作し、イメージ処理を行なうシステムを設計製造するのでは、システムのコストの上昇を招いてしまう。
【0004】
一方、比較的低コストでシステム構築を行なえ、イメージ処理に応用可能な、汎用プロセッサの性能は向上してきたが、イメージ処理のすべてを、汎用プロセッサ内に内蔵された演算器で行なうほど、汎用プロセッサ内に内蔵された演算器の処理速度や処理内容は優れたものではない。
【0005】
ところで、イメージ処理で頻繁に行なわれる演算処理である、いわゆる積和演算は、乗算器と加算器とを、適宜組み合わせて構成した演算器で実行可能である。
【0006】
このような従来の演算器において、与えられた2つの数の乗算を行なう乗算器は、部分積の生成機能と部分積の加算機能とを有する。
【0007】
ここで、図19を参照して、部分積の生成と部分積加算を具体例に説明する。
【0008】
ここで、乗算に用いるデータのビット数は、5ビットとする。
【0009】
「部分積」は、乗数1901のビットを1ビットずつ調べ、ビットの内容が「1」であれば、被乗数1900の値、そのものであり、ビットの内容が「0」であれば、部分積を「0」とする。
【0010】
ただし、乗数1901の符号ビットで生成される部分積は、符号ビットの内容が「1」ならば、被乗数1901のビット反転の値と加算1とし、符号ビットが「0」ならば「0」とする。
【0011】
図19において、部分積は、矩形で囲んで表現しており、その内容を矩形内に示している。
【0012】
5ビットの乗算においては、乗数のビット数は5(ビット)あるので、図19に示すように、5個の部分積が生成される。図に示した演算例では、部分積1(1902)と、部分積2(1903)とは、その生成の際に、調べる対象となるビットの内容が「1」であるので、被乗数1900そのものとなる。
【0013】
また、部分積3(1904)と、部分積4(1905)とは、生成の際に、調べる対象となるビットの内容が「0」であるため「0」となり、部分積5(1906)は、乗数の符号ビットで生成され、かつ、生成の際に調べる対象となる符号ビットが「1」であるため、被乗数の負数となる。
【0014】
また、各部分積の加算は、乗数の下位ビットからの生成順に、部分積を1ビットずつ上位(左)にシフトしていき加算する。また、乗数、被乗数が、負数でも表現されている、いわゆる、2の補数表現のとき、部分積加算を正しく実行するには、符号を拡張(以下「符号拡張」と称する)して加算しなければならない。
【0015】
図19に示す例では、部分積1では、4ビット拡張(1907)し、部分積2では、3ビット拡張(1908)し、部分積3では、2ビット拡張(1909)し、部分積4では、1ビット拡張している(1910)。このような符号拡張により、正確な部分積加算を実行できる。
【0016】
通常、この部分積加算は、図20に示すような、桁上げ保存加算器と、桁上げ伝播加算器を使用して行なわれる。図20に示す部分積加算器は、3入力全加算器を配列して構成される桁上げ保存加算器である。
【0017】
ここで部分積加算器の基本構成要素となる、3入力全加算器の動作を図21に示す。
【0018】
3入力全加算器は、入力の3ビット(2100、2101、2102)を加算して、桁上げ2104と和2103を出力する。
【0019】
図21に示すように、3つの値を入力し、所定の場合には、桁上げ出力(2104)を行なって、加算(2103)を行なっている。
【0020】
図20に示す、桁上げ保存機能を有する加算器である全加算器(2000、2001、2002、2003、2004)では、図19に示す部分積1〜3を入力して、入力された部分積の加算を実行する。各全加算器によって行なわれる加算の結果の「桁上げ」は、次段の一桁上位の全加算器に、「和」は、次段の同じ桁の全加算器(2010、2011等)に入力し、図19に示す部分積4との加算を行なう。さらに、その結果は、部分積5の加算に使用する全加算器(2012等)に入力され、加算される。
【0021】
部分積5は、被乗数の値を反転させて、「1」を加算する必要があるので、全加算器2012の入力2013は、1を加算するための入力として使用する。
【0022】
一例として、1段目の全加算器2000は、部分積1の拡張符号2005(値は「1」)と、部分積2の拡張符号2006(値は「1」)と、部分積3の符号2007(値は「0」)を入力し、加算を行なう。
【0023】
そして、加算結果の桁上げ2008を、次段の一桁上位の全加算器2010に入力し、和2009を次段の同じ桁の全加算器2011に入力する。
【0024】
全加算器2010は、部分積1〜部分積3の拡張符号の加算結果の桁上げと和とを入力し、加算を行なう。その入力信号を生成する全加算器2014は、全加算器2000と同一の計算を行うので、全加算器2000の加算結果2009を、全加算器2010の入力とする構成とし、その結果、全加算器2000より、上位の桁の加算を行なう、即ち、左に存在する全加算器2014は、省略されうる。
【0025】
このように、桁上げ保存機能を有する加算器は、「桁上げ」を次段に送って、加算を繰り返すため、全部分積の加算が終了しても、2024から2038の2出力が残る。そのため、最終結果を得るためには、さらに、その2出力を加算するために、図20に示すような、いわゆる桁上げ伝播加算器が必要である。
【0026】
図20に示す構成では、桁上げ伝播加算器は、全加算器2015〜2022を有して構成される。これらの全加算器間の接続は、一例として、全加算器2016の桁上げ2023が、全加算器2015の入力となるような接続関係を有しており、文字通り桁上げ伝播加算器を構成している。
【0027】
【発明が解決しようとしている課題】
前述のように、例えば図20に示す積和演算器においては、桁上げ保存機能を有する加算器はもちろんのこと、桁上げ伝播加算器をも設けて、積和演算器を実現しなければならなかった。
【0028】
このように、従来の専用演算器を使用して演算を行なう場合においては、処理性能は満たされるものの、システムのコストの上昇を招くことがほとんどである。一方、汎用演算器を使用したのでは、コストの上昇は抑えられるものの、その処理性能は満足のいくものではないという問題が依然として存在する。
【0029】
しかしながら、汎用演算器の使用は、コストの低減のためには必要不可欠であるので、該汎用演算器の処理性能の向上を図る必要がある。
【0030】
そこで、本発明の目的は、汎用プロセッセが備える汎用演算器のうち、イメージ処理等で頻繁に使用される積和演算器の一部を独立に動作させる手段を設けることで、複数の積和演算を同時に行い、コストを抑えた、演算速度の速い、高性能のイメージ処理等に使用可能な演算手段を提供することにある。
【0031】
【課題を解決するための手段】
上記課題を解決し、本発明の目的を達成するために、以下の手段が考えられる。
【0032】
複数の被乗数を有するNビットの数と、前記各被乗数に対応する乗数を複数有するMビットの数との積を求めることによって、被乗数と乗数の組に対する乗算結果を求める演算器であって、以下の手段を備える演算器である。
【0033】
すなわち、被乗数を複数個保持し、各被乗数のビット長の総和がNを越えないことを条件として配置され、各被乗数の間に0を埋め込んだ状態で、Nビットの数を保持する第1レジスタと、前記各被乗数に対応する乗数を保持し、各乗数のビット長の総和がMを越えないことを条件として配置され、各乗数の間に0を埋め込んだ状態で、Mビットの数を保持する第2レジスタと、第1レジスタに保持された値と第2レジスタに保持された値との部分積を求めていく処理を行う部分積処理部と、前記部分積において、1組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を2の補数表現したビットを埋込む符号拡張部と、各部分積の和を順次求めていく手段であって、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める総和手段と、該手段によって求めた、総和値(「N+M」(ビット))のデータから、第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求める処理手段とを備える。
【0034】
【作用】
本発明は、汎用の積和演算器であって、入力レジスタ等に格納された各データに対する乗算を分離して同時に行うための機能を有する部分積加算器と、各乗算結果に対して、加算を分離して同時に行うための機能を有する加算器を備えて、演算を行なう。
【0035】
まず、第1レジスタに、被乗数を複数個保持し、各被乗数のビット長の総和がNを越えないことを条件として配置し、各被乗数の間に0を埋め込んだ状態で、Nビットの数を保持しておく。そして、第2レジスタには、前記被乗数に対応する乗数を複数個保持し、各乗数のビット長の総和がMを越えないことを条件として配置し、各乗数の間に0を埋め込んだ状態で、Mビットの数を保持しておく。
【0036】
次に、部分積処理部は、第1レジスタに保持された値と第2レジスタに保持された値との部分積を求めていく処理を行い、符号拡張部は、前記部分積において、1組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を2の補数表現したビットを埋込む処理を行なう。
【0037】
そして、総和手段は、各部分積の和を順次求めていき、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める。
【0038】
最後に、処理手段が、総和手段によって求めた、総和値(「N+M」(ビット))のデータから、第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求め、並列演算を実現する。
【0039】
【実施例】
以下、本発明の実施例について図面を参照して説明する。
【0040】
図1に、本発明にかかる実施例の構成図を示す。
【0041】
本実施例は、「a1×b1+c1」、「a2×b2+c2」なる演算を同時に実行するための演算器である。
【0042】
演算器全体は、レジスタ100にパック(データが詰めこまれた状態を、以下このように表現する)された、2つの被乗数a1、a2と、レジスタ101にパックされた、2つの乗数、b1、b2とを、それぞれ入力102、103とし、これら入力に基づいて生成した部分積を加算する機能を有する部分積加算器104を備える。
【0043】
また、レジスタ105にパックされた、2つの加数c1、c2を入力106とし、この入力データと、部分積加算器104の2出力である「a1×b1」、「a2×b2」との加算を、正確な位取りで実行するために、入力106の内容をシフトして、部分積加算器104の前記2出力に桁合わせする機能を有する「シフト アンド セレクタ」107と、部分積加算器104の2出力と、「シフトアンド セレクタ」107の出力を加算する機能を有する3入力全加算器列108と、3入力全加算器列の2出力を加算する機能を有する64ビット加算器109と、64ビット加算器109の出力を、指定されたフォーマットに変換するアライナ110と、加算結果がオーバーフローであるか、または、アンダーフローであるかを判定するオーバーフロー/アンダーフロー判定部111と、その判定結果がオーバーフローであれば、アライナ110の出力を最大値に、また判定結果がアンダーフローであれば、アライナ110の出力を最小値に置き換える最大値/最小値置換部112とを有して構成される。そして、最終的な演算結果は、レジスタ150にパックされた状態で出力される。
【0044】
図1の実施例において、「a1×b1+c1」、「a2×b2+c2」なる積和演算を行なう際の各構成要素の動作を、データ長32ビットのレジスタの、上位8ビットおよび下位8ビットに、2つのデータをパックした場合を例にとり説明する。
【0045】
積和演算を行うデータは、図2に示すデータフォーマット200の様に、32ビットの上位8ビットおよび下位8ビットに、2つのデータa1、a2をパックし、その間に「0」値を埋め込んで、32ビットのデータとしている。
【0046】
データb1、b2、c1、c2(図示せず)も同様に、32ビットの上位8ビットおよび下位8ビットに、2つのデータをパックし、その間に「0」値を埋め込んで、32ビットのデータとしている。
【0047】
データa1、a2をパックした32ビットのデータと、データb1、b2をパックした32ビットのデータとを、32ビットのデータ同士で乗算することによって、パックされた8ビットのデータ同士の乗算、即ち、「a1×b1」と「a2×b2」を同時に実行するものである。
【0048】
その際、32ビット乗算結果において、どの部分が乗算「a1×b1」と「a2×b2」に相当しているのかを図2に示している。なお、図2において、各部分積は、横長の矩形で表現している。
【0049】
さて、乗算「a1×b1」は、部分積25(203)から部分積32(204)までの、各々の上位15桁、また、乗算「a2×b2」は、部分積1(201)から部分積8(202)までの、各々の下位15桁を使用して計算される。そのため、図面中黒く塗られた部分は、乗算「a1×b1」と「a2×b2」の符号を拡張された部分となる。なお、符号拡張の概念については、前述の図19で示した通りである。
【0050】
また、乗数データb1とb2と間に「0」値が埋め込まれているため、それらのビット(値が「0」)から生成される部分積9〜24は、必ず「0」となる。そのため、全ての部分積を加算した時に、a2×b2による部分積加算の結果による桁上げが伝播することに起因する、乗算「a1×b1」への影響をなくすことができる。
【0051】
また、部分積25の加算で使用される、部分積25の32ビット用の符号拡張の加算分を「0」とすることで、32ビット乗算のための、符号拡張分の加算(部分積1から8までに対応する加算)結果が、「a1×b1」の演算結果への影響をなくすことができる。
【0052】
これら2点の工夫により、「a1×b1」と「a2×b2」を、分離した状態で演算することができる。
【0053】
次に、以上で説明した機能を有する部分積加算器104の動作について、詳細に説明する。
【0054】
図3は、乗算a2×b2の拡張符号の機能を、汎用の部分積加算器によって実現した構成例である。
【0055】
図2に示すように、この乗算の拡張符号が必要な範囲は、「部分積1」では、9桁目〜15桁目まで、「部分積2」では、10桁目〜15桁目まで、「部分積3」では、11桁目〜15桁目まで、「部分積4」では、12桁目〜15桁目まで、「部分積5」では13桁目〜15桁目まで、「部分積6」では14桁目〜15桁目まで、「部分積7」では15桁目である。
【0056】
図3では、一例として、部分積3〜5に相当する部分について図示した。
【0057】
なお、各全加算器の動作は、図21に示す通りである。
【0058】
全加算器300から305は、部分積3の15桁目から10桁目の加算に、全加算器306から311は、部分積4の15桁目から10桁目の加算に、全加算器312から317は、部分積5の15桁目から10桁目の加算にそれぞれ使用される。
【0059】
セレクタ318は、信号330が「1」ならば、2入力331、332のうち、332の方を選択する。他のセレクタ319〜321も、同様な動作をする。332は、乗算「a2×b2」の部分積3の符号であることから、信号330を「1」とすることで、符号を表現するための信号332によって、符号拡張して、全加算器によって部分積3を加算することができる。
【0060】
セレクタ323〜326、セレクタ327〜329も、信号330を「1」にすることによって、それぞれ、部分積4と部分積5の符号333、334を選択する。これにより、部分積4、部分積5についても、符号拡張を行なった加算が実現できる。
【0061】
そのほか、図3には示していないが、部分積1、2、6、7に対しても、信号330によって、符号拡張のための信号を選択するセレクタを、全加算器の入力側に設けた構成にすることによって、乗算「a2×b2」の部分積加算で、符号拡張した加算が実現できることになる。
【0062】
図22は、乗数b2の符号ビット(下位から8つ目のビット)から、部分積8を生成するための、汎用の部分積加算器の実現例である。全加算器2200〜2207は、部分積8の下位8ビットの加算を行なう。符号ビットから、部分積を生成するため、図19に示したように、データを反転させて、「1」を加える処理を実現するための構成である。
【0063】
論理ゲート2208は、信号2225が「1」のときに、入力2227を反転し、「0」のときには、入力2227の値に関係なく「1」を出力する機能を有する。また、セレクタ2216は、信号2226が「1」のとき論理ゲート2208の出力を選択し、信号2226が「0」のとき、部分積8の下位から8ビット目のデータ2227を選択する機能を有する。
【0064】
なお、「論理ゲート2208、セレクタ2216」と、「論理ゲート2209〜2215と、セレクタ2217〜2223」とは、同じ動作をする。また、セレクタ2224は、信号2226が「1」のとき「1」を出力する。
【0065】
論理ゲート2208〜2215と、セレクタ2216から2224を用い、信号2226を「1」にすることで、乗算「a2×b2」の部分積8の生成と加算が実現できることになる。他の部分積も同様に生成加算できる。このように、図3、図22に示す構成により、乗算「a2×b2」の部分積加算の演算が実行できることになる。
【0066】
次に、図4に示す構成を有する手段により、32ビット乗算を行なうための符号拡張分の加算(部分積1から8までの加算)結果による、乗算「a1×b1」への影響をなくすための機能を実現するが、この動作について説明する。
【0067】
まず、全加算器400〜407によって、部分積25の32桁目〜25桁目(乗算「a1×b1」の部分積1(図2中の部分積25))の値を加算する処理を行なう。また、全加算器408〜414は、部分積24までの加算結果を出力している。
【0068】
論理ゲート415は、信号431が「0」のとき、全加算器408の和433を「0」にする機能を有する。同様に、論理ゲート416〜422も、信号431が「0」のとき、全加算器409から414の和を「0」にする機能を有する。また、論理ゲート423は、信号431が「0」のとき、全加算器408の桁上げ432を、「0」にする機能を有する。
【0069】
同様に、論理ゲート424〜430も、信号431が「0」のとき、全加算器409から414の桁上げを「0」にする機能を有する。信号431が「1」のときは、論理素子415〜430は、全加算器408〜414からの、桁上げと和の値を、そのまま通過させる機能を有する。
【0070】
つまり、信号431を「0」にするこによって、部分積24までの加算結果と、部分積25との加算処理を制御することができる。これにより、32ビット乗算のための符号拡張分の加算(部分積1から8までの加算)結果による、乗算「a1×b1」への影響をなくすことが可能となる。
【0071】
以上説明してきた、図3、図22、図4に示す構成を有する手段を備えることにより、部分積加算器104は、通常の32ビット乗算と同一の処理で、「a1×b1」と「a2×b2」の2つの乗算の部分積加算を、並列に実行することができる。
【0072】
次に、「シフト アンド セレクタ」107は、「a1×b1+c1」、「a×b2+c2」の並列実行を行なうことを指示するコントロール信号113を受けとり、部分積加算器104の演算結果の、上位16桁と下位16桁に、それぞれc1とc2の位取りが正しく合うように、図5の500に示すようにパックされたc1、c2を、501に示すようにシフト処理し、c1とc2間に「0」を埋め込む。
【0073】
「a1×b1+c1」、「a2×b2+c2」の演算を、並列実行しないときには、シフトしない状態の、500を選択する。
【0074】
3入力全加算器列108は、図5に示すような、上位16桁と下位16桁に「a1×b1」と「a2×b2」の部分積加算の、桁上げ保存加算器の出力503と、「シフト アンド セレクタ」107で選択された、入力501とを、桁上げ保存加算し、加算結果506を得る。「a1×b1+c1」、「a2×b2+c2」の並列実行の場合、501において、c1とc2との間は、値「0」が埋っているため、a1×b1+c1、a2×b2+c2の間の桁では桁上げが起きない。その結果、c1、c2の加算は互いに影響しない。
【0075】
図6に、並列に実行した演算結果が、オーバーフローまたはアンダーフローであるかの判定を並列に実行する、オーバーフロー/アンダーフロー判定部111の構成例を示す。
【0076】
上位用判定部600、下位用判定部601は、それぞれ、図5に示す506の上位16ビットと下位16ビットを、予め定めている値である、8ビット用上限値603、8ビット用下限値604と比較する処理を行なう。
【0077】
上位用判定部600は、図5に示す506の上位16ビットの内容が、8ビット用上限値603より大きな場合は、オーバーフローが発生したと判断し、また、8ビット用下限値604より小さい場合は、アンダーフローが発生したと判断する。また、下位用判定部601は、図5に示す506の下位16ビットの内容に対し、上位用判定部600と同様の判断を行なう。
【0078】
32ビット用判定部602は、506の下位32ビットを、予め定めている値である、32ビット用上限値605と32ビット用下限値606とを、それぞれ用いて、32ビット乗算の場合のオーバーフロー、アンダーフローが発生したか否かを判定する。なお、上位用判定部600と、下位用判定部601とは、別々に動作するので、上位と下位の16ビットの、オーバーフロー、アンダーフローの判定は、並列に実行できる。
【0079】
なお、上位用判定部600が出力する判定信号607、608は、それぞれ、506の上位16ビットがオーバーフロー、アンダーフローの時「1」となり、下位用判定部601が出力する判定信号609、610は、それぞれ、506の下位16ビットがオーバーフロー、アンダーフローの時「1」となり、32ビット用判定部602が出力する判定信号611、612は、それぞれ、506の下位32ビットがオーバーフロー、アンダーフローの時「1」となる。
【0080】
これらの判定信号607から612は、判定結果を最大値/最小値置換部112に送られる。
【0081】
図7に、通常の積和演算の場合と、今まで述べてきた、「a1×b1+c1」、「a2×b2+c2」を求める並列演算を実行する場合の、2つの場合に対応できるように、64ビット加算器109の出力状態(701からのデータの取り出し方)を制御する機能を有するアライナ110の構成図を示す。
【0082】
セレクタ702は、データ719(701の上位9ビット目から上位16ビット目までのデータ)とデータ720(701の上位33ビット目から上位40ビット目までのデータ)との選択を、「a1×b1+c1」および「a2×b2+c2」の並列演算実行時で「0」となり、通常の積和演算時に「1」となる制御信号723で行なう。
【0083】
論理ゲート703〜718(計16個あるが、複雑になるため図面では2個を記載し、あとは省略してある)は、制御信号723で、データ721(701の下位24ビット目から下位9ビット目まで)を「0」とする(図中、724で0値と記載している部分)。
【0084】
すなわち、「a1×b1+c1」、「a2×b2+c2」の並列演算実行時は、制御信号723が「0」となり、第1に、セレクタ702は、データ719を選択し、図中d1部は、データ719で満たされ、第2に、論理ゲート713〜718は、アンドゲートであるので、データ721は「0」となる。また、データ722は変化しないので、アライナの出力は、724のようになる。
【0085】
一方、通常の積和演算時で、制御信号723が「1」となると、セレクタ702は、データ720を選択し、さらに、データ721は、論理ゲート713〜718を、そのまま通過する。また、データ722は変化しないのでアライナの出力は725のようになる。
【0086】
この結果、「a1×b1+c1」および「a2×b2+c2」の並列演算実行時では、演算結果d1、d2が、32ビットのレジスタに、724のようにパックされることになる。
【0087】
次に、図8に、演算条件およびオーバーフロー/アンダーフロー判定部111の判定結果と、最大値/最小値置換部112の出力との関係を示す。
【0088】
以下に、出力の態様を示す。
【0089】
まず、図8中(1)に示す例では、「a1×b1+c1」および「a2×b2+c2」の演算が同時実行された場合で、上位側の結果が、オーバーフローと判定された時、出力の上位8ビットに、予め定めておいた値である最大値(max)を出力し、出力の下位8ビットは、演算結果をそのまま出力する。
【0090】
また、図8中(2)に示す例では、上位側の結果がアンダーフローと判定された時、出力の上位8ビットに、予め定めておいた値である最小値(min)を出力し、出力の下位8ビットは、、演算結果をそのまま出力する。
【0091】
また、図8中(3)に示す例では、下位側の結果が、オーバーフローと判定された時、出力の下位8ビットに、予め定めておいた値である最大値(max)を出力し、出力の上位8ビットは、演算結果をそのまま出力する。
【0092】
また、図8中(4)に示す例では、下位側の結果がアンダーフローと判定された時、出力の下位8ビットに、予め定めておいた値である最小値(min)を出力し、出力の上位8ビットは、演算結果をそのまま出力する。
【0093】
さらに、通常積和実行時で、オーバーフローと判定された場合、32ビット全体に、予め定めておいた値である最大値を出力し(図8(5)の示す例)、アンダーフローと判定された場合、32ビット全体に、予め定めておいた値である最小値を出力することも考えられる(図8(6))。
【0094】
その他、「a1×b1+c1」および「a2×b2+c2」の並列演算が実行された場合でも、通常積和実行時でも、オーバーフローまたはアンダーフローとも判定されなかった場合には、入力値をそのまま出力することも考えられる(図8(7)の例)。
【0095】
次に、32ビットのすべてのビットにデータをパックした例、例えば、8ビットの画素データを4個詰めて行う、並列積和演算器の実施例を図9を参照して説明する。
【0096】
本実施例の構成は、パックされた4つの被乗数a1、a2、a3、a4と、パックされた4つの乗数b1、b2、b3、b4とから部分積を求め、加算する部分積加算器900と、パックされた4つの加数c1、c2、c3、c4を、部分積加算器900の出力と桁合わせする「シフト アンド セレクタ」901と、部分積加算器900の2出力と「シフト アンド セレクタ」901の出力とを加算する機能を有する3入力全加算器列902と、3入力全加算器列の2出力を加算する機能を有する64ビット加算器903と、該加算器の出力を指定されたフォーマットに変換するアライナ904と、加算結果がオーバーフロー、アンダーフローであるか否かを判定するオーバーフロー/アンダーフロー判定部905と、その結果に基づいて、予め定めた規則に従って、前記アライナ904の出力を所定の値に置き換える機能を有する最大値/最小値置換部906とを有して構成されている。
【0097】
図9に示す実施例において、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の複数の積和演算を行なう際の動作を、データ長32ビットに、8ビットデータを4個を詰めた場合を例にとり説明する。
【0098】
積和演算を行うデータは、図10に示す、データフォーマット1000に示すように、4データ「a1、a2、a3、a4」で32ビットのデータを構成する。
【0099】
a1、a2、a3、a4、また、c1、c2、c3、c4についても、同様に、32ビットのデータとする。
【0100】
「a1、a2、a3、a4」をパックした32ビットデータと、「a1、a2、a3、a4」をパックした32ビットデータにおいて、32ビットデータ同士を乗算することで、8ビット同士の乗算「a1×b1」、「a2×b2」、「a3×b3」、「a4×b4」を同時に実行するものである。
【0101】
その際、32ビットデータの乗算結果のどの部分が、それぞれ乗算「a1×b1」、「a2×b2」、「a3×b3」、「a4×b4」に相当するかについて、図10を参照して説明する。
【0102】
なお、図10において、各部分積は、矩形で表現している。
【0103】
乗算「a1×b1」、「a2×b2」、「a3×b3」および「a4×b4」の各々の値は、それぞれ、部分積25から32、部分積17から24、部分積9から16、部分積1から8の加算によって求められる。そのため、図中黒く塗られた部分は、乗算「a1×b1」、「a2×b2」、「a3×b3」および「a4×b4」の拡張符号となる部分である。
【0104】
例えば、乗算「a4×b4」では、部分積1では9桁目〜15桁目まで、部分積2では10桁目〜15桁目まで、部分積3では11桁目〜15桁目まで、部分積4では12桁目〜15桁目まで、部分積5では13桁目〜15桁目まで、部分積6では14桁目〜15桁目まで、部分積7では15桁目が拡張符号となる部分である。
【0105】
また、前述した2乗算の並列演算と同様に、部分積8、16、24、32は、符号ビットに相当するため負数を作る必要がある。
【0106】
1つの部分積の加算に使用される32個の全加算器のうちの8個に、図22に示される示される論理ゲート2208〜2215とセレクタ2216〜2224と同じものを、全加算器2200〜2207と同じ接続関係で、追加することによって、負数の部分積の生成と加算が実現できる。論理ゲートとセレクタが追加される全加算器は、部分積8については、下位1ビット目〜8ビット目、部分積16については、9ビット目〜16ビット目、部分積24については、17ビット目〜24ビット目に、部分積32については、25ビット目〜35ビット目に対応する全加算器である。
【0107】
32ビット乗算の部分積加算で、部分積8と9、部分積16と17、部分積24と25の間で、加算結果の伝播をさせないようにする必要がある。また、部分積9〜16においては、下位8ビット(図中の斜線部分)を「0」とし、部分積17〜24においては、下位16ビット(図中の斜線部分)を「0」とし、部分積25〜32においては、下位24ビット(図中の斜線部分)を「0」とする。こらの機能により、4つの乗算の部分積加算の結果は、他と影響しあわず、そのため、4つの乗算の部分積加算が、並列に実行することができる。
【0108】
次に、図11に、4つの乗算の部分積加算の結果が、他と影響しあわない、部分積加算器の一部を例示する。
【0109】
図11に、部分積8の加算結果を、部分積9の加算へ伝播させない機能と、部分積9の下位8ビットを「0」にして、部分積1〜8までの加算結果を壊さない機能を実現する回路構成例を示す。
【0110】
全加算器1100〜1107によって、部分積8の13ビット目から6ビット目までに対する加算処理を行なう。
【0111】
また、全加算器1108〜1115によって、部分積9の13ビット目から6ビット目までに対する加算処理を行なう。論理ゲート1116、1120は、信号1133を「0」にすることによって、部分積8の加算結果1128、1129を全加算器1108に入力するのを阻止する機能を有する。論理ゲート1117〜1119、1120〜1123も、同様な動作を行ない、対応する全加算器への加算結果の入力を阻止する機能を有する。
【0112】
なお、信号1133は、4乗算を並列に実行するとき「0」となる。
【0113】
そのため、全加算器1108には、「0」が入力され、部分積9と加算される。これにより、部分積8の加算結果は、部分積9の10ビット目からの加算に使用ができなくなることになる。
【0114】
論理ゲート1124は、信号1142により部分積9の8ビット目に対して加算処理を行なう全加算器1112への入力を阻止する機能を有する。同様に、論理ゲート1125〜1127も、信号1133の入力により、同様の阻止動作をする。
【0115】
信号1142は、4乗算の並列演算のとき「0」となる。そのため、部分積9の8ビットより下位は、「0」となる。
【0116】
これらの構成により、信号1133、1142と、論理ゲート1016〜1127を用いて、部分積8までの加算と、部分積9の加算とを分離することができる。同様に、部分積16と部分積17、部分積24と部分積25の分離も実現できる。したがって、この部分積加算器では、4つの乗算の部分積加算の並列演算が実行できる。
【0117】
また、「シフト アンド セレクタ」901は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」を並列実行する旨の制御信号を受けとって、部分積加算器の結果の上位から16桁ごとに出力される「a1×b1」、「a2×b2」、「a3×b3」、および「a4×b4」のそれぞれに対し、加算値、c1、c2、c3、c4との位取りが正しく合わさるようにする。
【0118】
そのため、図12の1200に示すようにパックされた、c1、c2、c3、c4を、1201に示すように、c1の1ビット目が49桁目に、c2の1ビット目が33桁目に、c3の1ビット目が17桁目に、c4の1ビット目が1桁目にくるように、c1、c2、c3をシフトする。また、1201において、c1、c2、c3、c4のデータの存在しない部分には、値「0」を埋めておく。なお、「a1×b1+c1」、「a2×b2+c2」を並列演算実行しないときには、1200に示すようにパックされたデータをシフトしない。
【0119】
図13に、上位から16ビット単位に「a1×b1」、「b2×b2」、「a3×b3」、「a4×b4」の4つの並列乗算の結果(和と桁あげ)と、「シフトアンド セレクタ」で選択された入力の3入力を加算し、和と桁上げの2出力の加算結果を得る3入力全加算器列902の構成の一部を示す。
【0120】
全加算器1300と全加算器1301は、「a3×b3+c3」の演算結果を求める際、下位2ビットの演算に使用される。全加算器1302と全加算器1303は、「a4×b4+c4」の演算結果を求める際、上位2ビットの演算に使用される。
【0121】
論理素子1304は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の並列演算を実行する時に「0」となる信号1305によって、全加算器1302の桁上げ1306を阻止する。
【0122】
図では、「a3×b3+c3」と「a4×b4+c4」を演算する手段の中間部の構成を示したが、「a1×b1+c1」と「a2×b2+c2」を演算する手段の中間部、「a2×b2+c2」と「a3×b3+c3」を演算する手段の中間部にも、同様の構成の論理回路を設け、桁上げを阻止する。
【0123】
これにより、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の並列演算を実行しても、4演算間での桁上げによる影響をなくすことができる。また、各乗算の境界において生じた桁上げは、オーバーフロー/アンダーフローの判定に使用するため、オーバーフロー/アンダーフロー判定部に送る。
【0124】
図14に、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の積和演算の、各乗算値の境界での桁上げの阻止機能を有する64ビット加算器の構成の一部を示す。全加算器1400と1401は、「a3×b3+c3」の演算結果を求める際、下位2ビットの演算に使用される。
【0125】
全加算器1402と全加算器1403は、「a4×b4+c4」の演算結果を求める際、上位2ビットの演算に使用される。論理ゲート1404は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の並列演算を実行する時に「0」となる信号1405によって、全加算器1402の桁上げ1406を阻止する。
【0126】
図14では、「a3×b3+c3」、「a4×b4+c4」を演算する手段の中間部の構成を示したが、「a1×b1+c1」と「a2×b2+c2」を演算する手段の中間部、「a2×b2+c2」と「a3×b3+c3」を演算する手段の中間部にも、同様の構成の論理回路を設け、桁上げを阻止する。
【0127】
これにより、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の並列演算を実行しても、4演算間で、桁上げによる他の演算結果への影響をなくすことができる。また、各演算の境界に生じた桁上げは、オーバーフロー/アンダーフローの判定に使用するために、オーバーフロー/アンダーフロー判定部に送る。
【0128】
次に、図15に、オーバーフロー/アンダーフロー判定部の構成を示す。
【0129】
1500、1501、1502、1503は、それぞれ「a1×b1+c1用判定部」、「a2×b2+c2用判定部」、「a3×b3+c3用判定部」、「a4×b4+c4用判定部」である。
【0130】
1307〜1310は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の演算を並列実行した3入力全加算器列902によって求められる、各演算結果間における桁上げデータである。
【0131】
1407〜1410は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の演算を並列実行した64ビット加算器903によって求められる、各演算結果間における桁上げデータである。
【0132】
各判定部は、対応する演算の桁上げデータ2つと、64ビット加算器903の出力の対応する演算結果とから、8ビットに演算精度を制限していない演算結果を生成し、予め定めてある、8ビット用上限値および8ビット用下限値とを比較して、演算結果がオーバーフローとなるか、あるいは、アンダーフローとなるかを判定し、判定結果を出力する。
【0133】
例えば、「a1×b1+c1用判定部」1500は、桁上げ1307と、1407を加算する。
【0134】
その加算結果1504と、64ビット加算器の出力の下位16ビット1505とを、1504が上位にくるように連結し、18ビットの演算結果を生成する。
【0135】
新しくできた演算結果1506と、予め定めてある、8ビット用上限値および8ビット用下限値とを比較してオーバーフローとアンダーフローを判定し、判定結果1507を出力する。同様に、判定部1501、1502、1503も、オーバーフロー、アンダーフローの判定を行ない、判定結果をそれぞれ、1508、1509、1510として出力する。
【0136】
また、32ビット用判定部は、64ビット加算器の出力の下位32ビットを、予め定めた32ビット用上限値および32ビット用下限値と比較し、演算結果のオーバーフロー、アンダーフローを判定し、判定結果1511を出力する。
【0137】
次に、図16に、通常の積和演算の場合と、今まで述べてきた「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の並列演算実行の場合の、2つ場合に対応できるように、64ビット加算器903の出力状態(1601からのデータの取り出し方)を制御する機能を有するアライナ904の構成図を示す。 信号1600は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の並列演算実行時で「0」となり、通常の積和演算時に「1」となる信号である。
【0138】
セレクタ1608は、データ1602(1601の下位56ビット目から下位49ビット目)とデータ1603(1601の下位32ビット目から下位25ビット目)のうち、信号1600が「1」のときデータ1603選択し、また、信号1600が「0」のときデータ1602を選択する。また、セレクタ1609は、データ1604(1601の下位40ビット目から下位33ビット目)とデータ1605(1601の下位24ビット目から下位17ビット目)のうち、信号1600が「1」のときデータ1605を選択し、また、信号1600が「0」のときデータ1604を選択する。
【0139】
さらに、セレクタ1610は、データ1605(1601の下位24ビット目から下位17ビット目)とデータ1606(1601の下位16ビット目から下位9ビット目)のうち、信号1600が「1」のときデータ1606を選択し、また、信号1600が「0」のときデータ1605を選択する。
【0140】
なお、データ1607(1601の下位8ビットのデータ)は、信号1600による選択制御を行なわない。この結果、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の並列演算実行時では、信号1600が「0」となるので、レジスタの領域d1、d2、d3、d4のそれぞれに、データ1602、1604、1605、1607が格納され、32ビットデータが、1611に示すようにパックされる。また、通常の積和演算では、データ1603、1605、1606、1607が格納され、1612に示すような32ビットデータが格納される。
【0141】
64ビット加算器の出力は、図16に示すアライナで、信号1600が、並列積和演算示す場合、即ち信号1600が「0」のときは1611、通常の32ビット積和演算の場合、即ち信号1600が「1」のときは1612のように、32ビットのデータに変換される。
【0142】
次に、最大値/最小値置換部906は、オーバーフロー/アンダーフロー判定部905からの判定信号を受けて、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の並列演算実行時では、各演算結果に対して、所定の処理を行なう。
【0143】
所定の処理としては、例えば、判定結果がオーバーフローであれば、演算結果を、予め定めた、8ビットで表わされる最大値に置き換え、判定結果がアンダーフローであれば、演算結果を、予め定めた、8ビットで表わされる最小値に置き換え、また、いずれでもなければ、演算結果を置き換えずにそのまま出力する処理が考えられる。
【0144】
また、通常の積和演算時には、判定結果がオーバーフローであれば、演算結果を、予め定めた、32ビットで表わされる最大値に置き換え、判定結果がアンダーフローであれば、演算結果を、予め定めた、32ビットで表わされる最小値に置き換え、いずれでもなければ、演算結果を置き換えずにそのまま出力する処理をすればよい。
【0145】
上述のような構成により、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の各演算が分離して行なえ、32ビットの汎用の積和演算器を使用して、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の各演算の並列実行が可能となる。
【0146】
もちろん、演算ビット数を考慮して本発明の技術的思想を適用することにより、本実施例により示した「32ビット×32ビット」の部分積和演算のみならず、他のビット数での部分積和演算を実行することができる。
【0147】
図17は、本発明にかかる積和演算器、または、乗算器を備えるマイクロプロセッサに対する命令コードの態様である。オペコード1700〜1703は、演算の種類によって定義される。また、オペランド1704〜1707は、演算に使われるデータのソースレジスタとターゲットレジスタを指定する。
【0148】
オペコード1700と1702は、それぞれ並列演算を行ない、同時に、複数の乗算または積和演算を行なうときに使用する。また、オペコード1701と1703は、それぞれ、通常の乗算または積和演算を行なうときに使用する。
【0149】
2データの並列演算を例にとり説明すると、オペコード1700「SplitMPY」は、a1、a2がパックされているソースレジスタr1と、b1、b2がパックされているソースレジスタr2に格納されている、データa1、a2、b1、b2を使用して、乗算「a1×b1」および「a2×b2」を並列に行ない、結果を、ターゲットレジスタr3に格納する命令である。
【0150】
また、オペコード1702「SplitMPYADD」は、a1、a2がパックされているソースレジスタr1と、b1、b2がパックされているソースレジスタr2と、c1、c2がパックされているソースレジスタr3(r3は、ターゲットレジスタを兼ねる)に格納されている、データa1、a2、b1、b2、c1、c2を使用して、積和演算「a1×b1+c1」および「a2×b2+c2」を並列に行ない、結果を、ターゲットレジスタを兼ねるレジスタr3に格納する命令である。
【0151】
なお、4データの並列演算も、データ数と並列演算の実行数が異なるだけであり、同様に、命令コードを設定することができる。
【0152】
一方、オペコード1701「ConnectMPY」は、1705に示されるレジスタr1とr2の値(値を、それぞれR1、R2とする)を用いて、乗算「R1×R2」を行ない、結果をレジスタr2に格納する命令である。また、1703「ConnectMPYADD」は、1707に示されるレジスタr1、r2、r3の値(値を、それぞれR1、R2、R3とする)を用いて、積和演算「R1×R2+R3」を行ない、結果を、ターゲットレジスタを兼ねるレジスタr3に格納する命令である。
【0153】
オペコード1703のみを有するアーキテクチャでは、「a1×b1+c1」および「a2×b2+c2」の演算を実行する場合、2度命令する必要があるが、前述のように、オペコード1702を定義して、並列演算させることにより、並列の積和演算「a1×b1+c1」および「a2×b2+c2」を、1度の命令で実行させることが可能となる。
【0154】
また、乗算についても、同様に、オペコード1700を定義することで、オペコード1701を使用する場合に比べて、必要な命令数が少なくなる。
【0155】
これによりプログラムが短くなり、プログラムはメモリに記憶されるため、これらの命令を使用すればメモリの容量を少なくすることが可能となり、本発明にかかる積和演算器等がマイクロプロセッサの構成要素となるときに、有効である。
【0156】
次に、図18に、本発明にかかる他の実施例を示す。
【0157】
図18は、本発明にかかる、乗算器(例えば、「a1×b1」なる演算を行なう手段)および積和演算器(例えば、「a1×b1+c1」なる演算を行なう手段)のうち少なくとも一方を備えたマイクロプロセッサ1800を有したシステムの構成図である。
【0158】
記憶装置には、マイクロプロセッサ1800が実行する処理を定めるプログラムや、必要なデータ等が記憶されている。本システムにおいて、マイクロプロセッサ1800が、前記プログラムにしたがって、ある画像処理を行なっているものとする。また、画像処理された画像は、CRT等によって実現される表示装置1802に表示される。このような表示処理は、マイクロプロセッサ1800が、予め定められているプログラムにしたがって行なわれる。
【0159】
さて、画像処理においては、積和演算を頻繁に実行する必要があり、積和演算に必要なデータは、記憶装置1801に記憶されているものとする。
【0160】
積和演算器1803は、本発明にかかる積和演算器であり、複数個の積和演算を並列に実行する。
【0161】
マイクロプロセッサ内のレジスタ1804が、記憶装置1801に記憶されているデータを使用して積和演算を行なうことを想定する。
【0162】
プログラムにより積和演算の実行が指示された場合、マイクロプロセッサ1800は、記憶装置1801にアクセスし、バス1805を介して、積和演算に必要なデータを、自己が備えるレジスタ1804に保持する。1回の、積和演算に必要なデータのみをアクセスしてもよいが、通常、一度に複数個の積和演算が行なわれるので、該当するデータを、すべてレジスタ1804に保持しておく。なお、レジスタ1804に保持される、被乗数データ(a1、a2、a3、a4)、乗数データ(b1、b2、b3、b4)、加算データ(c1、c2、c3、c4)の例を図18の左側に示す。図では、1回の積和演算を行なうための1組のデータを示したが、通常、複数組のデータを保持しておく。
【0163】
そして、次に、積和演算器が起動する。まず、レジスタ1804内の、積和演算に必要な全てのデータをソースバスを介して、取り込む。
【0164】
積和演算器は、取り込んだデータに基づいて、前述した積和演算を行ない、演算結果を順次、ターゲットバスを介して、レジスタ1804の空きエリアに送り、保持させる。もちろん、演算結果を後に使用するような画像処理を行なう場合、記憶装置1801に記憶することも考えられる。
【0165】
本発明にかかる積和演算器は、同時に複数種類の積和演算を行なうことができるため、画像処理の処理速度は、著しく向上する。
【0166】
複数の積和演算を並列に繰り返して実行できるため、例えば、積和演算を繰り返して行い、画像処理において頻繁に行なわれる処理である、離散コサイン変換等の処理に対しても高速な処理が行なえる。
【0167】
以上のように、本発明にかかる積和演算器(乗算器)を組み込んだマイクロプロセッサを実現し、該マイクロプロセッサ使用することにより、例えば、高速に画像処理を行なうことが可能なシステムを構築できる。もちろん、システムが対象とする処理内容は、画像処理に限られず、多量の積和演算を行なう処理であれば、いかなるものでもよい。
【0168】
【発明の効果】
以上述べたように、本発明によれば、複数の積和演算を並列に実行できるため、複数の積和演算を極めて高速に行なえる。
【図面の簡単な説明】
【図1】本発明にかかる実施例の構成図である。
【図2】乗算の符号拡張と分離機能の説明図である。
【図3】部分積加算器の符号拡張機能を実現するための手段の構成図である。
【図4】部分積加算器の分離機能を実現するための手段の構成図である。
【図5】「シフト アンド セレクタ」の動作の説明図である。
【図6】オーバーフロー/アンダーフロー判定部の構成図である。
【図7】アライナの構成図である。
【図8】最大値/最小値の置き換え処理の説明図である。
【図9】本発明にかかる他の実施例の構成図である。
【図10】乗算の符号拡張と分離機能の説明図である。
【図11】部分積加算器の構成図である。
【図12】「シフト アンド セレクタ」の動作の説明図である。
【図13】3入力全加算器列の構成図である。
【図14】64ビット加算器の構成図である。
【図15】オーバーフロー/アンダーフロー判定部の構成図である。
【図16】アライナの構成図である。
【図17】積和演算用の命令の説明図である。
【図18】本発明にかかる他の実施例の構成図である。
【図19】従来の乗算処理の説明図である。
【図20】従来の部分積加算器の説明図である。
【図21】全加算器の入出力関係の説明図である。
【図22】負数部分積加算機能を実現する手段の構成図である。
【産業上の利用分野】
本発明は、画像処理等において用いられる積和演算等の演算処理を高速に行う手段に関する。
【0002】
【従来の技術】
従来、イメージ処理(画像処理)の分野においては、演算処理を行なう際に、高速、高精度等の、高度の演算性能が要求されるため、演算処理を行なうためには、処理内容に応じて、演算処理のための専用演算器を製作し、イメージ処理に応用してきた。
【0003】
このような専用演算器を、イメージ処理の内容に応じて製作し、イメージ処理を行なうシステムを設計製造するのでは、システムのコストの上昇を招いてしまう。
【0004】
一方、比較的低コストでシステム構築を行なえ、イメージ処理に応用可能な、汎用プロセッサの性能は向上してきたが、イメージ処理のすべてを、汎用プロセッサ内に内蔵された演算器で行なうほど、汎用プロセッサ内に内蔵された演算器の処理速度や処理内容は優れたものではない。
【0005】
ところで、イメージ処理で頻繁に行なわれる演算処理である、いわゆる積和演算は、乗算器と加算器とを、適宜組み合わせて構成した演算器で実行可能である。
【0006】
このような従来の演算器において、与えられた2つの数の乗算を行なう乗算器は、部分積の生成機能と部分積の加算機能とを有する。
【0007】
ここで、図19を参照して、部分積の生成と部分積加算を具体例に説明する。
【0008】
ここで、乗算に用いるデータのビット数は、5ビットとする。
【0009】
「部分積」は、乗数1901のビットを1ビットずつ調べ、ビットの内容が「1」であれば、被乗数1900の値、そのものであり、ビットの内容が「0」であれば、部分積を「0」とする。
【0010】
ただし、乗数1901の符号ビットで生成される部分積は、符号ビットの内容が「1」ならば、被乗数1901のビット反転の値と加算1とし、符号ビットが「0」ならば「0」とする。
【0011】
図19において、部分積は、矩形で囲んで表現しており、その内容を矩形内に示している。
【0012】
5ビットの乗算においては、乗数のビット数は5(ビット)あるので、図19に示すように、5個の部分積が生成される。図に示した演算例では、部分積1(1902)と、部分積2(1903)とは、その生成の際に、調べる対象となるビットの内容が「1」であるので、被乗数1900そのものとなる。
【0013】
また、部分積3(1904)と、部分積4(1905)とは、生成の際に、調べる対象となるビットの内容が「0」であるため「0」となり、部分積5(1906)は、乗数の符号ビットで生成され、かつ、生成の際に調べる対象となる符号ビットが「1」であるため、被乗数の負数となる。
【0014】
また、各部分積の加算は、乗数の下位ビットからの生成順に、部分積を1ビットずつ上位(左)にシフトしていき加算する。また、乗数、被乗数が、負数でも表現されている、いわゆる、2の補数表現のとき、部分積加算を正しく実行するには、符号を拡張(以下「符号拡張」と称する)して加算しなければならない。
【0015】
図19に示す例では、部分積1では、4ビット拡張(1907)し、部分積2では、3ビット拡張(1908)し、部分積3では、2ビット拡張(1909)し、部分積4では、1ビット拡張している(1910)。このような符号拡張により、正確な部分積加算を実行できる。
【0016】
通常、この部分積加算は、図20に示すような、桁上げ保存加算器と、桁上げ伝播加算器を使用して行なわれる。図20に示す部分積加算器は、3入力全加算器を配列して構成される桁上げ保存加算器である。
【0017】
ここで部分積加算器の基本構成要素となる、3入力全加算器の動作を図21に示す。
【0018】
3入力全加算器は、入力の3ビット(2100、2101、2102)を加算して、桁上げ2104と和2103を出力する。
【0019】
図21に示すように、3つの値を入力し、所定の場合には、桁上げ出力(2104)を行なって、加算(2103)を行なっている。
【0020】
図20に示す、桁上げ保存機能を有する加算器である全加算器(2000、2001、2002、2003、2004)では、図19に示す部分積1〜3を入力して、入力された部分積の加算を実行する。各全加算器によって行なわれる加算の結果の「桁上げ」は、次段の一桁上位の全加算器に、「和」は、次段の同じ桁の全加算器(2010、2011等)に入力し、図19に示す部分積4との加算を行なう。さらに、その結果は、部分積5の加算に使用する全加算器(2012等)に入力され、加算される。
【0021】
部分積5は、被乗数の値を反転させて、「1」を加算する必要があるので、全加算器2012の入力2013は、1を加算するための入力として使用する。
【0022】
一例として、1段目の全加算器2000は、部分積1の拡張符号2005(値は「1」)と、部分積2の拡張符号2006(値は「1」)と、部分積3の符号2007(値は「0」)を入力し、加算を行なう。
【0023】
そして、加算結果の桁上げ2008を、次段の一桁上位の全加算器2010に入力し、和2009を次段の同じ桁の全加算器2011に入力する。
【0024】
全加算器2010は、部分積1〜部分積3の拡張符号の加算結果の桁上げと和とを入力し、加算を行なう。その入力信号を生成する全加算器2014は、全加算器2000と同一の計算を行うので、全加算器2000の加算結果2009を、全加算器2010の入力とする構成とし、その結果、全加算器2000より、上位の桁の加算を行なう、即ち、左に存在する全加算器2014は、省略されうる。
【0025】
このように、桁上げ保存機能を有する加算器は、「桁上げ」を次段に送って、加算を繰り返すため、全部分積の加算が終了しても、2024から2038の2出力が残る。そのため、最終結果を得るためには、さらに、その2出力を加算するために、図20に示すような、いわゆる桁上げ伝播加算器が必要である。
【0026】
図20に示す構成では、桁上げ伝播加算器は、全加算器2015〜2022を有して構成される。これらの全加算器間の接続は、一例として、全加算器2016の桁上げ2023が、全加算器2015の入力となるような接続関係を有しており、文字通り桁上げ伝播加算器を構成している。
【0027】
【発明が解決しようとしている課題】
前述のように、例えば図20に示す積和演算器においては、桁上げ保存機能を有する加算器はもちろんのこと、桁上げ伝播加算器をも設けて、積和演算器を実現しなければならなかった。
【0028】
このように、従来の専用演算器を使用して演算を行なう場合においては、処理性能は満たされるものの、システムのコストの上昇を招くことがほとんどである。一方、汎用演算器を使用したのでは、コストの上昇は抑えられるものの、その処理性能は満足のいくものではないという問題が依然として存在する。
【0029】
しかしながら、汎用演算器の使用は、コストの低減のためには必要不可欠であるので、該汎用演算器の処理性能の向上を図る必要がある。
【0030】
そこで、本発明の目的は、汎用プロセッセが備える汎用演算器のうち、イメージ処理等で頻繁に使用される積和演算器の一部を独立に動作させる手段を設けることで、複数の積和演算を同時に行い、コストを抑えた、演算速度の速い、高性能のイメージ処理等に使用可能な演算手段を提供することにある。
【0031】
【課題を解決するための手段】
上記課題を解決し、本発明の目的を達成するために、以下の手段が考えられる。
【0032】
複数の被乗数を有するNビットの数と、前記各被乗数に対応する乗数を複数有するMビットの数との積を求めることによって、被乗数と乗数の組に対する乗算結果を求める演算器であって、以下の手段を備える演算器である。
【0033】
すなわち、被乗数を複数個保持し、各被乗数のビット長の総和がNを越えないことを条件として配置され、各被乗数の間に0を埋め込んだ状態で、Nビットの数を保持する第1レジスタと、前記各被乗数に対応する乗数を保持し、各乗数のビット長の総和がMを越えないことを条件として配置され、各乗数の間に0を埋め込んだ状態で、Mビットの数を保持する第2レジスタと、第1レジスタに保持された値と第2レジスタに保持された値との部分積を求めていく処理を行う部分積処理部と、前記部分積において、1組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を2の補数表現したビットを埋込む符号拡張部と、各部分積の和を順次求めていく手段であって、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める総和手段と、該手段によって求めた、総和値(「N+M」(ビット))のデータから、第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求める処理手段とを備える。
【0034】
【作用】
本発明は、汎用の積和演算器であって、入力レジスタ等に格納された各データに対する乗算を分離して同時に行うための機能を有する部分積加算器と、各乗算結果に対して、加算を分離して同時に行うための機能を有する加算器を備えて、演算を行なう。
【0035】
まず、第1レジスタに、被乗数を複数個保持し、各被乗数のビット長の総和がNを越えないことを条件として配置し、各被乗数の間に0を埋め込んだ状態で、Nビットの数を保持しておく。そして、第2レジスタには、前記被乗数に対応する乗数を複数個保持し、各乗数のビット長の総和がMを越えないことを条件として配置し、各乗数の間に0を埋め込んだ状態で、Mビットの数を保持しておく。
【0036】
次に、部分積処理部は、第1レジスタに保持された値と第2レジスタに保持された値との部分積を求めていく処理を行い、符号拡張部は、前記部分積において、1組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を2の補数表現したビットを埋込む処理を行なう。
【0037】
そして、総和手段は、各部分積の和を順次求めていき、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める。
【0038】
最後に、処理手段が、総和手段によって求めた、総和値(「N+M」(ビット))のデータから、第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求め、並列演算を実現する。
【0039】
【実施例】
以下、本発明の実施例について図面を参照して説明する。
【0040】
図1に、本発明にかかる実施例の構成図を示す。
【0041】
本実施例は、「a1×b1+c1」、「a2×b2+c2」なる演算を同時に実行するための演算器である。
【0042】
演算器全体は、レジスタ100にパック(データが詰めこまれた状態を、以下このように表現する)された、2つの被乗数a1、a2と、レジスタ101にパックされた、2つの乗数、b1、b2とを、それぞれ入力102、103とし、これら入力に基づいて生成した部分積を加算する機能を有する部分積加算器104を備える。
【0043】
また、レジスタ105にパックされた、2つの加数c1、c2を入力106とし、この入力データと、部分積加算器104の2出力である「a1×b1」、「a2×b2」との加算を、正確な位取りで実行するために、入力106の内容をシフトして、部分積加算器104の前記2出力に桁合わせする機能を有する「シフト アンド セレクタ」107と、部分積加算器104の2出力と、「シフトアンド セレクタ」107の出力を加算する機能を有する3入力全加算器列108と、3入力全加算器列の2出力を加算する機能を有する64ビット加算器109と、64ビット加算器109の出力を、指定されたフォーマットに変換するアライナ110と、加算結果がオーバーフローであるか、または、アンダーフローであるかを判定するオーバーフロー/アンダーフロー判定部111と、その判定結果がオーバーフローであれば、アライナ110の出力を最大値に、また判定結果がアンダーフローであれば、アライナ110の出力を最小値に置き換える最大値/最小値置換部112とを有して構成される。そして、最終的な演算結果は、レジスタ150にパックされた状態で出力される。
【0044】
図1の実施例において、「a1×b1+c1」、「a2×b2+c2」なる積和演算を行なう際の各構成要素の動作を、データ長32ビットのレジスタの、上位8ビットおよび下位8ビットに、2つのデータをパックした場合を例にとり説明する。
【0045】
積和演算を行うデータは、図2に示すデータフォーマット200の様に、32ビットの上位8ビットおよび下位8ビットに、2つのデータa1、a2をパックし、その間に「0」値を埋め込んで、32ビットのデータとしている。
【0046】
データb1、b2、c1、c2(図示せず)も同様に、32ビットの上位8ビットおよび下位8ビットに、2つのデータをパックし、その間に「0」値を埋め込んで、32ビットのデータとしている。
【0047】
データa1、a2をパックした32ビットのデータと、データb1、b2をパックした32ビットのデータとを、32ビットのデータ同士で乗算することによって、パックされた8ビットのデータ同士の乗算、即ち、「a1×b1」と「a2×b2」を同時に実行するものである。
【0048】
その際、32ビット乗算結果において、どの部分が乗算「a1×b1」と「a2×b2」に相当しているのかを図2に示している。なお、図2において、各部分積は、横長の矩形で表現している。
【0049】
さて、乗算「a1×b1」は、部分積25(203)から部分積32(204)までの、各々の上位15桁、また、乗算「a2×b2」は、部分積1(201)から部分積8(202)までの、各々の下位15桁を使用して計算される。そのため、図面中黒く塗られた部分は、乗算「a1×b1」と「a2×b2」の符号を拡張された部分となる。なお、符号拡張の概念については、前述の図19で示した通りである。
【0050】
また、乗数データb1とb2と間に「0」値が埋め込まれているため、それらのビット(値が「0」)から生成される部分積9〜24は、必ず「0」となる。そのため、全ての部分積を加算した時に、a2×b2による部分積加算の結果による桁上げが伝播することに起因する、乗算「a1×b1」への影響をなくすことができる。
【0051】
また、部分積25の加算で使用される、部分積25の32ビット用の符号拡張の加算分を「0」とすることで、32ビット乗算のための、符号拡張分の加算(部分積1から8までに対応する加算)結果が、「a1×b1」の演算結果への影響をなくすことができる。
【0052】
これら2点の工夫により、「a1×b1」と「a2×b2」を、分離した状態で演算することができる。
【0053】
次に、以上で説明した機能を有する部分積加算器104の動作について、詳細に説明する。
【0054】
図3は、乗算a2×b2の拡張符号の機能を、汎用の部分積加算器によって実現した構成例である。
【0055】
図2に示すように、この乗算の拡張符号が必要な範囲は、「部分積1」では、9桁目〜15桁目まで、「部分積2」では、10桁目〜15桁目まで、「部分積3」では、11桁目〜15桁目まで、「部分積4」では、12桁目〜15桁目まで、「部分積5」では13桁目〜15桁目まで、「部分積6」では14桁目〜15桁目まで、「部分積7」では15桁目である。
【0056】
図3では、一例として、部分積3〜5に相当する部分について図示した。
【0057】
なお、各全加算器の動作は、図21に示す通りである。
【0058】
全加算器300から305は、部分積3の15桁目から10桁目の加算に、全加算器306から311は、部分積4の15桁目から10桁目の加算に、全加算器312から317は、部分積5の15桁目から10桁目の加算にそれぞれ使用される。
【0059】
セレクタ318は、信号330が「1」ならば、2入力331、332のうち、332の方を選択する。他のセレクタ319〜321も、同様な動作をする。332は、乗算「a2×b2」の部分積3の符号であることから、信号330を「1」とすることで、符号を表現するための信号332によって、符号拡張して、全加算器によって部分積3を加算することができる。
【0060】
セレクタ323〜326、セレクタ327〜329も、信号330を「1」にすることによって、それぞれ、部分積4と部分積5の符号333、334を選択する。これにより、部分積4、部分積5についても、符号拡張を行なった加算が実現できる。
【0061】
そのほか、図3には示していないが、部分積1、2、6、7に対しても、信号330によって、符号拡張のための信号を選択するセレクタを、全加算器の入力側に設けた構成にすることによって、乗算「a2×b2」の部分積加算で、符号拡張した加算が実現できることになる。
【0062】
図22は、乗数b2の符号ビット(下位から8つ目のビット)から、部分積8を生成するための、汎用の部分積加算器の実現例である。全加算器2200〜2207は、部分積8の下位8ビットの加算を行なう。符号ビットから、部分積を生成するため、図19に示したように、データを反転させて、「1」を加える処理を実現するための構成である。
【0063】
論理ゲート2208は、信号2225が「1」のときに、入力2227を反転し、「0」のときには、入力2227の値に関係なく「1」を出力する機能を有する。また、セレクタ2216は、信号2226が「1」のとき論理ゲート2208の出力を選択し、信号2226が「0」のとき、部分積8の下位から8ビット目のデータ2227を選択する機能を有する。
【0064】
なお、「論理ゲート2208、セレクタ2216」と、「論理ゲート2209〜2215と、セレクタ2217〜2223」とは、同じ動作をする。また、セレクタ2224は、信号2226が「1」のとき「1」を出力する。
【0065】
論理ゲート2208〜2215と、セレクタ2216から2224を用い、信号2226を「1」にすることで、乗算「a2×b2」の部分積8の生成と加算が実現できることになる。他の部分積も同様に生成加算できる。このように、図3、図22に示す構成により、乗算「a2×b2」の部分積加算の演算が実行できることになる。
【0066】
次に、図4に示す構成を有する手段により、32ビット乗算を行なうための符号拡張分の加算(部分積1から8までの加算)結果による、乗算「a1×b1」への影響をなくすための機能を実現するが、この動作について説明する。
【0067】
まず、全加算器400〜407によって、部分積25の32桁目〜25桁目(乗算「a1×b1」の部分積1(図2中の部分積25))の値を加算する処理を行なう。また、全加算器408〜414は、部分積24までの加算結果を出力している。
【0068】
論理ゲート415は、信号431が「0」のとき、全加算器408の和433を「0」にする機能を有する。同様に、論理ゲート416〜422も、信号431が「0」のとき、全加算器409から414の和を「0」にする機能を有する。また、論理ゲート423は、信号431が「0」のとき、全加算器408の桁上げ432を、「0」にする機能を有する。
【0069】
同様に、論理ゲート424〜430も、信号431が「0」のとき、全加算器409から414の桁上げを「0」にする機能を有する。信号431が「1」のときは、論理素子415〜430は、全加算器408〜414からの、桁上げと和の値を、そのまま通過させる機能を有する。
【0070】
つまり、信号431を「0」にするこによって、部分積24までの加算結果と、部分積25との加算処理を制御することができる。これにより、32ビット乗算のための符号拡張分の加算(部分積1から8までの加算)結果による、乗算「a1×b1」への影響をなくすことが可能となる。
【0071】
以上説明してきた、図3、図22、図4に示す構成を有する手段を備えることにより、部分積加算器104は、通常の32ビット乗算と同一の処理で、「a1×b1」と「a2×b2」の2つの乗算の部分積加算を、並列に実行することができる。
【0072】
次に、「シフト アンド セレクタ」107は、「a1×b1+c1」、「a×b2+c2」の並列実行を行なうことを指示するコントロール信号113を受けとり、部分積加算器104の演算結果の、上位16桁と下位16桁に、それぞれc1とc2の位取りが正しく合うように、図5の500に示すようにパックされたc1、c2を、501に示すようにシフト処理し、c1とc2間に「0」を埋め込む。
【0073】
「a1×b1+c1」、「a2×b2+c2」の演算を、並列実行しないときには、シフトしない状態の、500を選択する。
【0074】
3入力全加算器列108は、図5に示すような、上位16桁と下位16桁に「a1×b1」と「a2×b2」の部分積加算の、桁上げ保存加算器の出力503と、「シフト アンド セレクタ」107で選択された、入力501とを、桁上げ保存加算し、加算結果506を得る。「a1×b1+c1」、「a2×b2+c2」の並列実行の場合、501において、c1とc2との間は、値「0」が埋っているため、a1×b1+c1、a2×b2+c2の間の桁では桁上げが起きない。その結果、c1、c2の加算は互いに影響しない。
【0075】
図6に、並列に実行した演算結果が、オーバーフローまたはアンダーフローであるかの判定を並列に実行する、オーバーフロー/アンダーフロー判定部111の構成例を示す。
【0076】
上位用判定部600、下位用判定部601は、それぞれ、図5に示す506の上位16ビットと下位16ビットを、予め定めている値である、8ビット用上限値603、8ビット用下限値604と比較する処理を行なう。
【0077】
上位用判定部600は、図5に示す506の上位16ビットの内容が、8ビット用上限値603より大きな場合は、オーバーフローが発生したと判断し、また、8ビット用下限値604より小さい場合は、アンダーフローが発生したと判断する。また、下位用判定部601は、図5に示す506の下位16ビットの内容に対し、上位用判定部600と同様の判断を行なう。
【0078】
32ビット用判定部602は、506の下位32ビットを、予め定めている値である、32ビット用上限値605と32ビット用下限値606とを、それぞれ用いて、32ビット乗算の場合のオーバーフロー、アンダーフローが発生したか否かを判定する。なお、上位用判定部600と、下位用判定部601とは、別々に動作するので、上位と下位の16ビットの、オーバーフロー、アンダーフローの判定は、並列に実行できる。
【0079】
なお、上位用判定部600が出力する判定信号607、608は、それぞれ、506の上位16ビットがオーバーフロー、アンダーフローの時「1」となり、下位用判定部601が出力する判定信号609、610は、それぞれ、506の下位16ビットがオーバーフロー、アンダーフローの時「1」となり、32ビット用判定部602が出力する判定信号611、612は、それぞれ、506の下位32ビットがオーバーフロー、アンダーフローの時「1」となる。
【0080】
これらの判定信号607から612は、判定結果を最大値/最小値置換部112に送られる。
【0081】
図7に、通常の積和演算の場合と、今まで述べてきた、「a1×b1+c1」、「a2×b2+c2」を求める並列演算を実行する場合の、2つの場合に対応できるように、64ビット加算器109の出力状態(701からのデータの取り出し方)を制御する機能を有するアライナ110の構成図を示す。
【0082】
セレクタ702は、データ719(701の上位9ビット目から上位16ビット目までのデータ)とデータ720(701の上位33ビット目から上位40ビット目までのデータ)との選択を、「a1×b1+c1」および「a2×b2+c2」の並列演算実行時で「0」となり、通常の積和演算時に「1」となる制御信号723で行なう。
【0083】
論理ゲート703〜718(計16個あるが、複雑になるため図面では2個を記載し、あとは省略してある)は、制御信号723で、データ721(701の下位24ビット目から下位9ビット目まで)を「0」とする(図中、724で0値と記載している部分)。
【0084】
すなわち、「a1×b1+c1」、「a2×b2+c2」の並列演算実行時は、制御信号723が「0」となり、第1に、セレクタ702は、データ719を選択し、図中d1部は、データ719で満たされ、第2に、論理ゲート713〜718は、アンドゲートであるので、データ721は「0」となる。また、データ722は変化しないので、アライナの出力は、724のようになる。
【0085】
一方、通常の積和演算時で、制御信号723が「1」となると、セレクタ702は、データ720を選択し、さらに、データ721は、論理ゲート713〜718を、そのまま通過する。また、データ722は変化しないのでアライナの出力は725のようになる。
【0086】
この結果、「a1×b1+c1」および「a2×b2+c2」の並列演算実行時では、演算結果d1、d2が、32ビットのレジスタに、724のようにパックされることになる。
【0087】
次に、図8に、演算条件およびオーバーフロー/アンダーフロー判定部111の判定結果と、最大値/最小値置換部112の出力との関係を示す。
【0088】
以下に、出力の態様を示す。
【0089】
まず、図8中(1)に示す例では、「a1×b1+c1」および「a2×b2+c2」の演算が同時実行された場合で、上位側の結果が、オーバーフローと判定された時、出力の上位8ビットに、予め定めておいた値である最大値(max)を出力し、出力の下位8ビットは、演算結果をそのまま出力する。
【0090】
また、図8中(2)に示す例では、上位側の結果がアンダーフローと判定された時、出力の上位8ビットに、予め定めておいた値である最小値(min)を出力し、出力の下位8ビットは、、演算結果をそのまま出力する。
【0091】
また、図8中(3)に示す例では、下位側の結果が、オーバーフローと判定された時、出力の下位8ビットに、予め定めておいた値である最大値(max)を出力し、出力の上位8ビットは、演算結果をそのまま出力する。
【0092】
また、図8中(4)に示す例では、下位側の結果がアンダーフローと判定された時、出力の下位8ビットに、予め定めておいた値である最小値(min)を出力し、出力の上位8ビットは、演算結果をそのまま出力する。
【0093】
さらに、通常積和実行時で、オーバーフローと判定された場合、32ビット全体に、予め定めておいた値である最大値を出力し(図8(5)の示す例)、アンダーフローと判定された場合、32ビット全体に、予め定めておいた値である最小値を出力することも考えられる(図8(6))。
【0094】
その他、「a1×b1+c1」および「a2×b2+c2」の並列演算が実行された場合でも、通常積和実行時でも、オーバーフローまたはアンダーフローとも判定されなかった場合には、入力値をそのまま出力することも考えられる(図8(7)の例)。
【0095】
次に、32ビットのすべてのビットにデータをパックした例、例えば、8ビットの画素データを4個詰めて行う、並列積和演算器の実施例を図9を参照して説明する。
【0096】
本実施例の構成は、パックされた4つの被乗数a1、a2、a3、a4と、パックされた4つの乗数b1、b2、b3、b4とから部分積を求め、加算する部分積加算器900と、パックされた4つの加数c1、c2、c3、c4を、部分積加算器900の出力と桁合わせする「シフト アンド セレクタ」901と、部分積加算器900の2出力と「シフト アンド セレクタ」901の出力とを加算する機能を有する3入力全加算器列902と、3入力全加算器列の2出力を加算する機能を有する64ビット加算器903と、該加算器の出力を指定されたフォーマットに変換するアライナ904と、加算結果がオーバーフロー、アンダーフローであるか否かを判定するオーバーフロー/アンダーフロー判定部905と、その結果に基づいて、予め定めた規則に従って、前記アライナ904の出力を所定の値に置き換える機能を有する最大値/最小値置換部906とを有して構成されている。
【0097】
図9に示す実施例において、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の複数の積和演算を行なう際の動作を、データ長32ビットに、8ビットデータを4個を詰めた場合を例にとり説明する。
【0098】
積和演算を行うデータは、図10に示す、データフォーマット1000に示すように、4データ「a1、a2、a3、a4」で32ビットのデータを構成する。
【0099】
a1、a2、a3、a4、また、c1、c2、c3、c4についても、同様に、32ビットのデータとする。
【0100】
「a1、a2、a3、a4」をパックした32ビットデータと、「a1、a2、a3、a4」をパックした32ビットデータにおいて、32ビットデータ同士を乗算することで、8ビット同士の乗算「a1×b1」、「a2×b2」、「a3×b3」、「a4×b4」を同時に実行するものである。
【0101】
その際、32ビットデータの乗算結果のどの部分が、それぞれ乗算「a1×b1」、「a2×b2」、「a3×b3」、「a4×b4」に相当するかについて、図10を参照して説明する。
【0102】
なお、図10において、各部分積は、矩形で表現している。
【0103】
乗算「a1×b1」、「a2×b2」、「a3×b3」および「a4×b4」の各々の値は、それぞれ、部分積25から32、部分積17から24、部分積9から16、部分積1から8の加算によって求められる。そのため、図中黒く塗られた部分は、乗算「a1×b1」、「a2×b2」、「a3×b3」および「a4×b4」の拡張符号となる部分である。
【0104】
例えば、乗算「a4×b4」では、部分積1では9桁目〜15桁目まで、部分積2では10桁目〜15桁目まで、部分積3では11桁目〜15桁目まで、部分積4では12桁目〜15桁目まで、部分積5では13桁目〜15桁目まで、部分積6では14桁目〜15桁目まで、部分積7では15桁目が拡張符号となる部分である。
【0105】
また、前述した2乗算の並列演算と同様に、部分積8、16、24、32は、符号ビットに相当するため負数を作る必要がある。
【0106】
1つの部分積の加算に使用される32個の全加算器のうちの8個に、図22に示される示される論理ゲート2208〜2215とセレクタ2216〜2224と同じものを、全加算器2200〜2207と同じ接続関係で、追加することによって、負数の部分積の生成と加算が実現できる。論理ゲートとセレクタが追加される全加算器は、部分積8については、下位1ビット目〜8ビット目、部分積16については、9ビット目〜16ビット目、部分積24については、17ビット目〜24ビット目に、部分積32については、25ビット目〜35ビット目に対応する全加算器である。
【0107】
32ビット乗算の部分積加算で、部分積8と9、部分積16と17、部分積24と25の間で、加算結果の伝播をさせないようにする必要がある。また、部分積9〜16においては、下位8ビット(図中の斜線部分)を「0」とし、部分積17〜24においては、下位16ビット(図中の斜線部分)を「0」とし、部分積25〜32においては、下位24ビット(図中の斜線部分)を「0」とする。こらの機能により、4つの乗算の部分積加算の結果は、他と影響しあわず、そのため、4つの乗算の部分積加算が、並列に実行することができる。
【0108】
次に、図11に、4つの乗算の部分積加算の結果が、他と影響しあわない、部分積加算器の一部を例示する。
【0109】
図11に、部分積8の加算結果を、部分積9の加算へ伝播させない機能と、部分積9の下位8ビットを「0」にして、部分積1〜8までの加算結果を壊さない機能を実現する回路構成例を示す。
【0110】
全加算器1100〜1107によって、部分積8の13ビット目から6ビット目までに対する加算処理を行なう。
【0111】
また、全加算器1108〜1115によって、部分積9の13ビット目から6ビット目までに対する加算処理を行なう。論理ゲート1116、1120は、信号1133を「0」にすることによって、部分積8の加算結果1128、1129を全加算器1108に入力するのを阻止する機能を有する。論理ゲート1117〜1119、1120〜1123も、同様な動作を行ない、対応する全加算器への加算結果の入力を阻止する機能を有する。
【0112】
なお、信号1133は、4乗算を並列に実行するとき「0」となる。
【0113】
そのため、全加算器1108には、「0」が入力され、部分積9と加算される。これにより、部分積8の加算結果は、部分積9の10ビット目からの加算に使用ができなくなることになる。
【0114】
論理ゲート1124は、信号1142により部分積9の8ビット目に対して加算処理を行なう全加算器1112への入力を阻止する機能を有する。同様に、論理ゲート1125〜1127も、信号1133の入力により、同様の阻止動作をする。
【0115】
信号1142は、4乗算の並列演算のとき「0」となる。そのため、部分積9の8ビットより下位は、「0」となる。
【0116】
これらの構成により、信号1133、1142と、論理ゲート1016〜1127を用いて、部分積8までの加算と、部分積9の加算とを分離することができる。同様に、部分積16と部分積17、部分積24と部分積25の分離も実現できる。したがって、この部分積加算器では、4つの乗算の部分積加算の並列演算が実行できる。
【0117】
また、「シフト アンド セレクタ」901は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」を並列実行する旨の制御信号を受けとって、部分積加算器の結果の上位から16桁ごとに出力される「a1×b1」、「a2×b2」、「a3×b3」、および「a4×b4」のそれぞれに対し、加算値、c1、c2、c3、c4との位取りが正しく合わさるようにする。
【0118】
そのため、図12の1200に示すようにパックされた、c1、c2、c3、c4を、1201に示すように、c1の1ビット目が49桁目に、c2の1ビット目が33桁目に、c3の1ビット目が17桁目に、c4の1ビット目が1桁目にくるように、c1、c2、c3をシフトする。また、1201において、c1、c2、c3、c4のデータの存在しない部分には、値「0」を埋めておく。なお、「a1×b1+c1」、「a2×b2+c2」を並列演算実行しないときには、1200に示すようにパックされたデータをシフトしない。
【0119】
図13に、上位から16ビット単位に「a1×b1」、「b2×b2」、「a3×b3」、「a4×b4」の4つの並列乗算の結果(和と桁あげ)と、「シフトアンド セレクタ」で選択された入力の3入力を加算し、和と桁上げの2出力の加算結果を得る3入力全加算器列902の構成の一部を示す。
【0120】
全加算器1300と全加算器1301は、「a3×b3+c3」の演算結果を求める際、下位2ビットの演算に使用される。全加算器1302と全加算器1303は、「a4×b4+c4」の演算結果を求める際、上位2ビットの演算に使用される。
【0121】
論理素子1304は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の並列演算を実行する時に「0」となる信号1305によって、全加算器1302の桁上げ1306を阻止する。
【0122】
図では、「a3×b3+c3」と「a4×b4+c4」を演算する手段の中間部の構成を示したが、「a1×b1+c1」と「a2×b2+c2」を演算する手段の中間部、「a2×b2+c2」と「a3×b3+c3」を演算する手段の中間部にも、同様の構成の論理回路を設け、桁上げを阻止する。
【0123】
これにより、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の並列演算を実行しても、4演算間での桁上げによる影響をなくすことができる。また、各乗算の境界において生じた桁上げは、オーバーフロー/アンダーフローの判定に使用するため、オーバーフロー/アンダーフロー判定部に送る。
【0124】
図14に、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の積和演算の、各乗算値の境界での桁上げの阻止機能を有する64ビット加算器の構成の一部を示す。全加算器1400と1401は、「a3×b3+c3」の演算結果を求める際、下位2ビットの演算に使用される。
【0125】
全加算器1402と全加算器1403は、「a4×b4+c4」の演算結果を求める際、上位2ビットの演算に使用される。論理ゲート1404は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の並列演算を実行する時に「0」となる信号1405によって、全加算器1402の桁上げ1406を阻止する。
【0126】
図14では、「a3×b3+c3」、「a4×b4+c4」を演算する手段の中間部の構成を示したが、「a1×b1+c1」と「a2×b2+c2」を演算する手段の中間部、「a2×b2+c2」と「a3×b3+c3」を演算する手段の中間部にも、同様の構成の論理回路を設け、桁上げを阻止する。
【0127】
これにより、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の並列演算を実行しても、4演算間で、桁上げによる他の演算結果への影響をなくすことができる。また、各演算の境界に生じた桁上げは、オーバーフロー/アンダーフローの判定に使用するために、オーバーフロー/アンダーフロー判定部に送る。
【0128】
次に、図15に、オーバーフロー/アンダーフロー判定部の構成を示す。
【0129】
1500、1501、1502、1503は、それぞれ「a1×b1+c1用判定部」、「a2×b2+c2用判定部」、「a3×b3+c3用判定部」、「a4×b4+c4用判定部」である。
【0130】
1307〜1310は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の演算を並列実行した3入力全加算器列902によって求められる、各演算結果間における桁上げデータである。
【0131】
1407〜1410は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の演算を並列実行した64ビット加算器903によって求められる、各演算結果間における桁上げデータである。
【0132】
各判定部は、対応する演算の桁上げデータ2つと、64ビット加算器903の出力の対応する演算結果とから、8ビットに演算精度を制限していない演算結果を生成し、予め定めてある、8ビット用上限値および8ビット用下限値とを比較して、演算結果がオーバーフローとなるか、あるいは、アンダーフローとなるかを判定し、判定結果を出力する。
【0133】
例えば、「a1×b1+c1用判定部」1500は、桁上げ1307と、1407を加算する。
【0134】
その加算結果1504と、64ビット加算器の出力の下位16ビット1505とを、1504が上位にくるように連結し、18ビットの演算結果を生成する。
【0135】
新しくできた演算結果1506と、予め定めてある、8ビット用上限値および8ビット用下限値とを比較してオーバーフローとアンダーフローを判定し、判定結果1507を出力する。同様に、判定部1501、1502、1503も、オーバーフロー、アンダーフローの判定を行ない、判定結果をそれぞれ、1508、1509、1510として出力する。
【0136】
また、32ビット用判定部は、64ビット加算器の出力の下位32ビットを、予め定めた32ビット用上限値および32ビット用下限値と比較し、演算結果のオーバーフロー、アンダーフローを判定し、判定結果1511を出力する。
【0137】
次に、図16に、通常の積和演算の場合と、今まで述べてきた「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の並列演算実行の場合の、2つ場合に対応できるように、64ビット加算器903の出力状態(1601からのデータの取り出し方)を制御する機能を有するアライナ904の構成図を示す。 信号1600は、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の並列演算実行時で「0」となり、通常の積和演算時に「1」となる信号である。
【0138】
セレクタ1608は、データ1602(1601の下位56ビット目から下位49ビット目)とデータ1603(1601の下位32ビット目から下位25ビット目)のうち、信号1600が「1」のときデータ1603選択し、また、信号1600が「0」のときデータ1602を選択する。また、セレクタ1609は、データ1604(1601の下位40ビット目から下位33ビット目)とデータ1605(1601の下位24ビット目から下位17ビット目)のうち、信号1600が「1」のときデータ1605を選択し、また、信号1600が「0」のときデータ1604を選択する。
【0139】
さらに、セレクタ1610は、データ1605(1601の下位24ビット目から下位17ビット目)とデータ1606(1601の下位16ビット目から下位9ビット目)のうち、信号1600が「1」のときデータ1606を選択し、また、信号1600が「0」のときデータ1605を選択する。
【0140】
なお、データ1607(1601の下位8ビットのデータ)は、信号1600による選択制御を行なわない。この結果、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の並列演算実行時では、信号1600が「0」となるので、レジスタの領域d1、d2、d3、d4のそれぞれに、データ1602、1604、1605、1607が格納され、32ビットデータが、1611に示すようにパックされる。また、通常の積和演算では、データ1603、1605、1606、1607が格納され、1612に示すような32ビットデータが格納される。
【0141】
64ビット加算器の出力は、図16に示すアライナで、信号1600が、並列積和演算示す場合、即ち信号1600が「0」のときは1611、通常の32ビット積和演算の場合、即ち信号1600が「1」のときは1612のように、32ビットのデータに変換される。
【0142】
次に、最大値/最小値置換部906は、オーバーフロー/アンダーフロー判定部905からの判定信号を受けて、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、「a4×b4+c4」の並列演算実行時では、各演算結果に対して、所定の処理を行なう。
【0143】
所定の処理としては、例えば、判定結果がオーバーフローであれば、演算結果を、予め定めた、8ビットで表わされる最大値に置き換え、判定結果がアンダーフローであれば、演算結果を、予め定めた、8ビットで表わされる最小値に置き換え、また、いずれでもなければ、演算結果を置き換えずにそのまま出力する処理が考えられる。
【0144】
また、通常の積和演算時には、判定結果がオーバーフローであれば、演算結果を、予め定めた、32ビットで表わされる最大値に置き換え、判定結果がアンダーフローであれば、演算結果を、予め定めた、32ビットで表わされる最小値に置き換え、いずれでもなければ、演算結果を置き換えずにそのまま出力する処理をすればよい。
【0145】
上述のような構成により、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の各演算が分離して行なえ、32ビットの汎用の積和演算器を使用して、「a1×b1+c1」、「a2×b2+c2」、「a3×b3+c3」、および「a4×b4+c4」の各演算の並列実行が可能となる。
【0146】
もちろん、演算ビット数を考慮して本発明の技術的思想を適用することにより、本実施例により示した「32ビット×32ビット」の部分積和演算のみならず、他のビット数での部分積和演算を実行することができる。
【0147】
図17は、本発明にかかる積和演算器、または、乗算器を備えるマイクロプロセッサに対する命令コードの態様である。オペコード1700〜1703は、演算の種類によって定義される。また、オペランド1704〜1707は、演算に使われるデータのソースレジスタとターゲットレジスタを指定する。
【0148】
オペコード1700と1702は、それぞれ並列演算を行ない、同時に、複数の乗算または積和演算を行なうときに使用する。また、オペコード1701と1703は、それぞれ、通常の乗算または積和演算を行なうときに使用する。
【0149】
2データの並列演算を例にとり説明すると、オペコード1700「SplitMPY」は、a1、a2がパックされているソースレジスタr1と、b1、b2がパックされているソースレジスタr2に格納されている、データa1、a2、b1、b2を使用して、乗算「a1×b1」および「a2×b2」を並列に行ない、結果を、ターゲットレジスタr3に格納する命令である。
【0150】
また、オペコード1702「SplitMPYADD」は、a1、a2がパックされているソースレジスタr1と、b1、b2がパックされているソースレジスタr2と、c1、c2がパックされているソースレジスタr3(r3は、ターゲットレジスタを兼ねる)に格納されている、データa1、a2、b1、b2、c1、c2を使用して、積和演算「a1×b1+c1」および「a2×b2+c2」を並列に行ない、結果を、ターゲットレジスタを兼ねるレジスタr3に格納する命令である。
【0151】
なお、4データの並列演算も、データ数と並列演算の実行数が異なるだけであり、同様に、命令コードを設定することができる。
【0152】
一方、オペコード1701「ConnectMPY」は、1705に示されるレジスタr1とr2の値(値を、それぞれR1、R2とする)を用いて、乗算「R1×R2」を行ない、結果をレジスタr2に格納する命令である。また、1703「ConnectMPYADD」は、1707に示されるレジスタr1、r2、r3の値(値を、それぞれR1、R2、R3とする)を用いて、積和演算「R1×R2+R3」を行ない、結果を、ターゲットレジスタを兼ねるレジスタr3に格納する命令である。
【0153】
オペコード1703のみを有するアーキテクチャでは、「a1×b1+c1」および「a2×b2+c2」の演算を実行する場合、2度命令する必要があるが、前述のように、オペコード1702を定義して、並列演算させることにより、並列の積和演算「a1×b1+c1」および「a2×b2+c2」を、1度の命令で実行させることが可能となる。
【0154】
また、乗算についても、同様に、オペコード1700を定義することで、オペコード1701を使用する場合に比べて、必要な命令数が少なくなる。
【0155】
これによりプログラムが短くなり、プログラムはメモリに記憶されるため、これらの命令を使用すればメモリの容量を少なくすることが可能となり、本発明にかかる積和演算器等がマイクロプロセッサの構成要素となるときに、有効である。
【0156】
次に、図18に、本発明にかかる他の実施例を示す。
【0157】
図18は、本発明にかかる、乗算器(例えば、「a1×b1」なる演算を行なう手段)および積和演算器(例えば、「a1×b1+c1」なる演算を行なう手段)のうち少なくとも一方を備えたマイクロプロセッサ1800を有したシステムの構成図である。
【0158】
記憶装置には、マイクロプロセッサ1800が実行する処理を定めるプログラムや、必要なデータ等が記憶されている。本システムにおいて、マイクロプロセッサ1800が、前記プログラムにしたがって、ある画像処理を行なっているものとする。また、画像処理された画像は、CRT等によって実現される表示装置1802に表示される。このような表示処理は、マイクロプロセッサ1800が、予め定められているプログラムにしたがって行なわれる。
【0159】
さて、画像処理においては、積和演算を頻繁に実行する必要があり、積和演算に必要なデータは、記憶装置1801に記憶されているものとする。
【0160】
積和演算器1803は、本発明にかかる積和演算器であり、複数個の積和演算を並列に実行する。
【0161】
マイクロプロセッサ内のレジスタ1804が、記憶装置1801に記憶されているデータを使用して積和演算を行なうことを想定する。
【0162】
プログラムにより積和演算の実行が指示された場合、マイクロプロセッサ1800は、記憶装置1801にアクセスし、バス1805を介して、積和演算に必要なデータを、自己が備えるレジスタ1804に保持する。1回の、積和演算に必要なデータのみをアクセスしてもよいが、通常、一度に複数個の積和演算が行なわれるので、該当するデータを、すべてレジスタ1804に保持しておく。なお、レジスタ1804に保持される、被乗数データ(a1、a2、a3、a4)、乗数データ(b1、b2、b3、b4)、加算データ(c1、c2、c3、c4)の例を図18の左側に示す。図では、1回の積和演算を行なうための1組のデータを示したが、通常、複数組のデータを保持しておく。
【0163】
そして、次に、積和演算器が起動する。まず、レジスタ1804内の、積和演算に必要な全てのデータをソースバスを介して、取り込む。
【0164】
積和演算器は、取り込んだデータに基づいて、前述した積和演算を行ない、演算結果を順次、ターゲットバスを介して、レジスタ1804の空きエリアに送り、保持させる。もちろん、演算結果を後に使用するような画像処理を行なう場合、記憶装置1801に記憶することも考えられる。
【0165】
本発明にかかる積和演算器は、同時に複数種類の積和演算を行なうことができるため、画像処理の処理速度は、著しく向上する。
【0166】
複数の積和演算を並列に繰り返して実行できるため、例えば、積和演算を繰り返して行い、画像処理において頻繁に行なわれる処理である、離散コサイン変換等の処理に対しても高速な処理が行なえる。
【0167】
以上のように、本発明にかかる積和演算器(乗算器)を組み込んだマイクロプロセッサを実現し、該マイクロプロセッサ使用することにより、例えば、高速に画像処理を行なうことが可能なシステムを構築できる。もちろん、システムが対象とする処理内容は、画像処理に限られず、多量の積和演算を行なう処理であれば、いかなるものでもよい。
【0168】
【発明の効果】
以上述べたように、本発明によれば、複数の積和演算を並列に実行できるため、複数の積和演算を極めて高速に行なえる。
【図面の簡単な説明】
【図1】本発明にかかる実施例の構成図である。
【図2】乗算の符号拡張と分離機能の説明図である。
【図3】部分積加算器の符号拡張機能を実現するための手段の構成図である。
【図4】部分積加算器の分離機能を実現するための手段の構成図である。
【図5】「シフト アンド セレクタ」の動作の説明図である。
【図6】オーバーフロー/アンダーフロー判定部の構成図である。
【図7】アライナの構成図である。
【図8】最大値/最小値の置き換え処理の説明図である。
【図9】本発明にかかる他の実施例の構成図である。
【図10】乗算の符号拡張と分離機能の説明図である。
【図11】部分積加算器の構成図である。
【図12】「シフト アンド セレクタ」の動作の説明図である。
【図13】3入力全加算器列の構成図である。
【図14】64ビット加算器の構成図である。
【図15】オーバーフロー/アンダーフロー判定部の構成図である。
【図16】アライナの構成図である。
【図17】積和演算用の命令の説明図である。
【図18】本発明にかかる他の実施例の構成図である。
【図19】従来の乗算処理の説明図である。
【図20】従来の部分積加算器の説明図である。
【図21】全加算器の入出力関係の説明図である。
【図22】負数部分積加算機能を実現する手段の構成図である。
Claims (6)
- 複数の被乗数を有するNビットの数と、前記各被乗数に対応する乗数を有するMビットの数との積を求めることによって、被乗数と乗数との組に対する乗算結果を求める演算器であって、
8ビットの被乗数を複数個保持し、各被乗数のビット長の総和がN(Nは32ビット)を越えないことを条件として配置され、各被乗数の間に0を埋め込んだ状態で、Nビットの数を保持する第1レジスタと、
前記各被乗数に対応する8ビットの乗数を保持し、各乗数のビット長の総和がM(Mは32ビット)を越えないことを条件として配置され、各乗数の間に0を埋め込んだ状態で、Mビットの数を保持する第2レジスタと、
第1レジスタに保持された値と第2レジスタに保持された値との部分積を求めていく処理を行う部分積処理部と、
前記部分積において、1組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を2の補数表現したビットを埋込む符号拡張部と、
前記符号拡張部で符号拡張が行われた後、各部分積の和を順次求めていく手段であって、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める総和手段と、
前記総和手段によって求めた、総和値(「N+M」(ビット))のデータから、第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求める処理手段とを有する演算器。 - 請求項1において、
さらに、前記第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果に、値を加えるための加算数を複数個保持し、各加算数のビット長の総和が、予め定めた長さを越えないことを条件として配置され、各加算数の間に0を埋込み、加算数を保持する第3レジスタと、
前記第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果に対応する、第3レジスタにおける加算数を加算する加算手段とを備えること
を特徴とする演算器。 - 請求項1および2のいずれかにおいて、
前記第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果が、オーバーフロー、あるいは、アンダーフローである場合には、乗算結果を予め定めた値とする乗算値置換部を備えること
を特徴とする演算器。 - 複数の被乗数を有するNビットの数と、前記各被乗数に対応する乗数を有するMビットの数との積を求めることによって、被乗数と乗数の組に対する乗算結果を求める演算器であって、
被乗数を複数個保持し、各被乗数のビット長の総和がNを越えないことを条件として配置する、Nビットの数を保持する第1レジスタと、
前記各被乗数に対応する乗数を保持し、各乗数のビット長の総和がMを越えないことを条件として配置する、Mビットの数を保持する第2レジスタと、
第1レジスタに保持された値と第2レジスタに保持された値との部分積を求めていく処理を行う部分積処理部と、
前記部分積において、1組の被乗数と乗数の、乗算結果の符号を補償するため、乗算結果を2の補数表現したビットを埋込む符号拡張を行なう符号拡張部と、
ある組の被乗数(aビット)と乗数(bビット)に対する全ての部分積を求めた後、次の他の組の被乗数と乗数に対する部分積を求める際に、当該組に対する部分積において、被乗数の当該組より前の組に対応するビットに、0を埋め込む部分積編成手段と、
各部分積の和を順次求めていく手段であって、ある組の被乗数と乗数に対する全ての部分積の総和が所定値を越えた場合、該越えた値を、次の他の組の被乗数と乗数に対する部分積の総和を求めていく際に廃棄する、各部分積の総和値を求める総和手段と、
前記総和手段によって求めた、総和値(「N+M」(ビット))のデータから、第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果である値を切り出し、被乗数と乗数との組に対応する乗算結果を、各組について求める処理手段とを有する演算器。 - 請求項4において、
さらに、前記第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果に、値を加えるための加算数を複数個保持し、各加算数のビット長の総和が、予め定めた長さを越えないことを条件として配置する、加算数を保持する第3レジスタと、
前記第1レジスタにおける各被乗数と、これに対応する第2レジスタにおける乗数との乗算結果に対応する、第3レジスタにおける加算数を加算する加算手段とを備えること
を特徴とする演算器。 - 請求項1、2、4および5いずれか記載の演算器と、
予め定められた命令コードが与えられた場合には、前記演算器にデータを与えるデータ入力部と、
前記演算器を起動する起動手段と、
前記演算器の演算結果を得て出力するデータ出力部とを備えること
を特徴とするマイクロプロセッサ。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP15756694A JP3579087B2 (ja) | 1994-07-08 | 1994-07-08 | 演算器およびマイクロプロセッサ |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP15756694A JP3579087B2 (ja) | 1994-07-08 | 1994-07-08 | 演算器およびマイクロプロセッサ |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH0822451A JPH0822451A (ja) | 1996-01-23 |
JP3579087B2 true JP3579087B2 (ja) | 2004-10-20 |
Family
ID=15652490
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP15756694A Expired - Fee Related JP3579087B2 (ja) | 1994-07-08 | 1994-07-08 | 演算器およびマイクロプロセッサ |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3579087B2 (ja) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0847551B1 (en) * | 1995-08-31 | 2012-12-05 | Intel Corporation | A set of instructions for operating on packed data |
EP1049025B1 (en) * | 1998-01-21 | 2009-08-19 | Panasonic Corporation | Method and apparatus for arithmetic operations |
US7587582B1 (en) | 1998-12-03 | 2009-09-08 | Sun Microsystems, Inc. | Method and apparatus for parallel arithmetic operations |
AU2001281162A1 (en) * | 2000-08-16 | 2002-02-25 | Sun Microsystems, Inc. | General purpose processor with graphics/media support |
JP7052678B2 (ja) * | 2018-11-06 | 2022-04-12 | 株式会社デンソー | 畳込み演算方法 |
JP7230744B2 (ja) * | 2019-08-28 | 2023-03-01 | 株式会社デンソー | 畳込み演算方法及び演算処理装置 |
-
1994
- 1994-07-08 JP JP15756694A patent/JP3579087B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH0822451A (ja) | 1996-01-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6099158A (en) | Apparatus and methods for execution of computer instructions | |
US5448509A (en) | Efficient hardware handling of positive and negative overflow resulting from arithmetic operations | |
JP2662196B2 (ja) | 演算結果正規化方法及び装置 | |
EP2435906B1 (en) | Dsp engine with implicit mixed operands | |
US20170139677A1 (en) | Multiplication of first and second operands using redundant representation | |
US20050235026A1 (en) | Method and system for performing parallel integer multiply accumulate operations on packed data | |
US5426600A (en) | Double precision division circuit and method for digital signal processor | |
US10409604B2 (en) | Apparatus and method for performing multiply-and-accumulate-products operations | |
JP2004342106A (ja) | 可変幅の符号付きおよび符号なしオペランドのためのモジュラ2進乗算器 | |
JP2002149400A (ja) | 複数レジスタ指定が可能なsimd演算方式 | |
US5247471A (en) | Radix aligner for floating point addition and subtraction | |
JP3476960B2 (ja) | 算術論理演算装置及び制御方法 | |
JP3579087B2 (ja) | 演算器およびマイクロプロセッサ | |
US5867413A (en) | Fast method of floating-point multiplication and accumulation | |
US6499046B1 (en) | Saturation detection apparatus and method therefor | |
JP3803438B2 (ja) | 浮動小数点乗算累算装置 | |
US5825681A (en) | Divider/multiplier circuit having high precision mode | |
US4823300A (en) | Performing binary multiplication using minimal path algorithm | |
US5822786A (en) | Apparatus and method for determining if an operand lies within an expand up or expand down segment | |
US20080071852A1 (en) | Method to perform a subtraction of two operands in a binary arithmetic unit plus arithmetic unit to perform such a method | |
JPH04172526A (ja) | 浮動小数点除算器 | |
EP1197874B1 (en) | Signal processor and product-sum operating device for use therein with rounding function | |
US20030037088A1 (en) | Speed of execution of a conditional subtract instruction and increasing the range of operands over which the instruction would be performed correctly | |
JP3638218B2 (ja) | シフト機能付きalu命令を持つマイクロプロセッサ | |
KR100251547B1 (ko) | 디지탈신호처리기(Digital Sgnal Processor) |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20040706 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20040715 |
|
LAPS | Cancellation because of no payment of annual fees |