מבוא לכלי Nsight לפרופיילינג - איך מפסיקים לנחש ומתחילים למדוד¶
לאורך כל הפוסטים על ביצועי GPU - occupancy, warp divergence, register pressure, coalescing - חזרה שוב ושוב אותה נקודה - אי אפשר לדעת מה הבעיה בלי למדוד. אי אפשר לתקן מה שלא רואים. בדיוק בשביל זה NVIDIA בנתה חבילת כלים שנקראת Nsight, וכל מי שרציני לגבי כתיבת קוד GPU מהיר צריך להכיר אותה.
למה ניחוש הוא רעיון גרוע¶
הפיתוי הטבעי הוא להסתכל על קוד ולנחש איפה הוא איטי - "הלולאה הזאת בטח כבדה" או "הגישה הזאת לזיכרון נראית חשודה". הבעיה היא שבתכנות GPU, האינטואיציה מטעה הרבה יותר מבתכנות רגיל. kernel יכול להיראות יעיל לגמרי בקוד ולסבול מ-warp divergence חמור, או להיראות מסובך אבל להיות compute-bound לגמרי בלי בעיית זיכרון בכלל. הדרך היחידה לדעת בוודאות היא למדוד, וזה בדיוק התפקיד של Nsight.
Nsight Systems - התמונה הרחבה¶
Nsight Systems נותן מבט רחב על כל האפליקציה שלכם לאורך זמן - ציר זמן שמראה מתי ה-CPU עסוק, מתי ה-GPU עסוק, מתי יש העברות זיכרון בין השניים, ומתי מישהו פשוט מחכה למישהו אחר. זה הכלי הנכון לשאול שאלות ברמה הגבוהה - האם ה-GPU בכלל עמוס רוב הזמן, או שהוא מחכה הרבה לCPU? האם יש פערים מיותרים בין שיגורי kernels? האם העברות זיכרון בין host לdevice הופכות לצוואר בקבוק?
זה בדיוק סוג התובנה שמובילה, למשל, להחלטה להשתמש בCUDA Graphs שדיברנו עליהם, אם מתגלה שתקורת שיגור kernels קטנים תופסת נתח משמעותי מהזמן הכולל.
Nsight Compute - הצלילה לתוך kernel בודד¶
כשכבר זיהיתם קרנל ספציפי שאיטי מדי, Nsight Compute הוא הכלי שנכנס לפרטים. הוא נותן מטריקות מפורטות על ה-kernel הבודד הזה - occupancy בפועל מול המקסימום התיאורטי, ניצול פס רוחב הזיכרון, שימוש ברגיסטרים, ואפילו אינדיקציות ל-warp divergence או לbank conflicts. במקום לנחש למה kernel איטי, אתם מקבלים רשימה קונקרטית של מספרים שמצביעים בדיוק לאן להסתכל.
אחד הדברים השימושיים ביותר בכלי הוא שהוא לא רק מציג מספרים, הוא לרוב גם מציע לאן כדאי להסתכל - למשל, אם occupancy נמוך בגלל register pressure, או אם kernel הוא memory-bound על פי המודל שדיברנו עליו בפוסט על Roofline.
איך זה נראה בעבודה יומיומית¶
זרימת העבודה הטיפוסית היא לא "תכתבו קוד מושלם מההתחלה". היא יותר "כתבו קוד שעובד, מדדו איפה הוא איטי, תקנו את הבעיה הכי גדולה, ומדדו שוב". חוזרים על התהליך הזה שוב ושוב, כל פעם מתקנים את צוואר הבקבוק הבולט ביותר שהכלי חושף. זו הגישה המקצועית לאופטימיזציה - לא ניסיון לנחש הכל מראש, אלא מחזור קצר של מדידה ותיקון.
בלי כלים כאלה, קל מאוד להשקיע שעות באופטימיזציה של קטע קוד שכלל לא היה הבעיה האמיתית, בזמן שצוואר הבקבוק האמיתי יושב במקום אחר לגמרי.
למה זה חלק בלתי נפרד מהלמידה¶
כל המושגים שדיברנו עליהם עד עכשיו - occupancy, coalescing, register pressure, warp divergence - הם לא רק עניין תיאורטי. Nsight הוא המקום שבו הם הופכים למספרים קונקרטיים שאפשר לראות ולתקן. בלי להכיר את הכלי, כל הידע התיאורטי הזה נשאר מנותק מהעבודה בפועל.
זו בדיוק הסיבה שבקורס תכנות GPU אנחנו לא מסתפקים בתיאוריה - כל נושא מלווה בעבודה בפועל עם כלי הפרופיילינג האלה, כדי שתדעו לא רק להבין למה קוד איטי, אלא איך לגלות את זה בעצמכם.
לסיכום¶
Nsight Systems נותן תמונה רחבה על כל האפליקציה, ו-Nsight Compute צולל לתוך kernel בודד עם מטריקות מפורטות. יחד הם הופכים אופטימיזציה של GPU מניחוש להנדסה מבוססת נתונים, ומהווים כלי עבודה בסיסי לכל מי שרוצה לכתוב קוד GPU מהיר באמת.
בואו תלמדו למדוד לפני שאתם מתקנים, עם קהילה שכבר שם.