Menerapkan algoritma melalui compute shaders vs. pipeline shaders

10

Dengan ketersediaan compute shaders untuk DirectX dan OpenGL sekarang mungkin untuk mengimplementasikan banyak algoritma tanpa melalui pipa rasterisasi dan sebagai gantinya menggunakan komputasi tujuan umum pada GPU untuk menyelesaikan masalah.

Untuk beberapa algoritma ini tampaknya menjadi solusi kanonik intuitif karena mereka secara inheren bukan berbasis rasterisasi, dan shader berbasis rasterisasi tampaknya menjadi solusi untuk memanfaatkan daya GPU (contoh sederhana: membuat tekstur noise. Tidak perlu quad dirasterisasi di sini ).

Diberikan algoritma yang dapat diimplementasikan dengan dua cara, apakah ada manfaat kinerja (potensial) umum daripada menggunakan penghitung komputasi vs menggunakan rute normal? Apakah ada kekurangan yang harus kita perhatikan (misalnya, apakah ada semacam overhead yang tidak biasa untuk beralih dari / untuk menghitung shader saat runtime)?

Apakah mungkin ada manfaat atau kelemahan lain yang perlu dipertimbangkan ketika memilih di antara keduanya?

TravisG
sumber
Jika tag kinerja memang relevan, maka pertimbangkan untuk menonton video ini dari artikel Game Cloth Gems "Simulasi Kain" dari Marco Fratarcangeli: youtube.com/watch?v=anNClcux4JQ . Anda dapat membaca komentar dan menemukan hal yang aneh: implementasi berbasis GLSL / shader lebih cepat daripada menggunakan CUDA atau OpenCL (yang terakhir karena dukungan driver yang buruk pada saat itu, pada 2010). Ada perbedaan level rendah tertentu yang .. membuat perbedaan.
teodron
@teodron Saya tidak memiliki Permata GPU yang tersedia dan saya tidak dapat menemukan kode sumbernya. Apakah penulis benar-benar menggunakan GLSL vertex + pixel shaders atau apakah dia menggunakan GLSL compute shaders?
TravisG
Iya! Sebelum CUDA, komunitas menerapkan fitur GPGPU. Berikut ini tautan ke OpenCloth untuk melihat bagaimana seseorang dapat mencapai hal itu dengan menggunakan GLSL murni ATAU Cuda: code.google.com/p/opencloth/source/browse/trunk/…
teodron

Jawaban:

7

Tidak ada jawaban yang tepat jika Anda akan mendapat manfaat langsung dari compute shadrs / appraoch GPGPU, ini sangat tergantung pada jenis algoritma yang Anda implementasikan, compute shaders dan CUDA / OpenCL adalah pendekatan yang lebih umum untuk mengatasi beberapa keterbatasan hack bahasa shading lama. manfaat paling penting yang akan Anda dapatkan:

  • Mengakses informasi spasial. di peretasan GLSL lama (well, itu peretasan!) hanya memberikan sedikit info tentang fragmen tetangga karena ia menggunakan koordinat tekstur. Dalam compute shaders / CUDA / OpenCL mengakses info spasial jauh lebih fleksibel, Anda sekarang dapat mengimplementasikan algoritma seperti pemerataan Histogram pada GPU dengan akses buffer / tekstur yang tidak teratur.
  • Memberi Anda sinkronisasi dan atomik utas .
  • Compute Space: peretasan GLSL lama akan melakukan hard-wire ruang komputasi vertex / fragmen ke shader Anda. Fragmen shader akan berjalan dengan jumlah fragmen, vertex shader akan berjalan dengan jumlah simpul. Dalam menghitung shader Anda menentukan ruang Anda sendiri.
  • Skalabilitas : compute shader / CUDA / OpenCL Anda dapat meningkatkan jumlah SM GPU (Streaming Multiprocessor) yang tersedia tidak seperti shader GLSL lama Anda yang harus dijalankan pada SM yang sama. (Berdasarkan komentar Nathan Reed, dia mengatakan itu tidak benar, dan shader harus ditingkatkan dan compute shaders seharusnya. Saya masih tidak yakin meskipun saya perlu memeriksa dokumentasi).
  • Pergantian konteks : Seharusnya ada beberapa peralihan konteks, tetapi saya akan mengatakan bahwa itu tergantung pada aplikasi sehingga taruhan terbaik Anda adalah membuat profil aplikasi Anda.

