Viele Codes verfügen über viele Speicherzugriffe (30% sind eine typische Zahl). Davon sind typischerweise etwa 2/3 Lesezugriffe und 1/3 Schreibzugriffe. Dies liegt nicht daran, dass die Register nicht mehr ausreichen, sondern dass auf Arrays, Objekt-Member-Variablen usw. zugegriffen wird.
Dies muss im Arbeitsspeicher (oder Datencache) erfolgen, da C / C ++ erstellt wird (alles, was Sie für einen Zeiger erhalten können, muss eine Adresse haben, die möglicherweise im Arbeitsspeicher gespeichert werden muss). Wenn der Compiler erraten kann, dass Sie mit verrückten indirekten Zeigertricks nicht willkürlich in Variablen schreiben, werden sie in Registern abgelegt, und dies funktioniert gut für Funktionsvariablen, aber nicht für global zugängliche (im Allgemeinen alles, was aus malloc herauskommt ()) weil es im Grunde unmöglich ist zu erraten, wie sich der globale Zustand ändern wird.
Aus diesem Grund ist es nicht üblich, dass der Compiler mit mehr als 16 allgemeinen Verwendungsregistern überhaupt etwas anfangen kann. Deshalb gibt es in allen gängigen Architekturen ungefähr so viele (ARM hat 16).
MIPS und andere RISCs haben in der Regel 32, weil es nicht sehr schwer ist, so viele Register zu haben - die Kosten sind niedrig genug, so dass es ein bisschen wie ein "Warum nicht?" Ist. Mehr als 32 sind meistens unbrauchbar und haben den Nachteil, dass der Zugriff auf die Registerdatei länger dauert (jede Verdoppelung der Anzahl der Register fügt möglicherweise eine zusätzliche Multiplexerschicht hinzu, die etwas mehr Verzögerung hinzufügt ...). Außerdem werden die Anweisungen im Durchschnitt etwas länger. Wenn Sie also Programme ausführen, die von der Bandbreite des Befehlsspeichers abhängen, verlangsamen Ihre zusätzlichen Register Sie tatsächlich!
Wenn Ihre CPU in Ordnung ist und keine Registerumbenennung durchführt und Sie versuchen, viele Operationen pro Zyklus auszuführen (mehr als 3), benötigen Sie theoretisch mehr Register, wenn die Anzahl der Operationen pro Zyklus steigt. Deshalb hat der Itanium so viele Register! Aber in der Praxis wird der meiste Code, abgesehen von numerischem Gleitkomma oder SIMD-orientiertem Code (in dem Itanium wirklich gut war), viele Speicher-Lese- / Schreibvorgänge und -Sprünge aufweisen, die diesen Traum von mehr als 3 Operationen pro Zyklus unmöglich machen (insbesondere in serverorientierter Software wie Datenbanken, Compilern, Hochsprachenausführung wie Javascript, Emulation usw.). Dies ist, was Itanium versenkte.
Auf den Unterschied zwischen Berechnung und Ausführung kommt es an!