(58)【調査した分野】(Int.Cl.,DB名)
【背景技術】
【0002】
浮動小数点数は、IEEE754−2008において標準形式が定められており、
図13(A)に示すように、符号部(S)1301、指数部(E)1302、及び仮数部(F)1303で表現される。また、浮動小数点数は、
図13(B)に示すように正規化数に加えて、非正規化数、無限大、非数、及びゼロの4種類の数が定められている。
【0003】
正規化数は、小数部を表す仮数部とは別に整数部に1の値を持ち、“(−1)
S×2
(E-bias)×1.F”で表される。この整数ビットは隠しビットと呼ばれる。残りの4つの数のうち、数値計算が必要となるのは非正規化数のみである。非正規化数は、正規化数とは異なり整数部(隠しビット)が1とならない数であり、バイアスされた指数を表す指数部は0であるが表現される数の指数の値は指数部が1となり、“(−1)
S×2
(E-bias+1)×0.F”で表される。
【0004】
正規化数と非正規化数を表す各形式の違いは、隠しビット及び指数部の表す指数の値である。また、浮動小数点演算における正規化数と非正規化数の処理の違いとして、丸め処理が挙げられる。正規化数の処理において、演算結果の整数ビットが0となった場合に1が現れるまで仮数を左シフトする。この処理は正規化とよばれ、丸め処理は正規化された値に対して行われる。一方、演算結果が非正規化数となる場合、整数ビットが0の状態で丸め処理を行うように定められている。そのため、正規化数の場合と同様に整数部に1が現れるまで仮数を左シフトして丸め処理を行った場合、異なる結果となる。
【0005】
非正規化数を扱う方法として、<1>〜<3>の方法が使用されている。
<1>非正規化数を演算器で検出し、ソフトウェアによって非正規化数を処理する。
<2>演算器内に非正規化数を処理する回路を追加し、演算器単体で非正規化数を処理する。
<3>非正規化数をハードウェアで処理するが、制御回路と協調して通常時とは異なる動作で非正規化数を処理する。
【0006】
<1>の方法については、マルチスレッドやSIMD(Single Instruction Multiple Data)演算等に対応した複数の計算資源を持つプロセッサにおいて非正規化数を含む例外処理を検出、管理する方法が特許文献1、2、3に開示されている。また、非正規化数の検出を高速、高効率に行う方法が特許文献4、5、6に開示されている。特許文献1〜6の何れもハードウェアによる非正規化数の検出方法に関して記載されているが、ソフトウェアでの処理の具体的な方法については記載されていない。
【0007】
<2>の方法については、浮動小数点積和演算器内に非正規化数を処理する回路を追加し、演算器単体で処理する方法が特許文献7、8、9に開示されている。入力が非正規化数である場合の隠しビット及び指数部の値の補正に加え、出力が非正規化数となる場合に正規化シフトのシフト量を補正する方法が示されている。
【0008】
<3>の方法については、非正規化数の出現を検出する演算器と非正規化数入力の前処理を行う演算器と非正規化数出力の後処理を行う演算器とを有し、非正規化数を検出した場合に通常とは異なる制御に分岐し、それらの演算器を用いて処理する方法が特許文献10、11、12に開示されている。特許文献10では、1つの浮動小数点演算命令を複数のマイクロ命令に分割し、それらを組み合わせることで命令を実行する。特許文献11では、入出力それぞれについて検出回路及び正規化処理回路又は非正規化処理回路を有し、必要に応じて各処理回路の結果をフィードバックすることにより非正規化数を処理する。特許文献12では、非正規化数入力の検出及び前処理を行う演算器を有し、入力が非正規化数である場合に制御回路に信号を送信し、前処理結果を用いて演算を行う。
【発明を実施するための形態】
【0015】
以下、本発明の実施形態を図面に基づいて説明する。
【0016】
(第1の実施形態)
本発明の第1の実施形態について説明する。
図1は、第1の実施形態における演算処理装置としてのCPU(Central Processing Unit)の構成例を示す図である。CPU100は、命令制御部110、演算実行部120及びキャッシュ制御部130を有する。
【0017】
CPU100において実行する命令は、命令制御部110から発行される。命令制御部110は、命令をフェッチしてデコードしたり、命令を完了(コミット)させたりする処理を行う。本実施形態では、命令はプログラムの順番とは無関係にアウトオブオーダーで実行され、命令のコミット時にリオーダされる。命令のリオーダは、演算が終了した命令をエントリバッファ111に格納し、プログラム順にコミットすることで行われる。なお、本実施形態ではアウトオブオーダー実行方式を用いるが、これに限定されるものではなく、インオーダー実行形式であってもよい。
【0018】
演算実行部120は、演算制御部121、演算部122、レジスタファイル123、及びリオーダバッファ124を有し、命令制御部110から発行された命令に応じた処理を実行する。演算制御部121は、命令制御部110から発行された命令を、どの演算部で実行するか振り分けを行い演算部122に通知する。演算部122は、浮動小数点演算器及び非正規化数処理用回路を有しており、指示された命令に応じた演算処理を実行する。演算部122による演算結果はリオーダバッファ124に格納され、命令制御部110により命令がコミット(完了)された際に、リオーダバッファ124に格納された演算結果がレジスタファイル123に書き込まれる。レジスタファイル123は、演算処理に用いるデータや演算結果であるデータを記憶する。
【0019】
キャッシュ制御部130は、キャッシュメモリ131を有する。キャッシュ制御部130は、キャッシュメモリ131に係る制御を行い、演算実行部120のレジスタファイル123とキャッシュメモリ131との間やキャッシュメモリ131とメモリ140との間でのデータ転送に係る制御を行う。キャッシュメモリ131は、主記憶装置であるメモリ(メインメモリ)140に記憶されているデータの一部を格納する。
【0020】
図2は、CPU100での命令実行の例を示すフローチャートである。ステップS201にて、命令制御部110が演算実行部120に命令を発行する。ステップS202にて、演算実行部120は、命令制御部110からの命令を演算部122で実行する。このとき、演算実行部120の演算部122は、入出力データにおける非正規化数の検出を行い、入出力データにおいて非正規化数が現れるか否かを判定する。演算実行部120の演算部122は、演算が終了すると、演算結果及び非正規化数の検出結果を出力する。
【0021】
ステップS203にて、演算実行部120の演算部122から出力された演算結果がリオーダバッファ124に格納され、終了した命令及びその命令での非正規化数の検出結果が命令制御部110のエントリバッファ111に格納される。例えば、エントリバッファ111に判定フラグを設け、非正規化数が検出された場合、判定フラグを立てるようにする。エントリバッファ111に格納された非正規化数の検出結果は、対応する命令の完了まで保持される。なお、終了した命令と非正規化数の検出結果とをエントリバッファ111に格納するようにしているが、終了した命令と非正規化数の検出結果とが対応付けられて格納されていればよく、非正規化数の検出結果をエントリバッファ111とは異なる格納部に格納するようにしてもよい。
【0022】
そして、ステップS204にて、命令の完了処理時(エントリバッファ111のトップに来た際)、命令制御部110は、コミット(完了)する命令における非正規化数の検出結果に基づいて、非正規化数が検出されたか否かを判定する。その結果、非正規化数が検出されたと判定した場合(ステップS204のYES)、CPU100は非正規化数処理モードに遷移して非正規化数処理を実行する。非正規化数処理モードでは、プログラム順に並べたときの後続命令の実行を抑止する1命令モードとして動作し、エントリバッファ及びリオーダバッファに格納された値を破棄するとともに、実行中の後続命令も破棄した上で、非正規化数が検出された命令を再実行する。一方、ステップS204での判定の結果、非正規化数が検出されていないと判定した場合(NO)、ステップS207へ進む。
【0023】
非正規化数処理では、ステップS205にて、命令制御部110は、非正規化数処理モードで演算実行部120に命令を再発行する。ステップS206にて、演算実行部120は、命令制御部110からの命令を演算部122で再実行する。このとき、入出力データに非正規化数が現れることが命令制御部110から演算実行部120の演算部122に通知され、演算部122は、非正規化数処理モードで動作するとともに、非正規化数処理用の回路を用いて入力の前処理や演算結果の後処理を行う。そして、演算実行部120の演算部122からの演算結果がリオーダバッファ124に格納され、終了した命令が命令制御部110のエントリバッファ111に格納されて、ステップS207へ進む。
【0024】
ステップS207にて、命令制御部110は命令をコミットしてステップS201に戻り、後続の命令実行を行う。なお、非正規化数処理モードである場合、ステップS207において命令をコミットする際、通常の処理モードに遷移してステップS201に戻る。また、非正規化数処理モードである場合、命令の再実行に要するレイテンシを予め決定し、そのレイテンシが経過することで演算処理の終了として命令をコミットするようにしてもよい。
【0025】
図3は、第1の実施形態における演算実行部120の構成例を示す図である。
図3において、
図1に示した構成要素と同一の機能を有する構成要素には同一の符号を付し、重複する説明は省略する。
図3には、演算実行部120の演算部122に、浮動小数点積和演算器301及び非正規化数処理用回路302を有する例を示している。浮動小数点積和演算器301は、レジスタ303、304、305に保持されたオペランド(入力データ)OP1、OP2、OP3の積和演算を行い、演算結果SG7を出力する。
図4に浮動小数点積和演算器301の構成例を示す。
【0026】
図4は、浮動小数点積和演算器301の構成例を示す図である。浮動小数点積和演算器301は、乗算器401、加算器402、桁合わせ回路403、非正規化数検出回路404、フォーマット回路405、406、407、412、指数計算回路408、411、正規化回路409、丸め回路410、例外検出回路413、及びセレクタ414を有する。
【0027】
乗算器401は、フォーマット回路405、406を介して入力されるレジスタ303、304に保持されたオペランドOP1、OP2の仮数部を乗算処理して演算結果を出力する。加算器402は、乗算器401から出力される演算結果と、フォーマット回路407を介して入力されるレジスタ305に保持されたオペランドOP3の仮数部とを加算処理して演算結果を出力する。なお、オペランドOP3の仮数部は、指数計算回路A408の計算結果に基づいて、桁合わせ回路403によって桁合わせ処理された後に加算器402に入力される。このようにして、オペランドOP1とオペランドOP2とを乗算し、乗算結果にオペランドOP3を加算して得られる積和演算結果(仮数部)が出力される。
【0028】
非正規化数検出回路404は、浮動小数点積和演算器301の入出力データにおける非正規化数の検出を行い、検出結果を信号SG1、SG3、SG5により出力する。非正規化数検出回路404は、フォーマット回路405〜407を介して入力されるレジスタ303〜305に保持されたオペランドOP1〜OP3、及び積和演算の演算結果が非正規化数であるか否かを判定する。判定の結果、非正規化数検出回路404は、入力されるオペランドOP1〜OP3及び積和演算の演算結果の少なくとも1つが非正規化数であれば信号SG1を出力する。また、非正規化数検出回路404は、入力されるオペランドOP1〜OP3が非正規化数であれば各オペランド毎に信号SG3(SG3A〜SG3
C)を出力し、積和演算の演算結果が非正規化数であれば信号SG5を出力する。
【0029】
フォーマット回路405〜407は、入力されたデータから演算する浮動小数点数のサイズ(本例では倍精度又は単精度)に応じて、指数部及び仮数部(隠しビットを含む)を成形する。フォーマット回路405〜407の構成例を
図5に示す。
図5には、一例としてフォーマット回路405の構成例を示したが、フォーマット回路406、407も同様に構成される。
【0030】
フォーマット回路405は、セレクタ501、502、503を有する。セレクタ501には、入力データSIのうち、倍精度浮動小数点数の指数部に対応するビット、及び単精度浮動小数点数の指数部に対応するビットが入力される。また、セレクタ502には、入力データSIのうち、倍精度浮動小数点数の仮数部に対応するビット、及び単精度浮動小数点数の仮数部に対応するビットが入力される。セレクタ501、502は、命令制御部110からの信号SG4により指定される浮動小数点数のサイズに応じて、入力の一方を選択して出力する。
【0031】
また、セレクタ503は、隠しビットの値1及び0が入力され、非正規化数検出回路404から出力される信号SG3Aに応じて、一方の値を選択して出力する。セレクタ503は、非正規化数でないことを信号SG3Aが示す場合には値1を選択して出力し、非正規化数であることを信号SG3Aが示す場合には値0を選択して出力する。セレクタ501の出力が指数部SGEとなり、セレクタ503の出力とセレクタ502の出力とを結合したものが仮数部SGMとなる。フォーマット回路405は、指数部SGEと仮数部SGMとを結合し浮動小数点数SGFとして出力する。
【0032】
図4に戻り、指数計算回路A408は、入力されるオペランドの指数部OP1E、OP2E、OP3Eから、正規化される前の演算結果の指数を計算する。指数計算回路A408の構成例を
図6に示す。指数計算回路A408は、セレクタ601、603、605、
610、6
19、加算器602、604、606、607、及び減算器608、609を有する。
【0033】
セレクタ601には、オペランドOP1の指数部OP1E、及びそれに加算器602により1を加えた値が入力される。同様に、セレクタ603には、オペランドOP2の指数部OP2E、及びそれに加算器604により1を加えた値が入力され、セレクタ605には、オペランドOP3の指数部OP3E、及びそれに加算器606により1を加えた値が入力される。なお、加算器602、604、606による処理は非正規化数への補正に相当するが、非正規化数の指数部のすべてのビットの値は0であるので、最下位ビットに1を立てることで実現してもよい。
【0034】
セレクタ601、603、605は、非正規化数検出回路404から出力される信号SG3(SG3A〜SG3C)に応じて、一方の値を選択して出力する。セレクタ601、603、605は、非正規化数でないことを信号SG3が示す場合にはオペランドの指数部OP1E、OP2E、OP3Eを選択して出力し、非正規化数であることを信号SG3が示す場合には加算器602、604、606の出力を選択して出力する。加算器607は、セレクタ601の出力とセレクタ603の出力とを加算する。減算器608は、命令制御部110からの信号SG4により指定される浮動小数点数のサイズに応じてセレクタ6
19から出力される値1023又は127を、加算器607の出力から減算する。これにより、オペランドOP1、OP2の乗算結果の指数が計算される。
【0035】
減算器609は、セレクタ605の出力と減算器608の出力との減算処理を行い、演算結果を出力する。減算器609の出力によりオペランドOP1、OP2の乗算結果とオペランドOP3の大小関係がわかる。また、セレクタ610は、セレクタ605の出力及び減算器608の出力が入力され、減算器609の出力(演算結果)に応じて一方を選択して正規化される前の演算結果の指数OUTEとして出力する。
【0036】
図4に戻り、正規化回路409は、加算器402の出力、すなわちオペランドOP1〜OP3を積和演算した演算結果(仮数部)を正規化する。丸め回路410は、正規化回路409により正規化された値に対して丸め処理を行う。指数計算回路B411は、指数計算回路A408により計算された正規化前の演算結果の指数OUTEと、正規化回路409及び丸め回路410の処理結果とに基づいて、正規化された演算結果の指数を計算する。
【0037】
フォーマット回路412は、指数計算回路B411の出力及び丸め回路410の出力から演算結果の指数部及び仮数部を成形して出力する。例外検出回路413は、IEEE754−2008で定められた例外を検出する。セレクタ414は、フォーマット回路412の出力又は例外検出回路413の出力を、浮動小数点積和演算器301での演算結果SG7として出力する。
【0038】
図3に戻り、非正規化数処理用回路302は、非正規化数処理モードであるときに非正規化数に係る処理を行う。非正規化数処理用回路302は、セレクタ306及びレジスタ303を介して、浮動小数点積和演算器301での演算結果SG7がオペランドOP1として入力される。非正規化数処理用回路302は、入力されるオペランドOP1の指数部の値に応じて、オペランドOP1に対するシフト処理や丸め処理を行い、演算結果SG9を出力する。
【0039】
非正規化数処理用回路302は、オペランドOP1の指数部の値が負である場合、オペランドOP1が非正規化数となるので、指数部の値が正となるまで右シフトを行い結果を丸める。また、非正規化数処理用回路302は、オペランドOP1の指数部の値が正である場合には、オペランドOP1が非正規化数とならないので、右シフトを行わずに丸め処理を行う。
図7に非正規化数処理用回路302の構成例を示す。
【0040】
図7は、非正規化数処理用回路302の構成例を示す図である。非正規化数処理用回路302は、制御回路701、指数計算回路702、右シフタ回路703、丸め回路704、指数計算回路705、フォーマット回路706、及び例外検出回路707を有する。制御回路701は、非正規化数処理モードであることを示す命令制御部110からの信号SG2に基づいて、セレクタ306の選択制御信号SG8を出力する。
【0041】
指数計算回路702は、入力されるオペランドOP1の指数部に基づいて、右シフタ回路703におけるシフト量を計算する。右シフタ回路703は、指数計算回路702の計算結果に基づいて、オペランドOP1の指数部の値が正となるまでオペランドOP1の仮数部を右シフトする。丸め回路704は、右シフタ回路703から出力された値に対して丸め処理を行う。
【0042】
指数計算回路705は、指数計算回路702により計算された指数と丸め回路704の処理結果とに基づいて演算結果の指数を計算する。フォーマット回路706は、指数計算回路705の出力及び丸め回路704の出力から演算結果の指数部及び仮数部を成形して演算結果SG9を出力する。例外検出回路707は、アンダーフロー及び不正確の2つの例外を検出する。
【0043】
図3に戻り、セレクタ307は、浮動小数点積和演算器301からの演算結果SG7又は非正規化数処理用回路302からの演算結果SG9の一方を出力する。セレクタ307は、非正規化数処理モードでない場合、浮動小数点積和演算器301からの演算結果SG7を選択して出力し、非正規化数処理モードである場合、非正規化数処理用回路302からの演算結果SG9を選択して出力する。セレクタ307から出力された演算結果SG7又はSG9は、レジスタ308を介してリオーダバッファ124に格納される。論理和演算(OR)ゲート309は、浮動小数点積和演算器301及び非正規化数処理用回路302からの例外通知が入力される。例外判定部310は、ORゲート309の出力に基づいて例外が発生したかを判定し、例外が発生した場合に命令制御部110に通知する。
【0044】
次に、第1の実施形態における動作について説明する。
命令制御部110からの命令に応じて演算実行部120が浮動小数点積和演算器301を用いる命令を実行する際、浮動小数点積和演算器301の非正規化数検出回路404が、入出力データにおける非正規化数の検出を行う。入出力データにおいて非正規化数が検出されない場合、演算実行部120は、浮動小数点積和演算器301を用いて通常の演算処理を行い演算結果SG7を出力する。
【0045】
一方、入出力データにおいて非正規化数が検出された場合、演算実行部120の浮動小数点積和演算器301は、命令制御部110に信号SG1を出力する。そして、非正規化数が検出された命令が命令制御部110でコミット処理(完了処理)される際に、信号SG1を基にCPU100が非正規化数処理モードへと遷移する。非正規化数処理モード中、命令制御部110は各演算器に非正規化数処理モードであることを示す信号SG2を出力する。また、非正規化数処理モードでは、以下のようにして、非正規化数が検出された命令を演算実行部120で再実行する。
【0046】
非正規化数処理モードに遷移すると、命令制御部110のエントリバッファ及び演算実行部120のリオーダバッファ124の値を破棄する。また、実行中の後続命令も破棄した上で、後続命令の実行を抑止する1命令モードとして動作し、非正規化数が検出された命令を実行する。
【0047】
演算実行部120の浮動小数点積和演算器301は、非正規化数が検出された命令の演算を開始し、入力されたオペランドOP1〜OP3が非正規化数であるか否かを非正規化数検出回路404において判定する。入力されたオペランドOP1〜OP3に非正規化数が含まれている場合、非正規化数検出回路404からフォーマット回路405〜407及び指数計算回路A408に信号SG3をフィードバックし、再び演算の初めから開始する。このとき、フォーマット回路405〜407内で仮数部の隠しビットを0に落とし、指数計算回路A408において指数部の補正を行う。
【0048】
浮動小数点積和演算器301では、丸め処理を除いて通常と同じ演算を行って結果を出力する。このとき、非正規化数検出回路404が、演算の結果が非正規化数となるか否かを判定し、非正規化数となる場合には非正規化数処理用回路302に信号SG5を出力する。本実施形態では、丸め処理を行わない方法として、IEEE754−2008で定められた0方向丸めを行い、ガードビット、ラウンドビット、及びスティッキービットの丸め処理に必要な情報であるSG6を浮動小数点積和演算器301の正規化回路409から非正規化数処理用回路302に出力する。
【0049】
このようにして非正規化数処理用回路302に、浮動小数点積和演算器301からの信号SG5、SG6が入力され、加えて浮動小数点積和演算器301の演算結果SG7が入力されて、演算結果SG7に対する処理が行われる。ここで、浮動小数点積和演算器301の演算結果SG7を非正規化数処理用回路302へ入力するためのデータバイパスは、通常の演算時にも使用されるパスであり、本実施形態の適用に際しハードウェアの追加は不要である。また、通常、レジスタ303にどのデータパスからのデータを格納するかは命令制御部110により指示されるが、非正規化数処理モードでは、非正規化数処理用回路302が選択制御信号SG8を用いて決定する。
【0050】
浮動小数点積和演算器301の演算結果SG7の指数部の値が負である場合、命令の演算結果が非正規化数となる。このとき、非正規化数処理用回路302は、演算結果SG7の指数部の値が正となるまで仮数部の右シフトを行って結果を丸め、演算結果SG9を出力する。一方、浮動小数点積和演算器301の演算結果SG7の指数部の値が正である場合、演算結果が非正規化数とならず、非正規化数処理用回路302は右シフトを行わずに丸め処理を行って演算結果SG9を出力する。ここでは、浮動小数点積和演算器301からの信号SG5に基づいてシフト量を0とした上で、浮動小数点積和演算器301において通常行われる丸め処理を実行して結果を出力する。
【0051】
このようにして演算結果SG9を出力して非正規化数処理用回路302による演算が終了し、非正規化数が検出された命令がコミットされた後に、CPU100は、非正規化数処理モードから通常の処理モードへ遷移して、後続命令の実行を開始する。
【0052】
第1の実施形態によれば、演算処理において非正規化数が検出された場合、命令のコミット処理(完了処理)を行う際に、非正規化数が検出された命令を再実行させることで、正規化数だけの演算のレイテンシを悪化させることなく、非正規化数をハードウェアにより制御を複雑化させずに高速に処理することができる。
【0053】
(第2の実施形態)
次に、本発明の第2の実施形態について説明する。第2の実施形態における情報処理装置としてのCPUの全体構成や命令実行等は、第1の実施形態と同様であるので、その説明は省略する。
図8は、第2の実施形態における演算実行部120の構成例を示す図である。
図8において、
図1に示した構成要素と同一の機能を有する構成要素には同一の符号を付し、重複する説明は省略する。
【0054】
図8には、演算実行部120の演算部122に、浮動小数点逆数テーブル演算器801及び非正規化数処理用回路802を有する例を示している。浮動小数点逆数テーブル演算器801は、レジスタ803に保持されたオペランドOP1についての浮動小数点数の逆数近似演算を行い、演算結果(オペランドOP1の逆数値)SG13を出力する。レジスタ803には、非正規化数処理モードでない場合にはセレクタ804を介してレジスタファイル123からのデータが格納され、非正規化数処理モードである場合にはセレクタ804を介して非正規化数処理用回路802の演算結果SG12が格納される。
図9(A)に浮動小数点逆数テーブル演算器801の構成例を示す。
【0055】
図9(A)は、浮動小数点逆数テーブル演算器801の構成例を示す図である。浮動小数点逆数テーブル演算器801は、テーブル参照回路901、指数計算回路902、フォーマット回路903、セレクタ904、及び例外検出回路905を有する。テーブル参照回路901は、入力されるレジスタ803に保持されたオペランドOP1の仮数部の値をインデックスとしてテーブルを参照し、オペランドOP1の逆数の仮数部を出力する。
【0056】
指数計算回路902は、例えば
図9(B)に示すように構成され、入力されるオペランドOP1の指数部OP1E及び非正規化数処理用回路802からの信号SG11に基づいて、オペランドOP1の逆数の指数部OUTEを計算して出力する。信号SG11は、オペランドOP1の指数部の値が負であることを示す信号である。指数計算回路902は、信号SG11を指数部の符号ビットとして(2×bias−1)と指数部OP1Eとの減算を減算器911で行い、演算結果を逆数の指数部OUTEとして出力する。
【0057】
フォーマット回路903は、指数計算回路902の出力及びテーブル参照回路901の出力から演算結果の指数部及び仮数部を成形して出力する。セレクタ904は、フォーマット回路903の出力又は例外検出回路905の出力を、浮動小数点逆数テーブル演算器801での演算結果SG13として出力する。例外検出回路905は、IEEE754−2008で定められた例外を検出する。
【0058】
非正規化数処理用回路802は、入力されるレジスタ803に保持されたオペランドOP1が非正規化数である場合、非正規化数を正規化する。非正規化数処理用回路802は、オペランドOP1が非正規化数である場合、正規化したオペランドOP1の指数部の値が負であることを示す信号SG11を出力するとともに、オペランドOP1を正規化した演算結果SG12を出力する。
図10に非正規化数処理用回路802の構成例を示す。
【0059】
図10は、非正規化数処理用回路802の構成例を示す図である。非正規化数処理用回路802は、制御回路1001、非正規化数検出回路1002、リーディングゼロカウンタ(LZC:Leading Zero Counter)回路1003、左シフタ回路1004、指数計算回路1005、フォーマット回路1006、及びセレクタ1007を有する。制御回路1001は、非正規化数処理モードであることを示す命令制御部110からの信号SG2に基づいて、セレクタ804の選択制御信号SG8を出力する。
【0060】
非正規化数検出回路1002は、入力されるレジスタ803に保持されたオペランドOP1が非正規化数であるか否かを判定し、判定結果をセレクタ1007の選択制御信号として出力する。LZC回路1003は、入力されるオペランドOP1の仮数部の先頭の連続する0の数を計数する。左シフタ回路1004は、LZC回路1003で計数された0の数に応じて、オペランドOP1の仮数部を左シフトする。指数計算回路1005は、LZC回路1003で計数された0の数をオペランドOP1の指数部から減算する。これにより、非正規化数であるオペランドOP1を正規化する。また、正規化された非正規化数の指数部の値は0より小さい値となるため、指数計算回路1005は、指数部が負の値であることを示す信号SG11を出力する。
【0061】
フォーマット回路1006は、指数計算回路1005の出力及び左シフタ回路1004の出力から正規化した非正規化数の指数部及び仮数部を成形して出力する。セレクタ1007は、入力されるオペランドOP1が非正規化数である場合、フォーマット回路1006の出力を演算結果SG12として出力し、入力されるオペランドOP1が非正規化数でない場合、オペランドOP1をそのまま演算結果SG12として出力する。
【0062】
レジスタ805は、浮動小数点逆数テーブル演算器801から出力される演算結果SG13を格納する。レジスタ805に格納された演算結果SG13は、リオーダバッファ124に格納される。例外判定部
806は、浮動小数点逆数テーブル演算器801からの出力に基づいて例外が発生したかを判定し、例外が発生した場合に命令制御部110に通知する。
【0063】
第2の実施形態において、命令制御部110からの命令に応じて演算実行部120が浮動小数点逆数テーブル演算器801を用いる命令を実行する際、入力データにおける非正規化数の検出を行う。入力データにおいて非正規化数が検出されない場合、演算実行部120は、浮動小数点逆数テーブル演算器801を用いて通常の演算処理を行い演算結果SG13を出力する。
【0064】
一方、入力データにおいて非正規化数が検出された場合、命令制御部110に信号SG1を出力する。そして、非正規化数が検出された命令が命令制御部110でコミット処理(完了処理)される際に、信号SG1を基にCPU100が非正規化数処理モードへと遷移する。非正規化数処理モード中、命令制御部110は各演算器に非正規化数処理モードであることを示す信号SG2を出力する。また、非正規化数処理モードでは、以下のようにして、非正規化数が検出された命令を演算実行部120で再実行する。
【0065】
非正規化数処理モードに遷移すると、命令制御部110のエントリバッファ及び演算実行部120のリオーダバッファ124の値を破棄する。また、実行中の後続命令も破棄した上で、後続命令の実行を抑止する1命令モードとして動作し、非正規化数が検出された命令を実行する。
【0066】
演算実行部120の非正規化数処理用回路802は、入力されたオペランドOP1が非正規化数であるか否かを判定する。入力されたオペランドOP1が非正規化数である場合、仮数部の先頭に連続する0の数をLZC(Leading Zero Count)回路1003において決定する。その数に応じてオペランドOP1の仮数部を左シフタ回路1004により左シフトし、指数部を指数計算回路1005により減算することで、非正規化数のオペランドOP1を正規化する。正規化された非正規化数の指数部の値は0より小さい値となるため、指数部の値が負であることを浮動小数点数逆数テーブル演算器801に報告する信号SG11を生成して出力する。
【0067】
このようにして浮動小数点逆数テーブル演算器801に、非正規化数処理用回路802からの信号SG11が入力され、加えて非正規化数処理用回路802の演算結果SG12が入力される。ここで、非正規化数処理用回路802の演算結果SG12を浮動小数点逆数テーブル演算器801へ入力するためのデータバイパスは、通常の演算時にも使用されるパスであり、本実施形態の適用に際しハードウェアの追加は不要である。また、通常、レジスタ803にどのデータパスからのデータを格納するかは命令制御部110により指示されるが、非正規化数処理モードでは、非正規化数処理用回路802が選択制御信号SG8を用いて決定する。
【0068】
浮動小数点逆数テーブル演算器801での仮数部の計算は、入力されるオペランドOP1が正規化数である場合と同様に行い、指数部の計算は、信号SG11を指数部の符号ビットとして計算する。このようにして浮動小数点逆数テーブル演算器801が演算結果SG13を出力して浮動小数点逆数テーブル演算器801による演算が終了し、非正規化数が検出された命令がコミットされた後に、CPU100は、非正規化数処理モードから通常の処理モードへ遷移して、後続命令の実行を開始する。
【0069】
第2の実施形態によれば、入力データが非正規化数である場合に、入力データを正規化して処理することで、正規化数だけの演算のレイテンシを悪化させることなく、非正規化数をハードウェアにより制御を複雑化させずに高速に処理することができる。
【0070】
(第3の実施形態)
次に、本発明の第3の実施形態について説明する。第3の実施形態における情報処理装置としてのCPUの全体構成や命令実行等は、第1の実施形態と同様であるので、その説明は省略する。第3の実施形態における演算実行部120は、
図3に示した第1の実施形態における浮動小数点積和演算器301を複数設け、SIMD演算を行う。
【0071】
図11は、第3の実施形態における演算実行部120の構成例を示す図である。
図11においては、2並列のSIMD演算器を一例として示しているが、これに限定されるものではなく、n個の浮動小数点積和演算器301を用いることでn並列のSIMD演算器を実現することが可能である。
【0072】
図11において、
図1、
図3に示した構成要素と同一の機能を有する構成要素には同一の符号を付し、重複する説明は省略する。また、
図11において、各浮動小数点積和演算器301に係る構成については符号に異なる添え字を付加し、第1の浮動小数点積和演算器301Aに係る構成には符号に添え字Aを付加し、第2の浮動小数点積和演算器301Bに係る構成には符号に添え字Bを付加して示している。
【0073】
第3の実施形態における演算実行部120は、処理回路1101により非正規化数の処理を行う。処理回路1101は、非正規化数処理用回路302及び制御回路1102を有する。制御回路1102は、
図12に示すように選択制御回路1201、セレクタ1202、1203、1204、及びレジスタ1205A、1205B、1206A、1206B、1207A、1207Bを有する。
【0074】
選択制御回路1201は、セレクタ1202、1203、1204を制御する。セレクタ1202には、レジスタ303Aに保持されたオペランドOP1(OPA)がレジスタ1205Aを介して入力され、レジスタ303Bに保持されたオペランドOP1(OPB)がレジスタ1205Bを介して入力される。セレクタ1203には、第1の浮動小数点積和演算器301Aからの信号SG5Aがレジスタ1206Aを介して入力され、第2の浮動小数点積和演算器301Bからの信号SG5Bがレジスタ1206Bを介して入力される。また、セレクタ1204には、第1の浮動小数点積和演算器301Aからの信号SG6Aがレジスタ1207Aを介して入力され、第2の浮動小数点積和演算器301Bからの信号SG6Bがレジスタ1207Bを介して入力される。
【0075】
セレクタ1202、1203、1204は、選択制御回路1201からの選択制御信号に対応する浮動小数点積和演算器301に係るオペランド及び信号を選択して非正規化数処理用回路302に出力する。すなわち、例えば選択制御回路1201からの選択制御信号により第1の浮動小数点積和演算器301Aに係るオペランド及び信号を出力するよう指示された場合、セレクタ1202、1203、1204は、オペランドOPA、信号SG5A、SG6Aをそれぞれ選択して非正規化数処理用回路302に出力する。また、例えば選択制御回路1201からの選択制御信号により第2の浮動小数点積和演算器301Bに係るオペランド及び信号を出力するよう指示された場合、セレクタ1202、1203、1204は、オペランドOPB、信号SG5B、SG6Bをそれぞれ選択して非正規化数処理用回路302に出力する。
【0076】
命令制御部110からの命令に応じて演算実行部120が浮動小数点積和演算器301A、301Bを用いるSIMD命令を実行する際、浮動小数点積和演算器301A、301Bの非正規化数検出回路404が、入出力データにおける非正規化数の検出を行う。何れの浮動小数点積和演算器301A、301Bでも入出力データにおいて非正規化数が検出されない場合、演算実行部120は、浮動小数点積和演算器301A、301Bを用いて通常の演算処理を行い演算結果SG7A、SG7Bを出力する。
【0077】
入出力データにおいて非正規化数が検出された浮動小数点積和演算器301(301A、301B)は、命令制御部110に信号SG1(SG1A、SG1B)を出力する。そして、非正規化数が検出されたSIMD命令が命令制御部110でコミット処理(完了処理)される際に、非正規化数が検出された浮動小数点積和演算器301(301A、301B)が1つでもある場合、信号SG1(SG1A、SG1B)を基にCPU100が非正規化数処理モードへと遷移する。非正規化数処理モード中、命令制御部110は各演算器に非正規化数処理モードであることを示す信号SG2を出力する。また、非正規化数処理モードでは、以下のようにして、非正規化数が検出されたSIMD命令を演算実行部120で再実行する。
【0078】
非正規化数処理モードに遷移すると、命令制御部110のエントリバッファ及び演算実行部120のリオーダバッファ124の値を破棄する。また、実行中の後続命令も破棄した上で、後続命令の実行を抑止する1命令モードとして動作し、非正規化数が検出されたSIMD命令を実行する。
【0079】
演算実行部120の浮動小数点積和演算器301A、301Bは、非正規化数が検出されたSIMD命令の演算を開始する。選択制御回路1201による制御によって各浮動小数点積和演算器301(301A、301B)の非正規化数用処理を順番に開始する。選択制御回路1201は、例えばカウンタとして実装することで各浮動小数点積和演算器301(301A、301B)に対する値を順番に選択することが可能である。本実施形態では非正規化数処理用回路302を1つだけ設けているが、複数設けることにより並列処理を行ってもよい。演算方法は、第1の実施形態と同様である。ここで、非正規化数処理モードにおいてSIMD命令の演算を行う場合、例外としてアンダーフロー、不正確に加え、オーバーフローが発生する可能性がある。したがって、丸めにより発生するオーバーフローを含めた3つの例外が、先に検出された浮動小数点積和演算器での例外と論理和を取ることでマージされる。
【0080】
非正規化数処理用回路302による演算が終了し、非正規化数が検出された命令がコミットされた後に、CPU100は、非正規化数処理モードから通常の処理モードへ遷移して、後続命令の実行を開始する。
【0081】
第3の実施形態によれば、第1の実施形態と同様に、演算処理において非正規化数が検出された場合、命令のコミット処理(完了処理)を行う際に、非正規化数が検出された命令を再実行させることで、正規化数だけの演算のレイテンシを悪化させることなく、非正規化数をハードウェアにより制御を複雑化させずに高速に処理することができる。
【0082】
なお、前述した説明では、演算に用いる浮動小数点形式は、倍精度及び単精度を一例として説明したが、それらに限定されるものではない。また、資源(リソース)を追加することにより、64ビットに単精度浮動小数点数を並べ、同時に処理する単精度のデュアル処理も可能である。また、前述した各実施形態では、1種類の演算器に対する非正規化数処理の例を示しているが、それらの実施形態を合わせて適用することにより複数種の演算器に対しても非正規化数処理モードを追加することが可能である。
【0083】
また、前記実施形態は、何れも本発明を実施するにあたっての具体化のほんの一例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、またはその主要な特徴から逸脱することなく、様々な形で実施することができる。