חיזוי הסתעפויות מוסבר - Branch Prediction, הניחוש שגורם למעבד שלכם לרוץ מהר יותר¶
תשאלו את עצמכם רגע: איך בכלל אפשר להריץ מהר קוד שיש בו if, אם המעבד לא יכול לדעת מראש לאיזה כיוון התנאי ילך? התשובה, ותאמינו לי שהיא אחת התשובות היפות שיש בארכיטקטורת מחשבים, היא שהמעבד פשוט מנחש. ולא סתם מנחש - הוא מהמר בצורה חכמה, ורוב הזמן צודק.
למה מעבד בכלל צריך לנחש משהו¶
מעבדים מודרניים לא מריצים הוראה אחת בכל פעם ומחכים שהיא תסתיים לגמרי לפני שהם מתחילים את הבאה. הם עובדים בשיטה שנקראת pipelining, קו ייצור שבו כמה הוראות נמצאות בו זמנית בשלבי עיבוד שונים, כדי לשמור על תפוקה גבוהה. הבעיה מתחילה כשמגיעים להסתעפות מותנית, כלומר if, תנאי לולאה, או כל דבר שדורש החלטה. המעבד לא באמת יודע לאיזה כיוון להמשיך עד שהתנאי מחושב בפועל, וזה קורה יחסית מאוחר בקו הייצור.
אז מה עושים, עוצרים ומחכים?¶
זו האופציה הפשוטה, וגם הגרועה. עצירה של קו הייצור בכל הסתעפות תהרוס את כל היתרון של pipelining מלכתחילה. אז במקום לעצור, המעבד מהמר. יש לו חומרה ייעודית שזוכרת דפוסים - איך ההסתעפות הזאת התנהגה בפעמים הקודמות שהיא נתקלה בה - ועל בסיס הדפוס הזה, הוא בוחר את הכיוון הסביר יותר ומתחיל לבצע הוראות ממנו באופן ספקולטיבי, עוד לפני שהוא בכלל יודע בוודאות שזה נכון.
מה קורה כשהניחוש טועה¶
אם הניחוש נכון, ניצחתם - חסכתם זמן יקר שהיה הולך לאיבוד בהמתנה. אבל אם הניחוש שגוי, המעבד צריך לזרוק לפח את כל העבודה הספקולטיבית שכבר ביצע, לרוקן את קו הייצור, ולהתחיל מחדש מהכיוון הנכון. זה נקרא branch misprediction, וזו לא תופעה תיאורטית - היא עולה זמן וביצועים אמיתיים וניתנים למדידה.
למה זה בכלל משנה לכם כמתכנתים¶
המשמעות המעשית היא שקוד עם דפוסי הסתעפות עקביים וניתנים לניחוש רץ מהר יותר מקוד עם הסתעפויות אקראיות למעשה. תנאי שכמעט תמיד יוצא אמת, או לולאה עם מספר איטרציות עקבי, קלים למעבד לנחש נכון. הסתעפות שמתנהגת אקראית לגמרי מנצחת את החיזוי כמעט תמיד, ומעבירה את המעבד דרך מחזור של ניחוש-טעות-איפוס שוב ושוב. זה שיקול ביצועים אמיתי, אם כי מתקדם, שמתכנתים שעובדים על קוד קריטי לביצועים לוקחים בחשבון.
הטריק הקטן שהפך לענק - Spectre¶
הדבר המדהים בסיפור הזה הוא כמה רחוק הוא הגיע. אותו מנגנון ניחוש וביצוע ספקולטיבי, שנועד רק לחסוך מחזורי שעון, התברר כמקור לאחת ממשפחות פרצות האבטחה המשמעותיות בהיסטוריה של מעבדים - Spectre. בלי להיכנס לפרטים הטכניים, זו דוגמה מושלמת לכך שאפילו טריק חומרה "טכני ומשעמם" יכול להיות בעל השלכות עולמיות ממש, וזו סיבה נוספת להבין איך המעבד באמת עובד מבפנים ולא רק לקחת אותו כמובן מאליו.
בדיוק הבנה כזאת, ברמת החומרה עצמה, היא חלק מרכזי בקורס ליבת המחשב, שבו אנחנו יורדים לרמת המעבד כדי להבין לא רק מה קורה, אלא למה זה קורה.
ואם התחום הזה מרתק אתכם, יש קהילה שלמה שאוהבת לדבר בדיוק על הדברים האלה.
לסיכום¶
חיזוי הסתעפויות הוא דוגמה מושלמת לכך שהמעבד שלכם לא רק מבצע פקודות, הוא גם מהמר עליהן בצורה חכמה כדי לרוץ מהר יותר. ברגע שתבינו את זה, גם שאלות ביצועים שנראו כמו קסם, וגם חלק ניכר מהעולם של אבטחת חומרה, יתחילו להרגיש הרבה יותר הגיוניות.