调试 GPU 代码

可以调试在图形处理单元 (GPU) 上运行的 C++ 代码。 Visual Studio 中的 GPU 调试支持包括争用检测、启动进程并附加到进程以及与调试窗口集成。

支持的平台

以下系统上支持调试:Windows 7、Windows 8、Windows 10、Windows 11、Windows Server 2008 R2、Windows Server 2012 和 Windows Server 2016。 若要在软件仿真器上进行调试,则需要 Windows 8、Windows 10、Windows 11 或 Windows Server 2012、Windows Server 2016。 对于在硬件上进行的调试,您必须为图形卡安装驱动程序。 并非所有硬件供应商都实现所有调试器功能。 有关限制,请参阅供应商文档。

注意

希望在 Visual Studio 中支持 GPU 调试的独立硬件供应商必须创建一个 DLL, 该 DLL 实现 VSD3DDebug 接口并面向其自己的驱动程序。

配置 GPU 调试

调试器无法同时在同一应用执行中的 CPU 代码和 GPU 代码处中断。 默认情况下,调试器在 CPU 代码处中断。 若要调试 GPU 代码,请使用以下两个步骤之一:

  • 在“标准”工具栏上的“调试类型”列表中,选择“仅 GPU” 。

  • 在“解决方案资源管理器”中,在项目的快捷菜单上,选择“属性” 。 在“属性页”对话框中,选择“调试”,然后在“调试器类型”列表中选择“仅 GPU” 。

启动并附加到应用程序

可以使用 Visual Studio 调试命令来启动和停止 GPU 调试。 有关详细信息,请参阅使用调试器浏览代码。 还可以将 GPU 调试器附加到正在运行的进程,但仅在该进程执行 GPU 代码时才能这样做。 有关详细信息,请参阅附加到运行中的进程

“将当前 Tile 运行到光标处”和“运行到光标处”

在 GPU 上进行调试时,可以通过两个选项运行到光标位置。 代码编辑器的快捷菜单上提供了这两个选项的命令。

  1. “运行到光标处”命令可运行应用程序,直到其达到光标位置,然后中断。 这并不表示当前线程运行到光标处;相反,这意味着第一个到达光标点的线程会触发中断。 请参阅使用调试器浏览代码

  2. “将当前 Tile 运行到光标处”命令可运行应用程序,直到当前 Tile 中的所有线程到达光标处,然后中断。

“调试”窗口

通过使用某些调试窗口,您可以检查、标记和冻结 GPU 线程。 有关详细信息,请参见:

数据同步异常

调试器可以在执行期间标识多个数据同步条件。 在检测条件时,调试器会进入中断状态。 有两个选项:“中断”或“继续” 。 通过使用“异常”对话框,可以配置调试器是否检测这些条件以及它将在哪些条件下中断。 有关详细信息,请参阅使用调试器管理异常。 还可以使用“选项”对话框来指定调试器应忽略异常(如果写入的数据不更改数据的值)。 有关更多信息,请参见 General, Debugging, Options Dialog Box

疑难解答

指定加速器

如果代码在 accelerator::direct3d_ref (REF) 加速器上运行,则仅命中 GPU 代码中的断点。 如果未指定代码中的加速器,则自动将 REF 加速器选作项目属性中的“调试加速器类型”。 如果你的代码显式选择加速器,则在调试期间将不会使用 REF 加速器,并且将不会命中断点,除非你的 GPU 硬件具有调试支持。 你可以通过编写代码来对此情况进行补救,以便在调试期间使用 REF 加速器。 有关详细信息,请参阅项目属性以及使用 accelerator 和 accelerator_view 对象C++ 调试配置的项目设置

条件断点

GPU 代码中的条件断点是受支持的,但并不能在设备上计算所有表达式。 当无法在设备上计算某个表达式时,将在调试器中计算该表达式。 调试器的运行速度比设备的运行速度慢得多。

错误:选定的调试加速器类型存在配置问题。

当项目设置和您在其上进行调试的 PC 的配置之间存在不一致之处时,会发生此错误。 有关详细信息,请参阅 C++ 调试配置的项目设置

错误:目标计算机上未安装选定的调试加速器类型的调试驱动程序。

如果在远程 PC 上进行调试,则会发生此错误。 调试器无法确定远程 PC 上是否安装了驱动程序,直到运行时。 可从图形卡的制造商处获得驱动程序。

错误:必须在远程站点上禁用超时检测和恢复 (TDR)。

C++ AMP 计算可能会超过由 Windows 超时检测和恢复进程 (TDR) 设置的默认时间间隔。 在这种情况下,计算将被取消,并且数据将丢失。 有关详细信息,请参阅在 C++ AMP 中处理 TDR