הערכה של זמני עיבוד הפריימים ב-CPU וב-GPU

חשוב מאוד להעריך את זמני העיבוד של הפריימים ב-CPU וב-GPU (זמני פריימים) כדי להבין את ביצועי האפליקציה ולזהות צווארי בקבוק. כשאתם יוצרים פרופיל של אפליקציה באמצעות AGI, מערכת System Profiler מספקת נתוני מעקב שאפשר להשתמש בהם כדי להעריך את זמני הפריימים.

זמני CPU

ב-AGI, אפשר לראות את זמני הפריימים הכוללים והפעילים של המעבד בטראק המעבד של פרופיל המערכת.

זמן כולל של CPU (יחידת עיבוד מרכזית)

כדי למדוד את משך הזמן הכולל של המעבד, בוחרים את טווח הזמן שכולל את הזמן שחלף בין אירועי שליחת המסגרות הרצופים. אירועי שליחת המסגרות הם eglSwapBuffers (ל-OpenGL) ו-vkQueuePresentKHR (ל-Vulkan).

צילום מסך של אירועי eglSwapBuffer.
איור 1. הזמן שחלף בין שני אירועי eglSwapBuffer.


צילום מסך של אירוע vkQueuePresentKHR.
איור 2. הזמן שחלף בין שני אירועי vkQueuePresentKHR.

המדידה הזו היא אומדן של זמן המעבד הכולל,אבל היא לא מייצגת בהכרח את זמן המעבד הפעיל. לדוגמה, באפליקציות שמבוססות על GPU, מעבד ה-CPU עשוי להמתין עד שה-GPU ישלים את העבודה שלו לפני שליחת פריים חדש. המצב הזה קורה לעיתים קרובות כשאירוע dequeueBuffer,‏ eglSwapBuffer (ב-OpenGL) או vkQueuePresent (ב-Vulkan) תופס חלק גדול מזמני המעבד. זמן ההמתנה נכלל בזמן ה-CPU הכולל, אבל לא בזמן ה-CPU הפעיל.

צילום מסך שבו מוצגת כמות גדולה של זמן חוסר פעילות במהלך אירועי dequeueBuffer ו-eglSwapBuffer.
איור 3. כמות גדולה של זמן חוסר פעילות של המעבד במהלך אירועי dequeueBuffer ו-eglSwapBuffer.

זמן CPU פעיל

זמן המעבד הפעיל קובע מתי המעבד מפעיל את קוד האפליקציה בלי להיות במצב מנוחה.

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

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


צילום מסך של אפליקציה עם כמה שרשורים שפועלים בזמן שהשרשור הראשי לא פעיל.
איור 6. אפליקציה עם כמה שרשורים (multithreaded) שיש בה שרשורים אחרים שפועלים בזמן שהשרשור הראשי לא פעיל.

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

צילום מסך שבו מוצג מצב ההפעלה של שרשור מוצמד שתואם למעקב אחר המעבד.
איור 7. מצב ההפעלה של השרשור המוצמד תואם למעקב אחר המעבד.

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

צילום מסך של פרוסות ATrace שמוצגות בטראק של מעבד.
איור 8. פלחים של ATrace שמוצגים במסלול של מעבד (CPU).

אומדן זמני הפריימים ב-GPU

כדי להעריך את זמני הפריימים של ה-GPU, אפשר להשתמש בפלחים של GPU או בספירת GPU ב-System Profiler. ההערכה מדויקת יותר כשמשתמשים בפלחים של GPU.

פרוסות של GPU

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

מכשירים במאלי

במכשירי Mali, לפלחים של GPU יש טראקים מסוג fragment, non-fragment ולפעמים גם supplementary non-fragment. בפריימים פחות מורכבים, העבודה של הפיצ'ר והעבודה שלא קשורה אליו מתבצעת ברצף, כך שאפשר להבדיל בין עבודה של פריים אחד לעבודה של פריים אחר על ידי חיפוש פערים בין עבודות GPU פעילות.

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

צילום מסך של כמה פריימים שמופעלים ברצף.
איור 9. מספר פריימים שמופעלים ברצף.
צילום מסך שבו AGI מגדיל את התצוגה של עבודה בפריים ספציפי.
איור 10. התמקדות בעבודה של פריים מסוים.

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

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

צילום מסך של עומס עבודה מקבילי ב-GPU, שבו עבודה על פריים אחד יכולה לחפוף לעבודה על פריים אחר.
איור 11. עומס עבודה של GPU במקביל, שבו עבודה על פריים אחד יכולה לחפוף לעבודה על פריים אחר.


צילום מסך של כמה אירועי Vulkan שנבחרו לפריים.
איור 12. מספר אירועי Vulkan שנבחרו לפריים.

מכשירי Adreno

במכשירי Adreno, פלחים של GPU מופיעים בטראק GPU Queue 0 ותמיד מיוצגים ברצף, כך שאפשר לבדוק את כל הפלחים שמייצגים את שלבי הרינדור של פריים ולהשתמש בהם כדי למדוד את זמני הפריימים של GPU.

צילום מסך של כמה פריימים שמופעלים ברצף.
איור 13. מספר פריימים שמופעלים ברצף.
צילום מסך שבו AGI מגדיל את התצוגה של פריים עם כמה שלבי רינדור.
איור 14. התצוגה הוגדלה על פריים עם כמה שלבי רינדור.

בדומה לתרחיש של Mali שמתואר למעלה: אם האפליקציה משתמשת ב-Vulkan, המסלול Vulkan Events מספק מידע על העבודה שנשלחת לביצוע המסגרת. כדי להדגיש את שלבי העיבוד, לוחצים על הפרוסות של Vulkan Events שמשויכות לפריים.

צילום מסך של אפליקציה מבוססת-Vulkan שבה נבחרו אירועי Vulkan של מסגרת.
איור 15. אפליקציה מבוססת-Vulkan שבה נבחרים אירועי Vulkan עבור פריים.

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

צילום מסך של אפליקציה עם שימוש נרחב ב-GPU עם דפוס של תהליך רינדור שעוזר לזהות את גבולות המסגרת.
איור 16. אפליקציה שמשתמשת הרבה ב-GPU עם דפוס של תהליך עיבוד (pass) שעוזר לזהות את גבולות המסגרות.

ספירת אירועים ב-GPU

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

מכשירים במאלי

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

צילום מסך של הטראקים 'ניצול GPU' ו'תור GPU' במכשיר Mali.
איור 17. המעקב אחרי ניצול ה-GPU ועומס הבקשות ב-GPU במכשיר Mali.

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

צילום מסך של טראקים עם קטעים וטראקים ללא קטעים.
איור 18. טראקים מקטע וטראקים לא מקטע.

מכשירי Adreno

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

צילום מסך של אחוז ניצול ה-GPU ומעקב אחר תורים של GPU במכשיר Adreno.
איור 19. הטראקים 'אחוז ניצול ה-GPU' ו'תור ה-GPU' במכשיר Adreno.

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

צילום מסך של Vertex Instructions / Second track.
איור 20. הטראק Vertex Instructions / Second.

יכול להיות שנתונים דומים יהיו זמינים בקטעים האלה:

  • Vertices Shaded / Second
  • קטעים מוצללים לשנייה
  • % Time Shading Vertices
  • % Time Shading Fragments