Rejestry teoretycznie nie są wymagane; wszystkie mikroprocesory nadal działałyby bez rejestrów. Ale ten pozornie trywialny dodatek pomógł zwiększyć wydajność mikroprocesorów.
Dlaczego nie możemy mieć więcej rejestrów, aby dalej czerpać z nich korzyści? Są tylko pamięcią na chipie i można sobie wyobrazić, że nie jest to trudne do dodania? Jaki czynnik wpłynął na liczbę rejestrów, jaka jest teraz, a nie, powiedz 10 razy więcej?
microprocessor
Darszan Chaudhary
źródło
źródło
Odpowiedzi:
Istnieje kilka czynników:
wysokowydajne mikrotechniczne wykorzystują zmianę nazw rejestrów. Oznacza to, że liczba rejestrów fizycznych jest większa niż liczba rejestrów widocznych architektonicznie i są one w stanie śledzić ich niezależne wykorzystanie.
podwojenie liczby rejestrów nie podwaja wydajności. ISTR (z architektury komputerowej, podejście ilościowe ), że przejście z 16 do 32 rejestrów przynosi coś w rodzaju 10% poprawy przy założeniu, że wzrost nie ma negatywnego wpływu (co jest bardzo optymistycznym założeniem).
architektonicznie widoczne rejestry mają koszty. Na przykład:
źródło
Rejestry i pamięć RAM są pamięcią, ale dostęp do nich można uzyskiwać na różne sposoby, aby odzwierciedlić koszt (w obszarze chipa lub ukrytych cykli zegara) dostępu do nich.
Rejestry są ściśle powiązane z ALU i mogą pełnić wiele ról w źródłach danych, ujściach, modyfikatorach itp. Potrzebują zatem wielu szerokich multipleksowanych połączeń. W niektórych architekturach możemy napisać R1 <= R2 + R3, i to właśnie dzieje się w jednym cyklu zegara. Każdy rejestr jest adresowany bezpośrednio w kodzie operacyjnym, adresowanie to jest bardzo ograniczonym zasobem.
Ponieważ rejestry są kosztowne w implementacji, w większości architektur liczba jest zwykle ograniczona do 10/20.
Pamięć RAM jest luźno związana z procesorem, zwykle jest kierowana przez jedno wspólne połączenie. To sprawia, że znacznie tańsze jest wdrażanie dużej ilości pamięci RAM. Adresy RAM generalnie pochodzą z adresu zapisanego w rejestrze, więc nie zużywaj znacznej szerokości instrukcji.
SPARC jest interesującą architekturą z 72 do 640 64-bitowymi rejestrami, z kontekstem 32 rejestrów, który można przesuwać z nakładaniem się dla szybkich wywołań podprogramów z przekazywaniem parametrów. Zwykle nie można ich znaleźć na komputerach PC i serwerach, gdzie koszty są ważne, jak w 99,999% aplikacji.
źródło
Rejestry muszą być adresowane w instrukcji. Jeśli jest dużo rejestrów, instrukcja jest dłuższa. Zapisywanie i przywracanie zawartości rejestru dla usługi przerwania wymaga więcej czasu, jeśli jest dużo rejestrów.
źródło
Jak większość rzeczy, liczba rejestrów stanowi kompromis między kosztem, złożonością i użytecznością.
Rejestry są implementowane jako wieloportowa statyczna pamięć RAM, co czyni je bardziej kosztownymi (obszar chipa) niż inne opcje przechowywania.
Następnie są one sprzężone z zestawem instrukcji procesora, zwiększenie liczby rejestrów zwiększa złożoność zestawu instrukcji. Więc jeśli chcesz zachować zgodność z zestawem instrukcji, nie możesz po prostu zwiększyć liczby rejestrów dostępnych w następnej generacji procesorów w celu zwiększenia wydajności, programy ich nie wykorzystają.
Następnie, ile rejestrów naprawdę potrzebujesz? Ich użyteczność jest ograniczona. Rozważ, że piszesz algorytm, który wykonuje pewne operacje matematyczne na 1024 bajtach, powiedzmy, pomnóż przez 5. Przy bieżącej liczbie rejestrów powstaje coś takiego:
Teraz, gdybyś miał 1024 rejestry i wszystkie dane tam przechowywane, twój program wyglądałby następująco:
Ponieważ każdy z nich jest inną instrukcją, każdy z nich musi zostać zapisany. Twoja potrzebna pamięć programu eksploduje. Po realizacji tego, warto przedstawić kilka wskazówek jak,
multiply register1 with register(2 to 256)
. Ale kiedy przestaniesz, czy podajesz instrukcje dla wszystkich kombinacji?Być może więc liczby, które obecnie mamy, są dobrym kompromisem między kosztem, złożonością i użytecznością.
źródło
multiply Register1 with Register2 multiply Register1 with Register3
jest bardzo nierealny, ponieważ dane musiały pochodzić bezpośrednio lub pośrednio spoza komputera, więc rejestry muszą zostać załadowane, a wyniki muszą być użyte gdzieś, bezpośrednio lub pośrednio, więc rejestry muszą być przechowywane. W rzeczywistości przyzwoity kompilator optymalizujący dla języka wysokiego poziomu „rozwinie” pętlę pierwszego programu, tworząc coś w rodzaju drugiego programu, optymalizując wykorzystanie rejestru, opóźnienie pamięci, być może zajętość pamięci podręcznej i szybkość wykonywania.multiply register1 with register(2 to 256)
instrukcji specjalnego przeznaczenia . Rurociągi znacznie poprawiają przepustowość procesora, szczególnie w celu łatwiejszego dekodowania i wykonywania instrukcji. Tak więc efekt złożonych, masywnych instrukcji odmian można uzyskać, stosując kilka prostszych instrukcji o wyższym wskaźniku wykonania. Większa liczba rejestrów pomaga kompilatorowi w generowaniu wielu niezależnych instrukcji (takich, które nie współużytkują rejestru), które można wykonać niezależnie, poprawiając przepustowość. Twój przykład = więcej rejestrów jest lepszych.Rejestry są bardzo drogie. Bardzo drogi. To nie tyle same rejestry, co wszystkie połączenia zi do rejestrów. Powiedzmy, że masz instrukcję reg1 = reg2 + reg3. Aby szybko to zaimplementować , musisz odczytać dane z dwóch rejestrów w jednym cyklu i zapisać w innym rejestrze w drugim cyklu. Teraz, jeśli masz procesor, który może wykonać wiele instrukcji na cykl, powiedzmy trzy instrukcje, będziesz musiał móc odczytać dane z sześciu rejestrów w każdym cyklu i zapisać dane do 3 rejestrów. To okropnie dużo bardzo szybkich połączeń.
Oczywiście możesz po prostu użyć więcej tranzystorów. Problem polega na tym, że prędkość spada. Potrzebujesz więcej sprzętu, aby wybierać spośród większej liczby rejestrów. Miejsce na plik rejestru staje się większe. Wszystko to sprawia, że wszystko działa wolniej. Tak więc z tą samą technologią możesz mieć 16 rejestrów i pracować z częstotliwością 2600 MHz lub 32 rejestry i pracować z częstotliwością 2400 MHz. Teraz dodatkowe rejestry muszą zrekompensować znaczny spadek prędkości zegara.
źródło
- Hierarchia pamięci
Rejestry, pamięć podręczna i pamięć RAM są wdrażane przy użyciu różnych technologii przechowywania.
Różne technologie różnią się między sobą
Przykład: Wewnętrzne rejestry znalezione w CPU to statyczna pamięć o swobodnym dostępie , natomiast pamięć główna komputera to dynamiczna pamięć o swobodnym dostępie
Komórka binarna ze statyczną pamięcią RAM jest implementowana za pomocą obwodu 6-tranzystorowego, natomiast komórka binarna z dynamiczną pamięcią RAM jest implementowana za pomocą kondensatora i tranzystora. Porównanie SRAM i DRAM
Dlatego zwiększanie liczby szybkiej, drogiej pamięci o mniejszej gęstości nie jest praktyczne. W rzeczywistości możemy użyć kilku z nich, a dobrze napisany program przechowa najczęściej używane dane w tych szybkich rejestrach, podczas gdy rzadziej używane dane są przechowywane w wolniejszej pamięci.
- długość instrukcji
Adres rejestrów jest zawarty w instrukcji, która ogranicza liczbę dostępnych rejestrów na podstawie liczby bitów, które mogą reprezentować adres. Na przykład w architekturze MIPS instrukcja o długości 32 bitów zawiera tylko 5 bitów do reprezentowania adresu dostępnych rejestrów, co ogranicza liczbę rejestrów do 2 5 = 32 rejestr. Zwiększenie liczby rejestrów wymagałoby zwiększenia długości instrukcji, aby uwzględnić wystarczającą liczbę bitów, które mogłyby uzyskać dostęp do wszystkich rejestrów.
źródło
Jeśli spojrzysz na zestaw instrukcji procesora, istnieje wiele sposobów ich grupowania. Na przykład wszystkie
ADD
instrukcje mogą być zgrupowane razem i wszystkieXOR
instrukcje.W każdej grupie tej samej instrukcji mogą istnieć wersje działające na pamięci lub rejestrach. To ta podgrupa skutecznie określa liczbę rejestrów posiadanych przez procesor.
Jako 8-bitowy hipotetyczny przykład, powiedzmy, że
$Ax
instrukcje mogą byćADD
instrukcjami i$Cx
mogą byćXOR
instrukcjami. Dzięki takiemu projektowi pozostały tylko cztery bity do zdefiniowania argumentów!$x0
może to być sam akumulator).Oczywiście minęliśmy 8-bitowe zestawy instrukcji. Mimo to ta logika pomogła zdefiniować zestawy rejestrów w przeszłości - będzie to nadal robić w przyszłości.
EDYCJA (zgodnie z żądaniem)
Powiedzieć szczyt cztery bity są do dyspozycji:
ADD
,SUB
,XOR
,MOV
,CMP
itd. Istnieje 16 możliwości tutaj. Następnie, w przypadku instrukcji, w których rejestrowanie do rejestru ma sens (np.ADD Rx,Ry
), Musisz określićRx
iRy
. Powiedzmy, że następne dwa bity są zax
, a dwa ostatnie są zay
. A zatem:Mając tylko dwa bity do zdefiniowania takiego rejestru, masz miejsce tylko na cztery rejestry!
Nawiasem mówiąc, zauważysz, że niektóre kombinacje rejestrów nie mają sensu. Na przykład
MOV Rx, Rx
(nic nie robi) iSUB Rx, Rx
(zawsze produkuje0
). Mogą to być instrukcje specjalne:SUB Rx, Rx
może staćNOT Rx
się instrukcją pojedynczego operandu.MOV Rx, Rx
może stać sięMOV
instrukcją, która przyjmuje drugi bajt jako wartość natychmiastową, interpretowaną jakoMOV Rx, #$yy
.W ten sposób możesz „bawić się” mapą instrukcji, wypełniając dziury dla instrukcji, które w innym przypadku byłyby bezużyteczne lub nienazwalne, aby zapewnić programistowi większy zestaw instrukcji. Ale ostatecznie zestaw instrukcji definiuje zestaw rejestrów.
źródło
Intel korzysta obecnie z tysięcy rejestrów - setek na rdzeń procesora. Ale największa ilość danych przechowywanych na procesorze znajduje się w pamięci podręcznej, co pośrednio odpowiada na pytanie. Pamięć podręczna jest zorganizowana w warstwach, z małą szybką pamięcią podręczną L1 i wolniejszymi pamięciami podręcznymi L2 i L3 dalej. Plik rejestru jest w pewnym sensie L0, nawet szybszy niż L1, ale także jeszcze mniejszy. Możesz więc zwiększyć liczbę rejestrów, ale to prawdopodobnie ich spowolni.
źródło