Un grand nombre de codes comporte de nombreux accès à la mémoire (30% est un chiffre typique). En dehors de cela, environ les 2/3 sont des accès en lecture et les 1/3 sont des accès en écriture. Cela n’est pas dû au manque de registres, mais aussi à l’accès aux tableaux, aux variables de membre d’objet, etc.
Cela doit être fait en mémoire (ou en cache de données) en raison de la fabrication du C / C ++ (tout ce que vous pouvez obtenir d’un pointeur doit avoir une adresse qui doit être potentiellement stockée en mémoire). Si le compilateur peut deviner que vous n'écrirez pas les variables à l'aide de superbes astuces de pointeur indirect, il les mettra dans des registres, ce qui convient parfaitement aux variables de fonction, mais pas aux variables globalement accessibles (généralement, tout ce qui sort de malloc). ()), car il est essentiellement impossible de deviner comment l’état global changera.
Pour cette raison, il n'est pas courant que le compilateur puisse faire quoi que ce soit avec plus de 16 registres d'utilisation générale de toute façon. C'est pourquoi tous les architectes populaires en ont à peu près autant (ARM en a 16).
Les MIPS et les autres RISC ont tendance à en avoir 32 car il n’est pas très difficile d’avoir autant de registres: le coût est suffisamment bas, c’est un peu un "pourquoi pas?". Plus de 32 sont pour la plupart inutiles et présentent l'inconvénient d'allonger l'accès au fichier de registre (chaque doublement du nombre de registres ajoute potentiellement une couche supplémentaire de multiplexeurs, ce qui ajoute un peu plus de retard ...). Cela rend également les instructions légèrement plus longues en moyenne - ce qui signifie que lorsque vous exécutez le type de programme qui dépend de la largeur de bande de la mémoire d'instructions, vos registres supplémentaires vous ralentissent!
Si votre unité centrale de traitement est en ordre et ne renomme pas les registres et que vous essayez d'effectuer beaucoup d'opérations par cycle (plus de 3), alors en théorie, vous avez besoin de davantage de registres à mesure que votre nombre d'opérations par cycle augmente. C'est pourquoi l'Itanium a tant de registres! Mais en pratique, mis à part le code orienté numériquement à virgule flottante ou orienté SIMD (pour lequel Itanium était vraiment bon), la plupart des codes auront beaucoup de lectures / écritures en mémoire et de sauts rendant impossible ce rêve de plus de trois opérations par cycle. (en particulier dans les logiciels orientés serveur comme les bases de données, les compilateurs, les exécutions de langages de haut niveau comme le javascript, les émulations, etc.). C'est ce qui a coulé l'Itanium.
Tout se résume à la différence entre le calcul et l'exécution!