AW PS200

Transkrypt

AW PS200
Materiały do wykładu
4. Mikroprocesor
Marcin Peczarski
Instytut Informatyki
Uniwersytet Warszawski
5 kwietnia 2009
Architektura mikroprocesora
Rejestry
Układ
współpracy
z szynami
Jednostka
sterująca
połączenia wewnętrzne
Jednostka
arytmetyczno-logiczna
Jednostka
arytmetyczno-logiczna
Jednostka
arytmetyczno-logiczna
 .
Kod maszynowy a Asembler
 .
⊲ Kod maszynowy – binarny sposób opisu rozkazów procesora
⋄ Każda architektura ma swój unikalny kod maszynowy.
⋄ W obrębie tej samej architektury kod maszynowy może być nieco
różny dla poszczególnych modeli procesorów.
⊲ Asembler – język programowania niskiego poziomu
⋄ Jedno polecenie odpowiada zwykle jednemu rozkazowi maszynowemu.
⋄ Każda architektura ma swój unikalny Asembler.
⊲ asembler – program tłumaczący Asembler na kod maszynowy
Dlaczego Z80?
 .
⊲ Jeden z najpopularniejszych mikroprocesorów 8-bitowych
⊲ Nadal produkowany i używany
⊲ Bezpośredni wpływ na najpopularniejszą obecnie architekturę x86
⊲ Kompromisy projektowe, kompatybilność z 8080
⊲ Wystarczająco prosty
Z80 – rejestry
 .
A
F
A’
F’
PC
B
C
B’
C’
SP
D
E
D’
E’
IX
H
L
H’
L’
IY
I
IFF
R
Z80 – przesyłanie danych 8-bitowych (1)
LD d, s
0 1
d
s
d, s
argument
000
001
010
011
100
101
110
111
B
C
D
E
H
L
(HL)
A
⊲ Nie ma rozkazu LD (HL), (HL); kod 01110110 to rozkaz HALT!
 .
Z80 – przesyłanie danych 8-bitowych (2)
LD d, n
0 0
d 1 1 0
n
d
argument
000
001
010
011
100
101
110
111
B
C
D
E
H
L
(HL)
A
 .
Z80 – przesyłanie danych 8-bitowych (3)
LD (p), A
LD A, (p)
0 0 0 p d 0 1 0
LD (aa), A
LD A, (aa)
0 0 1 1 d 0 1 0
aal
aah
p
para rejestrów
d
kierunek
0
1
BC
DE
0
1
z akumulatora do pamięci
z pamięci do akumulatora
 .
Z80 – rejestry indeksowe (1)
LD r, (HL)
r
0 1
1 1 0
LD r, (i + d)
1 1 i 1 1 1 0 1
r
0 1
1 1 0
d
r
rejestr
i
rejestr indeksowy
000
001
010
011
100
101
111
B
C
D
E
H
L
A
0
1
IX
IY
 .
Z80 – rejestry indeksowe (2)
LD (HL), n
LD (i + d), n
0 0 1 1 0 1 1 0
n
1 1 i 1 1 1 0 1
0 0 1 1 0 1 1 0
d
n
i
rejestr indeksowy
0
1
IX
IY
 .
