Ich bin neu in der Informatik und habe mich gefragt, ob die moderne Architektur die halbe Genauigkeit genauso unterstützt wie die einfache oder doppelte Genauigkeit. Ich dachte, die Überarbeitung des IEEE-754-Standards von 2008 führte sowohl vierfache als auch halbe Präzision ein.
Kommentare
- Dies wurde mit MATLAB markiert, aber MATLAB unterstützt ‚ (noch) nicht 16 Bit Gleitkomma.
- In dieser Frage zum Stapelaustausch finden Sie einige detaillierte Informationen dazu: stackoverflow.com/questions/49995594/…
- Es lohnt sich zu klären, ob Sie nur CPUs oder sowohl CPUs als auch GPUs meinen.
- Vielen Dank für Ihren Kommentar Max Barraclough. Ich wusste nicht, dass Sie die Genauigkeit nur in den Grafikprozessoren (GPUs) ändern können. Ich dachte, dass es in beiden gemacht werden muss. Ihr Kommentar ist sehr hilfreich.
Antwort
Intel-Unterstützung für das IEEE float16 -Speicherformat
Intel unterstützt IEEE-Hälfte als Speichertyp in Prozessoren seit Ivy Bridge (2013). Der Speichertyp bedeutet, dass Sie einen Vorteil in Bezug auf Speicher, Cache-Kapazität und Bandbreite erzielen können. Die Berechnung erfolgt jedoch nach der Konvertierung in das IEEE-Format mit halber Genauigkeit mit einfacher Genauigkeit.
Intel-Unterstützung für BFloat16
Intel hat die Unterstützung für BF16 in Cooper angekündigt Lake and Sapphire Rapids.
-
https://software.intel.com/content/dam/develop/public/us/en/documents/architecture-instruction-set-extensions-programming-reference.pdf (das Update 319433-040 vom Juni 2020 beschreibt AMX BF16)
Ich arbeite für Intel. Ich zitiere offizielle Quellen und werde keine Kommentare zu Gerüchten usw. abgeben.
Es ist gut, neugierig auf die relativen Vorzüge von IEEE FP16 gegenüber BF16 zu sein. Es gibt viele Analysen zu diesem Thema, z. https://nhigham.com/2018/12/03/half-precision-arithmetic-fp16-versus-bfloat16/ .
Nicht-Intel-Hardware-Unterstützung
Folgendes ist Informationen zu anderen Prozessoren. Bitte erkundigen Sie sich bei Bedarf bei den Anbietern.
http://on-demand.gputechconf.com/gtc/2017/presentation/s7676-piotr-luszcek-half-precision-bencharking-for-hpc.pdf listet die folgende Hardwareunterstützung auf:
- AMD – MI5, MI8, MI25
- ARM – NEON VFP FP16 in V8.2-A
- NVIDIA – Pascal und Volta
NVIDIA Ampere unterstützt auch FP16 ( https://devblogs.nvidia.com/nvidia-ampere-architecture-in-depth/ ).
Kommentare
- Der erste Teil dieser Antwort ist etwas irreführend. Während Ivy Bridge tatsächlich die Unterstützung für F16C eingeführt hat und dies technisch bedeutet, dass Floats mit halber Genauigkeit “ “ unterstützt werden, sind dies die einzigen Anweisungen Es werden solche bereitgestellt, die in und aus Schwimmern mit halber Präzision umgewandelt werden können. Es können keinerlei Operationen an ihnen durchgeführt werden, so dass die Anforderung in der Frage kaum erfüllt wird: “ Ich habe mich gefragt, ob die moderne Architektur die halbe Präzision auf die gleiche Weise unterstützt wie einfache oder doppelte Genauigkeit ist. “ Es handelt sich lediglich um ein Speicherformat. Sie ‚ tauschen ALU-Konvertierungszyklen gegen Speicherbandbreite / Footprint.
- Ich habe buchstäblich gesagt, dass es sich um einen Speichertyp handelt. Alle Einsparungen ergeben sich aus engeren Daten und Rechenleistung mit einfacher Präzision gemacht. Es ist nicht im geringsten irreführend. Ich sagte, welche Unterstützung vorhanden war, was die Hälfte der möglichen Unterstützung ist.
- Vielen Dank an alle. Ich fand jeden dieser Kommentare hilfreich. Der ursprüngliche Grund, die Frage zu stellen, war, anderen zuzuhören, die über genau diese Sache streiten.
- @AsadMehasi: auch im Zusammenhang mit dem Stapelüberlauf: Halbe Präzision Gleitkomma-Arithmetik auf Intel-Chips – ja auf integrierten GPUs seit Skylake, aber in den IA-Kernen nur für die Konvertierung nach / von
float
beim Speichern / Laden. (Bis zur BFloat-Unterstützung in der kommenden HW)
Antwort
Meiner Meinung nach nicht sehr einheitlich. Arithmetik mit geringer Genauigkeit scheint beim maschinellen Lernen etwas an Bedeutung gewonnen zu haben, aber es gibt unterschiedliche Definitionen für das, was Menschen unter geringer Genauigkeit verstehen. Es gibt die IEEE-754-Hälfte (10-Bit-Mantisse, 5-Bit-Exponent, 1-Bit-Vorzeichen), aber auch bfloat16 (7-Bit-Mantisse, 8-Bit-Exponent, 1-Bit-Vorzeichen), das den Dynamikbereich gegenüber der Präzision bevorzugt, und eine Vielzahl anderer Formate (NVidias 19-Bit-TensorFloat, AMDs fp24, vielleicht mehr?). Das meiste davon läuft auf GPGPU-Hardware für spezielle Zwecke.
Im Gegensatz dazu haben Float und Double im Allgemeinen eine vereinbarte Bedeutung als IEEE-754-konforme 32-Bit- (23/8/1) und 64-Bit- (52/11/1) Darstellungen.
Kommentare
- Obwohl optisches Rechnen definitiv nicht dem Standard entspricht, wird die Hälfte effektiv verwendet -präzise (oder weniger) Gleitkommaoperationen.
Antwort
Die akzeptierte Antwort bietet einen Überblick. Ich werde ein paar weitere Details zur Unterstützung in NVIDIA-Prozessoren hinzufügen. Die Unterstützung, die ich hier beschreibe, ist eine 16-Bit-IEEE 754-kompatible Gleitkomma-Arithmetik-Unterstützung, einschließlich Hinzufügen, Multiplizieren, Multiplizieren-Addieren und Konvertieren in / von anderen Formaten
Maxwell (circa 2015)
Die früheste IEEE 754 FP16-Unterstützung („binary16“ oder „halbe Genauigkeit“) wurde in cc (Rechenfähigkeit) 5.3-Geräten der Maxwell-Generation angeboten, diese Rechenfähigkeit wurde jedoch nur in implementiert der Tegra TX1-Prozessor (SoC, z. B. Jetson).
Pascal (circa 2016)
Pascal Familienmitglieder haben entweder „volle Rate“ (cc 6.0, 6.2 ) oder „niedrige Rate“ (cc 6.1) FP16-Durchsatz. cc6.2 war wieder ein Produkt der Tegra-Familie, TX2. cc 6.0 und 6.1 fanden Verwendung in einer Vielzahl von Prozessoren in verschiedenen Produktfamilien wie GeForce, Quadro und Tesla. „volle Rate“ bezieht sich hier auf eine Rate, die der doppelten IEEE 754 FP32-Rate („binary32“ oder „einfache Genauigkeit“) für den betreffenden Prozessor entspricht, wenn Operationen unter Verwendung eines Datentyps half2 (zwei halbe Mengen, die verarbeitet werden) ausgeführt wurden das gleiche Register und die gleiche Anweisung).
Volta, Turing (2017, 2018)
Volta und Turing Familienmitglieder (cc 7.x) unterstützen FP16 bei “ volle Rate „und verwenden Sie zusätzlich das Format in TensorCore -Operationen.
Ampere (Mai 2020)
Die kürzlich angekündigte Ampere-Architektur A100 GPU unterstützt auch FP16 in ähnlicher Weise wie Volta und Turing und bietet zusätzliche Funktionen für einen TF32-Datentyp , bei dem die Mantisse dieselbe Größe (Anzahl der Bits) hat. als FP16-Mantisse und t Der Exponent hat die gleiche Größe wie ein FP32-Exponent. Die Bfloat16 -Funktion wurde auch in Ampere angekündigt.
Abgesehen von dem kürzlich angekündigten Ampere-Architekturprozessor werden Unterstützung und Durchsätze für 16-Bit-Gleitkommaoperationen bereitgestellt (und andere Operationen) für alle Rechenfunktionen (einschließlich Architekturen) finden Sie in Tabelle 3 des CUDA-Programmierhandbuchs . Die Durchsätze sind pro Takt und pro Multiprozessor und müssen daher entsprechend dem GPU-Typ und den Spezifikationen skaliert werden. Diese Durchsätze gelten nicht für TensorCore-Operationen, und die Spitzendurchsätze gelten im Allgemeinen nur für die Verarbeitung mit halben 2 Datentypen (zwei halbe Mengen, die in einem einzigen 32-Bit-Wort zusammengefasst sind).
Antwort
Sie können herausfinden, ob Ihre Hardware die halbe Genauigkeit unterstützt, indem Sie:
$ 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
Die f16c
Anweisung ist hier dokumentiert.
Kommentare
- eachten Sie, dass das C in F16C für Conversion steht. Es hilft nur bei der Speicherbandbreite / dem Cache-Footprint, nicht beim SIMD ALU-Durchsatz. Sie müssen in float konvertieren, um rechnen zu können, damit die Anzahl der Elemente pro SIMD-Vektor für FMA-Operationen nicht ‚ verbessert wird.