שיעור 11: התפצלות warp: ענפי if/else וביצועים
warp הוא קבוצה של 32 threads שמבצעים את אותה הוראה בו-זמנית (lockstep) במודל ה-SIMT. כל עוד כל ה-threads ב-warp הולכים באותו מסלול קוד, החומרה מריצה אותם יחד בצעד אחד. אבל מה קורה כשיש if/else שבו חלק מה-threads לוקחים את ענף ה-if וחלק את ה-else? זו התפצלות warp (warp divergence): ה-warp לא יכול להר
דמיין מקהלה של 32 זמרים שחייבים לשיר את אותה תווית בכל רגע. אם חצי צריכים לשיר 'לה' וחצי 'דו', המנצח נותן קודם לכל אומרי ה'לה' לשיר (השאר שותקים) ואז לכל אומרי ה'דו'. זה לוקח כפול זמן. אבל אם מקהלה אחת שלמה שרה 'לה' ומקהלה שנייה שלמה שרה 'דו' — שתיהן שרות בו-זמנית בלי בזבוז.
- התפצלות warp (warp divergence)
- מצב שבו threads באותו warp לוקחים ענפים שונים של if/else, אז החומרה מריצה את המסלולים ברצף — הזמן הוא סכום המסלולים.
- lockstep
- כל 32 ה-threads ב-warp מבצעים את אותה הוראה באותו צעד. זה הבסיס ל-SIMT.
- מיסוך/predication
- כשרק חלק מה-threads בענף פעילים, השאר ממוסכים: הם מריצים את אותה הוראה אבל לא כותבים תוצאה.
- ענף אחיד (uniform branch)
- תנאי שכל ה-threads ב-warp מעריכים לאותה תוצאה (למשל לפי warpId), ולכן אין התפצלות ואין קנס.