GPU modern: Seberapa "pintar" mereka?


11

Ada banyak sumber daya pada pemrograman 3D (OpenGL atau DirectX) dan jalur pipa grafis yang sesuai tersedia, tetapi saya bertanya-tanya di tingkat mana mereka diimplementasikan pada GPU modern.

Sejauh ini saya sudah bisa mengetahui bahwa telah ada perpindahan dari keahlian khusus yang mengimplementasikan berbagai tahapan dari jalur grafik ke pendekatan yang lebih umum. Transformasi ini sebagian tercermin pada API 3D dalam bentuk shader yang dapat diprogram. Sebagian besar transistor tampaknya didedikasikan untuk unit SIMD paralel masif yang menjalankan instruksi shader yang sebenarnya.

Tapi bagaimana dengan sisa grafik pipa? Apakah itu masih diterapkan pada perangkat keras?

Apakah GPU modern (pikirkan Nvidia Fermi) pada dasarnya adalah serangkaian array SIMD "bodoh" yang diumpankan dengan instruksi dan data dari CPU dan berbagai cache, dan semua logika aktual yang memetakan pipa grafik ke instruksi yang terjadi pada driver grafis ?

Atau apakah ada beberapa unit pengendali di suatu tempat di GPU yang menerjemahkan instruksi dan data stream tingkat tinggi yang masuk (program shader terkompilasi, data vertex dan atribut, dan tekstur) ke dalam instruksi SIMD aktual dan menangani sinkronisasi, alokasi memori dll?

Saya menduga bahwa kenyataannya ada di antara dua ekstrem itu, dan jawabannya akan agak panjang dan didasarkan pada banyak spekulasi (harus ada alasan bagi vendor GPU tertentu menolak untuk menerbitkan dokumentasi apa pun pada produk mereka, apalagi driver kode sumber ...), tetapi setiap petunjuk ke arah yang benar dan sumber daya yang berguna akan sangat dihargai.

Sejauh ini, saya telah menemukan serangkaian posting blog yang sangat berguna dalam memahami lebih lanjut tentang GPU modern, tetapi saya kehilangan beberapa jenis tinjauan tingkat lebih tinggi tentang arsitektur keseluruhan - saya dapat memahami sebagian besar konsep yang disebutkan, tetapi tidak cukup mengerti bagaimana mereka cocok bersama.

Jawaban:


8

Sejauh ini saya sudah bisa mengetahui bahwa telah ada perpindahan dari keahlian khusus yang mengimplementasikan berbagai tahapan dari jalur grafik ke pendekatan yang lebih umum. Transformasi ini sebagian tercermin pada API 3D dalam bentuk shader yang dapat diprogram. Sebagian besar transistor tampaknya didedikasikan untuk unit SIMD paralel masif yang menjalankan instruksi shader yang sebenarnya.

Benar. Pada dasarnya, karena ukuran fitur yang relatif besar pada GPU yang lebih tua, satu-satunya cara untuk secara efisien menerapkan hal-hal seperti pencahayaan dasar, antialiasing, pemetaan tekstur, geometri, dll adalah dengan menggunakan pipa "fungsi tetap". Mereka mengorbankan fleksibilitas demi kinerja karena mereka tidak memiliki kepadatan chip yang cukup untuk dapat mengimplementasikannya menggunakan arsitektur SIMD paralel masif yang lebih generik seperti GPU saat ini.

Apakah GPU modern (pikirkan Nvidia Fermi) pada dasarnya adalah serangkaian array SIMD "bodoh" yang diumpankan dengan instruksi dan data dari CPU dan berbagai cache, dan semua logika aktual yang memetakan pipa grafik ke instruksi yang terjadi pada driver grafis ?

Hal-hal tertentu masih dilakukan dalam perangkat keras; yang lain tidak. Misalnya, ROP masih digunakan pada tahap paling akhir untuk mendorong data piksel ke dalam chipset VGA. Catatan Saya menggunakan "chipset VGA" di sini sebagai istilah umum untuk merujuk pada mekanisme yang mentransmisikan sinyal video ke monitor Anda, terlepas dari apakah itu benar-benar "VGA" dalam hal apa pun.

