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

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

זמני CPU

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

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

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

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


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

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

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

זמן פעיל של CPU

זמן השימוש הפעיל במעבד קובע מתי המעבד מריץ את קוד האפליקציה בלי להיות במצב לא פעיל.

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

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


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

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

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

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

צילום מסך של פרוסות ATrace שמוצגות במסלול CPU.
איור 8. פרוסות ATrace שמוצגות בנתיב CPU.

הערכת זמני רינדור פריים ב-GPU

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

פרוסות GPU

אם יש מידע על חלוקת ה-GPU ב-System Profiler, אפשר לקבל מידע מדויק מאוד על זמן רינדור פריים של ה-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, אתם יכולים לזהות את התבנית שבה מבוצעים מעברי הרינדור ולקבוע את גבולות המסגרת על סמך המידע הזה.

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

מוני GPU

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

מכשירי מאלי

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

צילום מסך של השימוש במעבד הגרפי ושל התורים של המעבד הגרפי במכשיר Mali.
איור 17. השימוש ב-GPU והתור של ה-GPU במעקב במכשיר Mali.

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

צילום מסך של רצועות עם פרגמנטים ורצועות בלי פרגמנטים.
איור 18. טראקים של קטעים ושל לא קטעים.

מכשירי Adreno

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

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

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

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

יכול להיות שרצועות אחרות יספקו מידע דומה:

  • Vertices Shaded / Second
  • Fragments Shaded / Second
  • % Time Shading Vertices
  • % Time Shading Fragments