Memperkirakan waktu pemrosesan frame CPU dan GPU

Memperkirakan waktu pemrosesan frame CPU dan GPU (waktu frame) sangat penting untuk memahami performa aplikasi dan menemukan bottleneck. Saat Anda membuat profil aplikasi dengan AGI, System Profiler menyediakan data rekaman aktivitas yang dapat Anda gunakan untuk memperkirakan waktu frame.

Waktu CPU

Di AGI, Anda dapat melihat total waktu frame CPU dan waktu frame CPU aktif di jalur CPU dari profil sistem.

Waktu CPU total

Untuk mengukur total waktu CPU yang digunakan, pilih rentang waktu yang mencakup waktu antara peristiwa pengiriman frame berturut-turut. Peristiwa pengiriman frame adalah eglSwapBuffers (untuk OpenGL) dan vkQueuePresentKHR (untuk Vulkan).

Screenshot peristiwa eglSwapBuffer.
Gambar 1. Waktu di antara dua peristiwa eglSwapBuffer.


Screenshot peristiwa vkQueuePresentKHR.
Gambar 2. Waktu di antara dua peristiwa vkQueuePresentKHR.

Pengukuran ini adalah perkiraan total waktu CPU,tetapi tidak selalu mewakili waktu CPU aktif. Misalnya, di aplikasi yang terikat GPU, CPU mungkin menunggu GPU menyelesaikan pekerjaannya sebelum mengirimkan frame baru. Hal ini sering terjadi saat peristiwa dequeueBuffer, eglSwapBuffer (untuk OpenGL), atau vkQueuePresent (untuk Vulkan) menggunakan sebagian besar waktu CPU. Waktu tunggu disertakan dalam total waktu CPU, tetapi tidak dalam waktu CPU aktif.

Screenshot yang menampilkan sejumlah besar waktu tunggu selama peristiwa dequeueBuffer dan eglSwapBuffer.
Gambar 3. Banyak CPU yang tidak digunakan selama peristiwa dequeueBuffer dan eglSwapBuffer.

Waktu CPU aktif

Waktu CPU aktif menentukan kapan CPU menjalankan kode aplikasi tanpa dalam status tidak ada aktivitas.

Untuk mengukur waktu CPU aktif, lihat bagian Running tepat di atas peristiwa CPU. Hitung semua bagian rekaman aktivitas antara dua peristiwa pengiriman frame yang dalam status Berjalan. Pastikan Anda menyertakan thread yang berfungsi.

Screenshot dua periode waktu CPU yang dapat digunakan untuk mengukur waktu CPU aktif.
Gambar 5. Dua periode waktu CPU yang dapat digunakan untuk mengukur waktu CPU aktif.


Screenshot aplikasi multithread yang memiliki thread pekerja lain saat thread utama tidak ada aktivitas.
Gambar 6. Aplikasi multi-thread yang memiliki thread pekerja lain saat thread utama tidak ada aktivitas.

Cara lain untuk mengukur waktu CPU aktif adalah dengan melihat slice aplikasi di jalur CPU. Slice ini menunjukkan kapan CPU berjalan dan sesuai dengan slice Running.

Screenshot yang menampilkan status berjalan dari thread yang disematkan yang cocok dengan jalur CPU.
Gambar 7. Status berjalan thread yang disematkan cocok dengan jalur CPU.

Untuk membantu mengidentifikasi slice aplikasi, Anda dapat menambahkan penanda ATrace ke aplikasi Anda. Penanda ini akan ditampilkan di jalur CPU System Profiler.

Screenshot irisan ATrace yang ditampilkan di jalur CPU.
Gambar 8. Slice ATrace ditampilkan di jalur CPU.

Memperkirakan waktu frame GPU

Untuk memperkirakan waktu frame GPU, Anda dapat menggunakan slice GPU atau penghitung GPU di System Profiler. Estimasi lebih akurat saat menggunakan slice GPU.

Slice GPU

Jika Profiler Sistem memiliki informasi slice GPU yang tersedia, Anda bisa mendapatkan informasi waktu frame GPU yang sangat akurat dengan mengukur total waktu yang dihabiskan aplikasi Anda untuk mengerjakan tugas yang terkait dengan satu frame.

Perangkat Mali

Pada perangkat Mali, slice GPU memiliki jalur fragmen, non-fragmen, dan terkadang non-fragmen tambahan. Untuk frame yang kurang kompleks, pekerjaan fragmen dan non-fragmen dilakukan secara berurutan, sehingga membedakan pekerjaan satu frame dengan frame lainnya dapat dilakukan dengan mencari jeda di antara pekerjaan GPU aktif.

Sebagai alternatif, jika Anda sudah memahami tugas yang dikirimkan ke GPU, mengidentifikasi pola render pass yang dikirimkan akan memberikan informasi tentang kapan frame dimulai dan berakhir.

Screenshot beberapa frame yang dieksekusi secara berurutan.
Gambar 9. Beberapa frame dijalankan secara berurutan.
Screenshot saat AGI diperbesar pada pekerjaan frame individual.
Gambar 10. Memperbesar pekerjaan frame tertentu.

Untuk aplikasi yang memiliki alur kerja GPU yang lebih paralel, Anda bisa mendapatkan waktu render frame GPU dengan mencari semua frame yang memiliki submissionID yang sama di panel Selection untuk setiap slice.

