Pipelining: Basics and data hazards

Download Report

Transcript Pipelining: Basics and data hazards

‫‪Data Hazards‬‬
‫• ‪Data Hazard‬‬
‫– פקודה אחת (‪ )R-Type‬מייצרת נתון חדש וכותבת אותו‬
‫לרגיסטר‬
‫– הפקודה הבאה בתור רוצה להשתמש באותו נתון‬
‫– אבל הוא לא באמת מוכן עדיין‬
‫‪1‬‬
‫‪December 2013‬‬
Data Hazards -‫דוגמה ל‬
Time (in clock cycles)
CC 1
Value of
register $2: 10
Program
execution
order
(in instructions)
sub $2, $1, $3
IM
and $12, $2, $5
or $13, $6, $2
add $14, $2, $2
sw $15, 100($2)
December 2013
CC 2
CC 3
CC 4
CC 5
CC 6
CC 7
CC 8
CC 9
10
10
10
10/– 20
– 20
– 20
– 20
– 20
DM
Reg
Reg
IM
DM
Reg
IM
DM
Reg
IM
Reg
DM
Reg
IM
Reg
Reg
Reg
DM
Reg
2
‫פתרון אפשרי ל‪Data Hazards -‬‬
‫• ‪ Data hazards‬יכולים לקרות אם מנסים להשתמש‬
‫בתוצאה לפני שהיא מוכנה ברגיסטר‬
‫• אבל היא כבר קיימת! ננסה לתפוס אותה בדרכה‬
‫לרגיסטר‬
‫• המנגנון קרוי ‪ Forwarding‬או עקיפה (‪)bypass‬‬
‫‪3‬‬
‫‪December 2013‬‬
)‫ מסלולים שונים‬3( ‫עקיפה‬
Time (in clock cycles)
CC 1
Value of register $2 : 10
Value of EX/MEM : X
Value of MEM/WB : X
CC 2
CC 3
CC 4
CC 5
CC 6
CC 7
CC 8
CC 9
10
X
X
10
X
X
10
– 20
X
10/– 20
X
– 20
– 20
X
X
– 20
X
X
– 20
X
X
– 20
X
X
DM
Reg
Program
execution order
(in instructions)
sub $2, $1, $3
IM
and $12, $2, $5
or $13, $6, $2
add $14, $2, $2
sw $15, 100($2)
December 2013
Reg
IM
Reg
IM
DM
Reg
IM
Reg
DM
Reg
IM
Reg
DM
Reg
Reg
DM
Reg
4
Forwarding Unit Checks for:
• Are we reading from a register that has not
yet been updated? - If we are, then:
– The value to be forwarded may be from the
EX/MEM pipeline register output (in MEM stage)
or the MEM/WB output (in WB stage).
– RegWrite control signal shows if we are writing to
a register.
– We must forward for both rs and rt register reads.
– Writes to register zero must not be forwarded!
• Register zero always contains a zero, even if forwarded.
– If we can forward from both EX/MEM and
MEM/WB, select the newest value, the one from
EX/MEM.
December 2013
5
Designing the Forwarding Unit
• Detect hazard conditions:
• 1a) EX/MEM.Rd = ID/EX.Rs
• 1b) EX/MEM.Rd = ID/EX.Rt
• 2a) MEM/WB.Rd = ID/EX.Rs
• 2b) MEM/WB.Rd = ID/EX.Rt
– (also check for RegWrite, zero, and
newest)
• Use these checks to control the
forwarding multiplexers
December 2013
6
Execute ‫עקיפה בשלב‬
ID/EX
Forwarding MUXes
WB
PC
Instruction
memory
WB
EX
M
MEM/WB
WB
RegWrite
Instruction
IF/ID
M
RegWrite
Control
EX/MEM
M
u
x
Registers
ALU
Data
memory
M
u
x
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
Forwarding
unit
MEM/WB.RegisterRd
Forwarding Logic
December 2013
7
‫‪Load Hazards‬‬
‫• סוג נוסף של בעיה‪ ,‬דומה ל‪Data Hazard -‬‬
‫• אחרי ‪ ,LW‬המילה שנטענה מהזיכרון לרגיסטר‬
‫עדיין לא מוכנה מיד‪...‬‬
‫• אין ברירה אלא להמתין‪ .‬אפשר להכניס ‪NOP‬‬
‫לקוד אחרי ‪LW‬‬
‫– מדוע ‪ DATA HAZARD‬לא היה צורך ב ‪NOP‬‬
‫וכאן צריך?‬
‫– ההמתנה מתחייבת משום שלוקח שני מחזורי שעון‬
‫עד שהמילה נקראת מהזיכרון ומתייצבת באוגר‬
‫‪MEM/WB‬‬
‫‪8‬‬
‫‪December 2013‬‬
Load Hazards
2
Time
4
6
8
10
12
bubble
14
Program
execution
order
(in instructions)
lw $s0, 20($t1)
sub $t2, $s0, $t3
December 2013
IF
ID
EX
MEM
WB
bubble
bubble
bubble
bubble
IF
ID
EX
MEM
WB
9
The nop (no operation) Instruction
• In MIPS the nop instruction is a machine
instruction where all 32 bits are zero.
• Actually, that is:
– An R-type instruction (op-code 0):
– A sll instruction (func-code 0):
– sll $0, $0, 0
• I.e. Shift register zero left zero times and
store the result in register zero.
– This does not change register zero, which is
always zero anyway(!)
December 2013
10
Inserting Bubbles by the Hardware
• Load Hazards can also be detected using a “hazard
detection unit” in the Decode stage.
• The hazard detection unit should stall the pipeline for
one cycle, creating an effect similar to a nop
instruction inserted by the programmer.
• This can be done by inserting a “bubble” to simulate
the nop instruction.
• Setting all control signals to 0 will have the same
effect as a nop.
• We must also hold the values in the PC and IF/ID
registers for one cycle! (by using clock enable).
December 2013
11
Inserting Bubbles in Hardware
Load hazard requires one NOP
Program
Time (in clock cycles)
execution
CC 1
CC 2
order
(in instructions)
lw $2, 20($1)
IM
and $4, $2, $5
or $8, $2, $6
add $9, $4, $2
slt $1, $6, $7
December 2013
CC 3
Reg
IM
Reg
IM
Bubble
CC 4
CC 5
DM
Reg
Reg
IM
CC 7
CC 8
CC 9
CC 10
Clock was stopped to IF/ID
DM
Reg
IM
CC 6
Reg
DM
DM
Reg
IM
Reg
Reg
Reg
Reg
DM
12
Inserting Bubbles in Hardware
Data can be taken from Reg-File, NOP is not required
Program
Time (in clock cycles)
execution
CC 1
CC 2
order
(in instructions)
lw $2, 20($1)
IM
and $4, $2, $5
or $8, $2, $6
add $9, $4, $2
slt $1, $6, $7
December 2013
CC 3
Reg
IM
Reg
IM
Bubble
CC 4
CC 5
DM
Reg
Reg
IM
CC 7
CC 8
CC 9
CC 10
Clock was stopped to PC
DM
Reg
IM
CC 6
Reg
DM
DM
Reg
IM
Reg
Reg
Reg
Reg
DM
13
Inserting Bubbles in Hardware
Program
Time (in clock cycles)
execution
CC 1
CC 2
order
(in instructions)
lw $2, 20($1)
IM
and $4, $2, $5
or $8, $2, $6
add $9, $4, $2
slt $1, $6, $7
December 2013
CC 3
Reg
IM
Reg
IM
Bubble
CC 4
CC 5
DM
Reg
Reg
IM
CC 6
CC 7
DM
Reg
Reg
IM
DM
Reg
CC 9
CC 10
Another forwarding
Reg
DM
Reg
IM
CC 8
Reg
Reg
DM
14
Bubble Insertion Hardware
Load hazard detection logic
Clock disable
IF/IDWrite
Hazard
detection
unit
ID/EX
Stall
WB
Control
0
M
u
x
Instruction
memory
Instruction
PCWrite
IF/ID
PC
Compare Reg # and
check for memory read
ID/EX.MemRead
EX/MEM
M
WB
EX
M
MEM/WB
WB
M
u
x
Registers
ALU
Data
memory
M
u
x
M
u
x
IF/ID.RegisterRs
December 2013
IF/ID.RegisterRt
IF/ID.RegisterRt
Rt
IF/ID.RegisterRd
Rd
ID/EX.RegisterRt
Rs
Rt
M
u
x
EX/MEM.RegisterRd
Forwarding
unit
MEM/WB.RegisterRd
15
Example: Load is Decoded (1/4)
December 2013
16
Example: Load Hazard is Detected (2/4)
December 2013
17
Example: Bubble Inserted (3/4)
December 2013
18
Example: Data Gets Forwarded (4/4)
December 2013
19
‫‪Control Hazards‬‬
‫• עד כה ראינו‪:‬‬
‫– ‪Data hazards‬‬
‫– ‪Load hazard‬‬
‫• בעיה שלישית‪Control Hazard :‬‬
‫• קפיצה מותנית קורית בשלב רביעי ב‪.pipe -‬‬
‫• עד שמגיעים אליה נכנסו כבר ‪ 3‬פקודות עוקבות נוספות‬
‫– לשלבי ‪IF ,ID ,EXE‬‬
‫• אם קופצים‪ ,‬יש להשמיד את ‪ 3‬הפקודות שנכנסו בטעות !‬
‫‪20‬‬
‫‪December 2013‬‬
)‫ הבקרה (תזכורת‬+ ‫מסלול הנתונים‬
PCSrc
ID/EX
0
M
u
x
1
WB
Control
IF/ID
EX/MEM
M
WB
EX
M
MEM/WB
WB
Add
ALUSrc
Read
register 1
Read
data 1
Read
register 2
Registers Read
Write
data 2
register
Write
data
Zero
ALU ALU
result
0
M
u
x
1
MemtoReg
Instruction
memory
Branch
Shift
left 2
MemWrite
Address
Instruction
PC
Add
Add result
RegWrite
4
Address
Data
memory
Read
data
Write
data
Instruction 16
[15– 0]
Instruction
[20– 16]
Instruction
[15– 11]
Sign
extend
32
6
ALU
control
0
M
u
x
1
1
M
u
x
0
MemRead
ALUOp
RegDst
December 2013
21
Control Hazards
Time (in clock cycles)
Program
execution
CC 1
CC 2
order
(in instructions)
CC 3
CC 4
CC 5
DM
Reg
CC 6
CC 7
CC 8
CC 9
28
40 beq $1, $3, 7
44 and $12, $2, $5
48 or $13, $6, $2
52 add $14, $2, $2
72 lw $4, 50($7)
IM
Reg
IM
Reg
IM
DM
Reg
IM
Reg
DM
Reg
IM
DM
Reg
corruption
Reg
Reg
DM
Reg
40+4+28=72
December 2013
22
‫פתרון ראשון‪NOP+NOP+NOP :‬‬
‫• אחרי פקודת קפיצה מותנית נכניס ‪ 3‬פעמים‬
‫‪NOP‬‬
‫• לא משנה אם קופצים או לא‪ ,‬לא יגרם נזק‬
‫• הפתרון הראשון לא יעיל‪:‬‬
‫– בד"כ ‪ 20%‬מהפקודות הן קפיצה‬
‫– לולאה טיפוסית‪ 4 :‬פקודות רגילות ‪ +‬קפיצה‬
‫– במקום ‪ 5‬מחזורים‪ ,‬תימשך ‪ 8‬מחזורים (תוספת ‪3‬‬
‫‪)NOP‬‬
‫– ירידה של ‪ 60%‬בביצועים‪...‬‬
‫‪23‬‬
‫‪December 2013‬‬
‫פתרון שני‪Useful delay slots :‬‬
‫• אולי אפשר להעביר ‪ 3‬פקודות מלפני ‪ BEQ‬לאחריו?‬
‫• דוגמה‪:‬‬
‫?‪data hazard‬‬
‫‪$t0,$t0,$t1‬‬
‫‪$t0,$zero,loop‬‬
‫‪$s0,$s1,$s2‬‬
‫‪$v0,$v1,$v0‬‬
‫‪$t2,$t3,$t4‬‬
‫‪sub‬‬
‫‪bne‬‬
‫‪add‬‬
‫‪add‬‬
‫‪xor‬‬
‫‪loop:‬‬
‫‪$t0,$t0,$t1‬‬
‫‪$s0,$s1,$s2‬‬
‫‪$v0,$v1,$v0‬‬
‫‪$t2,$t3,$t4‬‬
‫‪$t0,$zero,loop‬‬
‫‪sub‬‬
‫‪add‬‬
‫‪add‬‬
‫‪xor‬‬
‫‪bne‬‬
‫‪nop X 3‬‬
‫‪loop:‬‬
‫• בין אם תתבצע הקפיצה ובין אם לא‪ ,‬שלוש הפקודות בצבע‬
‫צריכות להתבצע‬
‫• פתרון לא קל‪ :‬קשה מאוד למצוא תמיד ‪ 3‬פקודות יעילות‬
‫שאפשר להעביר לאחר ה‪( Branch-‬אסור למשל שישפיעו על‬
‫החלטת הקפיצה)‪ .‬אם לא‪ ,‬נוסיף ‪ NOP‬כמו בפתרון הראשון‬
‫• הערה‪ :‬יש פתרונות טובים יותר ! נראה בהמשך‬
‫‪24‬‬
‫‪December 2013‬‬
‫פתרון שלישי‪Flush on Taken :‬‬
‫• נשתמש בקוד המקורי ללא שינוי‪ .‬אם לא תהיה קפיצה‬
‫(‪ )Not Take‬נמשיך כרגיל‪ .‬אם תהיה קפיצה‪ ,‬נשמיד‬
‫שלוש פקודות‬
‫• ריקון הצינור (‪)flush the pipe‬‬
‫– בדיוק כמו במקרה של ‪ :Load Hazard‬נאפס את קווי‬
‫הבקרה‬
‫• הביצועים‪:‬‬
‫– אם לא תהיה קפיצה‪ ,‬פקודה לכל מחזור שעון (‪)CPI=1‬‬
‫– אם תהיה קפיצה‪ ,‬כמו במקרה של ‪ :NOP×3‬תוספת ‪3‬‬
‫מחזורי סרק‪ ,‬ירידת ביצועים עד ‪60%‬‬
‫‪25‬‬
‫‪December 2013‬‬
EXE ‫ לשלב‬BR ‫ העברת‬:‫פתרון רביעי‬
PCSrc
ID/EX
0
M
u
x
1
WB
Control
IF/ID
EX/MEM
M
WB
EX
M
MEM/WB
WB
Add
ALUSrc
Read
register 1
Read
data 1
Read
register 2
Registers Read
Write
data 2
register
Write
data
Zero
ALU ALU
result
0
M
u
x
1
MemtoReg
Instruction
memory
Branch
Shift
left 2
MemWrite
Address
Instruction
PC
Add
Add result
RegWrite
4
Address
Data
memory
Read
data
1
M
u
x
0
Write
data
Instruction 16
[15– 0]
Instruction
[20– 16]
Instruction
[15– 11]
Sign
extend
32
6
ALU
control
0
M
u
x
1
MemRead
ALUOp
RegDst
December 2013
26
‫פתרון רביעי‪ :‬העברת ‪ BR‬לשלב ‪EXE‬‬
‫• פשוט (אין שינוי משמעותי בתכנון)‬
‫• מספר הפקודות שעלולות להיזרק ירד מ‪ 3-‬ל‪2-‬‬
‫• הפגיעה המרבית בביצועים ירדה ל‪40% -‬‬
‫• האם ניתן להמשיך ולהעביר את ה‪ Branch-‬עוד‬
‫יותר מוקדם?‬
‫כן!‬
‫‪27‬‬
‫‪December 2013‬‬
ID ‫ לשלב‬BR ‫ העברת‬:‫פתרון חמישי‬
IF.Flush
Hazard
detection
unit
ID/EX
M
u
x
WB
Control
0
M
u
x
IF/ID
4
M
WB
EX
M
MEM/WB
WB
Shift
left 2
Registers
PC
EX/MEM
=
M
u
x
Instruction
memory
ALU
Data
memory
M
u
x
M
u
x
Sign
extend
M
u
x
Forwarding
unit
December 2013
28
‫פתרון חמישי‪ :‬העברת ‪ BR‬לשלב ‪ID‬‬
‫• אין ‪ ALU‬בשלב ‪ ID‬ואין כיצד לבצע השוואה (חיסור)‬
‫• נוסיף משווה פשוט (מבוסס שערי ‪)XOR‬‬
‫• נוסיף עוד יחידת ‪ FORWARD‬כדי שההשוואה‬
‫…‬
‫תתבצע בין נתונים "טריים"‬
‫‪sub‬‬
‫‪bne‬‬
‫‪$t0,$t0,$t1‬‬
‫‪$t0,$zero,loop‬‬
‫• ‪ STALL‬עשוי עדיין להיות דרוש‬
‫חישוב כתובת הקפיצה נעשה לכל פקודה! מדוע?‬
‫חישוב כתובת הקפיצה נעשה כבר בשלב ה ‪.ID‬‬
‫‪29‬‬
‫‪December 2013‬‬
Flushing Instructions
IF.Flush
Hazard
detection
unit
ID/EX
M
u
x
WB
Control
0
M
u
x
IF/ID
4
M
WB
EX
M
MEM/WB
WB
Shift
left 2
Registers
PC
EX/MEM
=
M
u
x
Instruction
memory
ALU
Data
memory
M
u
x
M
u
x
Sign
extend
Forwarding
unit
M
u
x
Forwarding
unit
December 2013
30
‫פתרון שישי‪Single Delay Slot :‬‬
‫• נחזור לפתרון השני‪ ,‬אבל עם ‪ delay slot‬אחד בלבד‬
‫• אפשרי‪ ,‬כי כבר העברנו את ה‪ branch-‬לשלב ‪ID‬‬
‫• אין צורך בריקון‪ ,‬הפקודה אחרי ‪ branch‬מתבצעת‬
‫תמיד‬
‫– פקודה מועילה‪ ,‬אם המתכנת ‪ /‬הקומפיילר הצליחו‬
‫– פקודת ‪ NOP‬במקרים אחרים‬
‫• אזהרה‪ :‬אסור לערבב תכניות שנכתבו לפתרונות‬
‫החמישי והשישי‪ .‬מדוע?‬
‫– כי מצאנו פקודה "מועילה" שצריכה להתבצע בכל מקרה‪ ,‬גם‬
‫אם הלולאה מסתימת‪ ,‬ובפתרון חמש היא תושמד‪.‬‬
‫‪31‬‬
‫‪December 2013‬‬
‫פתרון שביעי‪ :‬החלטה דינמית‬
‫• ננחש (ע"פ ההיסטוריה) האם הקפיצה תתבצע או לא‬
‫• ע"פ הניחוש‪ ,‬נביא את הפקודה הצפויה‬
‫– הפקודה הבאה אם )‪ ,NT (Not Taken‬יעד הקפיצה אם ‪T‬‬
‫• אם הניחוש הצליח‪ ,‬הרווחנו זמן‬
‫• אם הניחוש נכשל‪:‬‬
‫– נבצע ‪ Flush‬לפקודה שהובאה ונמשיך כרגיל‬
‫– נשקול לעדכן את הניחוש לפעם הבאה‬
‫• הסיפור המלא שייך לקורס "מבנה מחשבים ספרתיים"‬
‫‪32‬‬
‫‪December 2013‬‬
‫סיכום‬
‫• השימוש ב‪ pipeline-‬אמור להאיץ את החישוב‬
‫• משלמים בחומרה ובהספק‬
‫• משלמים בסיבוך (תוכנה ‪ +‬חומרה) לטיפול ב‪-‬‬
‫‪hazards‬‬
‫‪33‬‬
‫‪December 2013‬‬