以下、添付図面を参照しながら本発明の実施形態が詳細に説明される。図面の説明において、同一又は同等の要素には同一符号が用いられ、重複する説明は省略される。
図1は、一実施形態に係る演算装置を含む演算システムの構成を概略的に示す図である。図1に示される演算システムSは、行列演算及び他の演算を行うためのシステムである。演算システムSは、複数の要素プロセッサ(ここでは、4つの要素プロセッサPE1〜PE4)と、演算ユニットMAUと、を備える。
要素プロセッサPE1〜PE4は、単一の演算ユニットMAUを共有している。行列演算を行う際には、要素プロセッサPE1〜PE4が1つのプロセッサとして動作し、行列演算以外の演算を行う際には、要素プロセッサPE1〜PE4が個別のプロセッサとして動作する。行列演算以外の演算を行う際にも、要素プロセッサPE1〜PE4が1つのプロセッサとして動作してもよい。要素プロセッサPE1〜PE4が1つのプロセッサとして動作する場合、1つのインストラクションで要素プロセッサPE1〜PE4が動作するので、要素プロセッサPE1〜PE4はSIMD動作を行っているとみなされ得る。
要素プロセッサPE1〜PE4は、リング結合されている。具体的には、要素プロセッサPE1及び要素プロセッサPE2、要素プロセッサPE2及び要素プロセッサPE3、要素プロセッサPE3及び要素プロセッサPE4、要素プロセッサPE4及び要素プロセッサPE1がデータバスでそれぞれ接続されている。要素プロセッサPE1〜PE4には、要素プロセッサを一意に識別可能なプロセッサID(00,01,10,11)が予め設定されている。
演算システムSには、メモリ空間が設定されている。メモリ空間のメモリアドレスは、プロセッサIDを含む。本実施形態では、演算システムSは、4つの要素プロセッサを含むので、例えばメモリアドレスの下位2ビットがプロセッサIDに対応する。要素プロセッサPE1〜PE4のそれぞれには、例えば、10ビットのアドレスに対応するメモリ空間が割り当てられている。このため、演算システムSのメモリ空間は、12ビットに拡大されている。つまり、演算システムSのメモリ空間が4等分され、各メモリアドレスによって示されるメモリ領域には、当該メモリアドレスに含まれるプロセッサIDによって示される要素プロセッサがアクセスする。
要素プロセッサPE1〜PE4のそれぞれは、当該要素プロセッサのプロセッサIDを含むメモリアドレスによって示されるメモリ領域(担当領域)へのアクセス(align access)を実行できるが、当該要素プロセッサのプロセッサIDとは異なるプロセッサIDを含むメモリアドレスによって示されるメモリ領域(非担当領域)へのアクセス(unaligned access)を実行できない。要素プロセッサPE1〜PE4のそれぞれは、リング結合を介して他の要素プロセッサに順にデータ転送(循環シフト)する。これにより、要素プロセッサPE1〜PE4のそれぞれは、非担当領域へのアクセスを実行することが可能となる。要素プロセッサPE1〜PE4のそれぞれは、メモリアドレスによって示される領域に、演算ユニットMAUによる演算対象である入力データ、及び演算ユニットMAUによる演算結果である出力データを保持する。
演算ユニットMAUは、例えば、複数の浮動小数点演算を並列化して行う。演算ユニットMAUは、例えば、ディープニューラルネットワーク(DNN:Deep Neural Network)、及びコンボリューショナルニューラルネットワーク(CNN:Convolutional Neural Network)向けのプロセッサに適用され得る。演算ユニットMAUは、複数の演算装置(ここでは、演算装置1A〜1D)を備える。演算装置1A〜1Dのそれぞれは、演算ユニットMAUの演算の一部を行う装置である。要素プロセッサPE1は、演算装置1Aのレジスタにアクセス可能である。要素プロセッサPE2は、演算装置1Bのレジスタにアクセス可能である。要素プロセッサPE3は、演算装置1Cのレジスタにアクセス可能である。要素プロセッサPE4は、演算装置1Dのレジスタにアクセス可能である。
(第1実施形態)
図2は、第1実施形態に係る演算装置の構成を概略的に示す図である。図2に示される演算装置1Aは、複数のデータに対し同一の演算を同時に行うことが可能なSIMD演算器である。なお、演算装置1A〜1Dの構成は同等であるので、ここでは演算装置1Aについて説明する。
演算装置1Aは、MODE信号(モード信号)に応じて、演算装置1Aの演算モードを第1演算モード及び第2演算モードのいずれかに切り替える。第1演算モードは、第1ビット数のデータを用いた演算を行うモードである。第2演算モードは、第2ビット数のデータを用いた演算を行うモードである。第2ビット数は、第1ビット数の半分のビット数である。MODE信号は、演算装置1Aの外部の装置(本実施形態では、要素プロセッサ)から供給される。MODE信号は、演算装置1Aの演算モードを示す信号である。MODE信号は、例えば1ビットの信号であり、第1演算モード及び第2演算モードのいずれかを示す。
演算装置1Aが実行し得る演算モードとしては、例えば、倍精度演算モード、単精度演算モード、及び半精度演算モードが挙げられる。倍精度演算モードは、単精度のデータ(以下、「単精度データ」という。)のビット数の2倍のビット数のデータを用いて演算を行うモードである。単精度演算モードは、倍精度のデータ(以下、「倍精度データ」という。)のビット数の半分のビット数のデータを用いて演算を行うモードである。半精度演算モードは、倍精度データのビット数の4分の1であり、単精度データのビット数の半分のビット数のデータを用いて演算を行うモードである。32ビットを1ワードとする32ビットアーキテクチャでは、倍精度データのビット数は64ビット、単精度データのビット数は32ビット、半精度のデータ(以下、「半精度データ」という。)のビット数は16ビットである。つまり、第1演算モードが倍精度演算モードである場合、第2演算モードは単精度演算モードである。また、第1演算モードが単精度演算モードである場合、第2演算モードは半精度演算モードである。
演算装置1Aは、複数の演算部(本実施形態では演算部10A〜10D)と、レジスタ40と、加算部50と、を備える。複数の演算部10A〜10Dのそれぞれは、演算装置1Aの演算の一部を行う回路である。
図3は、図2の演算装置に含まれる演算部の構成を概略的に示す図である。なお、演算部10A〜10Dの構成は同等であるので、ここでは演算部10Aについて説明する。図3に示されるように、演算部10Aは、データマルチプレクサ11(マルチプレクサ)と、乗算器12(第1乗算器)と、乗算器13(第2乗算器)と、乗算器14(第3乗算器)と、乗算器15(第4乗算器)と、レジスタ41と、レジスタ42と、レジスタ43と、を備える。データを送受信する2つの回路要素間は、送受信するデータのビット数に対応するバス幅のデータバスで接続されている。
レジスタ41〜43のそれぞれは、演算対象となる第1ビット数のビット列である入力データDIN1〜DIN3(第1〜第3入力データ)を記憶保持する回路である。第1ビット数は、第1演算モードで用いられるデータのビット数に相当し、例えば64ビットである。入力データDIN1〜DIN3は、演算装置1Aの外部の装置(本実施形態では、要素プロセッサ)からレジスタ41〜43にセットされる。入力データDIN1(第1入力データ)は、上位データdin1_h(第1上位データ)と、下位データdin1_l(第1下位データ)と、を含む。上位データdin1_hは、入力データDIN1のビット列のうちの最上位ビット(most significant bit:MSB)を含む上半分のビット列である。下位データdin1_lは、入力データDIN1のビット列のうちの最下位ビット(least significant bit:LSB)を含む下半分のビット列である。
入力データDIN2(第2入力データ)は、上位データdin2_h(第2上位データ)と、下位データdin2_l(第2下位データ)と、を含む。上位データdin2_hは、入力データDIN2のビット列のうちのMSBを含む上半分のビット列である。下位データdin2_lは、入力データDIN2のビット列のうちのLSBを含む下半分のビット列である。入力データDIN3(第3入力データ)は、上位データdin3_h(第3上位データ)と、下位データdin3_l(第3下位データ)と、を含む。上位データdin3_hは、入力データDIN3のビット列のうちのMSBを含む上半分のビット列である。下位データdin3_lは、入力データDIN3のビット列のうちのLSBを含む下半分のビット列である。
上位データdin1_h、下位データdin1_l、上位データdin2_h、下位データdin2_l、上位データdin3_h、及び下位データdin3_lは、第2ビット数のビット列である。第2ビット数は、第2演算モードで用いられるデータのビット数に相当し、例えば32ビットである。
データマルチプレクサ11は、レジスタ41〜43から出力されている入力データDIN1〜DIN3を入力し、MODE信号に応じて、複数(ここでは8つ)の出力データdout1〜dout8(第1〜第8出力データ)を出力する回路である。複数の出力データdout1〜dout8のそれぞれは、第2ビット数のビット列である。
データマルチプレクサ11は、MODE信号が第1演算モードを示す場合には、上位データdin1_hを出力データdout1(第1出力データ)及び出力データdout5(第5出力データ)として出力し、下位データdin1_lを出力データdout3(第3出力データ)及び出力データdout7(第7出力データ)として出力する。また、データマルチプレクサ11は、MODE信号が第1演算モードを示す場合には、上位データdin2_hを出力データdout2(第2出力データ)及び出力データdout4(第4出力データ)として出力し、下位データdin2_lを出力データdout6(第6出力データ)及び出力データdout8(第8出力データ)として出力する。データマルチプレクサ11は、MODE信号が第1演算モードを示す場合には、入力データDIN3を受け取らない。
データマルチプレクサ11は、MODE信号が第2演算モードを示す場合には、上位データdin1_hを出力データdout1及び出力データdout5として出力し、下位データdin1_lを出力データdout3及び出力データdout7として出力する。また、データマルチプレクサ11は、MODE信号が第2演算モードを示す場合には、上位データdin2_hを出力データdout2として出力し、下位データdin2_lを出力データdout4として出力する。また、データマルチプレクサ11は、MODE信号が第2演算モードを示す場合には、上位データdin3_hを出力データdout6として出力し、下位データdin3_lを出力データdout8として出力する。
乗算器12〜15は、第2ビット数を有する2つのビット列の乗算を行う回路である。乗算器12は、出力データdout1と出力データdout2との乗算を行う。乗算器12は、例えば、ウォレスツリー(Wallace Tree)回路を用いて2つのビット列の乗算を行い、乗算器12の乗算の途中結果である中間結果m11(第1中間結果)及び中間結果m12(第2中間結果)を乗算結果(第1乗算結果)として出力する。中間結果m11及び中間結果m12は、第2ビット数のビット列である。中間結果m11及び中間結果m12は、乗算器12の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。乗算器12は、中間結果m11を整列部21に出力し、中間結果m12を整列部22に出力するとともに、中間結果m11及び中間結果m12を部分加算器16に出力する。
乗算器13は、出力データdout3と出力データdout4との乗算を行う。乗算器13は、例えば、ウォレスツリー回路を用いて2つのビット列の乗算を行い、乗算器13の乗算の途中結果である中間結果m21(第3中間結果)及び中間結果m22(第4中間結果)を乗算結果(第2乗算結果)として出力する。中間結果m21及び中間結果m22は、第2ビット数のビット列である。中間結果m21及び中間結果m22は、乗算器13の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。乗算器13は、中間結果m21を整列部23に出力し、中間結果m22を整列部24に出力するとともに、中間結果m21及び中間結果m22を部分加算器16に出力する。
乗算器14は、出力データdout5と出力データdout6との乗算を行う。乗算器14は、例えば、ウォレスツリー回路を用いて2つのビット列の乗算を行い、乗算器14の乗算の途中結果である中間結果m31(第5中間結果)及び中間結果m32(第6中間結果)を乗算結果(第3乗算結果)として出力する。中間結果m31及び中間結果m32は、第2ビット数のビット列である。中間結果m31及び中間結果m32は、乗算器14の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。乗算器14は、中間結果m31を整列部25に出力し、中間結果m32を整列部26に出力するとともに、中間結果m31及び中間結果m32を部分加算器16に出力する。
乗算器15は、出力データdout7と出力データdout8との乗算を行う。乗算器15は、例えば、ウォレスツリー回路を用いて2つのビット列の乗算を行い、乗算器15の乗算の途中結果である中間結果m41(第7中間結果)及び中間結果m42(第8中間結果)を乗算結果(第4乗算結果)として出力する。中間結果m41及び中間結果m42は、第2ビット数のビット列である。中間結果m41及び中間結果m42は、乗算器15の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。乗算器15は、中間結果m41を整列部27に出力し、中間結果m42を整列部28に出力するとともに、中間結果m41及び中間結果m42を部分加算器16に出力する。
演算部10Aは、第1演算モードでの演算のために、部分加算器(partial adder)16と、整列部17と、整列部18と、丸め処理部19と、丸め処理部20と、をさらに備える。
部分加算器16は、第1演算モードの乗算結果を生成する回路である。具体的には、部分加算器16は、乗算器12〜15の乗算結果の加算を行う。本実施形態では、部分加算器16は、中間結果m11、中間結果m12、中間結果m21、中間結果m22、中間結果m31、中間結果m32、中間結果m41、及び中間結果m42の加算を行う。部分加算器16は、部分加算器16の加算の途中結果である中間結果P11及び中間結果P12を加算結果として出力する。中間結果P11及び中間結果P12は、第1ビット数のビット列である。中間結果P11及び中間結果P12は、部分加算器16の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。
整列部17は、後述の加算器51(第3加算器)によって加算されるビット列の指数部を揃えるために、中間結果P11の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部17は、整列部17の処理結果を丸め処理部19に出力する。整列部18は、加算器51によって加算されるビット列の指数部を揃えるために、中間結果P12の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部18は、整列部18の処理結果を丸め処理部20に出力する。
丸め処理部19は、整列部17によってシフト処理が行われた中間結果P11に対して丸め処理を行う回路である。丸め処理部19は、丸め処理部19の演算結果R11を加算部50(加算器51)に出力する。演算結果R11は、第1ビット数のビット列である。丸め処理部20は、整列部18によってシフト処理が行われた中間結果P12に対して丸め処理を行う回路である。丸め処理部20は、丸め処理部20の演算結果R12を加算部50(加算器51)に出力する。演算結果R12は、第1ビット数のビット列である。
演算部10Aは、第2演算モードでの演算のために、整列部21〜28と、丸め処理部31〜38と、をさらに備える。
整列部21は、後述の加算器52(第1加算器)によって加算されるビット列の指数部を揃えるために、中間結果m11の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部21は、整列部21の処理結果を丸め処理部31に出力する。整列部22は、加算器52によって加算されるビット列の指数部を揃えるために、中間結果m12の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部22は、整列部22の処理結果を丸め処理部32に出力する。整列部23は、加算器52によって加算されるビット列の指数部を揃えるために、中間結果m21の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部23は、整列部23の処理結果を丸め処理部33に出力する。整列部24は、加算器52によって加算されるビット列の指数部を揃えるために、中間結果m22の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部24は、整列部24の処理結果を丸め処理部34に出力する。
整列部25は、後述の加算器53(第2加算器)によって加算されるビット列の指数部を揃えるために、中間結果m31の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部25は、整列部25の処理結果を丸め処理部35に出力する。整列部26は、加算器53によって加算されるビット列の指数部を揃えるために、中間結果m32の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部26は、整列部26の処理結果を丸め処理部36に出力する。整列部27は、加算器53によって加算されるビット列の指数部を揃えるために、中間結果m41の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部27は、整列部27の処理結果を丸め処理部37に出力する。整列部28は、加算器53によって加算されるビット列の指数部を揃えるために、中間結果m42の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部28は、整列部28の処理結果を丸め処理部38に出力する。
丸め処理部31は、整列部21によってシフト処理が行われた中間結果m11に対して丸め処理を行う回路である。丸め処理部31は、丸め処理部31の演算結果r11を加算部50(加算器52)に出力する。丸め処理部32は、整列部22によってシフト処理が行われた中間結果m12に対して丸め処理を行う回路である。丸め処理部32は、丸め処理部32の演算結果r12を加算部50(加算器52)に出力する。丸め処理部33は、整列部23によってシフト処理が行われた中間結果m21に対して丸め処理を行う回路である。丸め処理部33は、丸め処理部33の演算結果r21を加算部50(加算器52)に出力する。丸め処理部34は、整列部24によってシフト処理が行われた中間結果m22に対して丸め処理を行う回路である。丸め処理部34は、丸め処理部34の演算結果r22を加算部50(加算器52)に出力する。演算結果r11,r12,r21,r22のそれぞれは、第2ビット数のビット列である。
丸め処理部35は、整列部25によってシフト処理が行われた中間結果m31に対して丸め処理を行う回路である。丸め処理部35は、丸め処理部35の演算結果r31を加算部50(加算器53)に出力する。丸め処理部36は、整列部26によってシフト処理が行われた中間結果m32に対して丸め処理を行う回路である。丸め処理部36は、丸め処理部36の演算結果r32を加算部50(加算器53)に出力する。丸め処理部37は、整列部27によってシフト処理が行われた中間結果m41に対して丸め処理を行う回路である。丸め処理部37は、丸め処理部37の演算結果r41を加算部50(加算器53)に出力する。丸め処理部38は、整列部28によってシフト処理が行われた中間結果m42に対して丸め処理を行う回路である。丸め処理部38は、丸め処理部38の演算結果r42を加算部50(加算器53)に出力する。演算結果r31,r32,r41,r42のそれぞれは、第2ビット数のビット列である。
図2に戻って、演算装置1Aの説明を続ける。加算部50は、加算器(final adder)51と、加算器(final adder)52と、加算器(final adder)53と、マルチプレクサ59(セレクタ)と、を備える。レジスタ40は、演算対象となる第1ビット数のビット列である入力データDIN0を記憶保持する回路である。入力データDIN0は、演算装置1Aの外部の装置(本実施形態では、要素プロセッサ)からレジスタ40にセットされる。入力データDIN0は、上位データdin0_hと、下位データdin0_lと、を含む。上位データdin0_h、及び下位データdin0_lは、第2ビット数のビット列である。レジスタ40は、上位データdin0_hを加算器52に出力し、下位データdin0_lを加算器53に出力するとともに、入力データDIN0を加算器51に出力する。
加算器51は、第1演算モードの演算結果D0(第3加算結果)を生成する回路である。具体的には、演算部10A〜10Dの部分加算器16の加算結果と入力データDIN0との加算を行う。本実施形態では、加算器51は、演算部10A〜10Dの演算結果R11と、演算部10A〜10Dの演算結果R12と、入力データDIN0との加算を行う。加算器51は、加算器51の加算結果を演算結果D0としてマルチプレクサ59に出力する。演算結果D0は、第1ビット数のビット列である。
加算器52は、第2演算モードの演算結果d0(第1加算結果)を生成する回路である。具体的には、加算器52は、各演算部10A〜10Dの乗算器12の乗算結果及び乗算器13の乗算結果と、上位データdin0_hとの加算を行う。本実施形態では、加算器52は、演算部10A〜10Dの演算結果r11,r12,r21,r22と、上位データdin0_hとの加算を行う。加算器52は、加算器52の加算結果を演算結果d0としてマルチプレクサ59に出力する。演算結果d0は、第2ビット数のビット列である。
加算器53は、第2演算モードの演算結果d1(第2加算結果)を生成する回路である。具体的には、加算器53は、各演算部10A〜10Dの乗算器14の乗算結果及び乗算器15の乗算結果と、下位データdin0_lとの加算を行う。本実施形態では、加算器53は、演算部10A〜10Dの演算結果r31,r32,r41,r42と、下位データdin0_lとの加算を行う。加算器53は、加算器53の加算結果を演算結果d1としてマルチプレクサ59に出力する。演算結果d1は、第2ビット数のビット列である。なお、演算結果d0及び演算結果d1が組み合わされて演算結果(d0,d1)が生成される。演算結果(d0,d1)は、演算結果d0を上位ビットとし、演算結果d1を下位ビットとするビット列である。つまり、演算結果(d0,d1)は、第1ビット数のビット列である。
マルチプレクサ59は、演算結果D0及び演算結果(d0,d1)を入力し、MODE信号に応じて、演算結果D0と演算結果(d0,d1)とのいずれかを出力する回路である。マルチプレクサ59は、MODE信号が第1演算モードを示す場合には、演算結果D0を出力する。マルチプレクサ59は、MODE信号が第2演算モードを示す場合には、演算結果(d0,d1)を出力する。
次に、図2〜図4を用いて演算装置1A〜1Dの第1演算モードでの動作を説明する。図4は、図2の演算装置の第1演算モードでの動作を説明するための図である。ここでは、第1演算モードとして、倍精度演算モードを用い、演算ユニットMAUが式(1)に示される倍精度の行列演算を行う場合を一例として説明する。この行列演算は、倍精度データA0〜A3、倍精度データB00〜B03,B10〜B13,B20〜B23,B30〜B33、及び倍精度データC0〜C3を用いた演算である。
演算装置1A〜1Dはそれぞれ、式(2)〜(5)に示される行列演算を行う。
演算装置1A〜1Dでは、演算対象のデータが異なるものの、動作は同じであるので、ここでは演算装置1Aについて説明する。演算装置1Aの演算部10Aは、A0×B00の演算を行う。演算装置1Aの演算部10Bは、A1×B10の演算を行う。演算装置1Aの演算部10Cは、A2×B20の演算を行う。演算装置1Aの演算部10Dは、A3×B30の演算を行う。各演算部10A〜10Dでは、演算対象のデータが異なるものの、動作は同じであるので、演算部10Aの動作を主に説明する。
倍精度データA0は、上位データa0_hと、下位データa0_lと、を含む。上位データa0_hは、倍精度データA0のビット列のうちのMSBを含む上半分のビット列であり、単精度データと同じビット数を有する。下位データa0_lは、倍精度データA0のビット列のうちのLSBを含む下半分のビット列であり、単精度データと同じビット数を有する。倍精度データB00は、上位データb00_hと、下位データb00_lと、を含む。上位データb00_hは、倍精度データB00のビット列のうちのMSBを含む上半分のビット列であり、単精度データと同じビット数を有する。下位データa0_lは、倍精度データB00のビット列のうちのLSBを含む下半分のビット列であり、単精度データと同じビット数を有する。
演算部10Aは、式(6)に示されるように、倍精度データA0及び倍精度データB00のそれぞれを単精度データのビット数を有する2つのデータに分解することによって、倍精度データA0及び倍精度データB00の乗算を行う。
以下、具体的に説明する。レジスタ41には、倍精度データA0が記憶されており、レジスタ41からデータマルチプレクサ11に入力データDIN1として倍精度データA0が供給されている。レジスタ42には、倍精度データB00が記憶されており、レジスタ42からデータマルチプレクサ11に入力データDIN2として倍精度データB00が供給されている。レジスタ43には、有効なデータは記憶されていない。
データマルチプレクサ11には、倍精度演算モード(第1演算モード)を示すMODE信号が供給されている。このため、データマルチプレクサ11は、上位データa0_hを出力データdout1及び出力データdout5として出力し、下位データa0_lを出力データdout3及び出力データdout7として出力する。また、データマルチプレクサ11は、上位データb00_hを出力データdout2及び出力データdout4として出力し、下位データb00_lを出力データdout6及び出力データdout8として出力する。
そして、乗算器12は、上位データa0_hと上位データb00_hとの乗算を行い、中間結果m11及び中間結果m12を出力する。同様に、乗算器13は、下位データa0_lと上位データb00_hとの乗算を行い、中間結果m21及び中間結果m22を出力する。同様に、乗算器14は、上位データa0_hと下位データb00_lとの乗算を行い、中間結果m31及び中間結果m32を出力する。同様に、乗算器15は、下位データa0_lと下位データb00_lとの乗算を行い、中間結果m41及び中間結果m42を出力する。
そして、部分加算器16は、中間結果m11、中間結果m12、中間結果m21、中間結果m22、中間結果m31、中間結果m32、中間結果m41、及び中間結果m42の加算を行い、中間結果P11及び中間結果P12を出力する。そして、整列部17は、中間結果P11の仮数部に対してシフト処理を行い、整列部17の処理結果を丸め処理部19に出力する。同様に、整列部18は、中間結果P12の仮数部に対してシフト処理を行い、整列部18の処理結果を丸め処理部20に出力する。
そして、丸め処理部19は、整列部17によってシフト処理が行われた中間結果P11に対して丸め処理を行い、演算結果R11を加算器51に出力する。同様に、丸め処理部20は、整列部18によってシフト処理が行われた中間結果P12に対して丸め処理を行い、演算結果R12を加算器51に出力する。
演算部10B、演算部10C、及び演算部10Dにおいても、同様の演算が行われ、各演算部10A〜10Dは、演算結果R11及び演算結果R12を加算器51に出力する。また、レジスタ40には、倍精度データC0が記憶されており、レジスタ40から加算器51に倍精度データC0が供給されている。
そして、加算器51は、演算部10A〜10Dの演算結果R11及び演算結果R12、並びにレジスタ40から供給されている倍精度データC0の加算を行い、加算器51の加算結果を演算結果D0としてマルチプレクサ59に出力する。このとき、整列部21〜28、丸め処理部31〜38、加算器52、及び加算器53も演算を行っており、演算結果(d0,d1)がマルチプレクサ59に出力されている。マルチプレクサ59には、倍精度演算モードを示すMODE信号が供給されているので、マルチプレクサ59は、演算結果D0を出力する。このようにして、倍精度の行列演算が行われる。
次に、図2、図3、及び図5を用いて演算装置1A〜1Dの第2演算モードでの動作を説明する。図5は、図2の演算装置の第2演算モードでの動作を説明するための図である。ここでは、第2演算モードとして、単精度演算モードを用い、演算ユニットMAUが式(7)に示される単精度の行列演算を行う場合を一例として説明する。式(7)に示される行列演算は、単精度データa0〜a7、単精度データb00〜b07,b10〜b17,b20〜b27,b30〜b37,b40〜b47,b50〜b57,b60〜b67,b70〜b77、及び単精度データc0〜c7を用いた演算である。
演算装置1Aは、式(8)及び式(9)に示される行列演算を行う。
演算装置1Bは、式(10)及び式(11)に示される行列演算を行う。
演算装置1Cは、式(12)及び式(13)に示される行列演算を行う。
演算装置1Dは、式(14)及び式(15)に示される行列演算を行う。
演算装置1A〜1Dでは、演算対象のデータが異なるものの、動作は同じであるので、ここでは演算装置1Aについて説明する。演算装置1Aの演算部10Aは、a0×b00+a1×b10の演算、及びa0×b01+a1×b11の演算を行う。演算装置1Aの演算部10Bは、a2×b20+a3×b30の演算、及びa2×b21+a3×b31の演算を行う。演算装置1Aの演算部10Cは、a4×b40+a5×b50の演算、及びa4×b41+a5×b51の演算を行う。演算装置1Aの演算部10Dは、a6×b60+a7×b70の演算、及びa6×b61+a7×b71の演算を行う。各演算部10A〜10Dでは、演算対象のデータが異なるものの、動作は同じであるので、演算部10Aの動作を主に説明する。
レジスタ41の上位ビットには、単精度データa0が記憶されており、レジスタ41の下位ビットには単精度データa1が記憶されている。レジスタ41からデータマルチプレクサ11に入力データDIN1として単精度データa0及び単精度データa1が供給されている。レジスタ42の上位ビットには、単精度データb00が記憶されており、レジスタ42の下位ビットには単精度データb10が記憶されている。レジスタ42からデータマルチプレクサ11に入力データDIN2として単精度データb00及び単精度データb10が供給されている。レジスタ43の上位ビットには、単精度データb01が記憶されており、レジスタ43の下位ビットには単精度データb11が記憶されている。レジスタ43からデータマルチプレクサ11に入力データDIN3として単精度データb01及び単精度データb11が供給されている。
データマルチプレクサ11には、単精度演算モードを示すMODE信号が供給されている。このため、データマルチプレクサ11は、単精度データa0を出力データdout1及び出力データdout5として出力し、単精度データa1を出力データdout3及び出力データdout7として出力する。また、データマルチプレクサ11は、単精度データb00を出力データdout2として出力し、単精度データb10を出力データdout4として出力する。また、データマルチプレクサ11は、単精度データb01を出力データdout6として出力し、単精度データb11を出力データdout8として出力する。
そして、乗算器12は、単精度データa0と単精度データb00との乗算を行い、中間結果m11及び中間結果m12を出力する。同様に、乗算器13は、単精度データa1と単精度データb10との乗算を行い、中間結果m21及び中間結果m22を出力する。同様に、乗算器14は、単精度データa0と単精度データb01との乗算を行い、中間結果m31及び中間結果m32を出力する。同様に、乗算器15は、単精度データa1と単精度データb11との乗算を行い、中間結果m41及び中間結果m42を出力する。
そして、整列部21〜28は、中間結果m11,m12,m21,m22,m31,m32,m41,m42の仮数部に対してシフト処理を行い、整列部21〜28の処理結果を丸め処理部31〜38に出力する。そして、丸め処理部31〜34は、整列部21〜24によってシフト処理が行われた中間結果m11,m12,m21,m22に対して丸め処理を行い、演算結果r11,r12,r21,r22を加算器52に出力する。同様に、丸め処理部35〜38は、整列部25〜28によってシフト処理が行われた中間結果m31,m32,m41,m42に対して丸め処理を行い、演算結果r31,r32,r41,r42を加算器53に出力する。
演算部10B、演算部10C、及び演算部10Dにおいても、同様の演算が行われ、各演算部10A〜10Dは、演算結果r11,r12,r21,r22を加算器52に出力するとともに、演算結果r31,r32,r41,r42を加算器53に出力する。また、レジスタ40の上位ビットには、単精度データc0が記憶されており、レジスタ40の下位ビットには単精度データc1が記憶されている。そして、レジスタ40から加算器52に単精度データc0が供給されるとともに、加算器53に単精度データc1が供給されている。
そして、加算器52は、演算部10A〜10Dの演算結果r11,r12,r21,r22、及びレジスタ40から供給されている単精度データc0の加算を行い、加算器52の加算結果を演算結果d0として出力する。また、加算器53は、演算部10A〜10Dの演算結果r31,r32,r41,r42、及びレジスタ40から供給されている単精度データc1の加算を行い、加算器53の加算結果を演算結果d1として出力する。そして、演算結果d0及び演算結果d1が組み合わされて演算結果(d0,d1)が生成され、マルチプレクサ59に供給される。このとき、部分加算器16、整列部17,18、丸め処理部19,20、及び加算器51も演算を行っており、演算結果D0がマルチプレクサ59に出力されている。マルチプレクサ59には、単精度演算モードを示すMODE信号が供給されているので、マルチプレクサ59は、演算結果(d0,d1)を出力する。このようにして、2つの単精度の行列演算が行われる。
次に、比較例の演算装置と比較して、演算装置1A〜1Dの作用効果を説明する。図6は、比較例の演算装置に含まれる演算部の構成を概略的に示す図である。図6に示される演算部100は、演算部10A〜10Dと比較して、レジスタ43を備えない点、データマルチプレクサ11に代えてデータマルチプレクサ111を備える点、整列部21〜28、及び丸め処理部31〜38に代えて加算器61〜64、整列部65〜68、及び丸め処理部69〜72を備える点、部分加算器16に代えて部分加算器116を備える点、並びに整列部17,18及び丸め処理部19,20に代えて整列部117及び丸め処理部119を備える点において主に相違する。
データマルチプレクサ111には、MODE信号が供給されない。このため、データマルチプレクサ111は、演算モードによらず、上位データdin1_hを出力データdout1及び出力データdout5として出力し、下位データdin1_lを出力データdout3及び出力データdout7として出力する。また、データマルチプレクサ111は、上位データdin2_hを出力データdout2及び出力データdout4として出力し、下位データdin2_lを出力データdout6及び出力データdout8として出力する。
加算器61は、中間結果m11、及び中間結果m12を加算することにより、乗算器12の乗算結果m1を生成する回路である。加算器61は、乗算結果m1を整列部65に出力する。加算器62は、中間結果m21、及び中間結果m22を加算することにより、乗算器13の乗算結果m2を生成する回路である。加算器62は、乗算結果m2を整列部66に出力する。加算器63は、中間結果m31、及び中間結果m32を加算することにより、乗算器14の乗算結果m3を生成する回路である。加算器63は、乗算結果m3を整列部67に出力する。加算器64は、中間結果m41、及び中間結果m42を加算することにより、乗算器15の乗算結果m4を生成する回路である。加算器64は、乗算結果m4を整列部68に出力する。乗算結果m1〜m4のそれぞれは、第2ビット数のビット列である。
整列部65は、部分加算器116によって加算されるビット列の指数部を揃えるために、乗算結果m1の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部65は、整列部65の処理結果を丸め処理部69に出力する。整列部66は、部分加算器116によって加算されるビット列の指数部を揃えるために、乗算結果m2の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部66は、整列部66の処理結果を丸め処理部70に出力する。整列部67は、部分加算器116によって加算されるビット列の指数部を揃えるために、乗算結果m3の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部67は、整列部67の処理結果を丸め処理部71に出力する。整列部68は、部分加算器116によって加算されるビット列の指数部を揃えるために、乗算結果m4の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部68は、整列部68の処理結果を丸め処理部72に出力する。
丸め処理部69は、整列部65によってシフト処理が行われた乗算結果m1に対して丸め処理を行う回路である。丸め処理部69は、丸め処理部69の演算結果r1を部分加算器116に出力する。丸め処理部70は、整列部66によってシフト処理が行われた乗算結果m2に対して丸め処理を行う回路である。丸め処理部70は、丸め処理部70の演算結果r2を部分加算器116に出力する。丸め処理部71は、整列部67によってシフト処理が行われた乗算結果m3に対して丸め処理を行う回路である。丸め処理部71は、丸め処理部71の演算結果r3を部分加算器116に出力する。丸め処理部72は、整列部68によってシフト処理が行われた乗算結果m4に対して丸め処理を行う回路である。丸め処理部72は、丸め処理部72の演算結果r4を部分加算器116に出力する。演算結果r1〜r4のそれぞれは、第2ビット数のビット列である。
部分加算器116は、演算結果r1〜r4の加算を行い、第1ビット数のビット列である加算結果P1を出力する。整列部117は、後段の加算器(不図示)によって加算されるビット列の指数部を揃えるために、加算結果P1の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部117は、整列部117の処理結果を丸め処理部119に出力する。丸め処理部119は、整列部117によってシフト処理が行われた加算結果P1に対して丸め処理を行う回路である。丸め処理部119は、丸め処理部119の演算結果R1を後段の加算器に出力する。
演算部100は、第1演算モードでは、演算部10A〜10Dと同様に、第1ビット数を有する2つのデータのそれぞれを第2ビット数を有する2つのデータに分解することによって、第1ビット数を有する2つのデータの乗算を行う。第1演算モードとして倍精度演算モードを用い、倍精度データA0及び倍精度データB00を用いたA0×B00の演算を行う場合について説明する。図4と同様に、レジスタ41には、倍精度データA0が記憶されており、レジスタ41からデータマルチプレクサ111に入力データDIN1として倍精度データA0が供給されている。レジスタ42には、倍精度データB00が記憶されており、レジスタ42からデータマルチプレクサ111に入力データDIN2として倍精度データB00が供給されている。データマルチプレクサ111及び乗算器12〜15の動作は、第1演算モードにおける演算部10A〜10Dのデータマルチプレクサ11及び乗算器12〜15と同じであるので、説明を省略する。
そして、加算器61は、中間結果m11及び中間結果m12を加算することにより、乗算器12の乗算結果m1を生成し、乗算結果m1を整列部65に出力する。同様に、加算器62は、中間結果m21及び中間結果m22を加算することにより、乗算器13の乗算結果m2を生成し、乗算結果m2を整列部66に出力する。同様に、加算器63は、中間結果m31及び中間結果m32を加算することにより、乗算器14の乗算結果m3を生成し、乗算結果m3を整列部67に出力する。同様に、加算器64は、中間結果m41及び中間結果m42を加算することにより、乗算器14の乗算結果m4を生成し、乗算結果m4を整列部68に出力する。
そして、整列部65〜68は、乗算結果m1〜m4の仮数部に対してシフト処理を行い、整列部65〜68の処理結果を丸め処理部69〜72に出力する。そして、丸め処理部69〜72は、整列部65〜68によってシフト処理が行われた乗算結果m1〜m4に対して丸め処理を行い、演算結果r1〜r4を部分加算器116に出力する。
そして、部分加算器116は、演算結果r1〜r4の加算を行い、加算結果P1を出力する。そして、整列部117は、加算結果P1の仮数部に対してシフト処理を行い、整列部117の処理結果を丸め処理部119に出力する。そして、丸め処理部119は、整列部117によってシフト処理が行われた加算結果P1に対して丸め処理を行い、演算結果R1を後段の加算器に出力する。このようにして、A0×B00の演算結果R1が得られる。
一方、第2演算モードでは、演算部100は、第2ビット数を有する4つのデータを用いて、2つの乗算を行う。第2演算モードとして単精度演算モードを用い、単精度データa0及び単精度データb00を用いたa0×b00の演算と、単精度データa1及び単精度データb10を用いたa1×b10の演算とを行う場合について説明する。レジスタ41の上位ビットには、単精度データa0が記憶されており、レジスタ41の下位ビットには単精度データa1が記憶されている。レジスタ41からデータマルチプレクサ11に入力データDIN1として単精度データa0及び単精度データa1が供給されている。レジスタ42の上位ビットには、単精度データb00が記憶されており、レジスタ42の下位ビットには単精度データb10が記憶されている。レジスタ42からデータマルチプレクサ11に入力データDIN2として単精度データb00及び単精度データb10が供給されている。
データマルチプレクサ111は、単精度データa0を出力データdout1及び出力データdout5として出力し、単精度データa1を出力データdout3及び出力データdout7として出力する。また、データマルチプレクサ111は、単精度データb00を出力データdout2及び出力データdout4として出力し、単精度データb10を出力データdout6及び出力データdout8として出力する。
そして、乗算器12は、単精度データa0と単精度データb00との乗算を行い、中間結果m11及び中間結果m12を出力する。同様に、乗算器13は、単精度データa1と単精度データb00との乗算を行い、中間結果m21及び中間結果m22を出力する。同様に、乗算器14は、単精度データa0と単精度データb10との乗算を行い、中間結果m31及び中間結果m32を出力する。同様に、乗算器15は、単精度データa1と単精度データb10との乗算を行い、中間結果m41及び中間結果m42を出力する。加算器61〜64、整列部65〜68、及び丸め処理部69〜72の動作は、第1演算モードと同様であるので説明を省略する。
しかしながら、a0×b00の演算結果及びa1×b10の演算結果を得るために、乗算器13及び乗算器14の乗算結果は用いられない。つまり、演算部100では、乗算器13及び乗算器14は有効な演算を行っていないといえる。
これに対し、演算装置1A〜1Dでは、MODE信号が第1演算モードを示す場合には、入力データDIN1の上位データdin1_h及び入力データDIN2の上位データdin2_hが乗算器12に供給され、乗算器12はこれらのデータの乗算を行う。また、入力データDIN1の下位データdin1_l及び入力データDIN2の上位データdin2_hが乗算器13に供給され、乗算器13はこれらのデータの乗算を行う。また、入力データDIN1の上位データdin1_h及び入力データDIN2の下位データdin2_lが乗算器14に供給され、乗算器14はこれらのデータの乗算を行う。また、入力データDIN1の下位データdin1_l及び入力データDIN2の下位データdin2_lが乗算器15に供給され、乗算器15はこれらのデータの乗算を行う。つまり、第1ビット数を有する1つのデータを、第2ビット数を有する2つのデータに分割して、乗算が行われる。
一方、演算装置1A〜1Dでは、MODE信号が第2演算モードを示す場合には、入力データDIN1の上位データdin1_h及び入力データDIN2の上位データdin2_hが乗算器12に供給され、乗算器12はこれらのデータの乗算を行う。また、入力データDIN1の下位データdin1_l及び入力データDIN2の下位データdin2_lが乗算器13に供給され、乗算器13はこれらのデータの乗算を行う。また、入力データDIN1の上位データdin1_h及び入力データDIN3の上位データdin3_hが乗算器14に供給され、乗算器14はこれらのデータの乗算を行う。また、入力データDIN1の下位データdin1_l及び入力データDIN3の下位データdin3_lが乗算器15に供給され、乗算器15はこれらのデータの乗算を行う。このように、第1演算モードだけでなく、第2演算モードにおいても、乗算器12〜15の全ての乗算器が有効な演算を行う。その結果、演算装置1A〜1Dの回路規模を拡大することなく、演算装置1A〜1Dの演算性能を向上させることが可能となる。つまり、価格あたりの演算性能を向上させることが可能となる。
また、比較例の演算装置では、第2演算モードにおいて、演算部100の乗算器12〜15のうち、2つの乗算器が有効な演算を行っているのに対し、演算装置1A〜1Dでは、演算部10A〜10Dの乗算器12〜15の全ての乗算器が有効な演算を行っている。このため、電力あたりの演算性能を向上させることが可能となる。言い換えれば、演算装置1A〜1Dでは、比較例の演算装置に対し、演算装置1A〜1Dを構成するトランジスタ等の回路素子の活用効率が向上するので、同じ演算性能を安価かつ低消費電力で提供することが可能となる。
加算器52によって、入力データDIN1の上位データdin1_h及び下位データdin1_lと、入力データDIN2の上位データdin2_h及び下位データdin2_lと、のベクトル積が得られ、加算器53によって、入力データDIN1の上位データdin1_h及び下位データdin1_lと、入力データDIN3の上位データdin3_h及び下位データdin3_lと、のベクトル積が得られる。また、部分加算器16によって、入力データDIN1と入力データDIN2との乗算結果(第1ビット数を有する2つのビット列の乗算結果)が得られる。
乗算器12は、乗算器12の乗算の途中結果である中間結果m11,m12を乗算結果として出力ししている。この中間結果m11,m12は、乗算器12の演算遅延を生じさせない乗算器12の乗算の途中結果である。このため、乗算器12の乗算結果として中間結果m11,m12が出力されることにより、乗算器12の演算処理において、例えば桁上がり等による遅延を抑制することができる。これにより、乗算器12の演算速度を向上させることが可能となる。同様に、乗算器13〜15の演算速度を向上させることが可能となる。また、乗算の中間結果を用いることにより、後段の部分加算器16における加算のために、加算対象となるビット列の指数部を揃える処理を省略し得るので、演算装置1A〜1Dの演算速度を向上させることが可能となる。
また、加算器52及び加算器53によって、第2ビット数を有するデータでの2つの行列演算結果が得られ、加算器51によって、第1ビット数を有するデータでの1つの行列演算結果が得られる。そして、マルチプレクサ59によって、MODE信号が第1演算モードを示す場合には、第1ビット数を有するデータでの1つの行列演算結果が出力され、MODE信号が第2演算モードを示す場合には、第2ビット数を有するデータでの2つの行列演算結果が出力される。このように、演算装置1A〜1Dでは、2つの演算モードに応じた行列演算を行うことが可能となる。したがって、並列演算が必要となるDNN及びCNNに演算装置1A〜1Dが適用された場合には、必要となる行列積に対して高い演算性能を実現することができる。また、演算装置1A〜1Dに行列演算を行わせることにより、データマルチプレクサ11に供給するデータ数を減らすことができ、演算対象のデータを供給するためのデータバスのバンド幅を削減することが可能となる。
第1演算モードが倍精度演算モードであり、第2演算モードが単精度演算モードである場合、演算部10A〜10Dのそれぞれは、1個の倍精度の乗算器、及び4個の単精度の乗算器として再構成可能である。これにより、演算装置1A〜1Dは、倍精度演算モード及び単精度演算モードでの演算を行うことが可能となる。このような演算装置1A〜1Dにおいても、演算装置1A〜1Dの回路規模を拡大することなく、演算性能を向上させることが可能となる。
第1演算モードが単精度演算モードであり、第2演算モードが半精度演算モードである場合、演算部10A〜10Dのそれぞれは、1個の単精度の乗算器、及び4個の半精度の乗算器として再構成可能である。これにより、演算装置1A〜1Dは、単精度演算モード及び半精度演算モードでの演算を行うことが可能となる。このような演算装置1A〜1Dにおいても、演算装置1A〜1Dの回路規模を拡大することなく、演算性能を向上させることが可能となる。
さらに、演算システムSでは、演算ユニットMAUは、4つの演算装置1A〜1Dを備えることにより、式(1)に示されるような倍精度データの行列演算(4×4の行列ベクトル積)を行うことができる。演算ユニットMAUは、単精度演算モードでは式(7)に示されるような8×8の行列ベクトル積を行うことが可能となる。この構成によれば、倍精度演算モードでは、それぞれが52ビットの仮数の乗算を行う16個の並列乗算器(1サイクルで1乗算を行う回路)を有する回路に相当する演算性能を実現することができる。単精度演算モードでは、それぞれが23ビットの仮数の乗算を行う64個の並列乗算器を有する回路に相当する演算性能を実現することができる。
また、要素プロセッサPE1〜PE4は、行列演算を行う場合には、単一のプロセッサとして動作するので、行列演算を要素プロセッサPE1〜PE4で並列処理することができる。これにより、行列演算の演算速度を向上させることが可能となる。
また、要素プロセッサPE1〜PE4は、1つのインストラクションで動作するSIMD動作を行うので、要素プロセッサPE1〜PE4が並列動作する。これにより、処理の高速化が可能となる。
演算システムSには、プロセッサIDを含むメモリアドレスによってアクセス可能なメモリ空間が設定されている。要素プロセッサPE1〜PE4のそれぞれは、当該プロセッサIDを含むメモリアドレスによって示されるメモリ領域にアクセス可能である。このため、メモリ空間を拡張することができ、演算システムSで扱えるデータサイズを大きくすることが可能となる。
要素プロセッサPE1〜PE4のそれぞれは、演算ユニットMAUから受信したデータをリング結合を介して他の要素プロセッサに順に転送(循環シフト)することができる。これにより、要素プロセッサPE1〜PE4のそれぞれは、非担当領域へのアクセスを実行することが可能となる。
上記実施形態では、演算部10A〜10Dのそれぞれは、行列演算の専用回路として構成されている。つまり、乗算器12〜15の乗算の中間結果を用いて加算を行っているので、乗算器12〜15の乗算結果が得られない。図7に示されるように、変形例の演算部10Aは、整列部21〜28及び丸め処理部31〜38に代えて、加算器61〜64と、整列部65〜68と、丸め処理部69〜72と、を備える点で、上記実施形態の演算部10Aと主に相違している。
加算器61〜64は、比較例の演算部100の加算器61〜64と比較して、乗算結果m1〜m4を部分加算器16にも出力する点において相違し、その余の処理については同じである。整列部65〜68は、比較例の演算部100の整列部65〜68と同じであるので、説明を省略する。丸め処理部69〜72は、比較例の演算部100の丸め処理部69〜72と比較して、演算結果の出力先において相違する。具体的には、丸め処理部69は、演算結果r1を加算器52に出力する。丸め処理部70は、演算結果r2を加算器52に出力する。丸め処理部71は、演算結果r3を加算器53に出力する。丸め処理部72は、演算結果r4を加算器53に出力する。
変形例の演算部10Aによれば、加算器61〜64によって、第2演算モードでの乗算結果m1〜m4が得られる。このため、演算部10Aは、行列演算以外にも用いられ得る。
(第2実施形態)
図8は、第2実施形態に係る演算装置の構成を概略的に示す図である。図8に示される演算装置1Aは、第1実施形態に係る演算装置1Aと比較して、切り替え可能な演算モードの数、並びに、演算部10A〜10D、及び加算部50に代えて、演算部210A〜210D、及び加算部250を備える点において主に相違する。
第2実施形態に係る演算装置1Aは、MODE信号に応じて、演算装置1Aの演算モードを第1演算モード、第2演算モード、及び第3演算モードのいずれかに切り替える。第3演算モードは、第3ビット数のデータを用いた演算を行うモードである。第3ビット数は、第1ビット数の4分の1であり、第2ビット数の半分のビット数である。MODE信号は、例えば2ビットの信号であり、第1演算モード、第2演算モード、及び第3演算モードのいずれかを示す。演算装置1Aが実行し得る演算モードとしては、例えば、倍精度演算モード、単精度演算モード、及び半精度演算モードが挙げられる。つまり、第1演算モードが倍精度演算モードである場合、第2演算モードは単精度演算モードであり、第3演算モードは半精度演算モードである。
図9は、図8の演算装置に含まれる演算部の構成を概略的に示す図である。演算部210A〜210Dは、同様の構成を有するので、ここでは、演算部210Aの構成について、演算部10Aとの相違点を中心に説明する。図9に示されるように、演算部210Aは、演算部10Aと比較して、データマルチプレクサ11及び乗算器12〜15に代えてデータマルチプレクサ211及び乗算器212〜215を備える点、レジスタ44,45をさらに備える点において、主に相違する。
レジスタ41〜45のそれぞれは、演算対象となる第1ビット数のビット列である入力データDIN1〜DIN5を記憶保持する。入力データDIN1〜DIN5は、演算装置1Aの外部の装置(本実施形態では、要素プロセッサ)からレジスタ41〜45にセットされる。入力データDIN1は、上述のように、上位データdin1_hと、下位データdin1_lと、を含む。上位データdin1_hは、データdin’1_1及びデータdin’1_2を含み、下位データdin1_lは、データdin’1_3及びデータdin’1_4を含む。データdin’1_1〜din’1_4は、その順に入力データDIN1のビット列のMSBから順に配列されている。入力データDIN2〜DIN5についても同様である。データdin’1_1〜din’1_4、データdin’2_1〜din’2_4、データdin’3_1〜din’3_4、データdin’4_1〜din’4_4、及びデータdin’5_1〜din’5_4は、第3ビット数のビット列である。第3ビット数は、第3演算モードで用いられるデータのビット数に相当し、例えば16ビットである。
データマルチプレクサ211は、レジスタ41〜45から出力されている入力データDIN1〜DIN5を入力し、MODE信号に応じて、複数の出力データdout1〜dout12を出力する回路である。出力データdout1〜dout12のそれぞれは、第2ビット数のビット列である。
MODE信号が第1演算モードを示す場合、及びMODE信号が第2演算モードを示す場合のデータマルチプレクサ211の動作は、データマルチプレクサ11の動作と同じである。データマルチプレクサ211は、MODE信号が第3演算モードを示す場合には、上位データdin1_hを出力データdout1及び出力データdout5として出力し、下位データdin1_lを出力データdout3及び出力データdout7として出力する。また、データマルチプレクサ211は、MODE信号が第3演算モードを示す場合には、上位データdin2_hを出力データdout2として出力し、下位データdin2_lを出力データdout4として出力する。
また、データマルチプレクサ211は、MODE信号が第3演算モードを示す場合には、上位データdin3_hを出力データdout9として出力し、下位データdin3_lを出力データdout10として出力する。また、データマルチプレクサ211は、MODE信号が第3演算モードを示す場合には、上位データdin4_hを出力データdout6として出力し、下位データdin4_lを出力データdout8として出力する。また、データマルチプレクサ211は、MODE信号が第3演算モードを示す場合には、上位データdin5_hを出力データdout11として出力し、下位データdin5_lを出力データdout12として出力する。
乗算器212〜215は、第2ビット数を有する2つのビット列の乗算を行う回路である。乗算器212〜215は、同様の構成を有するので、ここでは、乗算器212の構成について説明する。図10は、図9の乗算器の構成を概略的に示す図である。図10に示されるように、乗算器212は、データマルチプレクサ311と、乗算器312〜315と、部分加算器316と、を備えている。
データマルチプレクサ311は、出力データdout1,dout2,dout9を入力し、MODE信号に応じて、複数(ここでは8つ)の出力データdout’1〜dout’8を出力する回路である。複数の出力データdout’1〜dout’8のそれぞれは、第3ビット数のビット列である。出力データdout1は、データdout’1_h及びデータdout’1_lを含む。データdout’1_h及びデータdout’1_lは、その順に出力データdout1のビット列のMSBから順に配列されている。出力データdout2〜dout12についても同様である。データdout’1_h〜dout’12_h,dout’1_l〜dout’12_lは、第3ビット数のビット列である。
データマルチプレクサ311は、MODE信号が第1演算モード及び第2演算モードを示す場合には、データdout’1_hを出力データdout’1及び出力データdout’5として出力し、データdin’1_lを出力データdout’3及び出力データdout’7として出力する。また、データマルチプレクサ311は、MODE信号が第1演算モード及び第2演算モードを示す場合には、データdout’2_hを出力データdout’2及び出力データdout’4として出力し、データdout’2_lを出力データdout’6及び出力データdout’8として出力する。データマルチプレクサ311は、MODE信号が第1演算モード及び第2演算モードを示す場合には、出力データdout9を受け取らない。つまり、データマルチプレクサ311の第1演算モード及び第2演算モードでの動作は、データマルチプレクサ11の第1演算モードでの動作と同じである。
データマルチプレクサ311は、MODE信号が第3演算モードを示す場合には、データdout’1_hを出力データdout’1及び出力データdout’5として出力し、データdin’1_lを出力データdout’3及び出力データdout’7として出力する。また、データマルチプレクサ311は、MODE信号が第3演算モードを示す場合には、データdout’2_hを出力データdout’2として出力し、データdout’2_lを出力データdout’4として出力する。また、データマルチプレクサ311は、MODE信号が第3演算モードを示す場合には、データdout’9_hを出力データdout’6として出力し、データdout’9_lを出力データdout’8として出力する。つまり、データマルチプレクサ311の第3演算モードでの動作は、データマルチプレクサ11の第2演算モードでの動作と同じである。
乗算器312〜315は、第3ビット数を有する2つのビット列の乗算を行う回路である。乗算器312は、出力データdout’1と出力データdout’2との乗算を行う。乗算器312は、例えば、ウォレスツリー回路を用いて2つのビット列の乗算を行い、乗算器312の乗算の途中結果である中間結果m’11及び中間結果m’12を乗算結果として出力する。中間結果m’11及び中間結果m’12は、第3ビット数のビット列である。中間結果m’11及び中間結果m’12は、乗算器312の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。乗算器312は、中間結果m’11を整列部321に出力し、中間結果m’12を整列部322に出力するとともに、中間結果m’11及び中間結果m’12を部分加算器316に出力する。
乗算器313は、出力データdout’3と出力データdout’4との乗算を行う。乗算器313は、例えば、ウォレスツリー回路を用いて2つのビット列の乗算を行い、乗算器313の乗算の途中結果である中間結果m’21及び中間結果m’22を乗算結果として出力する。中間結果m’21及び中間結果m’22は、第3ビット数のビット列である。中間結果m’21及び中間結果m’22は、乗算器313の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。乗算器313は、中間結果m’21を整列部323に出力し、中間結果m’22を整列部324に出力するとともに、中間結果m’21及び中間結果m’22を部分加算器316に出力する。
乗算器314は、出力データdout’5と出力データdout’6との乗算を行う。乗算器314は、例えば、ウォレスツリー回路を用いて2つのビット列の乗算を行い、乗算器314の乗算の途中結果である中間結果m’31及び中間結果m’32を乗算結果として出力する。中間結果m’31及び中間結果m’32は、第3ビット数のビット列である。中間結果m’31及び中間結果m’32は、乗算器314の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。乗算器314は、中間結果m’31を整列部325に出力し、中間結果m’32を整列部326に出力するとともに、中間結果m’31及び中間結果m’32を部分加算器316に出力する。
乗算器315は、出力データdout’7と出力データdout’8との乗算を行う。乗算器315は、例えば、ウォレスツリー回路を用いて2つのビット列の乗算を行い、乗算器315の乗算の途中結果である中間結果m’41及び中間結果m’42を乗算結果として出力する。中間結果m’41及び中間結果m’42は、第3ビット数のビット列である。中間結果m’41及び中間結果m’42は、乗算器315の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。乗算器315は、中間結果m’41を整列部327に出力し、中間結果m’42を整列部328に出力するとともに、中間結果m’41及び中間結果m’42を部分加算器316に出力する。
部分加算器316は、第2ビット数のビット列での乗算結果を生成する回路である。具体的には、部分加算器316は、乗算器312〜315の乗算結果の加算を行う。本実施形態では、部分加算器316は、中間結果m’11、中間結果m’12、中間結果m’21、中間結果m’22、中間結果m’31、中間結果m’32、中間結果m’41、及び中間結果m’42の加算を行う。部分加算器316は、部分加算器316の加算の途中結果である中間結果m11及び中間結果m12を加算結果として出力する。中間結果m11及び中間結果m12は、第2ビット数のビット列である。中間結果m11及び中間結果m12は、部分加算器316の演算遅延を生じさせない値であり、例えば、桁上がりを生じさせない部分的な合計値である。
整列部321は、後述の加算器54によって加算されるビット列の指数部を揃えるために、中間結果m’11の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部321は、整列部321の処理結果を丸め処理部331に出力する。整列部322は、加算器54によって加算されるビット列の指数部を揃えるために、中間結果m’12の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部322は、整列部322の処理結果を丸め処理部332に出力する。整列部323は、加算器54によって加算されるビット列の指数部を揃えるために、中間結果m’21の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部323は、整列部323の処理結果を丸め処理部333に出力する。整列部324は、加算器54によって加算されるビット列の指数部を揃えるために、中間結果m’22の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部324は、整列部324の処理結果を丸め処理部334に出力する。
整列部325は、後述の加算器55によって加算されるビット列の指数部を揃えるために、中間結果m’31の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部325は、整列部325の処理結果を丸め処理部335に出力する。整列部326は、加算器55によって加算されるビット列の指数部を揃えるために、中間結果m’32の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部326は、整列部326の処理結果を丸め処理部336に出力する。整列部327は、加算器55によって加算されるビット列の指数部を揃えるために、中間結果m’41の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部327は、整列部327の処理結果を丸め処理部337に出力する。整列部328は、加算器55によって加算されるビット列の指数部を揃えるために、中間結果m’42の仮数部に対してシフト処理(右ビットシフト)を行う回路である。整列部328は、整列部328の処理結果を丸め処理部338に出力する。
丸め処理部331は、整列部321によってシフト処理が行われた中間結果m’11に対して丸め処理を行う回路である。丸め処理部331は、丸め処理部331の演算結果r’11を加算部50(加算器54)に出力する。丸め処理部332は、整列部322によってシフト処理が行われた中間結果m’12に対して丸め処理を行う回路である。丸め処理部332は、丸め処理部332の演算結果r’12を加算部50(加算器54)に出力する。丸め処理部333は、整列部323によってシフト処理が行われた中間結果m’21に対して丸め処理を行う回路である。丸め処理部333は、丸め処理部333の演算結果r’21を加算部50(加算器54)に出力する。丸め処理部334は、整列部324によってシフト処理が行われた中間結果m’22に対して丸め処理を行う回路である。丸め処理部334は、丸め処理部334の演算結果r’22を加算部50(加算器54)に出力する。演算結果r’11,r’12,r’21,r’22のそれぞれは、第3ビット数のビット列である。
丸め処理部335は、整列部325によってシフト処理が行われた中間結果m’31に対して丸め処理を行う回路である。丸め処理部335は、丸め処理部335の演算結果r’31を加算部50(加算器55)に出力する。丸め処理部336は、整列部326によってシフト処理が行われた中間結果m’32に対して丸め処理を行う回路である。丸め処理部336は、丸め処理部336の演算結果r’32を加算部50(加算器55)に出力する。丸め処理部337は、整列部327によってシフト処理が行われた中間結果m’41に対して丸め処理を行う回路である。丸め処理部337は、丸め処理部337の演算結果r’41を加算部50(加算器55)に出力する。丸め処理部338は、整列部328によってシフト処理が行われた中間結果m’42に対して丸め処理を行う回路である。丸め処理部338は、丸め処理部338の演算結果r’42を加算部50(加算器55)に出力する。演算結果r’31,r’32,r’41,r’42のそれぞれは、第3ビット数のビット列である。
このように、乗算器212〜215は、演算部10Aのデータマルチプレクサ11、乗算器12〜15、部分加算器16、整列部21〜28、及び丸め処理部31〜38と同様の構成を有している。なお、データマルチプレクサ211と各乗算器212〜215のデータマルチプレクサ311とは、1つのデータマルチプレクサで置き換えられてもよい。
図8に戻って、演算装置1Aの説明を続ける。加算部250は、加算部50と比較して、マルチプレクサ59に代えてマルチプレクサ259を備える点、加算器54〜57をさらに備える点において主に相違する。以下、加算部50との相違点について説明する。
レジスタ40に保持される入力データDIN0は、第3ビット数のビット列であるデータdin0_1〜din0_4を含む。レジスタ40は、データdin0_1を加算器54に出力し、データdin0_2を加算器55に出力し、データdin0_3を加算器56に出力し、データdin0_4を加算器57に出力する。
加算器54は、第3演算モードの演算結果d’0を生成する。本実施形態では、加算器54は、演算部210A,210Bの乗算器212〜215の演算結果r’11,r’12,r’21,r’22と、データdin’0_1との加算を行うことによって、演算結果d’0を生成する。加算器54は、演算結果d’0をマルチプレクサ259に出力する。
加算器55は、第3演算モードの演算結果d’1を生成する。本実施形態では、加算器55は、演算部210A,210Bの乗算器212〜215の演算結果r’31,r’32,r’41,r’42と、データdin0_2との加算を行うことによって、演算結果d’1を生成する。加算器55は、演算結果d’1をマルチプレクサ259に出力する。
加算器56は、第3演算モードの演算結果d’2を生成する。本実施形態では、加算器56は、演算部210C,210Dの乗算器212〜215の演算結果r’11,r’12,r’21,r’22と、データdin0_3との加算を行うことによって、演算結果d’2を生成する。加算器56は、演算結果d’2をマルチプレクサ259に出力する。
加算器57は、第3演算モードの演算結果d’3を生成する。本実施形態では、加算器57は、演算部210C,210Dの乗算器212〜215の演算結果r’31,r’32,r’41,r’42と、データdin0_4との加算を行うことによって、演算結果d’3を生成する。加算器57は、演算結果d’3をマルチプレクサ259に出力する。なお、演算結果d’0〜d’3が組み合わされて演算結果(d’0,d’1,d’2,d’3)が生成される。演算結果(d’0,d’1,d’2,d’3)は、演算結果d’0〜d’3をその順に上位ビットから配列したビット列である。つまり、演算結果(d’0,d’1,d’2,d’3)は、第1ビット数のビット列である。
マルチプレクサ259は、演算結果D0、演算結果(d0,d1)、及び演算結果(d’0,d’1,d’2,d’3)を入力し、MODE信号に応じて、演算結果D0と演算結果(d0,d1)と演算結果(d’0,d’1,d’2,d’3)とのいずれかを出力する回路である。マルチプレクサ259は、MODE信号が第1演算モードを示す場合には、演算結果D0を出力する。マルチプレクサ259は、MODE信号が第2演算モードを示す場合には、演算結果(d0,d1)を出力する。マルチプレクサ259は、MODE信号が第3演算モードを示す場合には、演算結果(d’0,d’1,d’2,d’3)を出力する。
演算装置1Aは、シフト量演算回路260をさらに備える。図11は、シフト量演算回路の構成を概略的に示す図である。図11に示されるシフト量演算回路260は、各整列部におけるシフト処理のシフト量を演算する回路である。シフト量演算回路260は、指数部抽出回路261と、最大値演算回路262A〜262Dと、減算回路263A〜263Dと、を備える。
指数部抽出回路261は、入力データDIN0〜DIN5から指数部を抽出する回路である。指数部抽出回路261には、レジスタ40から入力データDIN0が供給され、演算部210A〜210Dから入力データDIN1〜DIN5が供給されている。
図12(a)〜(c)に示されるように、各入力データDIN0〜DIN5が倍精度データ、単精度データ、及び半精度データのいずれを有するかに応じて、指数部の数及び位置が異なる。倍精度データのビット数が64ビットである場合、倍精度データでは、MSBは符号を示し、続く11ビットが指数部、残りの52ビットが仮数部である。単精度データのビット数が32ビットである場合、単精度データでは、MSBは符号を示し、続く8ビットが指数部、残りの23ビットが仮数部である。半精度データのビット数が16ビットである場合、半精度データでは、MSBは符号を示し、続く5ビットが指数部、残りの10ビットが仮数部である。
入力データDIN0〜DIN5が倍精度データである場合、入力データDIN0〜DIN5のそれぞれは1つの指数部を有する。入力データDIN0〜DIN5が単精度データである場合、入力データDIN0〜DIN5のそれぞれは2つの指数部を有する。入力データDIN0〜DIN5が半精度データである場合、入力データDIN0〜DIN5のそれぞれは4つの指数部を有する。指数部抽出回路261は、MODE信号に応じて指数部を抽出し、抽出した指数部に基づいて、加算対象となる指数部を最大値演算回路262A〜262D、及び減算回路263A〜263Dに出力する。
最大値演算回路262A〜262Dは、加算対象となる複数の対象データの指数部のうちの最大の指数部である最大指数を演算する回路である。最大値演算回路262A〜262Dは、指数部抽出回路261から供給された複数の指数部のうちの最大の指数部を最大指数とする。最大値演算回路262A〜262Dは、例えば、複数の対象データのMSBからLSBに向かって順番に比較を行うことによって、最大値を有するビット列を特定し、特定したビット列の値を最大指数とする。最大値演算回路262A〜262Dは、最大指数を減算回路263A〜263Dに出力する。減算回路263A〜263Dは、最大値演算回路262A〜262Dによって演算された最大値から、指数部抽出回路261から供給された指数部を減算し、減算結果をシフト量として整列部に出力する。シフト量演算回路260の詳細な動作については後述する。
ここで、図13〜図15を用いて最大値演算回路262A〜262Dの構成例を説明する。図13は、2つのビット列から最大値を演算する最大値演算回路の一構成例を示す回路図である。図14は、図13の最大値演算回路の別の構成例を示す回路図である。図15は、複数のビット列から最大値を演算する最大値演算回路の構成例を示す図である。最大値演算回路262A〜262Dは、同様の構成を有するので、ここでは、最大値演算回路262Aの構成について説明する。
図13に示される最大値演算回路262Aは、2つの数値のうちの最大値を算出する回路である。この例では、2つの数値を示すビット列E0,E1は、4ビットのビット列である。最大値演算回路262Aは、ビット列E0,E1のうちの最大値を有するビット列Emaxを出力する。ビット列E0は、ビットE0(0),E0(1),E0(2),E0(3)をその順に配列したビット列である。ビットE0(0)がMSBであり、E0(3)がLSBである。同様に、ビット列E1は、ビットE1(0),E1(1),E1(2),E1(3)をその順に配列したビット列である。ビットE1(0)がMSBであり、E1(3)がLSBである。同様に、ビット列Emaxは、ビットEmax(0),Emax(1),Emax(2),Emax(3)をその順に配列したビット列である。ビットEmax(0)がMSBであり、Emax(3)がLSBである。
最大値演算回路262Aは、ビット生成部361a〜361dと、マスク信号生成部362a〜362dと、を備える。ビット生成部361aは、ビットEmax(0)を生成する。具体的には、ビット生成部361aは、ORゲートによって構成される。ビット生成部361aは、ビットE0(0),E1(0)のOR演算を行って、演算結果をビットEmax(0)として出力する。
ビット生成部361bは、ビットEmax(1)を生成する。具体的には、ビット生成部361bは、2つのANDゲート及びORゲートによって構成される。ビット生成部361bは、ビットE0(1)とマスク信号mask0(0)とのAND演算、及びビットE1(1)とマスク信号mask1(0)とのAND演算をそれぞれ行う。そして、ビット生成部361bは、2つのAND演算の演算結果をOR演算し、演算結果をビットEmax(1)として出力する。
ビット生成部361cは、ビットEmax(2)を生成する。具体的には、ビット生成部361cは、2つのANDゲート及びORゲートによって構成される。ビット生成部361cは、ビットE0(2)とマスク信号mask0(1)とのAND演算、及びビットE1(2)とマスク信号mask1(1)とのAND演算をそれぞれ行う。そして、ビット生成部361cは、2つのAND演算の演算結果をOR演算し、演算結果をビットEmax(2)として出力する。
ビット生成部361dは、ビットEmax(3)を生成する。具体的には、ビット生成部361dは、2つのANDゲート及びORゲートによって構成される。ビット生成部361dは、ビットE0(3)とマスク信号mask0(2)とのAND演算、及びビットE1(3)とマスク信号mask1(2)とのAND演算をそれぞれ行う。そして、ビット生成部361dは、2つのAND演算の演算結果をOR演算し、演算結果をビットEmax(3)として出力する。
マスク信号生成部362aは、マスク信号mask0(0),mask1(0)を生成する。具体的には、マスク信号生成部362aは、2つのORゲートによって構成される。マスク信号生成部362aは、ビットE0(0)とビットEmax(0)の反転とをOR演算し、演算結果をマスク信号mask0(0)として出力する。マスク信号生成部362aは、ビットE1(0)とビットEmax(0)の反転とをOR演算し、演算結果をマスク信号mask1(0)として出力する。
マスク信号生成部362bは、マスク信号mask0(1),mask1(1)を生成する。具体的には、マスク信号生成部362bは、2つのORゲート及び2つのANDゲートによって構成される。マスク信号生成部362bは、ビットE0(1)とビットEmax(1)の反転とをOR演算し、さらにその演算結果とマスク信号mask0(0)とをAND演算し、その演算結果をマスク信号mask0(1)として出力する。同様に、マスク信号生成部362bは、ビットE1(1)とビットEmax(1)の反転とをOR演算し、さらにその演算結果とマスク信号mask1(0)とをAND演算し、その演算結果をマスク信号mask1(1)として出力する。
マスク信号生成部362cは、マスク信号mask0(2),mask1(2)を生成する。具体的には、マスク信号生成部362cは、2つのORゲート及び2つのANDゲートによって構成される。マスク信号生成部362cは、ビットE0(2)とビットEmax(2)の反転とをOR演算し、さらにその演算結果とマスク信号mask0(1)とをAND演算し、その演算結果をマスク信号mask0(2)として出力する。同様に、マスク信号生成部362cは、ビットE1(2)とビットEmax(2)の反転とをOR演算し、さらにその演算結果とマスク信号mask1(1)とをAND演算し、その演算結果をマスク信号mask1(2)として出力する。
マスク信号生成部362dは、マスク信号mask0(3),mask1(3)を生成する。具体的には、マスク信号生成部362dは、2つのORゲート及び2つのANDゲートによって構成される。マスク信号生成部362dは、ビットE0(3)とビットEmax(3)の反転とをOR演算し、さらにその演算結果とマスク信号mask0(2)とをAND演算し、その演算結果をマスク信号mask0(3)として出力する。同様に、マスク信号生成部362dは、ビットE1(3)とビットEmax(3)の反転とをOR演算し、さらにその演算結果とマスク信号mask1(2)とをAND演算し、その演算結果をマスク信号mask1(3)として出力する。
このように、図13の最大値演算回路262Aでは、ビット列EmaxがMSBから順に1ビットずつ算出される。マスク信号mask0,mask1がMSBからLSBに向かって順に伝搬しているので、最大値演算回路262Aの遅延はこれらのマスク信号mask0,mask1が通過するゲート数によって律速される。なお、比較対象のビット列E0,E1は、4ビットのビット列であるので、マスク信号生成部362dは省略され得る。また、比較対象のビット列が4ビットよりも大きい場合には、ビット数に応じてビット生成部361d及びマスク信号生成部362dがさらに追加される。
図14に示される最大値演算回路262Aは、2つの数値のうちの最大値を算出する回路である。この例では、2つの数値を示すビット列E0,E1は、4ビットのビット列である。最大値演算回路262Aは、図13に示される最大値演算回路262Aと比較して、マスク信号生成部362a,362cを備えない点、並びに、ビット生成部361b,361d及びマスク信号生成部362b,362dの構成において主に相違する。
ビット生成部361bは、3つのANDゲート及び2つのORゲートによって構成される。ビット生成部361bは、ビットE0(0),E0(1)をAND演算し、ビットE1(0),E1(1)をAND演算する。ビット生成部361bは、ビットE0(1),E1(1)をOR演算し、その演算結果とビットE0(0)の反転とビットE1(0)の反転とをAND演算する。そして、ビット生成部361bは、3つのAND演算の演算結果をさらにOR演算し、演算結果をビットEmax(1)として出力する。
ビット生成部361dは、6つのANDゲート及び3つのORゲートによって構成される。ビット生成部361dは、ビットE0(2),E0(3)をAND演算し、ビットE1(2),E1(3)をAND演算する。ビット生成部361dは、ビットE0(3),E1(3)をOR演算し、その演算結果とビットE0(2)の反転とビットE1(2)の反転とをAND演算する。そして、ビット生成部361dは、3つのAND演算の演算結果をさらにOR演算する。ビット生成部361dは、OR演算の演算結果とマスク信号mask0(1),mask1(1)とのAND演算、ビットE0(3)の反転とマスク信号mask0(1)とのAND演算、ビットE1(3)の反転とマスク信号mask1(1)とのAND演算をさらに行い、3つのAND演算の演算結果をOR演算して演算結果をビットEmax(3)として出力する。
マスク信号生成部362bは、8つのANDゲート及び2つのORゲートによって構成される。マスク信号生成部362bは、ビットE1(0),E1(1)のAND演算結果の反転とビットE0(0)とをAND演算し、その演算結果とビットE0(0),E0(1)のAND演算結果とをさらにAND演算する。そして、マスク信号生成部362bは、ビットE1(0)の反転とビットE0(1)とをAND演算し、ビットE1(0)の反転とビットE1(1)の反転とをAND演算する。そして、マスク信号生成部362bは、3つのAND演算結果をOR演算し、その演算結果をマスク信号mask0(1)として出力する。
また、マスク信号生成部362bは、ビットE0(0),E0(1)のAND演算結果の反転とビットE1(1)とをAND演算し、その演算結果とビットE1(0),E1(1)のAND演算結果とをさらにAND演算する。そして、マスク信号生成部362bは、ビットE0(0)の反転とビットE1(1)とをAND演算し、ビットE0(0)の反転とビットE0(1)の反転とをAND演算する。そして、マスク信号生成部362bは、3つのAND演算結果をOR演算し、その演算結果をマスク信号mask1(1)として出力する。
マスク信号生成部362dは、12個のANDゲート及び3つのORゲートによって構成される。マスク信号生成部362dは、マスク信号mask0(1),mask1(1)のOR演算を行い、その演算結果の反転とマスク信号mask0(1)とのAND演算を行う。また、マスク信号生成部362dは、ビットE1(2),E1(3)のAND演算結果の反転とビットE0(2)とをAND演算し、その演算結果とビットE0(2),E0(3)のAND演算結果とをさらにAND演算する。そして、マスク信号生成部362dは、ビットE1(2)の反転とビットE0(3)とをAND演算し、ビットE1(2)の反転とビットE1(3)の反転とをAND演算する。そして、マスク信号生成部362dは、4つのAND演算結果をOR演算し、その演算結果とマスク信号mask0(1),mask1(1)のOR演算結果とのAND演算を行い、その演算結果をマスク信号mask0(3)として出力する。
マスク信号生成部362dは、マスク信号mask0(1),mask1(1)のOR演算結果の反転とマスク信号mask1(1)とのAND演算を行う。また、マスク信号生成部362dは、ビットE0(2),E0(3)のAND演算結果の反転とビットE1(3)とをAND演算し、その演算結果とビットE1(2),E1(3)のAND演算結果とをさらにAND演算する。そして、マスク信号生成部362dは、ビットE0(2)の反転とビットE1(3)とをAND演算し、ビットE0(2)の反転とビットE0(3)の反転とをAND演算する。そして、マスク信号生成部362dは、4つのAND演算結果をOR演算し、その演算結果とマスク信号mask0(1),mask1(1)のOR演算結果とのAND演算を行い、その演算結果をマスク信号mask1(3)として出力する。
このように、図14の最大値演算回路262Aでは、ビット列EmaxがMSBから順に2ビットずつ算出される。複数ビットをまとめて処理することによって、マスク信号mask0,mask1が通過するゲート数を図13の最大値演算回路262Aよりも減らすことができる。これにより、図13の最大値演算回路262Aと比較して、最大値演算回路262Aの遅延を低減することができ、最大値演算回路262Aの処理効率を向上させることが可能となる。
なお、比較対象のビット列E0,E1は、4ビットのビット列であるので、マスク信号生成部362dは省略され得る。また、比較対象のビット列E0,E1が4ビットよりも大きい場合には、2ビットごとに、ビット生成部361c,361d及びマスク信号生成部362dがさらに追加される。
図15に示される最大値演算回路262Aは、複数の数値のうちの最大値を算出する回路である。この例では、最大値演算回路262Aは、8つのビット列E0〜E7のうちの最大値を有するビット列を出力する。最大値演算回路262Aは、複数の最大値演算部(ここでは、最大値演算部262a〜262g)を備える。最大値演算部262a〜262gのそれぞれは、2つの数値のうちの最大値を算出する回路であり、例えば、図13又は図14に示される最大値演算回路262Aと同様の構成を有している。
最大値演算部262aは、ビット列E0,E1のうちの最大値を有するビット列を出力する。最大値演算部262bは、ビット列E2,E3のうちの最大値を有するビット列を出力する。最大値演算部262cは、ビット列E4,E5のうちの最大値を有するビット列を出力する。最大値演算部262dは、ビット列E6,E7のうちの最大値を有するビット列を出力する。最大値演算部262eは、最大値演算部262aから出力されたビット列と最大値演算部262bから出力されたビット列とのうちの最大値を有するビット列を出力する。最大値演算部262fは、最大値演算部262cから出力されたビット列と最大値演算部262dから出力されたビット列とのうちの最大値を有するビット列を出力する。最大値演算部262gは、最大値演算部262eから出力されたビット列と最大値演算部262fから出力されたビット列とのうちの最大値を有するビット列を出力する。
このように、最大値演算回路262Aでは、複数の最大値演算部がツリー状に接続されている。これにより、複数のビット列のうちの最大値を有するビット列が出力される。
次に、図16を用いて演算装置1A〜1Dの第1演算モードでの動作を説明する。図16は、図8の演算装置の第1演算モードでの動作を説明するための図である。ここでは、第1演算モードとして、倍精度演算モードを用い、演算ユニットMAUが式(1)に示される倍精度の行列演算を行う場合を一例として説明する。演算装置1A〜1Dでは、演算対象のデータが異なるものの、動作は同じであるので、ここでは演算装置1Aについて説明する。また、演算部210A〜210Dでは、演算対象のデータが異なるものの、動作は同じであるので、ここでは演算部210Aについて説明する。
演算装置1Aの演算部210Aは、A0×B00の演算を行う。倍精度データA0は、上位データa0_hと、下位データa0_lと、を含む。上位データa0_hは、データa’0_1及びデータa’0_2を含み、下位データa0_lは、データa’0_3及びデータa’0_4を含む。データa’0_1〜a’0_4は、その順に倍精度データA0のビット列のMSBから順に配列されている。倍精度データB00は、上位データb00_hと、下位データb00_lと、を含む。上位データb00_hは、データb’00_1及びデータb’00_2を含み、下位データb00_lは、データb’00_3及びデータb’00_4を含む。データb’00_1〜b’00_4は、その順に倍精度データB00のビット列のMSBから順に配列されている。データa’0_1〜a’0_4、及びデータb’00_1〜b’00_4は、半精度データと同じビット数を有する。
演算部210Aは、式(16)に示されるように、倍精度データA0及び倍精度データB00のそれぞれを半精度データのビット数を有する4つのデータに分解することによって、倍精度データA0及び倍精度データB00の乗算を行う。
以下、具体的に説明する。レジスタ41には、倍精度データA0が記憶されており、レジスタ41からデータマルチプレクサ211に入力データDIN1として倍精度データA0が供給されている。レジスタ42には、倍精度データB00が記憶されており、レジスタ42からデータマルチプレクサ211に入力データDIN2として倍精度データB00が供給されている。レジスタ43〜45には、有効なデータは記憶されていない。
データマルチプレクサ211には、倍精度演算モードを示すMODE信号が供給されている。このため、データマルチプレクサ211は、上位データa0_h及び上位データb00_hを乗算器212に出力する。また、データマルチプレクサ211は、下位データa0_l及び上位データb00_hを乗算器213に出力する。また、データマルチプレクサ211は、上位データa0_h及び下位データb00_lを乗算器214に出力する。また、データマルチプレクサ211は、下位データa0_l及び下位データb00_lを乗算器215に出力する。
乗算器212では、データマルチプレクサ311には、倍精度演算モードを示すMODE信号が供給されている。このため、データマルチプレクサ311は、データa’0_1及びデータb’00_1を乗算器312に出力し、データa’0_2及びデータb’00_1を乗算器313に出力し、データa’0_1及びデータb’00_2を乗算器314に出力し、データa’0_2及びデータb’00_2を乗算器315に出力する。そして、各乗算器312〜315において乗算が行われ、その中間結果m’11,m’12,m’21,m’22,m’31,m’32,m’41,m’42を部分加算器316が加算し、中間結果m11及び中間結果m12を出力する。つまり、乗算器212では、a0_h×b00_hの演算が半精度データを用いて行われ、中間結果m11及び中間結果m12が出力される。
同様に、乗算器313では、a0_l×b00_hの演算が半精度データを用いて行われ、中間結果m21及び中間結果m22が出力される。同様に、乗算器314では、a0_h×b00_lの演算が半精度データを用いて行われ、中間結果m31及び中間結果m32が出力される。同様に、乗算器315では、a0_l×b00_lの演算が半精度データを用いて行われ、中間結果m41及び中間結果m42が出力される。乗算器213〜215の動作も乗算器212の動作と同様であるので、説明を省略する。以降の処理は、演算部10Aと同じであるので、説明を省略する。
ここで、シフト量演算回路260の第1演算モードでの動作を説明する。演算装置1Aでは、式(2)に示される演算が行われるので、式(2)の右辺の各項を加算器51において加算するために、各項の指数部が揃えられる必要がある。シフト量演算回路260は、各項のシフト量を演算する。以下、具体的に説明する。
指数部抽出回路261には、倍精度演算モードを示すMODE信号が供給されている。このため、指数部抽出回路261は、演算部210A〜210Dからの入力データDIN1,DIN2のそれぞれと、入力データDIN0と、から指数部を抽出する。具体的には、指数部抽出回路261は、倍精度データA0〜A3、倍精度データB00,B10,B20,B30、及び倍精度データC0の指数部を抽出する。
そして、指数部抽出回路261は、倍精度データA0の指数部と倍精度データB00の指数部との和を演算することで、A0×B00の指数部を算出する。同様に、指数部抽出回路261は、倍精度データA1の指数部と倍精度データB10の指数部との和を演算することで、A1×B10の指数部を算出する。同様に、指数部抽出回路261は、倍精度データA2の指数部と倍精度データB20の指数部との和を演算することで、A2×B20の指数部を算出する。同様に、指数部抽出回路261は、倍精度データA3の指数部と倍精度データB30の指数部との和を演算することで、A3×B30の指数部を算出する。そして、指数部抽出回路261は、A0×B00の指数部、A1×B10の指数部、A2×B20の指数部、A3×B30の指数部、及び倍精度データC0の指数部を最大値演算回路262Aに出力する。また、指数部抽出回路261は、A0×B00の指数部、A1×B10の指数部、A2×B20の指数部、A3×B30の指数部をそれぞれ異なる減算回路263Aに出力する。
最大値演算回路262Aは、A0×B00の指数部、A1×B10の指数部、A2×B20の指数部、A3×B30の指数部、及び倍精度データC0の指数部から最大の指数部を、最大指数として算出(特定)する。そして、最大値演算回路262Aは、各減算回路263Aに最大指数を出力する。
そして、各減算回路263Aは、最大指数と各乗算結果の指数部との差を演算する。具体的には、A0×B00の指数部が供給されている減算回路263Aは、最大指数からA0×B00の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Aの整列部17,18に出力する。同様に、A1×B10の指数部が供給されている減算回路263Aは、最大指数からA1×B10の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Bの整列部17,18に出力する。
また、A2×B20の指数部が供給されている減算回路263Aは、最大指数からA2×B20の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Cの整列部17,18に出力する。同様に、A3×B30の指数部が供給されている減算回路263Aは、最大指数からA3×B30の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Dの整列部17,18に出力する。
各整列部17は、シフト量演算回路260から供給されたシフト量に基づいて、中間結果P11の仮数部に対してシフト処理を行う。同様に、各整列部18は、シフト量演算回路260から供給されたシフト量に基づいて、中間結果P12の仮数部に対してシフト処理を行う。
次に、図17を用いて演算装置1A〜1Dの第2演算モードでの動作を説明する。図17は、図8の演算装置の第2演算モードでの動作を説明するための図である。ここでは、第2演算モードとして、単精度演算モードを用い、演算ユニットMAUが式(7)に示される単精度の行列演算を行う場合を一例として説明する。演算装置1A〜1Dでは、演算対象のデータが異なるものの、動作は同じであるので、ここでは演算装置1Aについて説明する。また、演算部210A〜210Dでは、演算対象のデータが異なるものの、動作は同じであるので、ここでは演算部210Aについて説明する。
演算装置1Aの演算部210Aは、a0×b00+a1×b10の演算と、a0×b01+a1×b11の演算と、を行う。単精度データa0は、単精度データa0のビット列のうちの上半分のビット列であるデータa’0_hと、単精度データa0のビット列のうちの下半分のビット列であるデータa’0_lと、を含む。単精度データa1,b00,b10,b01,b11についても同様である。データa’0_h,a’0_l,a’1_h,a’1_l,b’00_h,b’00_l,b’10_h,b’10_l,b’01_h,b’01_l,b’11_h,b’11_lは、半精度データと同じビット数を有する。
演算部210Aは、式(17)に示されるように、単精度データa0,a1及び単精度データb00,b10のそれぞれを半精度データのビット数を有する2つのデータに分解することによって、単精度データa0及び単精度データb00の乗算と、単精度データa1及び単精度データb10の乗算と、を行う。
同様に、演算部210Aは、式(18)に示されるように、単精度データa0,a1及び単精度データb01,b11のそれぞれを半精度データのビット数を有する2つのデータに分解することによって、単精度データa0及び単精度データb01の乗算と、単精度データa1及び単精度データb11の乗算と、を行う。
以下、具体的に説明する。レジスタ41の上位ビットには、単精度データa0が記憶されており、レジスタ41の下位ビットには単精度データa1が記憶されている。レジスタ41からデータマルチプレクサ211に入力データDIN1として単精度データa0及び単精度データa1が供給されている。レジスタ42の上位ビットには、単精度データb00が記憶されており、レジスタ42の下位ビットには単精度データb10が記憶されている。レジスタ42からデータマルチプレクサ211に入力データDIN2として単精度データb00及び単精度データb10が供給されている。レジスタ43の上位ビットには、単精度データb01が記憶されており、レジスタ43の下位ビットには単精度データb11が記憶されている。レジスタ43からデータマルチプレクサ211に入力データDIN3として単精度データb01及び単精度データb11が供給されている。レジスタ44,45には、有効なデータは記憶されていない。
データマルチプレクサ211には、単精度演算モードを示すMODE信号が供給されている。このため、データマルチプレクサ211は、単精度データa0及び単精度データb00を乗算器212に出力する。また、データマルチプレクサ211は、単精度データa1及び単精度データb10を乗算器213に出力する。また、データマルチプレクサ211は、単精度データa0及び単精度データb01を乗算器214に出力する。また、データマルチプレクサ211は、単精度データa1及び単精度データb11を乗算器215に出力する。
乗算器212では、データマルチプレクサ311には、単精度演算モードを示すMODE信号が供給されている。このため、データマルチプレクサ311は、データa’0_h及びデータb’00_hを乗算器312に出力し、データa’0_l及びデータb’00_hを乗算器313に出力し、データa’0_h及びデータb’00_lを乗算器314に出力し、データa’0_l及びデータb’00_lを乗算器315に出力する。そして、各乗算器312〜315において乗算が行われ、その中間結果m’11,m’12,m’21,m’22,m’31,m’32,m’41,m’42を部分加算器316が加算し、中間結果m11及び中間結果m12を出力する。つまり、乗算器212では、a0×b00の演算が半精度データを用いて行われ、中間結果m11及び中間結果m12が出力される。
同様に、乗算器313では、a1×b10の演算が半精度データを用いて行われ、中間結果m21及び中間結果m22が出力される。同様に、乗算器314では、a0×b01の演算が半精度データを用いて行われ、中間結果m31及び中間結果m32が出力される。同様に、乗算器315では、a1×b11の演算が半精度データを用いて行われ、中間結果m41及び中間結果m42が出力される。乗算器213〜215の動作も乗算器212の動作と同様であるので、説明を省略する。以降の処理は、演算部10Aと同じであるので、説明を省略する。
ここで、シフト量演算回路260の第2演算モードでの動作を説明する。演算装置1Aでは、式(8)及び式(9)に示される演算が行われる。このため、式(8)の右辺の各項を加算器52において加算するために、各項の指数部が揃えられる必要がある。同様に、式(9)の右辺の各項を加算器53において加算するために、各項の指数部が揃えられる必要がある。シフト量演算回路260は、各項のシフト量を演算する。以下、具体的に説明する。
指数部抽出回路261には、単精度演算モードを示すMODE信号が供給されている。このため、指数部抽出回路261は、演算部210A〜210Dからの入力データDIN1〜DIN3のそれぞれと、入力データDIN0と、から指数部を抽出する。具体的には、指数部抽出回路261は、単精度データa0〜a7、単精度データb00,b01,b10,b11,b20,b21,b30,b31,b40,b41,b50,b51,b60,b61,b70,b71、及び単精度データc0,c1の指数部を抽出する。
そして、指数部抽出回路261は、単精度データa0の指数部と単精度データb00の指数部との和を演算することで、a0×b00の指数部を算出する。同様に、指数部抽出回路261は、a1×b10の指数部、a2×b20の指数部、a3×b30の指数部、a4×b40の指数部、a5×b50の指数部、a6×b60の指数部、及びa7×b70の指数部を算出する。そして、指数部抽出回路261は、各乗算結果の指数部、及び単精度データc0の指数部を最大値演算回路262Aに出力する。また、指数部抽出回路261は、各乗算結果の指数部を互いに異なる減算回路263Aに出力する。
同様に、指数部抽出回路261は、式(9)に示される右辺の各乗算結果の指数部を算出し、各乗算結果の指数部及び単精度データc1の指数部を最大値演算回路262Bに出力する。また、指数部抽出回路261は、各乗算結果の指数部を互いに異なる減算回路263Bに出力する。
最大値演算回路262Aは、a0×b00の指数部、a1×b10の指数部、a2×b20の指数部、a3×b30の指数部、a4×b40の指数部、a5×b50の指数部、a6×b60の指数部、a7×b70の指数部、及び単精度データc0の指数部から最大の指数部を、最大指数として算出(特定)する。そして、最大値演算回路262Aは、各減算回路263Aに最大指数を出力する。
そして、各減算回路263Aは、最大指数と各乗算結果の指数部との差を演算する。具体的には、a0×b00の指数部が供給されている減算回路263Aは、最大指数からa0×b00の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Aの整列部21,22に出力する。同様に、a1×b10の指数部が供給されている減算回路263Aは、最大指数からa1×b10の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Aの整列部23,24に出力する。
また、a2×b20の指数部が供給されている減算回路263Aは、最大指数からa2×b20の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Bの整列部21,22に出力する。このように、各減算回路263Aは、供給されている乗算の乗算結果(中間結果)をシフト処理する整列部に、算出したシフト量を出力する。最大値演算回路262B及び減算回路263Bの動作も同様であるので、説明を省略する。
そして、各整列部は、シフト量演算回路260から供給されたシフト量に基づいて、中間結果の仮数部に対してシフト処理を行う。
次に、図18を用いて演算装置1A〜1Dの第3演算モードでの動作を説明する。図18は、図8の演算装置の第3演算モードでの動作を説明するための図である。ここでは、第3演算モードとして、半精度演算モードを用い、演算ユニットMAUが式(19)に示される単精度の行列演算を行う場合を一例として説明する。
演算装置1Aは、式(20)〜式(23)に示される行列演算を行う。
演算装置1A〜1Dでは、演算対象のデータが異なるものの、動作は同じであるので、ここでは演算装置1Aについて説明する。演算装置1Aの演算部210Aは、a’0×b’00+a’1×b’10+a’2×b’20+a’3×b’30の演算、a’0×b’01+a’1×b’11+a’2×b’21+a’3×b’31の演算、a’0×b’02+a’1×b’12+a’2×b’22+a’3×b’32の演算、及びa’0×b’03+a’1×b’13+a’2×b’23+a’3×b’33の演算を行う。演算装置1Aの演算部210Bは、a’0×b’40+a’1×b’50+a’2×b’60+a’3×b’70の演算、a’0×b’41+a’1×b’51+a’2×b’61+a’3×b’71の演算、a’0×b’42+a’1×b’52+a’2×b’62+a’3×b’72の演算、及びa’0×b’43+a’1×b’53+a’2×b’63+a’3×b’73の演算を行う。
演算装置1Aの演算部210Cは、a’0×b’80+a’1×b’90+a’2×b’A0+a’3×b’B0の演算、a’0×b’81+a’1×b’91+a’2×b’A1+a’3×b’B1の演算、a’0×b’82+a’1×b’92+a’2×b’A2+a’3×b’B2の演算、及びa’0×b’83+a’1×b’93+a’2×b’A3+a’3×b’B3の演算を行う。演算装置1Aの演算部210Dは、a’0×b’C0+a’1×b’D0+a’2×b’E0+a’3×b’F0の演算、a’0×b’C1+a’1×b’D1+a’2×b’E1+a’3×b’F1の演算、a’0×b’C2+a’1×b’D2+a’2×b’E2+a’3×b’F2の演算、及びa’0×b’C3+a’1×b’D3+a’2×b’E3+a’3×b’F3の演算を行う。各演算部10A〜10Dでは、演算対象のデータが異なるものの、動作は同じであるので、演算部10Aの動作を主に説明する。
以下、具体的に説明する。レジスタ41には、上位ビットから順に半精度データa’0、半精度データa’1、半精度データa’2、及び半精度データa’3が記憶されている。レジスタ41からデータマルチプレクサ211に入力データDIN1として半精度データa’0〜a’3が供給されている。レジスタ42には、上位ビットから順に半精度データb’00、半精度データb’10、半精度データb’20、及び半精度データb’30が記憶されている。レジスタ42からデータマルチプレクサ211に入力データDIN2として半精度データb’00,b’10,b’20,b’30が供給されている。
レジスタ43には、上位ビットから順に半精度データb’01、半精度データb’11、半精度データb’21、及び半精度データb’31が記憶されている。レジスタ43からデータマルチプレクサ211に入力データDIN3として半精度データb’01,b’11,b’21,b’31が供給されている。レジスタ44には、上位ビットから順に半精度データb’02、半精度データb’12、半精度データb’22、及び半精度データb’32が記憶されている。レジスタ44からデータマルチプレクサ211に入力データDIN4として半精度データb’02,b’12,b’22,b’32が供給されている。レジスタ45には、上位ビットから順に半精度データb’03、半精度データb’13、半精度データb’23、及び半精度データb’33が記憶されている。レジスタ45からデータマルチプレクサ211に入力データDIN5として半精度データb’03,b’13,b’23,b’33が供給されている。
データマルチプレクサ211には、半精度演算モードを示すMODE信号が供給されている。このため、データマルチプレクサ211は、半精度データa’0,a’1、半精度データb’00,b’10、及び半精度データb’01,b’11を乗算器212に出力する。また、データマルチプレクサ211は、半精度データa’2,a’3、半精度データb’20,b’30、及び半精度データb’21,b’31を乗算器213に出力する。また、データマルチプレクサ211は、半精度データa’0,a’1、半精度データb’02,b’12、及び半精度データb’03,b’13を乗算器214に出力する。また、データマルチプレクサ211は、半精度データa’2,a’3、半精度データb’22,b’32、及び半精度データb’23,b’33を乗算器215に出力する。
乗算器212では、データマルチプレクサ311には、半精度演算モードを示すMODE信号が供給されている。このため、データマルチプレクサ311は、半精度データa’0及び半精度データb’00を乗算器312に出力し、半精度データa’1及び半精度データb’10を乗算器313に出力し、半精度データa’0及び半精度データb’01を乗算器314に出力し、半精度データa’1及び半精度データb’11を乗算器315に出力する。そして、各乗算器312〜315において乗算が行われ、その中間結果m’11,m’12,m’21,m’22,m’31,m’32,m’41,m’42が出力される。乗算器213〜215の動作も乗算器212の動作と同様であるので、説明を省略する。
ここで、シフト量演算回路260の第3演算モードでの動作を説明する。演算部210Aでは、式(20)〜式(23)に示される演算が行われる。このため、式(20)の右辺の各項を加算器54において加算するために、各項の指数部が揃えられる必要がある。同様に、式(21)の右辺の各項を加算器55において加算するために、各項の指数部が揃えられる必要がある。式(22)の右辺の各項を加算器56において加算するために、各項の指数部が揃えられる必要がある。式(23)の右辺の各項を加算器57において加算するために、各項の指数部が揃えられる必要がある。シフト量演算回路260は、各項のシフト量を演算する。以下、具体的に説明する。
指数部抽出回路261には、半精度演算モードを示すMODE信号が供給されている。このため、指数部抽出回路261は、演算部210A〜210Dからの入力データDIN1〜DIN5のそれぞれと、入力データDIN0と、から指数部を抽出する。具体的には、指数部抽出回路261は、半精度データa’0〜a’15、半精度データb’00〜b’03,b’10〜b’13,・・・,b’F0〜F3、及び半精度データc’0〜c’3の指数部を抽出する。
そして、指数部抽出回路261は、半精度データa’0の指数部と半精度データb’00の指数部との和を演算することで、a’0×b’00の指数部を算出する。同様に、指数部抽出回路261は、式(20)に示される右辺の各乗算結果の指数部を算出する。そして、指数部抽出回路261は、各乗算結果の指数部、及び半精度データc’0の指数部を最大値演算回路262Aに出力する。また、指数部抽出回路261は、各乗算結果の指数部を互いに異なる減算回路263Aに出力する。
また、指数部抽出回路261は、式(21)に示される右辺の各乗算結果の指数部を算出し、各乗算結果の指数部及び半精度データc’1の指数部を最大値演算回路262Bに出力する。また、指数部抽出回路261は、各乗算結果の指数部を互いに異なる減算回路263Bに出力する。同様に、指数部抽出回路261は、式(22)に示される右辺の各乗算結果の指数部を算出し、各乗算結果の指数部及び半精度データc’2の指数部を最大値演算回路262Cに出力する。また、指数部抽出回路261は、各乗算結果の指数部を互いに異なる減算回路263Cに出力する。指数部抽出回路261は、式(23)に示される右辺の各乗算結果の指数部を算出し、各乗算結果の指数部及び半精度データc’3の指数部を最大値演算回路262Dに出力する。また、指数部抽出回路261は、各乗算結果の指数部を互いに異なる減算回路263Dに出力する。
最大値演算回路262Aは、各乗算結果の指数部、及び半精度データc’0の指数部から最大の指数部を、最大指数として算出(特定)する。そして、最大値演算回路262Aは、各減算回路263Aに最大指数を出力する。
そして、各減算回路263Aは、最大指数と各乗算結果の指数部との差を演算する。具体的には、a’0×b’00の指数部が供給されている減算回路263Aは、最大指数からa’0×b’00の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Aの乗算器212の整列部321,322に出力する。同様に、a’1×b’10の指数部が供給されている減算回路263Aは、最大指数からa’1×b’10の指数部を減算し、その減算結果をシフト量として算出する。そして、減算回路263Aは、算出したシフト量を、演算部210Aの乗算器212の整列部323,324に出力する。
このように、各減算回路263Aは、供給されている乗算の乗算結果(中間結果)をシフト処理する整列部に、算出したシフト量を出力する。最大値演算回路262B〜262D及び減算回路263B〜263Dの動作も同様であるので、説明を省略する。
そして、整列部321〜328は、シフト量演算回路260から供給されたシフト量に基づいて、中間結果m’11,m’12,m’21,m’22,m’31,m’32,m’41,m’42の仮数部に対してシフト処理を行い、整列部321〜328の処理結果を丸め処理部331〜338に出力する。そして、丸め処理部331〜334は、整列部321〜324によってシフト処理が行われた中間結果m’11,m’12,m’21,m’22に対して丸め処理を行い、演算結果r’11,r’12,r’21,r’22を加算器54に出力する。同様に、丸め処理部335〜338は、整列部325〜328によってシフト処理が行われた中間結果m’31,m’32,m’41,m’42に対して丸め処理を行い、演算結果r’31,r’32,r’41,r’42を加算器55に出力する。乗算器213〜215においても、同様の演算が行われる。
演算部210B、演算部210C、及び演算部210Dにおいても、同様の演算が行われる。各演算部210A〜210Dの乗算器212,213は、演算結果r’11,r’12,r’21,r’22を加算器54に出力するとともに、演算結果r’31,r’32,r’41,r’42を加算器55に出力する。各演算部210A〜210Dの乗算器214,215は、演算結果r’11,r’12,r’21,r’22を加算器56に出力するとともに、演算結果r’31,r’32,r’41,r’42を加算器57に出力する。また、レジスタ40には、上位ビットから順に半精度データc’0、半精度データc’1、半精度データc’2、及び半精度データc’3が記憶されている。そして、レジスタ40から加算器54に半精度データc’0が供給され、加算器55に半精度データc’1が供給され、加算器56に半精度データc’2が供給され、加算器57に半精度データc’3が供給されている。
そして、加算器54は、演算部210A〜210Dの乗算器212,213の演算結果r’11,r’12,r’21,r’22、及び半精度データc’0の加算を行い、加算器54の加算結果を演算結果d’0として出力する。また、加算器55は、演算部210A〜210Dの乗算器212,213の演算結果r’31,r’32,r’41,r’42、及び半精度データc’1の加算を行い、加算器55の加算結果を演算結果d’1として出力する。同様に、加算器56は、演算部210A〜210Dの乗算器214,215の演算結果r’11,r’12,r’21,r’22、及び半精度データc’2の加算を行い、加算器56の加算結果を演算結果d’2として出力する。また、加算器57は、演算部210A〜210Dの乗算器214,215の演算結果r’31,r’32,r’41,r’42、及び半精度データc’3の加算を行い、加算器57の加算結果を演算結果d’3として出力する。
そして、演算結果d’0〜d’3が組み合わされて演算結果(d’0,d’1,d’2,d’3)が生成され、マルチプレクサ259に供給される。このとき、部分加算器316、部分加算器16、整列部17,18、丸め処理部19,20、整列部21〜28、丸め処理部31〜38、及び加算器51〜53も演算を行っており、演算結果D0及び演算結果(d0,d1)がマルチプレクサ259に出力されている。マルチプレクサ259には、半精度演算モードを示すMODE信号が供給されているので、マルチプレクサ259は、演算結果(d’0,d’1,d’2,d’3)を出力する。このようにして、4つの半精度の行列演算が行われる。
第2実施形態に係る演算装置1A〜1D、及びそれらを備える演算システムSにおいても、上述した第1実施形態に係る演算システムS、及び演算装置1A〜1Dと同様の効果が奏される。
第2実施形態に係る演算装置1A〜1Dでは、加算器51によって、第1ビット数を有するデータでの1つの行列演算結果が得られ、加算器52及び加算器53によって、第2ビット数を有するデータでの2つの行列演算結果が得られ、さらに加算器54〜57によって、第3ビット数を有するデータでの4つの行列演算結果が得られる。そして、マルチプレクサ259によって、MODE信号が第1演算モードを示す場合には、第1ビット数を有するデータでの1つの行列演算結果が出力され、MODE信号が第2演算モードを示す場合には、第2ビット数を有するデータでの2つの行列演算結果が出力され、MODE信号が第3演算モードを示す場合には、第3ビット数を有するデータでの4つの行列演算結果が出力される。このように、演算装置1A〜1Dでは、3つの演算モードに応じた行列演算を行うことが可能となる。
半精度演算モードの1演算に用いられる演算器の回路規模は、倍精度演算モードの1演算に用いられる演算器の16分の1以下である。しかし、上述の比較例の演算装置と同様に、倍精度演算モードの1演算を半精度演算モードの4演算に切り替えると、倍精度演算モードの1演算を行う回路規模あたり、半精度演算モードでの演算が4つしか行えない。このため、倍精度演算モードの1演算を半精度演算モードの4演算に切り替えると、倍精度演算モードの1演算に用いられるトランジスタ等の回路素子の4分の1程度の回路素子しか使用されない。これに対し、上記構成の演算装置1A〜1Dによれば、半精度演算モード及び単精度演算モードであっても、演算性能を2〜4倍に向上させることができ、電力効率も改善することができる。
さらに、演算システムSでは、演算ユニットMAUは、4つの演算装置1A〜1Dを備えることにより、式(1)に示されるような倍精度データの行列演算(4×4の行列ベクトル積)を行うことができる。演算ユニットMAUは、単精度演算モードでは式(7)に示されるような8×8の行列ベクトル積、半精度演算モードでは式(19)に示されるような16×16の行列ベクトル積を行うことが可能となる。この構成によれば、倍精度演算モードでは、それぞれが52ビットの仮数の乗算を行う16個の並列乗算器(1サイクルで1乗算を行う回路)を有する回路に相当する演算性能を実現することができる。単精度演算モードでは、それぞれが23ビットの仮数の乗算を行う64個の並列乗算器を有する回路に相当する演算性能を実現することができる。半精度演算モードでは、それぞれが10ビットの仮数の乗算を行う256個の並列乗算器を有する回路に相当する演算性能を実現することができる。
第1演算モードでは、加算器51が演算部210A〜210Dの中間結果P11,P12を加算するためには、それぞれの指数部を揃える必要がある。第2演算モードでは、加算器52が演算部210A〜210Dの中間結果m11,m12,m21,m22を加算するためには、それぞれの指数部を揃える必要があり、加算器53が演算部210A〜210Dの中間結果m31,m32,m41,m42を加算するためには、それぞれの指数部を揃える必要がある。同様に、第3演算モードでは、加算器54〜57が演算部210A〜210Dの乗算器212〜215の中間結果m’11,m’12,m’21,m’22,m’31,m’32,m’41,m’42を加算するためには、加算対象となるデータの指数部を揃える必要がある。シフト量演算回路260によって、加算対象となるデータの最大指数と各指数部との差分をシフト量として演算することによって、加算対象となるデータの指数部を揃えることが可能となる。
最大値演算回路262では、複数の比較対象のデータがMSBから順に比較されるので、比較するビット数を減らすことができ、最大指数の演算を高速化することが可能となる。
以上、本発明の実施形態について説明したが、本発明は上記実施形態に限られない。
例えば、演算装置1A〜1Dは、データフローグラフをマッピングできる再構成可能な演算器として利用されてもよい。
演算装置1A〜1Dは、レジスタ40〜45を備えなくてもよい。演算装置1A〜1Dの外部からデータマルチプレクサ11に入力データDIN0〜DIN3が直接供給されてもよく、演算装置1A〜1Dの外部からデータマルチプレクサ211に入力データDIN0〜DIN5が直接供給されてもよい。
また、演算装置1A〜1Dの演算モードとして、倍精度演算モード、単精度演算モード、及び半精度演算モードが挙げられているが、これらに限られない。第1演算モードの演算で用いられるデータの第1ビット数が、第2演算モードの演算で用いられるデータの第2ビット数の2倍であればよい。また、第3演算モードの演算で用いられるデータの第3ビット数が、第2演算モードの演算で用いられるデータの第2ビット数の半分であればよい。例えば、4倍精度演算モード、及び1/4精度演算モード等が採用されてもよい。例えば、第1演算モードとして4倍精度演算モードが採用され、第2演算モードとして倍精度演算モードが採用され、第3演算モードとして単精度演算モードが採用され得る。また、第1演算モードとして単精度演算モードが採用され、第2演算モードとして半精度演算モードが採用され、第3演算モードとして1/4精度演算モードが採用され得る。採用される演算モードの精度を低下させることにより、演算装置1A〜1Dの演算性能のさらなる向上が可能となる。
さらに、演算装置1A〜1Dにおいて採用される演算モードは異なっていてもよい。例えば、演算装置1A〜1Cは、単精度演算モードと半精度演算モードを採用し、演算装置1Dは、倍精度演算モードと単精度演算モードを採用してもよい。この場合、演算ユニットMAUとしての実効的な演算精度を、演算装置1A〜1Cの演算精度よりも向上させることができる。また、アプリケーションで必要な演算精度を維持しつつ、高い演算性能を実現できる。
さらに、演算装置1A〜1Dは、MODE信号に応じて、演算装置1A〜1Dの演算モードを第1演算モード及び第3演算モードのいずれかに切り替え可能であってもよい。例えば、演算装置1A〜1Dの演算モードとして、倍精度演算モード及び半精度モードが採用されてもよい。この場合、第2演算モード用の回路(整列部21〜28、丸め処理部31〜38、加算器52,53)を省略することができる。これにより、回路規模を小さくすることができ、性能向上及び省電力化が可能となる。さらに、この構成において、演算装置1A〜1Dにおいて採用される演算モードは異なっていてもよい。この場合、広いアプリケーションレンジで、高い性能と省電力性とを両立させることができる。
上記実施形態では、演算装置1A〜1Dのそれぞれは、4つの演算部を備えているが、演算部の数は、演算目的に応じて適宜変更され得る。このため、演算装置1A〜1Dのそれぞれは、少なくとも1つの演算部を備えていればよく、任意の複数個の演算部を備えてもよい。演算装置1A〜1Dのそれぞれは、演算部とは別に1又は複数の倍精度乗算器をさらに備えてもよい。
第1実施形態の演算装置1A〜1Dは、シフト量演算回路260を備えていてもよい。
乗算器312〜315は、乗算器212〜215の構成をさらに備えていてもよい。この場合、演算装置1A〜1Dは、第3ビット数の半分の第4ビット数のデータを用いた第4演算モードをさらに行うことが可能となる。さらに、各乗算器に乗算器212〜215の構成が繰り返し適用されてもよい。これにより、所望の精度での演算が可能となる。
上記実施形態及び各変形例において、各演算部10A〜10Dは、レジスタ44をさらに備えてもよい。レジスタ44は、演算対象となる第1ビット数のビット列である入力データDIN4を記憶保持する回路である。入力データDIN4は、上位データdin4_hと、下位データdin4_lと、を含む。入力データDIN4は、演算装置1A〜1Dの外部の装置(本実施形態では、要素プロセッサ)からレジスタ44にセットされる。上位データdin4_h、及び下位データdin4_lは、第2ビット数のビット列である。レジスタ44は、保持している入力データDIN4をデータマルチプレクサ11に出力する。この場合、データマルチプレクサ11に4つの第1ビット数のデータが供給される。データマルチプレクサ11は、MODE信号が第2演算モードを示す場合には、上位データdin1_hを出力データdout1として出力し、下位データdin1_lを出力データdout3として出力する。また、データマルチプレクサ11は、MODE信号が第2演算モードを示す場合には、上位データdin2_hを出力データdout2として出力し、下位データdin2_lを出力データdout4として出力する。また、データマルチプレクサ11は、MODE信号が第2演算モードを示す場合には、上位データdin3_hを出力データdout5として出力し、下位データdin3_lを出力データdout7として出力する。また、データマルチプレクサ11は、MODE信号が第2演算モードを示す場合には、上位データdin4_hを出力データdout6として出力し、下位データdin4_lを出力データdout8として出力する。この構成によれば、演算部10A〜10Dのそれぞれは、第2ビット数のビット列の乗算を行う4つの乗算器として機能する。このため、演算装置1A〜1Dは行列演算以外の演算に用いられ得る。演算部210A〜210Dについても同様に構成され得る。