このページの本文へ

前へ 1 2 3 次へ

ロードマップでわかる!当世プロセッサー事情 第468回

いまさら聞けないIT用語集 浮動小数点演算の単精度と倍精度って?

2018年07月23日 12時00分更新

文● 大原雄介(http://www.yusuke-ohara.com/) 編集●北村/ASCII.jp

  • この記事をはてなブックマークに追加
  • 本文印刷

精度を高めると演算が遅くなる
精度と速度のどちらを重視する?

 ということでここまでが枕。冒頭の質問に戻ると、なぜこのように複数のフォーマットが用意されているのかというと、精度と速度のトレードオフがあるからである。

 前述のように、単精度では有効数字7桁である。これは一般的な用途であれば十分であるが、科学技術計算などでは全然足りない。

ゲームやマイニングでは単精度浮動小数点演算で十分。GeForceは単精度に特化したGPUだ。最上位モデルのGeForce GTX 1080 Tiは単精度での演算能力は10.8TFlopsだが、倍精度ではわずか0.36TFlopsでしかない

 特に長時間のシミュレーションをかける分野、たとえば流体解析や天候予測など、あるタイミングからの変化を短い時間刻みで延々と計算していくようなケースでは誤差の累積が多くなりすぎる。

 先のパトリオットでも、カウンターを単精度の浮動小数点演算で実装した結果、100時間ほど経過すると0.34秒ほどずれ、これが致命的な結果を招いている。こうしたことを避ける一番簡単な方法は有効数字の桁数を増やすことである。

 実は筆者も大学時代、ソリトンの変動をやはりシミュレーションで計算したことがあるのだが、シミュレーションが10万ステップを過ぎるあたりで単精度はもとより倍精度でも誤差が大きくなりすぎてしまい、4倍精度を使う羽目に陥ったことがある。精度が命の分野においては、単精度の浮動小数点は不十分とみなされることが多い。

倍精度浮動小数点演算でダントツの性能を誇るNVIDIA Quadro GV100。演算能力は倍精度が7.4Tflops、単精度が14.8Tflops

 ただ単精度と倍精度を比べると、ざっくり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コアを搭載してさらに高性能にした、というあたりは精度よりも速度が重要だからということになる。

 つまるところなんで単精度と倍精度が両方あるか?というと、両方のニーズがそれぞれあり、しかもそれが融合する見込みがないから、ということである。

前へ 1 2 3 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン