3 पॉइंट द्वारा GN⁺ 2025-12-10 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • CPU की तरह GPU रन को अस्थायी रूप से रोककर उसकी स्थिति की जांच कर सकने वाले डिबगर की अनुपस्थिति से शुरुआत करके, AMD GPU पर इसे सीधे लागू करने की पूरी प्रक्रिया समझाई गई है
  • DRM इंटरफ़ेस और libdrm के माध्यम से GPU से सीधे संवाद करते हुए, कंटेक्स्ट निर्माण, बफर आवंटन और कमांड ट्रांसमिशन को चरण-दर-चरण बनाया गया
  • TBA/TMA रजिस्टर और trap handler का उपयोग करके GPU रन को रोकना, तथा CPU के साथ सिंक्रोनाइज़ होकर स्थिति पढ़ना और पुनर्स्थापित करना संभव किया गया
  • SPIR-V कोड कंपाइल और RADV इंटीग्रेशन से वास्तविक शेडर डिबगिंग वातावरण का विस्तार कर, breakpoint·stepping·watchpoint सुविधाओं को लागू करने की क्षमता बनाई गई
  • GPU के भीतरी ढांचे को सीधे नियंत्रित करने वाला यह तरीका AMD GPU के लिए पूर्ण डिबगर निर्माण की संभावना को साबित करता है और भविष्य में Vulkan इंटीग्रेशन से आगे बढ़ने की संभावनाएँ मौजूद हैं

GPU डिबगिंग की आवश्यकता और दृष्टिकोण

  • CPU की तरह GPU रन को अस्थायी रूप से रोककर स्थिति की जांच कर सकने वाले औज़ार की अनुपस्थिति से शुरुआत की गई
    • GPU का parallel execution model इसे कहीं अधिक जटिल बनाता है
  • AMD ROCm वातावरण में rocgdb मौजूद है, लेकिन यह केवल ROCm-सीमित स्कोप को ही समर्थन देता है
  • Marcell Kiss की ब्लॉग सीरीज़ का संदर्भ लेकर GPU से सीधे संवाद करने वाला डिबगर बनाने का प्रयास

GPU से सीधे संवाद करना

  • RADV ड्राइवर के व्यवहार को ट्रैक करते हुए GPU से सीधे बातचीत करने का तरीका समझना
  • /dev/dri/cardX खोलकर KMD (kernel mode driver) से कनेक्ट होने के बाद amdgpu_device_initialize कॉल
  • libdrm के जरिए कंटेक्स्ट निर्माण (amdgpu_cs_ctx_create) और बफर आवंटन करना
    • कोड बफर और कमांड बफर दोनो बनाना
  • बफरों को GPU/CPU virtual address space में map करना
    • amdgpu_bo_va_op की जगह सीधे IOCTL कॉल से मैपिंग करना
  • clang और objdump की मदद से शेडर असेंबली कोड कंपाइल करना और बाइनरी निकालना
  • PM4 Packet फॉर्मेट में GPU कमांड बनाकर शेडर रन कमांड भेजना

GPU trap और Debugfs का उपयोग

  • RDNA3 ISA के TBA/TMA रजिस्टर से trap handler सेट करना
    • TBA: trap handler का address
    • TMA: trap handler के लिए temporary memory address
  • यूज़र-स्पेस से सीधे access संभव नहीं होने के कारण debugfs interface का उपयोग
    • /sys/kernel/debug/dri/{PCI address}/regs2 फ़ाइल के माध्यम से रजिस्टर access
    • amdgpu_debugfs_regs2_write से रजिस्टर लिखना
  • हर VMID के लिए TBA/TMA सेट करके trap handler सक्रिय करना
    • प्रत्येक VMID अलग GPU process context को अलग करता है

trap handler का निर्माण

  • trap handler वह privileged shader program है जो GPU को exception मिलने पर execute होता है
  • TTMP रजिस्टर की मदद से GPU state (STATUS, EXEC, VCC आदि) सेव करना
  • global_store_addtid_b32 निर्देश से थ्रेड स्तर पर रजिस्टर मान मेमोरी में स्टोर करना
  • CPU, GPU द्वारा लिखी गई data detect करने पर SQ_CMD रजिस्टर से GPU को pause करता है
    • बाद में CPU डेटा विश्लेषित करने के बाद फिर से SQ_CMD से GPU रन resume करता है
  • trap handler रिटर्न पर program counter और register state restore करता है

