Il y a beaucoup de détails sur les ajouteurs d'anticipation de portage tels que Kogge-Stone, Lander-Fischer, etc. dans les cours CS du collège. Ils sont décrits comme «courants dans l'industrie». Cependant, je ne trouve aucune preuve (à part peut-être la chaîne de transport Manchester) de ces derniers temps qu'ils sont réellement utilisés n'importe où spécifiquement. Une recherche Google ne renvoie que des pages de revues et de recherches universitaires. Tout au plus, des implémentations hypothétiques sont données.
Ma question est la suivante: existe-t-il des emplacements / implémentations spécifiques pour lesquels des ajouteurs de recherche d'antenne sont utilisés? Ou sont-ils sans rapport avec le monde réel?
Réponses:
Il s'agit d'une question simple avec une réponse très complexe.
Tout d'abord, quelques informations.
La conception VLSI du monde réel est un domaine extrêmement technique qui présente un équilibre des compromis en constante évolution. Le temps qu'un circuit prend pour calculer une réponse est rarement le seul facteur important. Il y a aussi la consommation d'énergie et la zone physique, ainsi qu'un tas de facteurs qui révèlent que les circuits que vous concevez sont en fait analogiques (par exemple, la résistance du fil, la capacité parasite). Tous ces éléments sont importants dans un circuit réel et peuvent avoir un impact sur la conception choisie.
Deuxièmement, vous devez considérer l'ensemble du cycle de vie d'un projet. Un additionneur qui convient à une réalisation VLSI peut ne pas convenir à une réalisation FPGA. Si la conception va passer par une phase testée sur un FPGA ... vous obtenez l'image.
Troisièmement, tous les additionneurs ne sont pas égaux. Sur un CPU typique, il y a beaucoup d'additionneurs qui effectuent différentes tâches; il y a probablement plusieurs ALU entiers, un additionneur de mantisse à virgule flottante, un additionneur qui effectue le calcul, un additionneur qui calcule les cibles de branche, et ainsi de suite. Cela ne compte pas les additionneurs de sauvegarde que vous trouvez dans les unités de multiplication modernes. Chacun a ses propres particularités et contraintes.
Le calcul de la cible de la branche, par exemple, implique généralement l'ajout d'une petite constante à un mot complet, ce qui suggère une conception d'additionneur différente de celle qui ajoute deux mots complets ensemble. De même, l'ajout de virgule flottante nécessite une étape d'arrondi post-ajout qui peut prendre moins d'un cycle, il n'y a donc aucune raison pour que vous ne puissiez pas voler le reste du cycle pour terminer l'ajout.
Enfin, et peut-être le plus important, les grands acteurs (par exemple Intel, AMD, NVIDIA) sont assez étroits sur les détails de mise en œuvre de bas niveau pour des raisons évidentes, à moins qu'ils ne pensent pouvoir en obtenir un document et / ou un brevet. Même alors, vous ne pouvez souvent pas être sûr de ce qu'ils ont réellement fait sans rétro-ingénierie.
Cela dit, nous savons certaines choses.
La chose clé dont vous devez vous rendre compte est que les méthodes d'anticipation sont des éléments constitutifs, et pas nécessairement des méthodes en elles-mêmes. Une analogie pourrait être de mise ici.
Si vous pensez aux classes d'algorithmes, vous avez probablement appris un tas d'algorithmes de tri tels que le tri rapide, le tri par fusion, le tri par insertion, etc. Dans le monde réel, si le tri est un goulot d'étranglement en matière de performances, tout ingénieur décent les considérerait comme des blocs de construction primitifs à partir desquels un tri "réel" peut être construit.
L'algorithme de tri de la bibliothèque standard GNU C ++, par exemple, utilise un tri rapide, en utilisant le tri par insertion lorsque les intervalles deviennent suffisamment petits. Cependant, si après quelques passages, il semble que le partitionnement de tri rapide ait eu un impact pathologique, il revient au tri en tas. Il s'agit de trois algorithmes de tri différents pour créer un tri de puissance industrielle.
Il en va de même pour les circuits additionneurs. On sait, par exemple, que l'unité entière Pentium 4 a utilisé un additionneur Han-Carlson, qui est un mélange de Kogge-Stone et Brent-Kung. (Han-Carlson est particulièrement intéressant, car il s'agit d'un "point idéal" dans le compromis entre le délai de propagation et la zone de matrice qui est également très économe en énergie.) Il est souvent avantageux d'utiliser un mélange de plusieurs méthodes.
Les ajouts "purs" de lookahead sont toujours la norme dans les circuits synthétisés (par exemple si vous alimentez un opérateur Verilog "+" à Cadence ou Synopsys), en ce qui concerne la conception manuelle, les processeurs modernes haut de gamme avec leur superscalaire out- Les moteurs d'exécution d'ordre semblent s'orienter vers une conception légèrement différente pour leurs unités entières.
Les additionneurs spéculatifs sont des circuits qui ont un retard de propagation extrêmement faible, mais qui ne fonctionnent correctement qu'une partie du temps (95% du temps est typique), et il est possible de dire avec très peu de logique si l'additionneur spéculatif renvoie le résultat correct ou non. L'idée est donc de faire un ajout spéculatif et la moitié d'un ajout de lookahead en parallèle, en un seul cycle. Si l'additionneur spéculatif a renvoyé la bonne réponse, l'instruction est exécutée. Sinon, bloquez le pipeline et effectuez l'autre moitié de l'ajout précis.
Parce que vous savez que le chemin lent prendra deux cycles, les concepteurs pourraient utiliser une méthode plus efficace et plus économe en énergie, même si elle serait trop lente pour une utilisation générale.
la source
Oui, de nombreux ordinateurs utilisent des additionneurs de report d'antenne. J'ai rétroconçu certains vieux microprocesseurs et je peux donner quelques exemples.
L'ALU sur l'Intel 8008 (leur premier processeur 8 bits) comprenait un grand circuit d'anticipation de portage implémenté avec une logique dynamique. Ce circuit occupait à peu près autant de place que l'ALU lui-même. Carry lookahead est indiqué sur la fiche technique du 8008 , figure 3. Je n'ai vu aucun autre processeur des années 1970 avec carry-lookahead pour l'ALU, donc le 8008 est un peu inhabituel à cet égard.
Le 6502 utilise la fonction d'anticipation de port primitive pour l'incrémenteur de compteur de programmes (PC). Il détecte s'il y aura un report de l'octet inférieur du PC et l'utilise pour incrémenter l'octet supérieur. Cela réduit la propagation d'ondulation de potentiellement 16 bits à 8 bits. L'ALU du 6502 utilise le report d'ondulation, bien que la logique de report soit inversée pour les bits alternés, ce qui coupe un onduleur du chemin et le rend légèrement plus rapide.
Le Z-80 possède un incrémenteur / décrémenteur 16 bits utilisé pour les mises à jour PC, les instructions inc / dec et un compteur de boucles. Il utilise une structure de retenue pour que les portées soient calculées pour des groupes de deux bits. En outre, il utilise une certaine anticipation de report pour générer le report à partir des bits 0-7, 7-11 et 12-14. Les autres portées sont calculées avec la portance ondulée ( détails ). L'ALU du Z-80, étonnamment, est de 4 bits, donc chaque opération de 8 bits fait deux passages à travers l'ALU.
Le 8085, d'autre part, utilise le report d'ondulation pour son incrémenteur / décrémenteur 16 bits. Mais comme le 6502, il obtient un peu d'accélération en inversant la logique de report en bits alternés.
L' ARM-1 possède une ALU 32 bits sans port d'anticipation, juste un portage ondulé. Il utilise également l'astuce consistant à inverser le report en bits alternés.
Dans le monde des mini-ordinateurs, de nombreux processeurs ont été construits à partir de la célèbre puce ALU 4 bits 74181, qui avait un lookahead interne. Les exemples incluent le Data General Nova, le Xerox Alto, le VAX-11/780 et le TI-990. (Voir la liste plus longue de Wikipédia .) Certaines de ces portées d'ondulation utilisées entre chaque puce 4 bits et certaines utilisent la puce de recherche 74182 pour la recherche complète.
Pour résumer, différents microprocesseurs utilisent une variété de techniques de transport en fonction de leurs objectifs de performances et des opérations sur le chemin critique. L'ALU peut utiliser une antenne de transport complète (comme le 8008) ou peut même être de demi-taille (comme le Z-80). L'incrémenteur peut être un problème de performances car il est généralement de 16 bits dans un processeur 8 bits, ce qui entraîne deux fois le délai d'ondulation. L'incrémenteur peut avoir un report d'ondulation (8085), un lookahead de report (6502) ou plusieurs étages de lookahead de report (Z-80).
la source