Untuk aplikasi berbasis Vulkan, beberapa pengiriman dapat digunakan untuk menyusun frame. Pantau ID pengiriman menggunakan jalur Vulkan Events, yang berisi slice untuk setiap pengiriman. Memilih slice pengiriman akan menandai semua slice aktivitas GPU yang sesuai dengan pengiriman.

Screenshot workload GPU yang diparalelkan, di mana pekerjaan pada satu frame dapat tumpang-tindih dengan frame lain.
Gambar 11. Workload GPU yang diparalelkan, dengan pekerjaan pada satu frame dapat tumpang-tindih dengan frame lainnya.


Screenshot beberapa peristiwa Vulkan yang dipilih untuk frame.
Gambar 12. Beberapa peristiwa Vulkan dipilih untuk frame.

Perangkat Adreno

Di perangkat Adreno, slice GPU muncul di jalur GPU Queue 0 dan selalu direpresentasikan secara berurutan, sehingga Anda dapat melihat semua slice yang merepresentasikan proses render untuk frame dan menggunakannya untuk mengukur waktu frame GPU.

Screenshot beberapa frame yang dieksekusi secara berurutan.
Gambar 13. Beberapa frame dijalankan secara berurutan.
Screenshot saat AGI di-zoom pada frame dengan beberapa proses rendering.
Gambar 14. Memperbesar frame dengan beberapa proses rendering.

Serupa dengan skenario Mali yang dijelaskan sebelumnya: jika aplikasi menggunakan Vulkan, jalur Peristiwa Vulkan memberikan informasi tentang tugas yang dikirimkan untuk mengeksekusi frame. Untuk menandai render pass, klik slice Vulkan Events yang terkait dengan frame.

Screenshot aplikasi berbasis Vulkan yang menampilkan peristiwa frame Vulkan yang dipilih.
Gambar 15. Aplikasi berbasis Vulkan yang memilih peristiwa Vulkan untuk frame.

Ada beberapa skenario saat batas frame GPU lebih sulit dibedakan karena aplikasi sangat terikat GPU. Dalam skenario ini, jika Anda memahami tugas yang dikirimkan ke GPU, Anda dapat mengidentifikasi pola yang digunakan untuk menjalankan proses rendering dan menentukan batas frame dari informasi tersebut.

Screenshot aplikasi yang sangat terikat GPU dengan pola render pass yang membantu mengidentifikasi batas frame.
Gambar 16. Aplikasi yang sangat terikat GPU dengan pola render pass yang membantu mengidentifikasi batas frame.

Penghitung GPU

Jika informasi slice GPU tidak tersedia dalam rekaman aktivitas, Anda dapat memperkirakan waktu frame GPU menggunakan jalur penghitung GPU.

Perangkat Mali

Di perangkat Mali, Anda dapat menggunakan jalur penggunaan GPU untuk memperkirakan waktu frame GPU untuk aplikasi yang tidak terlalu intensif GPU. Saat aplikasi kurang intensif GPU, aplikasi memiliki periode aktivitas GPU tinggi dan rendah yang teratur, bukan aktivitas tinggi yang konsisten. Untuk memperkirakan waktu frame GPU menggunakan jalur penggunaan GPU, ukur durasi periode aktivitas tinggi di jalur tersebut.

Screenshot penggunaan GPU dan trek Antrean GPU di perangkat Mali.
Gambar 17. Penggunaan GPU dan antrean GPU di perangkat Mali.

Jika aplikasi lebih banyak menggunakan GPU, penggunaan GPU dapat secara konsisten sangat tinggi. Dalam hal ini, Anda dapat menggunakan jalur penggunaan antrean fragmen dan penggunaan antrean non-fragmen untuk memantau aktivitas GPU dan memperkirakan waktu frame GPU. Dengan mencari pola di jalur fragmen dan non-fragmen, Anda dapat memperkirakan dengan kasar lokasi batas frame, dan menggunakannya untuk mengukur waktu frame GPU.

Screenshot jalur fragmen dan non-fragmen.
Gambar 18. Fragment dan trek non-fragmen.

Perangkat Adreno

Di perangkat Adreno, jika aplikasi tidak terlalu berat GPU-nya, Anda dapat memperkirakan waktu frame GPU dengan cara yang sama seperti yang dapat Anda lakukan dengan perangkat Mali di bagian sebelumnya.

Screenshot persentase pemanfaatan GPU dan trek Antrean GPU di perangkat Adreno.
Gambar 19. Persentase pemakaian GPU dan antrean GPU yang dilacak di perangkat Adreno.

Jika aplikasi lebih banyak menggunakan GPU, dan aplikasi memiliki persentase penggunaan GPU yang tinggi secara konsisten, Anda dapat menggunakan jalur Vertex Instructions/Second dan Fragment Instructions / Second untuk memperkirakan waktu frame GPU. Dengan mencari pola di tingkat aktivitas jalur ini, Anda bisa mendapatkan perkiraan kasar tentang lokasi batas frame, dan menggunakannya untuk mengukur waktu frame GPU.

Screenshot Petunjuk Vertex / Trek kedua.
Gambar 20. Jalur Vertex Instructions / Second.

Jalur lainnya ini mungkin memberikan informasi serupa:

  • Vertices Shaded / Second
  • Fragmen yang Diarsir / Detik
  • % Waktu Vertex Shading
  • % Waktu Mengarsir Fragmen