מחשב מייצג מספרים שלמים באמצעות ביטים, אוסף של אחדות ואפסים המתורגמים לחומרת המחשב באמצעות מתח חשמלי. בפוסט זה נספר לכם מעט על פיתוח הנקודה הצפה, לזכרו של אלכס קורנהאוזר, אחד המהנדסים הבכירים שעמל על פיתוח החומרה שתמכה בה ונפטר בשבוע שעבר.
בייצוג סטנדרטי, מספר שלם נשמר בזיכרון המחשב באמצעות רצף של אחדות ואפסים, ("ביטים") ותופס שטח אחסון קבוע. בשיטה זו יש שתי בעיות: הראשונה היא שגודל המספר המקסימלי שניתן לייצג בשיטה זו מוגבל בשל הזיכרון של המחשב. השניה היא שחסרה תמיכה בייצוג שברים כדי לפתור את הבעיות פיתחו מהנדסים את שיטת הנקודה הצפה, שבה מייצגים מספר, לעיתים בצורה מקורבת, באמצעות שני מספרים: ה"מנטיסה" שמכילה את הספרות ו ו-"אקספוננט" (חזקה) שמגדיר את מיקום הנקודה שמפרידה בין החלק השלם לשבור. המספר המיוצג הוא מכפלת המנטיסה במספר קבוע, הנקרא בסיס, שאותו מעלים בחזקת האקספוננט. מטעמי נוחות, מחשב מציג מספרים עשרוניים וגדולים בבסיס עשר. למשל, כדי לייצג את מהירות האור במטרים לשניה, במקום לכתוב 299,800,000, נוכל לכתוב 2998E5. בדוגמה זו המנטיסה היא 2998, הבסיס 10, ואקספוננט 5. בצורה זו שכתבנו מספר בן תשע ספרות למספר בן חמש ספרות. כדי לייצג שברים, נחליף את החזקה במספר שלילי.
ביצוע פעולות אריתמטיות בנקודה צפה מורכב יותר מביצוע פעולות במספרים שלמים. למשל, כדי להכפיל שני מספרים כאלו יש לחבר את האקספוננטים ולהכפיל את המנטיסות, מה שמגדיל את מספר הספרות המייצגות את התוצאה, ואז לבצע פעולות עיגול ונירמול כדי לשמור התוצאה בזיכרון בפורמט סטנדרטי - כל זאת תוך כדי בדיקות לגילוי שגיאות אפשריות.
בסוף שנות השבעים, החישובים בנקודה צפה במחשבים בוצעו על ידי פעולות בשלמים. חישובים אלו היו מאוד אִטיים כיוון שכל חישוב הצריך סדרה ארוכה של פעולות, כמו הזזות, הכפלות, חיבורים, ובדיקות למניעת חריגות. בנוסף, לא היה סטנדרט אחיד לייצוג של מספרים בזיכרון המחשב, מה שגרם לחוסר תאימות בין תוכנות ומחשבים שונים. המהנדסים בחברת אינטל העלו רעיון: הבה נאפשר למשתמשים לשדרג ולהוסיף למחשבים האישיים רכיב חכם שיממש את הפונקציות המתמטיות ביעילות [2]. מי שהרים את הכפפה היה צוות קטן של מהנדסים בסניף החיפאי של החברה. המהנדס מספר 12 שגויס לצוות היה אלכס קורנהאוזר, עולה חדש מרומניה, שהגיע ברבות השנים להיות מנכ"ל החברה בישראל ונפטר בשבוע שעבר בגיל 72.
הקבוצה אימצה טיוטה של סטנדרט בשם IEEE-754 ליצוג מספרים בשיטת נקודה צפה [3], והפכה אותו לסטנדרט התעשייתי המוביל בתחום. סטנדרט זה מגדיר את הייצוג של המספרים בזיכרון, כיצד מעגלים את המספרים אחרי פעולות נומריות וכיצד מטפלים במקרים מיוחדים, כמו גלישה מעבר לתחום המותר.
נושא מעניין בסטנדרט הוא הייצוג של מספרים מיוחדים: אם תשאלו מתמטיקאי כמה זה אחד חלקי אפס, הוא יגיד שזה לא מוגדר. אם תנסו לעשות זאת במחשב שתומך ב- IEEE-754, המחשב אכן יסכים לקביעה ויחזיר ייצוג מספרי מיוחד שאומר "אני לא מספר!" (not a number - NAN), ערך שימושי בשלל תוכנות. בנוסף, הסטנדרט תומך בייצוגים שונים של "אינסוף".
בסוף שנות השמונים חל שינוי בשוק המחשבים: בעקבות השימוש הנרחב במולטימדיה (תמונות, וידאו, אודיו) נמצא שבמקרים רבים אין צורך להשתמש בחישובים בדיוק הנרחב של נקודה צפה. למשל, במקום לשמור מספר בודד בתא זיכרון של 64 ביטים, אפשר לשמור 8 מספרים שונים שערכם מ-0 עד 255 המייצגים למשל צבעי פיקסלים, ולעשות עליהם חישובים מקביליים באמצעות פקודה אחת. תעשיית המחשבים עברה להתמקד בהאצת פעולות כאלו במספרים שלמים. הקבוצה בחיפה השתתפה במימוש הטכנולוגיה, ומי שניצח על המלאכה היה אלכס קורנהאוזר, המנהל של החברה בחיפה דאז. אולם, עולם המחשבים חווה כל הזמן שינויים. כיום, עקב ההתמקדות של התעשייה בטכנולוגיות "למידה עמוקה", הגלגל התהפך: יש חשיבות הולכת וגדלה לשימוש במספרים עם נקודה צפה, ונוצר צורך לשפר את הביצועים של שיטה זו. חברות החומרה המובילות הכריזו באחרונה על תמיכה בפורמט חדש של נקודה צפה בשם Bfloat16 המכיל רק 16 ביטים [4].
אכן, עולם המחשבים ממשיך להיטלטל הלוך ושוב כמו גל, אולם אנשים טובים שסללו את הדרך הולכים ונעלמים. אלכס טען תמיד שמנהל טוב הוא מנהל שלא מרגישים כשהוא לא בסביבה, כי הוא הכין צוות שמתפקד עצמאית. אולם הצוות שלו וגם אני דווקא הרגשנו ומרגישים בחסרונו. יהי זכרו ברוך.
הפוסט נכתב בשיתוף עם רפי נווה, לשעבר מנכ״ל אינטל חיפה
מקורות וקריאה נוספת:
[2] הרכיב 8087
[3] פורמט סטנדרטי של נקודה-צפה
[4] פורמט נקודה צפה ב-16 ביטים