2 puan yazan GN⁺ 2024-04-27 | 1 yorum | WhatsApp'ta paylaş

tiny-gpu mimarisine genel bakış

GPU

  • Aynı anda yalnızca bir kernel çalıştıracak şekilde tasarlanmıştır
  • Bir kernel'i çalıştırmak için şu işlemler gerekir:
    1. Global program belleğini kernel koduyla yüklemek
    2. Veri belleğini gerekli verilerle yüklemek
    3. Aygıt kontrol kayıtlarında çalıştırılacak thread sayısını belirtmek
    4. Kernel'i başlatmak için start sinyalini HIGH olarak ayarlamak
  • GPU şu birimlerden oluşur:
    1. Aygıt kontrol kayıtları
    2. Dispatcher
    3. Değişken sayıda hesaplama çekirdeği
    4. Veri belleği ve program belleği için bellek denetleyicileri
    5. Cache

Bellek

  • GPU, harici global bellek ile arayüz kuracak şekilde tasarlanmıştır
  • Basitleştirme amacıyla veri belleği ile program belleği ayrılmıştır
  • Global bellek sabit bir okuma/yazma bant genişliğine sahiptir
  • Bellek denetleyicileri, hesaplama çekirdeklerinden belleğe giden tüm istekleri izler, gerçek harici bellek bant genişliğine göre bu istekleri düzenler ve harici bellekten gelen yanıtları uygun kaynaklara iletir
  • Cache, tekrar tekrar istenen verileri saklayarak bellek bant genişliği kullanımını azaltır

Çekirdek

  • Her çekirdek hesaplama kaynaklarına sahiptir
  • Basitleştirilmiş GPU'da her çekirdek aynı anda bir blok işler ve blok içindeki her thread için ayrılmış ALU, LSU, PC ve register file barındırır
  • Scheduler, thread yürütümünü yönetir ve bir blok tamamlanmadan yeni bir blok seçmez
  • Fetcher, mevcut program counter üzerinden komutları asenkron olarak getirir
  • Decoder, getirilen komutları thread yürütümü için kontrol sinyallerine dönüştürür
  • Her thread kendine ayrılmış bir register file kümesine sahiptir
  • ALU, thread başına ayrılmış aritmetik mantık birimidir
  • LSU, global veri belleğine erişim için thread başına ayrılmış load-store unit'tir
  • PC, her thread'de yürütülecek sonraki komutu belirleyen ayrılmış program counter'dır

ISA

  • Basit 11 komutluk bir ISA uygulanmıştır
  • Matris toplama ve çarpma gibi basit kernel'ler için tasarlanmıştır
  • Temel aritmetik işlemler, bellek load/store, branch ve sabit yükleme gibi özellikleri destekler

Yürütme

  • Her çekirdek, komut yürütmek için fetch, decode, request, wait, execute ve update aşamalarından geçer
  • Her thread, register file'daki veriler üzerinde hesaplama yapmak için yürütme yolunu izler
  • SIMD işlevselliği için salt okunur kayıtlarda blok indeksi, boyutlar ve thread indeksi değerleri bulunur

Kernel

  • Matris toplama ve çarpma kernel'leri ISA ile yazılarak SIMD programlama ile GPU yürütümü gösterilmiştir
  • Test dosyalarıyla GPU üzerinde kernel yürütümünü tamamen simüle etmek ve veri belleği durumuyla yürütüm izini üretmek mümkündür

Simülasyon

  • iverilog ve cocotb kurulduktan sonra make komutuyla kernel simülasyonu çalıştırılabilir
  • Log dosyasında veri belleğinin başlangıç/son durumu ile kernel'in tam yürütüm izi çıktılanır

Gelişmiş özellikler

  • Performansı ve işlevselliği büyük ölçüde artıran modern GPU'lardaki birçok ek özellik, basitleştirme amacıyla atlanmıştır
  • Çok katmanlı cache ve shared memory, memory coalescing, pipelining, warp scheduling, branch divergence, synchronization ve barrier gibi özellikler ele alınmıştır

