Formát s plovoucí desetinnou čárkou s poloviční přesností - Half-precision floating-point format

Ve výpočetní technice je poloviční přesnost (někdy nazývaná FP16 ) binární formát čísla počítače s plovoucí desetinnou čárkou, který v paměti počítače zabírá 16 bitů (dva bajty v moderních počítačích) .

Mohou vyjádřit hodnoty v rozsahu ± 65 504, přičemž minimální hodnota nad 1 je 1 + 1/1024.

Ve standardu IEEE 754-2008 se 16bitový formát base-2 označuje jako binární16 . Je určen pro ukládání hodnot s plovoucí desetinnou čárkou v aplikacích, kde vyšší přesnost není nezbytná pro provádění aritmetických výpočtů.

Ačkoli implementace IEEE s poloviční přesností s plovoucí desetinnou čárkou jsou relativně nové, existovalo několik dřívějších 16bitových formátů s plovoucí desetinnou čárkou, včetně formátů Hitachi HD61810 DSP z roku 1982, Scottovy WIF a grafického procesoru 3dfx Voodoo .

Nvidia a Microsoft definovaly poloviční datový typ v jazyce Cg , který byl vydán počátkem roku 2002, a implementovaly jej do křemíku v GeForce FX , který byl vydán koncem roku 2002. ILM hledala formát obrazu, který by zvládl široký dynamický rozsah , ale bez náklady na pevný disk a paměť reprezentací s plovoucí desetinnou čárkou, které se běžně používají pro výpočet s plovoucí desetinnou čárkou (jednoduchá a dvojitá přesnost). Hardwarově akcelerovaná programovatelná skupina stínování vedená Johnem Aireyem ze společnosti SGI (Silicon Graphics) vynalezla datový typ s10e5 v roce 1997 jako součást „bali“ designového úsilí. To je popsáno v dokumentu SIGGRAPH 2000 (viz část 4.3) a dále dokumentováno v US patentu 7518615.

Tento formát se používá v několika počítačových grafických prostředích, včetně MATLAB , OpenEXR , JPEG XR , GIMP , OpenGL , Cg , Direct3D a D3DX . Výhodou oproti 8bitovým nebo 16bitovým binárním celým číslům je, že zvýšený dynamický rozsah umožňuje zachovat více detailů ve světlech a stínech obrázků. Výhodou oproti 32bitovým binárním formátům s jednou přesností je, že vyžaduje polovinu úložiště a šířku pásma (na úkor přesnosti a rozsahu).

Rozšíření F16C umožňuje procesorům x86 převádět polopřesné plováky na plováky s jednou přesností .

V závislosti na počítači může být poloviční přesnost řádově rychlejší než dvojnásobná přesnost, např. 550 PFLOPS pro poloviční přesnost vs. 37 PFLOPS pro dvojitou přesnost u jednoho poskytovatele cloudu.

IEEE 754 binární formát s plovoucí desetinnou čárkou s poloviční přesností: binary16

Standard IEEE 754 specifikuje binary16 jako následující formát:

Formát je uspořádán následovně:

IEEE 754r Half Floating Point Format.svg

Předpokládá se, že formát má implicitní bit olova s ​​hodnotou 1, pokud pole exponentu není uloženo se všemi nulami. Ve formátu paměti se tedy objeví pouze 10 bitů významnosti, ale celková přesnost je 11 bitů. V jazyce IEEE 754 existuje 10 bitů významnosti, ale existuje 11 bitů přesnosti významů (log 10 (2 11 ) ≈ 3,311 desetinných číslic, nebo 4 číslice ± o něco méně než 5 jednotek na posledním místě ).

Kódování komponent

Binární exponent s plovoucí desetinnou čárkou s poloviční přesností je zakódován pomocí ofsetového binárního vyjádření, přičemž nulový posun je 15; také známý jako zkreslení exponentů ve standardu IEEE 754.

Jak je definováno v binární reprezentaci posunutí, aby se získal skutečný exponent, musí se odečíst offset 15 od uloženého exponenta.

Uložené exponenty 00000 2 a 11111 2 jsou interpretovány speciálně.

Exponent Význam = nula Významná ≠ nula Rovnice
00000 2 nula , −0 podnormální čísla (−1) signbit × 2 −14 × 0. významné bity 2
00001 2 , ..., 11110 2 normalizovaná hodnota (-1) signbit × 2 exponent − 15 × 1. významné bity 2
11111 2 ± nekonečno NaN (tichý, signalizační)

Minimální přísně kladná (subnormální) hodnota je 2 −24 ≈ 5,96 × 10 −8 . Minimální kladná normální hodnota je 2 −14 ≈ 6,10 × 10 −5 . Maximální zobrazitelná hodnota je (2−2 −10 ) × 2 15 = 65504.

Příklady poloviční přesnosti

Tyto příklady jsou uvedeny v bitové reprezentaci hodnoty s plovoucí desetinnou čárkou. To zahrnuje znaménkový bit, (předpjatý) exponent a význam.

0 00000 00000000012 = 000116 =  ≈ 0.000000059604645
                              (smallest positive subnormal number)
0 00000 11111111112 = 03ff16 =  ≈ 0.000060975552
                              (largest subnormal number)
0 00001 00000000002 = 040016 =  ≈ 0.00006103515625
                              (smallest positive normal number)
0 11110 11111111112 = 7bff16 =  = 65504
                              (largest normal number)
0 01110 11111111112 = 3bff16 =  ≈ 0.99951172
                              (largest number less than one)
