Jeg er ny innen informatikk og lurte på om halv presisjon støttes av moderne arkitektur på samme måte som enkel eller dobbel presisjon er. Jeg trodde 2008-revisjonen av IEEE-754-standarden introduserte både firdoble og halve presisjoner.
Kommentarer
- Dette ble merket MATLAB, men MATLAB støtter ikke ‘ t (ennå) 16 bit floating point.
- Se dette stack-utvekslingsspørsmålet som har detaljert informasjon om dette: stackoverflow.com/questions/49995594/…
- Det ville være verdt å avklare om du bare mener CPUer, eller både CPUer og GPUer.
- Takk for kommentaren Max Barraclough. Jeg visste ikke at du kunne endre presisjonen i bare grafikkbehandlingsenhetene (GPUer); Jeg trodde det måtte gjøres i begge deler. Kommentaren din er veldig nyttig.
Svar
Intel-støtte for IEEE float16 lagringsformat
Intel støtter IEEE half som lagringstype i prosessorer siden Ivy Bridge (2013). Lagringstype betyr at du kan få fordeler med minne / cache-kapasitet / båndbredde, men beregningen gjøres med én presisjon etter konvertering til og fra IEEE-halvpresisjonsformatet.
Intel-støtte for BFloat16
Intel har kunngjort støtte for BF16 i Cooper Lake and Sapphire Rapids.
-
https://software.intel.com/content/dam/develop/public/us/en/documents/architecture-instruction-set-extensions-programming-reference.pdf (oppdateringen fra juni 2020 319433-040 beskriver AMX BF16)
Jeg jobber for Intel. Jeg siterer offisielle kilder og vil ikke kommentere rykter osv.
Det er godt å være nysgjerrig på de relative fordelene ved IEEE FP16 vs BF16. Det er mye analyse av dette emnet, f.eks. https://nhigham.com/2018/12/03/half-precision-arithmetic-fp16-versus-bfloat16/ .
Maskinvarestøtte som ikke er fra Intel
Følgende er informasjon om andre prosessorer. Bekreft med leverandørene etter behov.
http://on-demand.gputechconf.com/gtc/2017/presentation/s7676-piotr-luszcek-half-precision-bencharking-for-hpc.pdf viser følgende maskinvarestøtte:
- AMD – MI5, MI8, MI25
- ARM – NEON VFP FP16 i V8.2-A
- NVIDIA – Pascal og Volta
NVIDIA Ampere har også FP16-støtte ( https://devblogs.nvidia.com/nvidia-ampere-architecture-in-depth/ ).
Kommentarer
- Den første delen av dette svaret er litt misvisende. Mens Ivy Bridge faktisk introduserte støtte for F16C, og det betyr teknisk sett at halv-presisjonsflyter er » støttet «, den eneste instruksjonen er de som skal konverteres til og fra halv-presisjonsflyter. Ingen operasjoner kan utføres på dem overhodet, slik at det neppe oppfyller kravet i spørsmålet: » Jeg lurte på om halv presisjon støttes av moderne arkitektur på samme måte som enkel eller dobbel presisjon er. » Det er bare et lagringsformat. Du ‘ omhandler ALU-konverteringssykluser for minnebåndbredde / fotavtrykk.
- Jeg sa bokstavelig talt at det er en lagringstype, alle besparelsene kommer fra smalere data, og beregningen er gjort med en enkelt presisjon. Det er ikke villedende i det minste. Jeg sa hvilken støtte som var til stede, som er halvparten av støtten mulig.
- Takk alle sammen. Jeg fant faktisk hver av disse kommentarene nyttige. Den opprinnelige grunnen til å stille spørsmålet skyldtes å lytte til andre som kranglet om akkurat denne tingen.
- @AsadMehasi: også relatert til Stack Overflow: Halvpresisjon flytende-aritmetikk på Intel-brikker – ja på integrerte GPU-er siden Skylake, men i IA-kjernene kun for konvertering til / fra
float
på butikk / last. (Inntil BFloat-støtte i kommende HW)
Svar
Etter min mening ikke veldig ensartet. Aritmetikk med lav presisjon ser ut til å ha fått noe trekk i maskinlæring, men det er forskjellige definisjoner for hva folk mener med lav presisjon. Det er IEEE-754 halvparten (10 biters mantissa, 5 bit eksponent, 1 bit tegn) men også bfloat16 (7 biters mantissa, 8 bit eksponent, 1 bit tegn) som favoriserer dynamisk område fremfor presisjon, og en rekke andre formater (NVidias 19-biters TensorFloat, AMDs fp24, kanskje mer?). Det meste av dette kjører på spesiell GPGPU-type maskinvare.
I motsetning har float og double generelt avtalt betydning, som IEEE-754-kompatibel, 32-bit (23/8/1) og 64-bit (52/11/1) representasjoner.
Kommentarer
- Selv om det absolutt ikke er standard, bruker optisk databehandling effektivt halvparten -presisjons (eller mindre) flytende punktoperasjoner.
Svar
Det aksepterte svaret gir en oversikt. Jeg vil legge til noen flere detaljer om støtte i NVIDIA-prosessorer. Støtten jeg beskriver her er 16-biters, IEEE 754-kompatibel, flytende punkt-aritmetisk støtte, inkludert legg til, multipliser, multipliser-legg til og konverteringer til / fra andre formater. .
Maxwell (circa 2015)
Den tidligste IEEE 754 FP16 («binær16» eller «halv presisjon») -støtte kom i cc (beregningsfunksjon) 5.3 enheter som var i Maxwell-generasjonen, men denne beregningsfunksjonen ble bare implementert i Tegra TX1-prosessor (SoC, f.eks. Jetson).
Pascal (circa 2016)
Pascal familiemedlemmer har enten «full rate» (cc 6.0, 6.2 ) eller «lav hastighet» (cc 6.1) FP16 gjennomstrømning. cc6.2 var igjen et Tegra-familieprodukt, TX2. cc 6.0 og 6.1 funnet bruk i en rekke prosessorer i forskjellige produktfamilier som GeForce, Quadro og Tesla. «full hastighet» refererer her til en hastighet som tilsvarer to ganger IEEE 754 FP32 («binær32» eller «enkelt presisjon») for prosessoren i spørsmålet, når operasjoner ble utført med en halv2 datatype (to halve mengder behandlet samme register og instruksjon).
Volta, Turing (2017, 2018)
Volta og Turing familiemedlemmer (cc 7.x) støtter FP16 på » full rate «, og i tillegg bruke formatet i TensorCore -operasjoner.
Ampere (Mai, 2020)
Den nylig annonserte Ampere arkitektur A100 GPU støtter også FP16 på en måte som ligner på Volta og Turing, og introduserer tilleggsevne for en TF32 datatype , som er et format der mantissen har samme størrelse (antall bits) som en FP16-mantissa, og t han eksponenten har samme størrelse som en FP32 eksponent. Bfloat16 -funksjon ble også kunngjort i Ampere.
Bortsett fra Ampere-arkitekturprosessoren som nylig ble kunngjort, ble støtte og gjennomstrømninger for 16-bits flytende punktoperasjoner (og andre operasjoner) på tvers av beregningsfunksjoner (inkludert arkitekturer) finner du i tabell 3 i CUDA-programmeringsveiledningen . Gjennomgangene er per klokke, per multiprosessor, så må skaleres tilsvarende for GPU-typen og spesifikasjonene. Disse gjennomstrømningene er ikke for TensorCore-operasjoner, og toppgjennomstrømningene er vanligvis bare anvendbare når de behandles på halvt 2 datatyper (to halvmengder pakket sammen i et enkelt 32-biters ord).
Svar
Du kan finne ut om maskinvaren din støtter halv presisjon via:
$ lscpu | grep Flags | grep f16c Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req md_clear flush_l1d
f16c
instruksjon er dokumentert her .
Kommentarer
- Merk at C i F16C står for Conversion; det hjelper bare med minnebåndbredde / cache-fotavtrykk, ikke SIMD ALU-gjennomstrømning. Du må konvertere til å flyte for å gjøre matematikk, så antall elementer per SIMD-vektor for FMA-operasjoner er ikke ‘ t forbedret.