Bagaimana instruksi driver perangkat memprogram GPU?

9

Katakanlah saya menggunakan komputer, komputer modern tipikal apa pun kurang lebih. Driver perangkat bertanggung jawab untuk semua yang saya lihat di layar saya, termasuk tepat saat saya mengetik ini layar diperbarui (ini, tentu saja, dalam lingkup OS, seperti Windows).

Mari kita turunkan ke tingkat di mana perangkat keras tidak peduli jika ada kernel atau tidak, dan hanya mengambil instruksi.

Pada dasarnya, bagaimana GPU "tahu" persis bagaimana melakukan semuanya? Apakah pengemudi pada dasarnya mengendalikan setiap fungsi tingkat sirkuit sangat kecil, intrinsik, atau perangkat keras mungkin atau diperlukan untuk menghitung data biner untuk tampilan menggunakan instruksi khusus yang disediakan oleh pengemudi?

Jika demikian, apakah GPU menggunakan bahasa "khusus" atau "perakitan" untuk memahami instruksi yang dikirim kepadanya seperti halnya CPU?

Saya memiliki terlalu banyak celah dalam pengetahuan saya, dan ada "misteri" yang tidak menyenangkan ini di belakang GPU dan mengaksesnya secara langsung melalui perangkat keras.

Misalnya, GPU dan CPU harus dapat terhubung entah bagaimana, sehingga dimungkinkan untuk mengakses GPU melalui perakitan CPU dan mengimplementasikan bus data / alamat yang benar. Tidak mungkin vendor perangkat tidak dapat mengakses GPU di luar driver, karena driver juga mengkompilasi kode, dan GPU, sebagai sirkuit yang dapat diprogram, harus bekerja dengan instruksi biner.

Saya telah menanyakan pertanyaan-pertanyaan semacam ini dan mereka dihapus dengan sangat cepat tanpa jawaban mengapa di banyak situs, jadi apa misteri / rahasia besarnya di sini? Ini adalah perangkat keras pada motherboard yang diakses seperti yang lain.

Jadi benar-benar ... dengan asumsi ini adalah pertanyaan "ok" di sini mengenai perangkat lunak dan perangkat keras, siapa pun dapat langsung mengakses GPU tanpa file khusus vendor, karena file tersebut tidak ajaib.

Jadi bagaimana GPU "diprogram" dari perspektif perangkat keras langsung, tanpa logam, pada tingkat spesifik perangkat keras?


sumber
Pertanyaan "OK" menurut saya (walaupun berbelit-belit dan mungkin membutuhkan buku untuk dijawab - yang bukan format yang baik, jadi pertama-tama lihat pusat bantuan dan halaman tur untuk menjadi terbiasa dengan pertanyaan seperti apa yang bisa Anda tanyakan di sini) .
Doktoro Reichard
Saya tidak membaca pusat bantuan.
Keberatan jika saya bertanya mengapa tidak?
Doktoro Reichard
Karena waktu yang lebih baik dapat dihabiskan untuk merenungkan, mencoba memecahkan dan menjawab pertanyaan "OK" saya.
Dan seperti yang saya katakan, untuk menjawab pertanyaan ini dengan benar Anda mungkin perlu buku ... jawaban panjang biasanya bukan jawaban yang baik.
Doktoro Reichard

Jawaban:

8

Pada dasarnya, bagaimana GPU "tahu" persis bagaimana melakukan semuanya? Apakah pengemudi pada dasarnya mengendalikan setiap fungsi tingkat sirkuit sangat kecil, intrinsik, atau perangkat keras mungkin atau diperlukan untuk menghitung data biner untuk tampilan menggunakan instruksi khusus yang disediakan oleh pengemudi?

Tidak, perangkat memiliki IC sendiri yang mengontrol semua aspek level perangkat keras dari fungsi perangkat, dan mereka berinteraksi dengan prosesor pusat yang mengoordinasikan aspek-aspek pada perangkat serta menyediakan antarmuka pemrograman tingkat tinggi yang dapat digunakan untuk mengakses, membaca dari, menulis ke, dan mengontrol perangkat.

