以下、行列乗算回路をベクトル内積専用回路として構成する時に、何かいじま
しいことをして回路規模や消費電力を小さくできないか、ということを考えま
す。
もっとも普通の回路構成は、まず要素毎の乗算をして、浮動小数点加算器のツ
リーを構成することだと思います。加算器は指数の引き算、仮数のシフト、仮
数の加算、結果のプライオリティエンコーダ、シフタ、丸め回路といったあた
りで構成されます。
この構成だと、n+1 語の内積に、(乗算器もあわせて) 仮数 ビット長のキャリー
伝搬加算器が 2n+1 個、シフタが 2n 個とか必要で、乗算器に比べて結構な回
路規模になります。固定小数点データの内積なら、乗算器から最終のキャリー
伝搬をはぶいて、2つのの部分和をまた加算ツリーにいれて最終段で1度だけキャ
リー伝搬させることで回路規模と遅延を大幅に小さくできます。
浮動小数点内積でこれを行うためには、シフタを乗算器の前にもってくればい
いわけです。これにより、キャリー伝搬加算器を 2n 個とシフタ n-1 個節約
できることになります。要するに、乗算器1つにつきキャリー伝搬加算器を 2
個とシフタ 1 個節約できるわけです。
例えば倍精度だと、乗算器のアレイ部分のゲート規模は30kゲート、シフタは
1000ゲート、加算器は3k ゲートといったところですが、面積的には乗算器ア
レイに比べてシフタ・加算器はゲートあたりで大きくなる(配線が長い)ため、
面積削減の効果はかなり大きいことが期待できます。加減算器は基本的にはシ
フタ2個と加算器1つですから、加算器が丸々なくなるのよりもちょっと大きい
くらいの効果があることになります。計算精度は平均的には変わらないですが、
落ちるケースもあるのがちょっといやなところです。
次に、計算精度が違う演算で乗算器アレイや加算器アレイを共通のものですま
す可能性を検討します。
4x4の倍精度乗算器はもちろん長さ4の内積演算器が4個あるだけなので、
倍精度長さ4の内積演算器と単精度長さ8の乗算器2個を切換えられないか、ど
こまで回路を共用できるか、ということになります。
シフトの前の指数の比較の部分は、単精度のほうが回路規模がずっと大きいの
であんまり共用に意味はありません。また、全体として小さいので、というこ
とももちろんあります。シフタも、単精度用のシフタが4個いるので、倍精度
用のはあまり回路規模的に意味がないですが、単精度用のシフタ2個に付加回
路少しで倍精度にはできるはずです。
乗算器アレイは、例えば 27 ビットから54ビット(の部分和2つ)をだすものを
4個おいて、それから合計しても回路規模はさして増えない。遅延は
ふえそう。さらに半精度までサポートすると、14ビットのものが16個。
部分和は、演算モードによってどれを足すかとシフトするかどうかが違う、
ということになるはずです。
最終的なアキュムレータは結局 54 ビットなり 108ビットなので、これを
27/54 ないし 14/27 ビット加算器2、4個として切って使うことはできるので、
結局乗算器アレイから最終段加算器まではあまり無理なく融合できそうです。
後段のプライオリティエンコーダ、丸め回路とシフタは回路規模が小さいので
バラバラに持つのでもいいかもしれません。