半精度浮動小数点数のソースを表示
←
半精度浮動小数点数
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{出典の明記|date=2019-04}} '''半精度浮動小数点数'''(はんせいどふどうしょうすうてんすう、{{lang-en-short|half-precision floating point number}})は浮動小数点方式で表現された数([[浮動小数点数]])の一種で、16ビット(2オクテット)の形式によりコンピュータ上で表現可能な浮動小数点数である。 [[IEEE 754]]-2008ではbinary16と名づけられている他、処理系や文脈によってs10e5やhalf、fp16などと表記される。 == 歴史 == FP16は当初、主にコンピュータグラフィックス用として提唱された、浮動小数点数フォーマットのひとつである<ref>[https://news.mynavi.jp/article/graphics-42/ 3Dグラフィックス・マニアックス(42) HDRレンダリング(2)~HDRレンダリングの第一の効能 | マイナビニュース]</ref>。 [[Graphics Processing Unit|GPU]]においては、リアルタイム[[3次元コンピュータグラフィックス]]処理において[[単精度浮動小数点数]]に対するスループット向上などを目的に、[[DirectX]] 9.0 ([[Direct3D]] 9.0) [[Application Programming Interface|API]]と[[Cg (プログラミング言語) |Cg]]/[[HLSL]]([[シェーディング言語]])で利用可能なデータ形式として、[[NVIDIA]]と[[マイクロソフト]]が共同で策定し、[[NVIDIA GeForce|GeForce FX]]や[[NVIDIA_Quadro#NV34 (GeForce FX 5200 Ultra) ベース|Quadro FX]]で採用したのが始まりである。ただし当時のFP16の主な目的は浮動小数[[テクスチャマッピング|テクスチャ]]のデータ量を削減するためのフォーマットであり、FP16のハードウェアアクセラレーションをサポートしないハードウェアにおける<code>half</code>型の演算は<code>float</code>型と同じく32ビットの[[単精度浮動小数点数]]用の演算器を利用して実行されていたため、演算の速度性能自体には寄与しなかった<ref>[https://www.4gamer.net/specials/gdc27/gffx2_2.html GeForce FXシリーズのパフォーマンスの核心に迫る]</ref>。 [[インダストリアル・ライト&マジック]]社の研究の中で、広いダイナミックレンジと浮動小数点数の特徴を生かして光量の調整に向いていることが分かり、[[OpenEXR]]で採用された。 その後、[[IEEE_754|IEEE 754r]]を経てIEEE 754-2008でbinary16として、データ交換とデータ容量削減を主目的とした保存用フォーマットとして採用された。 {{いつ範囲|date=2019-04|近年}}では、ハードウェアサポート([[SIMD]]: Packed FP16)があれば高い演算性能 ([[FLOPS]]) が見込める上に、メモリ容量やディスク容量が節約できることから、[[ディープラーニング]]において利用が活発化している。 == 用途 == 誕生の経緯から、リアルタイムグラフィックス用途で利用されているほか、[[ハイダイナミックレンジ合成|HDRレンダリング]] (High-Dynamic-Range Rendering) などプロダクション用途で利用が可能である。ダイナミックレンジを広くとることができることから、アニメーションやCGなどの用途で利用されることが多いが、一般的な画像ファイルフォーマットとして対応しているものは少なく、[[OpenEXR]]や[[DirectDraw Surface|DDS]]といった特殊な形式に限られる。 また、ハードウェアの支援があればスループットが劇的に向上し、かつ、nビットの乗算器の回路規模はn<sup>2</sup>log(n)に比例するので、仮数部11ビットの半精度浮動小数点数の乗算器の規模、すなわちチップに占める面積は、16ビットの整数乗算器の半分程度であり(ただし加減算に必要な、正規化のためのシフト処理は別途必要)、同一面積のチップに実装できる積和演算器の数も大幅に増やすことができる。モバイル向け[[Graphics Processing Unit|GPU]]では消費電力と性能と精度のバランスの観点から、既定でFP32よりもFP16が使われることが多い。重み付け係数を格納するストレージ容量の節約になることも相まって、並列度の高いディープラーニング用途において注目が集まっており、パーソナルコンピュータ/ワークステーション/サーバー向けにおいても対応GPUが増加し、FPGAでの実装や汎用的な信号処理用のアクセラレータの研究も進んでいる。 == IEEE 754 半精度2進浮動小数点表現: binary16 == IEEE 754標準は'''binary16'''を以下のように定めている。 * 符号ビット: 1 ビット * 指数部の幅: 5 ビット * [[仮数]]部の幅=精度: 11 (明示的には10ビット) 他のIEEE754浮動小数点表現と同様、指数部が全0でない限り黙示的な「1」のビットを仮数部に持つ(いわゆる「ケチ表現」)。このため仮数部に記録するのは10ビットだが11ビットの精度を持つ。<math>\log_{10}(2^{11}) \approx 3.311</math>より、これは十進数にしておよそ3桁の値となる。ビットは下図のように並ぶ。 [[Image:IEEE_754r_Half_Floating_Point_Format.svg]] === 指数部のエンコーディング === 半精度2進浮動小数点数の指数部はオフセット2進表現でエンコードされており、オフセット(IEEE 754における指数部バイアス)は15である。 * E<sub>min</sub> = 0x01−0x0f = −14 * E<sub>max</sub> = 0x1e−0x0f = 15 * 指数部バイアス = 0x0f = 15 よって、真の指数を得るためには、記録された指数から15を引けばよい。 記録された指数の0x00と0x1fは特別に扱われる。 {|class="wikitable" style="text-align:center" ! 指数 !! 仮数=0 !! 仮数≠0 !! 式 |- | 0x00 || [[0]], [[−0]] || [[非正規化数]] || <math>(-1)^{\text{signbit}} \times 2^{-14} \times 0.\text{significandbits}_2</math> |- | 0x01, ..., 0x1e ||colspan=2| 正規化数 || <math>(-1)^{\text{signbit}} \times 2^{{\text{exponentbits}_2} - 15} \times 1.\text{significandbits}_2</math> <!-- 画像化に失敗するため数式の日本語化を断念。 --> |- | 0x1f || ±[[無限|無限大]] || [[NaN]] (quiet, signalling) |} *最小の正の非正規化数 : 2<sup>−24</sup> ≈ 5.96 × 10<sup>−8</sup> *最小の正の正規化数 : 2<sup>−14</sup> ≈ 6.10 × 10<sup>−5</sup> *表現可能な最大数 : 65504 === 半精度数の例 === 浮動小数点数値のビット列を[[十六進法]]で表した例を以下に示す。これには符号、オフセットを加えた指数値、仮数値が含まれている。 3c00 = 1 3c01 = 1.0009765625、1より大きい最小の数 3c02 = 1.001953125 3fff = 1.9990234375、2より小さい最大の数 4000 = 2 c000 = -2 7bfe = 65472 7bff = 65504 (半精度数の正の最大値。符号なし16ビット整数の最大数(65535)と大差ない) fbff = -65504 (半精度数の負の最大値) 0400 = 2<sup>-14</sup> ≈ 6.10352 × 10<sup>-5</sup> (最小の正の正規化数) 0001 = 2<sup>-24</sup> ≈ 5.96046 × 10<sup>-8</sup> (最小の正の非正規化数) 0000 = 0 8000 = -0 7c00 = 正の無限大 fc00 = 負の無限大 3555 ≈ 0.33325... ≈ 1/3 1/3は切り下げられる。これは仮数部のビット数が奇数であるため(1/3は2進小数で0.01010101...)である。 == 対応状況 == {{出典の明記|section=1|date=2019-04}} === ハードウェア === * [[NVIDIA]]: Pascalアーキテクチャ以降の[[NVIDIA GeForce|GeForce]]/[[NVIDIA Quadro|Quadro]]/[[NVIDIA Tesla|Tesla]]シリーズ<ref>[https://pc.watch.impress.co.jp/docs/column/kaigai/752331.html 【後藤弘茂のWeekly海外ニュース】倍精度浮動小数点演算性能を引き上げた新GPUアーキテクチャ「Pascal」 - PC Watch]</ref><ref group="注釈">ただしPascalアーキテクチャにおいてダブルレートのFP16をサポートするのは、GP100コアを採用する一部製品(Tesla P100およびQuadro GP100)に限られる。</ref>、またMaxwellアーキテクチャ以降の[[NVIDIA Tegra|Tegra]]シリーズにてPacked FP16をサポート<ref>[https://pc.watch.impress.co.jp/docs/column/kaigai/683434.html 【後藤弘茂のWeekly海外ニュース】1TFLOPSのNVIDIAモバイルSoC「Tegra X1」 - PC Watch]</ref>。 * ARM VFPv3のオプションとしてfp16が利用可能。 * [[アドバンスト・マイクロ・デバイセズ|AMD]]: [[AMD Radeon]] RX Vegaシリーズにてサポート。Radeonとしては初めてbinary16の並列処理が可能になる。 === ソフトウェア === * [[OpenCL]] - OpenCL 1.0の拡張として、cl_khr_fp16が有効であれば利用可能。 * [[OpenCV]] - 3.3.0以降でfloatとhalfの変換が利用可能。 * Cg - 組み込みの<code>half</code>型として実装されている。 * [[CUDA]] - <code>half</code>型を直接扱う演算子のサポートはないが、<code>float</code>型などとの相互変換関数<ref>[https://docs.nvidia.com/cuda/cuda-math-api/group__CUDA__MATH____HALF__MISC.html CUDA Math API :: CUDA Toolkit Documentation]</ref>や各種演算用の組み込み関数<ref>[https://devblogs.nvidia.com/mixed-precision-programming-cuda-8/ Mixed-Precision Programming with CUDA 8 | NVIDIA Developer Blog]</ref>が用意されている。 * Direct3D/HLSL - Direct3D 9以降のテクスチャフォーマットとしてFP16をサポート。また、Direct3D 9以降のHLSLで<code>half</code>型をサポート。Direct3D 10では<code>half</code>は常に<code>float</code>として扱われる<ref>[https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-scalar Scalar Types - Windows applications | Microsoft Docs]</ref>。DirectX 11.1 (Direct3D 11.1) 以降では低精度[[シェーダー]](最低精度シェーダー)をサポートし<ref>[https://game.watch.impress.co.jp/docs/series/3dcg/517776.html 【GDC2012】西川善司の3Dゲームファンのための「DirectX 11.1」講座 - GAME Watch]</ref>、<code>min16float</code>として対応ハードウェア上で利用できるが、この低精度シェーダー機能は[[Microsoft Windows 8]]以降でしか動作しない<ref>[https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/using-hlsl-minimum-precision Using HLSL minimum precision - Windows applications | Microsoft Docs]</ref>。 * [[OpenGL]]/[[OpenGL ES]]/[[GLSL]] - OpenGL 3.0以降のテクスチャフォーマットとしてFP16をサポート<ref>[https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml glTexImage2D - OpenGL 4 Reference Pages]</ref>。GLSLではmediumpとして利用可能。 * C++ - s10e5として{{要出典範囲|date=2019-12|実装例}}{{要説明|date=2019-12}}がある。 * [[OpenEXR]] - [[C++]]向けの<code>half</code>クラス型が提供されている<ref>[https://github.com/AcademySoftwareFoundation/openexr/blob/master/IlmBase/Half/half.h openexr/half.h at master · AcademySoftwareFoundation/openexr]</ref>。 * [[macOS]]では[[Mac OS X v10.4]]以降にて、RGBA各チャンネルが16ビット浮動小数点数(ピクセルあたり64ビット)のピクセルフォーマット<code>kCIFormatRGBAh</code>がサポートされている<ref>[https://developer.apple.com/documentation/coreimage/kciformatrgbah?language=objc kCIFormatRGBAh - Core Image | Apple Developer Documentation]</ref>。 ==脚注== {{脚注ヘルプ}} === 注釈 === {{Notelist}} === 出典 === <references /> == 外部リンク == * [http://www.mrob.com/pub/math/floatformats.html#minifloat Minifloats] (''Survey of Floating-Point Formats''の中) * [http://www.openexr.org/ OpenEXR site] <!-- * [http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/reference/d3dx/constants/OTHER_D3DX.asp Half precision constants] from [[D3DX]] --> * [http://oss.sgi.com/projects/ogl-sample/registry/ARB/half_float_pixel.txt OpenGL treatment of half precision] * [http://www.analog.com/static/imported-files/processor_manuals/ADSP_2136x_PGR_rev1-1.pdf{{リンク切れ|date=2017年9月 |bot=InternetArchiveBot }} Analog devices variant] (4ビット指数) * [http://www.mathworks.com/matlabcentral/fileexchange/23173 C source code to convert between IEEE double, single, and half precision can be found here] * [http://csharp-half.svn.sourceforge.net/viewvc/csharp-half/ Half-precision floating point in C#] C#で書かれたフリーのhalf floatライブラリ {{データ型}} {{DEFAULTSORT:はんせいとふとうしようすうてんすう}} [[Category:コンピュータの算術]] [[Category:データ型]]
このページで使用されているテンプレート:
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Notelist
(
ソースを閲覧
)
テンプレート:いつ範囲
(
ソースを閲覧
)
テンプレート:データ型
(
ソースを閲覧
)
テンプレート:リンク切れ
(
ソースを閲覧
)
テンプレート:出典の明記
(
ソースを閲覧
)
テンプレート:脚注ヘルプ
(
ソースを閲覧
)
テンプレート:要出典範囲
(
ソースを閲覧
)
テンプレート:要説明
(
ソースを閲覧
)
半精度浮動小数点数
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報