Z80 – rejestry primowane
EX AF, AF’
0 0 0 0 1 0 0 0
EXX
1 1 0 1 1 0 0 1
.
Z80 – rejestr znaczników
S
Z
–
AC
.
– P/V N CY
⊲ S – najstarszy bit wyniku operacji, wynik ujemny
⊲ Z – wynik operacji zerowy
⊲ AC – pomocnicze przeniesienie z pozycji 3, arytmetyka BCD
⊲ P/V – znacznik parzystości dla operacji logicznych i nadmiaru (ang.
overflow) dla operacji arytmetycznych
⊲ N – znacznik zerowany przy wykonywaniu dodawania i ustawiany
przy wykonywaniu odejmowania, arytmetyka BCD
⊲ CY – znacznik przeniesienia (pożyczki przy odejmowaniu)
Z80 – 8-bitowe operacje arytmetyczno-logiczne
1 0
op
s
1 1
op
1 1 0
n
s
argument
op
operacja
000
001
010
011
100
101
110
111
B
C
D
E
H
L
(HL)
A
000
001
010
011
100
101
110
111
ADD A, y
ADC A, y
SUB A, y
SBC A, y
AND A, y
OR A, y
XOR A, y
CP A, y
y ∈ {s, n}
.
Z80 – rotacje i przesunięcia bitów
RL x
CY
RR x
CY
RLC x
CY
RRC x
CY
SLA x
CY
SRL x
0
SRA x
.
x
x
x
x
x
0
x
CY
x
CY
x ∈ {A, B, C, D, E, H, L, (HL), (IX + d), (IY + d)}
Z80 – operacje na adresach (1)
⊲ Ładowanie
LD p, nn
LD p, (aa)
LD (aa), p
gdzie p ∈ {BC, DE, HL, SP, IX, IY}
⊲ Zamiana
EX DE, HL
⊲ Inkrementacja i dekrementacja
INC p
DEC p
gdzie p ∈ {BC, DE, HL, SP, IX, IY}
.
Z80 – operacje na adresach (2)
⊲ Arytmetyka 16-bitowa
ADD HL, p
ADC HL, p
SBC HL, p
gdzie p ∈ {BC, DE, HL, SP}
⊲ Dodawanie i odejmowanie wartości w rejestrach indeksowych
ADD IX, p
gdzie p ∈ {BC, DE, SP, IX}
ADD IY, p
gdzie p ∈ {BC, DE, SP, IY}
.
Z80 – stos (1)
⊲ Zajmuje pewien obszar w pamięci.
⊲ Rejestr SP wskazuje wierzchołek stosu – ostatni zajęty bajt.
⊲ Stos rośnie w dół – w kierunku mniejszych adresów.
.
Z80 – stos (2)
.
⊲ PUSH p
⋄ Odkłada na stos najpierw starszy, potem młodszy bajt argumentu (little-endian).
⋄ Zmniejsza SP o 2.
⋄ p ∈ {AF, BC, DE, HL, IX, IY}
⊲ POP p
⋄ Zdejmuje ze stosu najpierw młodszy, potem starszy bajt i umieszcza je w argumencie.
⋄ Zwiększa SP o 2.
⋄ p ∈ {AF, BC, DE, HL, IX, IY}
Z80 – stos (3)
⊲ Inicjowanie wskaźnika stosu
LD SP, nn
LD SP, (aa)
LD SP, p
gdzie p ∈ {HL, IX, IY}
⊲ Manipulowanie wierzchołkiem stosu
INC SP
DEC SP
EX (SP), p
gdzie p ∈ {HL, IX, IY}
.
Z80 – skoki i podprogramy
JP aa
1 1 0 0 0 0 1 1
CALL aa
1 1 0 0 1 1 0 1
aal
aal
aah
aah
.
RET
1 1 0 0 1 0 0 1
⊲ JP wykonuje skok pod podany adres (wpisuje aa do PC).
⊲ CALL odkłada na stos adres następnego rozkazu (adres powrotu)
i wykonuje skok pod podany adres.
⊲ RET zdejmuje ze stosu adres powrotu i wykonuje skok pod ten
adres.
Z80 – rozkazy warunkowe
JP w, aa
1 1 w 0 1 0
CALL w, aa
1 1 w 1 0 0
aal
aal
aah
aah
.
RET w
1 1 w 0 0 0
w
skrót
warunek skoku
000
001
010
011
100
101
110
111
NZ
Z
NC
C
PO
PE
P
M
Z=0
Z=1
CY = 0
CY = 1
P/V = 0
P/V = 1
S=0
S=1
Z80 – skoki względne
JR d
0 0 0 1 1 0 0 0
JR v, d
0 0 1 v 0 0 0
d
d
v
skrót
warunek skoku
00
01
10
11
NZ
Z
NC
C
Z=0
Z=1
CY = 0
CY = 1
.
⊲ Skok względny dodaje do PC wartość d traktowaną jako liczba ze
znakiem.
Z80 – przykład procedury
MUL:
PUSH
PUSH
LD
LD
LD
MULTST: CP
JR
SRL
JR
ADD
MUL2BC: SLA
RL
JR
MULEND: POP
POP
RET
.
AF
; Nie modyfikuj rejestrów roboczych.
BC
; w B i C argumenty
HL, 0
; w HL wynik
A, B
B, H
; wyzerowanie B
A, 0
Z, MULEND
A
NC, MUL2BC
HL, BC
C
; pomnożenie BC
B
;
przez 2
MULTST
BC
; przywrócenie wartości
AF
;
rejestrom roboczym
Z80 – przekazywanie argumentów przez stos
LD H, (x)
LD L, 5
PUSH HL
CALL MUL
INC SP
INC SP
LD (y), HL
MUL:
; drugi (ostatni) argument
; pierwszy (przedostatni) argument
; argumenty na stosie od ostatniego
; czyszczenie stosu przez
;
procedurę wołającą
; zapisanie wyniku
PUSH IX
LD IX, 3
ADD IX, SP
...
; (IX + 1) - pierwszy argument
...
; (IX + 2) - drugi argument
POP IX
RET
.
Z80 – przekazywanie argumentów przez stos
LD H, 5
LD L, (x)
PUSH HL
CALL MUL
LD (y), HL
MUL:
LD IX, 4
ADD IX, SP
...
...
POP IY
LD SP, IX
JP (IY)
; pierwszy argument
; drugi argument
; argumenty na stosie od pierwszego
; zapisanie wyniku
;
;
;
;
;
(IX - 1) - pierwszy argument
(IX - 2) - drugi argument
zdjęcie adresu powrotu
stos czyści procedura wołana
powrót z procedury
.
Z80 – cykl pracy
cykl rozkazowy
ADD A, E
cykle procesora
pobranie
cykle zegara
T1
T2
T3
T4
INC (HL)
cykl rozkazowy
pobranie
cykle procesora
cykle zegara
.
T1
T2
T3
zapis
odczyt
T4
⊲ Liczą się tylko dostępy do pamięci!
T1
T2
T3
T1
T2
T3
Z80 – przerwania
.
⊲ Służą do sygnalizowania procesorowi, że jakieś urządzenie wymaga
obsługi, np.:
⋄ wciśnięto klawisz,
⋄ odebrano pakiet danych.
⊲ Niemaskowalne
⋄ zawsze aktywne
⊲ Maskowalne
⋄ włączane rozkazem EI – ustawienie przerzutnika przerwań IFF
⋄ wyłączane rozkazem DI – wyzerowanie IFF
⋄ trzy tryby, ustawiane odpowiednio rozkazami: IM0, IM1, IM2
⋄ Tryby 0 i 1 są odziedziczone po 8080, omówimy tylko tryb 2.
Z80 – zgłaszanie przerwań
.
⊲ Urządzenie chcąc zgłasić przerwanie, podaje stan niski na wejście
NMI lub INT.
⊲ Procesor testuje stan tych wejść w ostatnim takcie zegara każdego
cyklu rozkazowego.
⊲ Jeśli wejście NMI ma stan niski, zamiast wykonywać kolejny rozkaz,
procesor przechodzi do obsługi przerwania niemaskowalnego.
⊲ Jeśli wejście INT ma stan niski i przerwanie maskowalne jest włączone, zamiast wykonywać kolejny rozkaz, procesor przechodzi do
obsługi przerwania maskowalnego.
Z80 – obsługa przerwania niemaskowalnego
.
⊲ Zapamiętywany jest aktualny stan IFF.
⊲ Przerwania maskowalne są wyłączane – IFF jest zerowany.
⊲ Wykonywany jest skok do podprogramu obsługi rozpoczynającego
się od adresu (66)16 .
⊲ Zakończenie obsługi polega na wykonaniu rozkazu RETN.
⊲ Rozkaz RETN zdejmuje ze stosu adres powrotu i wpisuje go do PC
oraz przywraca poprzednią wartość IFF.
Z80 – obsługa przerwania maskowalnego (1)
.
⊲ Procesor generuje zmodyfikowany cykl pobrania rozkazu.
⊲ W tym cyklu wystawia sygnał potwierdzenia przyjęcia przerwania.
⊲ Urządzenie zgłaszające przerwanie po rozpoznaniu potwierdzenia
wystawia na szynę danych numer przerwania b.
⊲ Wartość PC jest odkładana na stosie.
⊲ Przerwanie maskowalne jest wyłączane.
⊲ Z tablicy przerwań pobierany jest adres obsługi przerwania.
⊲ Tablica przerwań jest wskazywana przez rejestr przerwań I.
Z80 – obsługa przerwania maskowalnego (2)
.
⊲ Adres początku procedury obługi przerwania numer b znajduje się
pod adresami 28 · I + b (młodszy bajt), 28 · I + b + 1 (starszy bajt).
⊲ Do PC wpisywany jest adres początku procedury obługi przerwania.
⊲ Przed zakończeniem obsługi zwykle włącza się ponownie przyjmowanie przerwań rozkazem EI.
⊲ Zakończenie obsługi polega zwykle na wykonaniu rozkazu RETI.
⊲ Rozkaz RETI zdejmuje ze stosu adres powrotu i wpisuje go do PC.
⊲ Do manipulowania rejestrem przerwań służą rozkazy
LD I, A
LD A, I
Z80 – szkielet procedury obsługi przerwania
INT:
EX AF, AF’
EXX
...
EXX
EX AF, AF’
EI
RETI
.
Z80 – wejście-wyjście
⊲ Komunikacja z urządzeniami, np.:
⋄ odczytanie kodu wciśniętego klawisza,
⋄ odczytanie odebranego pakietu danych,
⋄ sterowanie wyświetlaczem.
⊲ Oddzielna przestrzeń adresowa wejścia-wyjścia
⊲ Rozkazy
IN A, (n)
OUT (n), A
IN r, (C)
OUT (C), r
gdzie r ∈ {A, B, C, D, E, H, L}
.
Z80 – pozostałe rozkazy (1)
⊲ Arytmetyczno-logiczne
INC x
DEC x
BIT b, x
SET b, x
RES b, x
RLD
RRD
CPL
NEG
CCF
SCF
DAA
gdzie b ∈ {0, 1, . . . , 7},
x ∈ {A, B, C, D, E, H, L, (HL), (IX + d), (IY + d)}
.
Z80 – pozostałe rozkazy (2)
⊲ Skoki
DJNZ d
JP (p)
gdzie d ∈ {−128, −127, . . . , 127}, p ∈ {HL, IX, IY}
⊲ Operacje na ciągach bajtów w pamięci
LDI
LDD
LDIR
LDDR
CPI
CPD
CPIR
CPDR
.
Z80 – pozostałe rozkazy (3)
⊲ Przesłania blokowe z wejścia i na wyjście
INI
IND
INIR
INDR
OUTI
OUTD
OUTIR
OUTDR
⊲ Przerwania programowe
RST a
gdzie a ∈ {0, 8, 16, . . . , 56}
.
Z80 – pozostałe rozkazy (4)
⊲ Inne
NOP
HALT
LD R, A
LD A, R
⊲ Nieudokumentowane
EX DE, IX
EX DE, IY
SLL x / SL1 x
...
.
Małe podsumowanie (1)
.
⊲ Z punku widzenia programisty wszystkie mikroprocesory działają
podobnie do opisanego.
⊲ Poszczególne architektury różnią się m.in.:
⋄ porządkiem bajtów,
⋄ liczbą i przeznaczeniem rejestrów,
⋄ listą oferowanych instrukcji (rozkazów),
⋄ semantyką operacji dwuargumentowych,
⋄ sposobem realizacji sterowania programem,
⋄ trybami adresowania,
⋄ systemem przerwań.
Małe podsumowanie (2)
.
⊲ Dalsze różnice:
⋄ rozdzielne lub wspólne przestrzenie adresowe: danych i programu
(architektury typu Princeton lub Harward), wejścia-wyjścia,
⋄ mechanizmy ochrony pamięci (brak, segmentacja, stronicowanie).
⊲ Żeby móc działać szybciej, współczesne mikroprocesory mają zupełnie inną organizację (budowę) niż opisany.
Rejestry (1)
⊲ danych
⊲ adresowe
⊲ ogólnego przeznaczenia
⊲ specjalizowane
⊲ stanu, znaczników
⊲ wskaźnik stosu
⊲ licznik programu
⊲ zmiennopozycyjne
⊲ wektorowe
⊲ segmentowe
⊲ zarządzania pamięcią
⊲ debugowania
.
Rejestry (2)
⊲ architektura bezrejestrowa
⊲ minimalny zestaw rejestrów
⊲ mały zestaw rejestrów specjalizowanych
⊲ mały zestaw rejestrów uniwersalnych
⊲ duży zestaw rejestrów uniwersalnych
⊲ bufor wierzchołka stosu
⊲ stosowy zestaw rejestrów
.
Lista instrukcji (rozkazów)
.
⊲ Aplikacyjne
⋄ przesyłanie danych
⋄ operacje arytmetyczne
⋄ operacje bitowe
⋄ operacje na blokach danych
⋄ instrukcje sterujące (skok bezwarunkowy i warunkowy, warunkowe wykonanie instrukcji, wołanie procedury, powrót z procedury)
⊲ Systemowe (tryb uprzywilejowany lub nadzorcy)
⋄ zarządzanie systemowymi strukturami danych
⋄ zmiana trybu pracy procesora
Operacje dwuargumentowe
Przykładowa składnia
Możliwa semantyka
add r1, r2
r1 := r1 + r2
add r1, r2
r2 := r1 + r2
add r1, r2, r3
r1 := r2 + r3
add r1, r2, r3
r3 := r1 + r2
.
Sterowanie wykonaniem programu
⊲ Jednoetapowe (bez znaczników)
bz s1, label
; branch if s1 = 0
jecxz label
; jump if ecx = 0
⊲ Dwuetapowe ze znacznikami
CP A, 0
JR Z, MULEND
; set flags
; jump if Z = 1
cmp eax, 0
jz mulend
; set flags
; jump if zf = 1
⊲ Dwuetapowe z predykatami
cmp.eq p1, p2 = r1, r2
(p1) add r3 = 1, r3
(p2) add r3 = 3, r3
; if r1 = r2
; then r3 := r3 + 1
; else r3 := r3 + 3
.
Tryby adresowania argumentów (1)
Nazwa
.
Z80
IA-32
LD B, 7
mov ebx, 7
LD A, (1000)
mov eax, [1000]
ADD A, B
add eax, ebx
(rejestrowy) pośredni
ADD A, (HL)
add eax, [ebx]
indeksowy
LD A, (IX+8) mov eax, [ebx+4*ecx+8]
stosowy
PUSH AF
POP AF
EX (SP), HL
push eax
pop eax
xchg [esp+8*ecx], eax
względny
JR Z, MULEND
jz mulend
natychmiastowy
bezpośredni
rejestrowy (bezpośredni)
Tryby adresowania argumentów (2)
Nazwa
Oznaczenia
rejestrowy pośredni
z preinkrementacją
[+r1] (+r1)
rejestrowy pośredni
z postinkrementacją
.
Z80
IA-32
[r1+] (r1+)
@r1+
LDI
POP AF
movs
pop eax
rejestrowy pośredni
z predekrementacją
[-r1] (-r1)
DJNZ d
PUSH AF
loop d
push eax
rejestrowy pośredni
z postdekrementacją
[r1-] (r1-)
@r1-
LDD
movs
System przerwań
⊲ Przerwania sprzętowe
⋄ maskowalne
⋄ niemaskowalne
⊲ Przerwania programowe
⊲ Praca krokowa – debugowanie
⊲ Wyjątki – ponawianie instrukcji, która spowodowała wyjątek
⊲ Element tablicy przerwań
⋄ adres procedury obsługi
⋄ instrukcja skoku do procedury obsługi
⋄ deskryptor procedury obsługi
.
Pomiar wydajności
⊲ IPS – Instructions Per Second
⋄ MIPS = 106 · IPS
⊲ FLOPS – Floating Point Operations Per Second
⋄ MFLOPS = 106 · FLOPS
⋄ GFLOPS = 109 · FLOPS
⋄ TFLOPS = 1012 · FLOPS
⋄ PFLOPS = 1015 · FLOPS
.
Metody zwiększania wydajności (1)
⊲ Zwiększanie częstotliwości taktowania
⋄ ograniczenia konstrukcyjne i technologiczne
⋄ wydzielanie ciepła
⋄ czas propagacji
⊲ Inne pomysły
⋄ pobieranie instrukcji na zakładkę
⋄ kolejka (bufor) instrukcji
⋄ przetwarzanie potokowe
⋄ zrównoleglanie wykonywania instrukcji
.
Metody zwiększania wydajności (2)
.
⊲ Nienadążanie szybkość pracy pamięci za wzrostem szybkości pracy
procesorów
⋄ zwiększanie szerokości szyny danych
⋄ wielopoziomowe pamięci podręczne, początkowo jako zewnętrzne,
a obecnie w jednym układzie scalonym z procesorem
⋄ pamięci umożliwiające pobieranie danych co jeden cykl zegara,
a nawet dwa razy w jednym cyklu zegara
Przetwarzanie potokowe
I1
I2
I1
I3
I2
.
I4
I3
I4
F D E M W F D E M W F D E M W F D E M W
F – fetch
F D E M W
F D E M W
F D E M W
F D E M W
D – decode
E – execute
M – memory access
W – write back
Potokowanie rozkazów
.
⊲ Rozkazy procesora takiego jak Z80 źle się potokuje:
⋄ kod rozkazu zajmuje od 1 do 4 bajtów, co wymaga do 4 dostępów
do pamięci;
⋄ rozkaz może wykonywać skomplikowane operacje na argumentach
w pamięci, co może wymagać kilku kolejnych odwołań.
⊲ Listę rozkazów należy przeprojektować tak, aby wszystkie rozkazy:
⋄ miały kod tego samego rozmiaru,
⋄ wykonywały podobną liczbę operacji,
⋄ potrzebowały co najwyżej jednego dodatkowego dostępu do pamięci (oprócz wczytania kodu rozkazu).
Klasy rozkazów
⊲ Ograniczamy repertuar rozkazów do następujących klas.
⊲ Odczyt z pamięci do rejestru (ang. load), np.:
r1 := (r2 + offset)
⊲ Zapis z rejestru do pamięci (ang. store), np.:
(r2 + offset) := r1
⊲ Arytmetyczno-logiczne tylko na rejestrach, np.:
r1 := r2 + r3
⊲ Rozgałęzienia jednoetapowe, np.:
branch to label if r1 = r2
.
Podział rozkazów na etapy
.
⊲ Rozważamy przykładowy potok piecioetapowy.
⊲ F – pobranie kodu rozkazu z pamięci
⊲ D – zdekodowanie rozkazu i pobranie argumentów z rejestrów
⊲ E – wykonanie operacji arytmetyczno-logicznych, obliczenie adresu
⊲ M – odczytanie danych z pamięci lub zapisanie danych do pamięci
⊲ W – zapisanie wyniku do rejestru
Przykładowe czasy wykonania
.
klasa instrukcji
F
D
E
M
W
razem
odczyt z pam.
200 ps
100 ps
200 ps
200 ps
100 ps
800 ps
zapis do pam.
200 ps
100 ps
200 ps
200 ps
arytm.-logiczne
200 ps
100 ps
200 ps
rozgałęzienia
200 ps
100 ps
200 ps
700 ps
100 ps
600 ps
500 ps
⊲ Rozkaz musi przebywać w jednym etapie potoku 200 ps.
⊲ Czas wykonania jednego rozkazu wynosi 1000 ps, czyli dłużej niż
najdłuższy czas wykonania rozkazu wykonywanego niepotokowo.
⊲ Czas wykonania n rozkazów wynosi 200(n + 4) ps.
Zależności zasobów, strukturalne
.
⊲ Potok może zostać wstrzymany, gdy rozkazy będące na różnych etapach wykonania potrzebują dostępu do tego samego sprzętu.
⊲ Przykładowo rozkaz chce wykonać odczyt danych z pamięci, a w tym
samym czasie trzeba pobrać kod kolejnego rozkazu.
F D E M W
F D E M W
F D E M W
F D E M W
⊲ Zależności strukturalne usuwa się przez dołożenie sprzętu.
⊲ Dlatego m.in. współczesne mikroprocesory mają oddzielne pamięci
podręczne pierwszego poziomu dla kodu i danych.
Zależności danych typu define-use
.
⊲ Potok może zostać wstrzymany, gdy rozkaz potrzebuje wyniku poprzedniego rozkazu.
r1 := r2 + r3
r4 := r1 - r5
F D E M W
F D D D E M W
⊲ Takie zależności usuwa się przez data forwarding lub data bypassing.
⊲ Wynik obliczony na etapie E pierwszego rozkazu przesyła się bezpośrednio do etapu E drugiego rozkazu, zanim zostanie zapisany do
rejestru wynikowego.
r1 := r2 + r3
r4 := r1 - r5
F D E M W
F D E M W
Zależności danych typu load-use
.
⊲ Potok może zostać wstrzymany, gdy rozkaz potrzebuje danych ładowanych z pamięci przez poprzedni rozkaz.
r1 := (r2 + 4)
r4 := r1 - r5
F D E M W
F D D D E M W
⊲ Data forwarding nie zawsze jest w stanie usunąć taką zależność.
r1 := (r2 + 4)
r4 := r1 - r5
F D E M W
F D D E M W
⊲ Dodatkowe opóźnienie wprowadzane przez rozkaz, gdy następny rozkaz potrzebuje jego wyniku, nazywa się latency.
⊲ Kompilator może usuwać latency, zmieniając kolejność rozkazów.
Zależności sterowania
.
⊲ Potok musi być opróżniony, gdy rozkaz warunkowy wykona skok.
branch
F D E M W
F D
F
F D E M W
⊲ W rozważanym przykładzie dodatkowe opóźnienie (latency) wynosi
dwa takty.
Rozwiązywanie zależności sterowania
⊲ Równoległe przetwarzanie obu gałęzi programu
⊲ Predykcja skoków (przewidywanie rozgałęzień)
⋄ zawsze następuje skok
⋄ nigdy nie następuje skok
⋄ decyduje kod instrukcji (kompilator)
⋄ jak przy ostatnim wykonaniu
⋄ tablica historii skoków
⊲ Opóźnione rozgałęzianie
.
Budowa potoku
.
⊲ Przykład potoku trzyetapowego
f
µf g
g
µgh
h
⊲ Każdy etap potoku to układ sekwencyjny, na rysunku są to f , g, h.
⊲ Stan przetwarzania pomiędzy etapami jest zapamiętywany w rejestrach potokowych, na rysunku µf g i µgh .
Metody zrównoleglania
.
Procesor
Zrównoleglenie
superskalarny
w trakcie wykonywania
wektorowy
(SIMD – Single Instruction Multiple Data)
algorytm
z bardzo długim słowem instrukcji
(VLIW – Very Long Instruction Word)
kompilator
Przetwarzanie wielopotokowe
.
pipeline 1
scheduler
pipeline 2
re-order
buffer
pipeline 3
⊲ Wydawanie/wykonywanie rozkazów w zmienionej kolejności (ang.
out of order issue/execution)
Zależności danych przy out of order issue
⊲ RAW – odczyt po zapisie
load-use
mov eax, [ecx+4]
add ebx, eax
.
define-use
add eax, ecx
add ebx, eax
⊲ WAR – zapis po odczycie
add eax, ebx
mov ebx, 4
⊲ WAW – zapis po zapisie
add eax, ebx
and ecx, edx
⊲ Zależności RAW rozwiązuje się jak poprzednio przez data forwarding lub data bypassing.
⊲ Zależności WAR i WAW są zależnościami fałszywymi i rozwiązuje
się je przez przemianowanie rejestrów.
Architektury RISC i CISC (1)
.
RISC – Reduced Instruction Set
Computers
CISC – Complex Instruction Set
Computers
Zawierają ograniczony, prosty
zbiór instrukcji.
Występują skomplikowane instrukcje wspierające języki wysokiego poziomu.
Zawierają małą liczbą rejestrów
i/lub rejestry specjalizowane.
Zawierają dużą liczbę uniwersalnych rejestrów.
Instrukcje arytmetyczno-logiczne wykonywane są na
rejestrach.
Instrukcje arytmetyczno-logiczne mogą pobierać argumenty z pamięci i umieszczać
wynik w pamięci.
Architektury RISC i CISC (2)
.
RISC – Reduced Instruction Set
Computers
CISC – Complex Instruction Set
Computers
Kody instrukcji są stałej długości, typowo 4 bajty, i mają stałe
rozmieszczenie pól, co ułatwia
dekodowanie.
Kody instrukcji mają zmienną
długość, typowo od jednego do
kilkunastu bajtów. Występuje
prefiksowanie instrukcji utrudniające dekodowanie.
Posiadają dużą liczbę trybów
adresowania.
Dozwolone jest adresowanie niewyrównane.
Posiadają małą liczbę trybów
adresowania.
Dozwolone jest tylko adresowanie wyrównane.
Architektury RISC i CISC (3)
CISC
rozkazy
Translator
µops
RISC
.
Geneza mikroprocesora
.
⊲ Zbyt czasochłonne projektowanie od podstaw z bramek logicznych
nowego modelu np. kalkulatora lub sterownika windy
⊲ Podczas projektowania łatwo popełnić trudny do usunięcia błąd
⊲ Układ uniwersalny – mikroprocesor
⊲ Nowa funkcjonalność przez wymianę programu
Geneza mikroprogramowania
.
⊲ Zbyt czasochłonne projektowanie od podstaw z bramek logicznych
nowej jednostki sterującej (mikro)procesora
⊲ Podczas projektowania łatwo popełnić trudny do usunięcia błąd
⊲ Uniwersalna jednostka sterująca
⊲ Nowa funkcjonalność przez wymianę mikroprogramu
Mikroprogramowanie
Język wysokiego poziomu
Asembler
Kod maszynowy
µoperacje
µprogram
sprzęt
.
Sprzętowe wsparcie dla systemów operacyjnych
⊲ Translacja adresów
⋄ segmentacja
⋄ stronicowanie, prosta i odwrotna tablica stron
⊲ Poziomy ochrony
⋄ wewnętrzny, nadzorcy, uprzywilejowany
⋄ zewnętrzny, aplikacji
⊲ Wywoływanie usług systemu operacyjnego
⋄ przerwania
⋄ specjalna instrukcja (syscall)
.
Segmentacja
pamieć wirtualna
procesu 1
pamięć liniowa
.
pamieć wirtualna
procesu 2
Stronicowanie
.
pamięć
fizyczna
(ramki)
liniowa
pamięć
wirtualna
(strony)
dysk
Tablica stron
.
liniowy adres wirtualny
nr strony
przemieszczenie
tablica stron
atrybuty
nr ramki
specjalny rejestr
nr ramki
przemieszczenie
nr ramki
adres fizyczny
Stronicowanie wielopoziomowe
.
liniowy adres wirtualny
przemieszczenie
nr tablicy nr strony
katalog tablic
tablica stron
nr ramki
nr ramki
nr ramki
specjalny rejestr
przemieszczenie
nr ramki
adres fizyczny
Odwrócona tablica stron
.
liniowy adres wirtualny
nr strony
przemieszczenie
funkcja
haszująca
odwrócona tablica stron
nr strony
atrybuty
przemieszczenie
nr ramki
adres fizyczny
TLB
.
⊲ Każde odwołanie do pamięci wymaga zajrzenia do tablicy stron,
która sama jest przechowywana w pamięci.
⊲ Taki mechanizm jest nieefektywny.
⊲ Przy odwoływaniu się do pamięci obowiązuje zasada lokalności.
⊲ Rozwiązaniem jest bufor translacji adresów (ang. TLB – Translation
Lookaside Buffer).
DMA – Direct Memory Access
.
⊲ Odciąża procesor przy przesyłaniu dużych bloków danych.
⊲ Dane przesyłane są bezpośrednio między sterownikiem urządzenia
a pamięcią operacyjną.
⊲ Przesyłanie obsługuje sterownik DMA – specjalizowany układ podłączony do szyny systemowej.
⊲ Fazy transmisji:
⋄ rozkazów – procesor inicjuje kanał DMA i zapisuje parametry
transmisji,
⋄ danych – wykonywane jest przesyłanie,
⋄ statusu – sterownik DMA zgłasza przerwanie, procesor odczytuje
status i zwalnia kanał DMA.
Mikroprocesory są wszędzie
.