מה זה Compute Capability - מספר הגרסה שכל מתכנת CUDA צריך להכיר¶
אם פעם ניסיתם לקמפל קוד CUDA וקיבלתם שגיאה מוזרה שקשורה ל-sm_80 או sm_90, פגשתם את Compute Capability בלי לדעת את זה. זה המספר שקובע בדיוק אילו יכולות חומרה זמינות לכם, ולמה קוד שעובד על כרטיס אחד לפעמים לא מתקמפל בכלל בשביל כרטיס אחר.
אז מה זה בעצם Compute Capability¶
Compute Capability הוא מספר גרסה שNVIDIA מצמידה לכל דור ולכל משפחה של GPU, שמייצג את היכולות ואת תכונות החומרה הזמינות בו. הוא מופיע כזוג מספרים, למשל 8.0 או 9.0, כאשר המספר הראשון בדרך כלל מייצג שינוי ארכיטקטוני משמעותי, והשני שיפור בתוך אותה משפחה. GPU עם Compute Capability גבוה יותר תומך בדרך כלל ביותר תכונות מתקדמות - סוגי הוראות חדשים, יכולות Tensor Cores משופרות, גדלי shared memory גדולים יותר, ותמיכה בפעולות שדורות ישנים פשוט לא יודעים לבצע.
למה זה משפיע על קומפילציה¶
בפוסטים על PTX ו-SASS דיברנו על כך שקוד CUDA עובר משלב ביניים וירטואלי לקוד מכונה סופי שמותאם לחומרה ספציפית. Compute Capability הוא בדיוק המידע שאומר לקומפיילר "בשביל איזו חומרה לייצר את קוד המכונה הזה". כשמקמפלים עם nvcc, מציינים במפורש עבור אילו ערכי Compute Capability רוצים לייצר קוד, בעזרת דגלים כמו sm_80 לחומרה מסוג מסוים.
אם תנסו להריץ קוד שקומפל אך ורק עבור Compute Capability גבוה על כרטיס עם Compute Capability נמוך יותר, זה פשוט לא יעבוד - החומרה לא תומכת בהוראות שהקומפיילר ייצר. זו הסיבה שבספריות ובקוד production, לרוב מקמפלים בו זמנית עבור כמה ערכי Compute Capability שונים, כדי לתמוך במגוון רחב של כרטיסי מסך, בין אם כקוד מכונה ישיר לכל אחד, ובין אם דרך PTX שמתקמפלת just-in-time בזמן ריצה.
איך בודקים איזה Compute Capability יש לכם¶
לפני שמתחילים פרויקט CUDA רציני, שווה לבדוק איזה Compute Capability יש לכרטיס המסך שאתם עובדים עליו. יש כלים ופקודות ייעודיות שמציגות את המידע הזה, וגם תיעוד רשמי שממפה בין דגם כרטיס מסך לבין Compute Capability שלו. חשוב לדעת את המספר הזה כי הוא משפיע לא רק על קומפילציה, אלא גם על אילו תכונות שפה ואילו פונקציות ספרייה זמינות לכם בכלל - חלק מהיכולות המתקדמות שדיברנו עליהן, כמו CUDA Graphs או תמיכה מתקדמת בTensor Cores, דורשות מינימום גרסה מסוימת.
למה זה חשוב גם מעבר לקומפילציה גרידא¶
Compute Capability הוא בעצם ציר הזמן של התפתחות ה-GPU כפלטפורמת חישוב. כל דור חדש מביא איתו תכונות שהדור הקודם פשוט לא ידע לעשות, בדיוק כמו שגרסאות שפת תכנות מוסיפות יכולות חדשות עם הזמן. מתכנת CUDA שמכיר את ציר הזמן הזה יודע לזהות מתי תכונה מסוימת דורשת חומרה חדשה יחסית, ומתי הוא יכול לצפות שהיא זמינה כמעט בכל מקום.
זה גם עוזר להבין למה מאמרים וקוד ישנים לפעמים לא מתאימים יותר - אם הם נכתבו בתקופה של Compute Capability נמוך משמעותית, ייתכן שיש היום דרכים טובות בהרבה לבצע את אותה משימה, בזכות תכונות חומרה שלא היו קיימות אז.
חלק מהיסודות שכדאי לדעת מההתחלה¶
בקורס תכנות GPU אנחנו מסבירים את זה כבר בשלבים המוקדמים, כדי שתדעו לקרוא הודעות קומפילציה ותיעוד בלי בלבול, ותבינו בדיוק לאיזו חומרה אתם מקמפלים בכל שלב.
לסיכום¶
Compute Capability הוא מספר הגרסה שמגדיר את יכולות החומרה של כל דור GPU, וקובע גם איך מקמפלים אליו קוד וגם אילו תכונות זמינות לכם בכלל. הכרת המספר הזה, ואיך הוא משפיע על הקוד שלכם, היא אחד הפרטים הבסיסיים שכדאי לדעת לפני שצוללים לפרויקט CUDA רציני.
בואו תלמדו את היסודות האלה נכון מההתחלה, עם קהילה שכבר שם.