Wykład 5

Transkrypt

Wykład 5
Wprowadzenie do architektury
komputerów
Budowa jednostki wykonawczej procesora
Potokowa jednostka wykonawcza
Przetwarzanie wielopotokowe
Budowa procesora
Jednostka wykonawcza
Procesor
Procesor jednocykowy
●
●
●
Procesory o prostym modelu programowym można zrealizować w
postaci układu sekwencyjnego, który podczas każdej instrukcji
zmienia stan tylko jeden raz – na końcu instrukcji
Całe wykonanie instrukcji odbywa się w układzie kombinacyjnym
Założenia dla modelu procesora
●
●
●
●
●
model programowy MIPS (RISC) z uproszczeniami
architektura Harvard – rozdzielone pamięci programu i danych
● pamięć programu jest pamięcią stałą (ROM) czyli układem
kombinacyjnym
instrukcje o długości 32-bitów zapisane w pamięci o szerokości słowa
równej 32 bity
adresowanie pamięci bajtowe
wymuszone wyrównanie naturalne danych i instrukcji
Format instrukcji
Modelowy procesor ma możliwość wykonywania instrukcji MIPS w dwóch spośród
trzech formatów – R oraz I. W obu formatach występują pola głównego kodu
operacyjnego i dwa numery rejestrów. Pozostała część słowa instrukcji jest różna
dla obu formatów.
Procesor jednocyklowy –
pobranie instrukcji
PC – licznik instrukcji
PC_inc – inkrementer licznika
instrukcji
IM – pamięć instrukcji
nextPC – ścieżka zawierająca
następną zawartość PC
Procesor jednocyklowy –
pobieranie instrukcji
●
●
Licznik instrukcji PC zrealizowany jako rejestr typu D
Zawartość licznika instrukcji jest podawana na
●
●
●
●
wejście adresowe pamięci programu IM
wejście inkrementera PC_inc – układu kombinacyjnego generującego
wartość PC+4 – potencjalny adres następnej instrukcji
Na wyjściu pamięci instrukcji pojawia się binarny obraz instrukcji w
postaci słowa 32-bitowego
Poszczególne części tego słowa zawierają (w zależności od formatu)
●
●
●
●
kod operacyjny instrukcji (jedno lub dwa pola)
0,1,2 lub 3 numery rejestrów (docelowy, źródłowe)
16-bitową stałą natychmiastową używaną jako argument operacji lub
przemieszczenie adresu
5-bitową wartość przesunięcia bitowego
Procesor jednocyklowy – układ
sterujący
●
Na wejście układu sterującego jest podawana część słowa instrukcji
●
●
●
główny kod operacyjny – pole OPC
(tylko dla instrukcji w formacie R) pole FUN
Układ sterujący generuje sygnały sterujące pozostałymi częściami
procesora, w tym m,in,
●
●
●
●
●
●
sygnały sterujące multiplexerami
sygnały zezwolenia na odczyt i zapis pamięci danych
sygnały zezwolenia na zapis rejestru docelowego
kod operacji dla jednostki arytmetyczno-logicznej
sygnał zezwolenia na skok warunkowy
sygnał sterujący pracą układu rozszerzania danej natychmiastowej
Procesor jednocyklowy –
przygotowanie argumentów
OPC, FUN, Rs, Rt, Rd, offset –
pola obrazu binarnego instrukcji.
RdA1, RdA2 – adresy odczytu
zestawu rejestrów (numery
odczytywanych rejestrów).
WrA – Numer rejestru
zapisywanego.
WrD – dane zapisywane do
rejstru.
RdD1, RdD2 – dane
odczytywane z rejestrów.
BrOffset – przemieszczenie skoku.
StoreData - dane zapisywane do pamięci.
Mux_ALU – multiplekser wyboru
drugiego argumentu źródłowego.
Procesor jednocyklowy –
przygotowanie argumentów
●
Argumenty rejestrowe
●
●
●
Argument natychmiastowy (format I) – uzyskany przez rozszerzenie 16bitowego pola stałej do 32 bitów w układzie rozszerzenia Ext
●
●
●
●
●
pierwszy argument – rejestr o numerze Rs
drugi argument – rejestr o numerze Rt (tylko w formacie R)
instrukcje arytmetyczne, skoki warunkowe, odwołania do pamięci –
rozszerzenie bitem znaku
instrukcje logiczne – rozszerzenie zerami
wybór drugiego argumentu realizowany przez multiplexer Mux_ALU w
zależności od formatu instrukcji
Jednostka arytmetyczna otrzymuje na wejściach dwa argumenty 32bitowe
Numer rejestru docelowego pochodzi z pola Rt lub Rd
Procesor jednocyklowy – ALU,
pamięć danych
Br_Add – sumator adresów
docelowych skoków.
MUX_BR – multiplekser
skoków warunkowych.
ALU – jednostka
arytmetyczno – logiczna.
Result – wynik operacji.
Cond – warunek skoku.
DM – pamięć danych.
WrData – dane zapisywane
do rejestru.
Procesor jednocyklowy – ALU,
układ skoków
●
Jednostka arytmetyczno-logiczna wykonuje na argumentach
wejściowych operację określoną przez wykonywaną instrukcję
●
●
●
Sumator skoków generuje potencjalny adres docelowy skoku
warunkowego
●
●
przy instrukcjach odwołań do pamięci jest to sumowanie zawartości rejestru
bazowego z przemieszczeniem, którego wynikiem jest adres odwołania
przy instrukcjach skoków warunkowych ALU porównuje dwa argumenty
sprawdzając określoną relację, a wartość logiczną relacji wystawia na
wyjście warunku skoku COND
adres powstaje przez zsumowanie zinkrementowanej zawartości PC z
przeskalowanym (x4) przemieszczeniem zawartym w kodzie instrukcji
Multiplekser skoków względnych MUX_BR wybiera adres następnej
instrukcji
Procesor jednocyklowy –
wymiana danych z pamięcią
●
●
●
Moduł wymiany danych z pamięcią jest bezczynny podczas instrukcji
innych niż ładowanie i składowanie danych
Wartość z wyjścia ALU jest używana jako adres odczytu lub zapisu
pamięci
W instrukcjach składowania do pamięci jest zapisana zawartość
rejestru Rt
●
●
zapis następuje na końcu wykonania instrukcji
W instrukcji ładowania następuje odczyt zawartości pamięci
Procesor jednocyklowy – zakończenie
wykonywania instrukcji
●
Multiplexer wyboru wyniku służy do wybrania wartości, która ma być
zapisana do rejestru
●
●
●
Po przepropagowaniu sygnałów przez wszystkie układy procesora
następuje zakończenie wykonania instrukcji, sterowane zboczem
sygnału zegarowego
Zbocze zegara powoduje
●
●
●
●
jest to albo wartość z wyjścia ALU, albo dana odczytana z pamięci
zapis do PC wartości z wyjścia multipleksera skoków
(w instr. arytmetycznych, logicznych i ładowania) zapis wyniku operacji lub
danej odczytanej z pamięci do rejestru docelowego
(w instrukcjach składowania) zapis danej odczytanej z rejestru Rt do
pamięci danych
Po zboczu zegara następuje rozpoczęcie wykonania następnej
instrukcji
Procesor jednocyklowy –
studium implementacji
●
Przedstawiony procesor można skonstruować ze standardowych
układów logicznych
●
●
●
●
Procesor taki można również zsyntezować w układzie FPGA
Realistyczne czasy propagacji układów
●
●
●
rejestry, bramki, multipleksery, ALU, Pamięć ROM i RAM – łatwo dostępne
Zestaw rejestrów można zbudować np. z dwóch układów pamięci, które
będą miały identyczną zawartość
5 ns dla prostych układów logicznych oraz tsetup
20 ns dla pamięci i ALU
Wydajność procesora
●
●
wynika z najdłuższej ścieżki przepływu sygnałów podczas wykonywania
instrukcji
3 x 20 ns +4 x 5 ns = 80 ns co daje fmax około 12 MHz
Procesor jednocyklowy problemy
●
●
Realizacja jednocyklowa nie była i nie jest stosowana w praktyce
Wady – dawniej
●
●
●
Wady – obecnie
●
●
oddzielenie pamięci – wysoki koszt, duże rozmiary, brak programowalności
Nadmiarowość kosztownych bloków – trzy sumatory (inkrementacja PC,
ALU, sumator skoków)
niska wydajność
Rozwiązanie – inna budowa procesora
●
●
dawniej – procesor wielocyklowy
obecnie – architektury potokowe
Procesor wielocyklowy
●
●
Architektura wielocyklowa minimalizuje liczbę bloków funkcjonalnych
poprzez wielokrotne wykorzystanie bloków podczas każdej instrukcji
Implikuje to konieczność rozbicia wykonania instrukcji na kilka faz cykli
●
●
●
●
w każdej fazie każdy blok wykonuje jedną czynność
liczba faz wynosi od dwóch do kilkunastu, w zależności od budowy
procesora i złożoności danej instrukcji
● poszczególne instrukcje mają rożne czasy wykonania
Do sterowania wykonaniem służy skomplikowany układ sterujący
będący złożonym automatem synchronicznym
Komplikacja dróg przepływu danych implikuje wzrost liczby
multiplekserów
Procesor wielocyklowy
●
Wspólna pamięć programu i danych
●
●
●
●
Wielokrotne wykorzystanie Sumatora
●
●
●
●
architektura Princeton
programowalność
dwu- lub trzykrotne użycie pamięci podczas wykonania instrukcji
do inkrementacji PC
do wykonania operacji arytmetycznej
do wyliczenia adresu docelowego skoku
wielofazowe wykonanie powoduje konieczność zapamiętania pobranej
instrukcji
●
●
służy do tego tzw. rejestr instrukcji IR umieszczony w jednostce sterującej
w fazie pobrania rejestr ten jest ładowany obrazem instrukcji pobranym z
pamięci
Procesor wielocyklowy –
studium implementacji
●
każda instrukcja wykonuje się w kilku cyklach zegara
●
●
Czas cyklu zależny od najdłuższej ścieżki propagacji sygnałów
●
●
przyjmijmy średnią liczbę cykli równą 3
przyjmując parametry analogiczne jak dla modelu procesora
jednocyklowego 20 ns + 3 x 5 ns = 35 ns – fmax około 30MHz
Średni czas wykonania instrukcji – 3 x 35 ns = 105 ns
●
●
realizacja wielocyklowa jest nieco wolniejsza od jednocyklowej
niższe koszty rekompensują niższą wydajność
Praca procesora
jednocyklowego
●
●
●
●
●
Podczas wykonywania pojedynczej instrukcji następuje propagacja
sygnałów przez połączone układy kombinacyjne
Po jednokrotnej zmianie stanu wyjścia każdego układu, stan wyjścia
pozostaje stały do zakończenia wykonywania instrukcji
Każdy układ aktywnie „pracuje” tylko przez krótki czas przez pozostały
czas utrzymuje ustaloną wartość na wyjściu
Do utrzymania ustalonych wartości można użyć rejestrów
Procesor jednocyklowy można podzielić na fragmenty o podobnych
czasach propagacji sygnałów np.:
●
●
●
●
●
PC i pamięć programu
zestaw rejestrów i układ rozszerzania danej
ALU i sumator skoków
pamięć danych
układ zapisu wyniku
Od procesora jednocyklowego
do potoku
●
●
●
W miejscach „linii cięcia” umieszczamy rejestry typu D
Wykonanie instrukcji
● po zmianie PC, po czasie potrzebnym na propagację sygnałów przez
pamięć programu, zapamiętujemy stan wszystkich sygnałów
(zinkrementowana wartość PC i wyjście pamięci programu) w
rejestrze poprzez podanie zbocza zegara
● po przepropagowaniu sygnałów przez każdy kolejny fragment
procesora zapamiętujemy wszystkie sygnały wychodzące z tego
bloku w rejestrze umieszczonym na końcu danego bloku
● po przepropagowaniu sygnałów z ostatniego bloku na wejścia PC i
zestawu rejestrów podajemy zbocze zegara kończące wykonanie
instrukcji
Przepływ sygnałów pozostał bez zmian, dodano 4 rejestry
● Wykonanie instrukcji zajmuje 5 faz, czas wykonania instrukcji nieco
wzrósł, potrzeba 5 przebiegów synchronizujących – gdzie jest zysk?
Od procesora jednocyklowego
do potoku
●
●
●
●
●
●
Po zapamiętaniu stanu wyjść fragmentu procesora, fragment ten staje
się bezczynny
● nie jest już potrzebny do wykonania danej instrukcji, a wynik jego
pracy jest zapamiętany w rejestrze
Zwolniony fragment można wykorzystać do wykonania następnej
instrukcji
● wystarczy w tym celu użyć jednego, wspólnego przebiegu
zegarowego do sterowania wszystkich rejestrów
Wykonanie pojedynczej instrukcji zajmuje 5 cykli zegarowych
● czas tych cykli jest znacznie krótszy niż w wariancie jednocyklowym
W każdym cyklu procesor rozpoczyna wykonanie nowej instrukcji
W każdym cyklu procesor kończy wykonanie kolejnej instrukcji
Widziana na zewnątrz wydajność – jedna instrukcja na cykl
Potokowa jednostka wykonawcza –
MIPS R3000
●
●
Jeden z pierwszych mikroprocesorów RISC, ok. 1985
5 stopni potoku
●
●
●
IF, RD, ALU, MEM, WB
Stopnie IF i WB pracują przez pół cyklu – wykonywanie instrukcji zajmuje
czas czterech cykli zegra, złożony z połówkowego cyklu IF, pełnych cykli
RD, ALU i MEM oraz połówki cyklu WB
● ma to wpływ na wielkość opóźnień, - omówione dalej
Architektura Harvard-Princeton
●
rozdzielone górne warstwy hierarchii pamięci, wspólna pamięć operacyjna
Potok MIPS R3000
Stopień IF pobiera instrukcje z
hierarchii pamięci instrukcji
(zewnętrznej w stosunku do
procesora).
Stopień RD odczytuje zawartości
rejestrów źródłowych z zestawu
rejestrów procesora.
Stopień ALU wykonuje operację
arytmetyczną i ew. skok.
Stopień MEM dokonuje wymiany
danych z hierarchią pamięci
danych.
Stopień WB zapisuje wynik
operacji arytmetycznej lub daną
odczytaną z pamięci do rejestru.
Budowa i działanie potoku MIPS
R3000
●
●
Na końcu każdego stopnia (oprócz WB) jest umieszczony rejestr typu
D
Aktualizacja PC i rejestrów uniwersalnych następuje w połowie cyklu
zegara
●
●
●
●
pobranie instrukcji zaczyna się w połowie cyklu
zapis wyniku do rejestru następuje w połowie cyklu
odczyt danej z rejestru następuje w drugiej połowie fazy RD
Wszystkie sygnały potrzebne do dokończenia wykonania instrukcji są
zapamiętane w rejestrach i przekazywane do kolejnych stopni potoku,
w tym m.in.
●
●
sygnały sterujące
numer rejestru docelowego
Wykonanie sekwencji instrukcji
w potoku
MIPS R3000
W każdym cyklu procesor rozpoczyna wykonanie nowej instrukcji i kończy wykonanie
wcześniejszej instrukcji.
W każdym cyklu w potoku przebywa 5 instrukcji w różnych fazach wykonania.
Synchronizacja potoku
●
Rozpatrzmy wykonanie sekwencji instrukcji
addu $4, $3, $2
addu $6, $5, $4
●
●
●
●
●
●
●
druga instrukcja korzysta z argumentu źródlłowego w rejestrze $4
rejestr ten jest rejestrem docelowym pierwszej instrukcji
instrukcja zapisuje wynik w stopniu WB
odczyt argumentów następuje w stopniu RD
kiedy druga instrukcja znajduje się w stopniu RD, pierwsza przebywa w stopniu ALU
Zapis wyniku przez pierwszą instrukcję nastąpi w dwa cykle później
Problem: jaką wartość $4 pobierze druga instrukcja?
●
●
byłaby to wartość nie zaktualizowana przez pierwszą instrukcję
nie ma pewności, czy wykonanie programu użytkowego nie zostanie przerwane
pomiędzy 1 i 2 instrukcją, a następnie wznowione
● w takiej sytuacji pierwsza instrukcja zakończy się i zapisze wynik
Hazard R-A-W
●
Nie da się jednoznacznie określić, jaką wartość rejestru pobierze
druga instrukcja
●
●
●
●
jeżeli pomiędzy pierwszą i druga instrukcją nastapi np. przełączenie
procesów, druga instrukcja pobierze wartość zaktualizowaną przez
pierwszą
Zachowanie programu jest niedeterministyczne – sytuacje taka
nazywamy HAZARDEM
Ponieważ hazard wynika z umieszczenia w programie instrukcji
odczytującej rejestr po instrukcji zapisującej rejestr, ten typ hazardu
jest określany jako „odczyt po zapisie” (RAW hazard tj. read-afterwrite)
Konieczne jest wprowadzenie determinizmu w zachowaniu procesora,
czyli usunięcie hazardu
Usuwanie hazardu R-A-W (1)
●
Metoda” administarcyjna”
●
●
skutek wykonania instrukcji korzystającej z danego rejestru jako
źródłowego wcześniej niż w 3 instrukcje po instrukcji zapisującej rejestr
zostaje opisany w dokumentacji procesora jako nieokreślony
● programiście nie wolno użyć takiej sekwencji instrukcji
wada: bardzo często trzeba w programie wstawiać instrukcje puste
● Metoda ta jest niepraktyczna, gdyż na ogół instrukcje programów tworzą
sekwencje – łańcuchy, w których kolejne instrukcje korzystają z wyników
instrukcji poprzedzających.
Usuwanie hazardu R-A-W (2)
●
Wstrzymanie potoku po wykryciu hazardu
●
●
●
●
układ kombinacyjny (komparator) porównuje numery rejestrów źródłowych
instrukcji w stopniu RD z numerami rejestrów docelowych instrukcji w
stopniu ALU i MEM (stopień RD może oczytać rejestr zapisywany w tym
samym cyklu w stopniu WB).
w przypadku wykrycia zgodności, instrukcja zostaje zatrzymana w stopniu
RD
● stopnie IF i RD „stoją”
● pozostałe stopnie pracują normalnie, ze stopnia RD do ALU jest
„wstrzykiwana” instrukcja pusta
program wykonuje się poprawnie, bez konieczności dodania instrukcji
pustych
zależności między instrukcjami powodują opóźnienia
● w programach często występują sekwencje instrukcji zależnych
Usuwanie hazardu R-A-W (3) obejścia
●
●
Najbardziej efektywna metoda usuwania hazardu RAW wymaga nieco
większych nakładów sprzętowych, w postaci rozbudowy stopnia
odczytu i przeprowadzenia dodatkowych ścieżek danych ze stopni
ALU i MEM do stopnia RD
Wynik operacji arytmetycznej jest dostępny już w stopniu ALU
●
●
Obejścia – to szyny (ścieżki) poprowadzone ze stopni ALU i MEM do
stopnia RD
●
●
●
●
●
po obejściu jest przesyłany numer rejestru docelowego i wynik instrukcji
W ten sposób w stopniu RD można pobrać jako argumenty źródłowe
wartości rejestrów, zanim zostaną one zapisane do rejestrów procesora.
Logika odczytu w stopniu RD
●
●
Wartość wyniku instrukcji jest gotowa gdy następna instrukcja przebywa w
stopniu RD
Numer rejestru źródłowego jest porównywany z numerami rejestrów na
obejściach
priorytety: obejście z ALU, obejście z MEM, fizyczny rejestr procesora
Obejście ze stopnia WB jest zbędne
Obejścia eliminują hazard RAW bez wprowadzenia opóźnień
●
w R3000 zastosowano obejścia wg opisanego schematu
Obejścia - działanie
W przedstawionym
przykładzie obejścia ze
stopni ALU i MEM zawierają
wartości, które w przyszłości
zostaną zapisane do
rejestrów $5 i $4.
Instrukcja przebywająca w
stopniu RD specyfikuje jako
argumenty źródłowe właśnie
te rejestry.
Logika stopnia RD
spowoduje, że wartości
argumentów zostaną
pobrane nie z rejestrów $4 i
$5, a z obejść.
Opóźnienie wynikające z
dostępu do pamięci
●
●
Zakładamy, że procesor został wyposażony w obejścia eliminujące
hazard RAW
Rozważmy sekwencję instrukcji
●
●
●
●
lw $4
add $6, $5, $4
tym razem hazard RAW wynika z odwołania do pamięci
dana odczytana z pamięci będzie dostępna w stopniu MEM
obejścia redukują opóźnienie, ale go nie eliminują
● dana ze stopnia MEM może być przekazana obejściem
● kiedy instrukcja używająca danej jest w stopniu RD, instrukcja ładowana
jest dopiero w stopniu ALU
● Dostęp do pamięci nastąpi w stopniu MEM. Obejście ze stopnia ALU nie
może więc zawierać wyniku instrukcji ładowania.
● Wynik ten będzie dostępny na obejściu ze stopnia MEM, kiedy instrukcja
ładowania znajdzie się w stopniu MEM. Nie ma możliwości
przyspieszenia tej operacji, a obejścia nie są w stanie usunąć hazardu.
Problem ten jest nazywany opóźnieniem pomiędzy załadowaniem
danej z pamięci i jej użyciem (load-use penalty)
Opóźnienie wynikające z
dostępu do pamięci
●
●
Hazard wynikający z opóźnienia nie może zostać wyeliminowany bez
opóźnień
W MIPS R3000 instrukcja korzystająca z danej pobranej z pamięci nie
może być umieszczona bezpośrednio za instrukcja ładowania
●
●
●
Eliminacja hazardu wymaga wprowadzenia opóźnienia pomiędzy instrukcją
ładowania i instrukcją korzystającą z załadowanych danych.
zastosowano metodę administracyjną
W późniejszych wersjach MIPS, w tym w architekturze MIPS32 hazard jest
usuwany sprzętowo, poprzez wstrzymanie początku potoku
Instrukcje skoków w potoku
●
●
●
●
Określenie warunku skoku i obliczenie adresu docelowego następuje
w stopniu ALU, w połowie cyklu
W tym czasie w stopniu RD przebywa już instrukcja zapisana w
programie za instrukcją skoku
Zmiana PC dokonana w stopniu ALU wpływa natychmiast na działanie
stopnia IF, który pobiera instrukcję spod adresu docelowego skoku. W
potoku znalazła się jednak już jedna instrukcja za instrukcją skoku.
Instrukcja skoku może mieć wpływ dopiero na pobranie kolejnej
instrukcji
●
●
●
instrukcja pobrana po instrukcji skoku może zostać anulowana, ale zajmuje
czas procesora
Opóźnienie skoków w architekturze potokowej wynika z odległości
pomiędzy stopniem, w którym następuje skok (ALU) i stopniem
pobrania instrukcji
W przypadku R3000 opóźnienie to wynosi jeden cykl.
Redukcja opóźnienia skoków w
potoku
●
●
●
●
●
Technika redukcji opóźnienia używana w krótkich potokach polega na
zdefiniowaniu instrukcji skoku
Skok opóźniony (delayed branch) - „wykonaj instrukcję umieszczoną
za skokiem i skocz”
Za skokiem można umieścić dowolną instrukcję, która ma być
wykonana przed skokiem i od której nie zależy wykonanie skoku
Miejsce za instrukcją skoku, zawierające instrukcje wykonywane
niezależnie od realizacji skoku, nazywa się slotem opóźnienia (delay
slot)
Przy slocie opóźnienia o rozmiarze jednej instrukcji
prawdopodobieństwo wypełnienia slotu przez kompilator użyteczną
instrukcją jest rzędu 90%
●
w razie braku takiej instrukcji w slocie umieszcza się instrukcję pustą
Wydajność potoku
●
●
Teoretyczna wydajność potoku – jeden cykl na instrukcję
Czynniki powodujące opóźnienia
wewnątrz potoku
● hazardy usuwane inaczej niż przez obejścia
● ładowanie danych z pamięci
● skoki
● na zewnątrz potoku
● dostępy do hierarchii pamięci, których realizacja wymaga > 1 cyklu
Praktyczna wydajność osiągana przez procesory potokowe – ok. 1,2 cyklu na
instrukcję
●
●
Przyspieszenie potoku
●
●
Wraz z ulepszaniem technologii półprzewodnikowej wzrasta
dopuszczalna częstotliwość pracy układów.
Przy wzroście częstotliwości pracy odwołania do pamięci nie mogą
być wykonane w jednym cyklu
●
●
Złożoności niektórych stopni potoku uniemożliwia podniesienie
częstotliwości pracy
●
●
●
każde odwołanie powoduje wstrzymanie potoku, przez co potok działa
wolniej niż przy mniejszej częstotliwości
Każda architektura potoku, wraz z otoczeniem (hierarchią pamięci) ma
określoną częstotliwość graniczną, powyżej której albo procesor przestaje
działać, albo stopnie wymiany z pamięcią muszą czekać dodatkowy cykl na
zakończenie operacji. W efekcie przyspieszenie zegara jest albo
niemożliwe, albo przynosi spadek wydajności zamiast jej wzrostu.
Rozwiązaniem jest przebudowanie potoku poprzez zwiększenie liczby
stopni i zmianę szczegółów współpracy z pamięcią
Potok wydłużony o długości powyżej 6 stopni jest nazywany
superpotokiem
Budowa super potoku MIPS
R4000
MIPS R4000 posiada
potok wydłużony do
ośmiu stopni.
Dwie najistotniejsze
zmiany w stosunku do
R3000 – to rozbicie
stopni współpracujących
z hierarchiami pamięci
na dwa stopnie w
przypadku pobrania
instrukcji i trzy stopnie
dla odwołań do danych.
Superpotok – MIPS R4000
●
●
●
R4000 – 1989 – pierwszy mikroprocesor 64-bitowy
Zgodny programowo na poziomie binarnym z R3000
Superpotok 8-stopniowy
●
●
●
●
●
●
●
●
IF – Instruction First – początek pobierania Instrukcji
IS – Instruction Second – zakończenie pobierania instrukcji
RD – read -odczyt argumentów
EX – Execute – odpowiednik ALU w R3000
DF – Data first – początek odwołania do danych
DS – data second – Zakończenie transakcji z pamięcią danych
DTC – Data Tag Check – finalizacja odwołania
WB – Write Back – zapis wyniku do rejestru
Wydajność superpotoków
●
Większe i częstsze opóźnienia powodują, że wydajność wyrażona w
cyklach na instrukcję jest gorsza niż w przypadku krótkich potoków
●
●
typowa wydajność wynosi ok. 1,5 cyklu na instrukcję
Większa wartość CPI jest kompensowana wzrostem częstotliwości
pracy
●
Przyrost wydajności wynikający z wydłużenia potoku przy zachowaniu
parametrów technologicznych wynosi ok. 50%
Potokowa realizacja procesora
CISC
●
Architektura potokowa daje się łatwo zastosować, gdy:
●
●
●
●
●
●
●
Sekwencja czynności jest stała dla wszystkich instrukcji
● niektóre fazy niektórych instrukcji mogą być puste
Instrukcje maja stała długość i ich dekodowanie jest proste
Instrukcja realizuje co najwyżej jedno odwołanie do pamięci danych
Instrukcja ma jeden argument docelowy
Postulaty te nie są spełnione w modelach programowych CISC
Aby procesory CISC mogły konkurować z procesorami RISC pod
względem wydajności, konieczne stało się opracowanie potokowych
realizacji procesorów CISC.
Możliwości realizacji potokowej CISC
●
●
Budowa potoku zdolnego do wykonania instrukcji CISC
podział procesora na dwie części
● jednostka pobierająca instrukcje CISC i transkodująca je na prymitywy
RISC
● Jednostka wykonawcza RISC
Potok CISC
●
●
●
Potok przebudowany tak, by mógł wykonywać instrukcje CISC
● kilka stopni na początku potoku zajmuje się pobraniem instrukcji
dekodowaniem ich i wyliczaniem adresu efektywnego
● instrukcje o zmiennych długościach wymagają skomplikowanego
dekodera, niekiedy działającego w kilku cyklach
● Stopień odczytu argumentów pobiera je z rejestrów lub pamięci
● Stopień wykonani o skomplikowanej budowie – wykonuje poszczególne
instrukcje w rożnej liczbie cykli
● stopień zapisu zapisuje wyniki do rejestru lub pamięci
● skomplikowany interfejs pamięci z dwiema ścieżkami dostępu
Wydajność: średni czas wykonani instrukcji – ok. 2 cykli
● potok często zatrzymuje się
Przykłady: Intel i486, Motorola MC68040 – koniec lat 80-tych
Potok CISC- Intel i486
Struktura poszczególnych stopni jest w tym przypadku dużo bardziej złożona, a
poszczególne instrukcje mogą spędzać w niektórych stopniach po kilka, a nawet
kilkadziesiąt cykli (dotyczy to zwłaszcza stopnia EX).
Procesor z transkodowaniem
instrukcji
●
Jednostka transkodująca pobiera instrukcje CISC i zamienia je na
sekwencje instrukcji podobnych do RISC
●
●
●
●
Jednostka wykonawcza wykonuje instrukcje typu RISC
●
●
Dla prostych instrukcji – translacja 1:1
nieco bardziej złożone instr. - zamieniane na 2:4 instr. RISC
Instrukcje skomplikowane wykonywane jako procedury pobierane z pamięci
ROM umieszczonej w procesorze
różnice w stosunku do „czystego RISC” występujące w niektórych
realizacjach
● instrukcje arytmetyczne z jednym odwołaniem do argumentu w pamięci
● Operacje stosowe (dwa argumenty docelowe w tym SP)
Przykłady:
●
●
pierwsze realizacje : NezGen Nx586, IDT C6 (1995..97)
procesory x86 też działają na tej zasadzie
Procesor z transkodowaniem
instrukcji – IDT C6
Procesor IDT C6 jest najprostszym
przykładem procesora x86 z transkodowaniem
instrukcji.
Proste instrukcje CISC są zamieniane w jedną
lub kilka instrukcji RISC w stopniu translatora.
Bardziej skomplikowane instrukcje są
zamieniane na RISCową instrukcję wywołania
procedury z wbudowanej pamięci ROM.
Zwykłe instrukcje trafiają wprost z kolejki
instrukcji do pamięci.
Wywołania procedur powodują uruchomienie
pobierania instrukcji RISCowych z pamięci
ROM.
Od potoku do superskalara
●
●
●
●
Idealna teoretyczna wydajność procesorów potokowych wynosi 1 CPI
Procesor nie może wykonać instrukcji w ułamku cyklu, ale może
wykonać więcej niż jedna instrukcję w czasie jednego cyklu
Procesor taki musi mieć więcej niż jeden potok wykonawczy
Procesory wielopotokowe są nazywane procesorami superskalarnymi
lub superskalarami
Struktura procesora
superskalarnego
Budowa i działanie procesora
superskalarnego
●
●
Pierwsze stopnie pobierają i dekodują równocześnie kilka instrukcji
Stopień inicjujący wykonanie kieruje instrukcje do indywidualnych
potoków wykonawczych
●
●
●
●
Potoki wykonawcze wykonują pojedyncze instrukcje
Stopień porządkujący decyduje o zatwierdzeniu wykonania instrukcji i
modyfikacji widocznego programowo rejestru PC
●
●
każdy z potoków wykonuje po jednej instrukcji
nie zawsze udaje się skierować instrukcje do każdego potoku
nieobecny w prostych superskalarach
Stopień zapisu dokonuje nieodwracalnej modyfikacji kontekstu
programowego (rejestrów i pamięci)
●
w prostych superkalarach, bez stopnia porządkującego, stopnie zapisu są
oddzielne dla poszczególnych potoków
Rodzaje procesorów
superskalarnych
●
Pseudosuperskalar
●
●
Superskalar z kolejnym wykonaniem instrukcji (in-order execution)
●
●
np. Intel Pentium – 1993
Superskalar z kolejnym rozpoczynaniem i niekolejnym kończeniem
instrukcji (in-order issue, out-of-order completion)
●
●
np. Intel 860 – 1989
np. Cyrix Cx8x86 – 1994
Superskalar z niekolejnym wykonywaniem instrukcji (out-of-order
execution)
●
●
np. Intel Pentium Pro – 1995
niemal wszystkie współczesne procesory uniwersalne
Pseudosuperskalar
●
●
Procesor pseudosuperskalarny nie ma możliwości decydowania o
równoczesnym wykonaniu instrukcji
● decyzję podejmuje programista lub kompilator
● informacja o możliwości równoczesnego wykonania zawarta w
kodzie operacyjnym instrukcji
Przykład - Intel 860
● dwa potoki wykonawcze – stałopozycyjny i zmiennopozycyjny
● instrukcje o długości 32 bitów, pobierane parami
● równoczesne wykonanie obu instrukcji w parze jest możliwe gdy:
● pierwsza jest stałopozycyjna, z druga -zmiennopozycyjna
● instrukcja zmiennopozycyjna na w kodzie operacyjnym ustawiony
bit zezwolenia na równoległe wykonanie
● obie instrukcje wykonują się równocześnie
● nie występuje sytuacja, gdy jeden z potoków wykonawczych
zatrzymuje się, a drugi kontynuuje pracę
Superskalar z kolejnym
wykonaniem instrukcji
●
Procesor decyduje o możliwości równoległego wykonania instrukcji
●
●
●
Poszczególne potoki mogą być identyczne, podobne bądź różne
●
●
●
wykonanie jest możliwe, gdy instrukcje nie zależą od instrukcji
poprzedzających kierowanych do wykonania w tym samym cyklu
liczba instrukcji kierowanych do wykonania zależny ponadto od liczby i
rodzajów dostępnych potoków
jeden potok wykonuje wszystkie instrukcje, drugi – tylko prostsze (Intel
Pentium)
Oddzielne potoki dla różnych instrukcji, np. stałopozycyjnych,
zmiennopozycyjnych, wymiany z pamięcią, skoków (np. SuperSPARC I,
Alpha 21064)
Potoki pracują synchronicznie - wstrzymanie jednego powoduje
równoczesne wstrzymanie wszystkich
Superskalar z kolejnym
wykonaniem instrukcji
●
Kierowanie instrukcji do wykonania
●
●
po równoległym pobraniu grupy kilku (2 lub 4) instrukcji są one kierowane
do wykonania równocześnie lub jedna po drugiej, do czasu rozpoczęcia
wykonywania wszystkich instrukcji z grupy, następnie rozpoczyna się
kierowanie do wykonania instrukcji z następnej grupy
● np. Alpha 21064
● wydajność zależy od ustawienia instrukcji w grupy
● łatwa konstrukcja stopnia szeregującego
tzw. okno instrukcji – w każdym cyklu stopień szeregujący ma do
dyspozycji kilka instrukcji, z których co najmniej pierwsze kieruje do
wykonania, w następnym cyklu następuje dobieranie instrukcji tak że w
każdym cyklu można potencjalnie rozpocząć taką samą liczbę instrukcji
● np. Intel Pentium (P5) SuperSPARC I
● Większa wydajność opłacona komplikacja stopnia szeregującego
Superskalar z kolejnym
rozpoczynaniem i niekolejnym
kończeniem
●
●
●
Instrukcje są pobierane i dekodowane po kilka sztuk w kolejności
programowej
Stopień szeregujący rozpoczyna wykonywanie w kolejności
programowej
Po skierowaniu instrukcji do potoków wstrzymanie jednego potoku nie
powoduje wstrzymania pozostałych
●
●
●
Wzrost wydajności dzięki lepszemu wykorzystaniu potoków
Przykład Cyrix 6x86 (1995)
●
●
instrukcje mogą być kończone w innej kolejności od programowej
wydajność o ok. 30% wyższa od Intel P5 przy podobnej strukturze
Problem
●
●
Zmiana kolejności kończenia instrukcji może wprowadzać problemy
synchronizacyjne
O nich później
Superskalar z niekolejnym
wykonaniem instrukcji
●
●
Zdekodowane instrukcje są gromadzone w stopniu szeregującym
Skierowanie instrukcji do wykonania zachodzi wtedy, gdy są gotowe
argumenty źródłowe
●
●
wykonanie może być rozpoczynane w kolejności innej niż programowa
Dwa rozwiązania szeregowania
●
●
centralny bufor instrukcji przed rozejściem na indywidualne potoki
● kosztowny w realizacji
● zapewnia równe obciążenie przy kilku identycznych potokach
● np. Intel P3, AMD k6
bufory w pierwszych stopniach potoków wykonawczych (tzw. stacje
rezerwacyjne- algorytm Tomasulo)
● proste w realizacji ale powoduje suboptymalne wykorzystanie potoków
● np. AMD K5
Superskalar z niekolejnym
wykonaniem instrukcji
●
Procesor w każdej chwili musi mieć ważną wartość PC i tym samym
instrukcję do której program został wykonany
●
●
●
●
Dwa ostatnie stopnie superskalara
●
●
●
instrukcję uznaje się za ostatecznie wykonaną jeśli również wszystkie
instrukcje ja poprzedzające zostały wykonane
instrukcja po przejściu przez potoki wykonawcze trafia do stopnia RETIRE,
gdzie oczekuje na zakończenie instrukcji poprzedzających
przed ostatecznym zakończeniem wykonania instrukcja nie może w
sposób trwały modyfikować kontekstu procesora ani pamięci
Oczekiwanie na zakończenie wykonania instrukcji poprzedzający
nieodwracalna modyfikacja kontekstu
Niemal wszystkie współczesne procesory do komputerów
uniwersalnych wykonują instrukcje nie w kolejności
●
np. AMD K8, Intel Pentium 4, Intel core