[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

JP2014041563A - 演算回路、演算処理装置、及び演算処理装置の制御方法 - Google Patents

演算回路、演算処理装置、及び演算処理装置の制御方法 Download PDF

Info

Publication number
JP2014041563A
JP2014041563A JP2012184594A JP2012184594A JP2014041563A JP 2014041563 A JP2014041563 A JP 2014041563A JP 2012184594 A JP2012184594 A JP 2012184594A JP 2012184594 A JP2012184594 A JP 2012184594A JP 2014041563 A JP2014041563 A JP 2014041563A
Authority
JP
Japan
Prior art keywords
mantissa
exponent
value
addition
digit
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.)
Granted
Application number
JP2012184594A
Other languages
English (en)
Other versions
JP5966768B2 (ja
Inventor
Kensuke Shinomiya
研介 篠宮
Kenichi Kitamura
健一 北村
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2012184594A priority Critical patent/JP5966768B2/ja
Priority to US13/935,610 priority patent/US20140059104A1/en
Publication of JP2014041563A publication Critical patent/JP2014041563A/ja
Application granted granted Critical
Publication of JP5966768B2 publication Critical patent/JP5966768B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods 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/483Computations with numbers represented by a non-linear combination of denominational numbers, e.g. rational numbers, logarithmic number system or floating-point numbers
    • G06F7/485Adding; Subtracting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods 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/491Computations with decimal numbers radix 12 or 20.
    • G06F7/4912Adding; Subtracting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods 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/499Denomination or exception handling, e.g. rounding or overflow
    • G06F7/49905Exception handling
    • G06F7/4991Overflow or underflow
    • G06F7/49915Mantissa overflow or underflow in handling floating-point numbers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods 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/499Denomination or exception handling, e.g. rounding or overflow
    • G06F7/49936Normalisation mentioned as feature only

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computational Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Nonlinear Science (AREA)
  • Complex Calculations (AREA)

Abstract

【課題】固定精度の浮動小数点数同士の加減算値に対する補正値を求める処理を効率的に実現する演算方式を提供する。
【解決手段】演算回路は、第1の指数部から第2の指数部と第1の仮数部の先行ゼロ計数値とを減算した値をシフト量として生成するとともに、第1の指数部から第1の仮数部の先行ゼロ計数値と第1の所定値とを減算した第3の指数部を生成する演算部と、シフト量に基づき第1の仮数部をシフトしたシフト後仮数部を生成するシフト部と、シフト後仮数部と第2の仮数部の一部を加算した加算値を生成するとともに、加算により生じたキャリーを生成する加算部と、シフト後仮数部とシフト量とキャリーとを入力し、桁溢れ及び桁落ちが生じる旨をそれぞれ表すフラグを生成する予測部と、加算値と第3の指数部とフラグとに基づいて、補正値仮数部と補正値指数部を生成する生成部を有する。
【選択図】図23

Description

本願開示は、演算回路、演算処理装置、及び演算処理装置の制御方法に関する。
銀行システムなどの勘定系や、一部の科学技術計算などでは、数値表現や演算における誤差を小さくするために、単精度の数値表現形式のビット幅の数倍のビット幅を有する多倍長、または、可変長の数値表現形式が採用されることがある。このような場合、符号と指数をひとつの整数で表現し、仮数については、それとは別の整数の列で表現することが多い。また、このような数値表現を採用した場合には、数値同士の計算を、整数演算を利用して実現することも多い。
しかし、多倍長、可変長の浮動小数点演算を、固定精度の浮動小数点演算を用いて実現する方法も提案されている(例えば非特許文献1及び非特許文献2)。固定精度の浮動小数点演算はハードウェアが高速な処理手段を提供している場合が多いため、このような方法をもちいることで、処理の高速化をはかることができる。多倍長の二進浮動小数点演算を、二倍長の浮動小数点演算をもちいて行うようなライブラリも存在する(例えば非特許文献3)。
これらの方法は、ひとつの数を、固定精度浮動小数点数の組(要素同士の足し算を実行せず、組のまま用いることから「未評価の和」とも呼ばれる)で表現し、その組同士の算術を適切に設計することで、大きな精度の算術を実現している。
これら先行研究においては、固定精度の浮動小数点演算として、通常用意されている算術演算のみを前提として、各種算術が設計されている。それに対し、専用の命令を追加することによって、より効率のよい処理を行う方法が提案されている(例えば特許文献1)。そのアルゴリズムは次のようになる。固定精度の浮動小数点数同士の正確な和を実現するために、計算結果を2つの固定精度の浮動小数点数z及びzzに格納している。
Two-sum-fast(x, y)
z = fi(x + y)
zz = get_zz(x, y)
return(z, zz)
fi(x+y)と書かれた演算は、固定精度浮動小数点演算としての加算である。get_zzが新たに追加された命令である。
このTwo−sum演算によって得られる2つの数z及びzzは、z+zz=x+yを満たす。zはx+yの最重要部(most significant part)を固定精度浮動小数点の精度内で表現した値である。zzは固定精度浮動小数点の精度で表現しきれなかった残余分(加減算値に対する補正値)を表す。図1にその模式図を示す。図1(a)には、第1の固定精度浮動小数点数が示され、図1(b)には、第2の固定精度浮動小数点数が示される。図1(c)には、第1の固定精度浮動小数点数の仮数部と第2の固定精度浮動小数点数の仮数部とを桁を合わせて並べ、加算したときのzとzzとを示している。
上記のアルゴリズムを実現するためには、fi(x+y)の結果が桁溢れ或いは桁落ちした時、それをget_zz処理(加減算値に対する補正値を求める処理)の結果に反映させなければならない。
特願2011−085882号
T. Dekker, A Floating-Point Technique for Extending the Available Precision, Number. Math. vol. 18, pp.224-242, 1971. D. Priest, On Property of Floating Point Arithmetics: Numerical Stability and the Cost of Accurate Computations, PhD thesis, University of California, Berkeley, November 1992. Yozo Hida, Xiaoye S. Li, David H. Bailey, Library for Double-Double and Quad-Double Arithmetic, 29 December 2007.
以上を鑑みると、浮動小数点数同士の加減算値に対する補正値を求める処理を、効率的に実現する演算方式が望まれる。
N進法(Nは2以上の整数)による第1の浮動小数点数と前記N進法による前記第1の浮動小数点数以下の第2の浮動小数点数を加減算した値である加減算値に対する補正値を算出する演算回路は、前記第1の浮動小数点数の符号部である第1の符号部と、前記第1の浮動小数点数の仮数部である第1の仮数部と、前記第1の浮動小数点数の指数部である第1の指数部を保持する第1の入力レジスタと、前記第2の浮動小数点数の符号部である第2の符号部と、前記第2の浮動小数点数の仮数部である第2の仮数部と、前記第2の浮動小数点数の指数部である第2の指数部を保持する第2の入力レジスタと、前記第1の指数部から前記第2の指数部を減算した値からさらに前記第1の仮数部の先行ゼロ計数値を減算した値をシフト量として生成するとともに、前記第1の指数部から前記第1の仮数部の先行ゼロ計数値を減算した値から第1の所定値を減算した第3の指数部を生成する演算部と、生成された前記シフト量に基づき、前記第1の仮数部をシフトしたシフト後仮数部を生成するシフト部と、生成された前記シフト後仮数部と前記第2の仮数部の一部を加算した加算値を生成するとともに、加算により生じるキャリーの有無を示すキャリー情報を生成する加算部と、前記シフト後仮数部と前記シフト量と前記キャリー情報を基に、桁溢れ又は桁落ちを示すフラグを生成する予測部と、前記第1の指数部から前記第1の仮数部の先行ゼロ計数値を減算した第1の値と前記第2の指数部から前記第2の仮数部の先行ゼロ計数値を減算した第2の値との差が第2の所定値以上の場合、前記第2の入力レジスタに保持される前記第2の符号部と前記第2の仮数部と前記第2の指数部とに基づいて、前記加減算値に対する正規化された補正値の仮数部である補正値仮数部と正規化された前記補正値の指数部である補正値指数部を生成するとともに、前記差が前記第2の所定値未満の場合、前記加算値と前記第3の指数部と前記シフト量と前記フラグとに基づいて、前記補正値仮数部と前記補正値指数部を生成する生成部を有することを特徴とする。
少なくとも1つの実施例によれば、浮動小数点数同士の加減算値に対する補正値を、上位桁側の加算の結果の桁溢れ又は桁落ちを予測して計算することで、上位桁側加算処理とは独立の処理により効率的に補正値を計算することができる。
浮動小数点同士の加算において浮動小数点の精度内で表現した加算値及び表現しきれなかった残余分を模式的に示す図である。 Oracle−numberの具体例の表を示す図である。 get_zzのアルゴリズムの例として第1のアルゴリズムを示す図である。 8バイト幅Oracle−number形式10進浮動小数点数を演算する第1のアルゴリズムの演算器の構成例である。 図4に示す演算器における指数仮数演算器の構成の一例を示す図である。 図4に示す演算器における正規化回路の構成の一例を示す図である。 fi(x+y)のアルゴリズムの一例を示す図である。 get_zzのアルゴリズムの一例を示す図である。 8バイト幅Oracle−number形式10進浮動小数点数を演算する第2のアルゴリズムのfi(x+y)演算器の構成例である。 8バイト幅Oracle−number形式10進浮動小数点数を演算する第2のアルゴリズムのget_zz演算器の構成例である。 図9に示すfi(x+y)演算器における指数仮数演算器の構成の一例を示す図である。 図9に示すfi(x+y)演算器における正規化回路の構成の一例を示す図である。 図10に示すget_zz演算器における指数仮数演算器の構成の一例を示す図である。 図10に示すget_zz演算器における重複桁追い出し回路の構成の一例を示す図である。 図10に示すget_zz演算器における正規化回路の構成の一例を示す図である。 get_zzのアルゴリズムの一例を示す図である。 (a)は、桁溢れ予測処理の流れの一例を示すフローチャートであり、(b)は桁溢れ予測処理の流れの一例を示すフローチャートである。 先行ゼロ計数処理の例を示す図である。 (a)及び(b)はそれぞれ、2進表現において桁溢れの発生する場合におけるfi(x+y)の計算例とget_zzの計算例とを示した図である。 (a)及び(b)はそれぞれ、2進表現において桁落ちが1桁発生する場合におけるfi(x+y)の計算例とget_zzの計算例とを示した図である。 (a)及び(b)はそれぞれ、2進表現において桁落ちが3桁発生する場合におけるfi(x+y)の計算例とget_zzの計算例とを示した図である。 コンピュータシステムの構成の一例を示す図である。 8バイト幅Oracle−number形式10進浮動小数点数を演算するget_zz演算器の構成の一例を示す図である。 図23に示すget_zz演算器における指数仮数演算器の構成の一例を示す図である。 図23に示すget_zz演算器におけるOVF・UDF予測回路の構成の一例を示す図である。 図23に示すget_zz演算器における重複桁追い出し回路の構成の一例を示す図である。 8バイト幅Oracle−number形式10進浮動小数点数を演算するfi(x+y)演算器の構成例である。 get_zz演算とfi(x+y)演算との両方を実行可能な演算器の構成の一例を示す図である。 図28に示す演算器における指数仮数演算器の構成の一例を示す図である。 図28に示す演算器における重複桁追い出し回路の構成の一例を示す図である。
以下に、本発明の実施例を添付の図面を用いて詳細に説明する。なお各図面において、同一又は対応する構成要素は同一又は対応する名称又は番号で参照し、その説明は適宜省略する。
以下の説明では、オラクルデータベース(商標)で用いられる数値型であるOracle−number(商標)形式10進浮動小数点数を数値表現の一例として用いる。Oracle−numberは、最大21バイトの可変長データ形式である。第1バイトに符号及び指数が格納され、後続バイトに仮数が格納される。仮数部は最大で20バイトである。
Oracle−numberは、10進浮動小数点数を表現するためのデータ形式である。主にメモリ使用効率上の理由から、仮数部は、1バイトあたり10進2桁分のデータを保持する。またそれにあわせて、指数部は、基数100に対する指数が格納される。Oracle−numberで表現される数は、以下の形式で表すことができる。
number = ± (M00 . M01 M02 ...) * 100^(exp)
ここでM00、M01、M02、・・・は、最大20バイトで表現される仮数部における第1バイト、第2バイト、第3バイト、・・・の各バイトの格納データを示す。仮数部は10進2桁毎に区切られているため、100進20桁とみなすこともできる。Oracle−numberは、この100進表現でみなしたときに必ず正規化されており、M00部(仮数部第1バイト)が0になることはない。
Oracle−number表現の第1バイト(全体の第1バイト)は、符号及び指数部であり、次のように符号化される。
number > 0 の場合:第1バイト = exp + 193
number == 0 の場合:第1バイト = 128
それ以外の場合:第1バイト = 62 - exp
第2バイト以降の仮数部は、バイト毎にM00、M01、・・・を保持する。各バイトにおいては、表現する数値の符号に応じて、以下に示すように異なった符号化がもちいられる。
number > 0 の場合:仮数部の第nバイト = M(n-1) + 1
number == 0 の場合:仮数部はない
それ以外の場合:仮数部の第nバイト = 101 - M(n-1)
上記の符号化において、Mnは0以上且つ99以下であるので、仮数部バイトの値に0X00が出現することがない。表現対象の数が短い仮数部で表現可能な場合には、Oracle−numberは21バイトよりも短く切り詰められる。即ち、Oracle−numberの仮数部には後続ゼロは許されていない。なお負数の表現においては、仮数部が 20バイトよりも短い場合には、仮数の終端を示すため、最後のバイトにターミネータとして102(0X66)が格納される。
Oracle−numberでは、上記のような符号化方式を採用することで、バイト列としてみたときの大小関係、即ちC標準関数memcmpによる比較に基づく大小関係と、Oracle−numberの数値としての大小関係とが等しくなる。
図2は、Oracle−numberの具体例の表を示す図である。例えば10E+0(=10×100)の表現において、指数部は193(=0+193)であり、仮数部は11(=10+1)である。また例えば10E+1(=1×100)の表現において、指数部は194(=1+193)であり、仮数部は2(=1+1)である。また例えば負の数−10E−130(=−10×100−65)の表現において、指数部は127(=62−(−65))であり、仮数部は91(=101−10)である。また例えば負の数−10E−129(=−1×100−64)の表現において、指数部は126(=62−(−64))であり、仮数部は100(=101−1)である。なお負の数には、最後のバイトにターミネータとして102が付加されている。更に、正の無限大Inf及び負の無限大−Infには、表中に示すような特別なバイト列が割り当てられている。
get_zz命令を実現する一つの方法として、倍幅の中間値、倍幅の加算処理を用いる手法が考えられる。
図3にget_zzのアルゴリズムの例として第1のアルゴリズムを示す。その手順は以下の通りである。
浮動小数点数で表現されたデータであるOP1とOP2が入力される(ステップS1)。この入力データのデータ形式に特別な制約はなく、また正規化されている必要はない。OP1とOP2の正規化後の指数差がN+1(Nは入力の桁の最大桁幅)以上である時(ステップS2でYES)、入力を正規化回路へバイパスする特別処理を行う。この時、fi(x+y)処理ならば指数の大きいほうを、get_zz処理ならば小さいほうの指数と仮数、そして符号部の組み合わせを正規化回路へバイパスする(ステップS3〜S5)。
OP1とOP2の正規化後の指数差がN+1未満である時(ステップS2でNO)、通常ケースとして桁合わせ処理を行う。OP1とOP2の指数差を求め、シフトにより桁合わせを行う(ステップS6)。加減算処理を行う(ステップS7)。この時加算は入力値の有効桁をカバーするため、2N桁の幅を必要とする。正規化処理を行う(ステップS8)。入力をバイパスする特別処理がなされていたならば、そちらを選択する。fi(x+y)処理であるならば結果の上位N桁を、get_zz処理であるならば結果の下位N桁を選択して出力する(ステップS9〜S11)。
図4は8バイト幅Oracle−number形式10進浮動小数点数を演算する第1のアルゴリズムの演算器の構成例である。図4に示す演算器は、入力Xレジスタ10、入力Yレジスタ11、デコーダ12及び13、指数仮数演算器14、セレクタ15乃至17、左シフタ18、倍長加算器19、セレクタ20及び21、正規化回路22、エンコーダ23、出力Zレジスタ24を含む。
図5は、図4に示す演算器における指数仮数演算器14の構成の一例を示す図である。指数仮数演算器14は、比較器31、LZC計数器32及び33、セレクタ34乃至37、絶対値減算器38乃至42、比較器43を含む。図6は、図4に示す演算器における正規化回路22の構成の一例を示す図である。正規化回路22は、AND回路51、絶対値加算器52、LZC計数器53、LZC補正器54、絶対値減算器55、左シフタ56、セレクタ57及び58を含む。
以下に、図4乃至図6に示す演算器の動作について説明する。なお8バイト幅Oracle−number形式10進浮動小数点数を例として説明に用いるが、デコード回路とエンコード回路を工夫することで、中身の構成はそのままでOracle−number形式とその他の形式の両方に対応させることも可能である。
入力と出力とを同精度の浮動小数点数とする。入力データは正規化されていなくともよいが、出力データは必ず正規化される。Oracle−numberの形式として指数部は必ず偶数であるため、前述のアルゴリズムがそれに対応するように改変されている。例えば指数仮数演算器14において先行ゼロ計数を行った時、結果が必ず偶数になるようにしている。なお図4及び以降の図において、各信号及びデータの表記は、指数exp、仮数T、先行ゼロ計数値LZC、左シフト量Lshift、右シフト量Rshift、指数比較信号comp、バイパスセレクト信号bypass、桁溢れOVF、桁落ちUDFである。
まず入力Xレジスタ10と入力Yレジスタ11より、データがデコーダ12及びデコーダ13にそれぞれ入力される。デコーダ12及び13により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力X及び入力Yの符号、指数、仮数をそれぞれ、符号X、指数X(expX)、仮数X(TX)、及び、符号Y、指数Y(expY)、仮数Y(TY)とする。
指数仮数演算器14に指数X、仮数X、指数Y、仮数Yが入力される。指数仮数演算器14の比較器31は、指数X及び指数Yの大小比較を行い、指数の大きい側を指数exp1とし、対応する仮数が仮数T1となり、指数の小さい側を指数exp2とし、対応する仮数が仮数T2となるようにセレクト信号を生成する。
指数仮数演算器14の絶対値加算器42及び比較器43は、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が16以上である場合、入力から正規化回路22へバイパスする演算を行う。指数仮数演算器14は、仮数T2とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
指数仮数演算器14の絶対値減算器41は、左シフタ18にシフト量RSAとして(指数exp1−指数exp2−仮数T1の先行ゼロ計数値)を出力する。ただし仮数T1の先行ゼロ計数値が奇数の時はその値を−1するとする。
指数仮数演算器14の絶対値減算器40は、指数exp1から仮数T1の先行ゼロ計数値を減算した値を指数exp3とし、正規化回路22に出力する。
左シフタ18が入力されたシフト量RSAに基づき、入力された仮数を左シフトする。左シフトされた仮数T1とシフトされていない仮数T2とが2Nの幅を持つ絶対値加算器19に入力される。減算の場合は、減数の仮数を反転することで1の補数を生成して入力し、倍長加算器19にキャリーとして1を入力する。倍長加算器19は、入力を加算し、結果を正規化回路22に出力する。
正規化回路22へのバイパスセレクト信号が1であるならばバイパスされた仮数と指数が正規化回路22に入力される。また正規化回路22へのバイパスセレクト信号が0であるならば加算結果と指数exp3が仮数と指数として正規化回路22に入力される。
正規化回路22のAND回路51、絶対値加算器52、セレクタ57、及び絶対値減算器55により、指数から仮数の先行ゼロ計数値を減算し、fi(x+y)演算であるか或いはバイパスセレクト信号が1ならば、その結果を指数Zとする。またバイパスセレクト信号が0であり且つget_zz演算の時は、上記結果から14をさらに減算して指数Zとする。
正規化回路22の左シフタ56により、仮数の先行ゼロ計数値だけ仮数を左シフトし、fi(x+y)演算であるか又はバイパスされているならば、左シフトの結果の上位14桁を仮数Zとする。またget_zz演算であるならば、左シフトの結果の下位14桁を仮数Zとする。
符号、指数Z、仮数Zがエンコーダ23により外部形式に変換され、出力Zレジスタ24に出力される。
以上に第1のアルゴリズムを説明したが、get_zz命令を実現するための第2のアルゴリズムとして、fi(x+y)処理で桁溢れと桁落ちの情報を出力し、その情報に基づいてget_zz処理を制御するという手法が考えられる。
図7はfi(x+y)のアルゴリズムの一例を示す図である。図8はget_zzのアルゴリズムの一例を示す図である。その手順はそれぞれ以下の通りである。
fi(x+y)処理においては、まず浮動小数点数で表現されたデータであるOP1とOP2が入力される(ステップS21)。この入力データのデータ形式に特別な制約はなく、また正規化されている必要はない。OP1とOP2の正規化後の指数差がN+1以上である時(ステップS22でYES)、入力を正規化回路へバイパスする特別処理を行う。この時、指数の大きいほうを結果にバイパスする(ステップS23)。
OP1とOP2の正規化後の指数差がN+1未満である時(ステップS22でNO)、通常ケースとして桁合わせ処理を行う(ステップS24)。即ち、OP1とOP2の指数差を求め、シフトにより桁合わせを行う。入力の上位側N桁の加減算処理を行う(ステップS25)。加算結果から桁溢れ量を出力する(ステップS26)。
正規化処理を行う(ステップS27)。入力をバイパスする特別処理がなされていたならば、そちらを選択する。正規化処理時の先行ゼロ計数値を桁落ち量として出力する(ステップS28)。加算の結果と桁溢れ、桁落ちの個数を出力する(ステップS29)。
get_zz処理においては、まず浮動小数点数で表現されたデータであるOP1とOP2が入力される(ステップS31)。この入力データのデータ形式に特別な制約はなく、また正規化されている必要はない。OP1とOP2の正規化後の指数差がN+1以上である時(ステップS32でYES)、入力を正規化回路へバイパスする特別処理を行う。この時、指数の小さいほうを結果にバイパスする(ステップS33)。
OP1とOP2の正規化後の指数差がN+1未満である時(ステップS32でNO)、通常ケースとして桁合わせ処理を行う(ステップS34)。即ちOP1とOP2の指数差を求め、シフトにより桁合わせを行う。入力の下位側N桁の加減算処理を行う(ステップS35)。上位側加算と下位側加算の結果で重複している桁を追い出す処理を行う(ステップS36)。この際、「N−桁合わせシフト量」を追い出しシフト量とする。fi(x+y)側で桁溢れが発生しているならば溢れた桁を吸収するため、追い出しシフト量から桁溢れ量を減算する。あるいはfi(x+y)側で桁落ちが発生している場合、fi(x+y)に吸収される桁を追い出すため、追い出しシフト量に桁落ち量を加算する。仮数を追い出しシフト量だけ左シフトする。fi(x+y)側で桁溢れが発生している時、入力された指数に桁溢れ量を加算する。あるいはfi(x+y)側で桁落ちが発生している時、桁落ち量を減算する。
正規化処理を行う(ステップS37)。入力をバイパスする特別処理がなされていたならば、バイパスされた指数と仮数を、なされていないならば追い出し処理から得た指数と仮数を正規化する。加算の結果を出力する(ステップS38)。
図9は8バイト幅Oracle−number形式10進浮動小数点数を演算する第2のアルゴリズムのfi(x+y)演算器の構成例である。図9に示すfi(x+y)演算器は、入力Xレジスタ60、入力Yレジスタ61、デコーダ62及び63、指数仮数演算器64、セレクタ65及び66、左シフタ67、右シフタ68、絶対値加算器69、セレクタ70及び71、正規化回路72を含む。fi(x+y)演算器は更に、エンコーダ73、出力Zレジスタ74、出力OVF・UDF計数レジスタ75を含む。
図10は8バイト幅Oracle−number形式10進浮動小数点数を演算する第2のアルゴリズムのget_zz演算器の構成例である。図10に示すget_zz演算器は、入力Xレジスタ80、入力Yレジスタ81、デコーダ82及び83、指数仮数演算器84、セレクタ85及び86、左シフタ87、絶対値加算器88、OVF・UDF計数レジスタ89、重複桁追い出し回路90を含む。get_zz演算器は更に、セレクタ91及び92、正規化回路93、エンコーダ94、出力Zレジスタ95を含む。
図11は、図9に示すfi(x+y)演算器における指数仮数演算器64の構成の一例を示す図である。指数仮数演算器64は、比較器101、LZC計数器102及び103、セレクタ104乃至106、絶対値減算器107乃至111、比較器112を含む。図12は、図9に示すfi(x+y)演算器における正規化回路72の構成の一例を示す図である。正規化回路72は、LZC計数器121、LZC補正器122、絶対値減算器123、左シフタ124を含む。
図13は、図10に示すget_zz演算器における指数仮数演算器84の構成の一例を示す図である。指数仮数演算器84は、比較器131、LZC計数器132及び133、セレクタ134乃至136、絶対値減算器137乃至142、比較器143を含む。図14は、図10に示すget_zz演算器における重複桁追い出し回路90の構成の一例を示す図である。重複桁追い出し回路90は、セレクタ151及び152、減算器153、加算器154及び155、左シフタ156を含む。図15は、図10に示すget_zz演算器における正規化回路93の構成の一例を示す図である。正規化回路93は、LZC計数器161、LZC補正器162、絶対値減算器163、左シフタ164を含む。
以下に、図9、図11、及び図12に示すfi(x+y)演算器の動作について説明する。
まず入力Xレジスタ60と入力Yレジスタ61より、データがデコーダ62及びデコーダ63にそれぞれ入力される。デコーダ62及び63により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力XYの符号、指数、仮数をそれぞれ、符号X、指数X(expX)、仮数X(TX)、符号Y、指数Y(expY)、仮数Y(TY)とする。
指数仮数演算器64に指数X、仮数X、指数Y、仮数Yが入力される。指数仮数演算器64の比較器101は、指数X及び指数Yの大小比較を行い、指数の大きい側を指数exp1とし、対応する仮数が仮数T1となり、指数の小さい側を指数exp2とし、対応する仮数が仮数T2となるようにセレクト信号を生成する。
指数仮数演算器64の絶対値減算器111及び比較器112は、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が16以上である場合、入力から正規化回路72へバイパスする演算を行う。指数仮数演算器64は、仮数T1とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、指数を選択する。
指数仮数演算器64の絶対値減算器107は、(指数exp1−指数exp2)を、シフト量LSA1とする。セレクタ105は、仮数T1の先行ゼロ計数を、シフト量LSA2とする。ただし値が奇数の時はその値を−1する。絶対値減算器110が、(指数exp1−指数exp2−仮数T1の先行ゼロ計数値)を計算し、計算値をシフト量RSAとして出力する。ただし仮数T1の先行ゼロ計数値が奇数の時はその値を−1する。絶対値減算器110によりLSA1とLSA2との大小比較を行う。この比較結果に応じて、セレクタ106が、LSA1のほうが小さい時はLSA2を、LSA1のほうが大きい時はLSA1を選択し、LSAとして出力する。指数仮数演算器64の絶対値減算器109が、指数exp1から仮数T1の先行ゼロ値を減算した値を指数exp3とし、正規化回路72へ出力する。
指数仮数演算器64は、右シフタ68へシフト量RSAを、左シフタ67へシフト量LSAを出力する。左シフタ67が、入力されたシフト量にもとづき、入力された仮数を左シフトする。右シフタ68が、入力されたシフト量にもとづき、入力された仮数を右シフトする。左シフトされた仮数T1と右シフトされた仮数T2とが、絶対値加算器69に入力される。減算の場合は、減数の仮数を反転することで1の補数を生成して入力し、絶対値加算器69にキャリーとして1を入力する。絶対値加算器69は、入力を加算し、結果を出力する。また絶対値加算器69のキャリーアウトが、出力OVF・UDF計数レジスタ75に出力する。
正規化回路72へのバイパスセレクト信号が1であるならばバイパスされた仮数と指数とが正規化回路72に入力される。また正規化回路72へのバイパスセレクト信号が0であるならば加算結果と指数exp3が仮数と指数として正規化回路72に入力される。
正規化回路72の絶対値減算器123により、指数から仮数の先行ゼロ計数値を減算し、結果を指数Zとする。正規化回路72の左シフタ124により、仮数の先行ゼロ計数値だけ加算結果を左シフトし、結果を仮数Zとする。
指数仮数演算器64において、先行ゼロ計数値が正規化回路72から出力OVF・UDF計数レジスタ75に出力される。符号、指数Z、仮数Zがエンコーダ73により外部形式に変換され、出力Zレジスタ74に出力される。
以下に、図10、図13、図14、及び図15に示すget_zz演算器の動作について説明する。
入力Xレジスタ80と入力Yレジスタ81より、データがデコーダ82及びデコーダ83にそれぞれ入力される。またOVF・UDF計数レジスタ89(図9の出力OVF・UDF計数レジスタ75と同一のレジスタでよい)から、値が重複桁追い出し回路90に入力される。
デコーダ82及び83により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力XYの符号、指数、仮数をそれぞれ、符号X、指数X(expX)、仮数X(TX)、符号Y、指数Y(expY)、仮数Y(TY)とする。
指数仮数演算器84に指数X、仮数X、指数Y、仮数Yが入力される。指数仮数演算器84の比較器131は、指数X及び指数Yの大小比較を行い、指数の大きい側を指数exp1とし、対応する仮数が仮数T1となり、指数の小さい側を指数exp2とし、対応する仮数が仮数T2となるようにセレクト信号を生成する。
指数仮数演算器84の絶対値減算器141及び比較器143は、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が16以上である場合、入力から正規化回路93へバイパスする演算を行う。指数仮数演算器84は、仮数T2とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
指数仮数演算器84の絶対値減算器140は、(指数exp1−指数exp2−仮数T1の先行ゼロ計数値)を計算し、その結果をシフト量RSAとする。ただし仮数T1の先行ゼロ計数値が奇数の時はその値を−1する。指数仮数演算器84の絶対値減算器139により、指数exp1から仮数T1の先行ゼロ計数値を減算し、更に絶対値減算器142により14を減算した値を指数exp3とし、重複桁追い出し回路90へ出力する。
指数仮数演算器84は、左シフタ87と重複桁追い出し回路90にシフト量RSAを出力する。左シフタ87が、入力されたシフト量にもとづき、入力された仮数を左シフトする。左シフトされた仮数T1とシフトされなかった仮数T2の下位14桁(56bit)が絶対値加算器88に入力される。減算の場合は、減数の仮数を反転することで1の補数を生成して入力し、絶対値加算器88にキャリーとして1を入力する。絶対値加算器88は、入力を加算し、結果を出力する。
重複桁追い出し回路90に、絶対値加算器88からの加算結果と、指数仮数演算器84からの指数exp3及びシフト量RSAと、OVF・UDF計数レジスタ89からの桁溢れ量及び桁落ち量とが入力される。重複桁追い出し回路90の減算器153は、(N−桁合わせシフト量)を追い出しシフト量とする。桁溢れ量が1の時(0か1しかとりえない)、重複桁追い出し回路90の減算器155は、追い出しシフト量を−2する。あるいは桁落ち量が0以上である時、重複桁追い出し回路90の減算器155は、桁落ち量だけ追い出しシフト量を減算する。桁溢れ量が1の時、重複桁追い出し回路90の減算器154は、指数exp3に2を加算する。あるいは桁落ち量が0以上である時、重複桁追い出し回路90の減算器154は、指数exp3から桁落ち量を減算する。重複桁追い出し回路90の左シフタ156は、仮数を追い出しシフト量だけ左シフトする。重複桁追い出し回路90は、正規化回路93に対して、結果の指数と仮数とを出力する。
正規化回路93へのバイパスセレクト信号が1であるならばバイパスされた仮数と指数とが正規化回路93に入力される。また正規化回路93へのバイパスセレクト信号が0であるならば重複桁追い出し回路90から出力された仮数と指数とが正規化回路93に入力される。
正規化回路93のLZC計数器161により、仮数の先行ゼロ計数値を求める。この時、先行ゼロ計数値が奇数である場合には、LZC補正器162により先行ゼロ計数値が−1される。正規化回路93の絶対値減算器163が、指数から仮数の先行ゼロ計数値を減算し、その結果を指数Zとする。正規化回路93の左シフタ164が、仮数の先行ゼロ計数値だけ仮数を左シフトし、結果を仮数Zとする。
符号、指数Z、仮数Zがエンコーダ94により外部形式に変換され、出力Zレジスタ95に出力される。
上記の第1のアルゴリズムの場合、入力データに対して倍幅の中間値、倍幅の加算処理を用いることは資源的、性能的に問題がある。ソフトウェアの場合には倍幅の型を使用しなければならないことからメモリへの圧迫が大きくなる、またハードウェア上に実装する場合には面積資源が倍必要となってしまう。そしてどちらの場合においてもビット幅が倍となるため加算などの処理がディレイクリティカルとなりうる。
上記の第2のアルゴリズム、即ちfi(x+y)の桁溢れ及び桁落ちの情報を伝達してget_zz処理を制御する手法の場合、通常のビット幅の加算器が使え、資源の制約は小さくなる。しかしながら、fi(x+y)処理を最初に実行し次にget_zz処理を実行するという順番で処理する必要があり、命令の処理順についての制約が発生してしまう。
固定精度の浮動小数点数同士の正確な和を、従来資源に大きな変更を加えることなく、高速に実行できるようにするために、多倍長精度加減算のアルゴリズムとして、上位ビットの値からの桁溢れ及び桁落ちを予測することが考えられる。これにより、fi(x+y)に依存せずにget_zzを得ることができる。なお本願の説明において、Nは仮数の最大幅を表わし、Mは進数の基数を表わす。
図16は、get_zzのアルゴリズムの一例を示す図である。その手順は以下の通りである。
浮動小数点数で表現されたデータであるOP1とOP2が入力される(ステップS41)。この入力データのデータ形式に特別な制約はなく、また正規化されている必要はない。OP1とOP2の正規化後の指数差がN+1以上である時(ステップS42でYES)、入力を正規化回路へバイパスする特別処理を行う。この時、指数が小さいほうを正規化回路にバイパスする(ステップS43)。
OP1とOP2の正規化後の指数差がN+1未満である時(ステップS42でNO)、通常ケースとして桁合わせ処理を行う。OP1とOP2の指数差を求め、指数の大きい側の仮数を指数差だけ左シフトする(ステップS44)。加減算処理を行う(ステップS45)。この時、LSBからN桁幅分だけを抽出し、加減算の結果と桁溢れ又は桁落ちが起きたか否かを示すフラグとを生成する。このフラグは加減算のキャリーアウトで判定できる。
処理が加算である時(ステップS46でadd)、桁溢れ予測処理を行う(ステップS47)。
図17(a)は、桁溢れ予測処理の流れの一例を示すフローチャートである。
この桁溢れ予測処理では、以下の処理が実行される。OP1とOP2のうち指数が大きい側の仮数と、下位側加減算処理で桁溢れが発生したかというフラグCOと、桁合わせ時のシフト量SAとが入力される(ステップS61)。先行M−1計数処理を行う(ステップS62)。ここで述べたM−1とは桁上がりしない限界の数のことを指す(2進数ならば1、2進化10進数ならば1001)。先行M−1計数値が桁合わせシフト量以上であり、且つ下位側加減算処理で桁溢れが発生していれば(ステップS63でYES)、桁溢れを示す値1を桁溢れフラグに設定し(ステップS64)、桁溢れフラグを出力する(ステップS65)。
また処理が減算である時(ステップS46でsub)、桁落ち予測処理を行う(ステップS48)。
図17(b)は、桁溢れ予測処理の流れの一例を示すフローチャートである。
この桁落ち予測処理では、以下の処理が実行される。OP1とOP2のうち指数が大きい側の仮数と、下位側加減算処理で桁落ちが発生したかというフラグBOと、桁合わせ時のシフト量SAとが入力される(ステップS71)。特殊先行ゼロ計数処理を行う(ステップS72)。これは初めに立っている1ではカウントを止めず、2番目に立っている1でカウントを止める先行ゼロ計数処理である。
図18は先行ゼロ計数処理の例を示す図である。図18の(a)乃至(e)に示されるように、特殊先行ゼロ計数処理においては、仮数の先行ゼロを計数する際に、最上位ビット側から各ビットをチェックしていき、最初に現れる1については0であると見なして0の数を計数する。図18において、SpecialtyLZCが、特殊先行ゼロ計数処理の計数結果を示す。
図17(b)に戻り、特殊先行ゼロ計数値が桁合わせシフト量以上であり、且つ下位側加減算処理で桁落ちが発生していれば(ステップS73でYES)、桁落ちを示す値1を桁落ちフラグに設定し(ステップS74)、桁落ちフラグを出力する(ステップS75)。
図16に戻り、上位側加算と下位側加算の結果で重複している桁を追い出す処理を行う(ステップS49)。この追い出し処理では、以下の処理を実行する。「N−桁合わせシフト量」を追い出しシフト量とする。桁溢れフラグが立っているならば、追い出しシフト量から1を減算する。桁落ちフラグが立っているならば、追い出しシフト量に1を加算する。また桁溢れフラグが立っているならば、指数に2を加算する。桁落ちフラグが立っているならば、指数から2を減算する。更に、仮数を追い出しシフト量だけ左シフトする。
正規化処理を行う(ステップS50)。この正規化処理では、バイパスセレクト信号が生成されているならば、バイパスされた指数と仮数とを正規化する。またバイパスセレクト信号が生成されていないならば、追い出し処理から得た指数と仮数とを正規化する。最後に、結果を出力する(ステップS51)。
桁溢れ予測のアルゴリズムは。桁溢れが発生する条件を利用したアルゴリズムである。その条件とは以下となる。
(a)演算が加算である(OP1とOP2の符号が等しい)。
(b)get_zzにおける加算処理が桁溢れをする。
(c)指数が大きいほうの仮数部のMSBからM−1(2進数ならば1、2進化10進数ならば1001)が連続する数を計数し、その値が桁合わせシフト値以上である。
この条件ならば下位の桁上げ信号が伝搬して、fi(x+y)側で桁溢れが発生する条件の全てを包含することが可能であり、非正規化数がOP1及びOP2として入力された場合も包含できる。
fi(x+y)で桁溢れが発生する時、それは必ず1桁しか起こらない。従って桁溢れが起こった場合はget_zz側における重複桁を追い出す量を−1すれば、あらゆる桁溢れの条件下においても正しい結果を出力することができる。何故ならば、重複桁の追い出しを1桁減らせば、get_zzの結果がfi(x+y)側のMSBを受け取ったことに等しい為である。
指数が大きいほうの桁合わせ後の仮数部をT1、小さいほうの仮数部をT2とし、Nを入力の仮数の桁幅、SAを桁合わせシフト量とする。さらにGをジェネレート(キャリーを生成するフラグ)、Pをプロパゲート(キャリーを伝搬するフラグ)とし、Cをキャリーとし、L(M−1)CをMSBからM−1(2進数ならば1、2進化10進数ならば1001)が連続する数のこととする。そしてNを入力の仮数の最大桁幅、Mを基数、iを連続する自然数とし、前述の桁溢れが発生する条件の証明を以下に行う。
桁溢れとは一般的に加算器の幅以上の桁に0以外の値が入った場合のことを指す。加算のキャリーの生成式は、
Figure 2014041563
となるため、
Figure 2014041563
とすると、上位側加算のキャリーアウトの生成式は、
Figure 2014041563
となり、このキャリーアウトが1となれば1桁の桁溢れが発生する。この時、必ず
Figure 2014041563
が満たされるため、
Figure 2014041563
となる。さらに下位側加算のキャリーアウト生成式、
Figure 2014041563
を用いて、生成式を整理すると、
Figure 2014041563
という生成式を得ることができる。
上位側加算のキャリーアウトの生成式に含まれる、
Figure 2014041563
とはすなわち、
Figure 2014041563
の時に1となる。この時に必要な0の個数はN'−N=SA個であるため、
Figure 2014041563
となれば条件を満たす。条件が≧で良いのは、P[N−1]以下の値は下位側加算のキャリーアウト生成式に包含されるためである。
さらに桁溢れは演算が加算である時(符号が一致する時)しか起こりえないため、前述の3つの条件、
(a)演算が加算である、
(b)下位側加算処理で桁溢れが発生する(CLO=1)、
(c)指数部が大きいほうの仮数部のMSBからM−1の個数を計数し、その値が桁合わせシフト以上である(L(M−1)C{TSA)、
を満たせば桁溢れが発生する。
図19(a)及び(b)はそれぞれ、2進表現において桁溢れの発生する場合におけるfi(x+y)の計算例とget_zzの計算例とを示した図である。仮数T1が指数の大きいほうの仮数であるとし、仮数の最大幅N=6、指数差(alignment shift)=4、仮数部をそれぞれ111110及び110101としている。
図19(a)にはfi(x+y)の計算例が示される。まず仮数T1を指数差分だけ左シフトする(1111100000)。仮数T1(1111100000)と仮数T2(0000110101)の上位N桁(6桁)を加算し、加算結果(1000001)を得る。加算の結果、桁溢れが発生しN(6)桁以上に値がはみ出てしまった為、溢れた1桁分だけ右シフトして値をN(6)桁幅に収める。この時、結果だけ見るとfi(x+y)から追い出されたLSB(1)はget_zzのMSBに収まるように見えることになる。加算結果の正規化を行い(加算結果の先行ゼロ計数値だけ左シフトする)、正規化後の結果(100000)を得る。この例では先行ゼロ計数値が0となるため、シフト量は0となっている。
図19(b)にはget_zzの計算例が示される。まず符号部を見て演算が加算であるか否かを判定する(上位側桁溢れ条件(a))。仮数T1を指数差分だけ左シフトする(1111100000)。仮数T1(1111100000)と仮数T2(0000110101)の下位N桁(6桁)を加算し、加算結果(1010101)を得る。この時、上位側加算と重複する桁が存在するが、この部分の加算は後の桁溢れ処理で使う為の加算である。加算の結果、下位側にキャリーアウトが発生した為、条件に合致する(上位側桁溢れ条件(b))。
上位側桁溢れが発生するには、条件(b)の桁溢れが上位側の最上位桁まで伝搬していかなければならない。従って下位側桁溢れが発生した桁から、最上位桁までM−1が詰まっていれば桁溢れが発生する。言い換えれば仮数T1のMSBから桁合わせシフト分の桁にM−1が詰まっていれば条件に合致する(L(M−1)C=5>桁合わせシフト量)(条件(c))。
下位N桁の加算は上位N桁の加算と重複する桁が存在するため、『仮数の最大幅−桁合わせシフト量』だけ左シフトし、重複する桁を捨てる処理を行う。しかし条件(a)、(b)、(c)が満たされているため、上位側で桁溢れが発生していると判定できる。そのため上位側から下位側に値を落としてくる必要がある。その値は上位側と下位側の加算で重複する桁のLSBに該当する。従って先ほどの左シフト量を−1して帳尻を合わせて結果を得る(101010)。
加算結果の正規化を行い(加算結果の先行ゼロ計数値だけ左シフトする)、正規化後の結果(101010)を得る。この例では先行ゼロ計数値が0となるため、シフト量は0となっている。
桁落ち予測のアルゴリズムは桁落ちが発生する条件を利用したアルゴリズムである。その条件とは以下となる。
(a)演算が減算である(OP1とOP2の符号が異なる)。
(b)get_zzにおける減算処理が桁落ちをする。
(c)指数が大きいほうの仮数部の先行ゼロ計数(ただし初めに現れた1は0としてカウントする)をし、その値が桁合わせシフト値以上である。
この条件ならば下位の桁落ち信号が伝搬して、fi(x+y)側で少なくとも1桁が桁落ちする条件の全てを包含することが可能であり、非正規化数がOP1、OP2として入力された場合も包含できる。
fi(x+y)で桁落ちが発生する時、それは1桁しか起こらないとは限らない。しかし桁落ちの量に関わらず重複桁の追い出し量を+1することによって、あらゆる桁落ちの条件下においても正しい結果を出力することが可能である。これは、何故ならば、桁落ちが2桁以上発生する条件は上記に加えて以下の条件の時に発生する為である。
(d)桁合わせシフト値は指数が大きいほうの仮数部の先行ゼロ計数値(ただし初めに現れた1は0としてカウントする)に1を加算した値に等しい。
即ち、桁落ちが2桁以上発生した場合はget_zzからそれに応じた桁数を追い出さなければならないように思えるが、(d)の条件が絶対条件であるため、この処理はget_zzの結果から桁を全て追い出す処理に等しい。しかし(d)の条件が合致する時、桁落ちを考慮せずとも、get_zz側に残るべき桁は1桁しか残っていない。従って1桁だけ追い出せばget_zzの結果から全ての桁を追い出す処理を行ったことになる。これは少なくとも1桁が桁落ちするケースと処理が同様となる。
従って、2桁以上桁落ちというケースを予測する必要はなく、少なくとも1桁が桁落ちするケースだけを予測すれば良いという結論になる。
指数が大きいほうの桁合わせ後の仮数部をT1、小さいほうの仮数部をT2とし、Nを入力の仮数の桁幅、SAを桁合わせシフト量とする。さらにGをジェネレート(ボローを生成するフラグ)、Pをプロパゲート(ボローを伝搬するフラグ)とし、Bをボローとし、specialityLZCを先行ゼロ計数(ただし初めに現れた1は0としてカウントする)とする。そしてiは連続する自然数とし、前述の少なくとも1桁の桁落ちが発生する条件、そして2桁以上の桁落ちが発生する条件の証明を以下に行う。
桁落ちとは一般的に入力を加算器に入力した時、有効桁の最上位の桁が0となった場合のことを指す。
Figure 2014041563
となる。この時、Tの先行ゼロ計数を行い、その結果をLZC{T}とし、
Figure 2014041563
とすると、MSBから初めて0以外の値が入った桁の結果は、
Figure 2014041563
となる。この結果が0となれば桁落ちが少なくとも1桁発生する。この時、必ず、
Figure 2014041563
が満たされる為、
Figure 2014041563
となる。さらに下位側減算のボローアウトアウト生成式、
Figure 2014041563
を用いて、生成式を整理すると、
Figure 2014041563
という生成式を得ることができる。
さらにB[N″−2]は0か1の値しかとりえない為、S[N″−1]=0となるには
T[N″−1]=1である必要がある。従って桁落ちの条件は、
Figure 2014041563
の両方を満たす必要がある。上位側減算のボローアウト生成式に含まれる
Figure 2014041563
とは即ち、
Figure 2014041563
の時に1となる。この時に必要な0の個数はN″−N−1=SA−LZC{T}−1個である。
Figure 2014041563
という2つの条件は計数中に始めに現れた1を一度だけ0として計数する特殊な先行ゼロ計数値をspecialityLZC{T}とすると、
Figure 2014041563
という条件でまとめることができる。
条件が≧で良いのは、P[N−1]以下の値は下位側減算のキャリーアウト生成式に包含されるためである。さらに桁落ちは演算が減算である時(符号が不一致する時)しか起こりえないため、前述の3つの条件、
(a)演算が減算である、
(b)下位側減算処理で桁落ちが発生する(BL0=1)、
(c)指数部が大きいほうの仮数部のMSBから0の個数を計数し(ただし計数中に1が出現したならば1回だけ0としてカウントする)、その値が桁合わせシフト以上である(specialityLZC{T}≧SA)、
を満たせば桁落ちが発生する。
上位側減算がD(Dは1以上の自然数)桁落ちするためには、
Figure 2014041563
である必要がある。この時、前述した少なくとも1桁桁落ちの条件により、
Figure 2014041563
を既知とする。従ってD桁桁落ちは、
Figure 2014041563
より、
Figure 2014041563
を満たせば良いと導ける。すなわち、
Figure 2014041563
がD桁桁落ちの条件である。
桁合わせシフト量SAとTとの関係は、
Figure 2014041563
であるため、SA>LZC{T}+2となるとT[N″−2]=0となってしまう。これは、M−1の条件に合致しなくなる。SA<LZC{T}+2となると、T[N″−1]=0の時しか減算が成り立たなくなり、かつBL0が発生しないため、条件が成り立たない。従ってSA=LZC{T}+2が2桁以上桁落ちの条件となる。この時、T[N″−1]=1である。従ってSA=LZC{T}+2という条件はSA=specialityLZC{T}+1と書き換えることができる。
図20(a)及び(b)はそれぞれ、2進表現において桁落ちが1桁発生する場合におけるfi(x+y)の計算例とget_zzの計算例とを示した図である。仮数の最大幅N=6、指数差(alignment shift)=4、仮数部をそれぞれ100001と100101としている。
図20(a)にはfi(x+y)の計算例が示される。まず仮数T1を指数差分だけ左シフトする(1000010000)。仮数T1(1000010000)と仮数T2(0000100101)の上位N桁(6)を加算し、加算結果(011100)を得る。
加算結果の正規化を行い(加算結果の先行ゼロ計数値だけ左シフトする)、正規化後の結果(111001)を得る。この例では、先行ゼロ計数値が1となるため、1桁左シフトして正規化を行っている。ここで得た結果のLSBは、get_zz側から追い出されてきた桁であり、get_zz演算では帳尻を合わせるためにこれを考慮しなければならない。
図20(b)にはget_zzの計算例が示される。まず符号部を見て演算が減算であるか否かを判定する(上位側桁落ち条件(a))。仮数T1を指数差分だけ左シフトする(1000010000)。仮数T1(1000010000)と仮数T2(0000100101)の下位N(6)桁を加算し、加算結果(1001011)を得る。この時、上位側加算と重複する桁が存在するが、この部分の加算は後の桁溢れ処理で使う為の加算である。この加算の結果、下位側にボローアウトが発生した為、条件に合致する(上位側桁落ち条件(b))。
上位側桁落ちが発生するには、条件(b)の桁落ちが上位側の最上位桁まで伝搬していかなければならない。従って有効桁の最上位桁の値が1であり、下位側桁落ちが発生した桁から、有効桁のMSBまで0が詰まっていれば桁落ちが発生する。言い換えれば仮数T1のMSBから桁合わせシフト分の桁に0が詰まっていれば(ただし初めに現れた1は0としてカウントする)、条件に合致する(specialityLZC=5>桁合わせシフト量(上位側桁落ち条件(c))。
下位N桁の加算は上位N桁の加算と重複する桁が存在するため、『仮数の最大幅−桁合わせシフト量』だけ左シフトし、重複する桁を捨てる処理を行う。しかし、条件(a)、(b)、(c)が満たされているため、上位側で桁落ちが発生していると判定できる。そのため下位側から値を追い出す必要がある。その値は下位側のMSBに該当する。従って先ほどの左シフト量を+1して帳尻を合わせて結果を得る(011000)。
加算結果の正規化を行い(加算結果の先行ゼロ計数値だけ左シフトする)、正規化後の結果(110000)を得る。この例では先行ゼロ計数値が1となるため、1桁左シフトをしている。
また、図21(a)及び(b)はそれぞれ、2進表現において桁落ちが3桁発生する場合におけるfi(x+y)の計算例とget_zzの計算例とを示した図である。仮数の最大幅N=6、指数差(alignment shift)=4、仮数部をそれぞれ100001と110101としている。
図21(a)にはfi(x+y)の計算例が示される。まず仮数T1を指数差分だけ左シフトする(1000010)。仮数T1(1000010)と仮数T2(0110101)の上位N桁(6)を加算し、加算結果(000100)を得る。
加算結果の正規化を行い(加算結果の先行ゼロ計数値だけ左シフトする)、正規化後の結果(100100)を得る。この例では先行ゼロ計数値が3となるため、3桁左シフトして正規化を行っている。ここで得た結果のLSBは、get_zz側から追い出されてきた桁であり、get_zz演算では帳尻を合わせるために、これを考慮しなければならない。
図21(b)にはget_zzの計算例が示される。まず符号部を見て演算が減算であるか否かを判定する(上位側桁落ち条件(a))。仮数T1を指数差分だけ左シフトする(1000010)。仮数T1(1000010)と仮数T2(0110101)の下位N(6)桁を加算し、加算結果(1001001)を得る。この時、上位側加算と重複する桁が存在するが、この部分の加算は後の桁溢れ処理で使う為の加算である。加算の結果、下位側にボローアウトが発生した為、条件に合致する(上位側桁落ち条件(b))。
上位側桁落ちが発生するには条件(b)の桁落ちが上位側の最上位桁まで伝搬していかなければならない。従って有効桁の最上位桁の値が1であり、下位側桁落ちが発生した桁から、有効桁のMSBまで0が詰まっていれば桁落ちが発生する。言い換えれば仮数T1のMSBから桁合わせシフト分の桁に0が詰まっていれば(ただし初めに現れた1は0としてカウントする)、条件に合致する(specialityLZC=5>桁合わせシフト量(上位側桁落ち条件(c))。
上位側が3桁桁落ちしているため、本来であれば、下位側も3桁追い出さなければならない。しかし指数差が1しかないため、下位側の結果にはMSBの1桁以外が0の値である。従って下位側のMSBの1桁だけを追い出せば3桁追い出すことと同等となる。条件(a)、(b)、(c)が満たされているため、『仮数の最大幅−桁合わせシフト量+1』を左シフトして結果を得る(000000)。
加算結果の正規化を行い(加算結果の先行ゼロ計数値だけ左シフトする)、正規化後の結果(000000)を得る。この例では結果の桁が全て0である為、シフトしても結果は全ての桁が0となる。
上記の演算手法により、固定精度の浮動小数点数同士の正確な和を、従来資源に大きな変更を加えることなく、高速に実行できるようになる。また、正確な和アルゴリズムは、多倍長や可変長の浮動小数点演算を、固定精度の浮動小数点演算を用いて実現する場合に頻繁に用いられるため、この演算手法による高速化により、浮動小数点演算一般をより高速に実行できるようになる。
図22は、コンピュータシステムの構成の一例を示す図である。図22に示すコンピュータシステムは、プロセッサ170及びメモリ171を含む。演算処理装置としてのプロセッサ170は、2次キャッシュ部172、1次キャッシュ部173、制御部174、及び演算部175を含む。1次キャッシュ部173は、命令キャッシュ173A及びデータキャッシュ173Bを含む。演算部175は、レジスタ176、演算制御部177、及び演算器178を含む。演算器178には演算回路179が含まれる。なお図22及び以降の同様の図において、各ボックスで示される各機能ブロックと他の機能ブロックとの境界は、基本的には機能的な境界を示すものであり、物理的な位置の分離、電気的な信号の分離、制御論理的な分離等に対応するとは限らない。各機能ブロックは、他のブロックと物理的にある程度分離された1つのハードウェアモジュールであってもよいし、或いは他のブロックと物理的に一体となったハードウェアモジュール中の1つの機能を示したものであってもよい。各機能ブロックは、他のブロックと論理的にある程度分離された1つのモジュールであってもよいし、或いは他のブロックと論理的に一体となったモジュール中の1つの機能を示したものであってもよい。
上記コンピュータシステムはCPU(Central Processing Unit)を用いた情報処理装置を模式化したものであり、このコンピュータシステムによりOracle−number等を演算するハードウェアを実現する。プロセッサ170では、1次キャッシュ部173及び2次キャッシュ部172を設けることにより、キャッシュメモリを多階層化した構成となっている。具体的には、1次キャッシュ部173と主記憶(メモリ171)との間に、主記憶よりも高速にアクセスできる2次キャッシュ部172を設けている。これにより、1次キャッシュ部173においてキャッシュミスが発生した場合に、主記憶にアクセスが必要になる頻度を低くして、キャッシュミス・ペナルティーを軽減することができる。
制御部174は、命令フェッチアドレスと命令フェッチリクエストとを1次命令キャッシュ173Aに発行し、この命令フェッチアドレスから命令をフェッチする。制御部174は、フェッチした命令をデコードした結果に従い演算部175を制御して、フェッチされた命令を実行する。演算制御部177は、制御部174の制御下で動作し、演算対象のレジスタ176からのデータを演算器178に供給したり、演算結果のデータを指定されたレジスタ176に格納したりする。また演算制御部177は、演算器178が実行する演算のタイプを指定する。更に演算制御部177は、アクセス先のアドレスを指定し、1次キャッシュ部173の当該アドレスに対してロード命令やストア命令を実行する。ロード命令により、指定アドレスから読み出されたデータは、指定されたレジスタ176に格納される。またストア命令により、指定されたレジスタ176のデータが、指定されたアドレスに書き込まれる。演算器178に含まれる演算回路179が、前述の浮動小数点数同士の正確な和を実現するための回路である。
図23は、8バイト幅Oracle−number形式10進浮動小数点数を演算するget_zz演算器の構成の一例を示す図である。なお8バイト幅Oracle−number形式10進浮動小数点数を例として説明に用いるが、デコード回路とエンコード回路を工夫することで、中身の構成はそのままでOracle−number形式とその他の形式の両方に対応させることも可能である。図23に示すget_zz演算器は、入力Xレジスタ180、入力Yレジスタ181、デコーダ182及び183、指数仮数演算器184、セレクタ185及び186、左シフタ187、絶対値加算器188、OVF・UDF予測回路189、重複桁追い出し回路190を含む。get_zz演算器は更に、セレクタ191及び192、正規化回路193、エンコーダ194、出力Zレジスタ195を含む。
図24は、図23に示すget_zz演算器における指数仮数演算器184の構成の一例を示す図である。指数仮数演算器184は、比較器201、LZC計数器202及び203、セレクタ204乃至206、絶対値減算器207乃至212、比較器213を含む。図25は、図23に示すget_zz演算器におけるOVF・UDF予測回路189の構成の一例を示す図である。OVF・UDF予測回路189は、先行する9の個数を計数するL9C回路221、LZC計数器222、比較器223及び224、AND回路225及び226を含む。図26は、図23に示すget_zz演算器における重複桁追い出し回路190の構成の一例を示す図である。重複桁追い出し回路190は、セレクタ231及び232、減算器233、加算器234及び235、ゼロマスク回路236を含む。
図23において入力と出力とは同精度の浮動小数点数とする。入力データは正規化されていなくともよいが、出力データは必ず正規化される。Oracle−numberの形式として指数部は必ず偶数であるため、前述のアルゴリズムがそれに対応するように改変されている。例えば桁溢れ及び桁落ち時の追い出し処理量の加減算が、+1及び−1ではなく、+2及び−2となっている。
また、前述のアルゴリズムの説明では、下位側加算が桁溢れ又は桁落ちしたかを示すフラグを設定していた。しかしながら、ハードウェア実装上では減算の際には除数側を2の補数に変換して、加算で処理を行う為、桁溢れ又は桁落ちを示すフラグは、両者共にキャリーアウトという表現で統一する。
また、前述のアルゴリズムの説明では、重複桁追い出し処理をシフトで行っており、正規化処理と合わせて2回のシフトを行っていた。実施例では、2回のシフトではなく、1回の0マスクと1回のシフトで同等の処理を行うことにより、論理段数の低減を図っている。
以下に、図23乃至26に示すget_zz演算器の動作について説明する。
入力Xレジスタ180と入力Yレジスタ181より、データがデコーダ182及びデコーダ183にそれぞれ入力される。デコーダ182及び183により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力XYの符号、指数、仮数をそれぞれ、符号X、指数X(expX)、仮数X(TX)、符号Y、指数Y(expY)、仮数Y(TY)とする。
指数仮数演算器184に指数X、仮数X、指数Y、仮数Yが入力される。指数仮数演算器184の比較器201は、指数X及び指数Yの大小比較を行い、指数の大きい側を指数exp1とし、対応する仮数が仮数T1となり、指数の小さい側を指数exp2とし、対応する仮数が仮数T2となるようにセレクト信号を生成する。
指数仮数演算器184の絶対値減算器211及び比較器213は、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が16以上である場合、入力から正規化回路193へバイパスする演算を行う。指数仮数演算器184は、仮数T2とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
指数仮数演算器184の絶対値減算器210は、(指数exp1−指数exp2−仮数T1の先行ゼロ計数値)を計算し、その結果をシフト量RSAとする。ただし仮数T1の先行ゼロ計数値が奇数の時はその値を−1する。指数仮数演算器184の絶対値減算器209により、指数exp1から仮数T1の先行ゼロ計数値を減算し、更に絶対値減算器212により14を減算した値を指数exp3とし、重複桁追い出し回路190へ出力する。
指数仮数演算器184は、左シフタ187と重複桁追い出し回路190にシフト量RSAを出力する。左シフタ187が、入力されたシフト量にもとづき、入力された仮数を左シフトする。左シフトされた仮数T1とシフトされなかった仮数T2の下位14桁(56bit)が絶対値加算器188に入力される。減算の場合は、減数の仮数を反転することで1の補数を生成して入力し、絶対値加算器188にキャリーとして1を入力する。絶対値加算器188は、入力の下位14桁(56ビット)を加算し、結果を重複桁追い出し回路190に出力する。またキャリーアウトが、絶対値加算器188からOVF・UDF予測回路189に供給される。
OVF・UDF予測回路189に仮数T1、シフト量RSA、加算結果のキャリーアウトが入力される。OVF・UDF予測回路189が、桁溢れ予測を行う。OVF・UDF予測回路189のL9C回路221が、仮数T1の先頭桁から9(1001)が連続する個数を計数する。比較器223及びAND回路225により、9の計数値がシフト量RSA以上であり、且つキャリーアウトが発生しており、且つ演算が加算である時に、桁溢れの発生を示すフラグを生成し、フラグを重複桁追い出し回路190に出力する。
またOVF・UDF予測回路189が、桁落ち予測を行う。OVF・UDF予測回路189のLZC計数器222が特殊先行ゼロ計数を行う。比較器224及びAND回路226により、ゼロ計数値がシフト量RSA以上であり、且つキャリーアウトが発生しており、且つ演算が減算である時に桁落ちの発生を示すフラグを生成し、フラグを重複桁追い出し回路190に出力する。
重複桁追い出し回路190に、絶対値加算器188からの加算結果と、指数仮数演算器184からの指数exp3及びシフト量RSAと、OVF・UDF予測回路189からの桁溢れフラグ及び桁落ちフラグとが入力される。重複桁追い出し回路190の減算器233は、(14(仮数部桁幅)−シフト量RSA)を計算し、その値をマスク量とする。但し、加算器234により、桁溢れフラグが立っている時はマスク量を−2し、桁落ちフラグが立っている時はマスク量を+2する。またマスク量が負の数となった時にはマスク量を0とする。また重複桁追い出し回路190の加算器235により、桁溢れフラグが立っている時に指数exp3を+2し、桁落ちフラグが立っている時に指数exp3を−2する。
重複桁追い出し回路190のゼロマスク回路236が、仮数の上位側をマスク量桁分だけ0でマスクする。
正規化回路193へのバイパスセレクト信号が1であるならばバイパスされた仮数と指数とが正規化回路193に入力される。また正規化回路193へのバイパスセレクト信号が0であるならば重複桁追い出し回路190から出力された仮数と指数とが正規化回路193に入力される。
正規化回路193(図15と同様の構成であってよい)により、仮数の先行ゼロ計数値を求める。この時、先行ゼロ計数値が奇数である場合には、補正器により先行ゼロ計数値が−1される。正規化回路193が、指数から仮数の先行ゼロ計数値を減算し、その結果を指数Zとする。正規化回路193が、仮数の先行ゼロ計数値だけ仮数を左シフトし、結果を仮数Zとする。
符号、指数Z、仮数Zがエンコーダ194により外部形式に変換され、出力Zレジスタ195に出力される。
図27は8バイト幅Oracle−number形式10進浮動小数点数を演算するfi(x+y)演算器の構成例である。図27に示すfi(x+y)演算器は、入力Xレジスタ240、入力Yレジスタ241、デコーダ242及び243、指数仮数演算器244、セレクタ245及び246、左シフタ247、右シフタ248、絶対値加算器249、セレクタ250及び251、正規化回路252を含む。fi(x+y)演算器は更に、エンコーダ253及び出力Zレジスタ254を含む。なお図27に示すfi(x+y)演算器は、図9に示すfi(x+y)演算器から、桁溢れと桁落ちの計数に関わる回路部分(出力OVF・UDF計数レジスタ75とそれに関わるパス)が削除されたものに等しい。図27に示すfi(x+y)演算器の各部の構成及び動作は、図9に示すfi(x+y)演算器の対応する各部の構成及び動作に等しい。その動作について以下に説明する。
まず入力Xレジスタ240と入力Yレジスタ241より、データがデコーダ242及びデコーダ243にそれぞれ入力される。デコーダ242及び243により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力XYの符号、指数、仮数をそれぞれ、符号X、指数X(expX)、仮数X(TX)、符号Y、指数Y(expY)、仮数Y(TY)とする。
指数仮数演算器244に指数X、仮数X、指数Y、仮数Yが入力される。指数仮数演算器244は、指数X及び指数Yの大小比較を行い、指数の大きい側を指数exp1とし、対応する仮数が仮数T1となり、指数の小さい側を指数exp2とし、対応する仮数が仮数T2となるようにセレクト信号を生成する。
指数仮数演算器244は、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が16以上である場合、入力から正規化回路252へバイパスする演算を行う。指数仮数演算器244は、仮数T1とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
指数仮数演算器244は、(指数exp1−指数exp2)を、シフト量LSA1とする。指数仮数演算器244は、仮数T1の先行ゼロ計数を、シフト量LSA2とする。ただし値が奇数の時はその値を−1する。指数仮数演算器244が、(指数exp1−指数exp2−仮数T1の先行ゼロ計数値)を計算し、計算値をシフト量RSAとして出力する。ただし仮数T1の先行ゼロ計数値が奇数の時はその値を−1する。指数仮数演算器244は、LSA1とLSA2との大小比較を行う。この比較結果に応じて、LSA1のほうが小さい時はLSA2を、LSA1のほうが大きい時はLSA1を選択し、LSAとして出力する。指数仮数演算器244は、指数exp1から仮数T1の先行ゼロ値を減算した値を指数exp3とし、正規化回路252へ出力する。
指数仮数演算器244は、右シフタ248へシフト量RSAを、左シフタ247へシフト量LSAを出力する。左シフタ247が、入力されたシフト量にもとづき、入力された仮数を左シフトする。右シフタ248が、入力されたシフト量にもとづき、入力された仮数を右シフトする。左シフトされた仮数T1と右シフトされた仮数T2とが、絶対値加算器249に入力される。減算の場合は、減数の仮数を反転することで1の補数を生成して入力し、絶対値加算器249にキャリーとして1を入力する。絶対値加算器249は、入力を加算し、結果を正規化回路252に出力する。
正規化回路252へのバイパスセレクト信号が1であるならばバイパスされた仮数と指数とが正規化回路252に入力される。また正規化回路252へのバイパスセレクト信号が0であるならば加算結果と指数exp3が仮数と指数として正規化回路252に入力される。
正規化回路252は、指数から仮数の先行ゼロ計数値を減算し、結果を指数Zとする。正規化回路252は、仮数の先行ゼロ計数値だけ加算結果を左シフトし、結果を仮数Zとする。
符号、指数Z、仮数Zがエンコーダ253により外部形式に変換され、出力Zレジスタ254に出力される。
上述の図23及び図27には、get_zz演算器とfi(x+y)演算器とを別個に設けた場合の回路構成を示したが、回路構成を適宜工夫することにより、get_zz演算器とfi(x+y)演算器とで回路を共有化することが可能である。
図28は、get_zz演算とfi(x+y)演算との両方を実行可能な演算器の構成の一例を示す図である。図28に示す演算器は、入力Xレジスタ260、入力Yレジスタ261、デコーダ262及び263、指数仮数演算器264、セレクタ265及び266、左シフタ267A、右シフタ267B、絶対値加算器268、OVF・UDF予測回路269を含む。演算器は更に、重複桁追い出し回路270、セレクタ271及び272、正規化回路273、エンコーダ274、出力Zレジスタ275を含む。
図29は、図28に示す演算器における指数仮数演算器264の構成の一例を示す図である。指数仮数演算器264は、比較器281、LZC計数器282及び283、セレクタ284乃至286、絶対値減算器287乃至292、比較器293、セレクタ294乃至298を含む。図30は、図28に示す演算器における重複桁追い出し回路270の構成の一例を示す図である。重複桁追い出し回路270は、セレクタ301及び302、減算器303、加算器304及び305、ゼロマスク回路306、セレクタ307及び308を含む。図28に示す演算器は、図29の指数仮数演算器264及び重複桁追い出し回路270の構成が図23の演算器と異なるが、その他の対応する回路部分の構成及び動作は、図23の演算器と同様であってよい。
以下に、図28乃至30に示す演算器の動作について説明する。
入力Xレジスタ260と入力Yレジスタ261より、データがデコーダ262及びデコーダ263にそれぞれ入力される。デコーダ262及び263により、入力が符号部、指数部、仮数部に分割され、内部形式に変換される。この時の入力XYの符号、指数、仮数をそれぞれ、符号X、指数X(expX)、仮数X(TX)、符号Y、指数Y(expY)、仮数Y(TY)とする。
指数仮数演算器264に指数X、仮数X、指数Y、仮数Yが入力される。指数仮数演算器264の比較器281は、指数X及び指数Yの大小比較を行い、指数の大きい側を指数exp1とし、対応する仮数が仮数T1となり、指数の小さい側を指数exp2とし、対応する仮数が仮数T2となるようにセレクト信号を生成する。
指数仮数演算器264の絶対値減算器291及び比較器293は、(指数X−仮数Xの先行ゼロ計数値)−(指数Y−仮数Yの先行ゼロ計数値)の絶対値が16以上である場合、入力から正規化回路273へバイパスする演算を行う。指数仮数演算器264は、固定精度加減算の時は仮数T1とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、get_zz演算の時には仮数T2とそれに対応する符号と指数をバイパスするようにセレクト信号を生成し、バイパス対象の指数を出力する。
指数仮数演算器264の絶対値減算器287は、(指数exp1−指数exp2)を、シフト量LSA1とする。セレクタ286は、仮数T1の先行ゼロ計数を、シフト量LSA2とする。ただし値が奇数の時はその値を−1する。指数仮数演算器264の絶対値減算器290は、(指数exp1−指数exp2−仮数T1の先行ゼロ計数値)を計算し、その結果をシフト量RSAとする。ただし仮数T1の先行ゼロ計数値が奇数の時はその値を−1する。絶対値減算器290によりLSA1とLSA2との大小比較を行い、その結果に応じてセレクタ294が、LSA1のほうが小さい時はLSA2をLSAとし、LSA1のほうが大きい時はLSA2をLSAとする。
指数仮数演算器264の絶対値減算器289により、指数exp1から仮数T1の先行ゼロ計数値を減算した値を指数exp3とする。但し演算がget_zz演算である場合には、この減算結果から更に絶対値減算器292により14を減算した値を指数exp3とする。求めた指数exp3を、セレクタ295から重複桁追い出し回路270へ出力する。
演算が固定精度加減算である場合、指数仮数演算器264は、右シフタ267Bへシフト量RSAを、左シフタ267Aへシフト量LSAを出力する。get_zz演算である場合、指数仮数演算器264は、右シフタ267Bへ0を、左シフタ267Aへシフト量RSAを出力する。
左シフタ267Aが、入力されたシフト量に基づき、入力された仮数を左シフトする。右シフタ267Bが、入力されたシフト量に基づき、入力された仮数を右シフトする。
左シフトされた仮数T1と右シフトされた仮数T2の下位14桁(56bit)が絶対値加算器268に入力される。減算の場合は、減数の仮数を反転することで1の補数を生成して入力し、絶対値加算器268にキャリーとして1を入力する。絶対値加算器268は、入力の下位14桁(56ビット)を加算し、結果を重複桁追い出し回路270に出力する。またキャリーアウトが、絶対値加算器268からOVF・UDF予測回路269に供給される。
OVF・UDF予測回路269に仮数T1、シフト量RSA、加算結果のキャリーアウトが入力される。OVF・UDF予測回路269は、桁溢れ予測を行う。OVF・UDF予測回路269は、仮数T1の先頭桁から9(1001)が連続する個数を計数する。OVF・UDF予測回路269は、9の計数値がシフト量RSA以上であり、且つキャリーアウトが発生しており、且つ演算が加算である時に、桁溢れの発生を示すフラグを生成し、フラグを重複桁追い出し回路270に出力する。
またOVF・UDF予測回路189が、桁落ち予測を行う。まずOVF・UDF予測回路189は、仮数T1の先頭桁から0が連続する個数を計数し、但し初めて出現した1は0として計数を行うことにより、特殊先行ゼロ計数を行う。OVF・UDF予測回路189は、このゼロ計数値がシフト量RSA以上であり、且つキャリーアウトが発生しており、且つ演算が減算である時に桁落ちの発生を示すフラグを生成し、フラグを重複桁追い出し回路270に出力する。
重複桁追い出し回路270に、絶対値加算器268からの加算結果Tと、指数仮数演算器264からの指数exp3及びシフト量RSAと、OVF・UDF予測回路269からの桁溢れフラグOVF及び桁落ちフラグUDFとが入力される。重複桁追い出し回路270の減算器303は、(14(仮数部桁幅)−シフト量RSA)を計算し、その値をマスク量とする。但し、加算器304により、桁溢れフラグが立っている時はマスク量を−2し、桁落ちフラグが立っている時はマスク量を+2する。またマスク量が負の数となった時にはマスク量を0とする。また重複桁追い出し回路270の加算器305により、演算がget_zz演算であり、桁溢れフラグが立っている時に指数exp3を+2し、桁落ちフラグが立っている時に指数exp3を−2する。
重複桁追い出し回路270のゼロマスク回路306が、仮数の上位側をマスク量桁分だけ0でマスクする。
演算がfi(x+y)である時、重複桁追い出し回路270は、指数exp3と加算結果とをそのまま正規化回路273へ出力する。演算がget_zzである時、重複桁追い出し回路270は、加減算された指数とマスクされた仮数とを正規化回路273へ出力する。
正規化回路273へのバイパスセレクト信号が1であるならばバイパスされた仮数と指数とが正規化回路273に入力される。また正規化回路273へのバイパスセレクト信号が0であるならば重複桁追い出し回路270から出力された仮数と指数とが正規化回路273に入力される。
正規化回路273(図15と同様の構成であってよい)により、仮数の先行ゼロ計数値を求める。この時、先行ゼロ計数値が奇数である場合には、補正器により先行ゼロ計数値が−1される。正規化回路273が、指数から仮数の先行ゼロ計数値を減算し、その結果を指数Zとする。正規化回路273が、仮数の先行ゼロ計数値だけ仮数を左シフトし、結果を仮数Zとする。
符号、指数Z、仮数Zがエンコーダ274により外部形式に変換され、出力Zレジスタ275に出力される。
以上、本発明を実施例に基づいて説明したが、本発明は上記実施例に限定されるものではなく、特許請求の範囲に記載の範囲内で様々な変形が可能である。
170 プロセッサ
171 メモリ
172 2次キャッシュ部
173 1次キャッシュ部
173A 命令キャッシュ
173B データキャッシュ
174 制御部
175 演算部
176 レジスタ
177 演算制御部
178 演算器
179 演算回路

Claims (7)

  1. N進法(Nは2以上の整数)による第1の浮動小数点数と前記N進法による前記第1の浮動小数点数以下の第2の浮動小数点数を加減算した値である加減算値に対する補正値を算出する演算回路において、
    前記第1の浮動小数点数の符号部である第1の符号部と、前記第1の浮動小数点数の仮数部である第1の仮数部と、前記第1の浮動小数点数の指数部である第1の指数部を保持する第1の入力レジスタと、
    前記第2の浮動小数点数の符号部である第2の符号部と、前記第2の浮動小数点数の仮数部である第2の仮数部と、前記第2の浮動小数点数の指数部である第2の指数部を保持する第2の入力レジスタと、
    前記第1の指数部から前記第2の指数部を減算した値からさらに前記第1の仮数部の先行ゼロ計数値を減算した値をシフト量として生成するとともに、前記第1の指数部から前記第1の仮数部の先行ゼロ計数値を減算した値から第1の所定値を減算した第3の指数部を生成する演算部と、
    生成された前記シフト量に基づき、前記第1の仮数部をシフトしたシフト後仮数部を生成するシフト部と、
    生成された前記シフト後仮数部と前記第2の仮数部の一部を加算した加算値を生成するとともに、加算により生じるキャリーの有無を示すキャリー情報を生成する加算部と、
    前記シフト後仮数部と前記シフト量と前記キャリー情報を基に、桁溢れ又は桁落ちを示すフラグを生成する予測部と、
    前記第1の指数部から前記第1の仮数部の先行ゼロ計数値を減算した第1の値と前記第2の指数部から前記第2の仮数部の先行ゼロ計数値を減算した第2の値との差が第2の所定値以上の場合、前記第2の入力レジスタに保持される前記第2の符号部と前記第2の仮数部と前記第2の指数部とに基づいて、前記加減算値に対する正規化された補正値の仮数部である補正値仮数部と正規化された前記補正値の指数部である補正値指数部を生成するとともに、前記差が前記第2の所定値未満の場合、前記加算値と前記第3の指数部と前記シフト量と前記フラグとに基づいて、前記補正値仮数部と前記補正値指数部を生成する生成部
    を有することを特徴とする演算回路。
  2. 前記演算回路において、前記演算部は、前記第1の仮数部の先行ゼロ計数値が奇数の場合、前記第1の指数部から前記第2の指数部を減算した値からさらに前記第1の仮数部の先行ゼロ計数値を減算した値を1減分した値を前記シフト量として生成することを特徴とする請求項1記載の演算回路。
  3. 前記演算回路において、前記予測部は、前記シフト後仮数部と前記シフト量と前記キャリー情報を入力し、前記シフト後仮数部の先頭桁から前記N進法による計数した1桁の所定数が連続する個数が前記シフト量以上であり、かつ、前記キャリー情報が1であり、かつ、演算が加算の場合、前記桁溢れを示す前記フラグを生成するとともに、前記シフト後仮数部の先頭桁から計数した0が連続する個数が前記シフト量以上であり、かつ、前記キャリー情報が1であり、かつ、演算が減算の場合、前記桁落ちを示す前記フラグを生成することを特徴とする請求項1記載の演算回路。
  4. 前記演算回路において、前記予測部は、前記シフト後仮数部の先頭桁から0が連続する個数を計数する場合に、1が出現したときは1回だけ出現した前記1を0として計数することを特徴とする請求項3記載の演算回路。
  5. 前記演算回路において、前記生成部は、前記第1の仮数部の桁幅と前記シフト量と前記フラグに基づきマスク量を生成し、生成された前記マスク量に基づき前記第2の仮数部又は前記加算値の上位桁を0でマスクし、前記第2の仮数部がマスクされたマスク後仮数部又は前記加算値がマスクされたマスク後加算値の先行ゼロ計数値である第3の先行ゼロ計数値を生成し、前記第3の指数部から前記第3の先行ゼロ計数値を減算した値を前記補正値指数部として生成するとともに、前記マスク後加算値の先行ゼロ計数値に基づいて前記マスク後仮数部又は前記マスク後加算値をシフトした値を前記補正値仮数部として生成することを特徴とする請求項1記載の演算回路。
  6. N進法(Nは2以上の整数)による第1の浮動小数点数と前記第1の浮動小数点数以下である前記N進法による第2の浮動小数点数の加減算値に対する補正値を算出する演算回路と、前記補正値を算出する修正値演算命令をデコードする命令制御部とを有する演算処理装置において、
    前記演算回路は、
    前記第1の浮動小数点数の符号部である第1の符号部と、前記第1の浮動小数点数の仮数部である第1の仮数部と、前記第1の浮動小数点数の指数部である第1の指数部を保持する第1の入力レジスタと、
    前記第2の浮動小数点数の符号部である第2の符号部と、前記第2の浮動小数点数の仮数部である第2の仮数部と、前記第2の浮動小数点数の指数部である第2の指数部を保持する第2の入力レジスタと、
    前記第1の指数部から前記第2の指数部を減算した値からさらに前記第1の仮数部の先行ゼロ計数値を減算した値をシフト量として生成するとともに、前記第1の指数部から前記第1の仮数部の先行ゼロ計数値を減算した値から第1の所定値を減算した第3の指数部を生成する演算部と、
    生成された前記シフト量に基づき、前記第1の仮数部をシフトしたシフト後仮数部を生成するシフト部と、
    生成された前記シフト後仮数部と前記第2の仮数部の一部を加算した加算値を生成するとともに、加算により生じるキャリーの有無を示すキャリー情報を生成する加算部と、
    前記シフト後仮数部と前記シフト量と前記キャリー情報を基に、桁溢れ又は桁落ちを示すフラグを生成する予測部と、
    前記第1の指数部から前記第1の仮数部の先行ゼロ計数値を減算した第1の値と前記第2の指数部から前記第2の仮数部の先行ゼロ計数値を減算した第2の値との差が第2の所定値以上の場合、前記第2の入力レジスタに保持される前記第2の符号部と前記第2の仮数部と前記第2の指数部とに基づいて、前記加減算値に対する正規化された補正値の仮数部である補正値仮数部と正規化された前記補正値の指数部である補正値指数部を生成するとともに、前記差が前記第2の所定値未満の場合、前記加算値と前記第3の指数部と前記シフト量と前記フラグとに基づいて、前記補正値仮数部と前記補正値指数部を生成する生成部
    を有することを特徴とする演算処理装置。
  7. N進法(Nは2以上の整数)による第1の浮動小数点数の符号部である第1の符号部と、前記第1の浮動小数点数の仮数部である第1の仮数部と、前記第1の浮動小数点数の指数部である第1の指数部を保持する第1の入力レジスタと、前記N進法による第2の浮動小数点数の符号部である第2の符号部と、前記第2の浮動小数点数の仮数部である第2の仮数部と、前記第2の浮動小数点数の指数部である第2の指数部を保持する第2の入力レジスタを有し、前記第1の浮動小数点数と前記第1の浮動小数点数以下である前記第2の浮動小数点数の加減算値に対する補正値を算出する演算回路と、前記補正値を算出する補正値演算命令をデコードする命令制御部とを有する演算処理装置の制御方法において、
    前記命令制御部が、補正値演算命令をデコードし、
    前記演算回路が有する演算部が、前記第1の指数部から前記第2の指数部を減算した値からさらに前記第1の仮数部の先行ゼロ計数値を減算した値をシフト量として生成するとともに、前記第1の指数部から前記第1の仮数部の先行ゼロ計数値を減算した値から第1の所定値を減算した第3の指数部を生成し、
    前記演算回路が有するシフト部が、生成された前記シフト量に基づき、前記第1の仮数部をシフトしたシフト後仮数部を生成し、
    前記演算回路が有する加算部が、生成された前記シフト後仮数部と前記第2の仮数部の一部を加算した加算値を生成するとともに、加算により生じるキャリーの有無を示すキャリー情報を生成し、
    前記演算回路が有する予測部が、前記シフト後仮数部と前記シフト量と前記キャリー情報を基に、桁溢れ又は桁落ちを示すフラグを生成し、
    前記第1の指数部から前記第1の仮数部の先行ゼロ計数値を減算した第1の値と前記第2の指数部から前記第2の仮数部の先行ゼロ計数値を減算した第2の値との差が第2の所定値以上の場合、前記演算回路が有する生成部が、前記第2の入力レジスタに保持される前記第2の符号部と前記第2の仮数部と前記第2の指数部とに基づいて、前記加減算値に対する正規化された補正値の仮数部である補正値仮数部と正規化された前記補正値の指数部である補正値指数部を生成し、
    前記第1の絶対値が前記第2の所定値未満の場合、前記生成部が、前記加算値と前記第3の指数部と前記シフト量と前記フラグとに基づいて、前記補正値仮数部と前記補正値指数部を生成することを特徴とする演算処理装置の制御方法。
JP2012184594A 2012-08-23 2012-08-23 演算回路、演算処理装置、及び演算処理装置の制御方法 Active JP5966768B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2012184594A JP5966768B2 (ja) 2012-08-23 2012-08-23 演算回路、演算処理装置、及び演算処理装置の制御方法
US13/935,610 US20140059104A1 (en) 2012-08-23 2013-07-05 Arithmetic circuit for calculating correction value

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012184594A JP5966768B2 (ja) 2012-08-23 2012-08-23 演算回路、演算処理装置、及び演算処理装置の制御方法

Publications (2)

Publication Number Publication Date
JP2014041563A true JP2014041563A (ja) 2014-03-06
JP5966768B2 JP5966768B2 (ja) 2016-08-10

Family

ID=50148987

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012184594A Active JP5966768B2 (ja) 2012-08-23 2012-08-23 演算回路、演算処理装置、及び演算処理装置の制御方法

Country Status (2)

Country Link
US (1) US20140059104A1 (ja)
JP (1) JP5966768B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112667291A (zh) * 2021-01-08 2021-04-16 广东赛昉科技有限公司 Risc-v指令集移位指令实现电路
US12010231B2 (en) * 2021-06-23 2024-06-11 Pqsecure Technologies, Llc Computer processing architecture and method for supporting multiple public-key cryptosystems based on exponentiation

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01128129A (ja) * 1987-11-13 1989-05-19 Hitachi Ltd 浮動小数点加減算装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9792087B2 (en) * 2012-04-20 2017-10-17 Futurewei Technologies, Inc. System and method for a floating-point format for digital signal processors

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01128129A (ja) * 1987-11-13 1989-05-19 Hitachi Ltd 浮動小数点加減算装置

Also Published As

Publication number Publication date
US20140059104A1 (en) 2014-02-27
JP5966768B2 (ja) 2016-08-10

Similar Documents

Publication Publication Date Title
US8788561B2 (en) Arithmetic circuit, arithmetic processing apparatus and method of controlling arithmetic circuit
TWI638312B (zh) 暫時分路融合乘積-累加運算
US8601047B2 (en) Decimal floating-point adder with leading zero anticipation
US8903881B2 (en) Arithmetic circuit, arithmetic processing apparatus and method of controlling arithmetic circuit
US8166092B2 (en) Arithmetic device for performing division or square root operation of floating point number and arithmetic method therefor
EP1857925A2 (en) Method and apparatus for decimal number multiplication using hardware for binary number operations
CN104520807A (zh) 用于具有指数按比例缩放的浮点融合乘法加法的微架构
CN108351776B (zh) 数据处理方法和装置
CN108351762B (zh) 使用重叠位的数值的冗余表示的方法和装置
US10416962B2 (en) Decimal and binary floating point arithmetic calculations
US7069288B2 (en) Floating point system with improved support of interval arithmetic
KR100465371B1 (ko) 덧셈 및 반올림 연산을 동시에 수행하는 부동 소수점alu 연산 장치
JP5966768B2 (ja) 演算回路、演算処理装置、及び演算処理装置の制御方法
JPH10289096A (ja) 論理回路及び浮動小数点演算装置
US20060129625A1 (en) Low latency integer divider and integration with floating point divider and method
JP2012221188A (ja) 演算回路、演算処理装置、及び演算回路の制御方法
KR100331846B1 (ko) 실수 연산기
US20140059106A1 (en) Arithmetic circuit for performing division based on restoring division
US8219604B2 (en) System and method for providing a double adder for decimal floating point operations
JPH0553765A (ja) 先行1検出回路および浮動小数点加減算装置
US6044391A (en) Method of generating the sticky-bit from the input operands
US5944773A (en) Floating-point multiplier circuit for generating the sticky-bit from the input operands
JP2752564B2 (ja) 先行1予測装置及び浮動小数点加減算装置
GB2615774A (en) Method and system for calculating dot products
Perez Hardware Addition Over Finite Fields Based On Booth–Karatsuba Algorithm

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150512

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160530

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: 20160607

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160620

R150 Certificate of patent or registration of utility model

Ref document number: 5966768

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150