לדלג לתוכן

8.1 צינור ההוראות תרגול

תרגול - צינור ההוראות

תרגיל 1 - ציור דיאגרמת צינור

נתונות 4 הוראות הבאות שרצות על צינור קלאסי בן 5 שלבים (IF, ID, EX, MEM, WB):

mov eax, 10
mov ebx, 20
add ecx, eax
sub edx, ebx
  1. ציירו דיאגרמת צינור (טבלה של הוראות מול מחזורי שעון) בהנחה שאין שום hazards. בכמה מחזורים מסתיימות כל 4 ההוראות?
  2. עכשיו שימו לב - הוראה 3 (add ecx, eax) תלויה בהוראה 1 (mov eax, 10). זהו data hazard. בהנחה שהמעבד תומך ב-forwarding מפלט EX לכניסת EX, ציירו שוב את הדיאגרמה. האם נדרש עיכוב?
  3. שנו את הוראה 1 ל-mov eax, [mem] (load מזכרון). עכשיו התוצאה מוכנה רק אחרי שלב MEM. ציירו שוב את הדיאגרמה עם forwarding מפלט MEM לכניסת EX. כמה בועות (stalls) נדרשות?

תרגיל 2 - זיהוי סכנות

נתון קטע האסמבלי הבא:

mov eax, [ebx]       ; (1) קריאה מזכרון
add eax, ecx         ; (2) חיבור
mov [edx], eax       ; (3) כתיבה לזכרון
sub ecx, 5           ; (4) חיסור
cmp ecx, 0           ; (5) השוואה
jz done              ; (6) קפיצה מותנית
  1. זהו את כל סכנות הנתונים (data hazards) בקטע הזה. לכל סכנה, ציינו בין איזה שתי הוראות היא קורית ובאיזה אוגר.
  2. איזה מהסכנות ניתן לפתור באמצעות forwarding בלבד? איזה דורש stall?
  3. זהו את סכנת הבקרה (control hazard). איזה הוראות כבר נכנסו לצינור כשהjz מתחיל להתבצע?
  4. אם הjz כן קופץ, כמה מחזורים הולכים לאיבוד בpipeline flush (בצינור 5 שלבים)?

תרגיל 3 - חישוב תפוקה

  1. צינור בן 5 שלבים מריץ 100 הוראות. בהנחה שאין hazards כלל:
  2. כמה מחזורי שעון לוקח להריץ את כל 100 ההוראות?
  3. מהי התפוקה (הוראות למחזור - IPC)?
  4. מהי התפוקה אם לא היה צינור כלל (כל הוראה 5 מחזורים)?

  5. עכשיו נניח שכל 5 הוראות יש branch שגורם ל-pipeline flush מלא (5 מחזורים מבוזבזים). חשבו מחדש:

  6. כמה מחזורים לוקח להריץ 100 הוראות?
  7. מהי התפוקה בפועל?

  8. חזרו על סעיף 2, אבל הפעם עם צינור בן 20 שלבים (כמו Pentium 4). כמה מחזורים מבוזבזים על כל branch? מה התפוקה?


תרגיל 4 - CISC לעומת RISC ומיקרו-פעולות

נתונה ההוראה הבאה בx86:

add [ebx+ecx*4], eax

הוראה זו מבצעת: קריאה מכתובת ebx+ecx*4 בזכרון, חיבור הערך עם eax, וכתיבה חזרה לאותה כתובת.

  1. פרקו את ההוראה הזו למיקרו-פעולות (uops) פשוטות - כל uop מבצע פעולה אחת בלבד (חישוב כתובת, load, פעולה אריתמטית, store). כמה uops קיבלתם?
  2. ציירו את דיאגרמת הצינור עבור ה-uops (בצינור 5 שלבים). כמה מחזורים לוקח לבצע את כל ה-uops?
  3. ההוראה המקבילה ב-RISC (ARM) תיראה כך:
    ldr r4, [r1, r2, lsl #2]   ; load מכתובת r1+r2*4 לתוך r4
    add r4, r4, r0              ; r4 = r4 + r0
    str r4, [r1, r2, lsl #2]   ; store חזרה לזכרון
    

    כמה מחזורים לוקחות 3 ההוראות האלה בצינור (עם forwarding)? השוו לתוצאה מסעיף 2.
  4. אם הצינור הפנימי של מעבד x86 עובד על uops, מה היתרון בכך שהמתכנת (או הקומפיילר) כותב הוראות CISC ולא RISC?