(57)【特許請求の範囲】
【請求項１】
乱数を生成する乱数生成部と、
丸め対象数が配置される所定位置及び出力データの小数点位置情報を基に、前記乱数の先頭が前記丸め対象数の丸め位置に一致するように前記乱数の位置を移動する乱数移動部と、
前記乱数移動部により移動された前記乱数と前記所定位置に配置された前記丸め対象数とを加算する加算部と、
前記加算部による加算結果における前記丸め位置から所定桁の有効数字を含む所定範囲のデータを前記出力データとして出力する出力部と
を備えたことを特徴とする演算処理装置。
【請求項２】
前記加算部による加算結果における前記丸め位置から前記所定桁の前記有効数字が、予め決められた所定桁の出力位置に一致するように移動する移動部をさらに備え、
前記出力部は、前記丸め位置から前記所定桁の前記有効数字が前記出力位置に一致するように移動された前記加算結果の前記出力位置以外の値を破棄して出力する
ことを特徴とする請求項１に記載の演算処理装置。
【請求項３】
前記丸め対象数が配置される位置及び前記出力データの小数点位置情報を基に、前記乱数の先頭を前記丸め対象数の前記丸め位置に一致させるための２の冪乗数を求める冪乗数生成部をさらに備え、
前記乱数生成部は、２進数で表される乱数を生成し
前記乱数移動部は、前記冪乗数生成部により求められた前記冪乗数を前記乱数に乗算することで前記乱数の位置を移動する
ことを特徴とする請求項１に記載の演算処理装置。
【請求項４】
前記乱数移動部は、２つの入力データを乗算して浮動小数点演算を行い、
前記加算部は、前記乱数移動部による乗算結果に対して入力されたデータを加算して浮動小数点演算を行う
ことを特徴とする請求項１に記載の演算処理装置。
【請求項５】
乱数を生成し、
丸め対象数が配置される所定位置及び出力データの小数点位置情報を基に、前記乱数の先頭が前記丸め対象数の丸め位置に一致するように前記乱数の位置を移動し、
移動した前記乱数と前記所定位置に配置された前記丸め対象数とを加算し、
加算結果の前記丸め位置から所定桁の有効数字を含むデータを前記出力データとして出力する
ことを特徴とする演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
昨今重要性を増す深層学習（Deep  Learning）は、計算量やメモリ消費量が莫大である。計算量やメモリ消費量が増加すると、計算負荷及びメモリ負荷などが増加し、学習時間が長くなる。そこで、計算量やメモリ消費量を削減して学習時間を短縮するため、学習及び推論能力を維持しつつ、できる限り低い精度で計算を行う手法を用いることが望ましい。このような手法においては、固定小数点を用いた演算が行われることが多い。【０００３】
ただし、低精度で計算を行う場合に挙げられる問題として、演算結果を丸めた値が、低精度ではある決まった値に偏り易くなる。丸めた値が偏ると、その時点から学習が進みにくくなるという問題が存在する。【０００４】
そのような低精度における値の偏りを解消するために、確率的丸めを導入した従来技術がある。これは、丸める前の計算結果の丸めようとする桁より下位の値に応じた確率で、丸め値を丸め桁で打ち切った（truncated）値にするか、その値に１を加算した値にするかを選択して、丸め結果がとる期待値と丸め前の値とを同等にする技術である。例えば、演算結果１．８を整数に丸める場合、確率的丸めを用いると、丸め結果として８０％の確率で２が得られ、２０％の確率で１が得られる。これにより、丸め結果の期待値は、丸め前の値と同じ１．８となる。【０００５】
ここで、深層学習においては、行列の要素に対し積和累積演算が多用される。積和累積演算とは、Ｃ’＝Ｃ＋Ａ×Ｂの形の演算であり、ある時点までの計算結果に次の要素の積を累積していく演算である。このとき累積演算を継続する間、累積結果は、乗算への入力数よりかなり高い精度を有する値で保持されることが一般的である。例えば、上述の式における乗算への入力数であるＡ及びＢが１６ビット幅であるとき、乗算結果であるＡ×Ｂは、３２ビットとなる。このとき乗算結果の累積を格納する累積レジスタについては、３２ビットの値の累積結果を格納する大きさを有することが好ましく、例えば、４０ビット幅とされるような場合がある。【０００６】
以上のことから、乗算結果を丸めた場合、精度の低下が大きくなるおそれがある。そこで、深層学習を実行するハードウェアにおいては、乗算への入力数よりもビット数が多い積和累積演算の結果に対し、確率的丸めを行い低精度にした結果を出力するという処理が行われることが望ましい。【０００７】
丸めを行う際、丸めにより捨てられることになる下位桁に、何らかの数を加算することで所望する場合に繰り上がりを発生させ、丸め位置により上位桁に所望の丸め結果を得るという手法が存在する。この手法は確率的丸めにおいても有効である。そこで、積和演算器内の加算回路を活用して下位桁に加算を行うことで確率的丸めを行う従来技術が提案されている。また、ランダムノイズ回路からの出力をデータの端数部に加算して丸め処理を実行する従来技術がある。さらに、累積レジスタの丸めを行う装置として、丸め回路が、乱数生成器から値を受け取り丸めの判断に用いる従来技術がある。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】米国特許出願公開第２０１７／０２２０３４１号明細書
【特許文献２】米国特許出願公開第２０１７／０１０２９２０号明細書
【特許文献３】特開平０３−６３７２２号公報
【特許文献４】特表２００４−５０６３６５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、確率的丸めに積和演算器内の加算回路を用いる従来技術では、乗算結果に対する丸めが行われる。先に述べたとおり、一般には、乗算結果への入力値のビット幅は、乗算結果の累積レジスタのビット幅よりはるかに狭い。そのため、乗算結果の丸めにより累積レジスタの値を低精度に丸めることは、丸め値が不適切な値になるおそれがある。また、丸め回路に乱数生成器から取得した値を用いて丸めを判断させる従来技術では、丸め回路への大規模な改造が加えられる。丸め回路による丸め処理は浮動小数点演算のクリティカルパスを有する。そのため、丸め回路に対して確率的丸めを行うための規模の大きな改造を加えた場合、既存演算のクリティカルパスのディレイ悪化要因となるおそれがある。すなわち、浮動小数点積和演算器に大規模な改造を加えることは困難である。【００１０】
開示の技術は、上記に鑑みてなされたものであって、簡易な構成で適切な確率的丸めを実行する演算処理装置及び演算処理装置の制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
本願の開示する演算処理装置及び演算処理装置の制御方法は、一つの態様において、乱数生成部は、乱数を生成する。乱数移動部は、丸め対象数が配置される位置及び出力データの小数点位置情報を基に、前記乱数の先頭が前記丸め対象数の丸め位置に一致するように前記乱数の位置を移動する。加算部は、前記乱数移動部により移動された前記乱数と前記所定位置に配置された前記丸め対象数とを加算する。出力部は、前記加算部による加算結果における前記丸め位置から所定桁の有効数字を含む所定範囲のデータを前記出力データとして出力する。
【発明の効果】
【００１２】
１つの側面では、本発明は、簡易な構成で適切な確率的丸めを実行することができる。
【図面の簡単な説明】
【００１３】
【図１】図１は、情報処理装置の全体構成図を示す図である。
【図２】図２は、積和演算器の回路図である。
【図３】図３は、実施例に係る積和演算器による確率的丸め処理の計算の概要を表す図である。
【図４】図４は、乱数の桁合わせシフトを説明するための図である。
【図５】図５は、正規化シフタによる加算値の位置合わせを説明するための図である。
【図６】図６は、確率的丸め処理についての具体例を表す図である。
【図７】図７は、積和演算部が実行する処理全体のフローチャートである。
【図８】図８は、実施例に係る積和演算器による確率的丸め処理のフローチャートである。
【発明を実施するための形態】
【００１４】
以下に、本願の開示する演算処理装置及び演算処理装置の制御方法の実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する演算処理装置及び演算処理装置の制御方法が限定されるものではない。
【実施例】
【００１５】
図１は、情報処理装置の全体構成図である。情報処理装置５０は、ＰＣＩ（Peripheral  Component  Interconnect）カード１及びホストコンピュータ２を有する。ＰＣＩカード１とホストコンピュータ２とはＰＣＩバスで接続され、互いにデータの送受信を行う。【００１６】
ホストコンピュータ２は、例えば、深層学習を実行する際の全体的な管理を行う。深層学習を実行する場合、ホストコンピュータ２は、ＰＣＩカード１に対して畳み込み演算などの深層学習における所定の演算の実行を指示する。【００１７】
ＰＣＩカード１は、ホストコンピュータ２からの指示を受けて演算を実行し、演算結果をホストコンピュータ２に出力する。ＰＣＩカード１は、図１に示すように、複数の処理ユニット１０、全体命令制御部１１、メモリコントローラ１２、メモリ１３及びＰＣＩ制御部１４を有する。このＰＣＩカード１が、「演算処理装置」の一例にあたる。【００１８】
ＰＣＩ制御部１４は、演算の実行を指示する演算命令や演算で使用する演算データの入力をホストコンピュータ２から受ける。そして、ＰＣＩ制御部１４は、取得した演算命令や演算データをメモリコントローラ１２へ出力する。【００１９】
また、ＰＣＩ制御部１４は、指示された演算に対する演算結果の入力をメモリコントローラ１２から受ける。そして、ＰＣＩ制御部１４は、演算結果をホストコンピュータ２へ出力する。具体的には、ＰＣＩ制御部１４は、メモリコントローラ１２に、メモリ１３内の演算結果を読み出す指示を出し、読み出したデータを、自信を経由させてホストコンピュータ２へ出力させる。【００２０】
メモリコントローラ１２は、演算命令や演算で使用する演算データの入力をＰＣＩ制御部１４から受ける。そして、メモリコントローラ１２は、取得した演算命令及び演算データをメモリ１３へ格納する。【００２１】
また、メモリコントローラ１２は、演算を実行する際に用いる演算データのベクタレジスタ１１１への格納の指示を全体命令制御部１１から受ける。そして、メモリコントローラ１２は、指定された演算データを指定されたベクタレジスタ１１１へ格納する。ここで、メモリコントローラ１２は、直列に並んだ処理ユニット１０のうちの後段の処理ユニット１０に対してデータを送信する場合、積和演算部１００を迂回させてマルチプレクサ１０３へ演算データを出力する。【００２２】
また、全体命令制御部１１は、演算が完了すると、演算完了の通知を全体命令制御部１１から受けるとともに、所定の命令によりメモリコントローラ１２に指示することで、ベクタレジスタ１１１内の演算結果を直列に並んだ処理ユニット１０のチェーン（連鎖）か引き出し、メモリ１３に格納させる。【００２３】
全体命令制御部１１は、ホストコンピュータ２から実行が指示された演算の全体の統括管理を行う。全体命令制御部１１は、ホストコンピュータ２からの指示をＰＣＩ制御部１４経由で受け、メモリ１３に格納された全体命令列を次々と読んでは実行する。全体命令には、メモリ１３から演算命令バッファ１０２に演算命令列を転送する命令、メモリ１３から演算データをベクタレジスタ１１１に格納する命令、演算命令バッファ１０２に格納された演算命令列を演算命令制御部１０１に実行開始させる命令、ベクタレジスタ１１１に格納された演算結果をメモリ１３に格納する命令、命令列の実行を終了する命令などがある。【００２４】
全体命令制御部１１は、演算命令列を処理ユニット１０に実行させる。演算を処理ユニットに実行させる場合、全体命令制御部１１は、演算を実行する際に用いる演算データの取得をメモリコントローラ１２に指示する。また、処理ユニット１０における演算が完了すると、全体命令制御部１１は、演算結果の格納をメモリコントローラ１２に指示する。さらに、実行が指示された演算の全ての処理が完了すると、全体命令制御部１１は、演算完了をメモリコントローラ１２へ通知する。【００２５】
次に、処理ユニット１０について説明する。処理ユニット１０は、図１に示すように１つのＰＣＩカード１に複数搭載される。各処理ユニット１０は、並列及び直列に複数接続される。処理ユニット１０の数は、ある太陽においては１２８個である。処理ユニット１０は、積和演算部１００、演算命令制御部１０１、演算命令バッファ１０２及びマルチプレクサ１０３を有する。【００２６】
演算命令制御部１０１は、演算命令の実行処理を管理制御する。演算命令制御部１０１は、演算命令列の実行の指示を全体命令制御部１１から受ける。ここで、処理ユニット１０で実行できる命令を、全体命令と対比させて演算命令と呼んでいるが、命令には、積和演算部に演算を行わせる狭義の演算命令のほか、汎用レジスタ（図示しない）の操作命令、分岐命令、繰り返し命令、命令列の実行を停止する命令などが含まれる。【００２７】
そして、演算命令制御部１０１は、演算命令バッファ１０２に格納された演算命令を順次取得する。次に、演算命令制御部１０１は、取得した演算命令で指定された演算データの出力をベクタレジスタ１１１に指示する。また、演算命令制御部１０１は、取得した演算命令にしたがい、積和演算器１１２に演算実行の指示を積和演算器１１２へ出力する。その後、演算命令制御部１０１は、積和演算器１１２内で演算結果を用いた演算をループさせる。【００２８】
そして、演算が完了すると、演算命令制御部１０１は、確率的丸め処理の実行の指示とともに、累積レジスタの第何ビットを出力の小数点位置とするかを示す情報である小数点位置情報を積和演算器１１２へ出力する。小数点位置情報は、ニューラルネットワークにおける各層の重みパラメータを、演算可能なビット幅の範囲でできるだけ有効な値に保つように学習結果から算出される小数点位置を表す。この値は深層学習のプログラムを実行していく過程で決まる値であり、情報処理装置５０にとっては可変の値である。その後、メモリコントローラ１２からの指示があると、ベクタレジスタ１１１に格納された確率的丸め処理が施された演算結果は、処理ユニットのチェーンとメモリコントローラ１２を経由してメモリ１３に格納される。【００２９】
演算命令制御部１０１は、例えば、ＶＥＣＴＯＲ．ｈ．ａｃｃｓｔｒｎｄ  ＥＬＥ＃，ＱＮＵＭ，ＤＳＴ＃といった命令を発行する。ここで、ＱＮＵＭは、小数点位置情報を表す。また、ＥＬＥ＃は、積和演算器１１２内に複数要素のレジスタがある場合に、どの要素を確率的丸め対象とするかを示す番号である。ＤＳＴ＃は、確率的丸めの結果を格納するレジスタの番号を表す。この命令が実行されると、ＥＬＥ＃で指定された固定小数点累積レジスタの要素のＱＮＵＭに応じたビット範囲について、指定範囲よりも下位の値に基づく確率的丸めが行われ、その結果が固定小数点値をＤＳＴ＃で指定されたレジスタに格納される。【００３０】
演算命令バッファ１０２は、演算命令列を格納する記憶領域である。演算命令バッファ１０２は、メモリコントローラ１２から入力された演算命令列を指示されたアドレスから入力順に格納する。その後、演算命令制御部１０１からの演算命令の取得要求を受けて、演算命令バッファ１０２は、演算命令制御部１０１に要求されたアドレスの演算命令を出力する。【００３１】
積和演算部１００は、ベクタレジスタ１１１及び積和演算器１１２を有する。ただし、積和演算部１００が有するベクタレジスタ１１１は、処理ユニット１０に搭載されたベクタレジスタ全体の一部にあたる。【００３２】
ベクタレジスタ１１１は、演算を実行する際に用いる演算データの入力をメモリコントローラ１２から受けて、入力された演算データを格納する。その後、ベクタレジスタ１１１は、演算命令制御部１０１からの指示を受けて、演算で使用する演算データを積和演算器１１２に出力する。また、積和累積演算の場合、積和演算器１１２による演算のループ処理が完了後、ベクタレジスタ１１１は、確率的丸め処理が施された演算結果の入力を積和演算器１１２から受ける。そして、メモリ１３への出力の指示をメモリコントローラ１２から受けると、ベクタレジスタ１１１は、保持する確率的丸め処理が施された積和演算器１１２の演算結果をマルチプレクサ１０３へ出力する。【００３３】
積和演算器１１２は、演算命令制御部１０１からの演算実行の指示を受ける。そして、積和演算器１１２は、ベクタレジスタ１１１から入力された演算データを用いて積和演算を実行する。その後、積和演算器１１２は、演算結果をベクタレジスタ１１１へ出力する。命令により累積を指示された場合は、積和演算器１１２は、累積演算結果を演算器内のレジスタ（アキュムレータ）に保持し、後続の累積演算命令で使用する。積和演算器１１２は、積和累積演算が完了するまでベクタレジスタ１１１から入力された値に対する積和演算を繰返す。【００３４】
その後、積和累積演算のループ処理が終了すると、積和演算器１１２は、確率的丸め処理の実行の指示を演算命令制御部１０１から受ける。そのとき、積和演算器１１２は、小数点位置情報の入力を演算命令制御部１０１から受ける。そして、積和演算器１１２は、内部のレジスタに保持している、ループ処理が完了した演算結果を確率的丸め対象数として、積和演算を行う回路を用いて確率的丸め対象数に対する確率的丸め処理を実行する。その後、積和演算器１１２は、確率的丸め処理を施した演算結果をベクタレジスタ１１１へ出力し、格納させる。【００３５】
ここで、図２を参照して、積和演算器１１２の確率的丸めを行う機能について詳細に説明する。図２は、積和演算器の回路図である。【００３６】
積和演算器１１２は、乱数生成回路１２１、冪乗数生成部１２２、マルチプレクサ１２３及び１２４、乗算器１２５、指数符号演算部１２６、桁合シフタ１２７、マルチプレクサ１２８、加算器１２９を有する。さらに、積和演算器１１２は、固定小数点レジスタ１３０、桁落量予測部１３１、シフト量算出部１３２、マルチプレクサ１３３、正規化シフタ１３４及び丸め回路１３５を有する。ここで、積和演算器１１２は、畳み込みなどのホストコンピュータ２が要求した実際の演算処理と、演算結果の確率的丸め値を算出する処理との２つの処理を行う。そこで、実際の演算処理を実演算といい、演算結果の確率的丸め値を算出する処理を確率的丸め処理という。【００３７】
実演算における各部の動作を説明する。実演算の場合、マルチプレクサ１２４は、乗算を行う一方の演算データの入力を受ける。また、マルチプレクサ１２３は、乗算を行う他方の演算データの入力を受ける。この場合、マルチプレクサ１２３及び１２４は、演算データを乗算器１２５へ出力する。乗算器１２５は、マルチプレクサ１２３及び１２４から入力された２つの演算データを乗算する。そして、乗算器１２５は、乗算結果を加算器１２９へ出力する。【００３８】
一方、指数符号演算部１２６は、実演算に用いる３つの演算データの入力をベクタレジスタ１１１から受ける。そして、指数符号演算部１２６は、演算命令が浮動小数点の積和演算である場合に、積と加数の仮数どうしを桁合わせするためのシフト量を算出する。固定小数点演算命令の場合は、指数符号演算部１２６は、桁合わせするためシフト量を算出する。固定小数点演算命令の場合は、指数符号演算部１２６は、乗算結果の桁に加数の桁が合うようハードウェアにあらかじめ組み込まれた定数を桁合シフタのシフト量とする。また、指数符号演算部１２６は、演算結果の符号を算出する。そして、指数符号演算部１２６は、マルチプレクサ１２３及び１２４に入力された演算データ以外の残りの演算データ及びその演算データ（加数）と乗算器１２５の乗算結果とを桁合わせするためのシフト量を桁合シフタ１２７へ出力する。【００３９】
また、指数符号演算部１２６は、演算命令が浮動小数点の積和演算である場合、桁落ち量の予測結果の入力を桁落量予測部１３１から受ける。そして、指数符号演算部１２６は、取得した桁落ち量から、演算結果の仮数の正規化に用いる左シフト量を算出する。仮数の正規化とは、仮数の最上位桁が１になるように仮数全体のビット位置を調整（シフト）させることである。その後、指数符号演算部１２６は、算出した左シフト量をマルチプレクサ１３３へ出力する。【００４０】
桁落量予測部１３１が求める桁落ち量は、回路構成により、本当の桁落ち量から、決まった範囲内の誤差を含む場合がある。正規化シフタ１３４で、指定された量のシフトをおこなった結果が、仮数の正規化が正しくなされているか否かを見ることで、予測した桁落ち量の誤差の有無を知ることができる。正規化シフタ１３４は、桁落ち量に誤差があったと分かった場合、調整のための追加のシフトをおこなうとともに、指数符号演算部に、予測に誤差があったことを通知する。指数符号演算部１２６は、正規化シフタ１３４から誤差あり通知を受けた場合、誤差調整のための追加シフトを考慮に入れた指数を算出する。これに対して、正規化シフタ１３４から誤差あり通知を受けない場合、指数符号演算部１２６は、追加シフトのない場合の指数を算出する。また、指数符号演算部１２６は、仮数の丸めで桁上がりが発生した場合、丸め回路１３５から通知を受け、指数を調整する。指数符号演算部１２６は、最終的に求まった符号と指数を出力し、これを後述する丸め回路１３５から出力される仮数の丸め結果と連接することで、浮動小数点演算結果が完成する。演算結果は、ベクタレジスタ１１１に出力される。【００４１】
桁合シフタ１２７は、指数符号演算部１２６から指定されたシフト量だけ、指数符号演算部１２６から入力された演算データをシフトさせる。そして、桁合わせを行った演算データをマルチプレクサ１２８へ出力する。【００４２】
マルチプレクサ１２８は、浮動小数点の実演算の場合、桁合シフタ１２７からの入力を選択する。固定小数点の累積演算で、累積途中の場合、加算対象の数は桁合わせの必要はないので、固定小数点レジスタ１３０からの入力を選択する。固定小数点の累積演算で、累積の初回の場合は、ベクタレジスタ１１１から積和演算器１１２に入力された数を加数として選択するため、桁合シフタ１２７からの入力を選択する。そして、マルチプレクサ１２８は、桁合シフタ１２７からの入力された演算データを加算器１２９へ出力する。【００４３】
加算器１２９は、２つの演算データの乗算結果の入力を乗算器１２５から受ける。また、加算器１２９は、桁合わせされた残りの演算データ（加数）の入力をマルチプレクサ１２８から受ける。そして、加算器１２９は、２つの演算データの乗算結果と桁合わせされた残りの演算データ（加数）を加算する。そして、加算器１２９は、加算結果を正規化シフタ１３４及び桁落量予測部１３１へ出力する。ここで、実際には加算器１２９は加算結果信号及び桁上げ信号の２つの数を用いて、桁上げ保存加算と桁上げ伝搬加算という２段階の加算を行うが、本実施例では、この２段階の加算をまとめたものを単に加算とよぶ。そして、実際には、加算器１２９は、桁上げ保存加算の結果を桁落量予測部１３１へ出力する。【００４４】
桁落量予測部１３１は、加算途中結果の入力を加算器１２９から受ける。そして、桁落量予測部１３１は、取得した加算途中結果から桁落ち量を予測する。その後、桁落量予測部１３１は、予測した桁落ち量を指数符号演算部１２６へ出力する。【００４５】
マルチプレクサ１３３は、実演算の場合、指数符号演算部１２６からの入力を選択する。そして、マルチプレクサ１３３は、指数符号演算部１２６から入力された左シフト量を正規化シフタ１３４へ出力する。【００４６】
正規化シフタ１３４は、加算結果の入力を加算器１２９から受ける。また、正規化シフタ１３４は、左シフト量の入力をマルチプレクサ１３３から受ける。そして、正規化シフタ１３４は、入力された左シフト量に合わせて加算結果を左シフトさせて出力される位置を合わせる。その後、正規化シフタ１３４は、左シフトさせた演算結果を丸め回路１３５へ出力する。ここで、左シフトによる位置合わせで桁落ち量の予測に誤差があったと判明した場合、正規化シフタ１３４は、誤差調整のための追加シフトを行うとともに、誤差あり通知を指数符号演算部１２６に送信する。【００４７】
丸め回路１３５は、演算結果の入力を正規化シフタ１３４から受ける。そして、丸め回路１３５は、所定の桁数における丸めを実行する。その後、丸め回路１３５は、所定の桁で丸められた演算結果をベクタレジスタ１１１へ出力する。【００４８】
次に、確率的丸め処理における各部の動作を説明する。確率的丸め処理の場合、乱数生成回路１２１が、ｎビットの一様乱数を生成する。そして、乱数生成回路１２１は、生成した乱数をマルチプレクサ１２３へ出力する。ここで、乱数生成回路１２１により生成される乱数は、真に一様な乱数でなくても、実用に耐え得る範囲の疑似乱数でよい。【００４９】
乱数生成回路１２１は、例えば、積和演算器１１２内に配置されたＬＦＳＲ（Linear  Feedback  Shift  Register）を利用する。例えば、ＬＦＳＲを用いる場合、本実施例では、確率的丸め命令を実行する毎にＬＦＳＲの内部状態が更新され、次の確率的丸め命令の発行時には、ＬＦＳＲは新しい乱数値を出力する。【００５０】
ただし、乱数生成回路１２１は、ＬＦＳＲに限らず、よりランダム性の高い疑似乱数発生回路でもよいし、環境の揺らぎからランダムビットを取得する回路でもよい。また、乱数生成回路１２１は、各積和演算器１１２に付随する回路であってもよいし、複数の積和演算器１１２で共有する回路であってもよい。この乱数生成回路１２１が、「乱数生成部」の一例にあたる。【００５１】
ここで、乱数のビット数の選び方について説明する。確率的に丸めを行う場合、最終的に確率的丸め対象数において丸め位置より下位にあるビットの値が捨てられる。例えば、乱数のビット数をｎとし、捨てられるビット数をｍとした場合、乱数が一様であれば、ｎがｍと同じもしくはそれ以上であれば、確率的丸め後の期待値を確率的丸め対象数と等しい値にすることができる。しかし、ｍが多い場合でも同様にｎ≧ｍの関係を維持しようとすると、演算するビット数が多くなり、それに応じて桁合わせや加算を行う回路が大きくなる。あまり回路が大きくなると、既存の積和演算器１１２のハードウェアでは、使用するビット数の演算回路が収納が困難となる。その場合、不足する部分について、確率的丸めのために演算回路を付加するなどの対処は回路量が増加するため好ましくない。【００５２】
そこで、ｎ≧ｍの関係を維持せず、ｎの方がｍより小さくてもよいとすれば、既存の積和演算器１１２に収納できるだけのビット数にｎをとどめておく方法が考えられる。その場合、捨てられるｍビットのうち、丸め位置から下位にｎビットよりさらに下位のビットについては、乱数との加算が行われず、丸め後の結果に寄与しないことになる。丸め後の期待値は、その分丸め前の値から乖離する。しかし、ｎを１増やすごとに期待値のずれは半分程度に縮小するため、ある程度以上にｎを大きくすれば、ｍが大きいことによるずれは十分小さくなり、実用上は問題にならない。そのため、ｎは実用上の要件と既存の演算回路量に応じて妥当な値が決定されることが好ましい。【００５３】
確率的丸め処理の場合、マルチプレクサ１２３は、乱数生成回路１２１から入力されたｎビットの一様乱数を選択する。そして、マルチプレクサ１２３は、ｎビットの一様乱数を乗算器１２５へ出力する。【００５４】
冪乗数生成部１２２は、確率的丸め命令の入力を演算命令制御部１０１から受ける。同時に、冪乗数生成部１２２は、確率的丸め命令に含まれるオペランドの小数点位置情報を取得する。そして、冪乗数生成部１２２は、小数点位置情報を用いて丸めたい位置に応じた２の冪乗数を生成する。ここで、丸めたい位置とは、その桁の１つ上の桁が有効数字の桁となる桁にあたる。その後、冪乗数生成部１２２は、生成した２の冪乗数をマルチプレクサ１２４へ出力する。【００５５】
確率的丸め処理の場合、マルチプレクサ１２４は、冪乗数生成部１２２から入力された２の冪乗数を選択する。そして、マルチプレクサ１２４は、２の冪乗数を乗算器１２５へ出力する。【００５６】
乗算器１２５は、ｎビットの一様乱数の入力をマルチプレクサ１２３から受ける。また、乗算器１２５は、丸めたい位置に応じた２の冪乗数の入力をマルチプレクサ１２４から受ける。そして、乗算器１２５は、取得した２の冪乗数を取得した乱数に乗算することで、乱数の先頭の桁を確率的丸め対象数における丸めたい位置に合わせる。【００５７】
ここで、図３を参照して、本実施例に係る積和演算器１１２による確率的丸め処理の計算の概要を説明する。図３は、実施例に係る積和演算器による確率的丸め処理の計算の概要を表す図である。確率的丸め対象数２００における位置Ｐは、丸め位置を表す。また、範囲Ｌは、演算結果として使用される範囲である。【００５８】
まず、乱数生成回路１２１により、ｎビットの一様乱数である乱数２０１が生成される。そして、乱数２０１は、乗算器１２５により、２の冪乗数が乗算され、乱数２０１の先頭が確率的丸め対象数２００の丸め位置Ｐに一致するように乱数２０１が左シフトされる。この時、乱数２０１は丸め位置から下位にｎビットの桁を有する乱数となる。【００５９】
ここで、図４を参照して、乱数の桁合わせシフトをさらに詳細に説明する。図４は、乱数の桁合わせシフトを説明するための図である。ここでは、乱数２０１が１２ビットの乱数で且つ小数点以下３ビットの乱数である場合で説明する。また、固定小数アキュムレータ２１１（確率的丸め対象数）の小数点位置が最下位ビットの直ぐ右である場合で説明する。【００６０】
乗算器１２５は、乱数２０１に２の冪数である２＾Ｅを乗算することで、乱数をシフトする。ここで、小数点位置情報をＱＮＵＭとして表し、Ｅ＝ＱＮＵＭ−９とする。ＱＮＵＭ＝０で、乱数の全桁が、固定小数アキュムレータ２１１の最下位ビットより下に埋没する。また、ＱＮＵＭ＝１２の時、乱数の最下位桁が固定小数アキュムレータ２１１の最下位に合う位置となる。この場合、位置Ｄが小数点位置を表す。【００６１】
図４において枠２１０は、単精度で２４ビット×２４ビットの乗算を行う乗算器１２５による乱数２０１のシフトを表す。図４において、１２ビット乱数２０１Ａが、ＱＮＵＭ＝０の場合の位置である。ここで、この場合の乗算器１２５の最下位桁は、１６ビットの固定小数で考えると２＾−８にあたる。ＱＮＵＭ＝０のときはＥ＝−９であり、乗算器１２５は２＾−９を乗算する処理を行うことになるが、乗算器１２５その桁の回路を有さない。しかし、ＱＮＵＭ＝０の場合、乱数全桁が固定小数アキュムレータ２１１の最下位ビットより下位に埋没し、丸めでは切り捨てとなるため、乱数を足さなくてもよい。そこで、ＱＮＵＭ＝０の場合、乗算器１２５は、乗算する値である２＾Ｅを０とする。【００６２】
ＱＮＵＭ＝１の場合、Ｅ＝−８となり、乗算器１２５は、１２ビット乱数２０１Ａに２＾−８を乗算して、１２ビット乱数２０１Ａをシフトさせて１２ビット乱数２０１Ｂとする。また、ＱＮＵＭ＝８の場合、Ｅ＝−１となり、乗算器１２５は、１２ビット乱数２０１に２＾−１を乗算して、１２ビット乱数２０１Ａをシフトさせて１２ビット乱数２０１Ｃとする。また、ＱＮＵＭ＝２４の場合、Ｅ＝１５となり、乗算器１２５は、１２ビット乱数２０１に２＾１５を乗算して、１２ビット乱数２０１Ａをシフトさせて１２ビット乱数２０１Ｄとする。【００６３】
すなわち、固定小数アキュムレータ２１１の最下位側の１６ビットであるデータ２１３を出力結果とする場合、ＱＮＵＭ＝０となる。また、固定小数アキュムレータ２１１の最上位側の１６ビットであるデータ２１２を出力結果とする場合、ＱＮＵＭ＝２４となる。すなわち、命令により与えられるＱＮＵＭにより、固定小数アキュムレータ２１１におけるどの位置の桁以上を有効数字とするかが決定される。そして、図４の場合、乗算器１２５は、０〜２４の間の値を採るＱＮＵＭから求められた２の冪乗数を乱数２０１に乗算することで、固定小数アキュムレータ２１１における有効数字の最下位の桁の１つ下の桁に乱数２０１の先頭の位置を合わせる。【００６４】
図２に戻って説明を続ける。乗算器１２５は、乗算結果である有効数字の最下位の桁の１つ下の桁に先頭の桁を合わせた乱数を加算器１２９へ出力する。この乗算器１２５が、「乱数移動部」の一例にあたる。【００６５】
固定小数点レジスタ１３０は、積和累積演算で用いられる累積レジスタ（アキュムレータ）である。固定小数点レジスタ１３０は、確率的丸めの対象となる確率的丸め対象数を格納する。確率的丸め対象数は、実演算において算出された算出結果である。累積演算では、累積レジスタの値に乗算結果を加算していくため、固定小数点レジスタ１３０は、累積レジスタの値をセットするのに十分なビット幅を有する。そして、確率的丸め処理の場合、固定小数点レジスタ１３０は、確率的丸め対象数をマルチプレクサ１２８へ出力する。【００６６】
確率的丸め処理の場合、マルチプレクサ１２８は、固定小数点レジスタ１３０から入力された確率的丸め対象数を選択する。そして、マルチプレクサ１２８は、確率的丸め対象数を加算器１２９へ出力する。【００６７】
加算器１２９は、有効数字の最下位の桁の１つ下の桁に先頭の桁を合わせた乱数の入力を乗算器１２５から受ける。また、加算器１２９は、確率的丸め対象数の入力をマルチプレクサ１２８から受ける。そして、加算器１２９は、確率的丸め対象数に乱数を加算する。これにより、確率的丸め対象数のうち乱数の先頭より下の桁の数に応じて確率的に繰り上げが行われる。すなわち、加算器１２９は、確率的丸め対象数に乱数を加算することで確率的丸めを行う。その後、加算器１２９は、加算結果を正規化シフタ１３４へ出力する。この加算器１２９が、「加算部」の一例にあたる。【００６８】
ここで、図３を参照して、加算器１２９による確率的丸めの処理をさらに説明する。確率的丸め対象数２００は、固定小数点レジスタ１３０から提供される。そして、範囲Ｌが丸め処理の結果として使用したい数値の範囲を表す。加算器１２９は、乗算器１２５により先頭位置が丸め位置であるＰにシフトされた乱数２０１を確率的丸め対象数２００に加算する。ここで、確率的丸め対象数２００の最下位桁が乱数２０１の最下位桁よりも高い場合、加算器１２９は、確率的丸め対象数２００に０の値のビットを付加して最下位桁を一致させた上で加算を行う。この加算により、丸め位置Ｐ以下の値に応じて確率的に桁上がりＭ１が発生した加算値２０２が得られる。【００６９】
ここで、桁上がりはおおよそ下の値に応じて確率的に発生する。これは、前述の通り乱数のビット数ｎの選び方によっては、確率的丸め結果の期待値が、丸め前の値からずれることがあり、そのずれ量はｎの値により異なる。本実施例では、既存の単精度浮動小数点用の積和演算器１１２に収納可能な乗加算ビット数と、深層学習の収束シミュレーションに基づいた実用性の判断によりｎ＝１２とした。この場合、丸め後の期待値のずれは、最大で０．０００２５程度である。ただし、乱数のビット数はこれに限らず、演算に期待される要件と、既存回路や許容できる追加回路量のバランスに応じて、１以上の任意の妥当なビット数が選択されることが好ましい。【００７０】
図２に戻って説明を続ける。シフト量算出部１３２は、小数点位置情報の入力を演算命令制御部１０１から受ける。そして、シフト量算出部１３２は、小数点位置情報に応じたシフト量を算出する。具体的には、シフト量算出部１３２は、加算器１２９から出力されるデータのうち有効とするデータが配置されている位置から、正規化シフタの出力における有効データの位置への移動に用いるシフト量を、ＱＮＵＭ算出する。その後、シフト量算出部１３２は、算出したシフト量をマルチプレクサ１３３へ出力する。【００７１】
確率的丸め処理の場合、マルチプレクサ１３３は、シフト量算出部１３２から入力されたシフト量を選択する。そして、マルチプレクサ１３３は、シフト量を正規化シフタ１３４へ出力する。【００７２】
正規化シフタ１３４は、確率的丸め処理が施された確率的丸め対象数の入力を加算器１２９から受ける。また、正規化シフタ１３４は、シフト量の入力をマルチプレクサ１３３から受ける。そして、正規化シフタ１３４は、確率的丸め対象数をシフト量に応じてシフトさせる。具体的には、正規化シフタ１３４は、入力された対象数のうち丸め位置のすぐ上の桁がちょうど積和演算器１１２から出力される有効な数の最下位桁に移動されるように左シフトをおこなう。正規化シフタ１３４は、左シフトを施した確率的丸め対象数を丸め回路１３５へ出力する。この正規化シフタ１３４が、「移動部」の一例にあたる。【００７３】
例えば、図３において、正規化シフタ１３４は、加算値２０２において演算結果として使用する範囲Ｌの最下位桁が出力されるデータの最下位桁に一致するように加算値２０２をシフトさせてシフト値２０３とする。【００７４】
ここで、図５を参照して正規化シフタ１３４による加算値の位置合わせについて説明する。図５は、正規化シフタによる加算値の位置合わせを説明するための図である。【００７５】
図５では、以下の条件の場合を例に記載した。加算器１２９から、４０ビットの加算値２０２が出力される。そして、加算器１２９から出力された値は、正規化シフタ１３４の出力前の中間バスのビット１６からビット５５までの位置にあたる。さらに、値の内１６ビットのデータが出力される。そして、正規化シフタ１３４からデータが出力される演算結果バスのビット４８からビット６３までがデータとして出力される。【００７６】
正規化シフタ１３４は、加算値２０２を左シフトする。これにより、正規化シフタ１３４は、加算値２０２の使用される１６ビットを演算結果バスのビット４８からビット６３にあたる出力位置２１４に移動させる。【００７７】
例えば、図５では、小数点位置情報を表す値をＱＮＵＭとしてＱＮＵＭ＝０の場合に、固定小数アキュムレータ２１１の最下位側の１６ビットのデータ２１３が出力対象であるとする。この場合、ＱＮＵＭ＝０であれば、正規化シフタ１３４は、中間結果バスのビット１６からビット３２までのデータ２１３を演算結果バスのビット４８からビット６３の出力位置２１４に移動させる。この場合、左シフト量は３２である。また、ＱＮＵＭ＝２４の場合に、固定小数アキュムレータ２１１の最上位側の１６ビットのデータ２１２が出力対象であるとする。この場合、ＱＮＵＭ＝２４であれば、正規化シフタ１３４は、中間結果バスのビット４０からビット５５までのデータ２１２を演算結果バスのビット４８からビット６３の出力位置２１４に移動させる。この場合、左シフト量は８である。すなわち、図５の例では、シフト量算出部１３２により「３２−ＱＮＵＭ」として求められた左シフト量を用いて、正規化シフタ１３４は、左シフトを実行する。【００７８】
図２に戻って説明を続ける。丸め回路１３５は、左シフトが施された確率的丸め対象数の入力を正規化シフタ１３４から受ける。そして、確率的丸め処理の場合、丸め回路１３５は、入力された確率的丸め対象数の所定桁より下の桁を打ち切る。そして、丸め回路１３５は、所定桁より下の桁を打ち切った確率的丸め対象数を出力する。丸め回路１３５からの出力が出力データとしてベクタレジスタ１１１に送られる。呼の丸め回路１３５が、「出力部」の一例にあたる。【００７９】
例えば、図３において、丸め回路１３５は、シフト値２０３のうち使用する範囲Ｌよりも下位の桁に対して打ち切りＭ２を行う。そして、丸め回路１３５から出力されたデータの、使用する範囲Ｌよりも上位の桁である範囲２０４は、出力データ２０５には含まれず破棄される。そして、出力データ２０５が、ベクタレジスタ１１１に送られる。【００８０】
ここで、丸め回路１３５は、通常の浮動小数点演算の回路である。浮動小数点演算の通常の丸めでは、下位桁から得られる丸めビットやｓｔｉｃｋｙビット、丸め最下位桁の値、演算結果の正負及び指定された丸めモードに基づき、丸め回路１３５は、入力値に対して以下の２処理のいずれかを行う。第１の処理は、丸め回路１３５は、入力値の丸め位置より下を打ち切った値をそのまま出力する処理である。第２の処理は、丸め回路１３５は、入力値の丸め位置より下を打ち切った値に１を加算して出力する処理である。確率的丸め処理を実行する場合、丸め回路１３５は、上述した第１の処理を常に選択するように論理が指定される。【００８１】
次に、図６を参照して、具体的なデータを用いて確率的丸め処理について説明する。図６は、確率的丸め処理についての具体例を表す図である。図６では、６４ビットの幅のバスを用いて処理を行う場合で説明する。また、各データの位置を［ｘ：ｙ］と表し、ｘが最上位ビット、ｙが最下位ビットを表すものとして説明する。【００８２】
この場合、演算命令制御部１０１は、小数点位置情報としてＱＮＵＭ＝１６を出力する。固定小数点レジスタ１３０から出力された確率的丸め対象数３００は、［５５：１６］に位置する。ここで、ビット１５以下が、小数点以下にあたる。そして、確率的丸め対象数３００のうちビット３１以下は丸められ、［４７：３２］が使用される範囲である。【００８３】
乱数生成回路１２１により生成された乱数３０１は、論理的には、小数点以下がビット１５以下となるように配置され、破線で囲われた場所に位置する。実際には、乱数３０１は、ＱＮＵＭ＝０の場合の位置に回路上の初期位置として配置される。ＱＮＵＭ＝０の場合の位置は、具体的には、確率的丸め対象数３００の最下位ビットの次のビットに乱数３０１の先頭のビットが来る位置である。そして、冪乗数生成部１２２は、ＱＮＵＭ＝１６に応じた２の冪乗数として２＾７を求める。乗算器１２５は、乱数に２＾７を乗算して乱数３０１を［３１：２０］の位置にシフトさせる。【００８４】
加算器１２９は、［３１：２０］に位置する乱数３０１に確率的丸め対象数３００と最下位ビットが一致するように０の値のビットを付加して、確率的丸め対象数３００に加算し、加算値３０２を算出する。加算値３０２は、［５５：１６］に位置する。ここで、出力範囲３０３は［６３：４８］である。【００８５】
そこで、正規化シフタ１３４は、確率的丸め対象数３００における使用される範囲［４７：３２］のデータが［６３：４８］に位置するように確率的丸め対象数３００をシフトさせる。  【００８６】
その後、丸め回路１３５により、シフト後の確率的丸め対象数３００におけるビット４９以下が打ち切られ破棄される。さらに、シフト後の確率的丸め対象数３００におけるビット６４以上が出力されず破棄される。これにより、残った１６ビットの出力データ３０４が演算結果として出力される。【００８７】
次に、図７を参照して、積和演算部１００が実行する処理の全体的な流れを説明する。図７は、積和演算部が実行する処理全体のフローチャートである。【００８８】
積和演算部１００は、積和演算器１１２を用いて実演算における積和演算を実行する（ステップＳ１）。【００８９】
そして、積和演算部１００は、積和累積演算が完了したか否かを判定する（ステップＳ２）。積和累積演算が完了していない場合（ステップＳ２：否定）、積和演算部１００は、ステップＳ１へ戻り積和演算を繰返す。【００９０】
これに対して、積和累積演算が完了した場合（ステップＳ２：肯定）、積和演算部１００は、積和演算器１１２を用いて確率的丸め処理を実行する（ステップＳ３）。【００９１】
その後、メモリコントローラ１２からの指示にしたがい、ベクタレジスタ１１１に格納された演算結果は、処理ユニットのチェーンとメモリコントローラ１２とを経由してメモリ１３に出力される（ステップＳ４）。【００９２】
次に、図８を参照して、本実施例に係る積和演算器による確率的丸め処理の流れを説明する。図８は、実施例に係る積和演算器１１２による確率的丸め処理のフローチャートである。図８のフローチャートで示した処理は、図７のステップＳ３で行われる処理の一例にあたる。【００９３】
乱数生成回路１２１は、ｎ桁の一様な乱数を取得する（ステップＳ１０１）。そして、乱数生成回路１２１は、生成した乱数をマルチプレクサ１２３を介して乗算器１２５へ出力する。【００９４】
また、冪乗数生成部１２２は、ＱＮＵＭに応じた２の冪乗数を生成する（ステップＳ１０２）。そして、乱数生成回路１２１は、生成した２の冪乗数をマルチプレクサ１２４を介して乗算器１２５へ出力する。【００９５】
乗算器１２５は、乱数の入力を乱数生成回路１２１から受ける。また、乗算器１２５は、ＱＮＵＭに応じた２の冪乗数の入力をマルチプレクサ１２４から受ける。そして、乗算器１２５は、乱数と２の冪乗数とを乗算して乱数の先頭が丸め位置に位置するように乱数をシフトさせる（ステップＳ１０３）。その後、乗算器１２５は、乗算結果を加算器１２９へ出力する。【００９６】
加算器１２９は、マルチプレクサ１２８を介して、固定小数点レジスタ１３０に格納された確率的丸め対象数を取得する（ステップＳ１０４）。【００９７】
また、加算器１２９は、乗算結果の入力を乗算器１２５から受ける。そして、加算器１２９は、確率的丸め対象数に乗算器１２５による乗算結果を加算して確率的丸めを実行する（ステップＳ１０５）。その後、加算器１２９は、確率的丸めの処理を施した確率的丸め対象数を表す加算結果を正規化シフタ１３４へ出力する。【００９８】
シフト量算出部１３２は、演算命令制御部１０１から取得した小数点位置情報に応じたシフト量を算出する（ステップＳ１０６）。そして、シフト量算出部１３２は、算出したシフト量をマルチプレクサ１３３を介して正規化シフタ１３４へ出力する。【００９９】
正規化シフタ１３４は、確率的丸めの処理を施した確率的丸め対象数を表す加算結果の入力を加算器１２９から受ける。また、正規化シフタ１３４は、シフト量の入力をシフト量算出部１３２から受ける。そして、加算結果をシフト量分左シフトする（ステップＳ１０７）。そして、正規化シフタ１３４は、左シフトした値を丸め回路１３５へ出力する。【０１００】
丸め回路１３５は、左シフトされた値の入力を正規化シフタ１３４から受ける。そして、丸め回路１３５は、左シフトされた値の所定桁以下を打ち切り出力範囲以下のビットを破棄する（ステップＳ１０８）。【０１０１】
その後、丸め回路１３５から、下位から所定のビット数が結果として出力される（ステップＳ１０９）。【０１０２】
本実施例に係る積和演算器１１２は、浮動小数点の演算を行う回路に、乱数生成回路１２１、冪乗数生成回路１２２、シフト量算出部１３２、並びに、マルチプレクサ１２３、１２４及び１３３を追加することで、固定小数点を用いた確率的丸め処理を実行する。【０１０３】
以上に説明したように、本実施例に係る積和演算器１１２は、浮動小数点の積和演算に用いる回路に対して少量の回路追加を行うことで、固定小数点の確率的丸めが実行可能となる。また、本実施例に係る積和演算器１１２は、乗算の累積演算結果に対する確率的丸めを実行する。したがって、簡易な構成で適切な確率的丸めを実行することができる。
【符号の説明】
【０１０４】
１  ＰＣＩカード
２  ホストコンピュータ
１０  処理ユニット
１１  全体命令制御部
１２  メモリコントローラ
１３  メモリ
１４  ＰＣＩ制御部
５０  情報処理装置
１００  積和演算部
１０１  演算命令制御部
１０２  演算命令バッファ
１０３  マルチプレクサ
１１１  ベクタレジスタ
１１２  積和演算器
１２１  乱数生成回路
１２２  冪乗数生成部  
１２５  乗算器
１２６  指数符号演算部
１２７  桁合シフタ
１２９  加算器
１３０  固定小数点レジスタ
１３１  桁落量予測部
１３２  シフト量算出部
１３４  正規化シフタ
１３５  丸め回路
１２３，１２４，１２８，１３３  マルチプレクサ
【図１】
0006984762.tif 000002
【図２】
0006984762.tif 000003
【図３】
0006984762.tif 000004
【図４】
0006984762.tif 000005
【図５】
0006984762.tif 000006
【図６】
0006984762.tif 000007
【図７】
0006984762.tif 000008
【図８】
0006984762.tif 000009