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

UMR

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