Okno rejestracji

Przykład 4-okienkowego systemu okien rejestrowych

W inżynierii komputerowej okna rejestrów to funkcja, która przydziela rejestry podprogramowi poprzez dynamiczne aliasowanie podzbioru rejestrów wewnętrznych do stałych, widocznych dla programisty rejestrów. Okna rejestrów zaimplementowano w celu poprawy wydajności procesora poprzez zmniejszenie liczby na stosie wymaganych do wywołań funkcji i zwrotów. Jedna z najbardziej wpływowych cech Berkeley RISC , została później zaimplementowana w architekturach zestawu instrukcji, takich jak AMD Am29000 , Intel i960 , Sun Microsystems SPARC i Intel Itanium .

Operacja ogólna

Dla różnych części programu dostępnych jest kilka zestawów rejestrów. Rejestry są celowo ukryte przed programistą, aby wymusić współdzielenie zasobów procesora przez kilka podprogramów.

Skutecznie można wdrożyć uczynienie rejestrów niewidocznymi; CPU rozpoznaje ruch z jednej części programu do drugiej podczas wywołania procedury. Dokonuje się tego poprzez jedną z niewielkiej liczby instrukcji ( prolog ) i kończy jedną z podobnie małego zestawu ( epilog ) . W projekcie Berkeley wywołania te powodowałyby „podmianę” nowego zestawu rejestrów w tym momencie lub oznaczenie ich jako „martwe” (lub „nadające się do ponownego użycia”) po zakończeniu wywołania.

Zastosowanie w procesorach

W projekcie Berkeley RISC tylko osiem rejestrów z łącznej liczby 64 jest widocznych dla programów. Kompletny zestaw rejestrów nazywany jest plikiem rejestru , a każdy konkretny zestaw ośmiu rejestrów nazywany jest oknem . Plik umożliwia maksymalnie ośmiu wywołaniom procedur posiadanie własnych zestawów rejestrów. Dopóki program nie wywołuje łańcuchów dłuższych niż osiem wywołań, rejestry nigdy nie muszą zostać rozlane , tj. zapisane w pamięci głównej lub pamięci podręcznej, co jest procesem powolnym w porównaniu z dostępem do rejestrów.

Dla porównania, architektura SPARC firmy Sun Microsystems zapewnia jednoczesny wgląd w cztery zestawy po osiem rejestrów każdy. Trzy zestawy po osiem rejestrów każdy są „okienkowe”. Osiem rejestrów (od i0 do i7) stanowi rejestry wejściowe do bieżącego poziomu procedury. Osiem rejestrów (L0 do L7) jest lokalnych dla bieżącego poziomu procedury, a osiem rejestrów (o0 do o7) to dane wyjściowe z bieżącego poziomu procedury do następnego tzw. poziomu. Kiedy wywoływana jest procedura, okno rejestru przesuwa się o szesnaście rejestrów, ukrywając stare rejestry wejściowe i stare rejestry lokalne i zamieniając stare rejestry wyjściowe w nowe rejestry wejściowe. Do przekazywania parametrów wykorzystywane są wspólne rejestry (stare rejestry wyjściowe i nowe rejestry wejściowe). Wreszcie osiem rejestrów (od g0 do g7) jest widocznych globalnie na wszystkich poziomach procedur.

AMD 29000 ulepszył projekt, umożliwiając zmienną wielkość okien, co pomaga w wykorzystaniu w typowym przypadku, gdy do wywołania potrzebnych jest mniej niż osiem rejestrów. Podzielił także rejestry na globalny zestaw 64 i dodatkowe 128 dla okien. Podobnie architektura IA-64 (Itanium) wykorzystywała okna o zmiennej wielkości, z 32 rejestrami globalnymi i 96 dla okien.

W architekturze Infineon C166 większość rejestrów to po prostu lokalizacje w wewnętrznej pamięci RAM, które mają dodatkową właściwość polegającą na tym, że są dostępne jako rejestry. Spośród nich adresy 16 rejestrów ogólnego przeznaczenia (R0-R15) nie są stałe. Zamiast tego rejestr R0 znajduje się pod adresem wskazanym przez rejestr „Wskaźnik kontekstu” (CP), a pozostałych 15 rejestrów następuje sekwencyjnie.

Rejestracja systemu Windows zapewnia również łatwą ścieżkę aktualizacji. Ponieważ dodatkowe rejestry są niewidoczne dla programów, w każdej chwili można dodać dodatkowe okna. Na przykład użycie programowania obiektowego często skutkuje większą liczbą „mniejszych” wywołań, co można uwzględnić, na przykład zwiększając liczbę okien z ośmiu do szesnastu. Takie podejście zastosowano w SPARC, który obejmował więcej okien rejestrów w nowszych generacjach architektury. Efektem końcowym jest mniej powolnych rozlewania i wypełniania okna rejestrów , ponieważ okna rejestrów rzadziej się przepełniają.

Krytyka

Okna rejestrów nie są jedynym sposobem na poprawę wydajności rejestrów. Grupa na Uniwersytecie Stanforda projektująca MIPS zobaczyła pracę Berkeley i zdecydowała, że ​​problemem nie jest brak rejestrów, ale słabe wykorzystanie istniejących. Zamiast tego zainwestowali więcej czasu w alokację rejestrów swojego kompilatora , upewniając się, że mądrze wykorzystał większy zestaw dostępny w MIPS. Spowodowało to zmniejszenie złożoności chipa przy połowie całkowitej liczby rejestrów, oferując jednocześnie potencjalnie wyższą wydajność w przypadkach, gdy pojedyncza procedura mogłaby wykorzystać większą widoczną przestrzeń rejestrów. Ostatecznie, dzięki nowoczesnym kompilatorom, MIPS lepiej wykorzystuje swoją przestrzeń rejestrów, nawet podczas wywołań procedur. [ potrzebne źródło ]