You are on page 1of 35

Architektura Komputerów

Wykład 9 – Redukcja opóźnień w


procesorach superpotokowych i
superskalarnych

Krzysztof Bielawski

Katedra Systemów Czasu


Rzeczywistego

pokój 020

Architektura Komputerów
Plan wykładu

Opóźnienia w architekturach superpotokowych i


superskalarnych
Redukcja opóźnień skoków
Redukcja opóźnień danych

2
Opóźnienia w procesorach superpotokowych i
superskalarnych

Duża liczba stopni potoków powoduje znaczące opóźnienia


Opóźnienia wyraża się proporcjonalnym spadkiem wydajności w
porównaniu z idealnym wykonaniem programu bez opóźnień
W architekturach jednopotokowych bierze się pod uwagę liczbę
straconych cykli procesora, która jest równa liczbie „utraconych”
instrukcji
W architekturach wielopotokowych liczbę straconych cykli należy
pomnożyć przez liczbę potoków

3
Opóźnienia skoków

Ze statystyki wynika, że skoki stanowią od 7 do 14% wszystkich


wykonywanych instrukcji
Dla dalszych rozważań przyjmiemy, że skoki stanowią 10%
instrukcji
W bardziej złożonych architekturach opóźnienia skoków
paraliżują działanie procesora
Niezbędne są mechanizmy umożliwiające znaczącą redukcję
opóźnień

4
Spekulatywne wykonanie instrukcji

Współczesne procesory są wyposażone w mechanizmy


spekulatywnego wykonania instrukcji
Instrukcja jest wykonywana na podstawie przewidywania, że
powinna być wykonana (np. po instrukcji skoku)
W przypadku błędnego przewidywania następuje anulowanie
instrukcji i wszelkich efektów jej wykonania
Procesory umożliwiają wielopoziomową spekulację – wykonanie
instrukcji po kilku nierozstrzygniętych skokach
Jeśli w procesorze przebywa równocześnie 100 instrukcji, to
wśród nich jest 10 skoków
Oznacza to, że niemal przez cały czas wykonanie instrukcji ma
charakter spekulatywny
Bez spekulacji wydajność byłaby ok. 10 – krotnie mniejsza

5
Terminolgia

Wykonanie skoku – wykonanie instrukcji skoku, które może, ale


nie musi, powodować zmianę wartości PC
Realizacja skoku – zmiana zawartości PC
Skok warunkowy przy niespełnionym warunku zostaje
wykonany, ale nie zrealizowany
Adres skoku:
Statyczny – zawarty w instrukcji w postaci stałej
Dynamiczny – zmienna wartość w rejestrze lub pamięci (w tym na
stosie – powroty z procedur)
Skoki z adresem statycznym:
Względne – w obrazie instrukcji jest zapamiętane przemieszczenie
względem nPC jako liczba ze znakiem (U2)
Bezwzględne – w obrazie instrukcji jest zapamiętany adres
docelowy, ładowany do PC

6
Przewidywanie skoków – zasady

Przewidywanie skoków polega na przewidzeniu wykonania


instrukcji skoku przed faktycznym jej wykonaniem
Po przewidzeniu skoku procesor spekulatywnie wykonuje
instrukcje po skoku (zrealizowanym lub niezrealizowanym)
Rzeczywiste wykonanie instrukcji skoku umożliwi sprawdzenie
poprawności przewidywania
Jeśli przewidywanie było poprawne:
Skok został wykonany bez opóźnień lub ze zmniejszonym
opóźnieniem
Instrukcje wykonane spekulatywnie mogą zostać zatwierdzone
Jeśli przewidywanie było błędne:
Instrukcje wykonane spekulatywnie są anulowane, a czas
przeznaczony na ich wykonanie jest czasem opóźnienia skoku
Następuje wykonanie właściwego strumienia instrukcji

7
Przewidywanie skoków – aspekty

Przewidywanie sposobu wykonania skoku warunkowego


(zrealizowany/niezrealizowany)
Przewidywanie adresu docelowego skoku
Przewidywanie wystąpienia instrukcji skoku w strumieniu
instrukcji

8
Możliwość przewidywania skoków

Aby wykonać skok, procesor musi:


Wiedzieć, że występuje instrukcja skoku
Znać adres docelowy
Znać warunek wykonania dla skoków warunkowych
Możliwość wykonania bez spekulacji
Skoki statyczne bezwarunkowe – natychmiast po stwierdzeniu
wystąpienia instrukcji skoku
Skoki statyczne warunkowe – po wyznaczeniu warunku
Adres docelowy znany bezpośrednio po zdekodowaniu
Skoki dynamiczne – po wyznaczeniu adresu docelowego
Przewidywanie może obejmować:
Dla wszystkich skoków – wystąpienie skoku, adres docelowy
skoku
Dla skoków warunkowych – dodatkowo sposób wykonania

