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