Je suis novice en informatique et je me demandais si la demi-précision est prise en charge par larchitecture moderne de la même manière que la simple ou la double précision. Je pensais que la révision de 2008 de la norme IEEE-754 introduisait à la fois des précisions quadruples et demi.
Commentaires
- Ceci a été marqué MATLAB, mais MATLAB ne ‘ t (encore) supporte 16 bits virgule flottante.
- Voir cette question déchange de pile qui contient des informations détaillées à ce sujet: stackoverflow.com/questions/49995594/…
- Il vaudrait la peine de préciser si vous parlez simplement de processeurs, ou à la fois de processeurs et de GPU.
- Merci pour votre commentaire Max Barraclough. Je ne savais pas que vous pouviez modifier la précision uniquement dans les unités de traitement graphique (GPU); Je pensais que cela devait être fait dans les deux. Votre commentaire est très utile.
Réponse
Prise en charge dIntel pour le format de stockage IEEE float16
Intel prend en charge la moitié de IEEE comme type de stockage dans les processeurs depuis Ivy Bridge (2013). Le type de stockage signifie que vous pouvez obtenir un avantage de mémoire / capacité de cache / bande passante, mais le calcul est effectué avec une seule précision après la conversion vers et depuis le format demi-précision IEEE.
Prise en charge dIntel pour BFloat16
Intel a annoncé la prise en charge de BF16 dans Cooper Lake et Sapphire Rapids.
-
https://software.intel.com/content/dam/develop/public/us/en/documents/architecture-instruction-set-extensions-programming-reference.pdf (la mise à jour 319433-040 de juin 2020 décrit AMX BF16)
Je travaille pour Intel. Je cite des sources officielles et ne commenterai pas les rumeurs, etc.
Il est bon d’être curieux de connaître les mérites relatifs de IEEE FP16 par rapport au BF16. Il y a beaucoup danalyses sur ce sujet, par exemple https://nhigham.com/2018/12/03/half-precision-arithmetic-fp16-versus-bfloat16/ .
Support matériel non Intel
Ce qui suit est des informations sur dautres processeurs. Veuillez vérifier auprès des fournisseurs si nécessaire.
http://on-demand.gputechconf.com/gtc/2017/presentation/s7676-piotr-luszcek-half-precision-bencharking-for-hpc.pdf répertorie le support matériel suivant:
- AMD – MI5, MI8, MI25
- ARM – NEON VFP FP16 en V8.2-A
- NVIDIA – Pascal et Volta
NVIDIA Ampere prend également en charge FP16 ( https://devblogs.nvidia.com/nvidia-ampere-architecture-in-depth/ ).
Commentaires
- La première partie de cette réponse est un peu trompeuse. Bien quIvy Bridge ait effectivement introduit la prise en charge de F16C, ce qui signifie techniquement que les flotteurs demi-précision sont » pris en charge « , les seules instructions fournis sont ceux à convertir vers et depuis les flotteurs demi-précision. Aucune opération ne peut être effectuée sur eux, ce qui ne répond guère à lexigence de la question: » Je me demandais si la demi-précision est prise en charge par larchitecture moderne de la même manière que la précision simple ou double est. » Cest simplement un format de stockage. Vous ‘ échangez les cycles de conversion ALU contre la bande passante / lempreinte mémoire.
- Jai littéralement dit que cétait un type de stockage, toutes les économies proviennent de données plus étroites fait avec une seule précision. Ce n’est pas du tout trompeur. Jai dit quel soutien était présent, soit la moitié du soutien possible.
- Merci à tous. Jai trouvé chacun de ces commentaires utile. La raison initiale de poser la question était découter les autres se disputer à propos de cette chose exacte.
- @AsadMehasi: également lié à Stack Overflow: Demi-précision arithmétique en virgule flottante sur les puces Intel – oui sur les GPU intégrés depuis Skylake, mais dans les cœurs IA uniquement pour la conversion vers / depuis
float
en magasin / chargement. (Jusquau support de BFloat dans le prochain HW)
Réponse
À mon avis, pas très uniformément. Larithmétique de faible précision semble avoir gagné du terrain dans lapprentissage automatique, mais il existe différentes définitions de ce que les gens entendent par faible précision. Il y a la moitié IEEE-754 (mantisse 10 bits, exposant 5 bits, signe 1 bit) mais aussi bfloat16 (mantisse 7 bits, exposant 8 bits, signe 1 bit) qui privilégie la plage dynamique à la précision, et une variété dautres formats (NVidia « s TensorFloat 19 bits, AMD » s fp24, peut-être plus?). La plupart de ces éléments fonctionnent sur du matériel de type GPGPU à usage spécial.
En revanche, float et double ont une signification généralement convenue, en tant que représentations conformes à la norme IEEE-754, 32 bits (23/8/1) et 64 bits (52/11/1).
Commentaires
- Bien que certainement non standard, le calcul optique en utilise effectivement la moitié -précision (ou moins) dopérations en virgule flottante.
Réponse
La réponse acceptée donne un aperçu. Jajouterai quelques détails supplémentaires sur la prise en charge des processeurs NVIDIA. La prise en charge que je décris ici est la prise en charge de larithmétique à virgule flottante 16 bits, conforme à la norme IEEE 754, y compris lajout, la multiplication, la multiplication et les conversions vers / à partir dautres formats .
Maxwell (vers 2015)
Le plus ancien IEEE 754 FP16 (« binary16 » ou « half precision ») est venu dans les périphériques cc (capacité de calcul) 5.3 qui appartenaient à la génération Maxwell, mais cette capacité de calcul nétait implémentée que dans le processeur Tegra TX1 (SoC, par exemple Jetson).
Pascal (vers 2016)
Pascal les membres de la famille bénéficient soit du « plein tarif » (cc 6.0, 6.2 ) ou débit FP16 « faible débit » (cc 6.1). cc6.2 était à nouveau un produit de la famille Tegra, TX2. cc 6.0 et 6.1 ont trouvé une utilisation dans une variété de processeurs dans diverses familles de produits telles que GeForce, Quadro et Tesla. « plein débit » désigne ici un débit équivalent à deux fois le débit IEEE 754 FP32 (« binary32 » ou « single precision ») pour le processeur en question, lorsque les opérations ont été effectuées en utilisant un type de données half2 (deux demi-quantités traitées en le même registre et la même instruction).
Volta, Turing (2017, 2018)
Volta et les membres de la famille Turing (cc 7.x) prennent en charge FP16 à » plein débit « , et en plus utiliser le format dans les opérations TensorCore .
Ampère (mai 2020)
Le GPU Ampere architecture A100 récemment annoncé prend également en charge FP16 dune manière similaire à Volta et Turing, et introduit une capacité supplémentaire pour un type de données TF32 , qui est un format où la mantisse est de la même taille (nombre de bits) comme mantisse FP16, et t Lexposant a la même taille quun exposant FP32. La capacité Bfloat16 a également été annoncée dans Ampère.
Outre le processeur darchitecture Ampere récemment annoncé, la prise en charge et les débits pour les opérations en virgule flottante 16 bits (et dautres opérations) à travers les capacités de calcul (y compris les architectures) peuvent être trouvées dans le tableau 3 du guide de programmation CUDA . Les débits sont par horloge, par multiprocesseur, ils doivent donc être mis à léchelle en fonction du type et des spécifications du GPU. Ces débits ne sont pas destinés aux opérations TensorCore, et les débits de pointe ne sont généralement applicables que lors du traitement sur la moitié de deux types de données (deux demi-quantités regroupées dans un seul mot de 32 bits).
Réponse
Vous pouvez savoir si votre matériel prend en charge la demi-précision 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
Le f16c
linstruction est documentée ici .
Commentaires
- Notez que le C dans F16C signifie Conversion; cela aide uniquement avec la bande passante mémoire / lempreinte du cache, pas le débit SIMD ALU. Vous devez convertir en flottant pour faire des calculs, donc le nombre déléments par vecteur SIMD pour les opérations FMA nest pas ‘ amélioré.