Architektura komputerów

Transkrypt

Architektura komputerów
Architektura komputerów
Tydzień 6
RISC i CISC
Znaczenie terminów
●
●
CISC – Complete Instruction Set
Computer – komputer o pełnej liście
rozkazów.
RISC – Reduced Instruction Set
Computer – komputer o zredukowanej
liście rozkazów.
Filozofia CISC
Złożone listy rozkazów zaprojektowano
w celu:
●
●
●
ułatwienia tworzenia kompilatorów
poprawienia efektywności wykonywania
(złożone operacje odpowiadają
pojedynczym instrukcjom procesora)
wspierania złożonych języków
wysokiego poziomu
Filozofia RISC
●
Prosty zbiór rozkazów
●
Duża liczba rejestrów roboczych
●
●
Optymalizacja wykorzystania rejestrów
przez kompilator
Akcent na optymalizację potoku
rozkazów
Operacje
W programach kompilowanych z języków
wysokiego poziomu dominują instrukcje:
●
przemieszczenia danych
●
skoków warunkowych i porównania
Najbardziej czasochłonne są operacje
wywołania podprogramu i powrotu.
Te właśnie instrukcje powinny być
zoptymalizowane przez procesor.
Argumenty
●
●
Większość odniesień do danych dotyczy
prostych zmiennych skalarnych.
Ponad 80% tych skalarów to zmienne
lokalne.
Dlatego ważny jest szybki dostęp do
argumentów. Z badań wynika, że
pierwszym kandydatem do optymalizacji
jest mechanizm przechowywania i
osiągania zmiennych skalarnych.
Wywołania procedur
Najbardziej czasochłonne operacje, dlatego
korzystne byłoby ich zoptymalizowanie.
Badania wykazały, że:
●
●
98% procedur używa mniej niż 6
argumentów
92% z nich używa mniej niż 6 lokalnych
zmiennych skalarnych.
Czyli liczba słów przypadająca na jedno
wywołanie nie jest wielka.
Użycie dużej tablicy rejestrów
●
●
●
●
Potrzebny jest szybki dostęp do
argumentów.
Większość odniesień do argumentów
dotyczy lokalnych skalarów, które łatwo
możemy przechowywać w rejestrach.
Rejestry są najszybszą dostępną
pamięcią.
Zminimalizowanie operacji dostępu do
pamięci pozwala zwiększyć wydajność.
Okna rejestrów
Większość odniesień dotyczy lokalnych
skalarów, więc najlepiej przechowywać
je w rejestrach, z zostawieniem kilku
rejestrów na zmienne globalne.
Pojęcie lokalności zmienia się z każdym
wywołaniem procedury i powrotem.
Możemy użyć wielu małych zestawów
rejestrów przypisanych do konkretnych
procedur.
Okna rejestrów
A.loc
B.in
B.loc
A.in
C.in
w0
H.loc
w1
w2
w7
C.loc
H.in
D.in
w3
w6
G.loc
wN – okno rejestrów
dostępnych na raz
X.in – parametry
procedury X
X.loc – dane lokalne
procedury X
w5
D.loc
w4
G.in
F.loc
E.loc
F.in
E.in
Okno w0 zawiera
parametry wejściowe
procedury A (A.in),
zmienne lokalne
procedury A (A.loc) oraz
rejestry na parametry
wywołania nowej
procedury (B.in).
Po wywołaniu procedury
B okno bieżące jest
zmieniane na w1,
udostępniając nowy
zestaw rejestrów na
zmienne lokalne i do
wywołania kolejnej procedury.
Zmienne globalne
Opisany wcześniej układ stanowi
efektywną organizację do przechowywania
zmiennych lokalnych w rejestrach. Nie
odpowiada jednak potrzebom
przechowywania zmiennych globalnych.
Są dwa możliwe rozwiązania:
●
●
Przypisanie zmiennych globalnych do
lokalnych rejestrów dla każdej
procedury.
Wydzielenie rejestrów globalnych.
Duża tablica rejestrów a
pamięć podręczna
Tablica rejestrów zorganizowana w
postaci okien jest podobna do pamięci
cache.
Tablica rejestrów może nieefektywnie
wykorzystać przestrzeń, ponieważ wiele
procedur nie wykorzysta wszystkich
przypisanych rejestrów.
Pamięć cache wczytuje dane w blokach, z
których część nie będzie nigdy
wykorzystana.
Porównanie własności
Tablica rejestrów
●
●
●
●
●
Wszystkie skalary
lokalne
Pojedyncze zmienne
Zmienne globalne
przypisane przez
kompilator
Zachowywanie/odtwarza
nie oparte na głębokości
zagnieżdżenia procedury
Adresowanie rejestrów
Pamięć podręczna
●
●
●
●
●
Ostatnio używane
skalary lokalne
Bloki pamięci
Ostatnio używane
zmienne globalne
Zachowywanie/odtwarza
nie oparte na algorytmie
wymiany pamięci cache
Adresowanie pamięci
Dostęp do lokalnych zmiennych
Rozkaz
Rozkaz
Numer
okna
Adres
Rejestry
Pamięć
podręczna
Znaczniki
R
Dekoder
Dane
Dane
Dane
Porównanie
Wybór
Tablica rejestrów
oparta na oknach
Pamięć
podręczna
Dane
Optymalizacja kompilatorem
●
●
●
Celem kompilatora jest maksymalnie długie
przechowywanie argumentów w rejestrach i
minimalizacja operacji ładowania i zapisu
do pamięci.
Każda zmienna jest przypisywana do
rejestru symbolicznego. Następnie nieograniczona liczba rejestrów symbolicznych jest
odwzorowywana na rzeczywiste.
Istotą optymalizacji jest zdecydowanie
które wielkości mają być przypisane
rejestrom w określonym punkcie programu.
Powody używania CISC
●
●
●
●
Łatwiejsze tworzenie kompilatorów
Oczekiwanie mniejszych programów
(mniej instrukcji).
Oczekiwanie wydajniejszych programów
(jedna złożona instrukcja powinna
wykonać się szybciej niż kilka prostszych).
Zgodność z istniejącym
oprogramowaniem.
Powody używania RISC
●
●
●
Prosta konstrukcja procesora zapewnia
jego większą wydajność.
Jedna instrukcja jest wykonywana w
jednym cyklu zegara.
Prawie cała optymalizacja wydajności
leży po stronie kompilatora. Dzięki
temu możliwe jest tworzenie coraz
lepszych kompilatorów dla istniejącego
już sprzętu.
Procesor
AMD29000
SPARC
HP PA
IBM 390
Intel i486
Intel i960
PowerPC
Alpha
adresowanie nie
wyrównane do słowa
maksymalna liczba
zastosowań MMU
liczba bitów numeru
rejestru całkowitego
liczba bitów numeru
rejestru zmiennopozyc.
1
4
1 nie nie
1
4
2 nie nie
1
4 10 nie nie
3
6
2 nie tak
12 12 15 nie tak
2
8
9 nie nie
1
4
5 nie nie
1
4
1 nie nie
maksymalna liczba
argumentów pamięci
operacje arytmetyczne
z dostępem do pamięci
Złożoność
dekodowania
adresowanie
pośrednie
liczba trybów
adresowania
maksymalny rozmiar
rozkazu (w bajtach)
liczba rozmiarów
rozkazów
Porównanie własności
Trudność przetwarzania Wspieranie
potokowego
kompilatora
1
1
1
2
2
1
1
1
nie
nie
nie
tak
tak
tak
tak
tak
1
1
1
4
4
1
1
1
8
5
5
4
3
5
5
5
3
4
4
2
3
3
5
5
Potoki RISC
●
●
Większość rozkazów jest typu rejestrrejestr i ma dwie fazy:
–
I: pobranie rozkazu
–
E: wykonanie rozkazu
Operacje ładowania i zapisu mają jeszcze
trzecią fazę:
–
●
D. Operacja dostępu do pamięci (pamięć-rejestr
lub rejestr-pamięć).
Jeśli rozkaz używa argumentu zmienionego
przez poprzedni, potrzebne jest opóźnienie
Przebieg czasowy
przetwarzania potokowego
Ładuj
Ładuj
NOOP
Dodaj
A
B
M
M
C
A+B
Zapisz
Skok do
M C
X
I E D
I E D
I E
I E
I E D
I E
Musimy użyć instrukcji NOOP ponieważ w przeciwnym
wypadku faza wykonania instrukcji dodawania pokryłaby się
z fazą pobierania danych poprzedniej instrukcji ładowania.
Optymalizacja przetwarzania
potokowego
100 Ładuj A M
I E D
101 NOOP
I E
102 Dodaj A A+I
I E
103 Skok do 106
I E
106 Zapisz M A
I E D
Rozkaz pusty umożliwia
dodawanie
100 Ładuj
A M I E D
101 Skok do 105
I E
102 Dodaj
A A+I
I E
I E D
105 Zapisz
M A
Zamieniona kolejność pozwala
pominąć rozkaz pusty
Dzięki zamianie kolejności rozkazów skoku i dodawania
możliwe jest pominięcie pustej instrukcji opóźniającej.
Taka zamiana jest jednak możliwa tylko w przypadkach,
kiedy nie zmieni to wyniku operacji.
Przyszłość RISC i CISC
W ciągu ostatnich lat polemika RISC kontra
CISC właściwie zanikła. Stopniowo
technologie się przenikają: systemy RISC
stały się bardziej złożone, architektury
CISC wdrażają wiele rozwiązań
związanych z RISC.
Np. procesory rodziny Pentium zawierają
wewnętrzne jądro w architekturze RISC z
układem tłumaczącym instrukcje CISC na
sekwencje mikrorozkazów wewnętrznych