Premièrement, comme le signalent Keelan et la réponse de Turbo J , la mesure était de 113 093 Dhrystone MIPS non natif .
La microarchitecture Ivy Bridge du i7 3630QM ne peut valider que 4 µops fondus par cycle, bien qu'elle puisse commencer à exécuter 6 µops par cycle. (Le nombre de µops fusionnés dans une trace de code est à peu près égal au nombre d'instructions; certaines instructions complexes sont décodées en plusieurs µops non fusionnés et certaines paires d'instructions peuvent être fusionnées en un seul µop, par exemple, une comparaison immédiate. suivi d'un saut conditionnel.)
Deux de vos spéculations sur la manière dont plusieurs instructions peuvent être exécutées au cours d'un seul cycle sont tout à fait valables et ont été utilisées dans les processeurs actuels. Votre première hypothèse, selon laquelle une horloge interne plus rapide est utilisée, a été utilisée dans les ALU "Fireball" du Pentium 4 d'origine. Ces ALU étaient cadencées à deux fois la fréquence du reste du noyau, qui était déjà relativement élevée.
(Ceci a été réalisé en utilisant une ALU échelonnée dans laquelle la moitié inférieure d'un ajout a été effectuée en un cycle, permettant à une opération dépendante d'utiliser la moitié inférieure du résultat dans le cycle suivant. Pour des opérations comme add, xor ou shift à gauche qui n'a besoin que de la moitié inférieure des opérandes pour produire la moitié inférieure complète du résultat, un tel effet de décalage - également appelé largeur de pipeline - permet une latence de résultat sur un cycle ainsi que le débit d'un cycle.)
HyperSPARC a utilisé une technique quelque peu apparentée, les UAL en cascade. HyperSPARC a introduit les résultats de deux ALU dans une troisième ALU. Cela a permis d'exécuter deux opérations indépendantes et une troisième opération dépendante en un seul cycle.
Votre hypothèse selon laquelle "il existe plusieurs pipelines simultanés par cœur" est l'autre technique utilisée. Ce type de conception est appelé superscalaire et constitue de loin le moyen le plus courant d’augmenter le nombre d’opérations exécutées au cours d’un cycle.
Il existe également quelques autres chances d’exécution des instructions qui méritent d’être signalées. Certaines opérations peuvent être exécutées plus efficacement en dehors des unités d'exécution ordinaires. La technique d'élimination de déplacement exploite l'utilisation du changement de nom de registre dans des processeurs en panne pour effectuer des opérations de déplacement lors du changement de nom de registre; le déplacement copie simplement le numéro de registre physique d'une position dans la table de changement de nom (appelée table d'alias de registre) à une autre. Non seulement cela augmente effectivement la largeur d'exécution, mais cela supprime également une dépendance. Cette technique a été utilisée très tôt avec le x87 basé sur la pile, mais elle est maintenant largement utilisée dans les processeurs x86 hautes performances d'Intel. (L'utilisation d'instructions destructives à deux opérandes dans x86 rend l'élimination des déplacements plus utile que dans un RISC typique.)
Une technique similaire à l'élimination des déplacements est le traitement des instructions de mise à zéro des registres lors du changement de nom. En fournissant un nom de registre qui fournit la valeur zéro, une instruction d'effacement de registre (telle que xor ou soustraction avec les deux opérandes étant le même registre) peut simplement insérer ce nom dans la table de renommage (RAT).
Une autre technique utilisée par certains processeurs x86 réduit le coût des opérations push et pop. Normalement, une instruction utilisant le pointeur de pile devrait attendre un cycle complet pour un push ou un pop précédent pour mettre à jour la valeur du pointeur de pile. En reconnaissant que push et pop ne font qu'ajouter ou soustraire une petite valeur au pointeur de la pile, il est possible de calculer les résultats de plusieurs additions / sous-actions en parallèle. Le délai principal pour l'addition est la propagation de retenue, mais avec des valeurs faibles, les bits les plus significatifs de la valeur de base (dans ce cas, le pointeur de pile) n'auront au plus qu'un report en arrière. Cela permet d'appliquer une optimisation similaire à celle d'un additionneur de retenue de portefeuille à plusieurs additions de petites valeurs. De plus, étant donné que le pointeur de pile est généralement mis à jour uniquement par des constantes,
Il est également possible de fusionner des instructions en une seule opération plus complexe. Alors que le processus inverse consistant à diviser des instructions en plusieurs opérations plus simples est une technique ancienne, la fusion d'instructions (qu'Intel appelle fusion macro-op) peut permettre à la mise en oeuvre de prendre en charge des opérations plus complexes que celles exposées dans le jeu d'instructions.
Sur le plan théorique, d'autres techniques ont été proposées. Les petites constantes autres que zéro peuvent être prises en charge dans la table RAT et certaines opérations simples qui utilisent ou produisent de manière fiable des valeurs aussi petites peuvent être gérées rapidement. ("Physical Register Inlining", Mikko H. Lipasti et al., 2004, a suggéré d'utiliser le RAT comme moyen de réduire le nombre de registres, mais l'idée pourrait être élargie pour prendre en charge le chargement de petites opérations immédiates et simples sur de petits nombres.)
Pour les caches de trace (qui stockent des séquences d'instructions sous des hypothèses particulières de flux de contrôle), il peut être possible de fusionner des opérations séparées par des branches et de supprimer des opérations produisant des résultats inutilisés dans la trace. La mise en cache des optimisations dans un cache de trace peut également encourager la réalisation d’optimisations telles que la fusion d’instructions, ce qui peut ne pas valoir la peine si elles doivent être effectuées à chaque fois que le flux d’instructions est extrait.
La prédiction de valeur peut être utilisée pour augmenter le nombre d'opérations pouvant être exécutées en parallèle en supprimant les dépendances. Un prédicteur de valeur basé sur la foulée est similaire à l'optimisation du pop / push d'un moteur de pile spécialisé mentionné précédemment. Il peut calculer plusieurs ajouts principalement en parallèle, en supprimant la sérialisation. L'idée générale de la prédiction de valeur est qu'avec une valeur prédite, les opérations dépendantes peuvent être exécutées sans délai. (La prédiction de direction et de cible de branche n'est en réalité qu'une forme très limitée de prédiction de valeur, permettant d'extraire les instructions suivantes qui dépendent de la "valeur" de la branche - prise ou non - et de l'adresse d'instruction suivante, une autre valeur.)