文科系のためのPOWER7プロセッサーの話 ~ 4
飽きもせずに第4回目というわけで、POWER7のパフォーマンス向上の仕組みとして先代のPOWER6から実装されている、DFU(Decimal Floating-point Unit)ユニットについて述べてみようと思う。日本語では浮動十進演算ユニットと訳される、プロセッサー内部に搭載されている様々な演算ユニットの一つである。演算ユニットとは種々の計算作業を行なうための、トランジスタ回路の集まりだと思えばよい。POWER7では他に、(十進ではない)浮動小数点ユニットだの、固定小数点ユニットだの、分岐ユニットだの、一つのプロセッサー・コアあたり全部で12のユニットが内蔵されている。多種の演算をこなすためには、オールラウンド・プレイヤーが一人ではなくて、演算のタイプにしたがってそれぞれの専門家が配備されていると思えばよいようだ。
そもそも浮動とは浮いて漂っているようなイメージであるが何を意味しているのだろう。これは数学で習った、「X.XXX×10のYY乗」といった表記を思い出していただければ良い。日常生活では滅多にお目にかかることはない、限られたスペースで極端に大きいか小さい数字を表現するのに適した表記で、小数点の位置を簡単に移動させることができる。1000倍になったから表記するのに3桁追加するのではなくて、YY の部分に3を加えれば表現できるというやつである。コンピュータの場合は、小数を使った演算が行なわれる際には、通常浮動小数点表記が用いられ、POWER7ではそれ専用の演算ユニットがあるというわけだ。計算の過程で数値が極端に大きくなったり小さくなったりする可能性を排除できないので、回りくどい表記ではあるが確実に計算を行なうことができる。
では浮動が付いた十進とはどういう事だろう。コンピュータってそもそも二進数で演算すると聞いたはずだ。ところが、計算のタイプによっては内部では十進数表記が採用されるのである。これは十進小数から二進小数へと変換すると誤差が出やすいからである。十進数の小数第一位は1の10分の1であるのと同様に、二進数の小数第一位は1の2分の1で0.5、小数第二位は0.25、という具合になる。だから十進小数を二進数に変換すると無限小数になりやすい。結果的にどこかで切り捨てが行なわれ、誤差が生じることになるわけだ。例えば十進数の0.1は二進数では0.000110011・・・という無限小数になる。誤差を許容できないアプリケーション、特に業務用のプログラムにおいては、この変換誤差は絶対に避けなければならない。そこでコンピュータの本質に逆らった、変換誤差を生じさせない代わりに面倒で手間のかかる表記を用いて演算をするのである。通常はこの面倒な演算をトランジスタ回路だけでは実現できないから(専用の演算ユニットを装備していない)、ソフトウェアの力を借りて実行するというわけだ。
POWER6やPOWER7のDFUとは、これをトランジスタ回路の力で実行しようというものである。ソフトウェアが関与しないからパフォーマンスの改善度合いはかなり大きい。数値次第でもあるのだが、ベンチマークテスト結果によると、数値演算部分に関しては210から560倍もの高速化が実現された例もあるそうだ。これらプロセッサーは科学技術計算のみならず、ビジネス用途も強く意識していることがお分かりいただけるであろう。