Architektura procesora
Materiały
Treści tego modułu zawarte są w książce Randall Hyde "Profesjonalne Programowanie, część 1: Zrozumieć komputer" w rozdziałach:
- 9 : Architektura procesora
- 10: Konstrukcja zbioru instrukcji
Tutaj umieszczam tylko listę tematów, które poruszyłem na wykładzie:
Typy procesorów
Większość współczesnych procesorów można zaklasyfikować do jednej z trzech architektur:
- CISC Complex Instruction Set Computers
- RISC Reduced Instruction Set Computers
- VLIW Very Long Instruction Word
Przykładowe współczesne procesory.
Logika przypadku a mikrokod
Logika przypadku
- Instrukcja jest zakodowana na stałe w układzie (krzemie).
- Nie ma potrzeby czytania kodu z pamięci, co zwiększa szybkość.
- Im więcej instrukcji tym układ scalony staje się bardziej złożony i trudniejszy w modyfikacji.
Mikro kod
- Wewnętrznie znajduje się szybka jednostka z małą liczbą instrukcji wykonująca mikro kod z banku instrukcji.
- Instrukcje są czytane z pamięci ROM - ogranicza to szybkość.
- Łatwo jest dodać kolejne instrukcje lub zmodyfikować istniejące.
Obecne procesory wykorzystują obie techniki!
Przykład instrukcji MOV
MOV DestReg, SrcReg
Kopiowanie wartości z rejestru SrcReg do rejestru DestReg.
- Pobranie kodu instrukcji z pamięci
- Aktualizacja rejestru EIP (wskaźnik następnej instrukcji)
- Dekodowanie kodu instrukcji
- Pobranie danych z rejestru SrcReg
- Zapis wartości w DestReg
Przykład instrukcji MOV
MOV [DestMem], SrcReg
Kopiowanie wartości z rejestru SrcReg do pamięci pod adres DestMem.
- Pobranie kodu instrukcji z pamięci
- Aktualizacja rejestru EIP
- Dekodowanie kodu instrukcji
- Pobranie adresu znajdującego się za kodem instrukcji
- Aktualizacja rejestru EIP
- Wyliczenie adresu efektywnego (zależy od trybu)
- Pobranie danych z rejestru SrcReg
- Zapis wartości w [DestMem]
Przykład instrukcji ADD
ADD DestReg, [Mem]
Dodawanie do wartości w rejestrze DestReg wartości z pamięci pod adresem Mem.
- Pobranie kodu instrukcji z pamięci
- Aktualizacja rejestru EIP
- Dekodowanie kodu instrukcji
- Pobranie adresu znajdującego się za kodem instrukcji
- Aktualizacja rejestru EIP
- Wyliczenie adresu efektywnego (zależy od trybu)
- Pobranie danej z [Mem] i przeslanie do ALU
- Przesłanie wartości z rejestru DestReg do ALU
- Nakazanie ALU dodanie wartości
- Zapis wartości w DestReg
- Aktualizacja rejestru flag
Równoległe wykonanie czynności
ADD DestReg, [Mem]
Dodawanie do wartości w rejestrze DestReg wartości z pamięci pod adresem Mem.
- Pobranie kodu instrukcji z pamięci
- Aktualizacja rejestru EIP
- Dekodowanie kodu instrukcji
- Pobranie adresu znajdującego się za kodem instrukcji
- Aktualizacja rejestru EIP
- Wyliczenie adresu efektywnego (zależy od trybu)
- Pobranie danej z [Mem] i przeslanie do ALU
- Przesłanie wartości z rejestru DestReg do ALU
- Nakazanie ALU dodanie wartości
- Zapis wartości w DestReg
- Aktualizacja rejestru flag
Niektóre kroki można wykonać jednocześnie.
Niestety większość kroków jest sekwencyjna.
Wydajność procesora
Wydajność procesora można mierzyć średnią liczbą instrukcji wykonywanych na jeden cykl zegara (IPC - Instructions Per Clockcycle)
- IPC < 1 - komputery subskalarne
- IPC = 1 - komputery skalarne
- IPC > 1 - komputery superskalarne
Jeżeli instrukcje są wykonywane sekwencyjnie bardzo trudno jest uzyskać skalarność.
Potoki
Modelowy 5-stopniowy potok 
-
Pobranie instrukcji z pamięci – ang. instruction fetch (IF)
- Zdekodowanie instrukcji – ang. instruction decode (ID)
- Wykonanie instrukcji – ang. execute (EX)
- Dostęp do pamięci – ang. memory access (MEM)
- Zapisanie wyników działania instrukcji – ang. store; write back (WB)
Problemy związane z potokami
- Problem z dekodowaniem
instrukcje x86 mają od 1 do 15 bajtów długości.
Pod jakim adresem znajduje się następna instrukcja?
Rozwiązanie: Pobieranie spod kilku adresów i potem selekcja właściwego.
- Zagrożenia (hazard) danych
kolejna instrukcja zależy do wyników zwracanych przez poprzednią instrukcję.
mov rbx, tab
mov eax, [rbx+4]
add eax, 5
mov [rbx+4], eax
- Cały potok musi czekać na zakończenie pierwszej instrukcji.
- Długie ciągi zależności kolejnych instrukcji powodują,
że w praktyce kolejne instrukcje są wykonywane sekwencyjnie zamiast równolegle.
- Może pomóc: zmiana kolejności instrukcji, zmiana wykorzystywanych rejestrów.
- Hazard RAW (read after write) i WAW (write after write).
- Zagrożenia sterowania
modyfikacje rejestru IP poprzez skoki, wywołania funkcji powoduje,
że cały potok jest błędny (wstępnie przetworzone instrukcje zostały pobrane spod złego adresu)
i należy go wyczyścić a następnie rozpocząć przetwarzanie instrukcji spod nowego adresu.
- Powoduje to duże opóźnienia: pobranie instrukcji z pamieci + pierwsza instrukcja trwa tyle cykli ile potok ma kroków.
- Im dłuższy potok, tym dłuższe oczekiwanie.
- Pomaga odpowiednie pisanie instrukcji warunkowych, pętli, stosowanie funkcji inline.
- W procesorach implementowane jest spekulacyjne wykonanie kodu i przewidywanie rozgałęzień.
Komputery superskalarne
Wykorzystywane techniki:
- Zmiana kolejności wykonywania kodu.
- Zmiany nazw rejestrów
- Przewidywanie rozgałęzień, skoków.
- Powielenie jednostek wykonywania.
Przykładowy procesor AMD K8
Architektura VLIW
VLIW - Very Long Instruction Word
Jest to architektura, w której "instrukcje" VLIW są stałej długości i
jest tak naprawdę zestawem kilku instrukcji.
___________________________________________
| INSTRUKCJA1 | INSTRUKCJA2 | INSTRUKCJA3 |
-------------------------------------------
To kompilator (programista) decyduje jakie instrukcje można spakować
razem!
Procesor nie sprawdza ich niezależności.
Itanium2
- 128 bit VLIW = 3 instrukcje
- Można pobrać na raz dwa VLIW dlatego można wykonać do 6 instrukcji na cykl.
- 30 jednostek wykonania kodu:
- 6 x ALU, 2 x Integer, Shifts
- 4 x Data Cache
- 6 x Multimedia, 2 x Parallel Shifts, ...
- 2 x FMA, SIMD FMA
- 3 x Branch units.
To kompilator, a nie procesor, decyduje o:
- predykcjach i spekulatywnym wykonaniu kodu,
- przewidywaniu rozgałęzień,
- zmianach nazw rejestrów.
Mimo dużego entuzjazmu testy nie potwierdziły dużego wzrostu wydajności.
W 2004 roku komputer z Itanium2 był na drugim miejscu na liście TOP500.
Kodowanie instrukcji 80x86
|
Przedrostek (0-4 bajtów) np. LOCK, REP, REPZ |
| Kod instrukcji (1-2) bajty |
| Bajt ModR/M - tryb adresowania, rejestry |
| Bajt SIB (opcjonalny) - skala, index, baza |
| Pole przesunięcia (opcjonalne) 0-4 bajtów |
| Dane stałe (immediate, opcjonalne) 0-4 bajtów |
Kod instrukcji
Kodowanie instrukcji
Online assembler & disassembler
Online disassembler
Tomasz Kapela, Kraków 2011-2020