半精度浮動小数点数

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

半精度浮動小数点数 (はんせいどふどうしょうすうてんすう) は浮動小数点方式で表現された数(浮動小数点数)の一種で、16ビット(2オクテット)の形式によりコンピュータ上で表現可能な浮動小数点数である。

IEEE 754-2008ではbinary16と名づけられている他、処理系や文脈によってs10e5やhalf、fp16などと表記される。

歴史[編集]

当初は、リアルタイムグラフィックス処理において単精度浮動小数点数に対するスループット向上などを目的に、 Cgで利用可能なデータ形式として、nVIDIAとMicrosoftがGeForce FXQuadro FXで採用したのが始まりである。

インダストリアル・ライト&マジック社の研究の中で、広いダイナミックレンジと浮動小数点数の特徴を生かして光量の調整に向いていることが分かり、OpenEXRで採用された。

その後、IEEE754rを経てIEEE 754-2008でbinary16として、データ交換とデータ容量削減を主目的とした保存用フォーマットとして採用された。

近年では、高い演算性能(FLOPS)が見込める上に、メモリ容量やディスク容量が節約できることから、ディープラーニングにおいて利用が活発化している。

用途[編集]

誕生の経緯から、リアルタイムグラフィックス用途で利用されたほか、HDRグラフィックスなどグラフィック用途で利用が可能である。ダイナミックレンジを広くとることができることから、アニメやCGなどの用途で利用されることが多いが、一般的なグラフィックスフォーマットとしてはOpenEXR以外では規定されていない(2017年8月現在)。

また、ハードウェアの支援があればスループットが劇的に向上することと、ストレージ容量の節約になることから、ディープラーニング用途において注目が集まっており、対応GPUが増加[1]、FPGAでの実装や汎用的なアクセラレータの研究も進んでいる。


IEEE 754 半精度2進浮動小数点表現: binary16[編集]

IEEE 754標準はbinary16を以下のように定めている。

  • 符号ビット: 1 ビット
  • 指数部の幅: 5 ビット
  • 仮数部の幅=精度: 11 (明示的には10ビット)

他のIEEE754浮動小数点表現と同様、指数部が全0でない限り黙示的な「1」のビットを仮数部に持つ(いわゆる「ケチ表現」)。このため仮数部に記録するのは10ビットだが11ビットの精度を持つ。より、これは十進数にしておよそ3桁の値となる。ビットは下図のように並ぶ。

IEEE 754r Half Floating Point Format.svg

指数部のエンコーディング[編集]

半精度2進浮動小数点数の指数部はオフセット2進表現でエンコードされており、オフセット(IEEE 754における指数部バイアス)は15である。

  • Emin = 0x01−0x0f = −14
  • Emax = 0x1e−0x0f = 15
  • 指数部バイアス = 0x0f = 15

よって、真の指数を得るためには、記録された指数から15を引けばよい。

記録された指数の0x00と0x1fは特別に扱われる。

指数 仮数=0 仮数≠0
0x00 0, −0 非正規化数
0x01, ..., 0x1e 正規化数
0x1f ±無限大 NaN (quiet, signalling)
  • 最小の正の非正規化数 : 2−24 ≈ 5.96 × 10−8
  • 最小の正の正規化数 : 2−14 ≈ 6.10 × 10−5
  • 表現可能な最大数 : 65504

半精度数の例[編集]

浮動小数点数値のビット列を十六進法で表した例を以下に示す。これには符号、オフセットを加えた指数値、仮数値が含まれている。

3c00   = 1
3c01   = 1.0009765625、1より大きい最小の数
3c02   = 1.001953125
3fff   = 1.9990234375、2より小さい最大の数
4000   = 2
c000   = -2

7bfe   = 65472
7bff   = 65504  (半精度数の正の最大値。符号なし16ビット整数の最大数(65535)と大差ない)
fbff   = -65504  (半精度数の負の最大値)

0400   = 2-14 ≈ 6.10352 × 10-5 (最小の正の正規化数)

0001   = 2-24 ≈ 5.96046 × 10-8 (最小の正の非正規化数)

0000   = 0
8000   = -0

7c00   = 正の無限大
fc00   = 負の無限大

3555   ≈ 0.33325... ≈ 1/3

1/3は切り下げられる。これは仮数部のビット数が奇数であるため(1/3は2進小数で0.01010101...)である。


対応状況[編集]

ハードウェア[編集]

  • nVIDIA GeForce シリーズ/Quadroシリーズ/Tegraシリーズにてサポート。
  • ARM VFPv3のオプションとしてfp16が利用可能。
  • Radeon FX Vegaシリーズ - Radeonとしては初めてbinary16の並列処理が可能になる。

ソフトウェア[編集]

  • OpenCL - OpenCL 1.0の拡張として、cl_khr_fp16が有効であれば利用可能。
  • Cg - halfとして実装されている。
  • Direct3D - Direct3D 10ではhalf、Windows 10以降のHLSLではmin16floatとして定義は可能だが、実装上24bitのことがある。
  • OpenGL - mediumpとして利用可能。
  • C++ - s10e5として実装例がある。

参照[編集]

  1. ^ 【後藤弘茂のWeekly海外ニュース】1TFLOPSのNVIDIAモバイルSoC「Tegra X1」 - PC Watch

外部リンク[編集]