FR 3151681 A1 20250131 FR 2308018 A 20230725 L’invention est relative à un opérateur matériel de multiplication-accumulation hybride configuré pour multiplier un multiplicande (Op0) formaté en nombre à virgule flottante (FP32) par un multiplicande (Op1) formaté en nombre entier (INT32) et ajouter un résultat de la multiplication formaté en nombre entier à un opérande (Op2) formaté en nombre entier (INT32). Figure pour l’abrégé : Fig. 1 Opérateur de multiplication et accumulation optimisé pour les calculs impliqués dans l'IA L’invention est relative aux techniques d'apprentissage profond dans le domaine de l'intelligence artificielle, et plus particulièrement à un opérateur matériel de multiplication et accumulation adapté pour faire certains des calculs impliqués. Arrière-plan Dans les techniques d'apprentissage profond on utilise, pour certaines des couches des réseaux neuronaux profonds, une arithmétique impliquant des entiers à faible nombre de bits (par exemple les entiers de 8 bits, dits INT8) à la place de l'arithmétique à virgule flottante 32 bits (nombres au format FP32 selon la norme IEEE 754), plus coûteuse en ressources matérielles. Les techniques d'apprentissage profond classiques reposent sur une simple transformation de quantification entière entre des nombres à virgule flottante FP32 et des nombres INT8. Un nombre réel X représenté en format FP32 est mis en correspondance avec un nombre INT8 x dans un domaine de quantification donné défini par un point zéro entier z de 32 bits (INT32) et un facteur d'échelle S à virgule flottante FP32. Le nombre X quantifié, noté ~X , s'exprime alors par : Le nombre x au format INT8 est celui qui est stocké et utilisé pour les opérations arithmétiques. Le domaine de quantification correspond à une plage de variation de faible résolution du nombre ~ X autour d'une valeur centrale z située dans une plage de grande dynamique (celle du facteur S , un nombre FP32). Les valeurs de x évoluant dans la plage [-128, 127], la plage de variation de ~ X devient : Cette plage de variation, censée en pratique couvrir une distribution gaussienne des valeurs de X autour du point zéro z , ne couvre pas l'ensemble de la plage de variation du nombre X . Ainsi, pour les valeurs de X en dehors de la plage, ~X est saturé aux bornes de la plage. Il peut y avoir un domaine de quantification par tenseur d'activation (une matrice multidimensionnelle de valeurs d'activation), et un canal du tenseur (l'une de ses dimensions) peut parfois avoir un domaine de quantification différent. Une fois que les nombres FP32 sont quantifiés, ils peuvent être exploités à l'aide d'opérations peu coûteuses en ressources sur les petits nombres entiers x . Malgré les avantages de cette quantification, l'arithmétique FP32 reste utilisée dans les calculs qui modifient la représentation des éléments tensoriels entre les domaines de quantification. L'arithmétique FP32 est plus coûteuse à mettre en œuvre en termes de performances, de consommation et de surface de silicium. Résumé On prévoit de façon générale un opérateur matériel de multiplication-accumulation hybride configuré pour multiplier un multiplicande formaté en nombre à virgule flottante par un multiplicande formaté en nombre entier et ajouter un résultat de la multiplication formaté en nombre entier à un opérande formaté en nombre entier. L'opérateur peut comprendre une première entrée de multiplicande pour le multiplicande à virgule flottante ayant un champ de mantisse et un champ d'exposant ; une deuxième entrée de multiplicande pour le multiplicande entier ; une entrée d'accumulateur pour l'opérande entier ; un multiplieur de nombres entiers configuré pour multiplier le champ de mantisse du multiplicande à virgule flottante par le multiplicande entier et produire un résultat dans un format à virgule fixe correspondant à un exposant égal à zéro du multiplicande à virgule flottante ; un décaleur connecté pour recevoir le résultat du multiplieur et le décaler à gauche ou à droite selon la valeur du champ d'exposant du multiplicande à virgule flottante ; et un additionneur de nombres entiers recevant l'opérande entier et une fenêtre sur le résultat du décaleur, la fenêtre capturant un nombre de bits à gauche de la position de la virgule fixe au moins égal au nombre de bits de l'opérande entier. L'amplitude de décalage à gauche et à droite du décaleur peut être limitée au nombre de bits de l'opérande entier et l'opérateur peut comprendre un circuit de saturation connecté à l'additionneur et au décaleur et configuré pour produire le résultat de l'additionneur lorsqu'aucun bit à gauche de la fenêtre est significatif et que le champ d'exposant code une valeur inférieure au nombre de bits de l'opérande entier, et produire un résultat saturé lorsqu'au moins un bit à gauche de la fenêtre est à une valeur significative ou que le champ d'exposant code une valeur supérieure ou égale au nombre de bits de l'opérande entier. Le circuit de saturation peut être configuré pour arrondir le résultat de l'additionneur en fonction de valeurs significatives des bits situés à droite de la fenêtre. Description sommaire des dessins Des modes de réalisation seront exposés dans la description suivante, faite à titre non limitatif en relation avec les figures jointes parmi lesquelles : La représente un schéma bloc d'un mode de réalisation d'opérateur hybride de multiplication et addition. Description détaillée On propose ci-après un opérateur matériel hybride de multiplication et addition fusionnées (HFMA) d'un nouveau type offrant une conversion efficace de tenseurs entre différents domaines de quantification. La structure de cet opérateur HFMA découle d'une analyse et d'une décomposition particulière des opérations impliquées dans la conversion entre domaines de quantification. La structure résultante multiplie un entier signé (par exemple INT32) par un nombre à virgule flottante (par exemple FP32), et ajoute un opérande entier signé (INT32) au produit pour fournir un résultat entier au même format que l'opérande. Du fait que le résultat est au même format que l'opérande d'addition, la structure peut servir à calculer l'accumulation de produits, de sorte qu'on peut aussi la désigner par opérateur de "multiplication et accumulation hybride" ou HMAC ("Hybrid Multiply-ACcumulate"). Le calcul le plus courant dans les réseaux d'apprentissage profond est le produit scalaire accumulé d'un vecteur d'activation X i par un vecteur de poids W i avec l'ajout d'un biais B j selon la relation suivante (comme on travaille dorénavant exclusivement sur des valeurs quantifiées, on omet le préfixe "~" pour clarifier l'écriture) : Chacun des termes est quantifié dans son propre domaine de quantification, respectivement (z y , S y ), (z x , S x ), (0, S w ) et (0, S x S w ). Le point zéro des poids W i et des biais B j est 0. Le domaine de quantification (0, S x S w ) de B j a le même facteur d'échelle que le domaine de quantification résultant du produit X i W i . Les différents termes s'expriment ainsi : Rappelons que les valeurs S sont des facteurs d'échelle en FP32, les valeurs z sont les points zéro en INT32, et les valeurs x i et y j sont des nombres INT8 qui sont utilisés pour le stockage et les opérations récurrentes. En effectuant des substitutions dans ces relations, on obtient : Le nombre entier représentant le résultat quantifié s'exprime alors par : avec Chaque terme c j est une constante entière INT32 calculable hors ligne en utilisant de l'arithmétique entière simple, comme un opérateur de multiplication-accumulation (MAC) classique opérant sur des entiers INT32. La somme est une constante entière pour l'ensemble des j qui peut être calculée une fois et stockée pour calculer tous les termes c j . Le calcul récurrent de base sur l'indice j , impliquant classiquement des opérations en FP32, devient une opération entière de produit avec addition qui multiplie l'entier en INT32 par un nombre réel en FP32, et ajoute un entier z y en INT32, le résultat étant à nouveau un nombre INT32. C'est exactement ce que calcule l'opérateur HFMA. Les valeurs y j sont alors saturées pour tenir à nouveau dans un entier INT8 et être stockées et réutilisées pour représenter les valeurs quantifiées des Y j . Avec des moyens classiques, l'opération consisterait à convertir en nombres FP32 le multiplicande entier et l'opérande d'addition entier, à effectuer une multiplication et addition fusionnée (FMA) des nombres FP32 résultants, et à convertir le résultat FP32 en entier INT32, soit trois ou quatre opérations au lieu d'une seule, dont une impliquant un opérateur FMA complexe de nombres FP32. Ce gain quant au nombre d'opérations survient, dans l'exemple ci-dessus, une fois toutes les n + 1 itérations sur i . Dans certains cas, n peut être du même ordre que le nombre d'itérations sur j , de sorte qu'on obtient un gain de l'ordre de 3n opérations. L'opérateur HFMA peut également être utilisé pour des opérations ponctuelles telles que la somme de vecteurs quantifiés : Cela correspond à une application imbriquée de l'opérateur HFMA ou HMAC (avec deux additions d'entiers INT32). Ce calcul peut encore être optimisé lorsque le domaine de quantification de l'une des entrées est le même que celui de la sortie, ce qui arrive souvent dans la pratique. Par exemple, si S x = S y et z x = z y alors : Cela correspond à une seule application de l'opérateur HMAC (avec une addition d'entiers INT32). L'opérateur HMAC peut également être utilisé en combinaison avec un opérateur désigné par FSCALE pour quantifier des valeurs FP32 en valeurs INT8 sans impliquer d'arithmétique FP32. Une opération FSCALE met à l'échelle une valeur FP32 par une puissance entière de deux, sous la forme d'une simple addition entière sur le champ d'exposant de 8 bits de la représentation numérique FP32. Par exemple, dans le cas de X i = (x i - z x )S x avec , on a : Ici, l'opération FSCALE produit un résultat en FP32, alors que e est INT8, et m et z sont des INT32. Ainsi, le calcul de x i est à nouveau un calcul HMAC qui produit une valeur INT32 qui sera transformée en une valeur INT8. La représente un schéma bloc d'un mode de réalisation d'opérateur hybride de multiplication et addition (ou accumulation). L'opérateur est configuré pour effectuer l'opération Op0 x Op1 + Op2, où le multiplicande Op0 est un nombre à virgule flottante, par exemple FP32, le multiplicande Op1 est un entier, par exemple INT32, et l'opérande Op2 est un entier de même format (INT32) que l'opérande Op1. Le multiplicande à virgule flottante Op0 inclut un champ d'exposant EXP de 8 bits et un champ de mantisse MANT de 24 bits. Le champ de mantisse MANT de l'opérateur Op0, traité comme un entier, et le multiplicande entier Op1 sont fournis à un multiplieur d'entiers 10. Le multiplieur 10 produit ainsi un produit P codé sur 57 bits. Le produit P est en fait un nombre à virgule fixe dont la position est choisie par convention pour un exposant EXP égal à 0. Dans ce cas, le produit correspond à la multiplication d'un nombre 1,xx... xx à 24 bits après la virgule par un nombre entier XX... XX de 32 bits (devant la virgule), de sorte que la virgule fixe est positionnée entre les bits de rangs 23 et 24 du produit P de 57 bits. Un circuit de décalage à gauche 12 reçoit le produit P sur des positions 31 et 87 d'un nombre virtuel de 119 bits ayant 31 bits à 0 à droite du produit P et 31 bits à 0 à gauche du produit P. La commande de décalage du circuit 12 est l'exposant EXP du multiplicande Op0. Lorsque cet exposant est positif, le circuit 12 opère un décalage correspondant à gauche. Lorsque l'exposant est négatif, le circuit 12 opère un décalage à droite correspondant. La sortie "utile" du décaleur 12 est prise dans une fenêtre couvrant les positions 55 à 87 du nombre décalé, à savoir les 33 bits devant la virgule fixe, formant un nombre entier de 32 bits avec un bit de retenue. Les bits non pris à droite de la fenêtre serviront à opérer un arrondi, tandis que les bits non pris à gauche serviront à opérer une saturation. On remarque que l'amplitude du décalage à gauche ou à droite prise en compte est la taille de l'opérande d'addition entier, ici 32 bits (31 plus la position sans décalage pour l'exposant zéro), correspondant à un exposant signé de 6 bits et non 8 bits. Cette amplitude restreinte correspond aux positions limites où des bits significatifs du produit décalé peuvent se trouver encore dans la fenêtre et constituer un entier exploitable. A gauche, cela correspond à un produit d'un entier égal à 1 par un flottant d'exposant +31. A droite, cela correspond au produit d'un entier dont le bit de poids le plus fort est à 1 par un flottant d'exposant -31. Au-delà d'un exposant de ±31, le résultat est systématiquement saturé ou arrondi à 0. Le contenu de la fenêtre de 33 bits est fourni à un additionneur 14 recevant par ailleurs l'opérande entier Op2 de 32 bits. L'additionneur 14 produit un résultat de 34 bits, le 34e bit étant un bit de retenue. Le résultat de l'additionneur 14 est fourni à un circuit de saturation et d'arrondi 16 qui reçoit par ailleurs les 55 bits à droite et les 31 bits à gauche de la fenêtre du circuit de décalage 12. Le circuit 16 produit un résultat final R1 sous forme d'un entier signé INT32, selon les conditions suivantes. Le résultat R1 est saturé à l'entier positif le plus grand lorsqu'au moins une des conditions suivantes est satisfaite : l'exposant est supérieur à +31 et le multiplicande entier Op1 est non-nul et le signe de la multiplication est positif, au moins un des 31 bits à gauche de la fenêtre est à 1 et le signe de la multiplication est positif, ou l'un des deux bits de poids fort du résultat (bits 32 et 33) de l'addition est à 1. Le résultat R1 est saturé à l'entier négatif le plus petit lorsqu'au moins une des conditions suivantes est satisfaite : l'exposant est inférieur à -31 et le multiplicande entier Op1 est non-nul et le signe de la multiplication est négatif, au moins un des 31 bits à gauche de la fenêtre est à 1 et le signe de la multiplication est négatif, ou l'un des deux bits de poids fort du résultat de l'addition est à 0. Dans la description du circuit de la , on a supposé pour la clarté de l'exposé que les nombres étaient positifs. En pratique, les nombres sont signés de sorte que, pour les nombres négatifs, la valeur significative des bits est 0 au lieu de 1. Le circuit de la est étendu de façon connue pour traiter aussi les nombres négatifs et inverser les bits requis en fonction d'un bit de signe. Par exemple, pour un produit P négatif, les bits à gauche et à droite en entrée du décaleur 12 sont tous à 1 au lieu de 0. Par ailleurs, l'opérateur impliquant un nombre à virgule flottante FP32 comme multiplicande, ce nombre peut être indéfini (NaN) ou infini dans certaines situations. S'il est infini et que le multiplicande entier Op1 est non-nul, le résultat R1 est saturé à l'entier positif le plus grand ou l'entier négatif le plus petit en fonction du signe du résultat. S'il est indéfini ou qu'il est infini et multiplié par un entier nul, le résultat R1 peut être saturé par convention, par exemple à l'entier négatif le plus petit. Finalement le résultat R1 est arrondi en fonction des bits ayant une valeur significative à droite de la fenêtre, par exemple selon la norme IEEE 754 régissant les nombres à virgule flottante. L'opérateur peut par ailleurs lever les drapeaux IEEE 754 de dépassement, de sous-dépassement, d'inexactitude et d'invalidité. Le sous-dépassement ("underflow") est levé lorsque le résultat non-arrondi est différent de zéro et strictement compris entre -1 et 1 (nombres dits sous-normaux). Opérateur matériel de multiplication-accumulation hybride configuré pour multiplier un multiplicande (Op0) formaté en nombre à virgule flottante (FP32) par un multiplicande (Op1) formaté en nombre entier (INT32) et ajouter un résultat de la multiplication formaté en nombre entier à un opérande (Op2) formaté en nombre entier (INT32). Opérateur selon la revendication 1, comprenant : une première entrée de multiplicande (Op0) pour le multiplicande à virgule flottante ayant un champ de mantisse (MANT) et un champ d'exposant (EXP) ; une deuxième entrée de multiplicande (Op1) pour le multiplicande entier ; une entrée d'accumulateur (Op2) pour l'opérande entier ; un multiplieur de nombres entiers (10) configuré pour multiplier le champ de mantisse du multiplicande à virgule flottante par le multiplicande entier et produire un résultat dans un format à virgule fixe correspondant à un exposant égal à zéro du multiplicande à virgule flottante ; un décaleur (12) connecté pour recevoir le résultat du multiplieur et le décaler à gauche ou à droite selon la valeur du champ d'exposant du multiplicande à virgule flottante ; et un additionneur de nombres entiers (14) recevant l'opérande entier (Op2) et une fenêtre sur le résultat du décaleur, la fenêtre capturant un nombre de bits à gauche de la position de la virgule fixe au moins égal au nombre de bits de l'opérande entier. Opérateur selon la revendication 2, dans lequel l'amplitude de décalage à gauche et à droite du décaleur est limitée au nombre de bits de l'opérande entier et l'opérateur comprend un circuit de saturation (16) connecté à l'additionneur et au décaleur et configuré pour : produire le résultat de l'additionneur lorsqu'aucun bit à gauche de la fenêtre est significatif et que le champ d'exposant code une valeur inférieure au nombre de bits de l'opérande entier, et produire un résultat saturé lorsqu'au moins un bit à gauche de la fenêtre est à une valeur significative ou que le champ d'exposant code une valeur supérieure ou égale au nombre de bits de l'opérande entier. Opérateur selon la revendication 3, dans lequel le circuit de saturation (16) est configuré pour arrondir le résultat de l'additionneur en fonction de valeurs significatives des bits situés à droite de la fenêtre.