単精度、倍精度、混合精度コンピューティングの主な違い

精度形式を理解し、計算に適用する形式を考えることは非常に重要ですが、倍精度演算の精度と単精度演算の性能は相容れない関係であるため、それらをバランスよく取り入れることも同じくらい重要です。いずれの形式も高い精度で、数値の限界に挑戦するものですが、それぞれの形式には特徴があり、それに伴うデメリットもあります。

ここでは、これらの形式の違いについて説明し、精度の異なる形式を混合させることで精度を下げずに演算効率を上げる方法について詳しく解説します。

コンピューター サイエンスにおける精度の役割

単精度演算と倍精度演算の違いを理解するためには、コンピューター サイエンスにおける精度の役割を理解することが重要です。たとえば、無理数 (円周率など) を使用する計算で、小数点以下 2 桁 (3.14) までしか含めない場合を考えます。このとき、小数点以下 10 桁 (3.1415926535) まで含めて計算した方が、より正確な結果が得られることは明らかです。

コンピューターの世界では、このレベルを「精度」と呼び、10 進数ではなく 2 進数 (ビット) で表現します。使用するビットが多いほど、精度は高くなります。

コンピューター サイエンスにおける精度

IEEE 規格の浮動小数点数表現

大きな数字をコンピューターの 2 進数で表現するには、計算に大きな誤差が生じないようにするための基準が必要です。そこで、IEEE (Institute of Electrical and Electronics Engineers) が浮動小数点演算の IEEE 標準規格 (IEEE 754) を策定しました。

IEEE 754 には 3 つの構成要素があります。

  1. 符号部 - 0 は正の数、1 は負の数を表す。

  2. バイアスを使用する指数部 - 正の指数と負の指数の両方を表現するために使用する。実際の指数にバイアスを加えて、格納されている指数を取得する。

  3. 仮数部 - 精度ビット数を表す。

IEEE 754 では、これらの構成要素を用いて、浮動小数点数を単精度と倍精度の 2 つの形式で表現します。浮動小数点数の表現方法は現在でも多くありますが、最も効率的に数値を表現できる IEEE 754 が一般的に使用されています。

eBook をダウンロード (無料)「AI in the data center: Harnessing the power of FPGA's」

eBook をダウンロード (無料)
「AI in the data center: Harnessing the power of FPGA's」

Smart Security camera features and facial recognition using SOMs

単精度浮動小数点形式とは?

単精度浮動小数点形式は、32 ビットのメモリ領域を使用し、広範囲の数値を表現できます。FP32 とも呼ばれ、近似値が大きな問題にならない計算に最適です。

倍精度浮動小数点形式とは?

倍精度浮動小数点形式は、64 ビットのメモリ領域を使用するため、単精度形式よりもはるかに高い精度で結果を生成できます。FP64 とも呼ばれ、桁数が多く、より正確な計算が求められるアプリケーションに使用されます。

倍精度演算は、精度がさらに高くなる分、より多くの演算リソース、メモリ容量、データ転送が必要になります。必然的にコストが高くなるため、それほど高精度を要求しないアプリケーションにとっては、デメリットの方が大きくなります。

単精度と倍精度の違い

単精度演算と倍精度演算を区別する最も簡単な方法は、浮動小数点数を表すビット数に注目します。単精度は、32 ビットで浮動小数点数を表します。倍精度は、64 ビットで浮動小数点数を表します。

オイラー数 (e) の例を挙げてみましょう。e の小数点以下の最初の 50 桁は次のとおりです。 2.7182818284590452353602874713526624977572470936999

これを、単精度形式に変換すると、以下のようなバイナリ値でオイラー数を表すことができます。
01000000001011011111100001010100

これを、倍精度形式に変換すると、以下のようなバイナリ値でオイラー数を表すことができます。
010000000000010110111111 0000101010001011000101000101011101101001

先頭の数値は、符号を表しています。次の数値群 (単精度の場合は 8 ビット、倍精度の場合は 11 ビット) は、バイアスを使用する指数部です。最後の数値群 (単精度の場合は 23 ビット、倍精度の場合は 52 ビット) は、仮数部です。

比較表: 単精度 vs 倍精度

 

単精度

倍精度

概要

32 ビットのメモリ領域を使用して数値を表現し、そのうちの 1 ビットは仮数部の符号を表す

64 ビットのメモリ領域を使用して数値を表現し、そのうちの 1 ビットは仮数部の符号を表す

バイアスのある指数部

指数部には 8 ビットを使用

指数部には 11 ビットを使用

仮数部

仮数部には 23 ビットを使用 (小数部分を表す)

仮数部には 52 ビットを使用 (小数部分を表す)

実際のアプリケーション

高い精度は必要ないが、広範囲の値を表現する必要があるゲームなどのプログラムに使用されている

高い精度が要求される科学計算や複雑なプログラムなどに使用されている

多精度 vs 混合精度コンピューティング

多精度 vs 混合精度コンピューティング

単精度や倍精度などの多精度演算形式のほかに、混合精度コンピューティングがあります。

混合精度 (変動精度とも言われる) コンピューティングは、一般的に機械学習分野で使用されています。高速行列演算のために半精度 (16 ビット) の値から計算を実行し、数値が計算されると、それより高い精度で格納されます。

混合精度演算の利点は、倍精度演算の精度で結果を生成できるにもかかわらず、電力、ランタイム、メモリは倍精度演算より低く抑えられることです。

異なるレベルの精度を混合させる利点

異なるレベルの精度を混合させる利点

異なるワークロードに対して計算を実行する場合、1 つの精度ですべての要件を満たすことは不可能なため、異なる精度で対応する必要があります。コンピューター サイエンティストは、利用できるリソース、予算、ストレージなど、さまざまな要件に基づいて演算を実行するために、異なる精度形式が必要です。

たとえば、倍精度演算は極めて正確な計算ができることから、ビッグデータを活用する研究や気象モデルの計算に最適な場合がありますが、倍精度演算に必要なストレージやリソースのコストを考えると、常にそうとは限りません。異なる精度レベルを混在させることで、必要に応じて計算効率とコストを最適化できるようになります。

計算効率を最適化

計算効率を最適化

計算精度は確かに重要ですが、異なる精度レベルを使用することで、どれほどのメリットが受けられるのかを理解しておくことも重要です。精度の高い計算能力よりも、計算効率を確保するためには、さまざまな浮動小数点形式に対応できる柔軟な機能が必要です。

Vivado ML
Kria Logo for Xilinx System-on-Modules

ザイリンクスの Vivado® ML および System Generator for DSP は、多精度または混合精度にかかわらず、さまざまな浮動小数点精度をサポートする堅牢なツールを提供します。また、業界を牽引するこのツール環境では、迅速な設計、生産性向上、リソースの効率的な使用を可能にするために必要な精度を柔軟にカスタマイズできます。

ザイリンクスの Vivado® を使用して計算効率を高める方法を紹介しています。