FR 3097992 A1 20210101 FR 1906885 A 20190625 Description Titre de l'invention : Opérateur d'addition et multiplication fu- sionnées pour nombres à virgule flottante de précision mixte réalisant un arrondi correct Domaine 100011 L'invention est relative à des opérateurs matériels de traitement de nombres à virgule flottante d'un coeur de processeur, et plus particulièrement à un opérateur de calcul d'un produit scalaire sur la base d'un opérateur de multiplication et addition fusionnées, plus couramment désigné par FMA (du terme anglais « Fused MultiplyAdd »). Arrière-plan 100021 Les technologies d'intelligence artificielle, notamment l'apprentissage profond, sont particulièrement consommatrices de multiplications de grandes matrices, pouvant avoir plusieurs centaines de lignes et de colonnes. On assiste ainsi à l'émergence d'accélérateurs matériels spécialisés dans les multiplications de matrices en précision mixte. 100031 La multiplication de grandes matrices est généralement effectuée par blocs, c'est-à-dire en passant par une décomposition des matrices en sous-matrices de taille adaptée aux ressources de calcul. Les accélérateurs sont ainsi conçus pour calculer efficacement les produits de ces sous-matrices. De tels accélérateurs comportent notamment un opérateur capable, en un cycle d'instruction, de calculer le produit scalaire des vecteurs représentant une rangée et une colonne de sous-matrice et d'ajouter le résultat partiel correspondant à des résultats partiels accumulés lors de cycles précédents. Au bout d'un certain nombre de cycles, l'accumulation des résultats partiels constitue le produit scalaire des vecteurs représentant une rangée et une colonne d'une matrice complète. [0004] De tels opérateurs font usage des techniques de multiplication et addition fusionnées ou FMA. [0005] La figure 1 illustre schématiquement un opérateur FMA classique. L'opérateur prend généralement trois opérandes binaires à virgule flottante, à savoir deux opérandes de multiplication, ou multiplicandes a et b, et un opérande d'addition c. Il calcule le terme ab+c pour produire un résultat s dans un registre désigné par ACC. Le registre est ainsi désigné, car il est généralement utilisé pour accumuler plusieurs produits en plusieurs cycles, en réutilisant, comme cela est illustré par une ligne en pointillés, la sortie du registre comme opérande d'addition c au cycle suivant. [0006] Dans l'article ["Modified Fused Multiply and Add for Exact Low Precision Product 2 Accumulation", Nicolas Brunie, IEEE 24(11 Symposiumon Computer Arithmetic (ARITH), July 2017], les multiplicandes a et b sont dans un format à virgule flottante de demi-précision, aussi appelé « binary16 » ou « fp16 », selon la norme IEEE-754. Un nombre dans le format « fpl 6 » possède un bit de signe, un exposant de 5 bits, et une mantisse de 10+1 bits (dont un bit implicite codé dans l'exposant). [0007] Le registre ACC est conçu pour contenir toute la dynamique du produit ah dans un format à virgule fixe. Pour des multiplicandes au format « fpl 6 », il suffit pour cela d'un registre de 80 bits (plus éventuellement quelques bits de débordement), la virgule fixe étant située au rang 49 du registre. L'opérande d'addition e est au même format que le contenu du registre ACC. [0008] Cette structure permet d'obtenir un résultat exact pour chaque opération ab+c, et de garder un résultat d'accumulation exact cycle après cycle, tant que le registre ne déborde pas, évitant ainsi les erreurs d'arrondi et la perte de précision liée à l'addition de nombres de signe contraire mais proches en valeur absolue. [0009] L'article susmentionné propose en outre, dans une configuration de FMA à précision mixte, de convertir le contenu du registre en un format de précision supérieure, par exemple « binary32 », à la fin d'une phase d'accumulation. Toutefois, le nombre ainsi converti ne couvre pas toute la dynamique du format « binary32, » puisque l'exposant du produit ah n'est défini que sur 6 bits au lieu de 8. [0010] La figure 2 illustre schématiquement une application de la structure FMA à un opérateur de produit scalaire avec accumulation, tel que cela est déciit, par exemple, dans la demande de brevet US 2018/0321938. Quatre paires de multiplicandes (al, bl), (a2, b2), (a3, b3) et (a4, b4) sont fournies à des multiplieurs respectifs. Les quatre produits résultants pl à p4, appelés produits partiels, et un opérande d'addition c sont additionnés simultanément par un arbre d'addition. Les multiplicandes et l'opérateur d'addition sont tous dans le même format à virgule flottante. Le résultat de l'addition est normalisé et arrondi pour être converti dans le format à virgule flottante de départ, de sorte à être réutilisable comme opérande c. [0011] Pour effectuer la somme des produits partiels et de l'opérande d'addition, les exposants de ces termes sont comparés pour aligner entre elles les mantisses des termes. On ne garde pour l'addition et l'arrondi qu'une fenêtre de bits significatifs correspondant à l'exposant le plus élevé, fenêtre qui correspond à la taille de l'additionneur. En conséquence, les mantisses des termes d'exposants inférieurs sont tronquées, ou totalement éliminées, ce qui produit des en-eurs importantes lorsque deux produits partiels d'exposants grands s'annulent mutuellement. [0012] La demande de brevet susmentionnée ne mentionne pas de taille d'additionneur par- ticulière. Dans le même contexte d'addition de produits partiels, la thèse de 2014 de Nicolas Brunie intitulée « Contributions to computer alithmetic and applications to 3 embedded systems », propose une taille d'additionneur égale à deux fois la taille des mantisses des produits partiels plus une marge de dépassement de deux bits, à savoir 98 bits pour des multiplicandes au format binary32. Encore dans le même contexte, le brevet US8615542, pour additionner quatre produits partiels, propose une taille d'additionneur égale seulement à la taille des mantisses des multiplicandes, à savoir 24 bits pour des multiplicandes au format binary32. Résumé [0013] On prévoit de façon générale un opérateur matériel de multiplication et addition fu- sionnées, comprenant un multiplieur recevant deux multiplicandes sous forme de nombres à virgule flottante codés dans un premier format dc précision ; un circuit d'alignement associé au multiplieur, configure pour, sur la base des exposants des multiplicandes, convertir le résultat de la multiplication en un premier nombre à virgule fixe ayant un nombre de bits suffisant pour couvrir toute la dynamique de la multiplication ; et un additionneur configure pour additionner le premier nombre à virgule fixe et un opérande d'addition. L'opérande d'addition est un nombre à virgule flottante codé dans un deuxième format de précision ayant une précision supérieure au premier format de précision, et l'opérateur comprend un circuit d'alignement associé à l'opérande d'addition, configure pour, sur la base de l'exposant de l'opérande d'addition, convertir l'opérande d'addition en un deuxième nombre à virgule fixe de dynamique réduite par rapport à la dynamique de l'opérande d'addition, ayant un nombre de bits égal au nombre de bits du premier nombre à virgule fixe, augmenté de part et d'autre d'au moins la taille de la mantisse de l'opérande d'addition ; et l'additionneur est configure pour additionner sans perte les premier et deuxième nombres à virgule fixe. [0014] L'opérateur peut comprendre un circuit d'arrondi et de normalisation configure pour convertir le résultat de l'additionneur en un nombre à virgule flottante dans le deuxième format de précision, en prenant la mantisse sur les bits les plus significatifs du résultat de l'additionneur, calculant l'arrondi à partir des bits restants du résultat de l'additionneur, et déterminant l'exposant à partir de la position du bit le plus significatif dans le résultat de l'additionneur. [0015] Le deuxième nombre à virgule fixe peut être étendu à droite par un nombre de bits au moins égal à la taille de la mantisse de l'opérande d'addition ; et le circuit d'arrondi peut utiliser les bits de l'extension du deuxième nombre à virgule fixe pour calculer l'arrondi. [0016] L'opérateur peut être configuré pour fournir comme résultat l'opérande d'addition lorsque l'exposant de l'opérande d'addition excède la capacité du deuxième nombre à virgule fixe. [0017] Un procédé associé de multiplication et addition fusionnées de nombres binaires, comprend des étapes consistant à multiplier les mantisses de deux multiplicandes à virgule flottante codés dans un premier format de précision ; convertir le résultat de la multiplication en un premier nombre à virgule fixe ayant un nombre de bits suffisant pour couvrir toute la dynamique du résultat de la multiplication ; et additionner le premier nombre à virgule fixe et un opérande d'addition. L'opérande d'addition est un nombre à virgule flottante codé dans un deuxième format de précision ayant une précision supérieure au premier format de précision, et le procédé comprend alors des étapes consistant à convertir l'opérande d'addition en un deuxième nombre à virgule fixe de dynamique réduite par rapport à la dynamique de l'opérande d'addition, ayant un nombre dc bits égal au nombre de bits du premier nombre à virgule fixe, augmenté de part et d'autre d'au moins la taille de la mantisse de l'opérande d'addition ; et additionner sans perte les premier et deuxième nombres à virgule fixe. [0018] Selon un autre angle, on prévoit de façon générale un opérateur matériel de calcul de produit scalaire, comprenant plusieurs multiplieurs recevant chacun deux multiplicandes sous forme de nombres à virgule flottante codés dans un premier format de précision ; un circuit d'alignement associé à chaque multiplieur, configuré pour, sur la base des exposants des multiplicandes correspondants, convertir le résultat de la multiplication en un nombre à virgule fixe respectif ayant un nombre de bits suffisant pour couvrir toute la dynamique de la multiplication ; et un rnulti-additionneur configuré pour additionner sans perte les nombres à virgule fixe provenant des multiplieurs, fournissant une somme sous forme de nombre à virgule fixe. [0019] L'opérateur peut comprendre en outre une entrée pour un opérande d'addition à virgule flottante codé dans un deuxième format de précision ayant une précision supérieure au premier format de précision ; un circuit d'alignement associé à l'opérande d'addition, configuré pour, sur la base de l'exposant de l'opérande d'addition, convertir l'opérande d'addition en un nombre à virgule fixe de dynamique réduite par rapport à la dynamique de l'opérande d'addition, ayant un nombre de bits égal au nombre de bits de la somme à virgule fixe, augmenté de part et d'autre d'au moins la taille de la mantisse de l'opérande d'addition ; et un additionneur configuré pour additionner sans perte la somme à virgule fixe et le nombre à virgule fixe de dynamique réduite. [0020] L'opérateur peut comprendre en outre un circuit d'arrondi et de normalisation configuré pour convertir le résultat de l'additionneur en un nombre à virgule flottante codé dans le deuxième format de précision, en prenant la mantisse sur les bits les plus significatifs du résultat de l'additionneur, calculant l'arrondi à partir des bits restants du résultat de l'additionneur, et déterminant l'exposant à partir de la position du bit le plus significatif dans le résultat de l'additionneur. [0021] Le nombre à virgule fixe de dynamique réduite peut être étendu à droite par un nombre de bits au moins égal à la taille de la mantisse de l'opérande d'addition ; et le circuit d'arrondi peut utiliser les bits de l'extension du nombre à virgule fixe de dynamique réduite pour calculer l'arrondi. [0022] L'opérateur peut être configure pour fournir comme résultat l'opérande d'addition lorsque l'exposant de l'opérande d'addition excède la capacité du nombre à virgule fixe de dynamique réduite. [0023] Un procédé associé de calcul d'un produit scalaire de nombres binaires, comprend des étapes consistant à calculer plusieurs multiplications en parallèle, chacune à partir de deux multiplicandes sous forme de nombres à virgule flottante codés dans un premier format de précision ; sur la base des exposants des multiplicandes de chaque multiplication, convertir le résultat de la multiplication correspondante en un nombre à virgule fixe respectif ayant un nombre de bits suffisant pour couvrir toute la dynamique de la multiplication ; et additionner sans perte les nombres à virgule fixe résultant des multiplications pour produire une somme sous forme de nombre à virgule fixe. [0024] Le procédé peut comprendre en outre des étapes consistant à recevoir un opérande d'addition à virgule flottante codé dans un deuxième format de précision ayant une précision supérieure au premier format de précision ; sur la base de l'exposant de l'opérande d'addition, convertir l'opérande d'addition en un nombre à virgule fixe de dynamique réduite par rapport à la dynamique de l'opérande d'addition, ayant un nombre de bits égal au nombre de bits de la somme à virgule fixe, augmenté de part et d'autre d'au moins la taille de la mantisse de l'opérande d'addition ; et additionner sans perte la somme à virgule fixe et le nombre à virgule fixe de dynamique réduite. Description sommaire des dessins [0025] Des modes de réalisation seront exposés dans la description suivante, faite à titre non limitatif en relation avec les figures jointes parmi lesquelles : [0026] [fig.1] précédemment décrite, est un schéma de principe d'un opérateur classique d'addition et multiplication fusionnées, dit FMA ; [0027] [fig.2] précédemment décrite, est un schéma de principe d'un opérateur classique de produit scalaire avec accumulation ; [0028] [fig.3] illustre des nombres dans un format à virgule fixe utilisés dans un opérateur FMA de précision mixte binary16/binary32 ; [0029] [fig.4A] illustre une technique de compression sans perte de la dynamique de la re- présentation en virgule fixe du format binary32 ; [0030] [fig.4B] illustre une technique de compression sans perte de la dynamique de la re- présentation en virgule fixe du format binary32 ; [0031] [fig.5] est un schéma de principe d'un mode de réalisation d'opérateur FMA à précision mixte utilisant la technique des figures 4A et 4B pour réaliser un arrondi 6 correct ; et [0032] [fig.6] est un schéma de principe d'un mode de réalisation d'opérateur de produit scalaire et accumulation de précision mixte utilisant la technique des figures 4A et 4B pour réaliser un arrondi correct. Description détaillée [0033] Pour améliorer la précision de calcul lors de multiples phases d'accumulation de produits partiels, on souhaite mettre en oeuvre un FMA de précision mixte, c'est-à-dire ayant un opérande d'addition de précision supérieure à la précision des multiplicandes. En effet, au cours d'accumulations répétées, l'opérande d'addition a tendance à augmenter sans cesse alors que les produits partiels restent bornés. [0034] L'article IEEE susmentionné de Nicolas Brunie propose une solution offrant des calculs exacts, adaptée à des multiplicandes de format hinary16, dont le produit peut être représenté dans un format à virgule fixe à l'aide de 80 bits, format qui reste acceptable pour un traitement matériel au sein des unités de traitement d'un coeur de processeur. [0035] Cependant, le produit de deux nombres hinary16 produit un nombre à virgule flottante non standardisé, ayant un hit de signe, 6 bits d'exposant et 21+1 bits de mantisse, codé sur 28 bits. Un tel format ne peut être utilisé que de manière interne. On souhaite alors que l'opérande d'addition soit dans un format standardisé de précision supérieure. Par exemple, l'opérande d'addition peut être de précision immédiatement supérieure, à savoir hinary32, ayant un bit de signe, 8 hits d'exposant, et 23+1 bits de mantisse. Le format hinary32 nécessiterait ainsi 277 bits pour un codage en virgule fixe, taille trop importante pour un traitement matériel au sein d'un coeur de processeur de complexité réduite que Von souhaite dupliquer des dizaines de fois dans une puce de circuit intégré. [0036] La figure 3 illustre dans sa partie haute le format à virgule fixe utilisable pour un produit de multiplicandes de format hinary16. Le format est matérialisé par un registre de 80 bits REG80 dont les bits sont numérotés par les exposants correspondants du produit. L'exposant 0, correspondant à la virgule fixe, est situé au 49e bit. Le premier bit correspond à l'exposant -48, tandis que le dernier bit correspond à l'exposant 31. [0037] La mantisse p(22) du produit, de 22 bits, est positionnée dans le registre de manière que son bit le plus significatif soit à l'emplacement défini par la somme des exposants des deux multiplicandes, plus 1. [0038] La figure 3 illustre dans sa partie basse le format à virgule fixe utilisable pour un opérande de format binary32. Le format est matérialisé par un registre de 277 bits REG277. La taille requise est donnée par la relation exposant_max - exposant_min + 1 + (taille_mantisse - 1). 7 [0039] L'exposant 0, correspondant à la virgule fixe, est situé au 150, bit. Le premier bit correspond à l'exposant -149, tandis que le dernier bit correspond à l'exposant 127. [0040] La mantisse c(24) de l'opérande, de 24 bits, est positionnée dans le registre de manière que son bit le plus significatif soit à l'emplacement défini par l'exposant de l'opérande. [0041] Pour faire une addition exacte de l'opérande c et du produit p, il faudrait a priori utiliser un additionneur de la taille du plus grand nombre, à savoir 277 bits. Toutefois, comme on souhaite produire un résultat dans un format à virgule flottante standard, ce résultat exact sera forcément arrondi. Dans ce cas, on cherche à assurer que le résultat soit arrondi de manière correcte, c'est-à-dire que le calcul d'arrondi tienne compte de tous les bits du résultat exact. [0042] Pour produire une mantisse correctement arrondie à partir d'un résultat exact ayant plus de bits que la mantisse, on utilise trois bits suivant immédiatement la mantisse dans le résultat exact, appelés bit de garde G, bit d'arrondi R (« round »), et bit collant S (« sticky »). Ces trois bits déterminent s'il faut ou non incrémenter la mantisse selon un mode d'arrondi choisi. Pour assurer la meilleure précision après une séquence de sommes signées, on préfère le mode « au plus proche ». [0043] TI faut cependant noter que la valeur du bit collant S n'est pas strictement la valeur du bit après le bit d'arrondi R - il s'agit d'un bit qui est mis à 1 si l'un quelconque des bits à droite du bit d'arrondi est à I. Ainsi, pour calculer un arrondi correct en toutes circonstances, on a besoin de tous les bits du résultat exact. [0044] Pour toutefois ramener la taille de l'additionneur à une valeur raisonnable, on utilise la propriété selon laquelle, pour additionner un nombre en virgule fixe de 80 bits et un nombre en virgule fixe de 277 bits, une grande plage du nombre de 277 bits est inutile pour calculer un arrondi correct lors de la conversion du résultat de l'addition en un nombre à virgule flottante. En effet, on peut distinguer deux cas illustrés par les figures 4A et 4B. [0045] La figure 4A illustre un cas nominal où l'opérande c et le produit p peuvent avoir une influence mutuelle qui affecte le résultat de l'addition, soit directement, soit par effet d'arrondi. L'exposant de l'opérande c est compris strictement entre -74 et 57. (Ci-après, le terme « position » est défini par rapport au format à virgule fixe, à savoir qu'une position correspond à un exposant.) [0046] Pour le cas limite de l'exposant 56, la mantisse c(24) est positionnée dans le segment [56:33] du format à virgule fixe et il y a un bit de garde G à la position 32, entre le bit de poids le plus faible de la mantisse c(24) et le bit de poids le plus fort du registre REG80. [0047] Lorsque le registre REG80 contient un nombre positif, le bit de garde G est à 0. L'addition se résume à concaténer le segment [56:32], incluant la mantisse c(24) et le 8 bit de garde, et le registre REG80. Comme on souhaite convertir le résultat de l'addition en un nombre binary32, la mantisse résultante est la mantisse c(24) éventuellement ajustée par arrondi. Pour un arrondi « au plus proche». le bit de garde G à 0 indique qu'il n'y a pas d'ajustement à faire, auquel cas la mantisse c(24) est utilisée directement dans le résultat converti. [0048] Lorsque le contenu du registre REG80 est négatif, le bit de garde G reçoit un bit de signe à 1, auquel cas la mantisse c(24) peut nécessiter un ajustement lors de l'arrondi. [0049] Pour le cas limite de l'exposant -73, la mantisse c(24) est positionnée dans le segment [-73:-96] et il y a 24 bits de garde à [-49:-72] entre le bit de poids le plus faible du registre REG80 et le bit de poids le plus fort de la mantisse c(24). [0050] Dans cette situation, si l'opérande c est positif, l'addition se résume à concaténer le registre REGS° et le segment [-49:-96], incluant les 24 bits de garde à 0 et la mantisse c(24). Comme on souhaite convertir le résultat de l'addition en un nombre binary32, la mantisse résultante est normalement prise dans le registre REG80. Cependant, lorsque le produit est à la plus petite valeur absolue de sa dynamique, à savoir 2", la mantisse du résultat est à prendre sur le dernier bit du registre REG80 et les 23 bits suivants, en fait le segment [-48:-71], laissant encore un bit de garde G à0 à la position -72, juste devant la mantisse c(24). [0051] Pour un arrondi « au plus proche », le bit de garde G à 0 indique qu'il n'y a pas d'ajustement à faire, auquel cas on utilise directement la mantisse prise dans le registre REG80 étendu par le segment [-49:-71] dans le résultat converti. [0052] Si l'opérande c est négatif, le bit de garde G à la position -72 reçoit un bit de signe à 1, auquel cas, la mantisse prise peut nécessiter un ajustement lors de l'arrondi. [0053] La figure 4B illustre une situation où l'opérande c a un exposant e en dehors du domaine de la figure 4A, à savoir e > 57 ou e 57) que le produit p n'a pas d'influence et l'opérande c peut être fourni directement comme résultat final, sans effectuer d'addition ; soit l'opérande c est si petit (e 57, le bit collant S tient compte du contenu du registre REG80. [0057] Lorsque c REVENDICATIONSOpérateur matériel de multiplication et addition fusionnées, comprenant : - un multiplieur (10) recevant deux multiplicandes (a, 1)) sous forme de nombres à virgule flottante codés dans un premier format de précision (fp16) ; - un circuit d'alignement (12) associé au multiplieur, configuré pour, sur la base des exposants des multiplicandes, convertir le résultat de la multiplication en un premier nombre à virgule fixe ayant un nombre de bits suffisant (80) pour couvrir toute la dynamique de la multiplication ; et - un additionneur (22) configuré pour additionner le premier nombre à virgule fixe et un opérande d'addition (c) ; caractérisé en ce que l'opérande d'addition est un nombre à virgule flottante codé dans un deuxième format de précision (fp32) ayant une précision supérieure au premier format de précision, et en ce que : l'opérateur comprend un circuit d'alignement (18) associé à l'opérande d'addition (c), configuré pour, sur la base de l'exposant de l'opérande d'addition, convertir l'opérande d'addition en un deuxième nombre à virgule fixe de dynamique réduite par rapport à la dynamique de l'opérande d'addition, ayant un nombre de bits (153) égal au nombre de bits du premier nombre à virgule fixe, augmenté de part et d'autre d'au moins la taille (24) de la mantisse de l'opérande d'addition ; et l'additionneur (22) est configuré pour additionner sans pelle les premier et deuxième nombres à virgule fixe. Opérateur selon la revendication 1, comprenant un circuit d'arrondi et de normalisation configuré pour convertir le résultat de l'additionneur en un nombre à virgule flottante dans le deuxième format de précision (fp32), en prenant la mantisse sur les bits les plus significatifs du résultat de l'additionneur, calculmit l'arrondi à partir des bits restants du résultat de l'additionneur, et déterminant l'exposant à partir de la position du bit le plus significatif dans le résultat de l'additionneur. Opérateur selon la revendication 2, dans lequel : - le deuxième nombre à virgule fixe est étendu à droite par un nombre de bits au moins égal à la taille de la mantisse de l'opérande d'addition ; et - le circuit d'arrondi utilise les bits de l'extension du deuxième nombre à virgule fixe pour calculer l'arrondi. 15 [Revendication 4] [Revendication 5] Opérateur selon la revendication 2, configure pour fournir comme résultat l'opérande d'addition lorsque l'exposant de l'opérande d'addition excède la capacité du deuxième nombre à virgule fixe. Procédé de multiplication et addition fusionnées de nombres binaires, comprenant les étapes suivantes : - multiplier (10) les mantisses de deux multiplicandes à virgule flottante codés dans un premier format de précision (fp16) ; - convertir (12) le résultat de la multiplication en un premier nombre à virgule fixe ayant un nombre de bits suffisant (80) pour couvrir toute la dynamique du résultat de la multiplication ; et - additionner (22) le premier nombre à virgule fixe et un opérande d'addition (c) ; caractérisé en ce que l'opérande d'addition est un nombre à virgule flottante codé dans un deuxième format de précision (fp32) ayant une précision supérieure au premier format de précision, et en ce qu'il comprend les étapes suivantes : - convertir (18) l'opérande d'addition en un deuxième nombre à virgule fixe de dynamique réduite par rapport à la dynamique de l'opérande d'addition, ayant un nombre de bits (153) égal au nombre de bits du premier nombre à virgule fixe, augmenté de part et d'autre d'au moins la taille (24) de la mantisse de l'opérande d'addition ; et - additionner sans perte les premier et deuxième nombres à virgule fixe.