Multiplieur-accumulateur
En programmation, Ă l'origine en traitement numĂ©rique du signal, l'opĂ©ration combinĂ©e multiplyâaccumulate (MAC) ou multiply-add (MAD) est une instruction-machine qui calcule le produit de deux nombres et agrĂšge le rĂ©sultat au contenu d'un accumulateur.
Description
Le circuit Ă©lectronique qui rĂ©alise cette opĂ©ration est appelĂ© « multiplieur-accumulateur[1] - [2] » ; l'opĂ©ration elle-mĂȘme est souvent abrĂ©gĂ©e en MAC ou « opĂ©ration MAC. » L'opĂ©ration MAC se dĂ©roule dans l'accumulateur du microprocesseur :
Le circuit, lorsqu'il traite des nombres en virgule flottante, peut gĂ©nĂ©rer deux arrondis consĂ©cutifs (c'est le plus souvent le cas en traitement numĂ©rique du signal), ou un seul : dans ce dernier cas, on trouve la mention fused multiplyâadd (FMA) ou fused multiplyâaccumulate (FMAC).
Les ordinateurs comportent souvent un circuit MAC propre, combinaison d'un multiplieur programmĂ© avec des portes logiques, d'un circuit additionneur et d'un registre oĂč le rĂ©sultat est stockĂ©. Le registre est lu par l'additionneur, de sorte qu'Ă chaque cycle d'horloge, la sortie du multiplieur est ajoutĂ©e au registre. Les circuits multiplieurs utilisent gĂ©nĂ©ralement un grand nombre de portes logiques, mais ils sont beaucoup plus rapides que l'algorithme de multiplication russe typique des premiers ordinateurs. Selon B. Randell, l'Irlandais Percy Ludgate (1883â1922) aurait Ă©tĂ© le premier (1909) Ă rĂ©aliser ce genre de circuit MAC pour sa version de la Machine analytique[3], et le premier Ă exploiter ce circuit pour effectuer une division (en utilisant astucieusement le dĂ©veloppement en sĂ©rie de (1+x)â1). Il est en tous cas certain que les premiers processeurs modernes Ă©quipĂ©s d'unitĂ©s MA Ă©taient des portes logiques pour le traitement numĂ©rique du signal : c'est cette technique qui est la plus courante dans les microprocesseurs gĂ©nĂ©ralistes actuels[4] - [5] - [6] - [7].
En virgule flottante
Lorsqu'elle opĂšre sur des entiers, l'opĂ©ration peut Ă©videmment ĂȘtre exĂ©cutĂ©e exactement (modulo une puissance de deux) ; cependant, avec les nombres en virgule flottante, la prĂ©cision mathĂ©matique est par nature limitĂ©e Ă la taille de la mantisse. En consĂ©quence, les opĂ©rations en virgule flottante sont en gĂ©nĂ©ral non-associatives[8] et non-distributives.
Il importe donc bien de savoir si l'opĂ©ration multiplyâadd comporte deux arrondis successifs ou un seul (c'est-Ă -dire si l'on a affaire Ă un fused multiplyâadd). La norme IEEE 754-2008 spĂ©cifie qu'elle ne devrait comporter qu'un arrondi final, pour une meilleure prĂ©cision du rĂ©sultat[9].
Le multiplieur-accumulateur à arrondi unique (FMA ou fmadd)[10] est une opération en virgule flottante combinée : au lieu de calculer le produit b à c, de l'arrondir à N bits significatifs, d'additionner le résultat à a, et enfin d'arrondir le résultat, elle calcule l'expression entiÚre a + (b à c) en précision maximum avant d'arrondir le résultat final à N bits.
Un circuit FMA rapide peut ainsi améliorer la précision de toutes sortes d'opérations courantes en calcul scientifique :
- produit scalaire : certaines machines permettent mĂȘme de chaĂźner en pipe-line plusieurs instructions multiplieur-accumulateur arrondies en une seule opĂ©ration, par exemple en exĂ©cutant un produit scalaire Ă 4 facteurs distribuĂ©s simultanĂ©ment sur deux registres SIMD de 128 bits :
a0Ăb0 + a1Ăb1 + a2Ăb2 + a3Ăb3
; - multiplication de matrices ;
- évaluation des polynÎmes (notamment par le schéma de Horner) ;
- méthode de Newton pour l'évaluation des fonctions (en évaluant l'inverse de ladite fonction) ;
- produit de convolution et réseau de neurones artificiels ;
- multiplications en arithmétique double-double.
Toutefois, l'informaticien canadien William Kahan a montrĂ© qu'elle Ă©tait source de problĂšmes lorsqu'on l'utilisait inconsidĂ©rĂ©ment[11] : si l'on Ă©value, par exemple, l'expression x2 â y2 en ordonnant les calculs selon ((x Ă x) â y Ă y) (pour reprendre l'exemple de Kahan, qui suppose ici que les parenthĂšses forcent le compilateur Ă arrondir le terme (x Ă x) une fois calculĂ©), le rĂ©sultat sera nĂ©gatif mĂȘme quand x = y, Ă cause de la perte de chiffres significatifs dans la premiĂšre multiplication. Ce genre d'erreur n'est pas anodin si, par exemple, on veut ensuite calculer la racine carrĂ©e de ce rĂ©sultat.
Le cĂąblage du FMA sur un microprocesseur peut mĂȘme donner une opĂ©ration plus rapide que la multiplication suivie d'une addition ; cependant, les standards industriels fondĂ©s sur l'instruction d'origine du RS/6000 d'IBM imposent que l'addition soit exĂ©cutĂ©e impĂ©rativement avec une prĂ©cision de 2N-bits[12].
Un autre avantage de cette instruction est qu'elle permet une programmation efficace de la division euclidienne et de l'algorithme d'extraction de racine carrée, évitant ainsi d'introduire des circuits arithmétiques spécifiques à ces opérations[13].
Portabilité
L'opération FMA est reconnue par la norme IEEE 754-2008. Elle a été introduite en 1990 dans le processeur POWER1 d'IBM, et de plus en plus de processeurs l'implémentent.
L'instruction POLY
des VAX était utilisée pour évaluer les polynÎmes par le schéma de Horner, qui les ramenait à une succession raisonnée d'opérations de ce genre. Le descriptif du constructeur DEC ne précisait pas si l'opération multiplier-accumuler ne comportait qu'une instruction FMA[14] ; toujours est-il que cette instruction a fait partie de la bibliothÚque scientifique des VAX depuis leur version 11/780 de 1977.
Le langage C, depuis la norme ISO C99, supporte explicitement l'opération FMA, via la fonction de bibliothÚque standard fma()
; le compilateur peut remplacer un tel appel par une instruction du processeur lorsque celui-ci supporte le FMA. Alternativement, la rĂšgle de contraction des expressions flottantes (contrĂŽlable par le pragma standard FP_CONTRACTâ
) permet au compilateur de remplacer une multiplication suivie d'une addition par un FMA, mais un tel remplacement est toujours optionnel.
Notes et références
- Marcel Lapointe, Huynh Huu TuĂ© et Paul Fortier, « Nouvelle mĂ©thode de conception de circuits trĂšs rapides des filtres numĂ©riques linĂ©aires invariants », Traitement du Signal, vol. 8, no 4,â , p. 237-257
- « SystÚmes électroniques numériques : ProblÚme sur les MAC », sur Telecom ParisTech, (consulté le )
- (en) B. Randell, « The Feasibility of Ludgate's Analytical Machine », The Computer Journal, vol. 14, no 3,â , p. 317â326 (DOI 10.1093/comjnl/14.3.317, lire en ligne)
- (en) Pavel Lyakhov, Maria Valoueva, Georgii Valouev et NikolaĂŻ Nagornov, « A Method of Increasing Digital Filter Performance Based on Truncated Multiply-Accumulate Units », Applied Sciences, vol. 10, no 24,â , p. 9052 (DOI 10.3390/app10249052)
- Tung Thanh Hoang, M. Sjalander et P. Larsson-Edefors, « Double Throughput Multiply-Accumulate unit for FlexCore processor enhancements », 2009 IEEE International Symposium on Parallel Distributed Processing,â , p. 1â7 (ISBN 978-1-4244-3751-1, DOI 10.1109/IPDPS.2009.5161212, S2CID 14535090)
- (en) Jongsung Kang et Taewhan Kim, « PV-MAC: Multiply-and-accumulate unit structure exploiting precision variability in on-device convolutional neural networks », Integration, vol. 71,â , p. 76â85 (ISSN 0167-9260, DOI 10.1016/j.vlsi.2019.11.003)
- « mad - ps » (consulté le )
- MichĂšle Pichat, Contribution Ă lâĂ©tude des erreurs dâarrondi en arithmĂ©tique Ă virgule flottante.ModĂ©lisation et simulation. Institut National Polytechnique de Grenoble - INPG; UniversitĂ© Joseph-Fourier, Grenoble, (lire en ligne), p. I.
- Nathan Whitehead et Alex Fit-Florea, « Precision & Performance: Floating Point and IEEE 754 Compliance for NVIDIA GPUs », nvidia, (consulté le )
- « AIX Language Reference: fmadd instrs », sur IBM Knowledge Center
- William Kahan, « IEEE Standard 754 for Binary Floating-Point Arithmetic »,
- Eric Quinnell, Floating-Point Fused MultiplyâAdd Architectures, universitĂ© du Texas, (lire en ligne)
- Peter Markstein, « Software Division and Square Root Using Goldschmidt's Algorithms », sur 6th Conference on Real Numbers and Computers, (CiteSeerx 10.1.1.85.9648)
- « VAX instruction of the week: POLY » (version du 13 février 2020 sur Internet Archive)