Jika demikian, apakah GPU menggunakan bahasa "khusus" atau "perakitan" untuk memahami instruksi yang dikirim kepadanya seperti halnya CPU?

Iya dan tidak. Seperti kebanyakan perangkat, kartu video menggunakan standar untuk menyederhanakan masalah. Mereka menggunakan standar seperti VESA untuk mengakses fungsi reguler seperti video waktu boot, atau CUDA untuk mengakses fungsi pemrograman GPU. Selain itu, program dapat mengakses fungsi yang tidak standar, atau bergantung pada perangkat secara langsung menggunakan kode mesin (seringkali C dikompilasi ke assembler) bersamaan dengan dokumentasi pemrograman perangkat (yang tersedia dari situs web adaptor).

Saya memiliki terlalu banyak celah dalam pengetahuan saya, dan ada "misteri" yang tidak menyenangkan ini di belakang GPU dan mengaksesnya secara langsung melalui perangkat keras.

Driver mengakses perangkat secara langsung, itulah sebabnya mereka memiliki akses khusus (program tingkat pengguna reguler tidak diperbolehkan mengakses perangkat keras secara langsung di Vista + untuk alasan keamanan dan stabilitas). Akses perangkat menggunakan port, DMA ( Akses Memori Langsung ), dan pemetaan memori .

Misalnya, GPU dan CPU harus dapat terhubung entah bagaimana, sehingga dimungkinkan untuk mengakses GPU melalui perakitan CPU dan mengimplementasikan bus data / alamat yang benar. Tidak mungkin vendor perangkat tidak dapat mengakses GPU di luar driver, karena driver juga mengkompilasi kode, dan GPU, sebagai sirkuit yang dapat diprogram, harus bekerja dengan instruksi biner.

Pengemudi dapat membaca dan menulis perangkat dengan instruksi CPU biasa dengan mengakses port yang dipetakan memori dan semacamnya. Sebagai contoh yang mudah dipahami, Anda dapat menempatkan karakter di layar dalam mode teks dengan menulis ke "memori" di alamat B8000. Alamat ini bukan RAM, melainkan dipetakan agar sesuai dengan memori kartu video, jadi menulis padanya akan menulis ke layar. Demikian juga, Anda dapat menulis layar dengan meletakkan karakter yang ingin Anda tulis di ALregistri, 0x09dalam AHregister, dan kemudian memanggil BIOS interrupt 0x10. Fungsi yang lebih maju tidak berbeda; Anda dapat membaca dan menulis memori adaptor, memanggil fungsi-fungsi pada chip-nya, dan sebagainya menggunakan inetrface apa pun yang diekspos dan didokumentasikan oleh perangkat.

Jadi benar-benar ... dengan asumsi ini adalah pertanyaan "ok" di sini mengenai perangkat lunak dan perangkat keras, siapa pun dapat langsung mengakses GPU tanpa file khusus vendor, karena file tersebut tidak ajaib.

Hanya untuk fitur yang memenuhi standar, tetapi yang lainnya (yaitu, hal-hal yang lebih maju), Anda harus berkonsultasi dengan dokumen pemrograman pabrikan.

Jadi bagaimana GPU "diprogram" dari perspektif perangkat keras langsung, tanpa logam, pada tingkat spesifik perangkat keras?

