GPU 调试¶
通用调试选项¶
DebugFS 部分提供了有关许多文件的文档,以帮助调试 GPU 上的问题。
GPUVM 调试¶
为了帮助调试与 GPU 虚拟内存相关的问题,驱动程序支持许多选项模块参数
vm_fault_stop - 如果非 0,则在 GPU 页面错误时停止 GPU 内存控制器。
vm_update_mode - 如果非 0,则使用 CPU 而不是 GPU 来更新 GPU 页表。
解码 GPUVM 页面错误¶
如果在内核日志中看到 GPU 页面错误,您可以对其进行解码以找出应用程序中出现的问题。内核日志中的页面错误可能如下所示
[gfxhub0] no-retry page fault (src_id:0 ring:24 vmid:3 pasid:32777, for process glxinfo pid 2424 thread glxinfo:cs0 pid 2425)
in page starting at address 0x0000800102800000 from IH client 0x1b (UTCL2)
VM_L2_PROTECTION_FAULT_STATUS:0x00301030
Faulty UTCL2 client ID: TCP (0x8)
MORE_FAULTS: 0x0
WALKER_ERROR: 0x0
PERMISSION_FAULTS: 0x3
MAPPING_ERROR: 0x0
RW: 0x0
首先,您有 memory hub,gfxhub 和 mmhub。 gfxhub 是用于某些芯片上的图形、计算和 sdma 的 memory hub。 mmhub 是用于某些芯片上的多媒体和 sdma 的 memory hub。
接下来,您有 vmid 和 pasid。 如果 vmid 为 0,则此错误可能是由内核驱动程序或固件引起的。 如果 vmid 不为 0,则通常是用户应用程序中的错误。 pasid 用于将 vmid 链接到系统进程 ID。 如果进程在发生错误时处于活动状态,则会打印进程信息。
接下来是导致错误的 GPU 虚拟地址。
客户端 ID 指示导致错误的 GPU 块。 一些常见的客户端 ID
CB/DB:图形管道的颜色/深度后端
CPF:命令处理器前端
CPC:命令处理器计算
CPG:命令处理器图形
TCP/SQC/SQG:着色器
SDMA:SDMA 引擎
VCN:视频编码/解码引擎
JPEG:JPEG 引擎
PERMISSION_FAULTS 描述遇到的错误
位 0:PTE 无效
位 1:未设置 PTE 读取位
位 2:未设置 PTE 写入位
位 3:未设置 PTE 执行位
最后,RW 指示访问是读取 (0) 还是写入 (1)。
在上面的示例中,着色器(客户端 ID = TCP)生成了一个到 GPU 虚拟地址 0x0000800102800000 的无效页面(PERMISSION_FAULTS = 0x3)的读取(RW = 0x0)。 然后,用户可以检查他们的着色器代码和资源描述符状态以确定导致 GPU 页面错误的原因。