Gambaran arsitektur tiny-gpu
GPU
- Dibangun untuk menjalankan satu kernel pada satu waktu
- Untuk menjalankan kernel, diperlukan langkah-langkah berikut:
- Muat memori program global dengan kode kernel
- Muat memori data dengan data yang diperlukan
- Tentukan jumlah thread yang akan dijalankan di register kontrol perangkat
- Setel sinyal mulai ke HIGH untuk menjalankan kernel
- GPU terdiri dari unit-unit berikut:
- Register kontrol perangkat
- Dispatcher
- Sejumlah variabel computing core
- Pengontrol memori untuk memori data dan memori program
- Cache
Memori
- GPU dibangun untuk berinteraksi dengan memori global eksternal
- Memori data dan memori program dipisahkan demi penyederhanaan
- Memori global memiliki bandwidth baca/tulis yang tetap
- Pengontrol memori melacak semua permintaan keluar dari computing core ke memori, mengatur permintaan sesuai bandwidth memori eksternal yang sebenarnya, dan meneruskan respons dari memori eksternal ke resource yang sesuai
- Cache menyimpan data yang diminta berulang kali untuk mengurangi penggunaan bandwidth memori
Core
- Setiap core memiliki resource komputasi
- Dalam GPU yang disederhanakan ini, setiap core memproses satu blok pada satu waktu, dan memiliki ALU, LSU, PC, serta register file khusus untuk setiap thread dalam blok
- Scheduler mengelola eksekusi thread, dan tidak memilih blok baru sebelum blok saat ini selesai
- Fetcher mengambil instruksi secara asinkron dari program counter saat ini
- Decoder mendekode instruksi yang di-fetch menjadi sinyal kontrol untuk eksekusi thread
- Setiap thread memiliki kumpulan register file khusus
- ALU adalah arithmetic logic unit khusus per thread
- LSU adalah load-store unit khusus per thread untuk mengakses memori data global
- PC adalah program counter khusus yang menentukan instruksi berikutnya yang akan dijalankan pada setiap thread
ISA
- Mengimplementasikan ISA sederhana dengan 11 instruksi
- Dibangun untuk kernel sederhana seperti penjumlahan dan perkalian matriks
- Mendukung operasi aritmetika dasar, load/store memori, branch, pemuatan konstanta, dan lain-lain
Eksekusi
- Setiap core melalui tahapan fetch, decode, request, wait, execute, dan update untuk menjalankan instruksi
- Setiap thread mengikuti jalur eksekusi untuk melakukan perhitungan terhadap data di register file
- Untuk fungsionalitas SIMD, ada nilai indeks blok, dimensi, dan indeks thread di register read-only
Kernel
- Kernel penjumlahan dan perkalian matriks ditulis dengan ISA untuk membuktikan pemrograman SIMD dan eksekusi GPU
- Dengan file pengujian, eksekusi kernel di GPU dapat disimulasikan sepenuhnya dan dapat menghasilkan status memori data serta jejak eksekusi
Simulasi
- Setelah memasang iverilog dan cocotb, simulasi kernel dapat dijalankan dengan perintah
make
- File log menampilkan status awal/akhir memori data dan jejak eksekusi lengkap dari kernel
Fitur lanjutan
- Banyak fitur tambahan pada GPU modern yang sangat meningkatkan performa dan fungsionalitas dihilangkan demi penyederhanaan
- Dibahas fitur seperti cache multi-level dan shared memory, memory coalescing, pipelining, warp scheduling, branch divergence, sinkronisasi, dan barrier
Opini GN⁺
- Menjelaskan inti arsitektur GPU dan model pemrograman SIMD dengan baik secara sederhana dan mudah dipahami. Khususnya, contoh kernel operasi matriks menunjukkan dengan jelas bagaimana pemrosesan paralel dilakukan pada GPU nyata.
- Fitur lanjutan yang digunakan pada GPU modern juga dirangkum dengan baik, sehingga setelah memahami tiny-gpu, ini tampaknya akan membantu untuk mempelajari arsitektur GPU yang lebih kompleks.
- Namun, karena fitur graphics pipeline yang sebenarnya tidak disertakan, cara kerja hardware yang dikhususkan untuk grafis tidak dibahas. Ini mungkin terasa kurang bagi orang yang tertarik pada grafis.
- Jika dibandingkan dengan arsitektur GPU open source lain seperti MIAOW atau GPGPU-Sim, ini tampaknya akan membantu memahami GPU yang lebih realistis.
- Jika ke depan fitur seperti branch divergence, memory coalescing, dan pipelining ditambahkan, ini diharapkan menjadi materi pembelajaran yang lebih praktis. Fakta bahwa ini adalah proyek open source yang bisa dikontribusikan dalam pengembangannya juga menarik.
1 komentar
Komentar Hacker News
Intel membuka banyak dokumen teknis tentang GPU. Manual 810/815 juga bisa ditemukan secara online. Selain 855/910/915/945, dokumentasinya cukup konsisten.
Mendukung upaya GPU open core.
Ada proyek GPU open-source lain bernama NyuziProcessor. (https://github.com/jbush001/NyuziProcessor)
Ingin mulai belajar FPGA, tetapi sulit mengetahui harus mulai dari mana dan bidang ini sendiri terasa mengintimidasi.
Tujuan akhirnya adalah membuat kartu akselerator untuk LLM (Large Language Model). Selain bagian offloading memori, akan ada banyak kesamaan dengan proyek ini.
Bertanya mengapa operator assignment non-blocking dan blocking dicampur dalam blok
alwayssekuensial.Dulu pernah melakukan pekerjaan serupa dengan VHDL. Ada situs bernama opencores yang memiliki berbagai proyek HDL open-source. Penasaran apakah saat ini ada simulator HDL terdistribusi berskala besar setingkat HPC. Tampaknya masuk akal untuk menjalankan simulasi level RTL dengan memanfaatkan GPU modern.
Suka melihat proyek hardware dirilis secara terbuka. Tetapi ini bisa dibilang sebagai koprosesor SIMD. Agar bisa disebut GPU, setidaknya harus ada semacam output display. Belakangan istilah ini memang jadi agak longgar karena Nvidia dan lainnya menjual varian arsitektur grafis khusus server sebagai GPU, tetapi bagian "grafis" dalam desain GPU masih mencakup porsi kompleksitas yang besar.
Bertanya-tanya apakah ALU umumnya benar-benar mengimplementasikan instruksi DIV langsung di level hardware. Ingin tahu apakah ini benar-benar dipakai sebagai instruksi nyata di tempat seperti CUDA core modern, atau biasanya diemulasikan lewat software. Rangkaian pembagian hardware yang sesungguhnya memakan banyak area, jadi tidak mengira ini akan ada di ALU GPU. Mudah menulis
DIV: begin alu_out_reg <= rs / rt; enddi Verilog, tetapi di silikon itu memakan banyak ruang. Namun orang yang hanya mensimulasikan Verilog mungkin tidak menyadarinya.Sebuah "GPU" lain yang tidak menyediakan fungsi grafis. Menurut pendapat ini, hal seperti ini seharusnya disebut dengan nama lain.
Menyederhanakan dengan mengasumsikan thread diproses secara paralel, lalu semua thread "berkonvergensi" ke program counter yang sama setelah setiap instruksi. Pada GPU nyata, tiap thread bisa bercabang ke PC yang berbeda sehingga terjadi branch divergence. Sebaiknya mencoba pemrograman GPU sebelum membuat GPU dalam silikon. Ini juga bukan SIMD. (Sama seperti orang yang merakit rangkaian lampu LED berkedip lalu mengklaim telah membuat CPU)