SPIR-V कोड रन और RADV इंटीग्रेशन

  • मैनुअल असेंबली के बदले SPIR-V code compile सपोर्ट
    • RADV के ACO compiler का उपयोग करके SPIR-V को GPU binary में बदलना
    • RADV_FORCE_FAMILY environment variable से virtual device निर्माण
  • RADV के null_winsys मोड के साथ बिना वास्तविक hardware access के केवल compile करना
  • कंपाइल आउटपुट से शेडर कोड, resource सेटअप और debug info extract करना

डिबगर सुविधाओं का विस्तार

  • Stepping: RSRC1.DEBUG_MODE, RSRC3.TRAP_ON_START bits का उपयोग करके instruction-level execution control
  • Breakpoints: कोड बफर के पते के आधार पर program counter स्थान की गणना कर trap संभालना
  • Source Mapping: ACO compiler की debug info से स्रोत कोड लाइन मैपिंग
  • Watchpoints: GPU page protection या SQ_WATCH रजिस्टर के जरिए address watch सुविधा लागू की जा सकती है
  • वैरिएबल नाम/टाइप ट्रैकिंग: Mesa के NIR optimization चरण में debug info forwarding सुधारने की जरूरत
  • Vulkan इंटीग्रेशन: RADV आधारित फрейम स्तर डिबगिंग, buffer/texture/constant जानकारी का उपयोग संभव

बोनस: यूज़र मोड पेज-वॉकिंग कोड

  • RDNA3(gfx11) GPU के लिए page table walk code का उदाहरण
    • PDE/PTE struct definitions और decoding फंक्शन शामिल
    • virtual address से physical address में बदलने की प्रक्रिया implement की गई
  • VMID-वार page table registers पढ़कर GPU memory mapping structure का विश्लेषण संभव

निष्कर्ष

  • AMD GPU के लिए कर्नेल और hardware लेवल access द्वारा पूर्ण डिबगर निर्माण की संभावना को प्रमाणित
  • CPU और GPU के बीच दो-तरफ़ा communication loop बनाकर रन-पॉज़, state analysis और resume को सफलतापूर्वक लागू किया गया
  • आगे चलकर RADV और Vulkan इंटीग्रेशन से डेवलपर-फ्रेंडली GPU डिबगिंग environment के रूप में विकसित होने की संभावना मौजूद है

