11 - II

Transkrypt

11 - II
Przetwarzanie potokowe
(pipelining)
– p. 1/30
Przypomnienie - implementacja jednocyklowa
4
Add
Add
Data
PC
Address Instruction
Instruction
memory
Register #
Registers
Register #
ALU
Address
Data
memory
Register #
Data
– p. 2/30
Wst˛ep
W implementacjach prezentowanych tydzień temu w jednym
momencie wykonuje sie˛ tylko jednen rozkaz.
Jego wykonanie przebiega w kilku fazach.
W każdej fazie używana jest tylko cz˛eść układów logicznych.
Pomysł: w momencie gdy pierwszy rozkaz rozpoczyna druga˛ faz˛e,
drugi zaczyna pierwsza;
˛ gdy pierwszy zaczyna trzecia,
˛ drugi
zaczyna druga,
˛ a trzeci pierwsza,
˛ itd.
W efekcie w jednym momencie wykonuje sie˛ tyle rozkazów ile jest
faz. Każdy wykonywany rozkaz znajduje sie˛ w innej fazie.
Taka˛ technik˛e nazywamy przetwarzaniem potokowym (ang.
pipelining).
W przetwarzaniu potokowym nie przyspieszamy wykonania
pojedynczego rozkazu (wrecz
˛ przeciwnie!).
Zysk dzieki
˛ urównolegleniu wykonywanie operacji.
– p. 3/30
MIPS - fazy wykonania rozkazu
Wykonanie rozkazu podzielimy na 5 faz:
Pobranie rozkazu z pamieci
˛ (IF, instruction fetch) - 200ps
Dekodowanie rozkazu i odczyt rejestrów (ID, instruction
decode) - 100 ps
Wykonanie operacji typu R lub wyliczenie adresu (EX, execute)
- 200 ps
Operacja na pamieci
˛ (MEM, memory) - 200 ps
Zapis do rejestru (WB, write back) - 100 ps
– p. 4/30
Porównanie
Program
execution
Time
order
(in instructions)
lw $1, 100($0)
200
Instruction
Reg
fetch
lw $2, 200($0)
400
600
Data
access
ALU
800
1000
1200
1400
ALU
Data
access
1600
1800
Reg
Instruction
Reg
fetch
800 ps
lw $3, 300($0)
Reg
Instruction
fetch
800 ps
800 ps
Program
execution
Time
order
(in instructions)
200
400
600
Instruction
fetch
Reg
lw $2, 200($0) 200 ps
Instruction
fetch
Reg
200 ps
Instruction
fetch
lw $1, 100($0)
lw $3, 300($0)
ALU
800
Data
access
ALU
Reg
1000
1200
1400
Reg
Data
access
ALU
Reg
Data
access
Reg
200 ps 200 ps 200 ps 200 ps 200 ps
– p. 5/30
Projektowanie listy rozkazów
Lista rozkazów MIPS została zaprojektowana z myśla˛ o
przetwarzaniu potokowym.
Stała długość rozkazów ułatwia ich pobieranie.
Mała liczba formatów rozkazów. Rejestry źródłowe w tych samych
miejscach - rejestry można odczytywać równolegle z
dekodowaniem rozkazu.
Operacje na pamieci
˛ wykonuja˛ tylko rozkazy lw, sw (i ich
warianty).
– p. 6/30
Hazardy
Hazardy strukturalne
Dwa rozkazy chca˛ w tej samej chwili skorzystać z tego samego
zasobu (np. ALU, pamieć,
˛ rejestry)
W zasadzie problem nie wystepuje
˛
w przypadku MIPS.
Pojawiłby sie,
˛ gdybyśmy nie rozdzieli pamieci.
˛
Hazardy danych.
Rozkaz potrzebuje rejestru, który zapisuje poprzedni rozkaz.
Np. add $s0, $t0, $t1
add $t2, $s0, $t3
Hazardy sterowania.
W przypadku rozkazu skoku nie wiadomo, który rozkaz należy
pobrać jako nastepny.
˛
Szczególnie trudne w przypadku skoków warunkowych.
– p. 7/30
Hazardy danych
Np. add $s0, $t0, $t1
add $t2, $s0, $t3
$s0 jest zapisywany dopiero w piatej
˛ fazie pierwszego rozkazu
Drugi rozkaz potrzebuje go już dwa cykle wcześniej!
Rozwiazanie
˛
kiepskie: opóźnić (jakoś) wykonanie drugiego
rozkazu o dwa cykle (dodać dwa „babelki”).
˛
Rozwiazanie
˛
programowe: reorganizacja kodu (np. przez
kompilator) - trudne.
Rozwiazanie
˛
sprz˛etowe: forwarding (bypassing)
Program
execution
Time
order
(in instructions)
add $s0, $t0, $t1
sub $t2, $s0, $t3
400
200
IF
600
800
ID
EX
MEM
IF
ID
EX
1000
WB
MEM
WB
– p. 8/30
Hazardy danych - cd.
Forwarding nie eliminuje wszystkich hazardów danych.
Program
execution
Time
order
(in instructions)
lw $s0, 20($t1)
400
200
IF
ID
bubble
sub $t2, $s0, $t3
800
600
EX
bubble
IF
MEM
bubble
ID
1000
1200
1400
WB
bubble
EX
bubble
MEM
WB
– p. 9/30
Hazardy danych - reorganizacja kodu
lw
lw
add
sw
lw
add
sw
$t1,
$t2,
$t3,
$t3,
$t4,
$t5,
$t5,
0($t0)
4($t0)
$t1, $t2
12($t0)
8($t0)
$t1, $t4
16($t0)
lw
lw
lw
add
sw
add
sw
$t1,
$t2,
$t4,
$t3,
$t3,
$t5,
$t5,
0($t0)
4($t0)
8($t0)
$t1, $t2
12($t0)
$t1, $t4
16($t0)
Z lewej strony 2 hazardy (rozkazy add) – pozostałe eliminowane
przez forwarding.
Z prawej – brak hazardów.
– p. 10/30
Hazardy sterowania
Załóżmy, że potrafimy w drugiej fazie wykonywania beq porównać
rejestry, wyliczyć adres i ustawić nowy PC
Nawet wtedy musimy opóźnić potok:
Program
execution
Time
order
(in instructions)
add $4, $5, $6
beq $1, $2, 40
200
Instruction
fetch
200 ps
400
Reg
600
ALU
Instruction
fetch
Reg
800
Data
access
ALU
1000
1200
Reg
Data
access
Reg
bubble bubble bubble bubble
or $7, $8, $9
400 ps
Instruction
fetch
1400
Reg
ALU
bubble
Data
access
Reg
– p. 11/30
Hazardy sterowania - przewidywanie skoków
Jedno z rozwiaza
˛ ń: przewidywanie skoków
Np. zakładamy, że skoki sie˛ nie wykonuja˛
Program
execution
Time
order
(in instructions)
add $4, $5, $6
beq $1, $2, 40
200
Instruction
fetch
200 ps
lw $3, 300($0)
beq $1, $2, 40
Reg
200
Instruction
fetch
200 ps
600
Reg
Reg
ALU
Instruction
fetch
Reg
ALU
1000
400 ps
Instruction
fetch
Reg
1200
1400
Reg
Data
access
Reg
bubble bubble bubble bubble
or $7, $8, $9
1400
Reg
Data
access
ALU
800
Data
access
1200
Reg
Reg
600
1000
Data
access
ALU
Instruction
fetch
400
800
Data
access
ALU
Instruction
fetch
200 ps
Program
execution
Time
order
(in instructions)
add $4, $5, $6
400
Reg
ALU
bubble
Data
access
Reg
– p. 12/30
Hazardy sterowania - przewidywanie skoków
Można zakładać, że niektóre skoki sie˛ wykonuja˛ (np. te skaczace
˛
wstecz), a inne nie.
Przewidywanie może być też dynamiczne – jeśli podczas
poprzedniego przejścia przez rozkaz skok sie˛ wykonał, to teraz też
zakładamy, że sie˛ wykona. Można prowadzić historie˛ kilku
ostatnich wykonań. Potrzebne oczywiście dodatkowe układy
logiczne.
Dobrze zorganizowane przewidywanie dynamiczne daje ponad
90% skuteczność!
Inne rozwiazanie:
˛
skoki opóźnione (stosowane naprawde˛ w MIPS,
ale niewidoczne dla programisty asemblerowego).
– p. 13/30
Model procesora potokowego
Rozważamy liste˛ rozkazów taka˛ jak tydzień temu, ale bez j.
Nowość - rejestry rozdzielajace
˛ poszczególne fazy.
Na poczatek
˛
nie przejmujemy sie˛ hazardami.
IF/ID
ID/EX
EX/MEM
MEM/WB
Add
Add Add
result
4
Shift
left 2
PC
Address
Instruction
memory
Instruction
0
M
u
x
1
Read
register 1
Read
data 1
Read
register 2
Registers
Read
Write
data 2
register
Write
data
0
M
u
x
1
Zero
ALU ALU
result
Read
data
Address
Data
memory
0
M
u
x
1
Write
data
16
32
Sign
extend
– p. 14/30
Model procesora potokowego – poprawka
Skad
˛ bierzemy numer rejestru do zapisania (dla lw)?
IF/ID
ID/EX
EX/MEM
MEM/WB
Add
Add Add
result
4
0
M
u
x
1
PC
Address
Instruction
memory
Instruction
Shift
left 2
Read
register 1
Read
data 1
Read
register 2
Registers
Read
Write
data 2
register
Write
data
0
M
u
x
1
Zero
ALU ALU
result
Read
data
Address
Data
memory
0
M
u
x
1
Write
data
16
Sign 32
extend
– p. 15/30
Model procesora potokowego - sygnały sterujace
˛
PCSrc
IF/ID
ID/EX
EX/MEM
MEM/WB
Add
Add Add
result
4
Shift
left 2
RegWrite
PC
Address
Instruction
memory
Instruction
0
M
u
x
1
Branch
Read
register 1
Read
data 1
Read
register 2
Registers
Read
Write
data 2
register
MemWrite
ALUSrc
0
M
u
x
1
Write
data
Zero
Add ALU
result
MemtoReg
Read
data
Address
Data
memory
1
M
u
x
0
Write
data
Instruction
(15–0)
Instruction
(20–16)
Instruction
(15–11)
16
32
Sign
extend
6
0
M
u
x
1
ALU
control
MemRead
ALUOp
RegDst
– p. 16/30
Model procesora potokowego – sterowanie
Sygnały sterujace
˛ podobne jak w rozwiazaniu
˛
jednocyklowym
Brak specjalnych sygnałów dla dwóch pierwszych faz (niezależne
od rozkazu)
WB
Instruction
Control
IF/ID
M
WB
EX
M
WB
ID/EX
EX/MEM
MEM/WB
– p. 17/30
PCSrc
ID/EX
Control
IF/ID
WB
EX/MEM
M
WB
EX
M
MEM/WB
WB
Add
Add Add
result
4
Instruction
memory
Read
register 1
Read
data 1
Read
register 2
Registers
Read
Write
data 2
register
Zero
ALU ALU
result
0
M
u
x
1
Write
data
MemtoReg
Address
Branch
ALUSrc
MemWrite
RegWrite
PC
Instruction
0
M
u
x
1
Shift
left 2
Read
data
Address
Data
memory
0
M
u
x
1
Write
data
Instruction
[15–0]
16
32
Sign
extend
6
Instruction
[20–16]
Instruction
[15–11]
0
M
u
x
1
ALU
control
MemRead
ALUOp
RegDst
– p. 18/30
Hazardy danych i forwarding
Time (in clock cycles)
CC 1
CC 2
Value of
register $2:
10
10
IM
Reg
CC 3
CC 4
CC 5
CC 6
CC 7
CC 8
CC 9
10
10
10/–20
–20
–20
–20
–20
DM
Reg
Program
execution
order
(in instructions)
sub $2, $1, $3
and $12, $2, $5
or $13, $6, $2
add $14, $2, $2
sw $15, 100($2)
IM
Reg
IM
DM
Reg
IM
Reg
DM
Reg
IM
Reg
DM
Reg
Reg
DM
Reg
– p. 19/30
Forwarding
Rejestry rozdzielajace
˛ fazy potoku przechowuja˛ m.in. numery
rejestów źródłowych (rs, rt) oraz przeznaczenia (rd) bioracych
˛
udział w operacji.
Cztery sytuacje:
EX/MEM.RegRd = ID/EX.RegRs
EX/MEM.RegRd = ID/EX.RegRt
MEM/WB.RegRd = ID/EX.RegRs
MEM/WB.RegRd = ID/EX.RegRt
– p. 20/30
ID/EX
EX/MEM
Registers
MEM/WB
ALU
Data
memory
M
u
x
a. No forwarding
ID/EX
EX/MEM
MEM/WB
M
u
x
Registers
ForwardA
ALU
M
u
x
Data
memory
M
u
x
ForwardB
Rs
Rt
Rt
Rd
EX/MEM.RegisterRd
M
u
x
Forwarding
unit
MEM/WB.RegisterRd
b. With forwarding
– p. 21/30
Sterowanie dla forwardingu
ID/EX
WB
Control
PC
Instruction
memory
Instruction
IF/ID
EX/MEM
M
WB
MEM/WB
EX
M
WB
M
u
x
Registers
ALU
Data
memory
M
u
x
IF/ID.RegisterRs
Rs
IF/ID.RegisterRt
Rt
IF/ID.RegisterRt
Rt
IF/ID.RegisterRd
Rd
M
u
x
EX/MEM.RegisterRd
M
u
x
Forwarding
unit
MEM/WB.RegisterRd
– p. 22/30
Hazardy nieusuwalne
lw $2, 20($1)
add $4, $2, $5
Dana jest potrzebna na jeden cykl przed odczytem z pamieci
˛
Musimy stracić jeden cykl - dodajemy pojedynczy „babelek”
˛
Time (in clock cycles)
CC 1
CC 2
CC 3
CC 4
CC 5
Reg
DM
Reg
CC 6
CC 7
CC 8
CC 9
CC 10
Program
execution
order
(in instructions)
lw $2, 20($1)
IM
bubble
and becomes nop
add $4, $2, $5
or $8, $2, $6
add $9, $4, $2
IM
Reg
IM
DM
Reg
IM
Reg
DM
DM
Reg
IM
Reg
Reg
Reg
DM
Reg
– p. 23/30
Hazard
detection
unit
IF/DWrtite
ID/EX.MemRead
ID/EX
WB
M
u
x
PCWrite
Control
PC
IF/ID
Instruction
Instruction
memory
0
EX/MEM
M
WB
MEM/WB
EX
M
WB
M
u
x
Registers
ALU
M
u
x
Data
memory
M
u
x
IF/ID.RegisterRs
IF/ID.RegisterRt
IF/ID.RegisterRt
Rt
IF/ID.RegisterRd
Rd
M
u
x
ID/EX.RegisterRt
Rs
Rt
Forwarding
unit
– p. 24/30
Hazardy sterowania
Przesuwamy wyliczanie adresu skoku oraz sprawdzanie, czy skok
sie˛ wykona do drugiej fazy.
Zakładamy, że skok sie˛ nie wykona – pobieramy do potoku kolejny
rozkaz.
Jeśli skok sie˛ jednak wykonał musimy wstawić jeden „babelek”
˛
oraz wyczyścić rejestr IF/ID
– p. 25/30
and $12, $2, $5
beq $1, $3, 7
sub $10, $4, $8
before<1>
before<2>
IF.Flush
Hazard
detection
unit
ID/EX
WB
Control
28
+
IF/ID
44
+
M
u
x
0
Shift
left 2
44
72
MEM/WB
EX
M
WB
M
u
x
$1
Registers
PC
WB
72
48
4
M
u
x
EX/MEM
M
$4
=
ALU
$3
Instruction
memory
M
u
x
7
M
u
x
$8
Data
memory
Sign
extend
10
Forwarding
unit
Clock 3
bubble (nop)
lw $4, 50($7)
beq $1, $3, 7
sub $10, . . .
before<1>
IF.Flush
Hazard
detection
unit
ID/EX
WB
M
u
x
Control
IF/ID
+
4
+
0
72
76
PC
76
72
Instruction
memory
WB
MEM/WB
EX
M
WB
M
u
x
Shift
left 2
Registers
M
u
x
EX/MEM
M
$1
=
ALU
M
u
x
$3
Data
memory
M
u
x
Sign
extend
10
Forwarding
unit
– p. 26/30
Krok dalej: superskalarność
Nowoczesne procesory maja˛ zazwyczaj po kilka równoległych
potoków. Takie procesory nazywamy superskalarnymi.
Maja˛ wobec tego po kilka jednostek wykonawczych (np. kilka kopii
ALU)
Układy zarzadzaj
˛
ace
˛ przydziałem rozkazów do poszczególnych
potoków oraz wykrywajace/usuwaj
˛
ace
˛ hazardy robia˛ sie˛ bardzo
skomplikowane.
– p. 27/30
VLIW
Inny pomysł – zrzucić problem rozdzielania rozkazów do potoków
na kompilator
Very Large Instruction Word: długa „paczka rozkazów” składajaca
˛
sie˛ z kilku prostych rozkazów
Kompilator zapewnia, że rozkazy z jednej paczki moga˛ być
wykonane równolegle (czasem oczywiście nie uda sie˛ wypełnić
całej paczki i trzeba zostawić wolne pola).
Przykładem sa˛ procesory Itanium (architektura IA-64), chociaż
intel klasyfikuje je jako EPIC (Explicitly Parallel Instruction
Computers).
– p. 28/30
Potoki w procesorach Intela
potok pojawia sie˛ w modelu 486
Pentium jest już superskalarny: dwa 5-etapowe potoki
(wczytywanie, dekodowanie, generowanie adresu, wykonanie,
zapisanie); za zapełnienie obydwu potoków odpowiadał kompilator.
Pentium II miało już 12 etapów potoku, Pentium III - 14, a Pentium
IV - 24.
dla odmiany 64-bitowy procesor Itanium ma tylko 10 etapów
potoku;
– p. 29/30
Itanium 2
Dużo rejestrów.
Potrafi wykonywać jednocześnie do 6 rozkazów
Rozkazy 128-bitowe (3 sloty po 41 bitów + 5 bitów dodatkowych)
Potoki 8-etapowe
Jednostki wykonawcze:
6 jednostek ALU całkowitoliczbowych, 1 przesuwajaca
˛
2 * 2 jednostki zmiennopozycyjne (dod/mnoż , inne)
6 jednostek wektorowych dla rozkazów multimedialnych
3 jednostki skoków.
Itanium 2 taktowany zegarem 1,5GH jest szybszy od procesorów
superskalarnych taktowanych dwukrotnie szybszym zegarem!
– p. 30/30

Podobne dokumenty