Main Content

半精度とは

IEEE® 754 の半精度浮動小数点形式は、1 ビットの符号インジケーター s、5 ビットのバイアス付き指数 e および 10 ビットの小数部 f に分割される 16 ビットのワードです。

Schematic showing bit allocation for half-precision data type.

16 ビットで half 型の数値が保存されるので、32 ビットを使用する single 型または 64 ビットを使用する double 型の数値より必要メモリが少なくなります。ただし、half 型の数値は、保存する場合の使用ビットが少ないので、single 型または double 型の数値より精度が低くなります。

サポートされている浮動小数点データ型の範囲、バイアス、および精度は次の表に示すとおりです。

データ型

下限

上限

指数バイアス

精度

half

2−14 ≈ 6.1·10−5

(2−2-10) ·215≈ 6.5·104

15

2−10 ≈ 10−3

single

2−126 ≈ 10−38

2128 ≈ 3 · 1038

127

2−23 ≈ 10−7

倍精度

2−1022 ≈ 2 · 10−308

21024 ≈ 2 · 10308

1023

2−52 ≈ 10−16

半精度データ型を紹介するビデオについては、What Is Half Precision? および Half-Precision Math in Modeling and Code Generation を参照してください。

半精度の用途

アルゴリズムに大規模または未知のダイナミック レンジが含まれる場合 (フィードバック ループの積分器など) や、アルゴリズムで固定小数点で設計することが困難な演算が使用される場合 (atan2 など)、浮動小数点表現を使用すると効果的です。半精度データ型は 16 ビットのメモリしか占有しませんが、その浮動小数点表現を使ってこのデータ型で同じサイズの整数データ型または固定小数点データ型よりも広いダイナミック レンジを処理できます。このため、半精度はイメージ処理やグラフィックスの一部のアプリケーションに特に適しています。半精度を深層ニューラル ネットワークで使用すると、学習と推論に要する時間を短縮できます。半精度をルックアップ テーブルの保存時間として使用することで、ルックアップ テーブルのメモリ フットプリントを削減できます。

MATLAB の例

  • 霧の修正 (GPU Coder) — 霧修正イメージ処理アルゴリズムでは、畳み込み、イメージの色空間変換、およびヒストグラムベースのコントラスト ストレッチを使用して入力イメージを改善します。この例では、これらのイメージ処理操作に半精度データ型を使用して CUDA® MEX を生成し実行する方法を説明します。

    Image of a road before and after applying fog rectification algorithm.

  • 半精度でのソーベル法によるエッジ検出 (GPU Coder) — ソーベル エッジ検出アルゴリズムは、入力イメージを受け取り、その入力イメージのエッジに対応する高空間周波数領域を強調する出力イメージを返します。この例では、入力イメージとソーベル演算子のカーネル値に半精度データ型を使用して CUDA MEX を生成し実行する方法を説明します。

    Image of peppers before and after applying Sobel edge detection algorithm.

  • 半精度データ型を使用するソーベル エッジ検出のコードの生成 (MATLAB Coder) — この例では、半精度浮動小数点数を使用してイメージのソーベル エッジ検出を実行する MATLAB® 関数からスタンドアロンの C++ ライブラリを生成する方法を説明します。

Simulink の例

  • 半精度ベクトル制御アルゴリズム — この例では、単精度と半精度の両方を使用してベクトル制御 (FOC) アルゴリズムを実装します。

  • 半精度データ型によるイメージの量子化 — この例では、イメージに対する量子化の効果を説明します。固定小数点データ型では許容可能な結果が常に得られるとは限らないのに対し、固定小数点データ型と同じビット数を使用する半精度データ型では、単精度と同等の結果が得られます。

    Quantization effect shown on an image of a chessboard for fixed-point, half-precision, and single-precision data types.

  • 半精度データ型による数字分類 — この例では、学習したニューラル ネットワーク分類モデルの結果を倍精度と半精度で比較します。

  • 単精度ルックアップ テーブルの半精度への変換 — この例では、単精度ルックアップ テーブルを半精度を使用するために変換する方法について説明します。半精度はストレージ型であり、ルックアップ テーブルの演算は単精度を使用して行われます。半精度への変換後は、目標とするシステム パフォーマンスを保ったまま、Lookup Table ブロックのメモリ サイズが半分になります。