9
Przewidywanie statyczne i dynamiczne

Statyczne – zachodzi po zdekodowaniu instrukcji skoku, nie


wymaga gromadzenia wiedzy o historii programu
Przewidywanie realizacji skoku warunkowego
Dynamiczne – na podstawie wiedzy o historii wykonania
programu
Przewidywanie wystąpienia instrukcji skoku przed jej pobraniem
Przewidywanie adresu docelowego skoków statycznych i
dynamicznych
Przewidywanie realizacji skoku warunkowego

10
Statyczne przewidywanie realizacji skoku

Przewidywanie przez kompilator lub programistę


Kompilator języka wysokiego poziomu lub programista piszący program
w asemblerze zna prawdopodobieństwo wykonania skoku warunkowego
Informacja ta może zostać umieszczona w programie, o ile model
programowy uwzględni dwa warianty skoków warunkowych
Skoki prawdopodobne
Skoki nieprawdopodobne
Przykłady: Alpha AXP, Intel Pentium 4
Przewidziane przez procesor
Z analizy własności programów wynika, że ponad 60% skoków
warunkowych w tył jest realizowanych, a skoków w przód –
nierealizowanych
Skoki warunkowe są zapisywane jako względne – bit znaku
przemieszczenia może zostać użyty przez procesor jako znacznik
prawdopodobieństwa skoku

11
Dynamiczne przewidywanie wystąpienia skoku
Wymaga wprowadzenia do struktury procesora dodatkowych
bloków sprzętowych, gromadzących informację o historii
wykonania programu
Bufor docelowy skoków (BTB – Branch Target Buffer)
Gromadzi informację o pewnej liczbie ostatnio wykonywanych skoków
Działa na zasadzie podobnej do kieszeni
Często realizowany w powiązaniu z kieszenią kodu
Przy każdej realizacji skoku adres, pod którym jest położona
instrukcja skoku jest odnotowany w BTB
Na ogół razem z adresem docelowym skoku
Przy każdym pobraniu instrukcji stopień pobrania sprawdza, czy
adres pobrania został wcześniej zanotowany jako adres instrukcji
skoku
Jeśli tak – stopień pobrania może w następnym cyklu „wykonać” skok

12
Bufor docelowy skoków - działanie

Przy wykonaniu skoku do adresu Y położonego pod adresem X


w buforze docelowym zostaje zapamiętana para X,Y
Równocześnie z pobraniem każdej instrukcji następuje
przeszukanie bufora z wartością scanPC jako kluczem
Jeśli w buforze znajduje się wartość X=scanPC, to na końcu
cyklu następuje załadowanie Y do scanPC
W następnym cyklu stopień pobrania pobierze instrukcję spod
przewidywanego adresu docelowego skoku
Opisany schemat działa poprawnie jeżeli:
Pod adresem X nadal znajduje się ta sama instrukcja skoku
Adres docelowy skoku pozostaje niezmienny
Warunek wykonania (dla skoku warunkowego) ma tę samą
wartość
Przy udanym przewidywaniu skok wykonuje się bez opóźnień

13
Bufor docelowy - ograniczenia

Bufor docelowy w podstawowej formie nie może przewidywać:


Skoków dynamicznych
Skoków warunkowych przy różnych wartościach warunku w
kolejnych wykonaniach
Zastosowanie skoków dynamicznych
Powroty z procedur – b. częste, niezbędne
Wskaźniki na funkcję, w tym metody wirtualne – zależne od
przyjętego stylu programowania
Jedna z możliwych realizacji konstrukcji typu switch – zależne od
kompilatora
Skoki dynamiczne mogą być przewidywane w buforze
docelowym jako statyczne
Działa to dość dobrze dla wskaźników na funkcje
Potrzebny inny mechanizm przewidywania powrotów z procedur

14
Przewidywanie adresów powrotów z procedur

Szczególnie potrzebne w procesorach CISC


Odczyt śladu ze stosu jest czasochłonny
Założenie: adres powrotu jest ostatnim zapamiętanym śladem
Implikuje to wymaganie, że każdej instrukcji skoku ze śladem
odpowiada instrukcja powrotu
Przewidywanie adresu powrotu nie działa dla par: PUSH-RET,
CALL-POP

15
Sprzętowy stos powrotów
Niewielki, niewidoczny programowo stos (bufor LIFO), umieszczony
w procesorze
Pojemność: 8..16 elementów
Wykonanie instrukcji skoku ze śladem powoduje umieszczenie na
stosie powrotów wartości śladu
Dzieje się to niezależnie od przesłania śladu na stos pamięci (CISC)
lub do rejestru (RISC)
Napotkanie instrukcji powrotu powoduje zdjęcie śladu ze stosu
Przy przewidywaniu dynamicznym akcja ta jest inicjowana przez BTB
przy pobraniu instrukcji – powrót nie wnosi żadnych opóźnień
Przy przewidywaniu statycznym spekulatywnym powrót następuje po
zdekodowaniu instrukcji powrotu
Wykonanie instrukcji powrotu weryfikuje poprawność spekulacji
Jeśli adres ze stosu sprzętowego jest różny od adresu powrotu –
następuje anulowanie całego ciągu instrukcji

