(57)【要約】  演算処理装置は、指数関数を級数演算と級数演算に対する係数とに分解した場合における浮動小数点数形式で表現した係数の指数部を、入力される入力データの第１の部分に基づいて生成する指数生成部（２０）と、係数の仮数部を記憶する記憶部（２１）と、入力データの第２の部分に応じた定数データを記憶部から読み出す定数生成部（２０）と、実行する命令が指数関数の係数を算出する係数算出命令である場合、定数生成部からの定数データを選択して出力する選択部（２３）を有する。
2013145276.tif 000002
【特許請求の範囲】
【請求項１】
指数関数を級数演算と前記級数演算に対する係数とに分解した場合における浮動小数点数形式で表現した前記係数の指数部を、入力される入力データの第１の部分に基づいて生成する指数生成部と、
前記係数の仮数部を記憶する記憶部と、
前記記憶部から、前記入力データの第２の部分に応じた定数データを読み出す定数生成部と、
実行する命令が前記指数関数の係数を算出する係数算出命令である場合、前記定数生成部からの定数データを選択して出力する選択部を有することを特徴とする演算処理装置。
【請求項２】
前記記憶部は、
前記入力データの第２の部分が示す値ｉ（ｉは自然数）に対応して（２**（ｉ／（２**第２の部分のビット幅）））（**はべき乗を示す）の値を浮動小数点数形式で表現した仮数部を前記定数データとして記憶することを特徴とする請求項１記載の演算処理装置。
【請求項３】
前記入力データの第１の部分は、前記入力データの（ｎ＋１１）ビット目〜（ｎ＋１）ビット目（ｎは自然数）であり、
前記入力データの第２の部分は、前記入力データのｎビット目〜０ビット目であることを特徴とする請求項２記載の演算処理装置。
【請求項４】
前記入力データの（ｎ＋１１）ビット目〜（ｎ＋１）ビット目を前記係数を浮動小数点数形式で表した指数部とし、前記入力データのｎビット目〜０ビット目により前記記憶部を参照して得られた定数データを前記係数を浮動小数点数形式で表した仮数部とすることを特徴とする請求項３記載の演算処理装置。
【請求項５】
前記入力データを用いた積和演算を行う積和演算器を有し、
実行する命令が前記係数算出命令以外の命令である場合、前記積和演算器からの前記入力データを用いた積和演算の結果である積和演算結果を選択して出力することを特徴とする請求項１〜４のいずれか１項に記載の演算処理装置。
【請求項６】
演算処理装置の制御方法において、
前記演算処理装置が有する指数生成部が、指数関数を級数演算と前記級数演算に対する係数とに分解した場合における浮動小数点数形式で表現した前記係数の指数部を、入力される入力データの第１の部分に基づいて生成し、
前記演算処理装置が有する定数生成部が、前記係数の仮数部を記憶する記憶部から、前記入力データの第２の部分に応じた定数データを読み出し、
実行する命令が前記指数関数の係数を算出する係数算出命令である場合、前記演算処理装置が有する選択部が、前記定数生成部からの定数データを選択して出力することを特徴とする演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
数学関数の演算を行うＣＰＵ（Central Processing
Unit）等の演算処理装置において、指数関数等の演算は、一般的にテーラー級数演算を用いて行われる。指数関数の演算においてテーラー級数演算をある有限な次数で打ち切ったときに十分な精度が得られるようにするためには、指数関数を、有限の次数で与えられた精度に収束するテーラー級数の演算であるテーラー級数演算と係数に分解する必要がある。【０００３】
従来技術では、指数関数演算のテーラー級数演算実行前の係数の算出処理は、ソフトウェアにより実装され、従来の命令を複数組み合わせて使用し、浮動小数点レジスタと整数レジスタとの間のデータ転送や、ビット演算、シフト演算等の整数演算器を使用した演算処理が多く行われる。このため、指数関数演算全体を処理するのに、多くの命令を必要とし、命令発行スループットの圧迫等の性能が低下してしまう。【０００４】
数学関数のテーラー級数演算の係数データを格納する係数テーブルのセットを専用のメモリに格納し、テーラー級数演算で必要な係数データを、直接、係数テーブルから読み出して浮動小数点積和演算器に供給することで、テーラー級数演算を高速に実行できるようにした演算処理装置が提案されている（例えば、特許文献１参照）。また、三角関数のテーラー級数演算実行前の、テーラー級数展開関数の決定と、その展開関数への入力引数の算出処理を行う命令として、専用の三角関数演算補助命令を設けた演算処理装置が提案されている（例えば、特許文献２参照）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００８−２３４０７６号公報
【特許文献２】特開２０１１−１３７２８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
１つの側面では、本発明は、指数関数の演算を高速化することを目的とする。
【課題を解決するための手段】
【０００７】
演算処理装置の一態様は、指数関数を級数演算と級数演算に対する係数とに分解した場合における浮動小数点数形式で表現した係数の指数部を、入力される入力データの第１の部分に基づいて生成する指数生成部と、係数の仮数部を記憶する記憶部と、入力データの第２の部分に応じた定数データを記憶部から読み出す定数生成部と、実行する命令が指数関数の係数を算出する係数算出命令である場合、定数生成部からの定数データを選択して出力する選択部を有する。
【発明の効果】
【０００８】
指数関数の演算を高速化することができる。
【図面の簡単な説明】
【０００９】
【図１】図１は、本発明の実施形態による演算処理装置の構成例を示す図である。
【図２】図２は、定数テーブルの例を示す図である。
【図３】図３は、本実施形態における係数算出処理を説明するための図である。
【図４】図４は、本実施形態による演算処理装置の他の構成例を示す図である。
【発明を実施するための形態】
【００１０】
以下、本発明の実施形態を図面に基づいて説明する。
【００１１】
図１は、本発明の一実施形態による主記憶装置としてのメモリ（メインメモリ）に接続された演算処理装置の構成例を示す図である。本実施形態による演算処理装置は、演算処理装置外部のメモリ（メインメモリ）１１に接続され、メインメモリ１１のデータの一部を記憶するキャッシュメモリ１２と、リネーミングレジスタ１３と、レジスタファイル１４と、バイパスデータ１５とを有する。また、本実施形態による演算処理装置は、マルチプレクサ１６〜１８、２３と、第１の演算器１９と、第２の演算器２０とを有する。また、情報処理装置は、演算処理装置とメモリ１１を少なくとも有する。
【００１２】
レジスタファイル１４は、演算器１９、２０が演算を実行するときに使用するすべてのレジスタを備えている。リネーミングレジスタ１３は、オペランドデータの逆依存と出力依存を解消するために設けられている。バイパスデータ１５は、演算処理装置の命令パイプラインにおいてデータハザードを解消するためのバイパシング（bypassing）で使用されるデータ（演算結果データ）である。リネーミングレジスタ１３のエントリに格納されているレジスタ値は、リタイア（retire）時にレジスタファイル１４に移される。
【００１３】
マルチプレクサ１６は、レジスタファイル１４から出力されるデータ、リネーミングレジスタ１３から出力されるデータ、及びバイパスデータ１５の３種類のオペランドデータが入力される。マルチプレクサ１６は、それら３種類のオペランドデータのうちから何れか１つのオペランドデータを選択して、ソースデータｒｓ１として出力する。マルチプレクサ１７、１８は、マルチプレクサ１６と同様に３種類のオペランドデータが入力され、選択したオペランドデータをソースデータｒｓ２、ｒｓ３として出力する。
【００１４】
第１の演算器１９は、浮動小数点積和演算器であり、マルチプレクサ１６、１７、１８から入力されるソースデータｒｓ１、ｒｓ２、ｒｓ３を用いてｒｓ１の値とｒｓ２の値との積にｒｓ３の値を加算する積和演算を行う。例えば、第１の演算器１９は、入力されるソースデータｒｓ１、ｒｓ２、ｒｓ３を用いて積和演算を行うことによってテーラー級数演算を行う。
【００１５】
第２の演算器２０は、指数関数演算補助命令（ｆｅｘｐａｄ）に係る演算処理を行う演算器である。第２の演算器２０は、指数関数をテーラー級数演算とテーラー級数演算に対する係数とに分解したときの係数を求めるための係数算出処理を、マルチプレクサ１７から入力されるソースデータｒｓ２を用いて行う。なお、指数関数をテーラー級数演算と係数とに分解したときのテーラー級数演算は、例えば第１の演算器１９で行われる。また、本実施形態では、第２の演算器２０は、ソースデータｒｓ２を用いて係数算出処理を行うようにしているが、これは一例である。第２の演算器２０が、ソースデータｒｓ１を用いて係数算出処理を行うようにしても良いし、ソースデータｒｓ３を用いて係数算出処理を行うようにしても良い。
【００１６】
指数関数演算補助命令（ｆｅｘｐａｄ）は、入力されるソースデータをｓｄａｔとすると、｛１’ｂ０，ｓｄａｔ［１６：６］，Ｔｅｘｐ［ｓｄａｔ［５：０］］［５１：０］｝という演算を行う命令である。｛１’ｂ０，ｓｄａｔ［１６：６］，Ｔｅｘｐ［ｓｄａｔ［５：０］］［５１：０］｝は、ＩＥＥＥ７５４倍精度浮動小数点数のデータフォーマットに従っている。すなわち、符号部（符号ビット）である６３ビット目を“０”とし、指数部（指数ビット）である６２〜５２ビット目をソースデータｓｄａｔの１６ビット目〜６ビット目とする。また、仮数部（仮数部ビット）である５１ビット目〜０ビット目を、ソースデータｓｄａｔの５ビット目〜０ビット目で示されるインデックスでもって定数テーブルＴｅｘｐから取り出されたデータの５１ビット目〜０ビット目とする。
【００１７】
定数テーブルＴｅｘｐは、第２の演算器２０が有する定数テーブル２１として備えられている。定数テーブルＴｅｘｐは、図２に示すように、ＩＥＥＥ７５４倍精度浮動小数点数のデータフォーマットに従って、（２**（ｉ/６４））の値を格納した６４エントリの定数テーブルである。なお「**」はべき乗を示し、ｉは０〜６３の範囲の整数である。ここで、ｉ＝０〜６３のとき、１≦（２**（ｉ/６４））＜２であるので、図２に示したように（２**（ｉ/６４））の値をＩＥＥＥ７５４倍精度浮動小数点数のデータフォーマットに従って示した符号部ｓ及び指数部ｅはｉの値にかかわらず同じである。したがって、定数テーブルＴｅｘｐは、少なくとも（２**（ｉ/６４））の値の仮数部ｆの値ｆｉが格納されていれば良い。（２**（ｉ/６４））の値のすべてではなく、仮数部だけを格納することで、定数テーブルＴｅｘｐに要する記憶容量を低減することができる。
【００１８】
命令種別コード２２は、マルチプレクサ２３に選択信号ＳＥＬとして入力される。マルチプレクサ２３は、選択信号ＳＥＬに従って、第１の演算器１９の出力又は第２の演算器２０の出力の何れか一方を出力する。本実施形態では、命令種別コードが指数関数演算補助命令（ｆｅｘｐａｄ）である場合には、選択信号ＳＥＬの値が“１”とされることにより、マルチプレクサ２３は、第２の演算器２０の出力を選択して出力する。一方、命令種別コードが指数関数演算補助命令（ｆｅｘｐａｄ）でない場合には、選択信号ＳＥＬの値が“０”とされることにより、マルチプレクサ２３は、第１の演算器１９の出力を選択して出力する。
【００１９】
以下、第２の演算器２０による係数算出処理について説明する。
なお、以下の説明において「**」はべき乗を示し、「！」は階乗を示し、「*」は乗算を示すものとする。また、「ｌｏｇ２（）」は底２の対数を示し、「ｌｏｇ（）」は底ｅ（ネイピア数）の対数を示すものとする。
【００２０】
指数関数ｅｘｐ（ｘ）をテーラー級数展開すると、Σ（１/ｎ！）*ｘ**ｎで表される。ｎをある有限の次数で打ち切ったときに十分な精度が得られるようにするため、ｘはｘ＜１である。
【００２１】
指数関数ｅｘｐ（ｘ）をテーラー級数演算とテーラー級数演算に対する係数とに分解すると以下のようになる。
ｅｘｐ（ｘ）
＝（２**ｌｏｇ２（ｅ））**ｘ
＝（２**（１/ｌｏｇ（２））**ｘ
＝２**（ｘ/ｌｏｇ（２））
＝２**（ｙ＋ｚ）
＝（２**ｙ）*（２**ｚ）
＝ｅｘｐ（ｌｏｇ（２**ｙ））*（２**ｚ）
＝ｅｘｐ（ｙ*ｌｏｇ（２））*（２**ｚ）
＝ｅｘｐ（ｙ２）*（２**ｚ）
【００２２】
前述の式において、ｙは絶対値が（１/６４）より小さい値であり、（ｙ＋ｚ）＝ｘ/ｌｏｇ（２）である。したがって、ｚはｘ/ｌｏｇ（２）を（１/６４）で丸めた値である。また、ｙ２＝ｙ*ｌｏｇ（２）＝ｘ−ｚ*ｌｏｇ（２）である。
【００２３】
ここで、（ｙ２の絶対値）＜（ｌｏｇ（２）/６４）＜１である。したがって、ｅｘｐ（ｙ２）は、有限の次数で十分な精度が得られるため、テーラー級数演算で計算され、（２**ｚ）が係数として計算される。つまり、指数関数ｅｘｐ（ｘ）の演算における、ｅｘｐ（ｙ２）を第１の演算器１９によるテーラー級数演算で計算し、（２**ｚ）を第２の演算器２０による係数算出処理で計算する。
【００２４】
前述のようにｚはｘ/ｌｏｇ（２）を（１/６４）で丸めた値であるので、ｐを１以上の自然数、ｑを０〜６３の整数とすると、ｚ＝ｐ＋ｑ/６４で表され、２**ｚ＝２**（ｐ＋ｑ/６４）＝（２**ｐ）*（２**（ｑ/６４））となる。これとＩＥＥＥ７５４倍精度浮動小数点数のデータフォーマットにおける符号部ｓ、指数部ｅ、仮数部ｆで表される値（−１）**ｓ*２**（ｅ−ｂｉａｓ）*（１．ｆ）とを比較すると、ｓ＝０、ｅ＝ｐ＋ｂｉａｓ、（１．ｆ）＝２**（ｑ/６４）となる。ｂｉａｓはＩＥＥＥ７５４倍精度浮動小数点数のデータフォーマットにおけるバイアス値である。
【００２５】
また、ｚｉ＝ｉｎｔ（ｘ/ｌｏｇ（２）*６４＋ｂｉａｓ*６４＋０．５）とおく。前述の式において、ｉｎｔ（ｘ）は、値ｘを整数に切り捨てしたときの値を表す。そして、このｚｉとｚ*６４＝ｐ*６４＋ｑとを比較すると、ｚｉの５ビット目〜０ビット目を抽出して表される値がｑの値に対応し、ｚｉの６ビット目以上を抽出して表される値がｐ+biasの値に対応する。
【００２６】
したがって、定数テーブルＴｅｘｐに（２**（ｉ/６４））の値をＩＥＥＥ７５４倍精度浮動小数点数のデータフォーマットに従って示したときの仮数部を格納しておき、ｚｉ［５：０］で示されるインデックスによりデータを取り出すことで係数２**ｚの仮数部が得られる。よって、係数２**ｚは、｛１’ｂ０，ｓｄａｔ［１６：６］，Ｔｅｘｐ［ｓｄａｔ［５：０］］［５１：０］｝の演算により計算することができる。
【００２７】
ここで、例えば、従来の命令を用いた係数算出処理により係数２**ｚを算出する場合のアゼンブラ命令列を以下に示す。なお、前述したｚｉはすでに算出されて浮動小数点レジスタに格納されているものとする。
stdf   zi,[]    …（命令Ｃ１）
ldx    [],zii    …（命令Ｃ２）
and    zii,63,Texpe    …（命令Ｃ３）
sllx   Texpe,3,Texpo    …（命令Ｃ４）
ldx    [Texpb+Texpo],p2zi    …（命令Ｃ５）
mov    2047,p2zmm    …（命令Ｃ６）
sllx   p2zmm,6,p2zmm    …（命令Ｃ７）
and    zii,p2zmm,p2zm    …（命令Ｃ８）
sllx   p2zm,46,p2zm    …（命令Ｃ９）
or     p2zi,p2zm,p2zi    …（命令Ｃ１０）
stdx   p2zi,[]    …（命令Ｃ１１）
lddf   [],p2z    …（命令Ｃ１２）
【００２８】
命令Ｃ１により、ｚｉが浮動小数点レジスタからメモリに読み出され、命令Ｃ２により、メモリに読み出されたｚｉが整数レジスタにｚｉｉとして読み込まれる。命令Ｃ３により、ｚｉｉと値６３とのビット毎の論理積演算が行われ演算結果がＴｅｘｐｅに代入される。命令Ｃ４により、Ｔｅｘｐｅが３ビット上位側にシフトされ、その結果がＴｅｘｐｏに代入される。この処理は、テーブルを参照する場合に８バイト間隔でアドレスを指す必要があるためである。次に、命令Ｃ５により、テーブルが記憶されているメモリ上のベースアドレスＴｅｘｐｂとＴｅｘｐｏとを加算して得られるアドレスを用いてテーブルが参照され、テーブルから読み出されたデータがｐ２ｚｉに代入される。命令Ｃ６により、値２０４７がｐ２ｚｍｍに代入される。言い換えれば１１ビット分のマスクデータが作成されてｐ２ｚｍｍに代入される。命令Ｃ７により、ｐ２ｚｍｍが上位側に６ビット分シフトされる。命令Ｃ８により、ｚｉｉとｐ２ｚｍｍとのビット毎の論理積演算が行われ演算結果がｐ２ｚｍに代入され、命令Ｃ９により、ｐ２ｚｍが上位側に４６ビット分シフトされることで、係数の指数部が得られる。次に、命令Ｃ１０により、得られた係数の指数部とテーブルから読み出されたデータであるｐ２ｚｉとのビット毎の論理和演算が行われ演算結果がｐ２ｚｉに代入される。これにより、テーラー級数演算に対する係数２**ｚの値が得られる。そして、命令Ｃ１１により、ｐ２ｚｉが整数レジスタからメモリに読み出され、命令Ｃ１２により、メモリに読み出されたｐ２ｚｉが浮動小数点レジスタにｐ２ｚとして読み込まれることで、テーラー級数演算に対する係数２**ｚの係数算出処理が終了する。このように、従来の命令を用いた係数算出処理によりテーラー級数演算に対する係数２**ｚを算出する場合には１２個の命令を実行する必要があり、処理も複雑であった。
【００２９】
一方、本実施形態における指数関数演算補助命令（ｆｅｘｐａｄ）を用いた係数算出処理によりテーラー級数演算に対する係数２**ｚを算出する場合のアゼンブラ命令列を以下に示す。
fexpad   zi,p2z    …（命令Ｉ１）
【００３０】
命令Ｉ１を実行することで、第２の演算器２０では、図３に示すように、ｐ２ｚ［６３］が“０”、ｐ２ｚ［６２：５２］がｚｉ［１６：６］、ｐ２ｚ［５１：０］がｚｉ［５：０］に応じて定数テーブル２１から出力されたデータ（２**（ｉ/６４）の仮数部）となるようにビット連結することで、テーラー級数演算に対する係数２**ｚの係数算出処理が行われる。このように本実施形態では、１つの指数関数演算補助命令（ｆｅｘｐａｄ）でテーラー級数演算に対する係数の算出処理が行うことができるので、従来と比較して１１個のアゼンブラ命令を削減することができる。
【００３１】
このように本実施形態によれば、１つの命令で指数関数演算におけるテーラー級数演算に対する係数の算出処理を行うことができ、指数関数の演算を高速化することができる。したがって、演算処理装置における命令スループットを向上させ、性能を向上させることができる。また、図１に示した構成において、一般的な演算処理装置に対して、指数関数演算補助命令（ｆｅｘｐａｄ）による演算を実行するために新たに設ける回路は、第２の演算器２０及びマルチプレクサ２３である。したがって、わずかな追加回路を追加するだけで、指数関数をテーラー級数演算とテーラー級数演算に対する係数に分解したときの係数の算出処理を高速化し、指数関数の演算を高速化することができる。
【００３２】
本実施形態によれば、指数関数をテーラー級数演算とテーラー級数演算に対する係数に分解したときの係数の算出処理の演算性能が９倍に改善する（整数演算器によるパイプラインが２つ、浮動小数点演算器によるパイプラインが２つの場合）。また、従来の手法では、テーラー級数演算に対する係数の算出処理におけるテーブル参照において、ロード／ストア命令を実行する必要があるため、キャッシュミスが発生する可能性があり、そのような場合には、本実施形態では、テーラー級数演算に対する係数の算出処理の演算性能が９倍以上に改善することとなる。
【００３３】
なお、本実施形態による演算処理装置は、図１に示した構成に限定されるものではなく、例えば図４に示すように演算処理装置をＳＩＭＤ（Single Instruction stream-Multiple Data stream）型の演算処理装置としても良い。図４には、２ＳＩＭＤの演算処理装置を一例として示している。第１の演算処理部として、リネーミングレジスタ１３Ａと、レジスタファイル１４Ａと、バイパスデータ１５Ａと、マルチプレクサ１６Ａ〜１８Ａ、２３Ａと、第１の演算器１９Ａと、第２の演算器２０Ａとを有する。また、第２の演算処理部として、リネーミングレジスタ１３Ｂと、レジスタファイル１４Ｂと、バイパスデータ１５Ｂと、マルチプレクサ１６Ｂ〜１８Ｂ、２３Ｂと、第１の演算器１９Ｂと、第２の演算器２０Ｂとを有する。このように演算処理装置を構成し、２つのデータに対して１つの命令で第１の演算処理部及び第２の演算処理部により同じ演算処理を並列に実行させる。なお、図４には、２ＳＩＭＤの演算処理装置を例示したが、演算処理部をさらに設けることで、４ＳＩＭＤや８ＳＩＭＤといった構成も可能である。
【００３４】
また、前記実施形態は、何れも本発明を実施するにあたっての具体化のほんの一例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、またはその主要な特徴から逸脱することなく、様々な形で実施することができる。
【符号の説明】
【００３５】
１１  メモリ（メインメモリ）
１２  キャッシュメモリ
１３  リネーミングレジスタ
１４  レジスタファイル
１５  バイパスデータ
１６、１７、１８、２３  マルチプレクサ
１９  積和演算器
２０  演算器
２１  定数テーブル
２２  命令種別コード
【図１】
2013145276.tif 000003
【図２】
2013145276.tif 000004
【図３】
2013145276.tif 000005
【図４】
2013145276.tif 000006
【国際調査報告】
2013145276.tif 000007
2013145276.tif 000008
2013145276.tif 000009
2013145276.tif 000010