מהי חיזוי סניף?

כמעט בכל תוכנת מחשב, ישנם חלקים מהקוד המסתעפים לנתיבים נפרדים. לדוגמה, להצהרה אם-אז-אחר יש שתי תוצאות אפשריות. הצהרות אלו אינן מציגות שום בעיה למעבדים עוקבים, מכיוון שה-CPU מעבד כל פקודה לפי הסדר. סניפים מהווים בעיה גדולה עבור מעבדים בצנרת, מכיוון שמספר הוראות מבוצעות בבת אחת.

התרחיש

במקרה של תוכנית עם הצהרה מסועפת עם שתי תוצאות אפשריות, שני נתיבי הקוד האפשריים לא יכולים להיות באותו מקום. העיבוד הנדרש להשלמת כל אחת מהאפשרויות יהיה שונה. אחרת, התוכנית לא תסתעף. סביר להניח שיהיו מספר לא מבוטל של הצהרות מסועפות שנלקחות רק פעם אחת, כמו הצהרת if.

יש גם הצהרות מסועפות היוצרות לולאה. אף על פי שאולי אלה אינם נפוצים מספרית כמו הצהרות חד פעמיות, הם בדרך כלל חוזרים על עצמם סטטיסטית. אפשר להניח שסביר יותר שסניף יחזיר אותך ללופ מאשר לא.

למה זו בעיה?

זה לא משנה איך הבעיה הזו מנוסחת במעבד רציף מלא. זה פשוט לא בעיה. איזה סניף יילקח ידוע לפני עיבוד החלק הראשון של ההוראה הבאה.

עם זאת, במעבד בצינור, ההוראות הבאות עומדות בתור. הם כבר בעיבוד כאשר המעבד יודע איזה סניף נלקח. אז איך המעבד צריך להתמודד עם התרחיש הזה? יש כמה אפשרויות. הגרוע מכל הוא פשוט להמתין ולהשאיר את הצינור ריק בזמן שהוא ממתין לתשובה באיזה סניף לקחת. זה אומר שבכל פעם שיש לך הצהרה מסועפת, אתה תמיד תאבד לפחות כמה מחזורים של זמן מעבד כמו שיש לך שלבים בצנרת.

לחלופין, תוכל לנסות להפעיל את שתי האפשרויות בצנרת ולבטל את הבחירה השגויה. זה יהיה חצי מהעונש של לא לעשות כלום אבל עדיין יגרור עונש ביצוע על כל הצהרה מסועפת. בהתחשב בכך שמעבדים מודרניים יכולים גם להריץ הוראות ללא תקינות, אתה יכול לנסות להפעיל כל הוראות מסועפות בהקדם האפשרי. אז התוצאה שלו ידועה לפני שצריך. אפשרות זו יכולה להיות מועילה, אלא שהיא לא ניתנת להרחבה. נניח שיש לך צפיפות גבוהה יחסית של הצהרות מסתעפות. במקרה כזה, פשוט לא תוכל להפעיל את כולם מוקדם מבלי שיהיה לך זמן סרק.

איך הנושא הזה באמת מטופל

במציאות, המעבד כולל מנבא ענפים. מנבא הענפים מנסה לנחש איזו תוצאה של בחירת הסתעפות תילקח. לאחר מכן המעבד מניח שהתחזית נכונה ומתזמן הוראות. אם מנבא הענפים מדויק, אין עונש ביצוע.

אם מנבא הענפים עושה טעות, עליך לשטוף את הצינור ולהתחיל לעבד את התוצאה בפועל. זה אכן מביא לעונש ביצועים קצת יותר גרוע מאשר שלא עשה כלום ורק חיכיתי לתוצאה. כדי לקבל את הביצועים הטובים ביותר, חשוב לוודא שחיזוי הענפים יהיה מדויק ככל האפשר. יש מגוון של גישות שונות לכך.

קוד תואם

בקוד מכונה, ענף הוא תמיד בחירה בין קריאת ההוראה הבאה או קפיצה לקבוצת הוראות במקום אחר. כמה יישומים מוקדמים של מנבאי ענפים פשוט הניחו שכל הענפים תמיד ייקחו או לעולם לא ייקחו. ליישום זה יכול להיות שיעור הצלחה מפתיע לטובה אם המהדרים יודעים את ההתנהגות הזו והם יודעים זאת נועד להתאים את קוד המכונה כך שהתוצאה הסבירה ביותר תתיישר עם כללי המעבד הנחה. זה דורש הרבה כוונון והתאמת הרגלי פיתוח תוכנה.

