半精度
浮動小数点数、別名FP16、binary16は、16
ビット(2バイト)を用いて浮動小数点を表現するデータ型です。単精度
浮動小数点数(32
ビット)に比べてメモリ消費量が半分となり、高速な演算処理が可能なことから、近年、特にコンピュータグラフィックスや
ディープラーニング分野で注目を集めています。
歴史と進化
FP16の起源はコンピュータグラフィックスにあります。
NVIDIAとMicrosoftは、DirectX 9.
0とシェーディング言語Cg/HLSLでFP16をサポートすることで、リアルタイム3Dグラフィックスにおける処理速度の向上を目指しました。当初は浮動小数点テクスチャのデータ量削減が主な目的でしたが、ハードウェアアクセラレーションが不足していたため、演算速度の向上には繋がりませんでした。
その後、Industrial Light & Magic社の研究により、FP16の高いダイナミックレンジが光の量の調整に適していることが判明し、
OpenEXR画像フォーマットで採用されました。IEEE 754-2
008規格ではbinary16として正式に標準化され、データ交換や容量削減のための保存フォーマットとして広く利用されるようになりました。
近年では、多くのGPUが
SIMD(Single Instruction, Multiple Data)命令によるFP16の並列処理をサポートするようになったことで、
ディープラーニングにおいてその威力が発揮されています。大規模なニューラルネットワークの学習においては、重み係数の格納や演算にFP16を用いることで、メモリ容量と演算時間の削減に大きく貢献します。パーソナルコンピュータ、ワークステーション、サーバー向けのGPU、FPGA、さらには汎用的な信号処理アクセラレータにおいても、FP16対応が急速に進んでいます。
用途と利点
FP16は、リアルタイムグラフィックス、HDRレンダリングといったプロダクション用途、そして
ディープラーニングと幅広い分野で利用されています。高いダイナミックレンジを活かし、アニメーションやCG制作で色彩表現を豊かにする用途にも適しています。ただし、一般的な画像ファイルフォーマットでのサポートは限られており、
OpenEXRやDDSといった特殊な形式が用いられることが多いです。
FP16の利点はメモリと演算速度の両面にあります。メモリ容量は単精度
浮動小数点数の半分で済み、ハードウェアサポートがあればスループットは劇的に向上します。また、乗算器の回路規模も小さいため、チップ上に多くの積和演算器を実装でき、並列処理に適しています。モバイルGPUでは、消費電力、性能、精度のバランスから、FP16が標準的に利用されるケースも増えています。
IEEE 754規格におけるbinary16
IEEE 754-2
008では、FP16はbinary16として定義されています。そのフォーマットは、1
ビットの符号部、5
ビットの指数部、1
0ビットの仮数部(暗黙の1
ビットを含む11
ビットの精度)から構成されます。指数部はオフセットバイナリ表現で、バイアス値は15です。最小の正の非正規化数は約5.96×1
0⁻⁸、最小の正の正規化数は約6.1
0×1
0⁻⁵、表現可能な最大値は655
04です。
ハードウェアとソフトウェアの対応状況
多くのGPUベンダー(
NVIDIA、AMDなど)は、最新のGPUアーキテクチャにおいてFP16のハードウェアサポートを提供しています。また、OpenCL、OpenCV、CUDA、Direct3D、OpenGL、そして様々なプログラミング言語(
C++など)でもFP16への対応が進んでいます。
OpenEXRライブラリでは、FP16を扱うためのhalf型クラスが提供されています。macOSでは、RGBA各チャンネルが16
ビット浮動小数点数のピクセルフォーマットがサポートされています。
まとめ
半精度
浮動小数点数は、メモリ効率と演算速度を両立できる魅力的なデータ型です。ハードウェアとソフトウェアのサポートが充実してきたことで、コンピュータグラフィックス、
ディープラーニング、そしてその他の様々な分野で活用範囲が拡大しています。今後も、その重要性はますます高まることが予想されます。