Dużo kodu ma wiele dostępów do pamięci (30% to typowa liczba). Poza tym zwykle około 2/3 dostępu to odczyt, a 1/3 dostępu to dostęp do zapisu. Nie dzieje się tak z powodu wyczerpania rejestrów, ale dostępu do tablic, dostępu do zmiennych elementów obiektu itp.
Trzeba to zrobić w pamięci (lub w pamięci podręcznej danych) ze względu na sposób tworzenia C / C ++ (wszystko, co można uzyskać, musi mieć adres, który musi być potencjalnie przechowywany w pamięci). Jeśli kompilator zgadnie, że nie będziesz chciał pisać do zmiennych za pomocą szalonych sztuczek pośrednich, umieści je w rejestrach, i działa to świetnie w przypadku zmiennych funkcyjnych, ale nie w przypadku globalnie dostępnych (ogólnie wszystko, co pochodzi z malloc ()), ponieważ nie można zgadnąć, jak zmieni się stan globalny.
Z tego powodu nie jest powszechne, że kompilator będzie w stanie zrobić wszystko z ponad 16 rejestrami ogólnego zastosowania. Dlatego wszyscy popularni architekci mają ich tak wiele (ARM ma 16).
MIPS i inne RISC mają zwykle 32, ponieważ nie jest tak trudno mieć tyle rejestrów - koszt jest wystarczająco niski, więc jest to trochę „dlaczego nie?”. Ponad 32 jest w większości bezużyteczne i ma wadę polegającą na tym, że dostęp do pliku rejestru jest dłuższy (każdy podwojenie liczby rejestrów potencjalnie dodaje dodatkową warstwę multiplekserów, co dodaje nieco więcej opóźnienia ...). Średnio wydłuża również instrukcje - co oznacza, że podczas uruchamiania programów zależnych od przepustowości pamięci instrukcji dodatkowe rejestry spowalniają cię!
Jeśli twój procesor jest w porządku i nie zmienia nazwy rejestru i próbujesz wykonać wiele operacji na cykl (więcej niż 3), to teoretycznie potrzebujesz więcej rejestrów, gdy liczba operacji na cykl rośnie. Właśnie dlatego Itanium ma tak wiele rejestrów! Ale w praktyce, oprócz kodu zmiennoprzecinkowego lub kodu zorientowanego na SIMD (w którym Itanium był naprawdę dobry), większość kodów będzie miała wiele odczytów / zapisów i skoków pamięci, co uniemożliwi realizację tego marzenia o ponad 3 operacjach na cykl (szczególnie w oprogramowaniu serwerowym, takim jak bazy danych, kompilatory, wykonywanie języka wysokiego poziomu, takie jak javascript, emulacja itp.). Właśnie to zatopiło Itanium.
Wszystko sprowadza się do różnicy między obliczeniami a wykonywaniem!