לדלג לתוכן

GPU מול CPU - מה ההבדל, ולמה שניהם קיימים בכל מחשב

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

האנלוגיה שתפתור לכם את זה

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

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

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

העובדים הגאונים הם ה-CPU. עשרת אלפים העובדים הפשוטים הם ה-GPU.

עכשיו בשפה טכנית

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

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

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

אז מתי משתמשים במה

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

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

אז למה לא לוותר על ה-CPU ולעבור כולו ל-GPU

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

זה בדיוק המודל שעליו בנויה CUDA - קוד רץ במעבד הראשי, ה-host, ומשגר משימות מקביליות אל ה-GPU, ה-device, כשצריך כוח עיבוד אמיתי.

איך זה נראה בפועל בעולם התכנות

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

לסיכום

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

בואו תמשיכו את הלמידה עם קהילה שכבר שם.

הצטרפו לקהילה בדיסקורד