Saat ini saya sedang mengerjakan program OpenGl yang kinerjanya ingin saya tingkatkan. Performanya baik-baik saja tetapi tidak ideal untuk GPU khusus yang kuat, tetapi buruk pada grafik terintegrasi (<10 fps). Dalam program normal (berbasis CPU, tidak ada OpenGl atau API GPU lainnya), saya akan menjalankan profiler (mungkin yang dibangun menjadi CLion) pada program, melihat di mana sebagian besar waktu dihabiskan, dan kemudian bekerja pada algoritma yang lebih baik untuk area-area tersebut atau temukan cara untuk mengurangi jumlah yang disebut area itu.
Menggunakan teknik ini pada program OpenGl saya menunjukkan bahwa sebagian besar waktu program (~ 86%) pada utas utamanya (yang ingin saya optimalkan) dihabiskan dalam file .so driver OpenGl .so. Selain itu, penggunaan CPU pada program saat sedang berjalan sangat rendah, tetapi penggunaan GPU berkisar antara 95% dan 100%. Secara keseluruhan, informasi ini memberi tahu saya bahwa hambatannya ada pada GPU, sehingga saya harus mengoptimalkannya.
Di sinilah masalah terjadi. Teknik normal saya dalam menggunakan profiler untuk memandu optimasi saya tidak akan bekerja tanpa profiler GPU tertentu. Karena itu, saya melakukan riset untuk menemukan profiler yang akan memberi tahu saya di mana waktu pemrosesan GPU dihabiskan. Saya tidak dapat menemukan apa pun yang dapat digunakan dari jarak jauh. Semuanya hanya Windows saja (saya menjalankan Linux secara eksklusif, dan program saya belum porting ke Windows - juga tidak akan sampai itu jauh lebih jauh), tidak lagi diperbarui, dan / atau biaya lebih dari anggaran untuk proyek ini.
Karena itu, saya bertanya: bagaimana saya bisa mengoptimalkan kinerja program saya ketika profiler yang relevan tidak ada? Saya mencoba menebak di mana masalahnya dan mengoptimalkannya, namun tidak ada bedanya meskipun saya dapat memastikan bahwa pengoptimalan saya (frustum culling) menghasilkan lebih sedikit kerja untuk GPU sekitar setengahnya. Jawaban yang bagus akan memberikan beberapa teknik pembuatan profil yang dapat diterapkan pada OpenGL di Linux, atau akan memberikan teknik yang berfungsi tanpa profiler.
sumber
Jawaban:
Dengan memprofilkan kode Anda sendiri. Menemukan kemacetan GPU tidak terlalu sulit.
Dengan anggapan Anda memiliki versi OpenGL yang lebih rendah ( permintaan waktu tidak tersedia), maka Anda melakukan apa yang telah dilakukan orang selama bertahun-tahun: ganti barang dan lihat cara kerjanya.
Ada tiga lokasi dasar untuk bottleneck dalam rendering: CPU (yaitu: pengiriman data yang tidak efisien), vertex T&L, dan pemrosesan per-fragmen. Menentukan mana yang menjadi hambatan hanyalah masalah melihat dampak kinerja ketika Anda mengubah sesuatu.
Misalnya, jika Anda ingin melihat apakah pemrosesan per-fragmen adalah hambatan, kurangi jumlah fragmen yang dihasilkan (yaitu: resolusi layar). Jika kinerja meningkat pada kecepatan linier sehubungan dengan jumlah piksel dalam resolusi layar, maka itu adalah hambatan Anda.
Jika Anda ingin tahu apakah pemrosesan simpul Anda adalah hambatan, maka render objek yang sama beberapa kali (satu demi satu). Dengan asumsi Anda memiliki pengujian mendalam aktif dan tidak melakukan blending, fragmen dari rendering berikutnya harus dimusnahkan sebelum memanggil shader fragmen. Jadi jika kinerja turun secara linear dari berulang kali merender semua objek, maka Anda memiliki hambatan pemrosesan simpul.
Dan jika tak satu pun dari mereka yang menjadi hambatan, maka dengan proses eliminasi, CPU adalah masalahnya.
Jika Anda memiliki akses ke kueri timer, maka Anda dapat mengatur waktu operasi GPU secara langsung. Anda tidak dapat menentukan waktu tahapan tertentu, tetapi Anda dapat menentukan waktu yang dibutuhkan untuk menyelesaikan perintah-perintah GPU. Anda juga dapat menemukan latensi antara penyelesaian perintah GPU dan ketika utas CPU selesai mengirim perintah-perintah itu. Secara keseluruhan, ini akan membantu Anda mengetahui berapa lama waktu yang dibutuhkan GPU untuk memproses barang-barang dibandingkan dengan CPU yang mengirimkannya.
sumber