חלופה נוספת הייתה ללמוד מהנתון שלולאות נלקחות בדרך כלל ותמיד קופצות אם הענף הולך אחורה ב- זרם הוראות ולעולם לא לקפוץ אם הקפיצה היא קדימה כי זה בדרך כלל יהיה המצב הפחות סביר סטטיסטית של עזיבת לוּלָאָה. אלו הם שני סוגי חיזוי ענף סטטי, כאשר התוצאה של ענף חזויה בזמן הידור.

מנבאים סניפים דינמיים

מנבאי ענפים מודרניים הם דינמיים, תוך שימוש בסטטיסטיקה מהתוכנית הפועלת כעת כדי להשיג אחוזי הצלחה חיזוי טובים יותר. מונה רוויה הוא בסיס לכל מנבאי הענפים הנוכחיים. הניחוש הראשון נקבע באופן סטטי או אקראי. ברגע שענף נלקח או לא נלקח, תוצאה זו נשמרת בחלק מהזיכרון. בפעם הבאה שאותו ענף מגיע, מנבא הענפים מנבא את אותה התוצאה כמו קודם.

זה גורם באופן טבעי לשיעורי חיזוי טובים עבור לולאות. ישנן שתי גרסאות של זה. הגרסאות המוקדמות פשוט השתמשו בפיסת נתונים בודדת כדי לציין אם הענף נלקח או לא. גרסאות מאוחרות יותר משתמשות בשני ביטים כדי לציין בחירה חלשה או חזקה או לא נלקחה. הגדרה זו עדיין יכולה לחזות את התוצאה של לקיחת לולאה אם ​​התוכנית תחזור אליה, ובדרך כלל מגדילה את אחוזי ההצלחה.

דפוסי מעקב

כדי לעקוב אחר דפוסים, כמה מנבאי ענפים עוקבים אחר היסטוריה של הבחירות שננקטו. לדוגמה, נניח שלולאה נקראת ברציפות אך רק עוברת ארבע פעמים לפני היציאה מהלולאה. במקרה כזה, מנבא אדפטיבי דו-שלבי יכול לזהות את הדפוס הזה ולחזות אותו לקרות שוב. זה מגדיל את אחוזי ההצלחה עוד יותר על מונה רווי פשוט. מנבאי ענפים מודרניים מתבססים על כך על ידי שימוש ברשת עצבית כדי לזהות ולחזות דפוסים.

מנבא ענפים רווי של 2 סיביות עדיין יכול לחזות סניף שנלקח, גם אם הוא לא היה בעבר. זה מאפשר לו לחזות שלולאה תילקח מחדש, גם לאחר שהיא הושארה פעם אחת.

כמה מנבאי ענפים משתמשים במספר אלגוריתמים ולאחר מכן משווים את התוצאות כדי להחליט באיזו חיזוי להשתמש. מערכות מסוימות עוקבות אחר כל הוראת הסתעפות בנפרד במה שנקרא חיזוי סניף מקומי. אחרים משתמשים במערכת חיזוי ענפים גלובלית כדי לעקוב אחר כל הוראות ההסתעפות האחרונות. לשניהם יש את השימושים והחסרונות שלהם.

מנבא ענפים המשתמש בטבלת היסטוריית תבניות עשוי לזהות דפוסים חוזרים כאשר נלקחים ענפים מסוימים. כגון חיזוי שלופ נלקח רק שלוש פעמים לפני שיוצאים ממנה.

סיכום

מנבא ענפים הוא חלק מיוחד של מעבד בצינור. הוא מנסה לחזות את התוצאה של הוראה מסועפת לפני שההוראה בפועל מעובדת. זוהי פונקציית ליבה של מעבד בצנרת מכיוון שהיא מאפשרת למעבד לשמור על הצינור רווי גם אם לא בטוח אילו הוראות יש לבצע. הם אינם מציעים הפחתה בביצועים כאשר הם נכונים. אלגוריתמים מודרניים יכולים להיות מדויקים בעומסי עבודה צפויים יחסית עד 97% מהזמן.

אין שיטת חיזוי מושלמת, ולכן ההטמעות משתנות. השפעת הביצועים של חיזוי שגוי תלויה באורך הצינור. באופן ספציפי, ניתן לקבוע את אורך הצינור לפני זה אם התחזית הייתה שגויה. זה תלוי גם בכמה הוראות יש בכל שלב של צינור. למעבדים שולחניים מתקדמים מודרניים יש כ-19 שלבי צינור ויכולים להריץ לפחות ארבע הוראות בו-זמנית בכל שלב.