Architektura Systemów Komputerowych Wykład 7: Potokowe jednostki wykonawcze Dr inż. Marek Mika Państwowa Wyższa Szkoła Zawodowa im. Jana Amosa Komeńskiego W Lesznie
Plan Budowa potoku Problemy synchronizacji i opóźnienia w potokach Superpotok Opóźnienia w superpotoku Potokowe realizacje procesorów CISC
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 wykonanie instrukcji zajmuje czas czterech cykli zegara, 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ń (więcej w dalszej części wykładu) Architektura Harvard-Princeton rozdzielone górne warstwy hierarchii pamięci, wspólna pamięć operacyjna
Potok MIPS R3000 IF IM RD R ALU MEM DM WB
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ętywane w rejestrach i przekazywane do kolejnych stopni potoku, w tym. m.in.: sygnały sterujące numer rejestru docelowego
Wykonanie sekwencji instrukcji w potoku Instrukcja Cykl T1 T2 T3 T4 T5 T6 T7 T8 T9 I1 IF RD ALU MEM WB I2 IF RD ALU MEM WB I3 IF RD ALU MEM WB I4 IF RD ALU MEM WB I5 IF RD ALU MEM WB I6 IF RD ALU MEM I7 IF RD ALU
Synchronizacja potoku Rozpatrzmy wykonanie sekwencji instrukcji: addu $4, $3, $2 addu $6, $5, $4 druga instrukcja korzysta z argumentu źródł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ść niezaktualizowana przez pierwszą instrukcję nie ma pewności, czy wykonanie programu użytkowego nie zostanie przerwane pomiędzy pierwszą i drugą 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 drugą instrukcją nastąpi np. przełączenie procesów, druga instrukcja pobierze wartość zaktualizowaną przez pierwszą Zachowanie programu jest niedeterministyczne sytuację taką 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 (read-after-write hazard albo RAW hazard) Konieczne jest wprowadzenie determinizmu w zachowaniu procesora, czyli usunięcie hazardu
Usuwanie hazardu R-A-W (1) Metoda administracyjna skutek wykonania instrukcji korzystającej z danego rejestru jako źródłowego wcześniej niż w trzy instrukcje po instrukcji zapisującej rejestr zostaje opisany w dokumentacji procesora jako nieokreślony programiście nie wolno użyć takiej sekwencji instrukcji wada metody bardzo często trzeba w programie wstawiać instrukcje puste
Usuwanie hazardu R-A-W (2) Wstrzymywanie potoku po wykryciu hazardu układ kombinacyjny porównuje numery rejestrów źródłowych instrukcji w stopniu RD z numerami rejestrów docelowych instrukcji w stopniu ALU i MEM 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 dodawania instrukcji pustych zależności między instrukcjami powodują opóźnienia w programach często występują sekwencje instrukcji zależnych
Działanie potoku MIPS R3000 - przypomnienie Zapis rejestru następuje w połowie cyklu, który instrukcja spędza w stopniu WB Odczyt rejestru źródłowego rozpoczyna się w połowie cyklu, który instrukcja spędza w stopniu RD Dana zapisana przez instrukcję znajdującą się w stopniu WB może być odczytana w tym samym cyklu przez instrukcję znajdującą się w stopniu RD Wystarczą dwa cykle odstępu pomiędzy parą instrukcji zależnych
Usuwanie hazardu R-A-W (3) obejścia Wynik operacji arytmetycznej jest dostępny już w stopniu ALU wartość wyniku instrukcji jest gotowa, gdy następna instrukcja przebywa w stopniu RD Obejścia to szyny poprowadzone ze stopni ALU i MEM do stopnia RD po obejściu jest przesyłany numer rejestru docelowego i wynik instrukcji Logika odczytu 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 wprowadzania opóźnień! w R3000 zastosowano obejścia wg. opisanego schematu
Obejścia - działanie IF IM addu $6, $5, $4 $4 R addu $4, $3, $2 addu $5, $7, $8 $5 DM WB
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 ładowania jest dopiero w stopniu ALU 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 instrukcją ładowania 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 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
Redukcja opóźnienia skoków w potoku Technika redukcji opóźnienia używana w krótkich potokach polega na zredefiniowaniu 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 więcej niż 1 cyklu Praktyczna wydajność osiągana przez procesory potokowe ok. 1.2 cyklu na instrukcję
Przyspieszanie potoku Przy wzroście częstotliwości pracy odwołania do pamięci nie mogą być wykonane w jednym cyklu każde odwołanie powoduje wstrzymanie potoku, przez co potok działa wolniej, niż przy mniejszej częstotliwości Złożoność niektórych stopni potoku uniemożliwia podniesienie częstotliwości pracy 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 superpotoku MIPS R4000 IF IS IM R RD EX DF DS DM DTC WB
Superpotok MIPS R4000 R4000 rok 1989 pierwszy mikroprocesor 64-bitowy Zgodny programowo na poziomie binarnym z R3000 Superpotok 8-stopniowy IF Instruction First początek pobrania instrukcji IS Instruction Second zakończenie pobrania 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
Współpraca z pamięcią Odwołania do pamięci rozbite na dwie fazy Pamięć ma budowę potokową dostęp następuje w dwóch cyklach zegara taki podział cyklu dostępu jest naturalny z punktu widzenia budowy wewnętrznej pamięci (dodatkowy rejestr na wyjściu matrycy pamięci) równocześnie wykonywane są dwa dostępy do pamięci (druga połowa pierwszego i pierwsza drugiego)
Opóźnienia i synchronizacja superpotoku Topologia superpotoku jest taka sama jak potoku brak nowych problemów synchronizacyjnych Większa liczba stopni powoduje zwiększenie odległości, z których wynikają hazardy i opóźnienia opóźnienia mierzone w cyklach są większe, niż w przypadku krótkiego potoku potrzebna większa liczba obejść Opóźnienie pomiędzy załadowaniem danej i jej użyciem oraz opóźnienie skoków znacznie większe, niż w krótkim potoku
Opóźnienie danych w superpotokach Przy zastosowaniu obejść opóźnienie wynosi 3 cykle Nie jest ono szczególnie krytyczne procesory potokowe mają zwykle wiele rejestrów skalarne obiekty lokalne procedury są umieszczone w rejestrach Odwołania do pamięci: przeładowanie rejestrów w epilogu procedury zawartość rejestrów potrzebna po wykonaniu kilku instrukcji dostęp do struktur danych (np. tablic) dane często potrzebne natychmiast opóźnienie spowalnia wykonanie programu Wyższa częstotliwość pracy powoduje, że opóźnienia występujące na zewnątrz potoku (wyrażone w cyklach) są większe
Opóźnienie skoków w superpotokach Rozmiar slotu opóźnienia w superpotokach jest większy niż w krótkich potokach dla MIPS R4000 2 Prawdopodobieństwo wypełnienia całego slotu użytecznymi instrukcjami nie przekracza 20% Skok opóźniony o dwa cykle nie jest dobrym rozwiązaniem problemu opóźnienia skoków dodatkowo powstawałby problem zgodności wstecznej oprogramowania W superpotokach niepowstałych na bazie wcześniejszych implementacji potokowych nie stosuje się skoków opóźnionych Właściwą metodą redukcji opóźnienia w superpotokach jest przewidywanie skoków
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 mają stałą 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 Możliwości realizacji potokowej CISC budowa potoku zdolnego do wykonywania instrukcji CISC podział procesora na dwie części: jednostka pobierająca instrukcje CISC i transkodująca je na prymitywny RISC jednostka wykonawcza RISC
Potok CISC Potok przebudowany tak, by mógł wykonywać instrukcje CISC kilka stopni na początku potoku zajmuje się pobieraniem 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 argumenty z rejestrów lub pamięci stopień wykonania o skomplikowanej budowie wykonuje poszczególne instrukcje w różnej liczbie cykli stopień zapisu zapisuje wynik do rejestru lub pamięci skomplikowany interfejs pamięci z dwiema ścieżkami dostępu Wydajność: średni czas wykonania instrukcji około dwóch cykli potok często zatrzymuje się Przykłady Intel i486, Motorola MC68040 koniec lat 80tych XX w.
Potok CISC Intel i486 Fetch ID1 ID2 EX WB Fetch pobranie instrukcji do bufora instrukcji ID1 wstępne dekodowanie, określenie długości ID2 obliczanie adresów EX wymiana z pamięcią, odczyt rejestrów, operacja arytmetyczna lub logiczna stopień bardzo skomplikowany, w wielu instrukcjach wykonanie wielofazowe WB zapis wyniku do rejestrów
Procesor z transkodowaniem instrukcji Jednostka transkodująca pobiera instrukcje CISC i zamienia je na sekwencje instrukcji podobnych do RISC dla prostych instrukcji translacja 1:1 nieco bardziej złożone instrukcje zamieniane na 2 4 instrukcji RISC instrukcje skomplikowane wykonywane jako procedury pobierane z pamięci ROM umieszczonej w procesorze Jednostka wykonawcza wykonuje instrukcje typu RISC różnice w stosunku do czystego RISC występujące w niektórych realizacjach: Przykłady: instrukcje arytmetyczne z jednym odwołaniem do argumentu w pamięci operacje stosowe (dwa argumenty docelowe, w tym SP) pierwsze realizacje NexGen Nx586, IDT C6 (1995 1997) obecnie wszystkie procesory x86 działają na tej zasadzie
Procesor z transkodowaniem instrukcji IDT C6 Bufor instrukcji x86 Translator Kolejka instrukcji RISC Pamięć ROM z procedurami RISC Dekodowanie Obliczanie adresu Wykonanie Zapis wyniku
DZIĘKUJĘ ZA UWAGĘ!