Nvidia Visual Studio Nsight CPU和GPU调试

4

NVIDIA Nsight Visual Studio版似乎无法同时调试CPU(主机代码)和GPU(CUDA代码)。使用Nsight Eclipse版(或cuda-gdb)就很简单了,例如,您可以从主机执行中“步进”到CUDA内核。如何在Visual Studio中实现相同的功能?

1个回答

8
Nsight手册中得到以下信息:

使用单独的 Visual Studio 实例来调试目标应用程序的主机部分。如果您希望在 CUDA 调试器附加的情况下调试 CUDA 应用程序的主机部分,则必须使用不同的 Visual Studio 实例进行附加。将同一实例的 Visual Studio 附加到目标应用程序的主机部分和设备部分进行调试会导致调试器冲突。结果是,本地调试器的操作将阻止目标应用程序和 CUDA 调试器,从而导致其挂起。

因此,要调试CUDA应用程序,请按以下步骤操作:
  1. 打开Visual Studio(VS实例#1),在CUDA内核中设置断点,然后单击“开始CUDA调试”。这将启动应用程序并在您设置断点的位置停止执行。
  2. 打开另一个Visual Studio实例(VS实例#2)(由于某种原因需要以管理员身份运行),并附加到步骤1中启动的进程。
  3. 在VS实例#2中浏览要进行CPU调试的文件并设置断点。
  4. 在VS实例#1中继续执行(应跳出当前CUDA内核)。此时,您在VS实例#2中设置的CPU断点将被命中。

额外奖励:远程调试CUDA应用程序的步骤。

  1. 在目标计算机上以管理员身份运行msvsmon.exe(远程调试器)。它可以在C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Remote Debugger\x64中找到。
  2. 在主机计算机(希望控制调试的计算机)上,打开VS,并确保Nsight调试器指向远程计算机(Nsight用户属性 > 启动 > 连接名称)。注意:这需要在目标计算机上运行Nvidia Nsight监视器。
  3. 执行前面(非远程调试)部分的步骤1和2。在步骤2中,您需要指向远程计算机进行CPU调试(调试>附加到进程>限定符应设置为目标计算机的名称或IP)。
  4. 非远程调试的步骤3和4也适用于此处。

注意:看起来VS的远程CPU调试不如其本地CPU调试功能强大。例如,当您将鼠标悬停在CPU变量上时,在进行本地调试时值会像您期望的那样显示,但在进行远程调试时则不会。

仍未解答: 在触发CUDA断点之前,是否可以开始调试主机代码?似乎只能在第一个CUDA内核后才能调试主机代码,这是一个很大的限制。如果您希望在第一个CUDA内核之前调试主机代码怎么办?


作为“仍未回答”的解决方法,您可以在主函数中的第一条语句中调用可调试的虚拟内核,将断点放置在内核中,然后附加#2到正在运行的进程。然后您可以释放#1中的断点,以便在#2中的CPU代码的任何行上触发断点。通过对某些调试标志进行ifdef,您可以轻松地根据上下文过滤掉此虚拟内核调用以供发布版本或您根据需要选择的其他内容。 - Timmos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接