John sudah menulis jawaban yang bagus jadi pertimbangkan jawaban ini sebagai perpanjangan dari jawabannya.
Saya saat ini banyak bekerja dengan komputasi shader untuk algoritma yang berbeda. Secara umum, saya telah menemukan bahwa komputasi shader dapat jauh lebih cepat daripada pixel shader yang setara atau mengubah alternatif berbasis umpan balik.
Setelah Anda membungkus kepala Anda di sekitar cara menghitung shader bekerja, mereka juga jauh lebih masuk akal dalam banyak kasus. Menggunakan pixel shaders untuk memfilter suatu gambar memerlukan pengaturan framebuffer, mengirim simpul, menggunakan beberapa tahapan shader, dll. Mengapa ini diperlukan untuk memfilter gambar? Digunakan untuk merender paha depan layar penuh untuk pemrosesan gambar tentu saja merupakan satu-satunya alasan "sah" untuk terus menggunakannya menurut saya. Saya yakin bahwa seorang pendatang baru di bidang grafik komputasi akan menemukan komputasi bayangan lebih cocok secara alami untuk pemrosesan gambar daripada rendering ke tekstur.
Pertanyaan Anda mengacu pada pemfilteran gambar secara khusus sehingga saya tidak akan menguraikan terlalu banyak pada topik lain. Dalam beberapa pengujian kami, hanya menyiapkan umpan balik transformasi atau mengalihkan objek framebuffer untuk dirender menjadi tekstur dapat menimbulkan biaya kinerja sekitar 0,2 ms. Ingatlah bahwa ini tidak termasuk render apa pun! Dalam satu kasus, kami menyimpan algoritma yang sama persis untuk porting shader dan melihat peningkatan kinerja yang nyata.
Saat menggunakan compute shaders, lebih banyak silikon pada GPU dapat digunakan untuk melakukan pekerjaan yang sebenarnya. Semua langkah tambahan ini diperlukan saat menggunakan rute pixel shader:
- Rakitan vertex (membaca atribut titik, pembagi titik, konversi jenis, memperluasnya ke vec4, dll.)
- Vertex shader perlu dijadwalkan tidak peduli seberapa minimal itu
- Rasterizer harus menghitung daftar piksel untuk menaungi dan menginterpolasi output vertex (mungkin hanya coord tekstur untuk pemrosesan gambar)
- Semua status yang berbeda (uji kedalaman, uji alfa, gunting, blending) harus ditetapkan dan dikelola
Anda bisa berargumen bahwa semua keunggulan kinerja yang disebutkan sebelumnya dapat dinegasikan oleh driver pintar. Anda benar. Driver seperti itu dapat mengidentifikasi bahwa Anda membuat quad-screen penuh tanpa pengujian mendalam, dll. Dan mengonfigurasi "jalur cepat" yang melompati semua pekerjaan tidak berguna yang dilakukan untuk mendukung pixel shaders. Saya tidak akan terkejut jika beberapa driver melakukan ini untuk mempercepat pass post-processing di beberapa game AAA untuk GPU spesifik mereka. Tentu saja Anda bisa melupakan perawatan seperti itu jika Anda tidak mengerjakan game AAA.
Apa yang tidak bisa dilakukan pengemudi adalah menemukan peluang paralelisme yang lebih baik yang ditawarkan oleh jalur pipa penghitung komputasi. Ambil contoh klasik dari filter gaussian. Menggunakan compute shaders, Anda dapat melakukan sesuatu seperti ini (memisahkan filter atau tidak):
- Untuk setiap kelompok kerja, bagi sampel pengambilan gambar sumber di seluruh ukuran kelompok kerja dan simpan hasilnya ke memori bersama grup.
- Hitung output filter menggunakan hasil sampel yang disimpan dalam memori bersama.
- Tulis ke tekstur output
Langkah 1 adalah kuncinya di sini. Dalam versi pixel shader, gambar sumber disampel beberapa kali per piksel. Dalam versi komputasi shader, setiap sumber texel dibaca hanya sekali di dalam kelompok kerja. Pembacaan tekstur biasanya menggunakan cache berbasis ubin, tetapi cache ini masih jauh lebih lambat daripada memori bersama.
Filter gaussian adalah salah satu contoh sederhana. Algoritma penyaringan lainnya menawarkan peluang lain untuk berbagi hasil perantara di dalam kelompok kerja menggunakan memori bersama.
Namun ada tangkapan. Compute shaders membutuhkan penghalang memori eksplisit untuk menyinkronkan outputnya. Ada juga lebih sedikit perlindungan untuk melindungi terhadap akses memori yang salah. Untuk programmer dengan pengetahuan pemrograman paralel yang baik, compute shaders menawarkan lebih banyak fleksibilitas. Namun fleksibilitas ini berarti bahwa lebih mudah untuk memperlakukan penghitung bayangan seperti kode C ++ biasa dan menulis kode lambat atau salah.
Referensi
- Halaman wiki OpenGL Compute Shaders
- DirectCompute: Optimalisasi dan Praktik Terbaik, Eric Young, NVIDIA Corporation, 2010 [pdf]
- Penghitung Efisien Shader Proramming, Bill Bilodeau, AMD, 2011? [pps]
- DirectCompute untuk Permainan - Menambah Mesin Anda dengan Compute Shaders, Layla Mah & Stephan Hodes, AMD, 2013, [pps]
- Hitung Optimalisasi Shader untuk GPU AMD: Pengurangan Paralel, Wolfgang Engel, 2014