3 puan yazan GN⁺ 2025-12-10 | 1 yorum | WhatsApp'ta paylaş
  • GPU çalıştırmasını durdurup durumu inceleyebilen bir hata ayıklayıcı eksikliğiyle başlanıp, AMD GPU'de bunu doğrudan uygulama süreci anlatılıyor
  • DRM arayüzü ve libdrm ile GPU ile doğrudan haberleşilerek, bağlam oluşturma, tampon ayırma ve komut gönderme adımları aşama aşama kurgulanıyor
  • TBA/TMA kayıtları ve trap handler kullanılarak GPU çalıştırması durduruluyor, CPU ile senkronizasyonla durum okunup geri yüklenebilen bir yapı kuruluyor
  • SPIR-V kod derleme ve RADV entegrasyonu sayesinde gerçek shader hata ayıklama ortamı genişletilerek breakpoint·stepping·watchpoint yetenekleri uygulanabilir hale getiriliyor
  • GPU iç yapısını doğrudan kontrol eden bu yaklaşım, AMD GPU için eksiksiz bir hata ayıklayıcı geliştirme olasılığını kanıtlıyor ve ileride Vulkan entegrasyonuyla gelişmeye açık

GPU Hata Ayıklamanın Gerekçesi ve Yaklaşım

  • CPU gibi GPU çalıştırmasını durdurup durumu denetleyebilen bir araç eksikliğinden yola çıkılıyor
    • GPU'nun paralel çalıştırma modeli hata ayıklamayı çok daha karmaşık hale getiriyor
  • AMD ROCm ortamında rocgdb var olsa da yalnızca ROCm ile sınırlı kapsam destekleniyor
  • Marcell Kiss'in blog serisini inceleyerek GPU ile doğrudan iletişim kuran bir hata ayıklayıcı geliştirmeye çalışıldı

GPU ile Doğrudan İletişim

  • RADV sürücüsünün davranışı takip edilerek GPU ile doğrudan haberleşme yöntemi öğreniliyor
  • /dev/dri/cardX açılarak KMD (kernel mode driver) ile bağlantı kurulduktan sonra amdgpu_device_initialize çağrılıyor
  • libdrm ile bağlam oluşturma (amdgpu_cs_ctx_create) ve tampon ayrılması yapılır
    • Kod tamponu ve komut tamponu olmak üzere iki tampon oluşturulur
  • Tamponlar GPU/CPU sanal adres alanlarına eşlenir
    • amdgpu_bo_va_op yerine doğrudan IOCTL çağrılarıyla eşleme yapılır
  • clang ve objdump kullanılarak shader assembly kodu derlenir ve ikili çıktı çıkarılır
  • PM4 Packet formatı ile GPU komutları oluşturulup shader yürütme komutları gönderilir

GPU Trap ve Debugfs Kullanımı

  • RDNA3 ISA'nın TBA/TMA kayıtları ile trap handler ayarlanır
    • TBA: trap handler adresi
    • TMA: trap handler için geçici bellek adresi
  • Kullanıcı alanından doğrudan erişim mümkün olmadığından debugfs arayüzü kullanılır
    • /sys/kernel/debug/dri/{PCI address}/regs2 dosyası üzerinden kayıt erişimi sağlanır
    • amdgpu_debugfs_regs2_write ile kayıt yazımı yapılır
  • VMID bazında TBA/TMA ayarlanarak trap handler etkinleştirilir
    • Her VMID, GPU işlem bağlamını ayırır

Trap Handler Uygulaması

  • Trap handler, GPU bir istisnayla karşılaştığında çalışan ayrıcalıklı bir shader programıdır
  • TTMP kayıtlarıyla GPU durumu (STATUS, EXEC, VCC vb.) saklanır
  • global_store_addtid_b32 komutu ile thread başına register değerleri belleğe yazılır
  • GPU veri yazdığında CPU bunu tespit eder ve SQ_CMD kaydıyla GPU geçici olarak durdurulur
    • Ardından CPU veriyi analiz ettikten sonra tekrar SQ_CMD ile GPU çalıştırması başlatılır
  • Trap handler, dönüşte program sayacı ve kayıt durumu geri yükleme yapar

