(57)【要約】【課題】ＳＩＭＤ型計算機やベクトル型計算機に適用可能な、特定の初期値を検出して別処理を行うことを不要とする、ソフトウェアシーケンスによる高性能な除算を実行する。【解決手段】符号および仮数と、指数とを分解し、２者を別々に計算する除算用の計算機において、符号および仮数を取り出す演算器と、２つの数の指数の差を取り出す演算器を設ける。【選択図】図２
2010049614.tif 000002
【特許請求の範囲】
【請求項１】
符号部、指数部、および仮数部からなる、主従２つの浮動小数点データを入力とし、１つの浮動小数点データを出力とする演算器であって、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より大きいかまたは等しい場合は、主たる入力の符号と仮数の値を保存し指数を０とした正規化数を出力し、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より小さい場合は、主たる入力の符号と仮数の値を保存し指数を１とした正規化数を出力する演算器を有することを特徴とする計算機。
【請求項２】
符号部、指数部、および仮数部からなる浮動小数点データを扱う演算器を有する計算機であって
主従２つの浮動小数点データを入力とし、１つの浮動小数点データを出力とする演算器であって、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より大きいかまたは等しい場合は、主たる入力の符号と仮数の値を保存し指数を０とした正規化数を出力し、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より小さい場合は、主たる入力の符号と仮数の値を保存し指数を１とした正規化数を出力する第１の演算器と、
主従２つの浮動小数点データを入力とし、１つの浮動小数点データを出力とする演算器であって、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より大きいかまたは等しい場合は、主たる入力を正規化した数の仮数を1としたものを、従たる入力を正規化した数の仮数を1としたもので除した結果を出力し、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より小さい場合は、主たる入力を正規化した数の仮数を1としたものを、従たる入力を正規化した数の仮数を1としたもので除した結果をさらに指数の底で除した結果を出力する第２の演算器を有することを特徴とする計算機。
【請求項３】
１つの浮動小数点データを入力とし、１つの浮動小数点データを出力とする演算器であって、入力を正規化した数の指数を０としたものの逆数の近似値を出力する演算器を更に有することを特徴とする請求項１又は２の計算機。
【請求項４】
q = a/bを求める除算のアルゴリズムを実行する計算機において、
被除数の仮数(w/指数補正) "fX"を求める命令を実行する第１の演算器と、商の指数 "fdivE"を求める命令を実行する第２の演算器と、を有し、
（ｉ）被除数の仮数(w/指数補正) "fX"
fX(a,b) = (-1)^S(a) * 1.F(a)       if F(a) >= F(b)
(-1)^S(a) * 1.F(a) * 2   if F(a) < F(b)
（ii）商の指数 "fdivE"
fdivE(a,b) = 2^{E(a)-E(b)}         if F(a) >= F(b)
2^{E(a)-E(b)-1}       if F(a) < F(b)
除数bの符号および仮数を取り出したものであるmbと、被除数aの符号および仮数を取り出したものに、必要に応じて２倍の補正を加えたものであるmaを求め、被除数aの仮数が除数bの仮数よりも大きいか等しい場合は補正をせず、被除数aの仮数が除数bの仮数よりも小さい場合は所定の補正をすることを特徴とする計算機。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、浮動小数点データの数値演算を行う高性能計算機に関し、特に反復法によって除算を行う計算機に関する。
【背景技術】
【０００２】
計算機で実行する除算のアルゴリズムとして、１回の繰り返しごとに固定ビット数ずつ結果が得られるＳＲＴ法や、二次の収束性をもつ反復法（Ｎｅｗｔｏｎ−Ｒａｐｈｓｏｎ法、Ｇｏｌｄｓｃｈｍｉｔ法など）を用いた繰り返しによるものが知られている。
【０００３】
二次の収束性をもつ反復法であれば、一回の反復により仮数部の有効ビット数が２倍になるため、除数の逆数近似値をテーブルなどによって適切な有効ビット数の精度で与えることができれば、一定の回数の反復により、所望の精度で結果を得ることができる。
【０００４】
計算機で除算を実現する手段としては、ハードウェアで除算器を構成する場合と、ソフトウェアによる除算のシーケンスを実行する場合がある。通常、計算機における除算はその頻度が小さいにも拘わらず、高性能な除算器はハードウェア規模が大きくなる。
【０００５】
そのため、ソフトウェアで除算を実現するものとして、例えば、米国インテル社のＩｔａｎｉｕｍプロセッサ（インテル社商標）は、命令セットアーキテクチャに浮動小数点除算の命令を備えず、除数の逆数近似値を初期値とし、乗加算器を使って、二次の収束性をもつ反復法に基づくソフトウェアシーケンスにより、除算を実行している。
【０００６】
特に多数の除算を実行する場合には、パイプライン化され、レジスタ数の多いプロセッサにおいては、ソフトウェアパイプライニングが可能となる。このため、ソフトウェアシーケンスによる除算は、ハードウェアで除算器を構成する場合に比べて、スループットが向上する。
【０００７】
しかし、ソフトウェアシーケンスによる除算においては、被除数と除数によっては、商自体が計算機の扱うことができる浮動小数点データの範囲内であっても、反復計算の初期値である逆数近似値、または反復計算の途中でオーバーフロー、アンダーフロー、または精度落ちを引き起こすことがある。
【０００８】
例えば、非特許文献１（ＩＥＥＥ７５４−１９８５）で定める浮動小数点数のフォーマットでは、正規化数よりも小さい値（denormalized number）が定義されているが、この値の逆数近似値は浮動小数点数のフォーマットで表現できる値の範囲を越える場合がある。
【０００９】
この問題に対しては、特定の初期値を検出して別処理を行う等の解決策が考えられる。例えば、上記Ｉｔａｎｉｕｍプロセッサでは、逆数近似値を求める命令において、被除数と除数の組が、反復計算が失敗するような範囲であることを検出し、浮動小数点例外を発生させる。浮動小数点例外が発生すると、通常のソフトウェアシーケンスによる除算をキャンセルし、システムソフトウェアが正しい商を計算する。
【００１０】
【非特許文献１】IEEE，“IEEE Standard for binary Floating−Point Arithmetic”，ANSI／IEEE Standard754−1985.
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、上記のような処理をＳＩＭＤ（Single Instruction Multiple Data）型計算機やベクトル計算機に適用するのは困難である。このため、ＳＩＭＤ型計算機やベクトル型計算機において高性能な除算を実現する場合、一般的にユーザプログラムに制約を設けている。
【００１２】
本発明の目的は、ＳＩＭＤ型計算機やベクトル型計算機に適用可能な、特定の初期値を検出して別処理を行うことを不要とする、ソフトウェアシーケンスによる高性能な除算を実行する計算機を提供することにある。
【課題を解決するための手段】
【００１３】
本発明は、符号および仮数と、指数とを分解し、２者を別々に計算する。被除数と除数の双方を、指数が０付近の正規化数と、符号が正で正規化した時の仮数の値が１である２つの数の積に分解する。その結果、指数が０付近の正規化数であれば、反復計算の初期値である逆数近似値、または反復計算の途中でオーバーフロー、アンダーフロー、または精度落ちを引き起こさない。反復計算の後で、指数を調整することで、正しい商が得られる。
【００１４】
上記を実現するために、符号および仮数を取り出す第１の演算器と、２つの数の指数の差を取り出す第２の演算器を用いて除算を実現する。また、被除数の仮数が除数の仮数よりも小さい場合には指数を補正する手段を有する。
【００１５】
好ましい例によれば、本発明は、符号部、指数部、および仮数部からなる、主従２つの浮動小数点データを入力とし、１つの浮動小数点データを出力とする演算器であって、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より大きいかまたは等しい場合は、主たる入力の符号と仮数の値を保存し指数を０とした正規化数を出力し、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より小さい場合は、主たる入力の符号と仮数の値を保存し指数を１とした正規化数を出力する演算器を有することを特徴とする計算機として構成される。
【００１６】
また好ましくは、本発明は、符号部、指数部、および仮数部からなる浮動小数点データを扱う演算器を有する計算機であって
主従２つの浮動小数点データを入力とし、１つの浮動小数点データを出力とする演算器であって、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より大きいかまたは等しい場合は、主たる入力の符号と仮数の値を保存し指数を０とした正規化数を出力し、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より小さい場合は、主たる入力の符号と仮数の値を保存し指数を１とした正規化数を出力する第１の演算器と、
主従２つの浮動小数点データを入力とし、１つの浮動小数点データを出力とする演算器であって、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より大きいかまたは等しい場合は、主たる入力を正規化した数の仮数を1としたものを、従たる入力を正規化した数の仮数を1としたもので除した結果を出力し、主たる入力を正規化した数の仮数が従たる入力を正規化した数の仮数より小さい場合は、主たる入力を正規化した数の仮数を1としたものを、従たる入力を正規化した数の仮数を1としたもので除した結果をさらに指数の底で除した結果を出力する第２の演算器を有することを特徴とする計算機として構成される。
【００１７】
また、好ましくは、１つの浮動小数点データを入力とし、１つの浮動小数点データを出力とする演算器であって、入力を正規化した数の指数を０としたものの逆数の近似値を出力する演算器を更に有する上記計算機として構成される。
【発明の効果】
【００１８】
本発明によれば、ソフトウェアによる除算において、反復計算の初期値である逆数近似値、または反復計算の途中でオーバーフロー、アンダーフロー、または精度落ちを引き起こさないシーケンスを組むことができる。これにより、ＳＩＭＤ型計算機やベクトル計算機において、ユーザプログラムに制約を設けず、高性能な除算を実現することができる。
【発明を実施するための最良の形態】
【００１９】
[実施例１]
以下、図面を参照して本発明の実施形態について詳細に説明する。
図１及び図２は、一実施例における除算の処理フローを示す。図１は、被除数の仮数が除数の仮数よりも大きいか等しい場合の除算の処理フロー、図２は、被除数の仮数が除数の仮数よりも小さい場合の除算のフローである。両図とも、数値表現については、被除数および除数の両方が正規化数の場合について例示するが、非正規化数であっても処理フローは実質的に同じである。
【００２０】
ＩＥＥＥ７５４−１９８５の表現形式による浮動小数点数の正規化数は、
a = (-1)^S(a) * 1.F(a) * 2^{E(a)-bias}
のようになる。ここで、aは浮動小数点数、S(a)はaの符号、F(a)はaの仮数部の節約表現、{E(a)-bias}はaの指数である。倍精度浮動小数点数の場合は、S(a)は１ビット、F(a)は５２ビット、E(a)は１１ビットの２進数であり、biasは１０２３である。
【００２１】
ここで、本発明により下記の２つの新規な命令、即ち、被除数の仮数(w/指数補正) "fX"を求める命令と、商の指数 "fdivE"を求める命令を導入する。
（ｉ）被除数の仮数(w/指数補正) "fX"
fX(a,b) = (-1)^S(a) * 1.F(a)       if F(a) >= F(b)
(-1)^S(a) * 1.F(a) * 2   if F(a) < F(b)
（ii）商の指数 "fdivE"
fdivE(a,b) = 2^{E(a)-E(b)}         if F(a) >= F(b)
2^{E(a)-E(b)-1}       if F(a) < F(b)
これらの新規命令を実行する演算器は、２入力であることと、仮数を比較することから、比較を実行する演算器（多くの場合、これは加減算を実行する演算器と共通である）と共通点が多い。また、商の指数fdivEを実行する演算器は、指数の差をとることから、乗算を実行する演算器と共通点がある。
【００２２】
以上を考慮して、これら２つの命令を実行する演算器は、好ましくは図３に示す様に、独立した演算器３５，３６を有する構成とするのがよい。また他の例として、図４に示す様に、乗加算を実行する演算器４３と共用することで、命令追加によるハードウェアの増加を極小に抑えることができる。
【００２３】
図３及び図４は本実施例による演算器の構成例を示す。
図３において、３０はＳＩＭＤ又はベクトル計算機の演算器、３１は種々の演算命令がセットされるレジスタ、３３は符号部、指数部、および仮数部からなる浮動小数点データを扱う乗加算器、３４は例えば論理演算やシフト演算等の乗加算以外の演算器、３５は被除数の仮数fXを求める演算器、３６は商の指数fdivEを求める演算器である。なお、図には１つのレジスタ３１を示しているが、多数のレジスタを備えてもよい。
【００２４】
他の例として、図４において、４０はＳＩＭＤ又はベクトル計算機の演算器、４１は種々の演算命令がセットされるレジスタ、４３は符号部、指数部、および仮数部からなる浮動小数点データを扱う乗加算器、４４は例えば論理演算やシフト演算等の乗加算以外の演算器である。図３の例との違いは、乗加算記４３において一般的な乗加算の演算の他に、本実施例に係る被除数の仮数fXの演算、及び商の指数fdivEの演算を行うことである。
【００２５】
次に、図１及び図２を参照しながら、本実施例における除算のアルゴリズムについて説明する。
q = a/bを求める除算のアルゴリズムは以下の様になる。
(１) mb = fX(b,b)        /* bの仮数取り出し */
(２) ma = fX(a,b)        /* aの仮数(w/指数補正)取り出し */
(３) my0 = 1/mb          /* bの仮数の逆数近似値を求める */
(４) e = fdivE(a,b)      /* a/bの指数取り出し */
(５) /* 中略: 反復法によりmyを必要な精度で求める */
(６) mq0 = ma * my       /* a/bの仮数 */
(７) mr = ma - mb * mq   /* 丸め処理 */
(８) mq = mq + mr * my   /* 丸め処理 */
(９) q = mq * e          /* 指数の掛け戻し */
ステップ（１）とステップ（２）で、図１および図２における除数b（２００）の符号および仮数を取り出したものであるmb（２１０）と、被除数a（１００）の符号および仮数を取り出したものに、必要に応じて２倍の補正を加えたものであるma（１１０）を求める。被除数a（１００）の仮数が除数b（２００）の仮数よりも大きいか等しい場合は補正が不要であり、この処理を図１のフローに示す。被除数a（１００）の仮数が除数b（２００）の仮数よりも小さい場合は補正が必要であり、この処理を図２のフローに示す。
この補正により、ma（１１０）の絶対値 > mb（２１０）の絶対値 となる。
【００２６】
次にステップ（３）で、mb（２００）の逆数近似値であるmy0（３００）を求める。その後、ステップ（４）で、商q（６００）の指数を取り出したものであるe（４００）を求める。
このとき、上記の補正に対応して、被除数a（１００）の仮数が除数b（２００）の仮数よりも大きいか等しい場合は、e（４００）の指数は被除数a（１００）の指数と除数b（２００）の指数の差となり、図１のフローに示す。
被除数a（１００）の仮数が除数b（２００）の仮数よりも小さい場合はe（４００）の指数は被除数a（１００）の指数と除数b（２００）の指数の差からさらに「１」を減じたものとなり、図２のフローに示す。
【００２７】
次にステップ（５）で、my0（３００）から反復法で、mb（２１０）の逆数であるmy（３１０）を求める。そして、ステップ（６）で、ma（１１０）と、my（３１０）の積であるmq0（５００）を求める。ステップ（７）及び（８）で、mq0（５００）から丸め処理により、商q（６００）の符号および仮数を取り出したものであるmq（５１０）を求める。最終的にステップ（９）で、指数と符号および仮数を掛け合わせることで商q（６００）を求める。
【００２８】
ここで、逆数近似値を求めるのは、ソフトウェアによりテーブルを検索し、または上記Ｉｔａｎｉｕｍプロセッサのような、ハードウェアによる逆数近似値を求める命令を用いるなど、いずれ手段を用いてもよい。
また、図１および図２のフローに示すように、（３）とステップ（５）には依存関係があるが、これらとステップ（２）およびステップ（４）には依存関係が無い。依存関係のないステップに関しては、性能を考慮して適宜入れ替え可能であることはいうまでもない。
【００２９】
また、ステップ（４）の結果は最終ステップまで使われないため、他と比較して、高い性能が要求されないステップとなり得る。このため、fdivEの指数の取り出しは、演算器を設けず、ＳＩＭＤまたはベクトルのパイプラインを妨げない通常命令の組み合わせで実現することも可能である。
【００３０】
本発明の実施例によれば、除算の前処理として、被除数の仮数(w/指数補正) "fX"を求める演算（ステップ（１）及び（２））、及び商の指数 "fdivE"を求める演算（ステップ（４））を行なうことで（図１のステップ２１０，１１０，４００）、除算の例外処理を発生させないようにした。これにより、プログラム上の制約を除き、高性能な除算を実行することを実現することが可能である。
【００３１】
[実施例２]
実施例１の２つの新規命令に加え、さらに以下の新規命令を導入する。
(iii) 仮数の逆数近似値 "freM" 
freM(b) = (-1)^S(b) * 1/1.F(b)
この命令は、仮数の逆数近似値を求めるものであり、実際の処理はハードウェアテーブル引きである。前出のＩｔａｎｉｕｍプロセッサの逆数近似値を求める命令と似ているが、指数の扱いが異なり、より簡単になっている。
q = a/bを求める除算のアルゴリズムは以下の様になる。
(１) My0 = freM(b)       /* bの仮数で逆数テーブル引き */
(２) ma = fX(a,b)        /* aの仮数(w/指数補正)取り出し */
(３) mb = fX(b,b)        /* bの仮数取り出し */
(４) e = fdivE(a,b)      /* a/bの指数取り出し */
(５) /* 中略: 反復法によりmyを必要な精度で求める */
(６) mq0 = ma * my       /* a/bの仮数 */
(７) mr = ma - mb * mq   /* 丸め処理 */
(８) mq = mq + mr * my   /* 丸め処理 */
(９) q = mq * e          /* 指数の掛け戻し */
実施例１では、bの仮数を求める処理と、その逆数を求める処理に依存関係があるため、逐次的にしか処理できないが、実施例２ではこの依存がなくなる。このため、パイプライン化されたプロセッサにおいて処理シーケンス全体を高速化することができる。
【図面の簡単な説明】
【００３２】
【図１】一実施例における除算の処理フローを示す図。
【図２】一実施例における除算の処理フローを示す図。
【図３】一実施例による演算器の構成例を示す図。
【図４】他の実施例による演算器の構成例を示す図。
【符号の説明】
【００３３】
１００：被除数a
１１０：被除数aの仮数を取り出したもの。但し、除数の仮数との大小関係による補正を含む。
２００：除数b
２１０：除数bの仮数を取り出したもの。
３００：除数bの仮数の逆数近似値
３１０：除数bの仮数の逆数を反復法により必要な精度まで求めたもの。
４００：a/bの指数を取り出したもの。
５００：a/bの仮数を取り出したもの。但し、丸め誤差を含む。
５１０：a/bの仮数を取り出したもの。丸め誤差修正後。
６００：a/bの結果。
【図１】
2010049614.tif 000003
【図２】
2010049614.tif 000004
【図３】
2010049614.tif 000005
【図４】
2010049614.tif 000006