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
首先是内存 hub,gfxhub 和 mmhub。gfxhub 是用于图形、计算和某些芯片上的 sdma 的内存 hub。mmhub 是用于多媒体和某些芯片上的 sdma 的内存 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 页错误的原因。