我想知道除了简单地通过 Visual Studio 或操作系统的命令行执行二进制文件之外,是什么设置了“使用 Nsight 进行调试”选项。
我问的原因是因为如果我通过“使用 Nsight 调试”运行我的程序可以正常工作,但是在使用 Visual Studio 的启动按钮启动它(或只是启动可执行文件)时,在驱动程序崩溃后,我会得到一些未指定的 cudaErrors 和一些 cudaMemcpys ,这使我相信 Nsight 必须具有程序正确运行所必需的某种特定启动参数。
我想知道除了简单地通过 Visual Studio 或操作系统的命令行执行二进制文件之外,是什么设置了“使用 Nsight 进行调试”选项。
我问的原因是因为如果我通过“使用 Nsight 调试”运行我的程序可以正常工作,但是在使用 Visual Studio 的启动按钮启动它(或只是启动可执行文件)时,在驱动程序崩溃后,我会得到一些未指定的 cudaErrors 和一些 cudaMemcpys ,这使我相信 Nsight 必须具有程序正确运行所必需的某种特定启动参数。
当您的应用程序由于内核执行时间过长而遇到Windows TDR 事件时,会发生驱动程序崩溃和 API 错误。您可以通过修改系统注册表或将 Quadro 或 Tesla GPU 置于TCC 模式或减少内核的运行时间来解决此问题。
当您使用 nsight 进行调试时,您的内核执行可能会由于各种原因(单步、断点和其他原因)而停止,然后重新启动,具体取决于您在调试会话中所做的事情。内核执行的停止允许在没有 TDR 事件的情况下满足 windows 看门狗。
CUDA nSight 调试器允许您逐行调试 CUDA 内核,而使用标准 Visual Studio 调试器则无法做到这一点。
据推测,nSight 执行了一些代码注入以使其能够检测内核的运行时间,这也可能取决于您的设置,当使用 nSight 进行调试时,您的内核可能不会在 GPU 上执行。这些可能是调试器之间来来往往的错误的原因。我知道当我使用它们时,我也有类似的不一致。
如果您通过 nSight 分析器运行程序,它应该能够为您清楚地记录 memCpy 错误。