Main Content

半精度とは

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

Schematic showing bit allocation for half-precision data type.

half 型の数値は 16 ビットを使用して格納されるため、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

double

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 の例

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

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

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

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

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

Simulink の例

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

  • 半精度データ型によるイメージの量子化 (Fixed-Point Designer) — この例では、イメージに対する量子化の影響を示します。固定小数点データ型が常に許容できる結果を生成するとは限らないのに対し、固定小数点データ型と同じビット数を使用する半精度データ型では、単精度の結果と同等の結果が得られます。

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

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

  • 単精度ルックアップ テーブルの半精度への変換 (Fixed-Point Designer) — この例では、単精度ルックアップ テーブルを半精度を使用するように変換する方法を示します。半精度はストレージ型です。ルックアップ テーブルの計算は、単精度を使用して実行されます。半精度に変換した後、Lookup Table ブロックのメモリ サイズは、目的のシステム パフォーマンスを維持しながら半分に削減されます。

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

半精度データ型は、single や double などの他の浮動小数点型よりもメモリ使用量が少なくなります。占有するメモリはわずか 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® からネイティブの半精度 C コードを生成できます。半精度を使用したコード生成 (Fixed-Point Designer)を参照してください。

MATLAB での半精度

MATLAB の多くの関数は、半精度データ型をサポートしています。サポートされている関数の包括的な一覧については、half (Fixed-Point Designer) を参照してください。

Simulink での半精度

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

showblockdatatypetable

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

半精度でのコード生成

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

MATLAB および Simulink での半精度のコード生成サポートの詳細については、半精度コード生成のサポート (Fixed-Point Designer)およびSimulink の半精度データ型 (Fixed-Point Designer)を参照してください。

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

参考

(Fixed-Point Designer) | (Fixed-Point Designer) | | (Fixed-Point Designer)

関連するトピック