GN⁺ görüşü

  • GPU mimarisi ile SIMD programlama modelinin özünü basit ve anlaşılır şekilde çok iyi açıklıyor. Özellikle matris işlemi kernel örnekleri üzerinden gerçek bir GPU'da paralel işlemenin nasıl gerçekleştiğini iyi gösteriyor.
  • Modern GPU'larda kullanılan gelişmiş özellikler de iyi özetlenmiş; bu yüzden tiny-gpu'yu anladıktan sonra daha karmaşık GPU mimarilerini çalışmak için faydalı olabilir.
  • Ancak gerçek grafik pipeline işlevleri yer almıyor; dolayısıyla grafiğe özel donanımın nasıl çalıştığı ele alınmıyor. Grafikle ilgilenenler için bu bir eksiklik olabilir.
  • MIAOW veya GPGPU-Sim gibi açık kaynak başka GPU mimarileriyle karşılaştırıldığında, daha gerçekçi GPU'ları anlamaya yardımcı olabilir.
  • İleride branch divergence, memory coalescing ve pipelining gibi özellikler eklenirse çok daha pratik bir öğrenme kaynağı olması bekleniyor. Geliştirmeye katkı sunulabilecek bir açık kaynak proje olması da ayrıca çekici.

1 yorum

 
GN⁺ 2024-04-27
Hacker News yorumları
  • Intel, GPU hakkında çok sayıda teknik belge yayımlıyor. 810/815 kılavuzları da çevrimiçi bulunabiliyor. 855/910/915/945 dışında belgelendirme tutarlı biçimde yapılmış.

  • Açık çekirdek GPU çalışmalarını teşvik edici.

  • NyuziProcessor adlı başka bir açık kaynak GPU projesi var. (https://github.com/jbush001/NyuziProcessor)

  • FPGA dünyasına girmek istiyorum ama nereden başlayacağımı anlamak zor ve alanın kendisi göz korkutucu geliyor.

  • Nihai hedef, LLM (Large Language Model) için bir hızlandırıcı kart yapmak. Bellek offloading kısmı dışında bu projeyle birçok benzer yönü olacaktır.

  • Sıralı always bloklarında non-blocking ve blocking atama operatörlerinin neden karıştırıldığını soruyor.

  • Eskiden VHDL ile benzer bir çalışma yapmıştım. opencores adlı bir sitede çeşitli açık kaynak HDL projeleri vardı. Günümüzde HPC düzeyinde büyük ölçekli dağıtık HDL simülatörleri olup olmadığını merak ediyorum. Modern GPU'ları kullanarak RTL düzeyinde simülasyon yapmak mantıklı olurdu.

  • Donanım projelerinin açık olmasını seviyorum. Ama buna SIMD yardımcı işlemcisi denebilir. GPU olabilmesi için en azından bir tür ekran çıktısı olması gerekir. Son zamanlarda Nvidia ve benzerleri grafik mimarisinin yalnızca sunucuya yönelik türevlerini GPU diye pazarladığı için terim biraz gevşedi, ama GPU tasarımındaki "grafik" kısmı hâlâ karmaşıklığın önemli bir bölümünü oluşturuyor.

  • ALU'nun donanım düzeyinde DIV komutunu doğrudan uygulamasının yaygın olup olmadığını merak ediyorum. Modern CUDA çekirdekleri gibi yerlerde bunun gerçekten bir komut olarak kullanılıp kullanılmadığını, yoksa genelde yazılım emülasyonu mu olduğunu merak ediyorum. Gerçek donanım bölme devreleri çok yer kaplar, bu yüzden GPU ALU'larında bunu beklemiyordum. Verilog'da DIV: begin alu_out_reg <= rs / rt; end yazmak kolay, ama silikon üzerinde çok yer kaplar. Ancak sadece Verilog simülasyonu yapan biri bunun farkında olmayabilir.

  • Grafik yetenekleri sunmayan bir başka "GPU". Bunlara başka bir ad verilmesi gerektiği görüşü.

  • İş parçacıklarının paralel işlendiğini varsayıp her komuttan sonra tüm iş parçacıklarının aynı program sayacında "yakınsadığını" kabul ederek basitleştirmiş. Gerçek GPU'larda tek tek iş parçacıkları farklı PC'lere dallanabilir ve branch divergence oluşur. Silikonda GPU yapmadan önce biraz GPU programlama yapmak iyi olurdu. Bu SIMD bile değil. (LED yakıp söndüren bir devre kurup CPU yaptığını iddia eden kişiyle aynı kişi)