Melalui banyak lapisan:

  1. Komponen solid-state seperti transistor dan semacamnya
  2. ASIC tingkat rendah
  3. Prosesor dan chipset terpasang
  4. Antarmuka pemrograman tingkat rendah (perakitan)
  5. Antarmuka pemrograman tingkat tinggi (DirectX, OpenGL)
  6. Bahasa pemrograman tingkat tinggi (C ++, C #, Python, dll.)
Synetech
sumber
1
perhatikan pada 'bare metal'; dalam kasus Anda mendengar sebagian besar permainan dev berbicara tentang, mereka mengeluh bahwa mereka harus menggunakan abstraksi tingkat tinggi seperti DirectX / OpenGL daripada menulis kode yang mengkompilasi ke kartu yang memiliki mesin sendiri. lihat di sini untuk info pada langague assembler yang digunakan oleh FERMI GPU Nvidia code.google.com/p/asfermi catatan bahwa bahkan CUDA duduk di atas tingkat tinggi langague (PTX) yang akan dikompilasi ke dalam kode mesin, sehingga opcoodes Anda program di CUDA mungkin tidak sama dengan output yang dikompilasi.
Frank Thomas
Hei, mungkin Anda memiliki saran buku yang bagus yang cocok untuk seorang mahasiswa yang membahas hal-hal yang Anda bicarakan di pos ini? Saya tidak tertarik untuk pernah bekerja dalam pemrograman GPU, tetapi kesenjangan dalam pemahaman saya tentang bagaimana semuanya bekerja membuat frustrasi.
lanza
2

Saya bukan orang yang jenius dalam arsitektur komputer, tetapi saya akan mencoba menangani pertanyaan Anda dengan poin, yang terbaik dari pengetahuan saya.


Driver perangkat bertanggung jawab untuk semua yang saya lihat di layar saya, termasuk tepat saat saya mengetik ini layar diperbarui (ini, tentu saja, dalam lingkup OS, seperti Windows).

Memang benar, terutama karena interaksi langsung dengan GPU tidak mudah diimplementasikan. Oleh karena itu pengembangan kerangka kerja grafis seperti DirectX dan OpenGL.

Definisi praktis dari Wikipedia ini menjelaskan hal ini secara lebih rinci:

Driver perangkat menyederhanakan pemrograman dengan bertindak sebagai penerjemah antara perangkat keras dan aplikasi atau sistem operasi yang menggunakannya. Pemrogram dapat menulis kode aplikasi tingkat tinggi secara independen dari perangkat keras khusus apa pun yang digunakan pengguna akhir.


Pada dasarnya, bagaimana GPU "tahu" persis bagaimana melakukan semuanya? Apakah pengemudi pada dasarnya mengendalikan setiap fungsi tingkat sirkuit sangat kecil, intrinsik, atau perangkat keras mungkin atau diperlukan untuk menghitung data biner untuk tampilan menggunakan instruksi khusus yang disediakan oleh pengemudi?

GPU adalah mikroprosesor. Dengan demikian, mereka memproses. Mereka memproses data yang dimasukkan dari CPU (yaitu posisi elemen) ke tampilan yang tepat. Mereka "tahu" bagaimana melakukan segalanya karena mereka dibuat dengan cara itu dan sekelompok besar orang sepakat tentang cara yang tepat untuk mengirim data ke dan dari GPU.

Pikirkan driver tampilan sebagai penyangga, atau proxy. Bayangkan Anda adalah jendela program dan pengguna menggerakkan Anda. Anda meminta GPU untuk menyegarkan layar. Tetapi ketika GPU berbicara Klingon dan Anda berbicara Vulcan , pengemudi menerima perintah Anda, menerjemahkannya ke GPU yang pada gilirannya melakukan apa yang Anda perintahkan.

Jika demikian, apakah GPU menggunakan bahasa "khusus" atau "perakitan" untuk memahami instruksi yang dikirim kepadanya seperti halnya CPU?


Dari Wikipedia :

Bahasa rakitan ARB adalah bahasa tingkat rendah yang dapat dikarakterisasi sebagai bahasa rakitan. Itu dibuat oleh OpenGL Architecture Review Board (ARB) untuk membakukan instruksi GPU mengendalikan pipa grafis perangkat keras.

Ada contoh ini, dan ingat bahwa masing-masing produsen (NVIDIA, ATI) memiliki set instruksi mereka sendiri.

Juga, ada OpenCL dan banyak cara lain untuk, dengan cara, secara langsung memprogram instruksi ke GPU.

Semua ini harus menjawab pertanyaan Anda, sampai taraf tertentu.

Doktoro Reichard
sumber