16
Sprzętowy stos powrotów – efektywność

Stos powrotów działa skutecznie dla fragmentów programu, w


których zagłębianie procedur nie przekracza pojemności stosu
Każda „niesparowana” instrukcja CALL lub RETURN powoduje
desynchronizację stosu
Wszystkie następne powroty będą przewidywane błędnie, aż do
zapełnienia całego stosu nowymi śladami

17
Dynamiczne przewidywanie realizacji skoku

Sam bufor docelowy przewiduje skoki warunkowe jako


bezwarunkowe
Skoki niezrealizowany po zrealizowanym jest przewidziany błędnie
Lepsze przewidywanie realizacji skoków wymaga implementacji
predyktora, decydującego o tym, czy procesor ma traktować
skok jako realizowany czy nierealizowany
Skróty i konwencje:
T(Taken) – skok realizowany
NT(Not Taken) – skok nierealizowany
PT (Predict Taken) – skok przewidywany jako realizowany (na
grafach – kolor zielony)
PNT (Predict Not Taken) – skok przewidywany jako
nierealizowany (na grafach - kolor czerwony)

18
Dynamiczne predyktory ralizacji skoku
Automaty decydujące o sposobie spekulatywnego wykonania przewidywanego
skoku warunkowego na podstawie historii wykonania programu
Działanie predyktorów
Deterministyczne wykonanie (rozstrzygnięcie skoku) przez procesor
powoduje modyfikację stanu predyktora
Spekulatywne wykonanie skoku na podstawie stanu predyktora
Klasyfikacja predyktorów
Wg. konstrukcji elementarnego automatu predyktora
dwustanowe
czterostanowe
Wg. sposobu wiązania instrukcji skoku z automatem predyktora:
Jednopoziomowe – prawdopodobieństwo bezwarunkowe
Dwupoziomowe – prawdopodobieństwo warunkowe
Trójpoziomowe – prawdopodobieństwo z adaptacją schematu
przewidywania

19
Predyktor dwustanowy - budowa

Stany: T, NT
Predyktor przydzielany do
instrukcji skoku z chwilą pierwszej
realizacji
Kolejne przewidywanie skoku jast
takie samo, jak było ostatnie
wykonanie

20
Predyktor dwustanowy - charakterystyka

Błędne przewidywanie skoku


zamykającego pętlę
zagnieżdżoną przy pierwszym
i ostatnim wykonaniu
Istotne przy pętlach
iterowanych niewielką liczbę
razy
Błędne przewidywanie po
każdym odstępstwie od
typowego wykonania
100% błędne przewidywanie
skoków realizowanych co
drugi raz

21
Stany:
ST – Strongly Taken
WT – Weakly Taken
WNT – Weakly Not Taken
SNT – Strong Not Taken
Pierwsza realizacja skoku
wprowadza predyktor w stan
ST
Zmiana przewidywania
następuje po dwóch kolejnych
takich samych wykonaniach

22
Predyktor czterostanowy - charakterystyka

Błędne przewidywanie skoku


zamykającego pętle przy
ostatnim wykonaniu
Istotne przy pętlach
iterowanych niewielką liczbę
razy
Poprawne przewidywanie po
każdym jednokrotnym
odstępstwie od typowego
wykonania
Skoki realizowane co drugi raz
przewidywane poprawnie w
50%

23
Ograniczenia predyktorów jednopoziomowych

Brak możliwości trafnego przewidzenia wszystkich iteracji skoku


zamykającego pętlę
Szczególnie istotne przy pętlach iterowanych niewielką liczbę razy,
często spotykanych w oprogramowaniu
Brak możliwości trafnego przewidzenia skoków wykonywanych
cyklicznie
np. dwa razy realizowany, następnie dwa razy nierealizowany

24
Predyktory dwupoziomowe

Przechowują informację o prawdopodobieństwie warunkowym


„Jak wykona się skok, jeśli ostatnio raz był zrealizowany i trzy razy
niezrealizowany”
Predyktor elementarny nie jest bezpośrednio związany z
instrukcją skoku
Wybór predyktora zachodzi na podstawie adresu instrukcji skoku i
historii wykonań
Rejestr historii:
Rejestr przesuwający o długości 8..16 bitów, zawierający historię
wykonań (T/NT) dla ostatnich wykonań pojedynczego lub wielu
skoków
Predyktory dwupoziomowe i trójpoziomowe są nazywane
korelatorami skoków