Memang benar, secara umum, bahwa arsitektur GPU saat ini seperti Nvidia Fermi dan AMD Southern Islands, untuk sebagian besar, paralel CPU besar-besaran di mana mereka memiliki set instruksi kustom, dan masing-masing "inti" individu sangat lemah, tetapi ada a seluruh banyak core (kadang-kadang beberapa ribu). Tetapi masih ada perangkat keras khusus grafis di sana:

  • Penguraian video perangkat keras sering dilakukan, sebagian besar, menggunakan chip fungsi tetap. Ini khususnya benar ketika DRM (Digital Restrictions Management) terlibat. Kadang-kadang decoding video "perangkat keras" benar-benar berarti serangkaian instruksi yang dipandu firmware yang hanya berfungsi sebagai tugas lama biasa untuk core SIMD. Itu sangat tergantung.

  • Dengan perkecualian sangat sedikit papan Nvidia spesifik-komputasi (Tesla), hampir semua kartu grafis "SIMD generik" memiliki serangkaian perangkat keras lengkap yang didedikasikan untuk output video. Output video tidak sama dengan rendering; elemen output fungsi tetap termasuk codec LVDS / TMDS / HDMI / DisplayPort, HDCP, dan bahkan pemrosesan audio (pada dasarnya sedikit DSP), karena HDMI mendukung audio.

  • "Memori grafis" masih disimpan bersama GPU, sehingga tidak harus melintasi bus PCIe laten yang cerewet dan relatif tinggi untuk mencapai RAM sistem, yang dengan sendirinya lebih lambat dan membutuhkan waktu lebih lama untuk merespons daripada yang lebih mahal, kualitas yang lebih tinggi, memori grafis yang lebih cepat (mis. GDDR5) yang hadir dalam kapasitas lebih kecil tetapi kecepatan lebih tinggi dari memori sistem. Proses menyimpan barang dalam memori grafis dan mengambilnya dari sana ke GPU atau ke CPU masih cukup banyak operasi fungsi tetap. Beberapa GPU memiliki jenis "IOMMU" mereka sendiri, tetapi unit manajemen memori ini berbeda (terpisah) dari CPU. Ini tidak benar, bagaimanapun, untuk GPU Intel terbaru diintegrasikan ke dalam prosesor mereka (Sandy dan Ivy Bridge), di mana arsitektur memori hampir seluruhnya "koheren" memori sistem) dan membaca dari memori grafis semurah untuk CPU seperti halnya untuk GPU.

Atau apakah ada beberapa unit pengendali di suatu tempat di GPU yang menerjemahkan instruksi dan data stream tingkat tinggi yang masuk (program shader terkompilasi, data vertex dan atribut, dan tekstur) ke dalam instruksi SIMD aktual dan menangani sinkronisasi, alokasi memori dll?

Bahasa "asli" dari SIMD hampir selalu dihasilkan oleh driver dalam perangkat lunak, dan bukan oleh firmware GPU sendiri. Ini terutama berlaku untuk fitur level DirectX 9 / OpenGL 2.x. Shader yang ditulis dalam bahasa tingkat tinggi seperti HLSL, GLSL atau OpenGL ARB assembler shader akhirnya diterjemahkan, oleh pengemudi, ke dalam instruksi GPU dengan menggedor register tertentu dan melakukan penghalang PCIe yang diperlukan untuk mengirim buffer batch penghitungan dan / atau render perintah.

Beberapa hal, seperti tessellation perangkat keras (DirectX 11 / OpenGL 4.0) sekali lagi didorong ke perangkat keras dengan cara fungsi tetap, mirip dengan cara mereka melakukan hampir semua hal di masa lalu. Ini karena, sekali lagi, kendala kinerja mengharuskan cara yang paling efisien untuk melakukan perhitungan ini adalah dengan memiliki sirkuit khusus untuk itu, daripada memiliki firmware atau "program" driver SIMD untuk melakukannya.

Saya menduga bahwa kenyataannya ada di antara dua ekstrem itu, dan jawabannya akan agak panjang dan didasarkan pada banyak spekulasi (harus ada alasan bagi vendor GPU tertentu menolak untuk menerbitkan dokumentasi apa pun pada produk mereka, apalagi driver kode sumber ...), tetapi setiap petunjuk ke arah yang benar dan sumber daya yang berguna akan sangat dihargai.

AMD dan Intel memiliki dokumentasi yang sangat kuat di tempat terbuka tentang GPU terbaru mereka, serta driver grafis open source yang berfungsi penuh untuk Linux (lihat proyek Mesa dan Direct Rendering Manager). Jika Anda melihat beberapa kode dalam driver ini, Anda akan tertawa, karena penulis driver grafis sebenarnya harus mengimplementasikan geometri hal-hal seperti menggambar berbagai bentuk atau pola, dalam "perangkat lunak" (tetapi menggunakan perintah perangkat keras untuk mengirimkan yang asli kerjakan perangkat keras untuk diproses), karena baik firmware GPU maupun fungsi tetap tidak ada lagi untuk memprosesnya sepenuhnya dalam perangkat keras :) Agak lucu apa yang harus mereka lakukan untuk mendukung OpenGL 1.x / 2.x pada yang baru perangkat keras.

