Apakah referensi lokal GPU patut dikhawatirkan?

9

Apakah lokalitas referensi membuat banyak perbedaan pada kinerja GPU seperti halnya kinerja CPU?

Sebagai contoh, jika saya mengirim 200 perintah undian ke GPU, apakah saya akan melihat (berpotensi) perbedaan yang nyata jika data untuk setiap perintah bersebelahan dalam memori alih-alih melompati buffer / peta tekstur?

Pertanyaan sampingan: Saya berasumsi GPU memastikan terhadap masalah berbagi yang salah dengan membuat sebagian besar sumber daya tidak dapat diubah. Tetapi dalam kasus di mana mereka tidak, apakah itu sebabnya utas selalu bekerja senilai empat fragmen?

Xenoprimate
sumber

Jawaban:

10

Lokalitas referensi itu penting, tetapi Anda tidak perlu khawatir bahwa banyak ... karena Anda tidak memiliki kontrol mutlak.

Saat menggunakan OpenGL / DirectX Anda biasanya memiliki kontrol terbatas pada tata letak memori, driver akan melakukan sisanya. Sebagai contoh, Anda dapat mencoba beberapa tata letak buffer verteks, seperti menggunakan data vertex interleaved atau non-interleaved dan tergantung pada data Anda / driver / kinerja GPU akan bervariasi. Profil dan pilih yang paling cocok dengan aplikasi Anda.

Misalnya dalam optimasi GPU Permata Pipa, lokalitas referensi disebutkan dua kali , yang pertama:

Akses data vertex secara relatif berurutan. Memori cache GPU modern mengakses ketika mengambil simpul. Seperti dalam hierarki memori apa pun, lokalitas spasial referensi membantu memaksimalkan hit dalam cache, sehingga mengurangi kebutuhan bandwidth.

Dan yang kedua

Optimalkan untuk cache vertex pasca-T & L. GPU modern memiliki cache kecil masuk pertama, keluar pertama (FIFO) yang menyimpan hasil dari simpul yang paling baru ditransformasikan; hit di cache ini menyimpan semua pekerjaan transformasi dan pencahayaan, bersama dengan semua pekerjaan yang dilakukan sebelumnya dalam pipa. Untuk memanfaatkan cache ini, Anda harus menggunakan primitif yang diindeks, dan Anda harus memesan simpul Anda untuk memaksimalkan lokalitas referensi di atas mesh. Ada alat yang tersedia — termasuk D3DX dan NVTriStrip (NVIDIA 2003) —yang dapat membantu Anda dengan tugas ini.

Menurut pendapat saya, rekomendasi tersebut mengikuti apa yang saya bicarakan, dan menyiratkan bahwa Anda tidak memiliki kendali mutlak atas tata letak memori, namun apa yang Anda kendalikan, misalnya bagaimana setiap simpul VBO diletakkan dapat memiliki efek pada kinerja.

Jika aplikasi Anda mengalami hit kinerja, Anda harus terlebih dahulu mendeteksi kemacetan, itu mungkin bukan masalah lokalitas data referensi, tetapi mungkin dengan karena ada sejumlah besar data tanpa culling, misalnya Anda tidak melakukan culling frustum .. dll Anda dapat memeriksa jawaban saya di sini pada topik.

Saya pikir Anda harus lebih khawatir tentang lokalitas referensi ketika menggunakan OpenCL / CUDA kalau Anda sering memiliki kontrol mutlak atas tata letak memori.

concept3d
sumber
3

Awalnya, GPU hanya digunakan untuk aplikasi multimedia yang menunjukkan sedikit penggunaan kembali data. Ketika GPU menjadi semakin digunakan untuk aplikasi keperluan umum (karenanya, istilah GPGPU), mereka sekarang menampilkan cache yang dikelola perangkat keras ukuran besar, misalnya, Fermi GPU memiliki 768 KB cache tingkat terakhir, GPU Kepler memiliki kapasitas 1536 KB cache level terakhir, dan Maxwell GPU memiliki cache level terakhir 2048 KB. Ini, bersama dengan sejumlah besar penelitian tentang cache GPU menunjukkan bahwa lokalitas data jelas penting untuk GPU. Lihat kertas survei saya untuk detail dan referensi untuk yang di atas.

pengguna984260
sumber