Przetwarzanie instrukcji w mikroprocesorach
Przetwarzanie sekwencyjne Przetwarzanie sekwencyjne ang. Sequential tradycyjna technika przetwarzania instrukcji w mikroprocesorach; polega na ściśle określonym scenariuszu wykonywania instrukcji; poszczególne etapy wykonania operacji następują po sobie sekwencyjnie; rozpoczęcie wykonywania kolejnej instrukcji może nastąpić dopiero po całkowitym wykonaniu poprzedniej instrukcji. Computer Organization and Design T H E H A R D W A R E / S O F T W A R E I N T E R F A C E, p. 331 fig.4.25 David A. Patterson, University of California, Berkeley John L. Hennessy, Stanford University
Pipeline Przetwarzanie potokowe ang. Pipelining technika przetwarzania rozkazów w mikroprocesorach, która polega na podziale logiki procesora wykonującej instrukcje, na specjalizowane grupy, w taki sposób aby każda z nich wykonywała część pracy związanej z wykonaniem instrukcji; praca ta może być wykonywana równocześnie, czyli z punktu widzenia otoczenia równolegle. Computer Organization and Design T H E H A R D W A R E / S O F T W A R E I N T E R F A C E, p. 331 fig.4.25 David A. Patterson, University of California, Berkeley John L. Hennessy, Stanford University
Pipeline Pipeline korzyści Speed-up S(n) Throughput U(n) Efficiency E(n)
Pipeline - wydajność Rozważmy m instrukcji wykonanych przy użyciu n etapowego potoku. Całkowity czas potrzebny na wykonanie powyższych operacji zajmuje mxn 1 jednostek czasu (np. cykli zegarowych). Wówczas przyspieszenie przetwarzania możemy wyrazić wzorem: Time using sequential processing S n = Time using pipeline processing m n t = m + n 1 t = m n m + n 1 lim S n = m n
Pipeline - wydajność Przepustowość możemy wyrazić następującą zależnością: U n = no of tasks executed per unit time m = m + n 1 t lim U n = 1, m zakładając t = 1 jednostce czasu.
Pipeline - wydajność Efektywność możemy wyrazić następującą zależnością: E n = Ratio of the actual to the maximum speed up Speed up m = = n m + n 1 lim E n = 1 m
Pipeline - wydajność Pipeline CPI Ideal pipeline CPI Structural stalls Data hazard stalls Control stalls CPI Cycles Per Instruction
Pipeline zależności i hazardy Określenie wzajemnych zależności pomiędzy instrukcjami jest krytyczne dla określenia jaka część kodu programu możliwa będzie do wykonania z wykorzystaniem przetwarzania równoległego. W ogólności aby korzystać z równoległości na poziomie instrukcji musimy określić, które instrukcje mogą być wykonane równolegle. Dwie instrukcje są równoległe tylko wówczas gdy mogą być wykonane równocześnie na dowolnym etapie pipeline u, bez powodowania zaburzenia potoku instrukcji. Jeżeli dwie instrukcje są wzajemnie zależne muszą być wykonane w określonej sekwencji.
Pipeline Data Dependences Data Dependences możemy wyróżnić trzy typy zależności: True data dependences; Name dependences; Control dependences.
Pipeline - niebezpieczeństwa Pipeline hazard zjawisko ma miejsce gdy potok instrukcji lub jego część zostaje wstrzymany z powodu warunków, które nie zezwalają na jego wykonywanie. Możemy wyróżnić trzy rodzaje hazardów: Resources hazards; Data hazards; Control hazards.
Pipeline True Data Dependences Instrukcja A INSTR A jest zależna od instrukcji B INSTR B jeżeli spełniony jest jeden z poniższych warunków: INSTR B generuje wynik, który może być wykorzystany przez INSTR A, lub INSTR A zależy od INSTR C, a INSTR C zależy od INSTR B
Pipeline True Data Dependences Zależności danych określają nam trzy zagadnienia: Możliwość wystąpienia hazardu; Porządek wykonywania programu; Górną granicę wykorzystania przetwarzania równoległego.
Pipeline Name Dependences Name Dependence ma miejsce w sytuacji gdy dwie instrukcje używają tego samego rejestru lub tego samego obszaru pamięci, zwanych nazwą, w sytuacji gdy nie ma przepływu danych pomiędzy instrukcjami powiązanymi z tą nazwą. Wyróżniamy dwa typy zależności nazwy pomiędzy instrukcją INSTR A, która poprzedza instrukcję INSTR B w programie.
Pipeline Name Dependences Antidependence pomiędzy INSTR A a INSTR B, ma miejsce gdy INSTR B wpisuje do rejestru lub obszaru pamięci, z których INSTR A czyta. Pierwotna kolejność musi być zachowana dla pewności iż INSTR A czyta właściwą wartość. Output dependence zachodzi w sytuacji gdy INSTR A i INSTR B zapisują do tego samego rejestru lub obszaru pamięci. Kolejność musi być zachowana dla pewności iż końcowa zapisana wartość odpowiada INSTR B.
Pipeline - niebezpieczeństwa Data hazard ma miejsce w sytuacji gdy dochodzi do konfliktu w czasie dostępu do lokalizacji operandu. Dwie instrukcje zostaną wykonane kolejno po sobie i obie odwołują się do konkretnej lokalizacji w pamięci lub rejestru operandu. Niebezpieczeństwa danych mogą być klasyfikowane w zależności od kolejności wykonywania operacji odczytu i zapisu w instrukcjach. Dla dwóch instrukcji INSTR A i INSTR B, gdzie INSTR A poprzedza INSTR B w programie otrzymujemy następujące zależności:
Pipeline - niebezpieczeństwa RAW (read after write) INSTR B próbuje czytać źródło przed jego zapisem przez INSTR A. INSTR B błędnie pobiera starą wartość. Najczęściej występujący przykład True Data Dependence. WAW (write after write) INSTR B próbuje zapisać operand zanim zostanie zapisany przez INSTR A. Zapisy wykonane są w niewłaściwej kolejności, pozostawiają wartość zapisaną przez INSTR A zamiast wartości zapisanej przez INSTR B. Przykład output dependence.
Pipeline - niebezpieczeństwa WAR (write after read) INSTR B próbuje zapisu do lokalizacji docelowej zanim INSTR A odczyta z tej lokalizacji, INSTR A niepoprawnie odczytuje nową wartość. Hazard ten jest wynikiem antidependence. Hazard tego typu pojawia się rzadko gdyż wszystkie odczyty wykonywane są wcześniej (w ID) natomiast zapisy późno (w WB). WAR może mieć miejsce w czasie reorganizacji potoku instrukcji. RAR (read after read) nie jest hazardem.
Pipeline Control Dependences Control Dependence określa kolejność instrukcji, INSTR A, w odniesieniu do instrukcji warunkowych, tak więc instrukcja INSTR A jest wykonywana zgodnie z programem i tylko wtedy gdy powinna być wykonana. if P1 { S1; }; if P2 { S2; } S1 jest zależny od P1, S2 jest zależny od P2 ale nie od P1.
Pipeline Control Dependences W ogólności możemy wyróżnić dwa typy zależności kontrolnych : Instrukcja, która zależna jest od warunku i nie może zostać przesunięta przed warunek, tak więc jej wykonanie nie jest dłużej kontrolowane przez ten warunek. Przykład nie możemy przenieść fragmentu wyrażenia if przed wyrażeniem if. Instrukcja, która nie zależy od warunku ale nie może być przesunięta za warunek, tak więc jej wykonanie jest kontrolowane przez warunek. Przykład nie możemy przenieść wyrażenia występującego przed wyrażeniem if do fragmentu wyrażenia if.
Pipeline - niebezpieczństwa Resource hazard ma miejsce w sytuacji gdy dwie lub więcej instrukcji z potoku potrzebują tego samego zasobu. W rezultacie instrukcje muszą być wykonywane szeregowo, a nie równolegle. Resource hazard często nazywany jest hazardem strukturalnym ang. structural hazard.
Pipeline Data Path and Control Instruction Fetch pobranie instrukcji z pamięci z pod aktualnego adresu PC i umieszczenie jej w rejestrze IF/ID. Wartość PC jest zmodyfikowana i zapisana do PC aby mogła być odczytana w następnym cyklu zegarowym. Zmodyfikowana wartość PC jest zapisana również do IF/ID dla późniejszych instrukcji warunkowych. Procesor nie wie jaka instrukcja jest pobierana i musi przygotować dla każdej instrukcji ścieżkę w dół potoku do przesyłania wymaganych informacji.
Pipeline Data Path and Control Instruction decode and register file read rejestr IF/ID dostarcza 16- bitową część bezpośrednią instrukcji, która jest rozszerzona do 32 bitów oraz numery rejestrów do odczytu dwóch rejestrów. Wszystkie trzy wartości zapisane są w rejestrze ID/EX łącznie ze zmodyfikowaną wartością PC.
Pipeline Data Path and Control Execute or address calculation instrukcja ładowania czyta zawartość rejestru 1 i rozszerzoną wartość bezpośrednią z ID/EX a następnie dodaje je do siebie w ALU. Suma umieszczona zostaje w rejestrze EX/MEM.
Pipeline Data Path and Control Memory access instrukcja ładowania czyta zawartość pamięci spod adresu zamieszczonego w rejestrze EX/MEM, a następnie umieszcza odczytaną wartość w rejestrze MEM/WB.
Pipeline Data Path and Control Write-back w końcowym etapie następuje odczyt danej z rejestru MEM/WB i zapis do zbioru rejestrów.
Pipeline Forwarding Forwarding przesyłanie danej, jak tylko jest ona dostępna, do innych jednostek, które jej potrzebują, zanim będzie możliwe odczytanie jej ze zbioru rejestrów.
Pipelining Przetwarzanie potokowe jednoetapowe ang. single-level pipelining możliwe do realizacji dzięki architekturze harwardzkiej i zbiorowi szybkich rejestrów; przetwarzanie rozkazów podzielone jest na następujące etapy: fetch; execute. XMEGA D [MANUAL] XMEGA CPU
Pipelining Pojedynczy cykl operacji ALU składa się z kilku faz: Pobranie operandów fetch; Operacja ALU execute; Zapis wyniku writeback. XMEGA D [MANUAL]
Pipelining Przetwarzanie potokowe trójetapowe przetwarzanie rozkazów podzielone jest na następujące etapy: fetch; decode; execute.
Pipelining Przetwarzanie potokowe pięcioetapowy przetwarzanie rozkazów podzielone jest na następujące etapy: fetch; decode; execute; memory access; write back.
Pipelining
Pipelining UltraSPARC IV
Pipelining UltraSPARC IV
Pipelining Pentium 4 Willamette
Pipelining Pentium 4 Willamette TC Nxt IP: Trace cache next instruction pointer. This stage looks at branch target buffer (BTB) for the next microinstruction to be executed. This step takes two stages. TC Fetch: Trace cache fetch. Loads, from the trace cache, this microinstruction. This step takes two stages. Drive: Sends the microinstruction to be processed to the resource allocator and register renaming circuit. Alloc: Allocate. Checks which CPU resources will be needed by the microinstruction for example, the memory load and store buffers. Rename: If the program uses one of the eight standard x86 registers it will be renamed into one of the 128 internal registers present on Pentium 4. This step takes two stages. Que: Queue. The microinstructions are put in queues according to their types (for example, integer or floating point). They are held in the queue until there is an open slot of the same type in the scheduler. Sch: Schedule. Microinstructions are scheduled to be executed according to its type (integer, floating point, etc). Before arriving to this stage, all instructions are in order, i.e., on the same order they appear on the program. At this stage, the scheduler re-orders the instructions in order to keep all execution units full. For example, if there is one floating point unit going to be available, the scheduler will look for a floating point instruction to send it to this unit, even if the next instruction on the program is an integer one. The scheduler is the heart of the out-of-order engine of Intel 7th generation processors. This step takes three stages. Disp: Dispatch. Sends the microinstructions to their corresponding execution engines. This step takes two stages. RF: Register file. The internal registers, stored in the instructions pool, are read. This step takes two stages. Ex: Execute. Microinstructions are executed. Flgs: Flags. The microprocessor flags are updated. Br Ck: Branch check. Checks if the branch taken by the program is the same predicted by the branch prediction circuit. Drive: Sends the results of this check to the branch target buffer (BTB) present on the processor s entrance.
ARM11 Pipelining ARM11 MPCore potok 8 etapowy: 2 stages of instruction fetch Fe1, Fe2; Decode stage De; Issue stage Iss; 4 stages of execution.
ARM11 Pipelining Etapy przetwarzania potokowego: Fe1 etap pierwszy pobierania instrukcji i predykcji skoku; Fe2 etap drugi pobierania instrukcji i predykcji skoku; De dekodowanie instrukcji; Iss odczyt rejestru i wydanie instrukcji; Sh etap przesuwnika; ALU obliczenia arytmetyczne; Sat ; Wbex zapis danej z mnożenia lub głównego potoku wykonania; MAC1 pierwszy etap pipeline u mnożenia; MAC2 drugi etap pipeline u mnożenia; MAC3 trzeci etap pipeline u mnożenia;
ARM11 Pipelining Etapy przetwarzania potokowego: ADD etap generowania adresu; DC1 etap pierwszy dostępu do pamięci podręcznej danych; DC2 etap drugi dostępu do pamięci podręcznej danych; WBIs zapis danych z LSU Load Store Unit.
ARM11 Pipelining Etapy pobierania mogą obejmować maksymalnie 4 instrukcji, predykcja skoku wykonywana jest przed instrukcjami na podstawie wcześniej wykonanych instrukcji. Etapy wydania i dekodowania mogą zawierać dowolne instrukcje równolegle z przewidywanym skokiem. Etapy wykonania, pamięci i zapisu, przewidywany skok, operacje ALU lub mnożenia, operacje wielokrotnego ładowania / zapisu oraz instrukcje koprocesora wykonywane są równolegle.