コンピューティング において、ミニフロートは非常に少ないビット数で表現される浮動小数点値です。精度が低いため、汎用的な数値計算には適していませんが、次のような特殊な目的には役立ちます。
さらに、浮動小数点演算とIEEE 754数値の特性と構造を示すために、コンピュータ サイエンスのコースで教育ツールとして頻繁に使用されます。
16ビットのミニフロートは半精度数です(単精度や倍精度とは対照的です)。8ビット以下のミニフロートもあります。[2]
ミニフロートは、 IEEE 754標準の原則に従って設計できます。この場合、それらは、非正規数と正規数の境界に関する (明示的には記述されていない) 規則に従う必要があり、無限大とNaNの特別なパターンを持つ必要があります。正規化された数は、バイアスされた指数とともに格納されます。標準の新しいリビジョンであるIEEE 754-2008には、 16 ビットのバイナリ ミニフロートがあります。
表記
ミニフロートは通常、4 つの数値 ( S、E、M、B )のタプルを使用して記述されます。
- S は符号フィールドの長さです。通常は 0 または 1 です。
- E は指数フィールドの長さです。
- M は仮数部 (仮数部) フィールドの長さです。
- B は指数バイアスです。
したがって、 ( S , E , M , B )で表されるミニフロート形式の長さはS + E + Mビットです。( S , E , M , B ) 表記は、 (2, M + 1, B + 1, 2 S − B )として( B , P , L , U )形式に変換できます(IEEE の指数使用)。
8ビット浮動小数点数の例(1.4.3)
ここでは、1 バイト (8 ビット) のミニフロート、1 符号ビット、4 指数ビット、3 有効ビット (つまり、1.4.3 ミニフロート) を示します。指数バイアスは、他の IEEE 754 浮動小数点数[3] [4]と一致するように値を 1 を中心にするために 7 と定義されています。そのため、(ほとんどの値に対して) 指数xの実際の乗数は2 x −7です。IEEE 754 のすべての原則が有効です。[5]
異なる基数の数字は ...基数としてマークされます(例: 101 2 = 5)。ビット パターンには、各部分を視覚化するためのスペースがあります。
ゼロの表現
ゼロは、ゼロの仮数を持つゼロ指数として表されます。ゼロ指数は、ゼロが先頭に「0」が付いた非正規数であることを意味し、ゼロ仮数では小数点以下のすべてのビットがゼロになるため、この値は と解釈されます。浮動小数点数は符号付きゼロを使用するため、も使用可能であり、正の と等しくなります。
0 0000 000 = 0 1 0000 000 = −0
非正規数
仮数は「0.」で拡張され、指数値は最小の正規化数のように 1 大きいものとして扱われます。
0 0000 001 = 0.001 2 × 2 1 - 7 = 0.125 × 2 -6 = 0.001953125 (最小の非正規数) ... 0 0000 111 = 0.111 2 × 2 1 - 7 = 0.875 × 2 -6 = 0.013671875 (最大の非正規数)
正規化された数値
仮数は「1」で拡張されます。
0 0001 000 = 1.000 2 × 2 1 - 7 = 1 × 2 -6 = 0.015625 (最小正規化数) 0 0001 001 = 1.001 2 × 2 1 - 7 = 1.125 × 2 -6 = 0.017578125 ... 0 0111 000 = 1.000 2 × 2 7 - 7 = 1 × 2 0 = 1 0 0111 001 = 1.001 2 × 2 7 - 7 = 1.125 × 2 0 = 1.125 (1より大きい最小値) ... 0 1110 000 = 1.000 2 × 2 14 - 7 = 1.000 × 2 7 = 128 0 1110 001 = 1.001 2 × 2 14 - 7 = 1.125 × 2 7 = 144 ... 0 1110 110 = 1.110 2 × 2 14 - 7 = 1.750 × 2 7 = 224 0 1110 111 = 1.111 2 × 2 14 - 7 = 1.875 × 2 7 = 240 (最大の正規化された数)
無限
無限大値は指数が最も高く、仮数はゼロに設定されます。符号ビットは正または負のいずれかになります。
0 1111 000 = +無限大 1 1111 000 = −無限大
数字ではない
NaN 値は指数が最も高く、仮数は 0 以外の値になります。1 ビットの符号と 3 ビットの仮数を持つ float にはNaN 値があります。
s 1111 mmm = NaN ( mmm ≠ 000の場合)
値の表
これは、この例の 8 ビット浮動小数点のすべての可能な値を示す表です。
14 個のビット パターンが NaN を表すため、非 NaN 値は 242 種類しかありません (+0 と -0 が異なるとみなされる場合)。
代替バイアス値
これらの小さなサイズでは、他のバイアス値が興味深い場合があります。たとえば、バイアスが -2 の場合、0 ~ 16 の数字は 0 ~ 16 の整数と同じビット表現を持ちますが、整数以外の値は表現できなくなります。
0 0000 000 = 0.000 2 × 2 1 - (-2) = 0.0 × 2 3 = 0 (非正規数) 0 0000 001 = 0.001 2 × 2 1 - (-2) = 0.125 × 2 3 = 1 (非正規数) 0 0000 111 = 0.111 2 × 2 1 - (-2) = 0.875 × 2 3 = 7 (非正規数) 0 0001 000 = 1.000 2 × 2 1 - (-2) = 1.000 × 2 3 = 8 (正規化された数) 0 0001 111 = 1.111 2 × 2 1 - (-2) = 1.875 × 2 3 = 15 (正規化された数) 0 0010 000 = 1.000 2 × 2 2 - (-2) = 1.000 × 2 4 = 16 (正規化された数)
異なるビット割り当て
上記は、1 ビットの符号、4 ビットの指数、3 ビットの仮数を持つ 8 ビット浮動小数点の例を説明したもので、バランスが取れています。ただし、任意のビット割り当てが可能です。精度を下げてダイナミック レンジを広くする必要がある場合は、指数に多くのビットを割り当てる形式を選択できます。また、ダイナミック レンジを狭めて精度を高くする必要がある場合は、仮数に多くのビットを割り当てる形式を選択できます。極端な場合、すべてのビットを指数に割り当てるか、1 ビットを除くすべてのビットを仮数に割り当てて、指数を 1 ビットだけにすることもできます。指数には少なくとも 1 ビットを割り当てる必要があります。そうしないと、浮動小数点として意味をなさなくなり、符号付き数値になってしまいます。
これは、1 ビットの符号、3 ビットの指数、4 ビットの有効ビットを持つ、異なる 8 ビット浮動小数点のすべての可能な値の表です。有効ビットが指数ビットより 1 ビット多いため、範囲全体にわたって精度が少なくとも 0.5 に保たれます。[6]
上記のような表は、Python または GDScript のスクリプトを使用して、SEMB (符号、指数、仮数/仮数、バイアス) 値の任意の組み合わせに対して生成できます。
算術
追加