SPIR-V Kod Çalıştırma ve RADV Entegrasyonu

  • Elle assembly yerine SPIR-V kod derleme desteği getirilir
    • RADV'nin ACO derleyicisiyle SPIR-V, GPU ikili koduna dönüştürülür
    • RADV_FORCE_FAMILY ortam değişkeniyle sanal cihaz oluşturulur
  • RADV'nin null_winsys modu ile gerçek donanım erişimi olmadan yalnızca derleme yapılır
  • Derleme sonucundan shader kodu, kaynak ayarları ve hata ayıklama bilgileri çıkarılır

Hata Ayıklayıcı Özelliklerini Genişletme

  • Stepping: RSRC1.DEBUG_MODE, RSRC3.TRAP_ON_START bitleriyle komut bazlı yürütme kontrolü sağlanır
  • Breakpoints: Kod tamponundaki adrese göre program sayacı konumu hesaplandıktan sonra trap işlenir
  • Source Mapping: ACO derleyicisinin hata ayıklama bilgileri ile kaynak kod satır eşlemesi yapılır
  • Watchpoints: GPU sayfa koruması veya SQ_WATCH kaydıyla adres izleme işlevi uygulanabilir
  • Değişken adı/ tipi takibi: Mesa'nın NIR optimizasyon aşamasında hata ayıklama bilgisi iletiminin geliştirilmesi gerekiyor
  • Vulkan entegrasyonu: RADV temeliyle çerçeve bazlı hata ayıklama, tampon/ doku/sabit veri bilgileri kullanılabilir

Bonus: Kullanıcı Modu Sayfa Gezinme Kodu

  • RDNA3(gfx11) GPU'lar için sayfa tablosu gezinme kodu örneği veriliyor
    • PDE/PTE yapı tanımları ve decode fonksiyonları içerir
    • Sanal adresten fiziksel adrese çevirme işlemi uygulanır
  • VMID bazında sayfa tablosu kayıtları okunarak GPU bellek eşleme yapısı analiz edilebilir

Sonuç

  • AMD GPU'da çekirdek ve donanım seviyesine doğrudan erişimle tam bir hata ayıklayıcı geliştirme olasılığı kanıtlandı
  • CPU ve GPU arasında çift yönlü iletişim döngüsü kurularak çalıştırmayı durdurma, durum analizi ve yeniden başlatma gerçekleşti
  • İleride RADV ve Vulkan entegrasyonu ile geliştirici dostu bir GPU hata ayıklama ortamına dönüşme potansiyeli bulunmaktadır

