- 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 के रूप में विकसित होने की संभावना मौजूद है
अभी कोई टिप्पणी नहीं है.