מה זה SASS - אסמבלי החומרה שרוב מתכנתי CUDA אף פעם לא רואים¶
בפוסט הקודם דיברנו על PTX, שפת הביניים הווירטואלית של CUDA. אבל PTX היא לא מה שבאמת רץ על השבב. השלב האחרון, המוחשי ביותר, נקרא SASS - וזה קוד המכונה בפועל, ייחודי לכל דור ולכל מודל של GPU.
אז מה זה בעצם SASS¶
SASS, ראשי תיבות של Streaming ASSembly, הוא קוד המכונה שהליבות של ה-GPU מבצעות בפועל, ממש כמו שקוד x86 הוא מה שהמעבד מבצע בפועל במחשב רגיל. בניגוד לPTX, שהיא ייצוג וירטואלי ומופשט, SASS ממופה ישירות לרגיסטרים פיזיים אמיתיים, ליחידות ביצוע אמיתיות, ולתזמון אמיתי של החומרה הספציפית שהיא נועדה לרוץ עליה.
הצעד מPTX לSASS מתבצע או בזמן קומפילציה על ידי nvcc, אם ידוע מראש בדיוק על איזו ארכיטקטורה הקוד ירוץ, או בזמן ריצה על ידי הדרייבר, כפי שהסברנו בפוסט הקודם. בשני המקרים, התוצאה הסופית היא אותה SASS ייעודית לחומרה.
למה SASS לא ניידת בין דורות¶
זו הנקודה הכי חשובה להבין - SASS היא לא כמו PTX. היא נבנתה במדויק לפי מבנה החומרה של דור GPU ספציפי - כמה רגיסטרים יש, איך יחידות הביצוע מסודרות, אילו הוראות מיוחדות קיימות בדור הזה ואילו לא. קוד SASS שהותאם לדור אחד של GPU לא בהכרח יעבוד, ובטח לא בצורה אופטימלית, על דור אחר. זו בדיוק הסיבה שPTX קיימת בכלל - היא נותנת שכבת הפשטה שמאפשרת גמישות, ואילו SASS היא המחיר שמשלמים בשביל ביצועים מקסימליים על חומרה ספציפית.
איך רואים SASS בפועל¶
NVIDIA מספקת כלים שמאפשרים לפרק קובץ בינארי מקומפל ולראות בדיוק את הSASS שנוצרה ממנו, כלים כמו cuobjdump ו-nvdisasm. כשפותחים פלט כזה, רואים משהו שדומה במבנה שלו לאסמבלי רגיל - הוראות עם mnemonics, רגיסטרים אמיתיים ולא וירטואליים, וכתובות זיכרון קונקרטיות. זה הרבה יותר קשה לקריאה מקוד PTX, אבל הוא נותן את התמונה הכי מדויקת שיש על מה שקורה בפועל בתוך השבב.
למה בכלל להסתכל על זה¶
רוב מתכנתי CUDA לא צריכים לקרוא SASS מדי יום. אבל כשמגיעים לרמת אופטימיזציה גבוהה מאוד, אחרי שכל הטכניקות הרגילות - tiling, coalescing, ניהול occupancy - כבר יושמו, לפעמים ההבדל האחרון בין קוד מהיר לקוד מהיר יותר טמון בדיוק ברמת ה-SASS. מהנדסי ביצועים מתקדמים בודקים אם הקומפיילר בחר את ההוראות היעילות ביותר, אם יש הוראות מיותרות שאפשר להימנע מהן, ואם השימוש ברגיסטרים תואם למה שציפו לו.
זה סוג העבודה שרוב הפרויקטים לא מגיעים אליה, אבל חשוב לדעת שהיא קיימת, ושמאחורי כל שורת קוד CUDA שאתם כותבים עומדת שרשרת שלמה - מהקוד ברמה גבוהה, דרך PTX הווירטואלית, ועד SASS הקונקרטית שבאמת רצה על הטרנזיסטורים.
המבט המלא על שרשרת הקומפילציה¶
הבנת שני השלבים, PTX וSASS, יחד נותנת תמונה שלמה של מה קורה לקוד שלכם מהרגע שכתבתם אותו ועד שהוא רץ. זו הבנה שהופכת אתכם ממישהו שכותב CUDA למישהו שבאמת מבין מה קורה בתוך המכונה.
זה בדיוק סוג ההבנה שאנחנו בונים לעומק בקורס תכנות GPU, מכתיבת קוד ברמה גבוהה ועד להצצה במה שבאמת קורה בחומרה.
לסיכום¶
SASS היא קוד המכונה האמיתי שרץ בתוך ה-GPU, ייחודי לכל ארכיטקטורת חומרה, ולא ניידת כמו PTX. רוב הזמן לא צריך לגעת בה ישירות, אבל היא קיימת שם, בתחתית שרשרת הקומפילציה, וברגעי אופטימיזציה קיצוניים היא הופכת לכלי החקירה הכי מדויק שיש.
בואו תכירו את כל השכבות, מהקוד ועד הטרנזיסטור, עם קהילה שכבר שם.