Tesla P100について調査したとき、GPUの演算器は単精度と半精度で共有しており、半精度の時はSIMD形式で動作させることにより演算性能を向上させていることが分かった。
しかし冷静に考えてみると、これはどのように実現しているのだろう。浮動小数点の形式を考えても、半精度になったからと言って演算器を共有できる場所があるとは思えない。 ちょっと気になったので、文献を調査してみることにした。 Pascal P100では単精度と半精度の演算器共有だが、別に倍精度と単精度でも同じことが実現できるはずだ。
いろいろと調べていると、以下のような文献が見つかった。
- An Efficient Multi Precision Floating Point Adder and Multiplier
http://www.indjst.org/index.php/indjst/article/viewFile/80236/62032
割と最近の文献だが、そこまで最新の技術だろうか?同じようなことを考える人は世界中にたくさんいるだろうし、たとえ見つかったとしても論文にできるような新しいノウハウが詰まっているとも思えなかったのだが。。。
少し読み進めてみると、あまり詳細なところは別々の精度で共有しよとはせず、面積的に多くを消費している演算器をどのように共有するかに焦点が当てられている。
複数の精度で演算器を共有するための仕組み
浮動小数点の演算は、
- 符号部
- 指数部
- 仮数部
に分割され演算が進んでいくのだが、まず符号部については論理が簡単なため、資源を共有する必要がない。これは倍精度と単精度で資源を別々に持っていても回路面積に影響はない。
次に指数部だが、浮動小数点加算では仮数部の桁を合わせるための指数部の調整、乗算においては仮数部の桁合わせも必要なく加算するだけなので、加算の時だけ指数部を考慮すればよい。 ただしこれは文献を読んでも詳細が書いていなかった。加算では指数部の調整のみで演算の必要はない(つまり桁の小さい方の指数部をとれば良いだけ)なので、ここのリソースも多重化しているということか。
仮数部の計算のみ、53bitの加算器を24ビットの加算器2つに分解して扱っているということだった。まあ、この部分だけならリソースは共有できる気がする。 ただし、最後の丸めを並列に実行する方法などは、あまり詳細に触れられていなかった。
一方で乗算の方は、指数部の演算器をいかに共有するかがカギになるようで、説明図付きで詳細な解説があった。
乗算は、以下のようにオペランドの上半分とした半分に分解すると、筆算の形式で以下のように計算できる。
という訳で、半分の長さの乗算器を4つ用意しておき、単精度のときはそれぞれを独立に使うか、倍精度のときは最後に結果を集めればよい。
こう考えてみると、演算器のみの共有テクニックなら、別に驚くにあたるものではなかった。乗算器を細かく分割して組み合わせるのも、特に目新しい技術であるとは言えない。 そういう意味では、単精度と半精度で演算器を共有しているとはいえ、面積が半分近くまで節約できているかというとそんなことはありえない気がしてくる。
浮動小数点演算器について学びたいときにお勧めな参考文献
Computer Arithmetic : Algorithms and Hardware Designs
- 作者: Behrooz Parhami
- 出版社/メーカー: Oxford Univ Pr (Sd)
- 発売日: 2009/10/28
- メディア: ハードカバー
- 購入: 1人 クリック: 1回
- この商品を含むブログを見る
浮動小数点に限らず、整数演算も含め幅広く演算器について網羅した名著。もう一度しっかり読み直したい。
Handbook of Floating Point Arithmetic
Handbook of Floating-Point Arithmetic
- 作者: Jean-Michel Muller
- 出版社/メーカー: Birkhäuser
- 発売日: 2013/04/11
- メディア: Kindle版
- この商品を含むブログを見る
こちらも名著。仕様の部分からしっかり押さえたいときに確認するリファレンス用。