- 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
Henüz yorum yok.