1 टिप्पणियां

 
GN⁺ 2025-12-10
Hacker News की राय
  • AMD नहीं, लेकिन Metal वाकई बहुत बेहतरीन debugger और development tools का सेट देता है
    इसी वजह से मैं GPU काम करते समय हमेशा पहले Metal का इस्तेमाल करना पसंद करता हूँ, और बाद में दूसरे सिस्टम पर port करता हूँ
    Metal Debugger दस्तावेज़ देखना उपयोगी होगा
    मैं AAA game developer नहीं हूँ, लेकिन मेरे उपयोग के लिए यह लगभग परफेक्ट था
    खास तौर पर shader में formatted log strings को output करने पर उनका app logs के साथ मिलकर दिखना चौंकाने वाला फीचर है
    मैं Metal और OpenGL दोनों का इस्तेमाल करने वाला GPU-आधारित app विकसित कर रहा हूँ, और OpenGL की तरफ Metal स्तर के tools ढूँढना मुश्किल था

    • मैंने OpenGL graphics code को PS5 और Xbox पर port करते समय पहली बार shaders से काम किया
      दोनों platforms dedicated debugger देते हैं, और उनकी quality काफ़ी अच्छी थी
      आखिरकार यह समझ आया कि जब सिर्फ़ काली स्क्रीन दिखे, तब tooling ही सब कुछ होती है
      सोच रहा हूँ कि OpenGL की जगह DirectX इस्तेमाल करने पर क्या Windows में बेहतर tooling मिलेगी
    • Metal debugger वाकई बहुत अच्छी तरह बनाया गया है, लेकिन इसमें अक्सर freezing होता है या Xcode force quit हो जाता है
      खासकर compute shader के साथ profiling कई बार ठीक से काम नहीं करती
      यह tool graphics-केंद्रित डिज़ाइन किया गया है, इसलिए AI या बड़े buffer workloads में इसकी सीमाएँ अभी भी दिखती हैं
    • Xcode का Metal debugger शानदार है, और Metal API खुद भी intuitive है
      यह OpenGL से कहीं बेहतर लगा
      OpenGL की तरफ RenderDoc इस्तेमाल करके देखा है? Vulkan/OpenGL के लिए वही सबसे मिलता-जुलता tool है
    • GPU सीखने के लिए Mac खरीदने वाली राय से सहमत होना मुश्किल है
      महँगा कंप्यूटर खरीदकर Metal-only API debug करना अक्षम तरीका है
      अगर graphics programming गंभीरता से सीखनी है, तो Windows या Linux पर DX12 या Vulkan सीखना बेहतर होगा
      RenderDoc जैसे tools के साथ यह पर्याप्त रूप से संभव है
      Metal अच्छा API है, लेकिन Apple platform के बाहर इस्तेमाल न कर पाना इसकी सबसे बड़ी सीमा है
    • Metal शानदार है, लेकिन vendor lock-in एक समस्या है
      server या game environments में ज़्यादातर AMD या Nvidia GPU इस्तेमाल होते हैं, इसलिए Metal-केंद्रित development व्यावहारिक नहीं है
  • NVIDIA के CUDA में cuda-gdb नाम का 1st-party GDB मौजूद है
    आधिकारिक दस्तावेज़ से पता चलता है कि यह CUDA के thread model के साथ अच्छी तरह मेल खाता है
    हालाँकि single-step execution सिर्फ़ warp unit पर ही संभव है

  • NVIDIA cards पर NSight इस्तेमाल किया जा सकता है, और अलग-अलग GPU पर काम करने वाला RenderDoc भी है

    • RenderDoc ज़्यादा high-level debugger के करीब है, और performance analysis में भी उपयोगी है
      जब QML या QSG_VISUALIZE=overdraw जैसी high-level visualization कम पड़ती है, तब API call स्तर पर scene trace करना दिलचस्प होता है
    • nsys और nvtx भी शानदार tools हैं
      बहुत से लोगों को पता नहीं होता कि इन्हें GPU के बिना भी इस्तेमाल किया जा सकता है
  • AMD के लिए official tool है या नहीं, इस सवाल पर GDB AMD GPU debugging को support करता है
    इसके अलावा AMD के UMR और
    Radeon GPU Detective,
    Radeon Developer Tool Suite जैसे tools भी हैं

    • ब्लॉग पोस्ट में AMD ROCm के लिए rocgdb नाम के debugger का भी ज़िक्र है
  • AMD GPU के लिए खुद बनाया हुआ monitoring tool साझा किया गया
    यह picomon नाम का project है, जिसे nvtop के बहुत सख़्त होने और बार-बार crash होने की समस्या हल करने के लिए बनाया गया था

  • Metal, CUDA, Pix, PS/Switch आदि हर platform के अपने dedicated tools हैं
    इसी वजह से researchers अब भी CUDA को prefer करते हैं
    Nsight Systems भी उन्हीं में से एक है

  • क्या कोई 7900 XTX GPU को local inference या diffusion के लिए इस्तेमाल कर रहा है?
    मैंने Linux install किया है, लेकिन वह ज़्यादातर खाली पड़ा है, इसलिए उसे काम में लेना चाहता हूँ

    • Gentoo पर कई सालों से इस्तेमाल कर रहा हूँ
      पहले Python से जुड़ी समस्याएँ थीं, लेकिन हाल में यह stable हो गया है और img2video तक संभव है
      24GB VRAM के हिसाब से यह अब भी सबसे अच्छा value-for-money card लगता है
      ROCm में हाल ही में UX improvements के लिए बड़ा बदलाव किया गया है, इसलिए TheRock देखना सुझाऊँगा
    • Windows पर 7900XT के साथ ollama के ज़रिए LLM को local host करके देखा, और वह अच्छी तरह चला
      devstral:24b model भी काफ़ी तेज़ चला
    • लॉन्च के शुरुआती समय में खरीदने पर ROCm से जुड़ी kernel OOM errors थीं
      ComfyUI में ज़्यादातर चीज़ें ठीक चलती थीं, लेकिन कुछ असामान्य workloads में अस्थिरता थी
      सुना है कि अब यह stable हो गया है
    • 6800XT पर भी इसी तरह का काम करके देखा; CUDA-केंद्रित ecosystem होने की वजह से थोड़ा मुश्किल था, लेकिन संभव था
    • image और text generation models टेस्ट किए, और default torch library को AMD के ROCm version से बदलते ही सब बिना समस्या के चलने लगा