組み込みアプリケーションで半精度を使用する利点

半精度データ型は、単精度と倍精度のような他の浮動小数点型よりメモリの使用量が少なくて済みます。16 ビットのメモリしか占有しませんが、その浮動小数点表現を使ってこのデータ型で同じサイズの整数データ型または固定小数点データ型よりも広いダイナミック レンジを処理できます。

FPGA

半精度データ型は、ハードウェアでの使用時に、単精度データ型と比較して使用領域が大幅に少なくなり、レイテンシが低くなります。半精度は、ロー ダイナミック レンジの用途では特に効果的です。

次のプロットは、Xilinx® Virtex® 7 ハードウェアにベクトル制御アルゴリズムを実装する場合に半精度を使用する利点を示しています。

Comparison of Fmax, DSPs, LUTs, and Slices for single vs half precision.

GPU

半精度データ型をサポートする GPU では、単精度または倍精度と比較して算術演算が速くなります。

大量の演算を必要とする深層学習のような用途では、半精度を使用すると、精度を著しく損なうことなくパフォーマンスを大幅に向上できます。GPU Coder™ を使用すると、Deep Learning Toolbox™ からさまざまな学習済みの深層学習ネットワークの予測用に最適化されたコードを生成できます。NVIDIA® GPU 用の NVIDIA TensorRT の高性能な推論ライブラリを利用するようにコード ジェネレーターを構成できます。TensorRT を使用すると、ネットワーク層を結合してカーネル選択を最適化することで、レイテンシ、スループット、およびメモリの効率が向上します。また、パフォーマンスをさらに向上させて必要メモリ量を減らすために、TensorRT の精度モード (FP32、FP16 または INT8) を利用するようにもコード ジェネレーターを構成できます。

CPU

半精度データ型をサポートする CPU では、単精度または倍精度と比較して算術演算が速くなります。半精度データ型をネイティブにサポートする ARM® ターゲットでは、MATLAB または Simulink® からネイティブ half C コードを生成できます。半精度を使用したコード生成を参照してください。

MATLAB の半精度

MATLAB の多くの関数で半精度データ型がサポートされています。サポートされているすべての関数の一覧については、half を参照してください。

Simulink の半精度

Simulink の信号およびブロックの出力で、半精度データ型を指定できます。半精度データ型は、パラメーターおよびブロックのサブセットのシミュレーションとコード生成でサポートされます。半精度をサポートするブロックを表示するには、コマンド ラインで次のように入力します。

showblockdatatypetable

半精度をサポートするブロックは、[Half] というラベルの列に X と表示されます。Simulink における半精度のサポートの詳細については、Simulink の半精度データ型を参照してください。

半精度を使用したコード生成

半精度データ型は、C/C++ コード生成、GPU Coder を使用した CUDA コード生成、および HDL Coder™ を使用した HDL コード生成でサポートされます。GPU ターゲットでは、パフォーマンスを最大にするため、半精度データ型では NVIDIA GPU で利用可能なネイティブ half データ型が使用されます。

MATLAB と Simulink における半精度のコード生成サポートの詳細については、半精度コード生成のサポートおよびSimulink の半精度データ型を参照してください。

ARM コンパイラの _Float16 データ型や _fp16 データ型など、半精度の特殊な型をネイティブにサポートする組み込みハードウェア ターゲットでは、Embedded Coder® または MATLAB Coder™ を使用してネイティブ半精度 C コードを生成できます。詳細については、Generate Native Half-Precision C Code from Simulink ModelsおよびMATLAB Coder を使用したネイティブ半精度 C コードの生成を参照してください。

参考

| | |

関連するトピック