Evolusi telah berjalan seperti ini:

  • Sangat lama (sebelum rendering 3d real-time dianggap mungkin): Ray-tracing pada CPU adalah normal untuk rendering non-real-time. Untuk grafik sederhana seperti yang Anda lihat di Windows versi awal, CPU cukup cepat untuk menggambar bentuk sederhana (persegi panjang, karakter font, pola bayangan, dll.) Tanpa perangkat keras fungsi tetap, tetapi tidak bisa menggambar hal yang terlalu rumit.
  • Dulu (OpenGL 1.x): hampir semuanya diimplementasikan oleh perangkat keras solid state; Fungsi tetap "elektrik" adalah norma bahkan untuk operasi dasar
  • Beberapa waktu yang lalu (OpenGL 2.x): Transisi menuju membuat GPU lebih dapat diprogram telah dimulai. "Fragment shaders" (alias pixel shaders) pada perangkat keras berusia 5 tahun hampir dapat melakukan perhitungan sewenang-wenang seperti CPU, tetapi dibatasi oleh arsitektur, yang masih sangat diarahkan pada grafis. Karenanya, OpenCL / DirectCompute tidak tersedia pada perangkat keras ini.
  • Baru-baru ini (OpenGL 3.x): Transisi ke GPU tujuan umum sebagian besar sudah selesai, tetapi tentu saja, dioptimalkan untuk beban kerja yang melibatkan matriks data yang besar (pikirkan aljabar linier) yang dikirimkan dalam batch, daripada CPU yang dapat beroperasi secara efisien di urutan panjang data yang sangat kecil (1 + 1, 2 * 4, 5 * 6 secara berurutan, dll.) Komputasi serba guna tersedia melalui OpenCL, CUDA, dll. tetapi perangkat kerasnya masih belum sepenuhnya menjadi "SIMD coprocessor" penuh. karena (a) Anda masih harus memalu register khusus perangkat keras untuk mendapatkan fungsionalitas GPU; (B) membaca dari VRAM GPU sangat lambat karena overhead bus PCIe (membaca dari GPU tidak sangat dioptimalkan pada arsitektur saat ini); (c) arsitektur memori dan cache tidak koheren dengan CPU; banyak perangkat keras fungsi tetap yang lama masih ada.
  • Present (OpenGL 4.x): Menyingkirkan banyak perangkat keras fungsi tetap yang lama. Peningkatan latensi baca GPU agak. IOMMU memungkinkan pemetaan berbantuan perangkat keras (diterjemahkan) antara VRAM dan memori sistem. Juga memperkenalkan tessellation perangkat keras, mengembalikan elemen fungsi tetap.
  • Masa Depan ( HSA): GPU pada dasarnya adalah co-prosesor. Semuanya terintegrasi dengan CPU dengan sedikit impedansi (untuk membaca / menulis) antara GPU dan CPU, bahkan untuk GPU khusus pada bus PCIe. Arsitektur memori yang sepenuhnya koheren - "mi memoria es su memoria" (ingatanku adalah ingatanmu). Program userspace dapat membaca dari "VRAM" sama seperti mereka membaca dari memori sistem tanpa driver shim, dan perangkat keras mengatasinya. Anda memiliki CPU untuk pemrosesan "serial" (lakukan ini, lalu lakukan itu, kemudian lakukan ini, lalu lakukan itu) untuk jumlah data yang sederhana, dan GPU untuk pemrosesan "paralel" (lakukan operasi ini pada dataset besar ini dan bagilah sesuai keinginan Anda). Papan tempat GPU duduk mungkin masih memiliki ROP, HDMI codec, dll. Tetapi hal ini diperlukan untuk menampilkan output,

Poin terakhir Anda sangat bagus, dan itu juga berlaku untuk lebih dari sekadar jenis OpenGL1.x / 2.x. Karena kompleksitas logika yang luar biasa dalam GPU, hampir dapat dipastikan bahwa akan ada bug di suatu tempat. Biasanya sebagian besar bug dalam logika dihilangkan sebelum menjadi chip fisik, tetapi mungkin ada beberapa kasus sudut aneh yang masih bisa muncul. Ketika ini terjadi, driver harus mengimplementasikan fitur itu sendiri untuk memotong bagian kereta perangkat keras. Hal-hal seperti ini sering menjadi alasan Anda mendapatkan peningkatan fitur / kinerja dalam pembaruan driver.
Ben Richards
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.