25
Predyktor dwupoziomowy gLocal

26
Predyktor dwupoziomowy gShare

27
Predyktory dwupoziomowe - własności

Powolne „uczenie się” predyktora


Trafne przewidywanie wymaga często wielu wykonań skoku
Możliwość poprawnego przewidywania sekwencji wykonań o
długości równej co najmniej długości rejestru historii
W tym możliwość poprawnego przewidywania zamknięć pętli
iterowanych np. 8 razy
Niewrażliwość na pojedyncze nieregularności wykonania
Trafność przewidywania typowo około 95% lub więcej
Predyktor gLocal lepiej przewiduje pętle iterowane niewielką
liczbę razy
Predyktor gShare lepiej przewiduje rozejścia zależne od
wartości danych
O ile kilka kolejnych rozejść jest ze sobą powiązanych

28
Predyktory trójpoziomowe

Predykot trójpoziomowy jest hybrydą dwóch predyktorów,


zwykle gLocal i gShare
Dwa schematy przewidywania dla każdego skoku, z
możliwością wybory schematu
Zmiana wyboru schematu dla danego skoku zachodzi, gdy
dotychczas wybrany schemat przewidział skok błędnie, a
alternatywny schemat - poprawnie
Trafność przewidywania typowo powyżej 96%

29
Redukcja opóźnień pobierania danych z pamięci

W architekturach superskalarnych samo rozsunięcie instrukcji


ładującej daną i instrukcji korzystającej z danej nie maskuje
opóźnienia
Niezbędne pobieranie danych z pamięci do kieszni lub buforów
„na zapas” (Data Prefech)
Realizacje:
Pobieranie inicjowane przez oprogramowanie
Automatyczne (spekulatywne) pobieranie przez procesor

30
Kieszenie a wydajność

Automatyczne umieszczenie danych w kieszeni nie zawsze przyspiesza


wykonanie programu
Przykład – program przetwarzający dużą tablicę T1 przy użyciu danych z
mniejszej tablicy T2
T2 mieści się w kieszeni L1
T1 mieści się w kieszeni L2, nie mieści się w kieszeni L1
Odwołania do T1 powodują usuwanie elementów T2 z kieszeni L1
Efektywny współczynnik trafień L1 wynosi 0
Rozwiązanie: buforować T1 tylko w kieszeni L2, a T2 – również w L1
Szybki dostęp do T1 (100% trafień w L1)
Wolniejszy dostęp tylko do T1 (w kieszeni L2)
Potrzebna jest możliwość sterowania buforowaniem danych z poziomu aplikacji
Wymaga to ujawnienia obecności kieszeni w modelu programowym
Program powinien brać pod uwagę konfigurację komputera, na którym
działa

31
Instrukcje pobierania danych

Instrukcje nie mają skutku w modelu programowym – nie


modyfikują kontekstu procesora
Implementacja opcjonalna – prostsze procesory mogą je
wykonywać jako puste
Instrukcje mają charakter sugestii (podpowiedzi),
umożliwiających optymalizację działania procesora
Jeden argument – adres pamięci
Wykonanie instrukcji polega na przesłuchaniu danych z pamięci
do kieszeni lub bufora, ew. zmianie stanu linii kieszeni
Instrukcja „pobrania do zapisu” tylko alokuje linie w kieszeni, które
mają być całkowicie zapełnione nowymi danymi – bez
późniejszego zapisu danych ich wartość będzie nieokreślona
Czas i sposób wykonania mogą zależeć od bieżącego
obciążenia interfejsu pamięci i kieszeni

32
Instrukcje PREFETCH - x86

PREFETCHNTA – pobranie danych z pominięciem kieszeni (do


niewidocznego bufora danych w procesorze)
Dane będą użyte jednorazowo i nie powinny powodować
usunięcia innych obiektów z kieszeni
PREFETCH0 – pobranie danych do kieszeni poziomy 1. i ew.
innych poziomów
PREFETCH1 – pobranie danych do kieszeni poziomu 2. i ew.
następnych
Dane nie mieszczą się w L1 i nie powinny jej zajmować
PREFETCH2 – pobranie danych do kieszeni poziomu 3. i ew.
następnych
Dane nie mieszczą się w L2 i nie powinny jej zajmować

33
Automatyczne pobieranie danych przez procesor

Odpowiedni moduł sprzętowy wykrywa wzorce odwołań do


pamięci realizowanych przez program
Na podstawie rozpoznanego wzorca procesor samoczynnie
wykonuje operację pobierania danych analogiczną do
inicjowanej przez instrukcję PREFETCH
Mechanizm zaimplementowany m.in. w procesorach serii
Pentum 4 i Core

34
Dziękuję za uwagę.

35

You might also like