Bagaimana cara mengontrol perhitungan mana yang dilakukan pada CPU dan mana yang dilakukan pada GPU?

14

Pemahaman saya saat ini adalah bahwa apa pun yang dilakukan dalam file shader dilakukan pada GPU, dan apa pun yang dilakukan dalam kode saya (Java, dalam kasus saya) dilakukan pada CPU.

Apakah ini deskripsi yang akurat?

Bassinator
sumber
2
Anda juga dapat melakukan komputasi pada GPU menggunakan sesuatu seperti OpenCL yang pada dasarnya memungkinkan Anda untuk menjalankan kode pada GPU.
Soapy

Jawaban:

20

Itulah intinya.

Pada prinsipnya, platform itu bisa, menurut pikiran, melakukan apa pun yang diinginkannya. Orang bisa membayangkan sistem operasi canggih melakukan terjemahan kode kompilasi tepat waktu dari, katakanlah, x86 ke kode GPU. Demikian pula, driver OpenGL dapat menjalankan apa pun yang diinginkan pada host CPU.

Tapi sungguh, apa yang baru saja Anda gambarkan, adalah apa yang terjadi.

david van brink
sumber
5
IIRC, shader dikompilasi pada CPU sebelum dikirim ke GPU. Dan itu dilakukan oleh driver GPU tanpa OS.
MSalters
Benar. Saya telah berurusan dengan banyak kesalahan kompilasi selama program dijalankan di shader, bahkan ketika kode java sudah dikompilasi.
Bassinator
1
Teoretis: Katakanlah saya punya program yang sangat intensif CPU tetapi hanya antarmuka baris perintah (tidak ada pekerjaan grafis). Bisakah saya menurunkan sebagian pekerjaan ke GPU? Saya sebenarnya tidak berencana melakukan ini, Ini hanya hal konseptual yang menarik minat saya.
Bassinator
2
Iya! Tautan yang diposting oleh @return true adalah untuk perpustakaan Java yang melakukan itu. Secara umum, Anda dapat menulis "compute shader" di OpenGL, atau menggunakan OpenCL. Dalam semua kasus, Anda perlu mengisolasi bagian dari kode Anda yang dapat diparalelkan, dan meneruskan informasi keluar-masuk. (GPU kebanyakan bagus untuk tugas "memalukan paralel".)
david van
1
Satu tanda bintang untuk ditambahkan ke jawaban ini adalah bahwa beberapa implementasi mendukung gagasan "preshader" - yaitu, kode yang merupakan bagian dari shader, tetapi hasilnya akan konstan di semua doa dalam panggilan draw yang diberikan (seperti mengalikan tampilan seragam) & matriks proyeksi). Kompilator shader yang cenderung dapat mengidentifikasi bit kode seperti ini dan mengangkatnya untuk dieksekusi sekali pada sisi-CPU, termasuk output konstan yang dihasilkan dalam pekerjaan yang diserahkan ke GPU. Itulah satu kasus umum di mana asumsi "shader = GPU" mungkin dibengkokkan, meskipun hanya secara rinci.
DMGregory
7

Secara umum, ya. Java digunakan untuk menulis program yang berjalan di cpu. Bahasa shader (cg, hlsl, et al) digunakan untuk menulis program yang berjalan di gpu.

Pengecualian untuk aturan tersebut akan menggunakan apis pihak ketiga yang dapat menjembatani kesenjangan.

kembali benar
sumber
1
Kiat yang sangat menarik, tautan Anda ke "aparapi". Jalankan beberapa kode JVM pada GPU ... menarik!
david van
3

david van brink menjawab pertanyaan Anda secara umum.

Tapi seperti katanya, driver OpenGL dapat menjalankan hal-hal pada CPU, dan itu sebenarnya sering terjadi. Terutama dengan konteks kompatibilitas, di mana beberapa fungsi warisan aneh tidak dapat diimplementasikan pada kartu grafis. Mereka memerlukan emulasi perangkat lunak. Sebagai contoh, saya pernah mendengar bahwa penetapan dijalankan pada CPU. Anda dapat mengharapkan kejutan dengan memilih.
Kejutan-kejutan ini dapat terjadi bahkan lebih pada MacOS menggunakan konteks 2.1, karena Apple telah menyatukan pandangan OpenGL dengan sangat baik di seluruh jajaran perangkat keras mereka, dan beberapa perangkat keras yang lebih kecil tidak memiliki beberapa hal yang harus ditiru. Sejauh ini benar-benar dimungkinkan untuk menjalankan spesifikasi SELURUH OpenGL 2.1 sepenuhnya pada CPU, jika kode pembuatan konteks menentukan perangkat perangkat lunak secara eksplisit.

Sebaliknya, kode yang dijalankan melalui perpustakaan komputasi seperti vexcl atau boost compute, atau AMP microsoft, atau dorongan nVidia, BISA dieksekusi pada GPU atau CPU tergantung pada flag pengaturan API.

Dan untuk sentuhan akhir, di dalam CPU Anda juga memiliki arsitektur DSP dengan bagiannya kami sebut SIMD. Kompiler ispc Intel memberikan bantuan dalam menghasilkan kode yang "dipastikan" untuk berjalan di jalur SIMD dengan banyak diagnostik kinerja pada waktu kompilasi untuk membantu Anda memanfaatkannya. Tambahkan OpenMP untuk itu dan Anda bisa mendapatkan SIMD multithreaded, yang mendekati konsep GPU. Jika Anda memiliki CPU high-end dan GPU low-end, ini sebenarnya bisa lebih berkinerja.
http://ispc.github.io/

v.oddou
sumber