Download presentation
Presentation is loading. Please wait.
1
Data Hazards Data Hazard
פקודה אחת (R-Type) מייצרת נתון חדש וכותבת אותו לרגיסטר הפקודה הבאה בתור רוצה להשתמש באותו נתון אבל הוא לא באמת מוכן עדיין December 2013 1
2
דוגמה ל-Data Hazards December 2013 C 1 2 3 4 5 6 T i m e ( n c l o k y
) 7 8 9 / – V a u f r g t $ : s u b $ 2 , 1 3 P r o g a m e x c t i n d ( ) 5 6 4 w R e g I M D December 2013
3
פתרון אפשרי ל- Data Hazards
אבל היא כבר קיימת! ננסה לתפוס אותה בדרכה לרגיסטר המנגנון קרוי Forwarding או עקיפה (bypass) December 2013
4
עקיפה (3 מסלולים שונים) Assuming RegFile forwards on same cycle.
1 2 3 4 5 6 T i m ( n c l o k y s ) u b $ , P r a x t d D 7 8 9 / – w V f : X E W B Assuming RegFile forwards on same cycle. December 2013
5
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
6
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
7
עקיפה בשלב Execute Forwarding MUXes Forwarding Logic December 2013
/ E X W B E X / M E M C o n t r o l M W B RegWrite M E M / W B I F / I D E X r RegWrite M W B n M o t i u c u x s t r n R e g i s t e r s I n s t r u c t i o n I D a t a P C A L U m e m o r y m e m o r y M u M x u x I F / I D . R e g i s t e r R s R s I F / I D . R e g i s t e r R t R t I F / I D . R e g i s t e r R t R t M E X / M E M . R e g i s t e r R d I F / I D . R e g i s t e r R d R d u x F o r w a r d i n g M E M / W B . R e g i s t e R d u n i t Forwarding Logic December 2013
8
Load Hazards סוג נוסף של בעיה, דומה ל- Data Hazard
אחרי LW, המילה שנטענה מהזיכרון לרגיסטר עדיין לא מוכנה מיד... אין ברירה אלא להמתין. אפשר להכניס NOP לקוד אחרי LW מדוע DATA HAZARD לא היה צורך ב NOP וכאן צריך? ההמתנה מתחייבת משום שלוקח שני מחזורי שעון עד שהמילה נקראת מהזיכרון ומתייצבת באוגר MEM/WB December 2013
9
Load Hazards December 2013 T i m e 2 4 6 8 1 l w $ s , ( t ) u b 3 P r
l w $ s , ( t ) u b 3 P r o g a x c n d I F D W B M E X December 2013
10
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
11
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
12
Inserting Bubbles in Hardware
Load hazard requires one NOP l w $ 2 , ( 1 ) P r o g a m e x c u t i n d s 4 5 8 6 9 7 R I M D C 3 5 C 6 T i m e ( n c l o k y s ) I M R g D 7 8 9 1 Clock was stopped to IF/ID R e g Bubble R e g December 2013
13
Inserting Bubbles in Hardware
Data can be taken from Reg-File, NOP is not required l w $ 2 , ( 1 ) P r o g a m e x c u t i n d s 4 5 8 6 9 7 R I M D C 3 5 C 6 T i m e ( n c l o k y s ) I M R g D 7 8 9 1 Clock was stopped to PC R e g Bubble R e g December 2013
14
Inserting Bubbles in Hardware
$ 2 , ( 1 ) P r o g a m e x c u t i n d s 4 5 8 6 9 7 R I M D C 3 5 C 6 T i m e ( n c l o k y s ) I M R g D 7 8 9 1 R e g Another forwarding Bubble R e g December 2013
15
Bubble Insertion Hardware
Load hazard detection logic Clock disable Compare Reg # and check for memory read P C I n s t r u c i o m e y R g M x l A L U E X W B D / a H z d F w . Stall December 2013
16
Example: Load is Decoded (1/4)
December 2013
17
Example: Load Hazard is Detected (2/4)
December 2013
18
Example: Bubble Inserted (3/4)
December 2013
19
Example: Data Gets Forwarded (4/4)
December 2013
20
Control Hazards עד כה ראינו: בעיה שלישית: Control Hazard
Data hazards Load hazard בעיה שלישית: Control Hazard קפיצה מותנית קורית בשלב רביעי ב- pipe. עד שמגיעים אליה נכנסו כבר 3 פקודות עוקבות נוספות לשלבי EXE, ID, IF אם קופצים, יש להשמיד את 3 הפקודות שנכנסו בטעות ! December 2013
21
מסלול הנתונים + הבקרה (תזכורת)
P C I n s t r u c i o m e y A d [ 2 – 1 6 ] M R g L U O p B a h D S 4 3 5 x l W Z f E X F / December 2013
22
Control Hazards 28 =72 corruption December 2013
23
פתרון ראשון: NOP+NOP+NOP
לא משנה אם קופצים או לא, לא יגרם נזק הפתרון הראשון לא יעיל: בד"כ 20% מהפקודות הן קפיצה לולאה טיפוסית: 4 פקודות רגילות + קפיצה במקום 5 מחזורים, תימשך 8 מחזורים (תוספת 3 NOP) ירידה של 60% בביצועים... December 2013
24
פתרון שני: Useful delay slots
אולי אפשר להעביר 3 פקודות מלפני BEQ לאחריו? דוגמה: בין אם תתבצע הקפיצה ובין אם לא, שלוש הפקודות בצבע צריכות להתבצע פתרון לא קל: קשה מאוד למצוא תמיד 3 פקודות יעילות שאפשר להעביר לאחר ה-Branch (אסור למשל שישפיעו על החלטת הקפיצה). אם לא, נוסיף NOP כמו בפתרון הראשון הערה: יש פתרונות טובים יותר ! נראה בהמשך data hazard? loop: sub $t0,$t0,$t1 add $s0,$s1,$s2 add $v0,$v1,$v0 xor $t2,$t3,$t4 bne $t0,$zero,loop nop X 3 loop: sub $t0,$t0,$t1 bne $t0,$zero,loop add $s0,$s1,$s2 add $v0,$v1,$v0 xor $t2,$t3,$t4 December 2013
25
פתרון שלישי: Flush on Taken
נשתמש בקוד המקורי ללא שינוי. אם לא תהיה קפיצה (Not Take) נמשיך כרגיל. אם תהיה קפיצה, נשמיד שלוש פקודות ריקון הצינור (flush the pipe) בדיוק כמו במקרה של Load Hazard: נאפס את קווי הבקרה הביצועים: אם לא תהיה קפיצה, פקודה לכל מחזור שעון (CPI=1) אם תהיה קפיצה, כמו במקרה של NOP×3: תוספת 3 מחזורי סרק, ירידת ביצועים עד 60% December 2013
26
פתרון רביעי: העברת BR לשלב EXE
P C S r c I D / E X M u W B x E X / M E M 1 C o n t r o l M W B M E M / W B E X M W B I F / I D A d d 4 A d d A d d e r e s u l t B r a n c h t i W r S h i f t g e l e f t 2 e R t A L U S r c r i W n R e a d m e g P C A d d r e s s o c t i r e g i s t e r 1 e R e a d M R u o r t s t R e a d d a t a 1 m I n s t r u c t i o n n I r e g i s t e r 2 Z e r o e M m e m o r y R e g i s t e r s R e a d A L U A L U W r i t e d a t a 2 r e s u l t A d r e s R e a d 1 r e g i s t e r M d a t a u D a t a M W r i t e x m e m o r y u d a t a x 1 W r i t e d a I n s t r u c t i o n [ 1 5 – ] 1 6 3 2 6 S i g n A L U M e m R a d e x t e n d c o n t r o l I n s t r u c t i o n [ 2 – 1 6 ] A L U O p M I n s t r u c t i o n u [ 1 5 – 1 1 ] x 1 R e g D s t December 2013
27
פתרון רביעי: העברת BR לשלב EXE
פשוט (אין שינוי משמעותי בתכנון) מספר הפקודות שעלולות להיזרק ירד מ-3 ל-2 הפגיעה המרבית בביצועים ירדה ל- 40% האם ניתן להמשיך ולהעביר את ה-Branch עוד יותר מוקדם? כן! December 2013
28
פתרון חמישי: העברת BR לשלב ID
P C I n s t r u c i o m e y 4 R g M x A L U E X W B D / a H z d F w . l h S = f 2 December 2013
29
פתרון חמישי: העברת BR לשלב ID
אין ALU בשלב ID ואין כיצד לבצע השוואה (חיסור) נוסיף משווה פשוט (מבוסס שערי XOR) נוסיף עוד יחידת FORWARD כדי שההשוואה תתבצע בין נתונים "טריים" STALL עשוי עדיין להיות דרוש … sub $t0,$t0,$t1 bne $t0,$zero,loop חישוב כתובת הקפיצה נעשה לכל פקודה! מדוע? חישוב כתובת הקפיצה נעשה כבר בשלב ה .ID December 2013
30
Flushing Instructions
. F l u s h H a z a r d d e t e c t i o n u n i t M I D / E X u x W B E X / M E M M C o n t r o l u M W B x M E M / W B I F / I D E X M W B 4 S h i f t l e f t 2 M u = x R e g i s t e r s P C I n s t r u c t i o n A L U D a t a m e m o r y m e m o r y M u M x u x S i g n e x t e n d Forwarding unit M u x F o r w a r d i n g u n i t December 2013
31
פתרון שישי: Single Delay Slot
אפשרי, כי כבר העברנו את ה-branch לשלב ID אין צורך בריקון, הפקודה אחרי branch מתבצעת תמיד פקודה מועילה, אם המתכנת / הקומפיילר הצליחו פקודת NOP במקרים אחרים אזהרה: אסור לערבב תכניות שנכתבו לפתרונות החמישי והשישי. מדוע? כי מצאנו פקודה "מועילה" שצריכה להתבצע בכל מקרה, גם אם הלולאה מסתימת, ובפתרון חמש היא תושמד. December 2013
32
פתרון שביעי: החלטה דינמית
ננחש (ע"פ ההיסטוריה) האם הקפיצה תתבצע או לא ע"פ הניחוש, נביא את הפקודה הצפויה הפקודה הבאה אם NT (Not Taken), יעד הקפיצה אם T אם הניחוש הצליח, הרווחנו זמן אם הניחוש נכשל: נבצע Flush לפקודה שהובאה ונמשיך כרגיל נשקול לעדכן את הניחוש לפעם הבאה הסיפור המלא שייך לקורס "מבנה מחשבים ספרתיים" December 2013
33
סיכום השימוש ב-pipeline אמור להאיץ את החישוב משלמים בחומרה ובהספק
משלמים בסיבוך (תוכנה + חומרה) לטיפול ב- hazards December 2013
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.