www.eprace.edu.pl » ia64 » Mechanizmy zastosowane w architekturze IA-64 » Rejestry rotujące

Rejestry rotujące

Przydzielanie rejestrów zaimplementowane w oprogramowaniu

Jedną z kluczowych koncepcji zastosowanych w IA-64, jest idea przeniesienia części zadań dotychczas wykonywanych bezpośrednio w procesorze do oprogramowania. Jednym z przykładów jest przydzielanie zestawu rejestrów. Większość procesorów dla serwerów sama mapuje małą liczbę logicznych rejestrów (8-32) z większej liczby fizycznych rejestrów (na przykład ponad 80 jak to ma miejsce w procesorze Alpha 21264). Ponieważ oprogramowanie ma dostęp jedynie do rejestrów logicznych, sprzęt musi przydzielać oraz przeliczać dostęp używając dodatkowej tablicy. To znacznie wydłuża czas wykonania potoku instrukcji, oraz często także jego wielkość. IA-64 eliminuje ten mechanizm z procesora i swój wielki zestaw udostępnia bezpośrednio dla oprogramowania. Takie postępowanie jest korzystniejsze w większości przypadków, za wyjątkiem krótkich pętli. W tej krótkiej sekwencji kodu która jest wykonywana wiele razu iteracyjnie, może być niewystarczająca liczba instrukcji, aby zrównoważyć czas ładowania instrukcji. To może powodować niepożądane przestoje. W innych procesorach problem ten rozwiązano zamieniając kolejność instrukcji, tak aby w wolnym czasie wykonać trochę niezależnego kodu. Dodatkowe instrukcje mogą powodować konflikty rejestrów, gdyż instrukcje z pętli mogą wskazywać na te same rejestry, na które wskazują dodatkowe instrukcje. Problem konfliktów jest rozwiązywany właśnie przez sprzętowe przydzielanie rejestrów logicznych. W IA-64 problem będzie rozwiązywany przez "wyrolowywaanie" pętli w oprogramowaniu. Ta technika kompilacji zwielokrotnia instrukcje pętli, często kilka razy, aby powstała wystarczająca ilość instrukcji.

Dla przykładu kopiująca pamięć pętla:

for(i=0;i<n;i++)

*b++=*a++;

po wyrolowaniu może wyglądać tak

m=n/3;

for(i=0;i<m;i++){

*b++=*a++;

*b++=*a++;

*b++=*a++;

}

Każdy zestaw z zwielokrotnionych przebiegów pętli jednakże może wymagać oddzielnego zestawu rejestrów, aby zapobiegać kolizjom. Z tego powodu, IA-64 ma bardzo dużo dostępnych rejestrów. Wadą takiego rozwiązania jest to, iż duplikowanie instrukcji może powodować ogromny rozrost wielkości kodu.

Rotatujące Rejestry nie powodują rozrostu kodu

Aby zredukować rozrost wielkości kodu IA-64 używa mechanizmu "rotujących rejestrów". Technika ta dzieli zestaw rejestrów na 2 części. Jedna czwarta ogólnej liczby rejestrów (stałoprzecinkowych, zmiennoprzecinkowych i predykatów) jest zarezerwowana dla zmiennych globalnych. Reszta czyli trzy czwarte "rotuje" czyli jest kolejno przydzielana. Dostęp do nich jest poprzez przesunięcie którego wartość jest przechowywana w specjalnych rejestrach RRB.

RRB (rotating register base – podstawa rotujących rejestrów) trzy rejestry

Do operacji na tych rejestrach zdefiniowano specjalne instrukcje:

Specjalna instrukcja CR.CTOP zmniejsza każdorazowo odpowiedni rejestr jeden na końcu każdego przebiegu pętli, pozwalając instrukcjom z następnego przebiegu używać następnego zestawu rejestrów. Nazwa rotowanie bierze się stąd, iż jeśli wartości zawarta w rejestrach RRB wskazuje na ostatni rejestr to następną porcją są rejestry z dołu, wygląda na to jakby rejestry były zamknięte w koło i aktywna była część, która porusza się ruchem rotującym.

Instrukcje w pętli można podzielić na trzy fazy: instrukcje początkowe (prolog), instrukcje środka (kernel), oraz instrukcje końcowe (epilog). Za kryterium podziału uważa się zapełnienie potoku instrukcji do wykonania. Podczas wykonywania instrukcji początkowych potok nie jest kompletny, dopiero zapełnia się, podczas wykonywania instrukcji środkowych, potok jest pełny. Jak łatwo się domyślić podczas trwania fazy epilogu potok się opróżnia.

Rotowanie rejestrów predykatów daje możliwość wychwycenia instrukcji które są wykonywane na początku (prologu) wykonywania pętli, oraz tych na których pętla kończy swoje działanie (epilogu). Jeżeli te instrukcje zostaną na dodatek wcześniej właściwie przewidziane to rotowanie rejestrów predykatowych umożliwia wykonanie tych instrukcji tylko raz. Instrukcji startowych na początku przebiegu, oraz końcowych na końcu. Daje to ogromne korzyści, gdyż potok cały czas jest pełny. Niekiedy może się zdarzyć, że instrukcje początkowe pętli są potrzebne później przy inicjowaniu kolejnych przydziałów rejestrów predykatowych, jednakże można je wykonać początkowo także dla jeszcze nie potrzebnych rejestrów, co całkowicie eliminuje te instrukcje ze ścieżki krytycznej programu. Wystrzegając się krzyżowania się zestawu rejestrów, oraz usprawnieniu procesu rotowania projektanci IA-64 dodali kilka specjalnych rejestrów. Tymi rejestrami (oprócz rejestrów RRB) specjalnymi są:

Użycie specjalnych rejestrów pozwala instrukcji CR.CTOP wykonać wiele operacji prościej i szybciej niż w tradycyjnych procesorach które mapują rejestry. Metoda przydzielania rejestrów w IA-64 pozwala na rozwiązanie problemu krótkich pętli. Można to oczywiście było zrobić całkowicie w kompilatorze, jednakże powodowało by to duży rozrost kodu. Technika rotujących rejestrów powoduje konieczność większej komplikacji (dodanie kilku rejestrów, oraz instrukcji operujących na nich) przy budowie procesora, jednakże ta komplikacja jest mniejsza niż w przypadku koncepcji mapowania rejestrów i udostępniania tylko tylu ile jest w danej chwili potrzebne. Wydawać by się mogło iż wychwytywanie instrukcji początkowych oraz końcowych może być niekorzystne w pętlach które wykonują niewielką liczbę przebiegów. Powodem mogły by być nadmierne koszy związanych z analizą kodu przy poszukiwaniu prologu i epilogu, które mogą być później nie zrekompensowane przez zyski z jednego potoku. Te obawy są bezpodstawne, gdyż dla procesora opartego na architekturze IA-64 już dla kilku przebiegów zyski szybkości są widoczne. W dzisiejszych rozwiązaniach rzadko stosuje się technikę wyrolowywania pętli, za wyjątkiem programów numerycznych w których przetwarzanie długie tablice amortyzuje narzut związany przetwarzaniem końca oraz początku pętli



komentarze

Copyright © 2008-2010 EPrace oraz autorzy prac.