Saya perhatikan bahwa banyak program 3d biasanya melakukan perhitungan vektor / matriks serta transformasi geometris pada CPU. Adakah yang menemukan keuntungan dalam memindahkan perhitungan ini ke vertex shaders pada GPU?
sumber
Saya perhatikan bahwa banyak program 3d biasanya melakukan perhitungan vektor / matriks serta transformasi geometris pada CPU. Adakah yang menemukan keuntungan dalam memindahkan perhitungan ini ke vertex shaders pada GPU?
Secara umum: Transformasi mesh dilakukan pada GPU. Anda mengirim matriks transformasi ke GPU dan shader menerapkannya ke semua verticies mesh.
Menggunakan GPU untuk menghitung Matriks itu sendiri adalah masalah yang berbeda & sebenarnya lebih lambat pada GPU karena ada begitu banyak nilai yang tersimpan yang berubah dari bingkai ke bingkai yang diperlukan untuk membantu menentukan matriks transformasi akhir. Mengirim data ini ke & dari CPU - GPU lambat. Juga, pada CPU, perhitungan dilakukan sekali, sedangkan pada GPU, mereka akan dilakukan untuk setiap titik.
Banyak transformasi geometrik dapat dilakukan pada prosesor non-GPU, namun seseorang harus mempertimbangkan platform target. Jarak tempuh Anda akan bervariasi berdasarkan pada platform apa yang Anda targetkan, dan hambatan dari platform itu.
Satu pertimbangan adalah bandwidth bus antara perangkat yang menghasilkan geometri, dan perangkat yang membuat geometri.
Dalam sistem PC modern yang khas, CPU ada di satu sisi bus PCIe (http://en.wikipedia.org/wiki/PCI_Express), dan GPU ada di sisi lain. Satu-satunya cara Anda dapat mentransfer data yang dihasilkan per frame dari CPU ke GPU (dan sebaliknya) adalah melalui bus ini. Ini artinya, Anda dapat dibatasi oleh kecepatan transfer bus ini. Jika platform target Anda memiliki PCIe 2.x dengan 16 jalur, Anda memiliki bandwidth 8GB / s. Dalam praktiknya, transfer lintas PCIe tidak 100% efisien, karena sebagian bandwidth dikonsumsi untuk protokol selama transfer Anda. Bergantung pada ukuran transfer Anda, Anda bisa kehilangan 5-10% dari bandwidth Anda hanya pada biaya per paket.
misalnya. Dengan platform PC yang menjalankan PCIe 2.x dengan 16 jalur, berapa banyak data yang dapat Anda hasilkan per frame untuk dimasukkan ke GPU? Dengan asumsi Anda ingin menjalankan pada 60fps, ini berarti 8GB / 60 = 136MB per frame untuk PCIe 2.x. Mengalikan beberapa faktor 90% (yang diperhitungkan) untuk memperhitungkan overhead komunikasi driver dan overhead protokol transfer PCIe, Anda dapat menghasilkan sekitar 120 MB data per frame tanpa dibatasi oleh bandwidth PCIe 2.x.
Pertanyaan lain yang harus Anda jawab: apakah generasi data 120Mb ini dapat dengan mudah dicapai dalam 1/60 detik pada CPU target Anda? Mengingat bahwa Anda harus melakukan sejumlah tugas gim lain di CPU, Anda bisa kekurangan waktu untuk menghasilkan data yang diubah. Dalam hal throughput ALU murni, ini dapat membatasi Anda pada CPU. Dalam hal CPU untuk bus sysmem, Anda juga dapat dibatasi oleh bandwidth (yang bervariasi, tetapi sekitar ~ 8.5GB / s pada CPU terbaru).
Baiklah, jadi faktor apa yang membuatnya lebih layak untuk dilakukan pada GPU? Salah satu faktornya adalah bandwidth memori GPU, yang merupakan bandwidth antara GPU dan memori video lokalnya. Pada GPU mid-range kontemporer, bandwidth memori video ini dapat mencapai 200GB / s (ya, itu 25x bandwidth PCIe 2.x). Faktor lain adalah bahwa GPU paralel secara masif, memiliki ratusan ALU dan mampu menyembunyikan latensi akses memori dengan menjalankan ribuan utas sekaligus.
Semua faktor ini dapat berkontribusi pada kemenangan nyata mendorong lebih banyak pekerjaan ke GPU, tetapi sekali lagi YMMV tergantung pada platform target Anda.
sumber
Apa yang Anda maksud dengan "transformasi mesh"? Mengubah geometri dengan beberapa set matriks? Sebagian besar game hari ini akan membiarkan GPU menangani transformasi sederhana, menguliti, dll. Dan kebanyakan dari mereka akan menggunakan vertex shaders untuk melakukannya. Pada beberapa platform Anda tidak memiliki shader, atau ada keuntungan lain untuk melakukan hal-hal ini pada CPU. Sebagai contoh, pada PS3 Anda dapat mengambil beban dari RSX dengan membiarkan SPU menangani skinning dan transformasi. Jika Anda melakukan pencahayaan multi-pass maka menguliti CPU bisa menguntungkan, karena Anda hanya perlu melakukannya sekali dan menyerahkan hasil yang akan ditarik untuk setiap pass rendering. Jadi ada pengecualian, tetapi secara umum sebagian besar game melakukan hal-hal ini pada GPU dan di shader.
Atau maksud Anda sesuatu yang lebih menarik, seperti menggunakan GPU untuk matematika vektor umum? Saat ini kami memiliki GPU tujuan umum yang dapat menjalankan kode C yang cukup umum melalui sistem seperti CUDA. Dimungkinkan untuk mengambil keuntungan dari ini untuk matematika vektor berat, dan saya tahu ada program di luar sana yang melakukan ini. Saya tidak punya pengalaman dengannya secara pribadi.
sumber
Ada situasi di mana segala sesuatu yang ditampilkan pada GPU mungkin masuk akal, tetapi Anda tidak dapat mengatur konstanta di dalam shader dan benar-benar tidak ada tempat lain untuk mengaturnya kecuali di sisi CPU sebelum panggilan draw.
Bahkan jika Anda dapat menghitung konstanta Anda, seperti matriks transformasi tulang, pada GPU dengan program inisialisasi khusus, Anda mungkin tidak akan mau. GPU sangat bagus dalam eksekusi paralel, tetapi memiliki kecepatan clock yang lebih lambat.
Mengubah hierarki tidak dapat diparalelkan secara sepele, karena simpul anak bergantung pada orang tua, tetapi mentransformasikan semua simpul dalam sebuah mesh adalah, karena simpul-simpulnya adalah komputasi yang independen satu sama lain.
Aturan umumnya adalah:
sumber