(GPU (Graphics Processing Unit הוא מעבד שפותח לצורך הצגת גרפיקה במחשבים ובמכונות משחק [1]. כיוון שהוא מצטיין בחישובים נומריים, משתמשים בו גם בתחומים אחרים, למשל בבינה מלאכותית. מה שמקנה ל-GPU יעילות רבה הוא השימוש בתת-תהליכים רבים. תת-תהליכים ("threads") זכו לשם עברי נאה – תהליכונים, ובעזרת אנלוגיה נסביר מהם. לעיתים מנסים להשוות בין יעילות הביצועים של GPU לבין זו של המעבדים הראשיים (CPU), או זו של מאיצים לאינטליגנציה מלאכותית. נראה דוגמה מתחום חשוב, שמלמדת כי התשובה לאתגר היעילות נמצאת בעצם במקום אחר.
נדמיין משרד (="מחשב") שבו עובדים מאבחנים תעסוקתיים. המאבחנים מקבלים ציוני מבחנים של מועמדים, וכל מאבחן מבצע עליהם חישוב שונה. למשל, אחד מהם מחשב את מידת ההתאמה של המועמד להיות שף במסעדה יפנית, ואחר את מידת ההתאמה שלו להיות פיזיקאי תאורטי.
מטעמי חיסכון יש במשרד המשונה רק מחשבון אחד, וכדי לנצל אותו כל הזמן, כאשר שליח מביא תוצאת בחינה (= "נתון מהזיכרון"), יש להשתמש בה מייד. המאבחנים מחכים בחדר המתנה, שליח מגיע, והמנהלת קוראת: "השליח הביא את ציון מבחן 7 של אליס. מאבחן-5 – גש מייד למחשבון!" מאבחן-5, העוסק בחישוב התאמה כלשהי עבור אליס, משתמש בציון שהגיע, שומר תוצאת חישוב זמנית בכיסו וחוזר לחדר ההמתנה. באותו זמן מגיע שליח נוסף עם ציון מבחן 3 של בוב. המנהלת מוצאת שציון זה דרוש לחישובים של מאבחן-2; כשהמחשבון מתפנה היא קוראת למאבחן, והוא ניגש אליו מייד. כך ממשיך הצוות לבצע חישובים במהירות האפשרית ומנצל את המחשבון באופן מרבי.
כל מאבחן שקוע בחישוב תוצאה עבור מועמד כלשהו. נקרא למשימה זו תהליכון ("thread"). מאבחן-5 עוסק בתהליכון עבור אליס, מאבחן-3 עבור בוב, וכולי. כל תהליכון "חי" זמן קצר יחסית, והוא יכול להתקיים בו-זמנית עם תהליכונים אחרים; חלק מן הזמן הוא במצב פעיל (כשנעשה שימוש במחשבון) וחלק מן הזמן במצב המתנה.
מתכנני המעבדים הגרפיים נתקלו באתגרים דומים: כיצד לנצל ביעילות את משאבי החומרה? מעבדים אלה נדרשים לבצע פעולות חישוב רבות במקביל. למשל, בהפעלת מסנן מְמַצֵּעַ על תמונה מחשבים ערכים חדשים עבור פיקסלים רבים בעת ובעונה אחת. הוספת רכיבי חומרה שמבצעים כפל וחיבור (="מחשבונים") עבור כל אחת מהפעולות ולכל פיקסל אינה יעילה, מכיוון שחלק גדול מהזמן מתבזבז ממילא על המתנה לנתונים שיגיעו מהזיכרון (="הגעת השליחים"). בעיות דומות קיימות גם ביישומים של בינה מלאכותית. הפתרון שנתנו המתכננים הוא זיכרון פנימי שבו שומרים הרבה תהליכונים המחכים לתורם (="חדר המתנה"), וכאשר הנתונים הדרושים לתהליכון זמינים, מעוררים אותו. התהליכון תופס יחידת חישוב לזמן קצר, מחשב, שומר את התוצאות החלקיות בזיכרונו הפנימי וחוזר לישון.
ה-GPU המודרניים משתמשים ביחידות חישוב רבות, המבצעות המוני תהליכונים. כדי להתמודד עם מורכבות התקשורת בין יחידות החישוב, כוללים ה-GPU כמה יחידות נפרדות, הנקראות ליבות, וכל ליבה מבצעת חישובים בלי תלות בליבות האחרות.
בפוסט נפרד נספר על שיטות החישוב במעבד הראשי שבמחשב (CPU) [2] ונשווה ל-GPU. בינתיים נציין שב-CPU יש שיטות אחרות לביצוע בו-זמני של פעולות באופן יעיל, למשל [3] טכנולוגיה הקרויה out-of-order. כמו כן, גם ב-CPU מתבצעים תהליכים רבים בעת ובעונה אחת, ולשם כך משתמשים בשלל ליבות, ומבצעים בכל ליבה כמה תהליכים במקביל [4].
עד כה התעלמנו מהפיל הגדול שבחדר ההמתנה: קצב הגעת השליחים, או בעולם המחשבים – רוחב הצינור לזיכרון. לעיתים קרובות רמת הביצועים של מעבד נקבעת על ידי כמות הנתונים שהוא יכול לקרוא מן הזיכרון ולכתוב בזיכרון בו-זמנית, והיעילות שבה הוא משתמש בהם. קצב קריאת נתונים מהזיכרון החיצוני נקבע על ידי טכנולוגיית הזיכרון של המחשב. אולם כיצד ניתן להשתמש בנתונים שמגיעים באופן יעיל?
נחזור לאנלוגיה שלנו ונראה דוגמה מאתגרת: נניח שציון ההתאמה שנותן כל מאבחן למועמד הוא ממוצע משוקלל של תוצאות 50 המבחנים של המועמד, כלומר יש להכפיל כל אחד מ-50 הציונים ב-50 ערכים (הנקראים משקלים), ולסכום את התוצאות. נניח גם שיש למשרד 1000 מועמדים ועשרים מאבחנים. לחובבי המתמטיקה נגלה שכדי לחשב את 20 ציוני ההתאמה למועמד צריך "רק" להכפיל מטריצה של 1000 שורות ו-50 עמודות (תוצאות המבחנים) במטריצה של 50 שורות ו-20 עמודות (המשקלים שבהם משתמש כל מאבחן לשקלול מבחן), והתוצאה היא מטריצה בת אלף שורות ועשרים עמודות (ראו איור).
אומנם המתמטיקה פשוטה, אך בכל זאת הכפלת מטריצות גדולות ביעילות היא פעולה מאתגרת, מכיוון ששטח האחסון הפנימי בתוך המעבדים מוגבל, וכל איבר של מטריצה שנקרא מן הזיכרון משמש לכמה חישובים (למשל, הציון של מבחן 7 עבור אליס שימש 20 בוחנים, והמשקל שנתן מאבחן-5 למבחן זה שימש אותו 1000 פעמים). כדי לחסוך קריאות חוזרות של נתונים מן הזיכרון, מנצלים את כל הזיכרונות המקומיים שבתוך המעבדים ("שמירת דפי נתונים על השולחנות והמדפים במשרד") ומתזמנים את הגעת השליחים כך שיביאו את הנתונים בדיוק כאשר אלה נדרשים. יש הבדל עצום בביצועים בין שימוש באלגוריתם פשוט לבין שימוש באלגוריתם חכם שמנצל את כל משאבי החומרה. (דרך אגב, הכפלת מטריצות היא אחת הבעיות הקשות ביותר במדעי המחשב. מחקר רב מוקדש לבעיה זו, ויש מגוון שיפורים חדשים ומעניינים בתחום.)
אכן, יש שיטות מגוונות לבניית חומרה, ובכל יום שומעים על פיתוחי חומרה חדשים. אולם כשבוחנים את העניין לעומק, נראה שבהרבה מקרים, כמו בהכפלת מטריצות, אין זה משנה אם משתמשים, לדוגמה, בתהליכונים ב-GPU או ב-CPU; מה שקובע הוא תכנון קפדני וחכם של האלגוריתם, כזה המנצל ביעילות את החומרה ואת מערכת הזיכרון. כלומר: החוכמה מנצחת.
עריכה: סמדר רבן
[1] על GPU
[2] מעבד מרכזי