0 01111 00000000002 = 3c0016 =  = 1
                              (one)
0 01111 00000000012 = 3c0116 =  ≈ 1.00097656
                              (smallest number larger than one)
0 01101 01010101012 = 355516 =  = 0.33325195
                              (the rounding of 1/3 to nearest)
1 10000 00000000002 = c00016 = −2
0 00000 00000000002 = 000016 = 0
1 00000 00000000002 = 800016 = −0
0 11111 00000000002 = 7c0016 = infinity
1 11111 00000000002 = fc0016 = −infinity

Ve výchozím nastavení 1/3 zaokrouhluje dolů, jako pro dvojitou přesnost , kvůli lichému počtu bitů v znaménku. Bity za bodem zaokrouhlování jsou 0101...méně než 1/2 jednotky na posledním místě .

Přesná omezení desetinných hodnot v [0, 1]

  • Desetinná místa mezi 2 −24 (minimální kladná podnormální) a 2 −14 (maximální podnormální): pevný interval 2 −24
  • Desetinná místa mezi 2 −14 (minimální kladná normála) a 2 −13 : pevný interval 2 −24
  • Desetinná čísla mezi 2 −13 a 2 −12 : pevný interval 2 −23
  • Desetinná čísla mezi 2 −12 a 2 −11 : pevný interval 2 −22
  • Desetinná čísla mezi 2 −11 a 2 −10 : pevný interval 2 −21
  • Desetinná místa mezi 2 −10 a 2 −9 : pevný interval 2 −20
  • Desetinná čísla mezi 2 −9 a 2 −8 : pevný interval 2 −19
  • Desetinná čísla mezi 2 −8 a 2 −7 : pevný interval 2 −18
  • Desetinná čísla mezi 2 −7 a 2 −6 : pevný interval 2 −17
  • Desetinná čísla mezi 2 −6 a 2 −5 : pevný interval 2 −16
  • Desetinná místa mezi 2 −5 a 2 −4 : pevný interval 2 −15
  • Desetinná čísla mezi 2 −4 a 2 −3 : pevný interval 2 −14
  • Desetinná místa mezi 2 −3 a 2 −2 : pevný interval 2 −13
  • Desetinná místa mezi 2 −2 a 2 −1 : pevný interval 2 −12
  • Desetinná čísla mezi 2 −1 a 2 −0 : pevný interval 2 −11

Přesná omezení desetinných hodnot v [1, 2048]

  • Desetinná čísla mezi 1 a 2: pevný interval 2 −10 (1 + 2 −10 je další největší float po 1)
  • Desetinná čísla mezi 2 a 4: pevný interval 2 −9
  • Desetinná čísla mezi 4 a 8: pevný interval 2 −8
  • Desetinná čísla mezi 8 a 16: pevný interval 2 −7
  • Desetinná čísla mezi 16 a 32: pevný interval 2 −6
  • Desetinná čísla mezi 32 a 64: pevný interval 2 −5
  • Desetinná čísla mezi 64 a 128: pevný interval 2 −4
  • Desetinná čísla mezi 128 a 256: pevný interval 2 -3
  • Desetinná čísla mezi 256 a 512: pevný interval 2 −2
  • Desetinná čísla mezi 512 a 1024: pevný interval 2 −1
  • Desetinná čísla mezi 1024 a 2048: pevný interval 2 0

Přesná omezení celočíselných hodnot

  • Celá čísla mezi 0 a 2048 mohou být přesně znázorněna (a také mezi -2048 a 0)
  • Celá čísla mezi 2048 a 4096 se zaokrouhlují na násobek 2 (sudé číslo)
  • Celá čísla mezi 4096 a 8192 se zaokrouhlují na násobek 4
  • Celá čísla mezi 8192 a 16384 se zaokrouhlují na násobek 8
  • Celá čísla mezi 16384 a 32768 se zaokrouhlují na násobek 16
  • Celá čísla mezi 32768 a 65519 se zaokrouhlují na násobek 32
  • Celá čísla nad 65519 se zaokrouhlují na „nekonečno“, pokud se používá zaokrouhlování na sudé, nebo nad 65535, pokud se používá zaokrouhlování na nulu, nebo nad 65504 (největší reprezentativní konečná hodnota), pokud se používá zaokrouhlování na nekonečno.

ARM alternativní poloviční přesnost

Procesory ARM podporují (přes bit registru s plovoucí desetinnou čárkou ) formát „alternativní poloviční přesnosti“, který odstraní speciální případ pro exponentovou hodnotu 31 (11111 2 ). Je téměř identický s formátem IEEE, ale pro nekonečno nebo NaN neexistuje žádné kódování; místo toho exponent 31 kóduje normalizovaná čísla v rozsahu 65536 až 131008.

Použití

Hardware a software pro strojové učení nebo neuronové sítě mají tendenci používat poloviční přesnost: takové aplikace obvykle provádějí velké množství výpočtů, ale nevyžadují vysokou úroveň přesnosti.

Na starších počítačích, které přistupují k 8 nebo 16 bitům najednou (většina moderních počítačů přistupuje k 32 nebo 64 bitům najednou), je aritmetika poloviční přesnosti rychlejší než jednoduchá přesnost a podstatně rychlejší než dvojnásobná přesnost. V systémech s instrukcemi, které zvládnou více čísel s plovoucí desetinnou čárkou v jedné instrukci, nabízí poloviční přesnost často vyšší průměrnou propustnost.

Viz také

Reference

Další čtení

externí odkazy