AMD GPU डिबगर
(thegeeko.me)- 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 का addressTMA: trap handler के लिए temporary memory address
- यूज़र-स्पेस से सीधे access संभव नहीं होने के कारण debugfs interface का उपयोग
/sys/kernel/debug/dri/{PCI address}/regs2फ़ाइल के माध्यम से रजिस्टर accessamdgpu_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 के
ACOcompiler का उपयोग करके SPIR-V को GPU binary में बदलना RADV_FORCE_FAMILYenvironment variable से virtual device निर्माण
- RADV के
- RADV के
null_winsysमोड के साथ बिना वास्तविक hardware access के केवल compile करना - कंपाइल आउटपुट से शेडर कोड, resource सेटअप और debug info extract करना
डिबगर सुविधाओं का विस्तार
- Stepping:
RSRC1.DEBUG_MODE,RSRC3.TRAP_ON_STARTbits का उपयोग करके 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 टिप्पणियां
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 ढूँढना मुश्किल था
दोनों platforms dedicated debugger देते हैं, और उनकी quality काफ़ी अच्छी थी
आखिरकार यह समझ आया कि जब सिर्फ़ काली स्क्रीन दिखे, तब tooling ही सब कुछ होती है
सोच रहा हूँ कि OpenGL की जगह DirectX इस्तेमाल करने पर क्या Windows में बेहतर tooling मिलेगी
खासकर compute shader के साथ profiling कई बार ठीक से काम नहीं करती
यह tool graphics-केंद्रित डिज़ाइन किया गया है, इसलिए AI या बड़े buffer workloads में इसकी सीमाएँ अभी भी दिखती हैं
यह OpenGL से कहीं बेहतर लगा
OpenGL की तरफ RenderDoc इस्तेमाल करके देखा है? Vulkan/OpenGL के लिए वही सबसे मिलता-जुलता tool है
महँगा कंप्यूटर खरीदकर Metal-only API debug करना अक्षम तरीका है
अगर graphics programming गंभीरता से सीखनी है, तो Windows या Linux पर DX12 या Vulkan सीखना बेहतर होगा
RenderDoc जैसे tools के साथ यह पर्याप्त रूप से संभव है
Metal अच्छा API है, लेकिन Apple platform के बाहर इस्तेमाल न कर पाना इसकी सबसे बड़ी सीमा है
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 भी है
जब QML या QSG_VISUALIZE=overdraw जैसी high-level visualization कम पड़ती है, तब API call स्तर पर scene trace करना दिलचस्प होता है
बहुत से लोगों को पता नहीं होता कि इन्हें GPU के बिना भी इस्तेमाल किया जा सकता है
AMD के लिए official tool है या नहीं, इस सवाल पर GDB AMD GPU debugging को support करता है
इसके अलावा AMD के UMR और
Radeon GPU Detective,
Radeon Developer Tool Suite जैसे tools भी हैं
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 किया है, लेकिन वह ज़्यादातर खाली पड़ा है, इसलिए उसे काम में लेना चाहता हूँ
पहले Python से जुड़ी समस्याएँ थीं, लेकिन हाल में यह stable हो गया है और img2video तक संभव है
24GB VRAM के हिसाब से यह अब भी सबसे अच्छा value-for-money card लगता है
ROCm में हाल ही में UX improvements के लिए बड़ा बदलाव किया गया है, इसलिए TheRock देखना सुझाऊँगा
devstral:24b model भी काफ़ी तेज़ चला
ComfyUI में ज़्यादातर चीज़ें ठीक चलती थीं, लेकिन कुछ असामान्य workloads में अस्थिरता थी
सुना है कि अब यह stable हो गया है