この図は、さらに小さい (1.3.2.3) ミニ浮動小数点数の 6 ビットの加算を示しています。この浮動小数点システムは、IEEE 754 の規則に正確に従います。オペランドとして NaN を使用すると、常に NaN の結果が生成されます。Inf − Inf および (−Inf) + Inf も NaN になります (緑の領域)。Inf は、有限値で増減しても変化しません。有限オペランドを使用した合計の結果は、無限大になることがあります (つまり、結果として 14.0 + 3.0 = +Inf はシアンの領域、−Inf はマゼンタの領域です)。有限オペランドの範囲は、曲線x + y = cで埋められます。ここで、c は常に表現可能な浮動小数点値の 1 つです (それぞれ正の結果と負の結果は青と赤)。
引き算、掛け算、割り算
他の算術演算も同様に表すことができます。
-
減算
-
乗算
-
分割
その他のサイズ
Radeon R300およびR420 GPU は、7 ビットの指数と 16 ビット (+1 暗黙的) の仮数部を持つ "fp24" 浮動小数点形式を使用していました。[7] Direct3D 9.0 の "完全精度" は、独自の 24 ビット浮動小数点形式です。Microsoft の D3D9 (Shader Model 2.0) グラフィックスAPI は、グラフィックス ハードウェアによって実行される頂点シェーダとピクセル シェーダの計算に対して、当初は FP24 (ATI の R300 チップと同じ) と FP32 (Nvidia の NV30 チップと同じ) の両方を "完全精度" として、また FP16 を "部分精度" としてサポートしていました。
KhronosはVulkanで使用するために10ビットと11ビットの浮動小数点形式を定義しています。どちらの形式も符号ビットがなく、5ビットの指数を持ちます。10ビット形式には5ビットの仮数部があり、11ビット形式には6ビットの仮数部があります。[8] [9]
IEEE SAワーキンググループP3109は現在、機械学習用に最適化された8ビットミニフロートの標準に取り組んでいます。現在のドラフトでは、1つの形式ではなく、「binary8pP」という名前の7つの異なる形式のファミリが定義されています。ここで、「P」は1から7までの数字です。これらのフロートはコンパクトで効率的になるように設計されていますが、他のIEEEフロートと同じセマンティクスには従わず、負のゼロや複数のNaN値などの機能が欠けています。無限大は、指数と仮数の両方がすべて1であるものとして定義されます。これは、指数がすべて1で仮数がすべて0である他のIEEEフロートとは異なります。[10]
4ビット以下
正規化数、非正規数、符号付きゼロ、符号付き無限大、複数のNaN値など、すべてのIEEE原則に準拠する最小の浮動小数点数サイズは、1ビットの符号、2ビットの指数、1ビットの仮数を持つ4ビットの浮動小数点数です。[11]以下の表では、列には符号ビットと仮数ビットの値が異なり、行には指数ビットの値が異なります。
正規化された数値が必要ない場合は、指数を 1 に減らすことでサイズを 3 ビットに減らすことができます。
符号ビットを除外できる状況では、上記の各例をさらに 1 ビット削減して、上記の表の左半分のみを保持できます。1 ビットの指数と 1 ビットの仮数を持つ 2 ビットの浮動小数点数には、0、1、Inf、NaN の値のみが含まれます。
仮数が 0 ビットであることが許可されている場合、1 ビットの float 形式には 1 ビットの指数があり、値は 0 と Inf の 2 つだけになります。指数は少なくとも 1 ビットである必要があります。そうでない場合、float として意味をなさなくなります (単なる符号付き数値になります)。
4ビット浮動小数点数(4つの特殊なIEEE値なし)は、大規模な言語モデルの高速化に使用されています。[12]
組み込み機器の場合
ミニフロートは組み込みデバイスでも一般的に使用されています[引用が必要] 。特に、浮動小数点をソフトウェアでエミュレートする必要があるマイクロコントローラでよく使用されます。計算を高速化するために、仮数部は通常、ビットのちょうど半分を占めるため、レジスタ境界はシフトせずに自動的に部分をアドレス指定します。
参照
参考文献
- ^ Mocerino, Luca; Calimera, Andrea (2021年11月24日). 「AxP: 連想マッチングによるエネルギー効率の高い近似ConvNetのHW-SW共同設計パイプライン」.応用科学. 11 (23): 11164. doi : 10.3390/app112311164 .
- ^ ab https://developer.nvidia.com/blog/nvidia-arm-and-intel-publish-fp8-specification-for-standardization-as-an-interchange-format-for-ai/ (Intel、NVIDIA、Arm による共同発表); https://arxiv.org/abs/2209.05433 (上記 3 社の研究者が共同執筆したプレプリント論文)
- ^ IEEE 半精度は 5 指数ビットでバイアス 15 ( )、IEEE 単精度は8 指数ビットでバイアス 127 ( )、IEEE 倍精度は 11 指数ビットでバイアス 1023 ( )、IEEE 4 倍精度は15 指数ビットでバイアス 16383 ( ) です。詳細については、指数バイアスの記事を参照してください。
- ^ O'Hallaron, David R.; Bryant, Randal E. (2010).コンピュータシステム: プログラマの視点(第2版). ボストン、マサチューセッツ州、米国: Prentice Hall . ISBN 978-0-13-610804-7。
- ^ Burch, Carl. 「浮動小数点表現」. Hendrix College . 2023年8月29日閲覧。
- ^ https://people.cs.umass.edu/~verts/cmpsci145/8-Bit_Floating_Point.pdf [ベア URL PDF ]
- ^ Buck, Ian (2005 年 3 月 13 日)、「第 32 章 GPU コンピューティングへの挑戦」、Pharr, Matt (編)、GPU Gems、Addison-Wesley、ISBN 0-321-33559-7、 2018年4月5日閲覧。
- ^ Garrard, Andrew. 「10.3. 符号なし10ビット浮動小数点数」。Khronosデータフォーマット仕様v1.2 rev 1。Khronosグループ。 2023年8月10日閲覧。
- ^ Garrard, Andrew. 「10.2. 符号なし11ビット浮動小数点数」。Khronosデータフォーマット仕様v1.2 rev 1。Khronosグループ。 2023年8月10日閲覧。
- ^ 「IEEEワーキンググループP3109 8ビット2進浮動小数点形式に関する中間報告書」(PDF) 。GitHub 。IEEEワーキンググループP3109 。2024年2月21日時点のオリジナル(PDF)からアーカイブ。 2024年5月7日閲覧。
- ^ Shaneyfelt, Dr. Ted. 「Dr. Shaneyfeltの浮動小数点構築ギズモ」。Dr. Ted Shaneyfelt . 2023年8月29日閲覧。
- ^ 「ローカル PC で LLM 推論を高速化する」。
- Munafo, Robert (2016 年 5 月 15 日)。「浮動小数点形式の調査」。2016 年8 月 8 日閲覧。
外部リンク
- OpenGL ハーフフロートピクセル
