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