AMD GPU Hata Ayıklayıcısı
(thegeeko.me)- 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
rocgdbvar 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/cardXaçılarak KMD (kernel mode driver) ile bağlantı kurulduktan sonraamdgpu_device_initializeçağrılıyorlibdrmile 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_opyerine doğrudan IOCTL çağrılarıyla eşleme yapılır
clangveobjdumpkullanılarak shader assembly kodu derlenir ve ikili çıktı çıkarılırPM4 Packetformatı 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 adresiTMA: 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}/regs2dosyası üzerinden kayıt erişimi sağlanıramdgpu_debugfs_regs2_writeile 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
TTMPkayıtlarıyla GPU durumu (STATUS, EXEC, VCC vb.) saklanırglobal_store_addtid_b32komutu 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
ACOderleyicisiyle SPIR-V, GPU ikili koduna dönüştürülür RADV_FORCE_FAMILYortam değişkeniyle sanal cihaz oluşturulur
- RADV'nin
- RADV'nin
null_winsysmodu 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_STARTbitleriyle 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_WATCHkaydı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
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
İ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
Ö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
Bana OpenGL'den çok daha uygun geldi
OpenGL tarafında RenderDoc denedin mi? Vulkan/OpenGL için buna en yakın araç o
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ı
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
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
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
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
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
devstral:24b modeli de oldukça hızlıydı
ComfyUI'de çoğu şey iyi çalışıyordu ama alışılmadık işlerde kararsızdı
Son zamanlarda düzeldiğini duydum