1 yorum

 
GN⁺ 2025-12-10
Hacker News yorumu
  • AMD değil ama Metal gerçekten harika bir debugger ve geliştirme araçları seti sunuyor
    Bu yüzden GPU işleri yaparken her zaman önce Metal kullanmayı, sonra diğer sistemlere port etmeyi tercih ediyorum
    Metal Debugger dokümantasyonu faydalı olabilir
    AAA oyun geliştiricisi değilim ama benim kullanımım için neredeyse kusursuzdu
    Özellikle shader içinden biçimlendirilmiş log dizelerini yazdırınca bunların uygulama loglarıyla birlikte karışık şekilde görünmesi etkileyici
    Hem Metal hem OpenGL kullanan GPU tabanlı bir uygulama geliştiriyorum ve OpenGL tarafında Metal seviyesinde araç bulmak zordu

    • OpenGL grafik kodunu PS5 ve Xbox'a port ederken shader'larla ilk kez tanıştım
      İki platform da özel debugger sağlıyor ve kaliteleri gayet iyiydi
      Sonunda sadece siyah ekran gördüğünde her şeyin araçlara bağlı olduğunu anladım
      Acaba OpenGL yerine DirectX kullansam Windows'ta daha iyi araçlar elde eder miyim diye merak ediyorum
    • Metal debugger gerçekten çok iyi yapılmış ama sık sık donuyor ya da Xcode çöküyor
      Özellikle compute shader ile uğraşırken profiling çoğu zaman düzgün çalışmıyor
      Grafik odaklı tasarlanmış bir araç olduğundan, AI ya da büyük buffer işleri için hâlâ sınırları var gibi görünüyor
    • Xcode'un Metal debugger'ı harika ve Metal API'si de sezgisel
      Bana OpenGL'den çok daha uygun geldi
      OpenGL tarafında RenderDoc denedin mi? Vulkan/OpenGL için buna en yakın araç o
    • GPU öğrenmek için Mac satın alma fikrine katılmak zor
      Pahalı bir bilgisayar alıp yalnızca Metal'e özel API debug etmek verimsiz
      Grafik programlamayı ciddi şekilde öğrenmek istiyorsan Windows veya Linux'ta DX12 ya da Vulkan öğrenmenin daha iyi olduğunu düşünüyorum
      RenderDoc gibi araçlarla bu gayet mümkün
      Metal iyi bir API ama Apple platformları dışında kullanılamaması en büyük sınırlaması
    • Metal güzel ama bence sorun vendor lock-in
      Sunucu ya da oyun ortamlarında çoğunlukla AMD veya Nvidia GPU kullanıldığı için Metal merkezli geliştirme pratik değil
  • NVIDIA'nın CUDA'sında cuda-gdb adında 1st-party bir GDB var
    Resmî dokümantasyonda görülebileceği gibi CUDA'nın thread modeliyle iyi uyum sağlıyor
    Ancak yalnızca warp düzeyinde single-step çalıştırma yapılabiliyor

  • NVIDIA kartlarda NSight kullanılabiliyor ve farklı GPU'larda çalışan RenderDoc da var

    • RenderDoc daha çok yüksek seviyeli bir debugger gibi ve performans analizi için de yararlı
      QML ya da QSG_VISUALIZE=overdraw gibi yüksek seviyeli görselleştirmeler eksik olduğunda sahneyi API çağrısı düzeyinde izlemek ilginç oluyor
    • nsys ve nvtx de mükemmel araçlar
      GPU olmadan da kullanılabildiklerini bilmeyen çok kişi var
  • AMD için resmî araç olup olmadığı sorusuna cevap olarak, GDB AMD GPU debugging desteği sunuyor
    Ayrıca AMD'nin UMR,
    Radeon GPU Detective ve
    Radeon Developer Tool Suite gibi araçları da var

    • Blog yazısında AMD ROCm için rocgdb adlı bir debugger'dan da bahsediliyor
  • AMD GPU için bizzat yapılmış bir izleme aracı paylaşılıyor
    Projenin adı picomon; nvtop fazla katı olduğu için sık sık çökme sorununu çözmek amacıyla yapılmış

  • Metal, CUDA, Pix, PS/Switch gibi her platformun kendine özel araçları var
    Araştırmacıların hâlâ CUDA'yı tercih etme eğiliminde olmasının nedenlerinden biri de bu
    Nsight Systems da bunlardan biri

  • 7900 XTX GPU'yu yerel inference ya da diffusion için kullanan var mı diye soruluyor
    Linux kurdum ama çoğunlukla boş duruyor, değerlendirmek istiyorum

    • Gentoo'da birkaç yıldır kullanıyorum
      Eskiden Python'la ilgili sorunlar vardı ama son zamanlarda stabil hâle geldi ve img2video bile mümkün
      24GB VRAM açısından bakınca hâlâ en iyi fiyat/performans kartı olduğunu düşünüyorum
      ROCm yakın zamanda UX iyileştirmesi için büyük bir yeniden çalışma geçirdi, TheRock'a bakmanı öneririm
    • Windows'ta 7900XT ile ollama üzerinden LLM'i yerelde host etmeyi denedim ve iyi çalıştı
      devstral:24b modeli de oldukça hızlıydı
    • Çıkış döneminde satın aldığımda ROCm ile ilgili kernel OOM hataları vardı
      ComfyUI'de çoğu şey iyi çalışıyordu ama alışılmadık işlerde kararsızdı
      Son zamanlarda düzeldiğini duydum
    • 6800XT ile de benzer şeyler yaptım; ekosistem CUDA merkezli olduğu için biraz zahmetli ama mümkün
    • Görüntü ve metin üretim modellerini test ettim; temel torch kütüphanesini AMD'nin ROCm sürümüyle değiştirince sorunsuz çalıştı