Les premières instructions ne sont pas nécessairement "exécutées séquentiellement", même sur un ISA non-VLIW; l'exécution doit seulement apparaître séquentiellement. Une implémentation superscalaire en ordre peut exécuter plus d'une instruction en parallèle avec une autre. Pour que cela soit efficace, il faut augmenter (élargir) le matériel nécessaire au décodage des instructions, ajouter du matériel pour garantir l'indépendance des données des instructions à exécuter en parallèle, augmenter les ressources d'exécution et augmenter généralement le nombre de ports de fichier de registre. Tous ces ajoutent des transistors.
Une implémentation désordonnée, qui permet d’exécuter des instructions ultérieures avant les précédentes, tant qu’il n’ya pas de dépendance de données, utilise du matériel supplémentaire pour gérer la planification des instructions dès que les données deviennent disponibles et ajoute des registres de renommage et du matériel de mappage, en les allouant et en les libérant (davantage de transistors) pour éviter les dangers d'écriture après lecture et d'écriture après écriture. Une exécution dans le désordre permet au processeur d’éviter le blocage.
La réorganisation des charges et des magasins dans un processeur en panne nécessite de s'assurer que les magasins antérieurs à l'ordre du programme transmettent les résultats aux charges ultérieures de la même adresse. Cela implique une logique de comparaison d'adresses ainsi que le stockage des adresses (et de la taille) des magasins (et du stockage des données) jusqu'à ce que le magasin ait été validé en mémoire (le cache). (Pour un ISA avec un modèle de cohérence de mémoire moins faible, il est également nécessaire de vérifier que les charges sont bien ordonnées par rapport aux magasins d'autres processeurs - plus de transistors.)
Le traitement en pipeline ajoute un contrôle supplémentaire et une surcharge de mémoire tampon et empêche la réutilisation de la logique pour différentes parties du traitement des instructions, mais permet aux différentes parties du traitement d'une instruction de se chevaucher dans le temps pour différentes instructions.
L'exécution en pipeline et superscalaire augmente l'impact des dangers liés au contrôle (c.-à-d. Branches et sauts conditionnels). Le pipelining (ainsi que l'exécution dans le désordre) peut retarder la disponibilité de la cible, même pour des sauts inconditionnels. L'ajout de matériel pour prédire les cibles (et la direction des branches conditionnelles) permet de poursuivre l'extraction des instructions sans attendre la partie d'exécution du fichier. processeur pour mettre à disposition les données nécessaires. Les prédicteurs plus précis ont tendance à nécessiter davantage de transistors.
Pour un processeur en panne, il peut être souhaitable de permettre à une charge de la mémoire de s'exécuter avant que les adresses de tous les magasins précédents aient été calculées. Par conséquent, un matériel informatique est nécessaire pour gérer une telle spéculation, incluant potentiellement un prédicteur.
Les caches peuvent réduire la latence et augmenter la bande passante des accès mémoire, mais ajouter des transistors pour stocker les données et stocker les étiquettes (et comparer les étiquettes à l'adresse demandée). Du matériel supplémentaire est également nécessaire pour mettre en œuvre la stratégie de remplacement. La pré-extraction matérielle ajoutera plus de transistors.
L'implémentation de la fonctionnalité dans le matériel plutôt que dans le logiciel peut augmenter les performances (tout en nécessitant plus de transistors). Par exemple, la gestion TLB, des opérations complexes telles que la multiplication ou des opérations en virgule flottante, des opérations spécialisées telles que le décompte des zéros. (L'ajout d'instructions augmente également la complexité du décodage des instructions et généralement celle de l'exécution - par exemple, pour contrôler les parties du matériel d'exécution qui seront utilisées.)
Les opérations SIMD / vectorielles augmentent la quantité de travail effectué par instruction, mais nécessitent davantage de stockage de données (registres plus larges) et utilisent généralement davantage de ressources d'exécution.
(Le multithreading spéculatif pourrait également permettre à plusieurs processeurs d'exécuter plus rapidement un programme à thread unique. Évidemment, l'ajout de processeurs à une puce augmentera le nombre de transistors.)
Avoir plus de transistors disponibles peut également permettre aux architectes d’ordinateur de fournir à un ISA plus de registres visibles par les logiciels, ce qui réduirait potentiellement la fréquence des accès mémoire, qui ont tendance à être plus lente que les accès aux registres et impliquent un certain degré d’indirection (par exemple, l’ajout d’un décalage à la pile). pointeur) qui augmente la latence.
L'intégration - qui augmente le nombre de transistors sur une puce mais pas dans le système - réduit la latence de communication et augmente la bande passante, permettant évidemment une augmentation des performances. (Il y a aussi une réduction de la consommation d'énergie qui peut se traduire par une performance accrue.)
Même au niveau de l'exécution des instructions, l'ajout de transistors peut augmenter les performances. Par exemple, un additionneur de retenue ajoute deux fois les bits supérieurs en parallèle avec différentes hypothèses de retenue des bits inférieurs, en sélectionnant la somme correcte des bits supérieurs lorsque l'exécution des bits inférieurs est disponible, ce qui nécessite évidemment plus de transistors qu'un simple ondulation porter additionneur, mais réduire le retard dans la production de la somme complète. De même, un multiplicateur avec une seule rangée d’addition de retenue-sauvegarde utilise moins de transistors (mais est plus lent) qu’un multiplicateur d’arbre Dadda (ou Wallace) et ne peut pas être mis en pipeline (il devrait donc être répliqué pour permettre à un autre multiplier de commencer son exécution multiplier était en cours).
Ce qui précède peut être épuisant mais n’est pas exhaustif!