精度を高めると演算が遅くなる
精度と速度のどちらを重視する?
ということでここまでが枕。冒頭の質問に戻ると、なぜこのように複数のフォーマットが用意されているのかというと、精度と速度のトレードオフがあるからである。
前述のように、単精度では有効数字7桁である。これは一般的な用途であれば十分であるが、科学技術計算などでは全然足りない。
特に長時間のシミュレーションをかける分野、たとえば流体解析や天候予測など、あるタイミングからの変化を短い時間刻みで延々と計算していくようなケースでは誤差の累積が多くなりすぎる。
先のパトリオットでも、カウンターを単精度の浮動小数点演算で実装した結果、100時間ほど経過すると0.34秒ほどずれ、これが致命的な結果を招いている。こうしたことを避ける一番簡単な方法は有効数字の桁数を増やすことである。
実は筆者も大学時代、ソリトンの変動をやはりシミュレーションで計算したことがあるのだが、シミュレーションが10万ステップを過ぎるあたりで単精度はもとより倍精度でも誤差が大きくなりすぎてしまい、4倍精度を使う羽目に陥ったことがある。精度が命の分野においては、単精度の浮動小数点は不十分とみなされることが多い。
ただ単精度と倍精度を比べると、ざっくり2~4倍ほど倍精度が遅くなる。これは扱うべきデータの量が倍になっているから、加算だと2倍で済むが乗算だと4倍遅い計算だ。
このあたりは実装の仕方にもよる部分で、昔のx86のように64bit演算に32bit演算器を使いまわす方式では、64bitの乗算=32bitの乗算×4+32bitの加算が必要になるので、5倍以上遅いことも珍しくなかった。
すると、「精度はそこそこでいいから、とりあえず高速に演算を」というニーズにはそぐわないことになる。これを極端に追求したのが3DグラフィックスのZバッファや、最近では機械学習の際に利用されるCNN(Convolutional Neural Network)の処理である。
CNNの場合、極端なことを言えば1bit(0か1)でもそこそこの精度が出せ、8bitで実用的な精度が確保できるとされる。そうした用途に23bitもの仮数部を持つ単精度浮動小数点を使うのは無駄以外の何者でもなく、実は半精度でもまだ無駄が多い。
NVIDIAがPascalで半精度(FP16)をサポートしてCNNを高速化したと言いつつ、Volta世代では8bitのTensolコアを搭載してさらに高性能にした、というあたりは精度よりも速度が重要だからということになる。
つまるところなんで単精度と倍精度が両方あるか?というと、両方のニーズがそれぞれあり、しかもそれが融合する見込みがないから、ということである。
この連載の記事
-
第767回
PC
Lunar LakeはWindows 12の要件である40TOPSを超えるNPU性能 インテル CPUロードマップ -
第766回
デジタル
Instinct MI300のI/OダイはXCDとCCDのどちらにも搭載できる驚きの構造 AMD GPUロードマップ -
第765回
PC
GB200 Grace Blackwell SuperchipのTDPは1200W NVIDIA GPUロードマップ -
第764回
PC
B100は1ダイあたりの性能がH100を下回るがAI性能はH100の5倍 NVIDIA GPUロードマップ -
第763回
PC
FDD/HDDをつなぐため急速に普及したSASI 消え去ったI/F史 -
第762回
PC
測定器やFDDなどどんな機器も接続できたGPIB 消え去ったI/F史 -
第761回
PC
Intel 14Aの量産は2年遅れの2028年? 半導体生産2位を目指すインテル インテル CPUロードマップ -
第760回
PC
14nmを再構築したIntel 12が2027年に登場すればおもしろいことになりそう インテル CPUロードマップ -
第759回
PC
プリンター接続で業界標準になったセントロニクスI/F 消え去ったI/F史 -
第758回
PC
モデムをつなぐのに必要だったRS-232-CというシリアルI/F 消え去ったI/F史 -
第757回
PC
「RISC-VはArmに劣る」と主張し猛烈な批判にあうArm RISC-Vプロセッサー遍歴 - この連載の一覧へ