AccueilđŸ‡«đŸ‡·Chercher

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 :

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

  1. 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
  2. « SystÚmes électroniques numériques : ProblÚme sur les MAC », sur Telecom ParisTech, (consulté le )
  3. (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)
  4. (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)
  5. 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)
  6. (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)
  7. « mad - ps » (consulté le )
  8. 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.
  9. Nathan Whitehead et Alex Fit-Florea, « Precision & Performance: Floating Point and IEEE 754 Compliance for NVIDIA GPUs », nvidia, (consulté le )
  10. « AIX Language Reference: fmadd instrs », sur IBM Knowledge Center
  11. William Kahan, « IEEE Standard 754 for Binary Floating-Point Arithmetic »,
  12. Eric Quinnell, Floating-Point Fused Multiply–Add Architectures, universitĂ© du Texas, (lire en ligne)
  13. 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)
  14. « VAX instruction of the week: POLY » (version du 13 février 2020 sur Internet Archive)

Annexes

Articles connexes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.