【実施例】
【0015】
図1は、情報処理装置の全体構成図である。情報処理装置50は、PCI(Peripheral Component Interconnect)カード1及びホストコンピュータ2を有する。PCIカード1とホストコンピュータ2とはPCIバスで接続され、互いにデータの送受信を行う。
【0016】
ホストコンピュータ2は、例えば、深層学習を実行する際の全体的な管理を行う。深層学習を実行する場合、ホストコンピュータ2は、PCIカード1に対して畳み込み演算などの深層学習における所定の演算の実行を指示する。
【0017】
PCIカード1は、ホストコンピュータ2からの指示を受けて演算を実行し、演算結果をホストコンピュータ2に出力する。PCIカード1は、
図1に示すように、複数の処理ユニット10、全体命令制御部11、メモリコントローラ12、メモリ13及びPCI制御部14を有する。このPCIカード1が、「演算処理装置」の一例にあたる。
【0018】
PCI制御部14は、演算の実行を指示する演算命令や演算で使用する演算データの入力をホストコンピュータ2から受ける。そして、PCI制御部14は、取得した演算命令や演算データをメモリコントローラ12へ出力する。
【0019】
また、PCI制御部14は、指示された演算に対する演算結果の入力をメモリコントローラ12から受ける。そして、PCI制御部14は、演算結果をホストコンピュータ2へ出力する。具体的には、PCI制御部14は、メモリコントローラ12に、メモリ13内の演算結果を読み出す指示を出し、読み出したデータを、自信を経由させてホストコンピュータ2へ出力させる。
【0020】
メモリコントローラ12は、演算命令や演算で使用する演算データの入力をPCI制御部14から受ける。そして、メモリコントローラ12は、取得した演算命令及び演算データをメモリ13へ格納する。
【0021】
また、メモリコントローラ12は、演算を実行する際に用いる演算データのベクタレジスタ111への格納の指示を全体命令制御部11から受ける。そして、メモリコントローラ12は、指定された演算データを指定されたベクタレジスタ111へ格納する。ここで、メモリコントローラ12は、直列に並んだ処理ユニット10のうちの後段の処理ユニット10に対してデータを送信する場合、積和演算部100を迂回させてマルチプレクサ103へ演算データを出力する。
【0022】
また、全体命令制御部11は、演算が完了すると、演算完了の通知を全体命令制御部11から受けるとともに、所定の命令によりメモリコントローラ12に指示することで、ベクタレジスタ111内の演算結果を直列に並んだ処理ユニット10のチェーン(連鎖)か引き出し、メモリ13に格納させる。
【0023】
全体命令制御部11は、ホストコンピュータ2から実行が指示された演算の全体の統括管理を行う。全体命令制御部11は、ホストコンピュータ2からの指示をPCI制御部14経由で受け、メモリ13に格納された全体命令列を次々と読んでは実行する。全体命令には、メモリ13から演算命令バッファ102に演算命令列を転送する命令、メモリ13から演算データをベクタレジスタ111に格納する命令、演算命令バッファ102に格納された演算命令列を演算命令制御部101に実行開始させる命令、ベクタレジスタ111に格納された演算結果をメモリ13に格納する命令、命令列の実行を終了する命令などがある。
【0024】
全体命令制御部11は、演算命令列を処理ユニット10に実行させる。演算を処理ユニットに実行させる場合、全体命令制御部11は、演算を実行する際に用いる演算データの取得をメモリコントローラ12に指示する。また、処理ユニット10における演算が完了すると、全体命令制御部11は、演算結果の格納をメモリコントローラ12に指示する。さらに、実行が指示された演算の全ての処理が完了すると、全体命令制御部11は、演算完了をメモリコントローラ12へ通知する。
【0025】
次に、処理ユニット10について説明する。処理ユニット10は、
図1に示すように1つのPCIカード1に複数搭載される。各処理ユニット10は、並列及び直列に複数接続される。処理ユニット10の数は、ある太陽においては128個である。処理ユニット10は、積和演算部100、演算命令制御部101、演算命令バッファ102及びマルチプレクサ103を有する。
【0026】
演算命令制御部101は、演算命令の実行処理を管理制御する。演算命令制御部101は、演算命令列の実行の指示を全体命令制御部11から受ける。ここで、処理ユニット10で実行できる命令を、全体命令と対比させて演算命令と呼んでいるが、命令には、積和演算部に演算を行わせる狭義の演算命令のほか、汎用レジスタ(図示しない)の操作命令、分岐命令、繰り返し命令、命令列の実行を停止する命令などが含まれる。
【0027】
そして、演算命令制御部101は、演算命令バッファ102に格納された演算命令を順次取得する。次に、演算命令制御部101は、取得した演算命令で指定された演算データの出力をベクタレジスタ111に指示する。また、演算命令制御部101は、取得した演算命令にしたがい、積和演算器112に演算実行の指示を積和演算器112へ出力する。その後、演算命令制御部101は、積和演算器112内で演算結果を用いた演算をループさせる。
【0028】
そして、演算が完了すると、演算命令制御部101は、確率的丸め処理の実行の指示とともに、累積レジスタの第何ビットを出力の小数点位置とするかを示す情報である小数点位置情報を積和演算器112へ出力する。小数点位置情報は、ニューラルネットワークにおける各層の重みパラメータを、演算可能なビット幅の範囲でできるだけ有効な値に保つように学習結果から算出される小数点位置を表す。この値は深層学習のプログラムを実行していく過程で決まる値であり、情報処理装置50にとっては可変の値である。その後、メモリコントローラ12からの指示があると、ベクタレジスタ111に格納された確率的丸め処理が施された演算結果は、処理ユニットのチェーンとメモリコントローラ12を経由してメモリ13に格納される。
【0029】
演算命令制御部101は、例えば、VECTOR.h.accstrnd ELE#,QNUM,DST#といった命令を発行する。ここで、QNUMは、小数点位置情報を表す。また、ELE#は、積和演算器112内に複数要素のレジスタがある場合に、どの要素を確率的丸め対象とするかを示す番号である。DST#は、確率的丸めの結果を格納するレジスタの番号を表す。この命令が実行されると、ELE#で指定された固定小数点累積レジスタの要素のQNUMに応じたビット範囲について、指定範囲よりも下位の値に基づく確率的丸めが行われ、その結果が固定小数点値をDST#で指定されたレジスタに格納される。
【0030】
演算命令バッファ102は、演算命令列を格納する記憶領域である。演算命令バッファ102は、メモリコントローラ12から入力された演算命令列を指示されたアドレスから入力順に格納する。その後、演算命令制御部101からの演算命令の取得要求を受けて、演算命令バッファ102は、演算命令制御部101に要求されたアドレスの演算命令を出力する。
【0031】
積和演算部100は、ベクタレジスタ111及び積和演算器112を有する。ただし、積和演算部100が有するベクタレジスタ111は、処理ユニット10に搭載されたベクタレジスタ全体の一部にあたる。
【0032】
ベクタレジスタ111は、演算を実行する際に用いる演算データの入力をメモリコントローラ12から受けて、入力された演算データを格納する。その後、ベクタレジスタ111は、演算命令制御部101からの指示を受けて、演算で使用する演算データを積和演算器112に出力する。また、積和累積演算の場合、積和演算器112による演算のループ処理が完了後、ベクタレジスタ111は、確率的丸め処理が施された演算結果の入力を積和演算器112から受ける。そして、メモリ13への出力の指示をメモリコントローラ12から受けると、ベクタレジスタ111は、保持する確率的丸め処理が施された積和演算器112の演算結果をマルチプレクサ103へ出力する。
【0033】
積和演算器112は、演算命令制御部101からの演算実行の指示を受ける。そして、積和演算器112は、ベクタレジスタ111から入力された演算データを用いて積和演算を実行する。その後、積和演算器112は、演算結果をベクタレジスタ111へ出力する。命令により累積を指示された場合は、積和演算器112は、累積演算結果を演算器内のレジスタ(アキュムレータ)に保持し、後続の累積演算命令で使用する。積和演算器112は、積和累積演算が完了するまでベクタレジスタ111から入力された値に対する積和演算を繰返す。
【0034】
その後、積和累積演算のループ処理が終了すると、積和演算器112は、確率的丸め処理の実行の指示を演算命令制御部101から受ける。そのとき、積和演算器112は、小数点位置情報の入力を演算命令制御部101から受ける。そして、積和演算器112は、内部のレジスタに保持している、ループ処理が完了した演算結果を確率的丸め対象数として、積和演算を行う回路を用いて確率的丸め対象数に対する確率的丸め処理を実行する。その後、積和演算器112は、確率的丸め処理を施した演算結果をベクタレジスタ111へ出力し、格納させる。
【0035】
ここで、
図2を参照して、積和演算器112の確率的丸めを行う機能について詳細に説明する。
図2は、積和演算器の回路図である。
【0036】
積和演算器112は、乱数生成回路121、冪乗数生成部122、マルチプレクサ123及び124、乗算器125、指数符号演算部126、桁合シフタ127、マルチプレクサ128、加算器129を有する。さらに、積和演算器112は、固定小数点レジスタ130、桁落量予測部131、シフト量算出部132、マルチプレクサ133、正規化シフタ134及び丸め回路135を有する。ここで、積和演算器112は、畳み込みなどのホストコンピュータ2が要求した実際の演算処理と、演算結果の確率的丸め値を算出する処理との2つの処理を行う。そこで、実際の演算処理を実演算といい、演算結果の確率的丸め値を算出する処理を確率的丸め処理という。
【0037】
実演算における各部の動作を説明する。実演算の場合、マルチプレクサ124は、乗算を行う一方の演算データの入力を受ける。また、マルチプレクサ123は、乗算を行う他方の演算データの入力を受ける。この場合、マルチプレクサ123及び124は、演算データを乗算器125へ出力する。乗算器125は、マルチプレクサ123及び124から入力された2つの演算データを乗算する。そして、乗算器125は、乗算結果を加算器129へ出力する。
【0038】
一方、指数符号演算部126は、実演算に用いる3つの演算データの入力をベクタレジスタ111から受ける。そして、指数符号演算部126は、演算命令が浮動小数点の積和演算である場合に、積と加数の仮数どうしを桁合わせするためのシフト量を算出する。固定小数点演算命令の場合は、指数符号演算部126は、桁合わせするためシフト量を算出する。固定小数点演算命令の場合は、指数符号演算部126は、乗算結果の桁に加数の桁が合うようハードウェアにあらかじめ組み込まれた定数を桁合シフタのシフト量とする。また、指数符号演算部126は、演算結果の符号を算出する。そして、指数符号演算部126は、マルチプレクサ123及び124に入力された演算データ以外の残りの演算データ及びその演算データ(加数)と乗算器125の乗算結果とを桁合わせするためのシフト量を桁合シフタ127へ出力する。
【0039】
また、指数符号演算部126は、演算命令が浮動小数点の積和演算である場合、桁落ち量の予測結果の入力を桁落量予測部131から受ける。そして、指数符号演算部126は、取得した桁落ち量から、演算結果の仮数の正規化に用いる左シフト量を算出する。仮数の正規化とは、仮数の最上位桁が1になるように仮数全体のビット位置を調整(シフト)させることである。その後、指数符号演算部126は、算出した左シフト量をマルチプレクサ133へ出力する。
【0040】
桁落量予測部131が求める桁落ち量は、回路構成により、本当の桁落ち量から、決まった範囲内の誤差を含む場合がある。正規化シフタ134で、指定された量のシフトをおこなった結果が、仮数の正規化が正しくなされているか否かを見ることで、予測した桁落ち量の誤差の有無を知ることができる。正規化シフタ134は、桁落ち量に誤差があったと分かった場合、調整のための追加のシフトをおこなうとともに、指数符号演算部に、予測に誤差があったことを通知する。指数符号演算部126は、正規化シフタ134から誤差あり通知を受けた場合、誤差調整のための追加シフトを考慮に入れた指数を算出する。これに対して、正規化シフタ134から誤差あり通知を受けない場合、指数符号演算部126は、追加シフトのない場合の指数を算出する。また、指数符号演算部126は、仮数の丸めで桁上がりが発生した場合、丸め回路135から通知を受け、指数を調整する。指数符号演算部126は、最終的に求まった符号と指数を出力し、これを後述する丸め回路135から出力される仮数の丸め結果と連接することで、浮動小数点演算結果が完成する。演算結果は、ベクタレジスタ111に出力される。
【0041】
桁合シフタ127は、指数符号演算部126から指定されたシフト量だけ、指数符号演算部126から入力された演算データをシフトさせる。そして、桁合わせを行った演算データをマルチプレクサ128へ出力する。
【0042】
マルチプレクサ128は、浮動小数点の実演算の場合、桁合シフタ127からの入力を選択する。固定小数点の累積演算で、累積途中の場合、加算対象の数は桁合わせの必要はないので、固定小数点レジスタ130からの入力を選択する。固定小数点の累積演算で、累積の初回の場合は、ベクタレジスタ111から積和演算器112に入力された数を加数として選択するため、桁合シフタ127からの入力を選択する。そして、マルチプレクサ128は、桁合シフタ127からの入力された演算データを加算器129へ出力する。
【0043】
加算器129は、2つの演算データの乗算結果の入力を乗算器125から受ける。また、加算器129は、桁合わせされた残りの演算データ(加数)の入力をマルチプレクサ128から受ける。そして、加算器129は、2つの演算データの乗算結果と桁合わせされた残りの演算データ(加数)を加算する。そして、加算器129は、加算結果を正規化シフタ134及び桁落量予測部131へ出力する。ここで、実際には加算器129は加算結果信号及び桁上げ信号の2つの数を用いて、桁上げ保存加算と桁上げ伝搬加算という2段階の加算を行うが、本実施例では、この2段階の加算をまとめたものを単に加算とよぶ。そして、実際には、加算器129は、桁上げ保存加算の結果を桁落量予測部131へ出力する。
【0044】
桁落量予測部131は、加算途中結果の入力を加算器129から受ける。そして、桁落量予測部131は、取得した加算途中結果から桁落ち量を予測する。その後、桁落量予測部131は、予測した桁落ち量を指数符号演算部126へ出力する。
【0045】
マルチプレクサ133は、実演算の場合、指数符号演算部126からの入力を選択する。そして、マルチプレクサ133は、指数符号演算部126から入力された左シフト量を正規化シフタ134へ出力する。
【0046】
正規化シフタ134は、加算結果の入力を加算器129から受ける。また、正規化シフタ134は、左シフト量の入力をマルチプレクサ133から受ける。そして、正規化シフタ134は、入力された左シフト量に合わせて加算結果を左シフトさせて出力される位置を合わせる。その後、正規化シフタ134は、左シフトさせた演算結果を丸め回路135へ出力する。ここで、左シフトによる位置合わせで桁落ち量の予測に誤差があったと判明した場合、正規化シフタ134は、誤差調整のための追加シフトを行うとともに、誤差あり通知を指数符号演算部126に送信する。
【0047】
丸め回路135は、演算結果の入力を正規化シフタ134から受ける。そして、丸め回路135は、所定の桁数における丸めを実行する。その後、丸め回路135は、所定の桁で丸められた演算結果をベクタレジスタ111へ出力する。
【0048】
次に、確率的丸め処理における各部の動作を説明する。確率的丸め処理の場合、乱数生成回路121が、nビットの一様乱数を生成する。そして、乱数生成回路121は、生成した乱数をマルチプレクサ123へ出力する。ここで、乱数生成回路121により生成される乱数は、真に一様な乱数でなくても、実用に耐え得る範囲の疑似乱数でよい。
【0049】
乱数生成回路121は、例えば、積和演算器112内に配置されたLFSR(Linear Feedback Shift Register)を利用する。例えば、LFSRを用いる場合、本実施例では、確率的丸め命令を実行する毎にLFSRの内部状態が更新され、次の確率的丸め命令の発行時には、LFSRは新しい乱数値を出力する。
【0050】
ただし、乱数生成回路121は、LFSRに限らず、よりランダム性の高い疑似乱数発生回路でもよいし、環境の揺らぎからランダムビットを取得する回路でもよい。また、乱数生成回路121は、各積和演算器112に付随する回路であってもよいし、複数の積和演算器112で共有する回路であってもよい。この乱数生成回路121が、「乱数生成部」の一例にあたる。
【0051】
ここで、乱数のビット数の選び方について説明する。確率的に丸めを行う場合、最終的に確率的丸め対象数において丸め位置より下位にあるビットの値が捨てられる。例えば、乱数のビット数をnとし、捨てられるビット数をmとした場合、乱数が一様であれば、nがmと同じもしくはそれ以上であれば、確率的丸め後の期待値を確率的丸め対象数と等しい値にすることができる。しかし、mが多い場合でも同様にn≧mの関係を維持しようとすると、演算するビット数が多くなり、それに応じて桁合わせや加算を行う回路が大きくなる。あまり回路が大きくなると、既存の積和演算器112のハードウェアでは、使用するビット数の演算回路が収納が困難となる。その場合、不足する部分について、確率的丸めのために演算回路を付加するなどの対処は回路量が増加するため好ましくない。
【0052】
そこで、n≧mの関係を維持せず、nの方がmより小さくてもよいとすれば、既存の積和演算器112に収納できるだけのビット数にnをとどめておく方法が考えられる。その場合、捨てられるmビットのうち、丸め位置から下位にnビットよりさらに下位のビットについては、乱数との加算が行われず、丸め後の結果に寄与しないことになる。丸め後の期待値は、その分丸め前の値から乖離する。しかし、nを1増やすごとに期待値のずれは半分程度に縮小するため、ある程度以上にnを大きくすれば、mが大きいことによるずれは十分小さくなり、実用上は問題にならない。そのため、nは実用上の要件と既存の演算回路量に応じて妥当な値が決定されることが好ましい。
【0053】
確率的丸め処理の場合、マルチプレクサ123は、乱数生成回路121から入力されたnビットの一様乱数を選択する。そして、マルチプレクサ123は、nビットの一様乱数を乗算器125へ出力する。
【0054】
冪乗数生成部122は、確率的丸め命令の入力を演算命令制御部101から受ける。同時に、冪乗数生成部122は、確率的丸め命令に含まれるオペランドの小数点位置情報を取得する。そして、冪乗数生成部122は、小数点位置情報を用いて丸めたい位置に応じた2の冪乗数を生成する。ここで、丸めたい位置とは、その桁の1つ上の桁が有効数字の桁となる桁にあたる。その後、冪乗数生成部122は、生成した2の冪乗数をマルチプレクサ124へ出力する。
【0055】
確率的丸め処理の場合、マルチプレクサ124は、冪乗数生成部122から入力された2の冪乗数を選択する。そして、マルチプレクサ124は、2の冪乗数を乗算器125へ出力する。
【0056】
乗算器125は、nビットの一様乱数の入力をマルチプレクサ123から受ける。また、乗算器125は、丸めたい位置に応じた2の冪乗数の入力をマルチプレクサ124から受ける。そして、乗算器125は、取得した2の冪乗数を取得した乱数に乗算することで、乱数の先頭の桁を確率的丸め対象数における丸めたい位置に合わせる。
【0057】
ここで、
図3を参照して、本実施例に係る積和演算器112による確率的丸め処理の計算の概要を説明する。
図3は、実施例に係る積和演算器による確率的丸め処理の計算の概要を表す図である。確率的丸め対象数200における位置Pは、丸め位置を表す。また、範囲Lは、演算結果として使用される範囲である。
【0058】
まず、乱数生成回路121により、nビットの一様乱数である乱数201が生成される。そして、乱数201は、乗算器125により、2の冪乗数が乗算され、乱数201の先頭が確率的丸め対象数200の丸め位置Pに一致するように乱数201が左シフトされる。この時、乱数201は丸め位置から下位にnビットの桁を有する乱数となる。
【0059】
ここで、
図4を参照して、乱数の桁合わせシフトをさらに詳細に説明する。
図4は、乱数の桁合わせシフトを説明するための図である。ここでは、乱数201が12ビットの乱数で且つ小数点以下3ビットの乱数である場合で説明する。また、固定小数アキュムレータ211(確率的丸め対象数)の小数点位置が最下位ビットの直ぐ右である場合で説明する。
【0060】
乗算器125は、乱数201に2の冪数である2^Eを乗算することで、乱数をシフトする。ここで、小数点位置情報をQNUMとして表し、E=QNUM−9とする。QNUM=0で、乱数の全桁が、固定小数アキュムレータ211の最下位ビットより下に埋没する。また、QNUM=12の時、乱数の最下位桁が固定小数アキュムレータ211の最下位に合う位置となる。この場合、位置Dが小数点位置を表す。
【0061】
図4において枠210は、単精度で24ビット×24ビットの乗算を行う乗算器125による乱数201のシフトを表す。
図4において、12ビット乱数201Aが、QNUM=0の場合の位置である。ここで、この場合の乗算器125の最下位桁は、16ビットの固定小数で考えると2^−8にあたる。QNUM=0のときはE=−9であり、乗算器125は2^−9を乗算する処理を行うことになるが、乗算器125その桁の回路を有さない。しかし、QNUM=0の場合、乱数全桁が固定小数アキュムレータ211の最下位ビットより下位に埋没し、丸めでは切り捨てとなるため、乱数を足さなくてもよい。そこで、QNUM=0の場合、乗算器125は、乗算する値である2^Eを0とする。
【0062】
QNUM=1の場合、E=−8となり、乗算器125は、12ビット乱数201Aに2^−8を乗算して、12ビット乱数201Aをシフトさせて12ビット乱数201Bとする。また、QNUM=8の場合、E=−1となり、乗算器125は、12ビット乱数201に2^−1を乗算して、12ビット乱数201Aをシフトさせて12ビット乱数201Cとする。また、QNUM=24の場合、E=15となり、乗算器125は、12ビット乱数201に2^15を乗算して、12ビット乱数201Aをシフトさせて12ビット乱数201Dとする。
【0063】
すなわち、固定小数アキュムレータ211の最下位側の16ビットであるデータ213を出力結果とする場合、QNUM=0となる。また、固定小数アキュムレータ211の最上位側の16ビットであるデータ212を出力結果とする場合、QNUM=24となる。すなわち、命令により与えられるQNUMにより、固定小数アキュムレータ211におけるどの位置の桁以上を有効数字とするかが決定される。そして、
図4の場合、乗算器125は、0〜24の間の値を採るQNUMから求められた2の冪乗数を乱数201に乗算することで、固定小数アキュムレータ211における有効数字の最下位の桁の1つ下の桁に乱数201の先頭の位置を合わせる。
【0064】
図2に戻って説明を続ける。乗算器125は、乗算結果である有効数字の最下位の桁の1つ下の桁に先頭の桁を合わせた乱数を加算器129へ出力する。この乗算器125が、「乱数移動部」の一例にあたる。
【0065】
固定小数点レジスタ130は、積和累積演算で用いられる累積レジスタ(アキュムレータ)である。固定小数点レジスタ130は、確率的丸めの対象となる確率的丸め対象数を格納する。確率的丸め対象数は、実演算において算出された算出結果である。累積演算では、累積レジスタの値に乗算結果を加算していくため、固定小数点レジスタ130は、累積レジスタの値をセットするのに十分なビット幅を有する。そして、確率的丸め処理の場合、固定小数点レジスタ130は、確率的丸め対象数をマルチプレクサ128へ出力する。
【0066】
確率的丸め処理の場合、マルチプレクサ128は、固定小数点レジスタ130から入力された確率的丸め対象数を選択する。そして、マルチプレクサ128は、確率的丸め対象数を加算器129へ出力する。
【0067】
加算器129は、有効数字の最下位の桁の1つ下の桁に先頭の桁を合わせた乱数の入力を乗算器125から受ける。また、加算器129は、確率的丸め対象数の入力をマルチプレクサ128から受ける。そして、加算器129は、確率的丸め対象数に乱数を加算する。これにより、確率的丸め対象数のうち乱数の先頭より下の桁の数に応じて確率的に繰り上げが行われる。すなわち、加算器129は、確率的丸め対象数に乱数を加算することで確率的丸めを行う。その後、加算器129は、加算結果を正規化シフタ134へ出力する。この加算器129が、「加算部」の一例にあたる。
【0068】
ここで、
図3を参照して、加算器129による確率的丸めの処理をさらに説明する。確率的丸め対象数200は、固定小数点レジスタ130から提供される。そして、範囲Lが丸め処理の結果として使用したい数値の範囲を表す。加算器129は、乗算器125により先頭位置が丸め位置であるPにシフトされた乱数201を確率的丸め対象数200に加算する。ここで、確率的丸め対象数200の最下位桁が乱数201の最下位桁よりも高い場合、加算器129は、確率的丸め対象数200に0の値のビットを付加して最下位桁を一致させた上で加算を行う。この加算により、丸め位置P以下の値に応じて確率的に桁上がりM1が発生した加算値202が得られる。
【0069】
ここで、桁上がりはおおよそ下の値に応じて確率的に発生する。これは、前述の通り乱数のビット数nの選び方によっては、確率的丸め結果の期待値が、丸め前の値からずれることがあり、そのずれ量はnの値により異なる。本実施例では、既存の単精度浮動小数点用の積和演算器112に収納可能な乗加算ビット数と、深層学習の収束シミュレーションに基づいた実用性の判断によりn=12とした。この場合、丸め後の期待値のずれは、最大で0.00025程度である。ただし、乱数のビット数はこれに限らず、演算に期待される要件と、既存回路や許容できる追加回路量のバランスに応じて、1以上の任意の妥当なビット数が選択されることが好ましい。
【0070】
図2に戻って説明を続ける。シフト量算出部132は、小数点位置情報の入力を演算命令制御部101から受ける。そして、シフト量算出部132は、小数点位置情報に応じたシフト量を算出する。具体的には、シフト量算出部132は、加算器129から出力されるデータのうち有効とするデータが配置されている位置から、正規化シフタの出力における有効データの位置への移動に用いるシフト量を、QNUM算出する。その後、シフト量算出部132は、算出したシフト量をマルチプレクサ133へ出力する。
【0071】
確率的丸め処理の場合、マルチプレクサ133は、シフト量算出部132から入力されたシフト量を選択する。そして、マルチプレクサ133は、シフト量を正規化シフタ134へ出力する。
【0072】
正規化シフタ134は、確率的丸め処理が施された確率的丸め対象数の入力を加算器129から受ける。また、正規化シフタ134は、シフト量の入力をマルチプレクサ133から受ける。そして、正規化シフタ134は、確率的丸め対象数をシフト量に応じてシフトさせる。具体的には、正規化シフタ134は、入力された対象数のうち丸め位置のすぐ上の桁がちょうど積和演算器112から出力される有効な数の最下位桁に移動されるように左シフトをおこなう。正規化シフタ134は、左シフトを施した確率的丸め対象数を丸め回路135へ出力する。この正規化シフタ134が、「移動部」の一例にあたる。
【0073】
例えば、
図3において、正規化シフタ134は、加算値202において演算結果として使用する範囲Lの最下位桁が出力されるデータの最下位桁に一致するように加算値202をシフトさせてシフト値203とする。
【0074】
ここで、
図5を参照して正規化シフタ134による加算値の位置合わせについて説明する。
図5は、正規化シフタによる加算値の位置合わせを説明するための図である。
【0075】
図5では、以下の条件の場合を例に記載した。加算器129から、40ビットの加算値202が出力される。そして、加算器129から出力された値は、正規化シフタ134の出力前の中間バスのビット16からビット55までの位置にあたる。さらに、値の内16ビットのデータが出力される。そして、正規化シフタ134からデータが出力される演算結果バスのビット48からビット63までがデータとして出力される。
【0076】
正規化シフタ134は、加算値202を左シフトする。これにより、正規化シフタ134は、加算値202の使用される16ビットを演算結果バスのビット48からビット63にあたる出力位置214に移動させる。
【0077】
例えば、
図5では、小数点位置情報を表す値をQNUMとしてQNUM=0の場合に、固定小数アキュムレータ211の最下位側の16ビットのデータ213が出力対象であるとする。この場合、QNUM=0であれば、正規化シフタ134は、中間結果バスのビット16からビット32までのデータ213を演算結果バスのビット48からビット63の出力位置214に移動させる。この場合、左シフト量は32である。また、QNUM=24の場合に、固定小数アキュムレータ211の最上位側の16ビットのデータ212が出力対象であるとする。この場合、QNUM=24であれば、正規化シフタ134は、中間結果バスのビット40からビット55までのデータ212を演算結果バスのビット48からビット63の出力位置214に移動させる。この場合、左シフト量は8である。すなわち、
図5の例では、シフト量算出部132により「32−QNUM」として求められた左シフト量を用いて、正規化シフタ134は、左シフトを実行する。
【0078】
図2に戻って説明を続ける。丸め回路135は、左シフトが施された確率的丸め対象数の入力を正規化シフタ134から受ける。そして、確率的丸め処理の場合、丸め回路135は、入力された確率的丸め対象数の所定桁より下の桁を打ち切る。そして、丸め回路135は、所定桁より下の桁を打ち切った確率的丸め対象数を出力する。丸め回路135からの出力が出力データとしてベクタレジスタ111に送られる。呼の丸め回路135が、「出力部」の一例にあたる。
【0079】
例えば、
図3において、丸め回路135は、シフト値203のうち使用する範囲Lよりも下位の桁に対して打ち切りM2を行う。そして、丸め回路135から出力されたデータの、使用する範囲Lよりも上位の桁である範囲204は、出力データ205には含まれず破棄される。そして、出力データ205が、ベクタレジスタ111に送られる。
【0080】
ここで、丸め回路135は、通常の浮動小数点演算の回路である。浮動小数点演算の通常の丸めでは、下位桁から得られる丸めビットやstickyビット、丸め最下位桁の値、演算結果の正負及び指定された丸めモードに基づき、丸め回路135は、入力値に対して以下の2処理のいずれかを行う。第1の処理は、丸め回路135は、入力値の丸め位置より下を打ち切った値をそのまま出力する処理である。第2の処理は、丸め回路135は、入力値の丸め位置より下を打ち切った値に1を加算して出力する処理である。確率的丸め処理を実行する場合、丸め回路135は、上述した第1の処理を常に選択するように論理が指定される。
【0081】
次に、
図6を参照して、具体的なデータを用いて確率的丸め処理について説明する。
図6は、確率的丸め処理についての具体例を表す図である。
図6では、64ビットの幅のバスを用いて処理を行う場合で説明する。また、各データの位置を[x:y]と表し、xが最上位ビット、yが最下位ビットを表すものとして説明する。
【0082】
この場合、演算命令制御部101は、小数点位置情報としてQNUM=16を出力する。固定小数点レジスタ130から出力された確率的丸め対象数300は、[55:16]に位置する。ここで、ビット15以下が、小数点以下にあたる。そして、確率的丸め対象数300のうちビット31以下は丸められ、[47:32]が使用される範囲である。
【0083】
乱数生成回路121により生成された乱数301は、論理的には、小数点以下がビット15以下となるように配置され、破線で囲われた場所に位置する。実際には、乱数301は、QNUM=0の場合の位置に回路上の初期位置として配置される。QNUM=0の場合の位置は、具体的には、確率的丸め対象数300の最下位ビットの次のビットに乱数301の先頭のビットが来る位置である。そして、冪乗数生成部122は、QNUM=16に応じた2の冪乗数として2^7を求める。乗算器125は、乱数に2^7を乗算して乱数301を[31:20]の位置にシフトさせる。
【0084】
加算器129は、[31:20]に位置する乱数301に確率的丸め対象数300と最下位ビットが一致するように0の値のビットを付加して、確率的丸め対象数300に加算し、加算値302を算出する。加算値302は、[55:16]に位置する。ここで、出力範囲303は[63:48]である。
【0085】
そこで、正規化シフタ134は、確率的丸め対象数300における使用される範囲[47:32]のデータが[63:48]に位置するように確率的丸め対象数300をシフトさせる。
【0086】
その後、丸め回路135により、シフト後の確率的丸め対象数300におけるビット49以下が打ち切られ破棄される。さらに、シフト後の確率的丸め対象数300におけるビット64以上が出力されず破棄される。これにより、残った16ビットの出力データ304が演算結果として出力される。
【0087】
次に、
図7を参照して、積和演算部100が実行する処理の全体的な流れを説明する。
図7は、積和演算部が実行する処理全体のフローチャートである。
【0088】
積和演算部100は、積和演算器112を用いて実演算における積和演算を実行する(ステップS1)。
【0089】
そして、積和演算部100は、積和累積演算が完了したか否かを判定する(ステップS2)。積和累積演算が完了していない場合(ステップS2:否定)、積和演算部100は、ステップS1へ戻り積和演算を繰返す。
【0090】
これに対して、積和累積演算が完了した場合(ステップS2:肯定)、積和演算部100は、積和演算器112を用いて確率的丸め処理を実行する(ステップS3)。
【0091】
その後、メモリコントローラ12からの指示にしたがい、ベクタレジスタ111に格納された演算結果は、処理ユニットのチェーンとメモリコントローラ12とを経由してメモリ13に出力される(ステップS4)。
【0092】
次に、
図8を参照して、本実施例に係る積和演算器による確率的丸め処理の流れを説明する。
図8は、実施例に係る積和演算器112による確率的丸め処理のフローチャートである。
図8のフローチャートで示した処理は、
図7のステップS3で行われる処理の一例にあたる。
【0093】
乱数生成回路121は、n桁の一様な乱数を取得する(ステップS101)。そして、乱数生成回路121は、生成した乱数をマルチプレクサ123を介して乗算器125へ出力する。
【0094】
また、冪乗数生成部122は、QNUMに応じた2の冪乗数を生成する(ステップS102)。そして、乱数生成回路121は、生成した2の冪乗数をマルチプレクサ124を介して乗算器125へ出力する。
【0095】
乗算器125は、乱数の入力を乱数生成回路121から受ける。また、乗算器125は、QNUMに応じた2の冪乗数の入力をマルチプレクサ124から受ける。そして、乗算器125は、乱数と2の冪乗数とを乗算して乱数の先頭が丸め位置に位置するように乱数をシフトさせる(ステップS103)。その後、乗算器125は、乗算結果を加算器129へ出力する。
【0096】
加算器129は、マルチプレクサ128を介して、固定小数点レジスタ130に格納された確率的丸め対象数を取得する(ステップS104)。
【0097】
また、加算器129は、乗算結果の入力を乗算器125から受ける。そして、加算器129は、確率的丸め対象数に乗算器125による乗算結果を加算して確率的丸めを実行する(ステップS105)。その後、加算器129は、確率的丸めの処理を施した確率的丸め対象数を表す加算結果を正規化シフタ134へ出力する。
【0098】
シフト量算出部132は、演算命令制御部101から取得した小数点位置情報に応じたシフト量を算出する(ステップS106)。そして、シフト量算出部132は、算出したシフト量をマルチプレクサ133を介して正規化シフタ134へ出力する。
【0099】
正規化シフタ134は、確率的丸めの処理を施した確率的丸め対象数を表す加算結果の入力を加算器129から受ける。また、正規化シフタ134は、シフト量の入力をシフト量算出部132から受ける。そして、加算結果をシフト量分左シフトする(ステップS107)。そして、正規化シフタ134は、左シフトした値を丸め回路135へ出力する。
【0100】
丸め回路135は、左シフトされた値の入力を正規化シフタ134から受ける。そして、丸め回路135は、左シフトされた値の所定桁以下を打ち切り出力範囲以下のビットを破棄する(ステップS108)。
【0101】
その後、丸め回路135から、下位から所定のビット数が結果として出力される(ステップS109)。
【0102】
本実施例に係る積和演算器112は、浮動小数点の演算を行う回路に、乱数生成回路121、冪乗数生成回路122、シフト量算出部132、並びに、マルチプレクサ123、124及び133を追加することで、固定小数点を用いた確率的丸め処理を実行する。
【0103】
以上に説明したように、本実施例に係る積和演算器112は、浮動小数点の積和演算に用いる回路に対して少量の回路追加を行うことで、固定小数点の確率的丸めが実行可能となる。また、本実施例に係る積和演算器112は、乗算の累積演算結果に対する確率的丸めを実行する。したがって、簡易な構成で適切な確率的丸めを実行することができる。