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 akan memberikan data rekaman aktivitas yang dapat Anda gunakan untuk memperkirakan waktu render frame.

Waktu CPU

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

Total waktu CPU

Untuk mengukur total waktu CPU yang dihabiskan, 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 antara dua peristiwa eglSwapBuffer.


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

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

Screenshot yang menampilkan banyak waktu tidak ada aktivitas selama peristiwa dequeueBuffer dan eglSwapBuffer.
Gambar 3. CPU yang tidak ada aktivitasnya dalam jumlah besar selama peristiwa dequeueBuffer dan eglSwapBuffer.

Waktu CPU aktif

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

Untuk mengukur waktu CPU aktif, lihat slice Running tepat di atas peristiwa CPU. Hitung semua bagian rekaman aktivitas antara dua peristiwa pengiriman frame yang berada dalam status Running. 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 multi-thread yang memiliki thread kerja lain saat thread utama tidak ada aktivitas.
Gambar 6. Aplikasi multi-thread yang memiliki thread kerja 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. Tindakan ini akan menampilkan penanda di jalur CPU System Profiler.

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

Memperkirakan waktu render frame GPU

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

Slice GPU

Jika System Profiler memiliki informasi slice GPU yang tersedia, Anda bisa mendapatkan informasi waktu render frame GPU yang sangat akurat dengan mengukur jumlah total waktu yang dihabiskan aplikasi 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 tidak terlalu kompleks, pekerjaan fragmen dan non-fragmen bersifat berurutan, sehingga membedakan pekerjaan satu frame dari yang lain dapat dilakukan dengan mencari celah antara pekerjaan GPU aktif.

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

Screenshot beberapa frame yang dijalankan secara berurutan.
Gambar 9. Beberapa frame yang dijalankan secara berurutan.
Screenshot saat AGI diperbesar pada pekerjaan setiap frame.
Gambar 10. Perbesar pekerjaan setiap frame.

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. Lacak ID pengiriman menggunakan jalur Peristiwa Vulkan, yang berisi slice untuk setiap pengiriman. Memilih slice pengiriman akan menandai semua slice aktivitas GPU yang sesuai dengan pengiriman.

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


Screenshot beberapa peristiwa Vulkan yang dipilih untuk frame.
Gambar 12. Beberapa peristiwa Vulkan yang 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 mewakili pass render untuk frame dan menggunakannya untuk mengukur waktu frame GPU.

Screenshot beberapa frame yang dijalankan secara berurutan.
Gambar 13. Beberapa frame yang dijalankan secara berurutan.
Screenshot saat AGI diperbesar pada frame dengan beberapa render pass.
Gambar 14. Memperbesar frame dengan beberapa render pass.

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

Screenshot aplikasi berbasis Vulkan tempat peristiwa frame Vulkan dipilih.
Gambar 15. Aplikasi berbasis Vulkan tempat peristiwa Vulkan untuk frame dipilih.

Ada beberapa skenario saat batas frame GPU lebih sulit dibedakan karena aplikasi sangat terikat GPU. Dalam skenario ini, jika sudah memahami tugas yang dikirim ke GPU, Anda dapat mengidentifikasi pola yang digunakan untuk menjalankan render pass 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 intensif GPU. Jika aplikasi tidak terlalu intens menggunakan GPU, aplikasi tersebut memiliki periode aktivitas GPU tinggi dan rendah secara reguler, bukan aktivitas yang tinggi secara konsisten. Untuk memperkirakan waktu frame GPU menggunakan jalur penggunaan GPU, ukur durasi periode aktivitas tinggi di jalur.

Screenshot jalur penggunaan GPU dan Antrean GPU di perangkat Mali.
Gambar 17. Jalur penggunaan GPU dan Antrean GPU di perangkat Mali.

Jika aplikasi lebih intensif 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 memperoleh perkiraan kasar tentang lokasi batas frame, dan menggunakannya untuk mengukur waktu frame GPU.

Screenshot jalur fragmen dan non-fragmen.
Gambar 18. Jalur fragmen dan non-fragmen.

Perangkat Adreno

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

Screenshot persentase penggunaan GPU dan jalur Antrean GPU di perangkat Adreno.
Gambar 19. Persentase penggunaan GPU dan GPU Queue di perangkat Adreno.

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

Screenshot Vertex Instructions / Second track.
Gambar 20. Jalur Vertex Instructions / Second.

Jalur lain ini mungkin memberikan informasi serupa:

  • Vertex yang Diarsir / Detik
  • Fragmen yang Diarsir / Detik
  • % Waktu Shading Verteks
  • % Waktu Shading Fragmen