(57)【要約】【課題】メインフレームからオープンサーバへ単純に移行する場合、浮動小数点演算を使用すると、Ｍ形式浮動小数点とＩＥＥＥ形式浮動小数点ではフォーマット形式の違いにより、演算誤差が発生する場合がある。演算誤差を発生させないように、エミュレーションによるＭ形式互換の浮動小数点演算処理を行う方法が考えられるが、すべての浮動小数点演算をエミュレーションで処理すると、演算処理時間が遅くなる。【解決手段】ＩＥＥＥ形式の浮動小数点演算装置をもつコンピュータシステムにおいて、Ｍ形式の浮動小数点フォーマットの浮動小数点演算命令を実行する前に、演算結果に誤差が発生する可能性がある演算命令を演算データ値から判定し、演算誤差が発生する可能性がある演算命令を演算ライブラリ内のエミュレーション処理部にて演算処理を実行し、演算誤差が発生する可能性のない演算命令をハードウェアの浮動小数点演算装置にて実行する。【選択図】  図３
2015045968.tif 000002
【特許請求の範囲】
【請求項１】
浮動小数点演算装置を持つコンピュータシステムにおいて、前記浮動小数点演算装置が実行する浮動小数点フォーマット形式と異なるフォーマット形式の浮動小数点演算命令を実行する前に、演算結果に誤差が発生する可能性がある演算命令を演算データから判定し、演算誤差が発生する可能性がある演算命令をエミュレーションにて処理し、演算誤差が発生する可能性のない演算命令を前記浮動小数点演算装置にて実行する浮動小数点演算命令処理方法。
【請求項２】
ＩＥＥＥ形式の浮動小数点演算装置を持つコンピュータシステムにおいて、Ｍ形式の浮動小数点フォーマットの浮動小数点演算命令を実行する前に、演算結果に誤差が発生する可能性がある演算命令を演算データ値から判定し、演算誤差が発生する可能性がある演算命令を演算ライブラリ内のエミュレーション処理部にて演算処理を実行し、演算誤差が発生する可能性のない演算命令を前記浮動小数点演算装置にて実行する浮動小数点演算処理方法。
【請求項３】
べき乗命令中の加算処理において、処理対象の１０進浮動小数点形式の数値データを２進浮動小数点形式の中間値データに変換した際、該中間値データの仮数部の有効ビット数がＩＥＥＥ形式の仮数部ビット長を超えている場合に、演算ライブラリ内のエミュレーション処理部にて加算処理を実行する請求項２記載の浮動小数点演算処理方法。
【請求項４】
前記中間値データに変換した際、該中間値データの仮数部の有効ビット数がＩＥＥＥ形式の仮数部ビット長以下である場合に、加算結果の中間値データの仮数部の有効ビット数がＩＥＥＥ形式の仮数部ビット長を超えるかを判定し、超えている場合に、演算ライブラリ内のエミュレーション処理部にて加算処理を実行する請求項３記載の浮動小数点演算処理方法。
【請求項５】
前記判定の結果、加算結果の中間データの仮数部の有効ビット数がＩＥＥＥ形式の仮数部ビット長以下である場合に、前記浮動小数点演算装置にて加算処理を実行する請求項４記載の浮動小数点演算処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、異なる浮動小数点演算を実行する時の効率を向上させる演算処理方法に関する。
【背景技術】
【０００２】
近年、メインフレームからオープンサーバへの移行が進んでいる。しかし、メインフレームのＣＯＢＯＬで生成したプログラムソースをリコンパイルしてオープンサーバ上で実行すると、単純な四則演算のみの場合には１０進浮動小数点のまま演算を行うため同一の結果が得られるが、べき乗演算等の複合演算では２進浮動小数点に変換後に浮動小数点演算命令を使用して計算を行うため、浮動小数点レジスタの表現精度や内部演算処理の差に起因した演算誤差により、演算結果に誤差が発生する場合がある。特に金融系のアプリケーションにおいては誤差が致命的な問題となってしまい、移行への妨げとなっていた。このためオープンサーバ上でソフトウェアによりメインフレームシステムのエミュレーションを行う方法があり、プログラムソースを変更せずにプラットフォームの移行が可能となっている。しかし、上記方法を行う場合はオペレーティングシステムを含めたシステム全体のエミュレーションを行うため、実行性能が劣化するという問題が存在する。このためシステム全体のエミュレーションを行うよりも効率的な方法として浮動小数点演算が同一の結果となるようにエミュレーションを行う方法が考えられる。特許文献１は、異種の浮動小数点演算命令の同時サポート方法である。これは浮動小数点演算装置を持つ計算機にて、この計算機にない他の浮動小数点演算装置に対する浮動小数点演算命令が実行された時に、その命令をオペレーティングシステムにより検出し、検出した命令を計算機がサポートしている浮動小数点演算装置に対応した浮動小数点演算命令に置き換えて再度の実行を行うことにより、この計算機にない他の浮動小数点演算装置に対する浮動小数点演算命令を含むロードモジュールを実行することを特徴とするものである。上記方法は浮動小数点演算命令のみを置き換えることが可能なため、システム全体のエミュレーションよりも効率的であるが、浮動小数点演算処理を含むロードモジュールを実行するため、計算機の持つ浮動小数点演算装置の実行速度と比較して実行速度が遅くなってしまう。このため精度誤差を保証しながら性能の劣化を最小にする方法が求められていた。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平5-27963
【発明の概要】
【発明が解決しようとする課題】
【０００４】
メインフレームからオープンサーバへ単純に移行する場合、オープンサーバはＩＥＥＥ形式の浮動小数点演算装置のみを持ち、メインフレームで用いられるＭ形式の浮動小数点演算装置を持たない。オープンサーバにてＩＥＥＥ形式の浮動小数点演算装置を用いて浮動小数点演算を行うと、Ｍ形式の浮動小数点演算と演算結果に誤差が発生する可能性がある。演算誤差の要素として、浮動小数点フォーマット形式の違いに起因するものがある。
【０００５】
図４は、倍精度浮動小数点数のフォーマット形式を表している。４１は、メインフレームの浮動小数点レジスタで採用しているＭ形式浮動小数点フォーマットである。４２は、オープンサーバの浮動小数点レジスタで採用しているＩＥＥＥ形式浮動小数点フォーマットである。Ｍ形式は、符号部１ビット、指数部７ビット、仮数部５６ビットで形成されている。一方、ＩＥＥＥ形式は、符号部１ビット、指数部１１ビット、仮数部５２ビットで形成されている。符号部とは数値の正負を表し、“０”なら正の数を表し、“１”なら負の数を表す。指数部とは浮動小数点数の中の累乗の部分を表す。仮数部とは指数部を表記する際の有効数字となる部分である。たとえば、Ａ×１０Bの場合、Ａが仮数部となる。
【０００６】
２つのフォーマットを比べると、メインフレームの仮数部のビット長がオープンサーバの仮数部のビット長より４ビット多い。１０進浮動小数点形式で格納された数値データを、浮動小数点演算に必要なフォーマット変換をする際や、浮動小数点演算中に桁あふれが発生した場合に、Ｍ形式とＩＥＥＥ形式では丸め処理が異なるため演算誤差が発生する。このため、演算誤差を発生させないように、すべての浮動小数点演算処理をＭ形式互換浮動小数点演算にて行う方法が考えられるが、Ｍ形式互換浮動小数点演算をソフトウェアによるエミュレーション方式で実現すると、演算処理時間が浮動小数点演算処理装置の処理時間より遅くなる。本発明は、上記課題を解決することを目的とする。
【課題を解決するための手段】
【０００７】
上記課題を解決する為、本発明では、数値演算処理において浮動小数点演算を行う前に演算データ値を分析することにより誤差が発生する可能性があるかを予測し、誤差が発生する可能性がある場合は、浮動小数点演算をソフトウェアによるＭ形式互換浮動小数点演算処理（エミュレーション）を行う。演算結果に誤差が発生しない浮動小数点演算については、ハードウェアのもつ浮動小数点演算装置を用いて浮動小数点演算を行う。誤差が発生する可能性がある浮動小数点演算のみをエミュレーションすることにより演算性能劣化を最小限にする。
【発明の効果】
【０００８】
本発明により、ＩＥＥＥ形式の浮動小数点演算装置をもつコンピュータシステムにおいて、メインフレーム互換の浮動小数点演算結果が必要な場合、浮動小数点演算を実行する時、演算結果にＭ形式浮動小数点演算と誤差が発生する可能性のある演算命令のみをソフトウェアによるＭ形式互換浮動小数点演算処理（エミュレーション）を行い、それ以外の演算命令に対してはハードウェアの浮動小数点演算装置による浮動小数点演算を行うことにより、浮動小数点演算誤差を防止することが可能となる。また、演算性能劣化を最小限にし、高速な演算処理が可能となる。
【図面の簡単な説明】
【０００９】
【図１】コンピュータシステムの構成を示すブロック図である。
【図２】演算プログラムの処理を説明するためのフローチャートである。
【図３】べき乗命令処理中の加算処理を説明するためのフローチャートである。
【図４】浮動小数点フォーマットを説明するための図である。
【図５】１０進２進浮動小数点の変換を説明するための例である。
【図６】ＩＥＥＥ形式浮動小数点の加算を説明するための例である。
【図７】ＩＥＥＥ形式浮動小数点への変換の説明をするための例である。
【図８】有効ビット判定部においてマスク値とのアンド演算を説明するための例である。
【図９】演算結果有効ビット判定部のマスク値生成の説明をするための例である。
【図１０】主記憶装置中の変数を説明するための図である。
【発明を実施するための形態】
【００１０】
以下、本発明の実施形態について図面を参照して説明する。
【００１１】
図１は、本発明の実施例であるコンピュータシステムの構成を示すブロック図である。図１において、１は中央処理装置（ＣＰＵ）、２は主記憶装置、３はＩＥＥＥ形式浮動小数点演算処理装置（ＦＰＵ）、４は磁気ディスク装置で構成する。また４の磁気ディスク装置は、１２のオペレーティングシステム（ＯＳ）、１３の実行対象となる演算プログラム（ユーザプログラム）、１４の数値演算ライブラリを格納している。１４の数値演算ライブラリは、各種のユーザプログラムから共通で呼び出し可能な１６のべき乗命令処理等の複合演算処理群と、べき乗命令処理中に１５のＭ形式の浮動小数点演算を処理するプログラムを含む。
【００１２】
次に、図１に示すコンピュータシステムにおける、異なる浮動小数点演算のサポート方式の形態について説明する。１２のオペレーティングシステム（ＯＳ）が、１３の演算プログラム（ユーザプログラム）の実行を指示すると、１の中央処理装置（ＣＰＵ）は４の磁気ディスク装置から１３の演算プログラム（ユーザプログラム）と１４の数値演算ライブラリを２の主記憶装置に格納し、１の中央処理装置、２の主記憶装置および３のＩＥＥＥ形式の浮動小数点演算装置を利用して１３の演算プログラム（ユーザプログラム）の処理を行う。１３の演算プログラム（ユーザプログラム）の実行中にべき乗命令が発生した場合には、１６のべき乗命令処理が呼び出される。１６のべき乗命令処理において、演算結果に誤差の可能性がないと判定された場合、３のＩＥＥＥ形式浮動小数点演算装置（ＦＰＵ）にて演算処理を実行し、演算結果に誤差の可能性があると判定された場合、１５のＭ形式の浮動小数点演算（エミュレーション）処理を実行する。
【００１３】
図２は、１３の演算プログラム（ユーザプログラム）の処理において関連する部分の処理を説明するためのフローチャートである。２１はべき乗命令判定部である。１３の演算プログラム（ユーザプログラム）中の複合演算命令が実行された時、複合演算命令がべき乗命令か、べき乗命令以外かを判定する。判定の結果、べき乗命令の場合は、演算結果に誤差が発生する可能性があるため、２２のべき乗命令処理を実行する。また、べき乗命令以外の場合は、演算結果に誤差が発生しないため２３の通常処理部を実行する。べき乗命令処理中には数値演算命令以外の処理も含まれているが、浮動小数点演算である加算の処理について説明する。
【００１４】
図３は、２２のべき乗命令処理の内、図１０に示す主記憶装置中の変数である被加算数１０１と加算数１０２に格納された値を加算し結果を加算結果１０３に格納する加算処理の部分を説明したフローチャートである。
【００１５】
図１０に加算処理を行う際に主記憶装置に格納される変数を表す。１０１が被加算数、１０２が加算数、１０３が加算結果である。１０４〜１０６が中間値被加算数の符号部、指数部および仮数部、１０７〜１０９が中間値加算数の符号部、指数部および仮数部である。１１０がマスク値である。１１１がＩＥＥＥ形式浮動小数点被加算数、１１２がＩＥＥＥ形式浮動小数点加算数である。加算の処理を実行する際、あらかじめ主記憶装置中に１０進浮動小数点の形式で被加算数１０１と加算数１０２が格納されており、この被加算数と加算数を用いて以降の加算の処理を行う。
【００１６】
３１は１０進２進浮動小数点数変換部である。１０進浮動小数点形式の被加算数１０１の値を中間値被加算数１０４〜１０６に格納し、１０進浮動小数点形式の加算数１０２の値を中間値被加算数１０７〜１０９に格納する。中間値に変換するのは、直接２進浮動小数点のＩＥＥＥ形式浮動小数点数へ変換してしまうと、仮数部が５２ビットに丸められ、仮数部の有効ビット長が５３ビット以上存在するか判断ができないためである。このため、２進浮動小数点で６４ビット長の中間値符号部、中間値指数部および中間値仮数部に格納する。
【００１７】
図５で１０進浮動小数点数の値を＋２．５×１０0として変換例を説明する。５１は変換元になる１０進浮動小数点数であり、符号部は“＋”、仮数部が２．５、指数部が０である。
【００１８】
最初に５１の符号部を“＋”であれば“０”、“−”であれば“１”として、５２の中間値符号部の右端に格納する。５１の符号は“＋”なので５２の右端に“０”を格納する。５２の値が最終的に中間値符号部に格納される値となる。
【００１９】
次に５１の指数部を２進数に変換して５３の中間値指数部に格納する。５１の指数部は“０”であるので５３の中間値指数部に“０”を格納する。次に５１の仮数部を２進数に変換した後、仮数部の値を１以上２未満（２進数表現で（１．…）となる値）とする正規化処理を行う。５１の仮数部は２．５であり、これは２進数（１０．１）であるので、正規化すると２進数（１．０１）×２1であり、仮数部が２進数（１．０１）、指数部“１”となるため、２進数（１．０１）の部分は２進数（１０１）として５６の左端に格納し、指数部が“１“であるため、５３の中間値指数部に格納された２進数(０…０００)に“１”を加算し、 ５４に示す２進数(０…００１)が格納される。さらに５４の値に下駄値と呼ばれる１０進数で“１０２３“の値、２進数（１１１１１１１１１１）の値を加算し５５の値とする。５５の値が最終的に中間値仮数部に格納される値となる。
【００２０】
最後に仮数部の最上位ビットを省略するため、５６の値２進数（１０１０００…０）を左に１ビットシフトし５７の値２進数（０１０００…０）とする。５７の値が最終的に中間値仮数部に格納される値である。
【００２１】
図５の変換を被加算数１０１に対して行った結果を中間値被加算数１０４〜１０６に格納し、その次に加算数１０２を同様に変換し、中間値加算数１０７〜１０９に格納する。
【００２２】
３２は有効ビット数判定部である。浮動小数点数の仮数部の有効ビット数が５２ビット以下であるかの判定を行う。仮数部の有効ビット長が５２ビット以下である場合、仮数部が左詰めで格納されているため、５３ビット以降がすべて“０“であることを確認すればよく、５３ビットから６４ビットまでのビット値を１とした１２ビットのマスク値（００００・・・０１１１１１１１１１１１１）を１１０のマスク値に格納した後、１０６の中間値被加算数仮数部および109の中間値加算数仮数部とのビット毎のアンド演算を行い、値が０であった場合５２ビット以下、値が０以外の場合は５３ビット以上と判断する。有効ビット数が５２ビット以下の場合、３３の演算結果有効ビット判定部へ進み、有効ビット数が５３ビット以上の場合、３７へ進む。
【００２３】
図８は仮数部とマスク値とのアンド演算の例を表す。８１は仮数部を５１ビット目までのビットを“１”としたときの例である。５３ビットから６４ビットまでのビット値を“１”としたマスク値とアンド演算を行うと結果は８３に格納された値ですべてのビットが“０”となり５２ビット以下と判断する。同様に８４は仮数部を５３ビット目までのビットを“１”としたときの例である。８２と同じ値である８５のマスク値とアンド演算を行うと、演算結果は２進数（００…１０００００００００００）となり５３ビット以上と判断する。
【００２４】
３３は１０４〜１０６の中間値被加算数および１０７〜１０９の中間値加算数の値をもとに、ＩＥＥＥ形式浮動小数点演算の加算を実施した場合に、演算結果に誤差が発生するかを判定する演算結果有効ビット数判定部である。加算時の有効ビット数の減少する要因として、加算前の両者の数の指数部の値の差を考慮して仮数部を桁あわせするために発生する桁落ちと、加算後の桁上がり発生による桁落ちがある。加算前の桁あわせ実施時の桁落ち数は中間値被加算数指数部１０５と中間値加算数指数部１０８の差であり、加算後の最上位桁上がりによる桁落ち数は最大１ビットである。実際には桁上がりが発生しない場合も存在するが、今回は判定処理速度を優先し、必ず桁上がりする判定とした。さらに中間値は６４ビットにしているため、ＩＥＥＥ形式の仮数部長５２ビットを超える５３ビットから６４ビット分を無視するための補正値１２ビット分を考慮し、これら３つを加えた数（１２＋１＋指数の差）をビットマスク長とし、右端から“１”がビットマスク長分並んだビットマスク値として生成し、このビットマスク値を被仮算数と加算数の仮数部に対してビット毎のアンド演算を行う。
【００２５】
図９はビットマスク値の生成例を表す。９１が中間値被加算数の指数部で値が２進数（１０００００００００１）、９２が中間値加算数の仮数部で値が２進数（１００００００００００）である。９１と９２の差分が“１”なのでこれに１３を加算し１４ビットがビットマスク値となる。このため、右端から１４ビット分を１としたマスク値を生成し、９３のマスク値に格納する。
【００２６】
図９の処理を１０５の中間値被加算数指数部および１０８の加算中間値加算数指数部を用いて実施し、１１０のマスク値に格納したあと、１０６の中間値被加算数仮数部および１０９の中間値加算数仮数部のそれぞれに対して１１０のマスク値とのアンド演算を行った結果、両方の値が０であった場合は３４の処理に進み、どちらかの値が０以外であった場合、３７の処理に進む。
【００２７】
図６にＩＥＥＥ形式浮動小数点数で桁あふれが発生する要因について加算例を用いて説明する。演算結果に誤差が発生しない場合を例１に、誤差が発生する場合を例２に示す。例１は６１が被加算数、６２が加算数、６３が加算結果である。被加算数と加算数の指数部の値は同じで仮数部の有効ビット数がどちらも５１ビット以内なので加算結果の仮数部の有効ビット数は５２ビット以内となるため、演算結果に桁上がりによる切り捨てがないため誤差は発生しない。一方、例２では、被仮算数と加算数の指数部の値は同じで加算数の有効ビット数が５２ビットである。６６は被仮算数に加算数を加算した結果である。加算により最上位ビットの桁あふれが発生し、ＩＥＥＥ形式浮動小数点数の仮数部のビット長の５２ビットを超えてしまう。そのため仮数部を右へ１ビットシフトし、指数部に“１”を加算する。６７が訂正後の演算結果である。シフトにより最右端の値は“１“であるが、有効ビット数を超えたため、最右端の”１“は切り捨てられる。このため演算結果に誤差が発生する。
【００２８】
図７は３４のＩＥＥＥ形式浮動小数点数変換部の処理を説明した概念図である。７１の中間値符号部の右端１ビットを７４の左端１ビットに格納し、７２の中間値指数部の右端１１ビットを７４の２ビット目から１２ビット目に格納し、７３の中間値仮数部の１ビット目から５２ビット目を７４の１３ビット目から６４ビット目に格納する。
【００２９】
３４はＩＥＥＥ形式浮動小数点数変換部である。３４の処理において１０４〜１０６の中間値被加算数と１０７〜１０９の中間値加算数のそれぞれに対して図７で示した処理を実施し、ＩＥＥＥ形式浮動小数点被加算数１１１とＩＥＥＥ形式浮動小数点加算数１１２に格納する。
【００３０】
３５は、ＩＥＥＥ形式浮動小数点演算処理部である。ハードウェアのＩＥＥＥ形式浮動小数点演算装置に１１１と１１２に格納した値を被加算数と加算数として渡し加算を行う、実施した結果は１１１に格納される。
【００３１】
３６は２進浮動小数点数変換部である。１１１に格納された値の左端１ビットを符号部、２ビット目から１２ビット目を指数部、１３ビット目から６４ビット目を仮数部として用い、１０進浮動小数点に変換し、変換した値を１０３の加算結果に格納する。
【００３２】
３７はＭ形式浮動小数点演算処理部（エミュレーション）である。３２、３３の判定で仮数部の有効ビット数が５３ビット以上と判定された場合、１０４〜１０６の中間値被加算数を被加算値、１０７〜１０９の加算中間値を加算値として、Ｍ形式互換浮動小数点演算（エミュレーション）を行い、加算した結果を１０進浮動小数点数に変換して、１０３の加算結果に格納する。
【００３３】
本実施例ではべき乗処理に含まれる浮動小数点演算のうち加算処理の実施例を記述したが、浮動小数点演算には加減乗余算等が含まれており、誤差判定処理を追加することによりハードウェアのＩＥＥＥ形式浮動小数点演算装置による処理の高速化を図ることができる。
【符号の説明】
【００３４】
１  中央処理装置（ＣＰＵ）
２  主記憶装置
３  ＩＥＥＥ形式浮動小数点演算装置
４  磁気ディスク装置
１２  オペレーティングシステム（ＯＳ）
１３  演算プログラム（ユーザプログラム）
１４  数値演算ライブラリ
１５  Ｍ形式浮動小数点演算
１６  べき乗命令処理
２１  べき乗命令判定部
２２  べき乗命令処理
２３  通常処理部
３１  １０進２進浮動小数点変換部
３２  有効ビット数判定部
３３  演算結果有効ビット数判定部
３４  ＩＥＥＥ形式浮動小数点変換部
３５  ＩＥＥＥ形式浮動小数点演算処理部（ハードウエア）
３６  １０進２進浮動小数点変換部
３７  Ｍ形式浮動小数点演算処理部（エミュレーション）
４１  Ｍ形式浮動小数点フォーマット
４２  ＩＥＥＥ形式浮動小数点フォーマット
５１  １０進浮動小数点
５２  中間値符号部
５３  中間値指数部
５４  中間値指数部
５５  中間値指数部
５６  中間値仮数部
５７  中間値仮数部
６１  被加算数
６２  加算数
６３  加算結果
６４  被加算数
６５  加算数
６６  加算結果
７１  中間値符号部
７２  中間値指数部
７３  中間値仮数部
７４  ＩＥＥＥ形式浮動小数点数
８１  仮数部
８２  マスク値
８３  演算結果
８４  仮数部
８５  マスク値
８６  演算結果
９１  中間値被加算数指数部
９２  中間値加算数指数部
９３  マスク値
１０１  被加算数
１０２  加算数
１０３  加算結果
１０４  中間値被加算数符号部
１０５  中間値被加算数指数部
１０６  中間値被加算数仮数部
１０７  中間値加算数符号部
１０８  中間値加算数指数部
１０９  中間値加算数仮数部
１１０  マスク値
１１１  ＩＥＥＥ形式浮動小数点被加算数
１１２  ＩＥＥＥ形式浮動小数点被加算数
【図１】
2015045968.tif 000003
【図２】
2015045968.tif 000004
【図３】
2015045968.tif 000005
【図４】
2015045968.tif 000006
【図５】
2015045968.tif 000007
【図６】
2015045968.tif 000008
【図７】
2015045968.tif 000009
【図８】
2015045968.tif 000010
【図９】
2015045968.tif 000011
【図１０】
2015045968.tif 000012