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 页错误的原因。

UMR

umr 是一款通用的 GPU 调试和诊断工具。有关其功能的更多信息,请参阅 umr 文档