Le format virgule flottante bfloat16 (en anglais brain floating point), est un format de nombre (en) binaire occupant 16 bits en mémoire informatique ; Il représente une large gamme dynamique de valeurs numériques en utilisant un système de virgule flottante. Ce format est une version raccourcie (16 bits) du format à virgule flottante simple précision IEEE 754 32 bits (binary32), dans le but d’accélérer l’apprentissage automatique et l’informatique des capteurs intelligents (en). Il préserve la plage dynamique approximative des nombres à virgule flottante 32 bits en conservant 8 bits d’exposant, mais ne supporte qu’une précision de 8 bits au lieu du significande de 24 bits du format binary32. Plus que les nombres à virgule flottante simple précision 32 bits, les nombres bfloat16 ne conviennent pas aux calculs sur entiers, mais ce n’est pas leur usage prévu. Bfloat16 est utilisé pour réduire les besoins en stockage et augmenter la vitesse de calcul des algorithmes d’apprentissage automatique.
Lee format bfloat16 a été développé par Google Brain, un groupe de recherche sur l'intelligence artificielle chez Google. Il est utilisé dans beaucoup de CPU, de GPU et de processeurs IA, tels que les processeurs Intel Xeon (extensions BF16 d'AVX-512), les GPU Data Center d'Intel, Nervana (en) NNP-L1000 d'Intel, les FPGA Intel,,, AMD Zen, AMD Instinct, Les GPU de Nvidia, les TPU de Google Cloud,,, AWS Inferentia, AWS Trainium, ARMv8.6-A, et les puces Apple M2, A15 et suivantes. Beaucoup de librairies supportent bfloat16, telles que CUDA, oneAPI Math Kernel Library (en) d'Intel, ROCm (en) d'AMD, AMD Optimizing CPU Libraries, PyTorch et TensorFlow,. Sur ces plateformes, bfloat16 peut être utilisé en arithmétique à précision mixte (en), où des nombres bfloat16 peuvent être utilisés et étendus à des types de données plus larges.
bfloat16 suit le format suivant :
Le format bfloat16, étant une version raccourcie du format flottant simple précision IEEE 754 32 bits, permet une conversion rapide de et vers un flottant simple précision 32 bits IEEE 754 ; dans la conversion vers le format bfloat16, les bits d'exposant sont conservés tandis que le champ du significande peut être réduit par troncature (correspondant à l'arrondi vers 0) ou par d'autres mécanismes d'arrondi, en ignorant le cas particulier NaN. La conservation des bits de l'exposant maintient la gamme dynamique des flottants 32 bits de ≈ 10−38 à ≈ 3 × 1038.
Les bits sont disposés de la façon suivante :
| Demi-précision IEEE 754 flottant 16 bits | ||||||||||||||||||||||||||||||||||
| signe | exposant (5 bits) | significande (10 bits) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 10 | 9 | 0 | ||||||||||||||||||||||||||||||
| bfloat16 | ||||||||||||||||||||||||||||||||||
| signe | exposant (8 bits) | significande (7 bits) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 15 | 14 | 7 | 6 | 0 | ||||||||||||||||||||||||||||||
| TensorFloat-32 (en) de Nvidia (19 bits) | ||||||||||||||||||||||||||||||||||
| signe | exposant (8 bits) | significande (10 bits) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||
| 18 | 17 | 10 | 9 | 0 | ||||||||||||||||||||||||||||||
| Format ATI fp24 | ||||||||||||||||||||||||||||||||||
| signe | exposant (7 bits) | significande (16 bits) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||
| 23 | 22 | 16 | 15 | 0 | ||||||||||||||||||||||||||||||
| Format Pixar PXR24 | ||||||||||||||||||||||||||||||||||
| signe | exposant (8 bits) | significande (15 bits) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||
| 23 | 22 | 15 | 14 | 0 | ||||||||||||||||||||||||||||||
| Simple précision IEEE 754 flottant 32 bits | ||||||||||||||||||||||||||||||||||
| signe | exposant (8 bits) | significande (23 bits) | ||||||||||||||||||||||||||||||||
| ┃ |
|
| ||||||||||||||||||||||||||||||||
| 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||
| 31 | 30 | 23 | 22 | 0 | ||||||||||||||||||||||||||||||
L'exposant d'un nombre en virgule flottante bfloat16 est codé en utilisant une représentation binaire décalée, le décalage du zéro étant de 127 ; appelée également exposant biaisé dans la norme IEEE 754.
Par conséquent, de façon à obtenir le vrai exposant comme défini par la représentation binaire décalée, le décalage de 127 doit être soustrait de la valeur du champ d'exposant.
Les valeurs minimale et maximale du champ d'exposant (00H et FFH) sont interprétées spécialement, comme dans les formats de la norme IEEE 754.
| Exposant | Significande = zéro | Significande ≠ zéro | Équation |
|---|---|---|---|
| 00H | zéro, −0 | nombres dénormalisés | (−1)bit de signe×2−126× 0.bits de la mantisse |
| 01H, ..., FEH | valeur normalisée | (−1)bit de signe×2exposant−127× 1.bits de la mantisse | |
| FFH | ±infini | NaN (silencieux, avertisseur) | |
La plus petite valeur positive normalisée est 2−126 ≈ 1,18 × 10−38 et la plus petite valeur positive (dénormalisée) est 2−126−7 = 2−133 ≈ 9,2 × 10−41.
Le cas d’usage le plus courant est la conversion entre IEEE 754 binary32 et bfloat16. La section suivante décrit le processus de conversion et son schéma d’arrondi dans la conversion. On notera qu’il existe d’autres scénarios possibles de conversion de formats vers ou depuis bfloat16. Par exemple entre int16 et bfloat16.