330 likes | 488 Views
Data Hazards. Data Hazard פקודה אחת ( R-Type ) מייצרת נתון חדש וכותבת אותו לרגיסטר הפקודה הבאה בתור רוצה להשתמש באותו נתון אבל הוא לא באמת מוכן עדיין. December 2013. 1. דוגמה ל- Data Hazards. T. i. m. e. (. i. n. c. l. o. c. k. c. y. c. l. e. s. ). C. C. 7. C. C. 8.
E N D
Data Hazards • Data Hazard • פקודה אחת (R-Type) מייצרת נתון חדש וכותבת אותו לרגיסטר • הפקודה הבאה בתור רוצה להשתמש באותו נתון • אבל הוא לא באמת מוכן עדיין December 2013 1
דוגמה ל-Data Hazards T i m e ( i n c l o c k c y c l e s ) C C 7 C C 8 C C 9 C C 1 C C 2 C C 3 C C 4 C C 5 C C 6 V a l u e o f r e g i s t e r $ 2 : 1 0 1 0 1 0 1 0 1 0 / – 2 0 – 2 0 – 2 0 – 2 0 – 2 0 P r o g r a m e x e c u t i o n o r d e r ( i n i n s t r u c t i o n s ) R e g D M s u b $ 2 , $ 1 , $ 3 I M R e g D M a n d $ 1 2 , $ 2 , $ 5 I M R e g I M D M R e g o r $ 1 3 , $ 6 , $ 2 R R e e g g a d d $ 1 4 , $ 2 , $ 2 I M D M R e g R e g s w $ 1 5 , 1 0 0 ( $ 2 ) I M D M R e g R e g
פתרון אפשרי ל- Data Hazards • Data hazards יכולים לקרות אם מנסים להשתמש בתוצאה לפני שהיא מוכנה ברגיסטר • אבל היא כבר קיימת! ננסה לתפוס אותה בדרכה לרגיסטר • המנגנון קרוי Forwardingאו עקיפה (bypass)
T i m e ( i n c l o c k c y c l e s ) C C 1 C C 2 C C 3 C C 4 C C 5 C C 6 C C 7 C C 8 C C 9 V a l u e o f r e g i s t e r $ 2 : 1 0 1 0 1 0 1 0 1 0 / – 2 0 – 2 0 – 2 0 – 2 0 – 2 0 V a l u e o f E X / M E M : X X X – 2 0 X X X X X V a l u e o f M E M / W B : X X X X – 2 0 X X X X P r o g r a m e x e c u t i o n o r d e r ( i n i n s t r u c t i o n s ) s u b $ 2 , $ 1 , $ 3 I M R e g D M R e g a n d $ 1 2 , $ 2 , $ 5 I M R e g D M R e g o r $ 1 3 , $ 6 , $ 2 I M R e g D M R e g a d d $ 1 4 , $ 2 , $ 2 I M R e g D M R e g s w $ 1 5 , 1 0 0 ( $ 2 ) I M R e g D M R e g עקיפה (3 מסלולים שונים)
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.
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
עקיפה בשלב Execute Forwarding MUXes Forwarding Logic I D / E X W B E X / M E M M W B C o n t r o l M E M / W B E X M W B I F / I D RegWrite RegWrite M n o u i t c x u r t s R e g i s t e r s n I D a t a I n s t r u c t i o n A L U P C m e m o r y M m e m o r y u x M 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 u I F / I D . R e g i s t e r R d R d x F o r w a r d i n g M E M / W B . R e g i s t e r R d u n i t
Load Hazards • סוג נוסף של בעיה, דומה ל- Data Hazard • אחרי LW, המילה שנטענה מהזיכרון לרגיסטר עדיין לא מוכנה מיד... • אין ברירה אלא להמתין. אפשר להכניס NOP לקוד אחרי LW • מדוע DATA HAZARD לא היה צורך ב NOP וכאן צריך? • ההמתנה מתחייבת משום שלוקח שני מחזורי שעון עד שהמילה נקראת מהזיכרון ומתייצבת באוגר MEM/WB
2 4 6 8 1 0 1 2 1 4 T i m e P r o g r a m e x e c u t i o n o r d e r ( i n i n s t r u c t i o n s ) I F I D l w $ s 0 , 2 0 ( $ t 1 ) E X M E M W B b u b b l e b u b b l e b u b b l e b u b b l e b u b b l e s u b $ t 2 , $ s 0 , $ t 3 I F I D W B E X M E M Load Hazards
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(!)
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).
P r o g r a m T i m e ( i n c l o c k c y c l e s ) e x e c u t i o n C C 1 C C 2 C C 3 C C 4 C C 5 C C 6 C C 7 C C 8 C C 9 C C 1 0 o r d e r ( i n i n s t r u c t i o n s ) R e g D M R e g I M l w $ 2 , 2 0 ( $ 1 ) R e g D M I M R e g a n d $ 4 , $ 2 , $ 5 R e g o r $ 8 , $ 2 , $ 6 D M R e g I M I M a d d $ 9 , $ 4 , $ 2 R e g I M D M s l t $ 1 , $ 6 , $ 7 R e g D M I M R e g Inserting Bubbles in Hardware Load hazard requires one NOP Clock was stopped to IF/ID R e g R e g Bubble
P r o g r a m T i m e ( i n c l o c k c y c l e s ) e x e c u t i o n C C 1 C C 2 C C 3 C C 4 C C 5 C C 6 C C 7 C C 8 C C 9 C C 1 0 o r d e r ( i n i n s t r u c t i o n s ) R e g D M R e g I M l w $ 2 , 2 0 ( $ 1 ) R e g D M I M R e g a n d $ 4 , $ 2 , $ 5 R e g o r $ 8 , $ 2 , $ 6 D M R e g I M I M a d d $ 9 , $ 4 , $ 2 R e g I M D M s l t $ 1 , $ 6 , $ 7 R e g D M I M R e g Inserting Bubbles in Hardware Data can be taken from Reg-File, NOP is not required Clock was stopped to PC R e g R e g Bubble
P r o g r a m T i m e ( i n c l o c k c y c l e s ) e x e c u t i o n C C 1 C C 2 C C 3 C C 4 C C 5 C C 6 C C 7 C C 8 C C 9 C C 1 0 o r d e r ( i n i n s t r u c t i o n s ) R e g D M R e g I M l w $ 2 , 2 0 ( $ 1 ) R e g D M I M R e g a n d $ 4 , $ 2 , $ 5 R e g o r $ 8 , $ 2 , $ 6 D M R e g I M I M a d d $ 9 , $ 4 , $ 2 R e g I M D M s l t $ 1 , $ 6 , $ 7 R e g D M I M R e g Inserting Bubbles in Hardware Another forwarding R e g R e g Bubble
I D / E X . M e m R e a d H a z a r d d e t e c t i o n u n i t I D / E X e W B t i E X / M E M r W D M I / F C o n t r o l u M W B I M E M / W B x 0 E X M W B I F / I D e t i r W M n C o u P i t c x u r t s R e g i s t e r s n D a t a I I n s t r u c t i o n A L U P C m e m o r y M m e m o r y u x M u x I F / I D . R e g i s t e r 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 M E X / M E M . R e g i s t e r R d u I F / I D . R e g i s t e r R d R d x I D / E X . R e g i s t e r R t R s F o r w a r d i n g M E M / W B . R e g i s t e r R d u n i t R t Bubble Insertion Hardware Load hazard detection logic Clock disable Compare Reg # and check for memory read Stall
Control Hazards • עד כה ראינו: • Data hazards • Load hazard • בעיה שלישית:Control Hazard • קפיצה מותנית קורית בשלב רביעי ב- pipe. • עד שמגיעים אליה נכנסו כבר 3 פקודות עוקבות נוספות • לשלבי EXE, ID, IF • אם קופצים, יש להשמיד את 3 הפקודות שנכנסו בטעות !
P C S r c I D / E X 0 M W B u E X / M E M x 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 A d d 4 A d d e r e s u l t t i r B r a n c h W S h i f t g e e l e f t 2 t i R r W A L U S r c m g n R e a d e e o i M R t r e g i s t e r 1 A d d r e s s P C c o R e a d t u r m d a t a 1 t s R e a d e n Z e r o M I r e g i s t e r 2 I n s t r u c t i o n R e g i s t e r s A L U R e a d A L U m e m o r y 0 R e a d W r i t e d a t a 2 A d d r e s s r e s u l t 1 d a t a r e g i s t e r M M D a t a u u m e m o r y W r i t e x x d a t a 1 0 W r i t e d a t a I n s t r u c t i o n 1 6 3 2 6 [ 1 5 – 0 ] S i g n A L U M e m R e 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 0 – 1 6 ] 0 A L U O p M u I n s t r u c t i o n x [ 1 5 – 1 1 ] 1 R e g D s t מסלול הנתונים + הבקרה (תזכורת)
28 Control Hazards corruption 40+4+28=72
פתרון ראשון: NOP+NOP+NOP • אחרי פקודת קפיצה מותנית נכניס 3 פעמים NOP • לא משנה אם קופצים או לא, לא יגרם נזק • הפתרון הראשון לא יעיל: • בד"כ 20% מהפקודות הן קפיצה • לולאה טיפוסית: 4 פקודות רגילות + קפיצה • במקום 5 מחזורים, תימשך 8 מחזורים (תוספת 3 NOP) • ירידה של 60%בביצועים...
פתרון שני: Useful delay slots • אולי אפשר להעביר 3 פקודות מלפני BEQ לאחריו? • דוגמה: • בין אם תתבצע הקפיצה ובין אם לא, שלוש הפקודות בצבע צריכות להתבצע • פתרון לא קל: קשה מאוד למצוא תמיד 3 פקודות יעילות שאפשר להעביר לאחר ה-Branch(אסורלמשל שישפיעו על החלטת הקפיצה). אם לא, נוסיף NOP כמו בפתרון הראשון • הערה:יש פתרונות טובים יותר ! נראה בהמשך data hazard? loop: sub $t0,$t0,$t1add $s0,$s1,$s2 add $v0,$v1,$v0xor $t2,$t3,$t4bne $t0,$zero,loop nop X 3 loop: sub $t0,$t0,$t1bne $t0,$zero,loopadd $s0,$s1,$s2 add $v0,$v1,$v0xor $t2,$t3,$t4
פתרון שלישי: Flush on Taken • נשתמש בקוד המקורי ללא שינוי. אם לא תהיה קפיצה (Not Take) נמשיך כרגיל. אם תהיה קפיצה, נשמיד שלוש פקודות • ריקון הצינור (flush the pipe) • בדיוק כמו במקרה של Load Hazard: נאפס את קווי הבקרה • הביצועים: • אם לא תהיה קפיצה, פקודה לכל מחזור שעון (CPI=1) • אם תהיה קפיצה, כמו במקרה של NOP×3: תוספת 3 מחזורי סרק, ירידת ביצועים עד 60%
A d d r e s s W r i t e d a t a M e m R e a d פתרון רביעי: העברת BR לשלב EXE P C S r c I D / E X 0 M W B u E X / M E M x 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 A d d 4 A d d r e s u l t e t i r B r a n c h W S h i f t g e l e f t 2 e t i R r A L U S r c W m g R e a d n e e o r e g i s t e r 1 i M R A d d r e s s P C t R e a d c o t u d a t a 1 r m t R e a d s e Z e r o n r e g i s t e r 2 M I I n s t r u c t i o n R e g i s t e r s A L U R e a d A L U m e m o r y 0 R e a d W r i t e d a t a 2 r e s u l t 1 d a t a r e g i s t e r M M D a t a u u m e m o r y W r i t e x x d a t a 1 0 I n s t r u c t i o n 1 6 3 2 6 [ 1 5 – 0 ] S i g n A L U 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 0 – 1 6 ] 0 A L U O p M u I n s t r u c t i o n x [ 1 5 – 1 1 ] 1 R e g D s t
פתרון רביעי: העברת BR לשלב EXE • פשוט (אין שינוי משמעותי בתכנון) • מספר הפקודות שעלולות להיזרק ירד מ-3 ל-2 • הפגיעה המרבית בביצועים ירדה ל- 40% • האם ניתן להמשיך ולהעביר את ה-Branch עוד יותר מוקדם? כן!
I F . F l u s h H a z a r d d e t e c t i o n u n i t I D / E X M u x W B E X / M E M M u C o n t r o l M W B M E M / W B x 0 E X M W B I F / I D 4 S h i f t l e f t 2 M u x = R e g i s t e r s D a t a I n s t r u c t i o n A L U P C m e m o r y M m e m o r y u x M u x S i g n e x t e n d M u x F o r w a r d i n g u n i t פתרון חמישי: העברת BR לשלב ID
פתרון חמישי: העברת BR לשלב ID • אין ALU בשלב ID ואין כיצד לבצע השוואה (חיסור) • נוסיף משווה פשוט (מבוסס שערי XOR) • נוסיף עוד יחידת FORWARD כדי שההשוואה תתבצע בין נתונים "טריים" • STALL עשוי עדיין להיות דרוש …sub $t0,$t0,$t1bne $t0,$zero,loop חישוב כתובת הקפיצה נעשה לכל פקודה! מדוע? חישוב כתובת הקפיצה נעשה כבר בשלב ה .ID
Flushing Instructions I F . F l u s h H a z a r d d e t e c t i o n u n i t I D / E X M u x W B E X / M E M M u C o n t r o l M W B M E M / W B x 0 E X M W B I F / I D 4 S h i f t l e f t 2 M u x = R e g i s t e r s D a t a I n s t r u c t i o n A L U P C m e m o r y M m e m o r y u x M u x S i g n e x t e n d Forwardingunit M u x F o r w a r d i n g u n i t
פתרון שישי: Single Delay Slot • נחזור לפתרון השני, אבל עם delay slot אחד בלבד • אפשרי, כי כבר העברנו את ה-branch לשלב ID • אין צורך בריקון, הפקודה אחרי branch מתבצעת תמיד • פקודה מועילה, אם המתכנת / הקומפיילר הצליחו • פקודת NOP במקרים אחרים • אזהרה: אסור לערבב תכניות שנכתבו לפתרונות החמישי והשישי. מדוע? • כי מצאנו פקודה "מועילה" שצריכה להתבצע בכל מקרה, גם אם הלולאה מסתימת, ובפתרון חמש היא תושמד.
פתרון שביעי: החלטה דינמית • ננחש (ע"פ ההיסטוריה) האם הקפיצה תתבצע או לא • ע"פ הניחוש, נביא את הפקודה הצפויה • הפקודה הבאה אם NT (Not Taken), יעד הקפיצה אם T • אם הניחוש הצליח, הרווחנו זמן • אם הניחוש נכשל: • נבצע Flush לפקודה שהובאה ונמשיך כרגיל • נשקול לעדכן את הניחוש לפעם הבאה • הסיפור המלא שייך לקורס "מבנה מחשבים ספרתיים"
סיכום • השימוש ב-pipeline אמור להאיץ את החישוב • משלמים בחומרה ובהספק • משלמים בסיבוך (תוכנה + חומרה) לטיפול ב-hazards