Nah menurut saya , jika Anda ingin pergi rute komputasi shader, meskipun algoritma tertentu mungkin lebih cocok, ada pertimbangan tertentu yang perlu Anda pertimbangkan:

  1. Perangkat keras dan kompatibilitas mundur . Compute shaders hanya tersedia di perangkat keras yang lebih baru dan jika Anda mencari produk komersial (misalnya game), Anda perlu berharap bahwa banyak pengguna mungkin tidak dapat menjalankan produk Anda.
  2. Anda biasanya memerlukan pengetahuan tambahan dalam arsitektur GPU / CPU , pemrograman paralel dan multithreading (mis. Berbagi memori, koherensi memori, sinkronisasi utas, atom dan pengaruhnya terhadap kinerja) yang biasanya Anda tidak perlu menggunakan penghitungan shader normal .
  3. Sumber belajar , dari pengalaman, ada sumber belajar yang jauh lebih sedikit untuk Compute shadrs, OpenCL dan CUDA (yang juga menawarkan interoperabilitas OpenGL) dibandingkan rute shader biasa.
  4. Alat debugging , dengan kurangnya debugging yang tepat, pengembangan alat bisa menjadi jauh lebih sulit daripada kebanyakan shader, setidaknya shader dapat didebug secara visual.
  5. Saya berharap komputasi shader memberikan kinerja yang lebih baik daripada algoritma yang sama di shader lain; jika mereka dilakukan dengan benar dengan mempertimbangkan hal-hal dari poin 2, karena mereka dirancang untuk menghindari langkah-langkah tambahan untuk rendering grafik. Tapi saya tidak punya bukti konkret untuk mendukung klaim saya.
  6. Anda juga harus mempertimbangkan CUUDA / OpenCL untuk GPGPU jika Anda menuju rute itu.

Namun saya yakin ini bagus untuk masa depan, dan akan menjadi pengalaman belajar yang luar biasa. Semoga berhasil!

concept3d
sumber
Saya pikir OP mungkin bertanya ini: mengapa memecahkan masalah menggunakan shaders GLSL murni vs coding di CUDA? Ada artikel Permata Pemrograman Game mengenai simulasi kain di mana penulis melakukan hal itu. Dan cara lama GLSL yang lebih baik lebih baik daripada cara CUDA dalam hal kinerja. Anda mungkin harus menunjukkan mengapa jika Anda tahu mengapa.
teodron
2
Saya tidak berpikir titik skalabilitas Anda benar - vertex dan fragmen shader hanya mampu melakukan penskalaan di seluruh GPU seperti halnya compute shaders. Sebenarnya hitung shader bisa lebih sulit untuk diukur, karena ukuran threadgroup dan penggunaan memori bersama dapat memberikan batasan tambahan tentang berapa banyak shader thread dapat berjalan pada satu waktu.
Nathan Reed
2
Juga, jika Anda mengisi tekstur (misalnya menghasilkan noise atau melakukan beberapa algoritma prosedural lainnya), dalam pengalaman saya shader fragmen akan lebih cepat daripada compader shader jika Anda hanya mengevaluasi formula pada setiap piksel. Dugaan saya adalah ini karena urutan fragmen cocok dengan urutan piksel ubin / swizzled internal, sehingga mendapatkan memori lokalitas yang lebih baik daripada penghitung komputasi yang tidak mengetahui urutan ini. Komputasi shader hanya lebih cepat jika Anda dapat menggunakan fitur khusus mereka, misalnya memori bersama, untuk mempercepat banyak hal relatif terhadap shader fragmen.
Nathan Reed
2
OK, komentar terakhir. :) Saya pikir sebagian besar GPU saat ini memiliki semacam saklar konteks atau mode ketika beralih dari grafik ke komputer dan sebaliknya. Jadi, jika Anda menjalankan beberapa shader grafis, lalu mengirimkan compute shader, lalu jalankan lebih banyak shader grafis dll., Anda mengalami beberapa hit kinerja ketika beralih bolak-balik. Itu adalah sesuatu yang Anda harus profil, tetapi itu bisa menjadi alasan lain untuk tetap menggunakan shader grafis dalam kasus tertentu.
Nathan Reed
@NathanReed terima kasih atas komentarnya, saya akan memperbarui jawaban saya.
concept3d