【问题标题】:CUDA Runtime difference between release mode and debug mode发布模式和调试模式之间的CUDA运行时差异
【发布时间】:2015-07-28 03:26:47
【问题描述】:

我正在运行 Visual Studio 2013。 我正在运行 CUDA 7.0.28

我可以通过选中或取消选中 CUDA 选项来切换运行时差异:

生成 GPU 调试信息。

我的设备内核使用 >> 运行,即使在那时也会发生错误。

我的问题是:

  1. 为什么会在发布和调试模式下给我不同的结果?
  2. 我应该寻找什么样的东西来尝试找出发生这种情况的原因。
  3. 有没有办法在内核函数中设置断点?事实并非如此。除了制作 printf 语句之外,我还可以使用哪些其他方法来追踪问题?

谢谢。

【问题讨论】:

  • 通常在调试模式下运行会导致一些未指定的行为不会终止程序。例如,我在调试模式下默认将内存缓冲区初始化为零,而我没有明确要求这样做。或者有时对共享内存缓冲区的超出范围访问会导致内核没有终止。我建议使用this post 中解释的方法来捕获错误。您还应该能够在安装了 Nsight for Visual Studio 的情况下设置断点。

标签: visual-studio-2013 cuda nvcc


【解决方案1】:

为什么它会在发布和调试模式下给我不同的结果?

在后台,从 CUDA C/C++ 源代码生成的机器代码在调试模式下看起来会非常不同。差异列表太长,无法在此处涵盖,但主要是通过在调试模式下所有编译器优化都已关闭来总结。这可能会导致竞争条件,例如,在调试中很明显但在发布时不明显,反之亦然。

我应该寻找什么样的东西来尝试找出发生这种情况的原因。

我将从最简单的工具开始。首先单独使用 cuda-memcheck 来确认内核正在运行而不会产生基本错误。如果 cuda-memcheck 报告您的内核出现故障,请按照方法 here 将故障隔离到一行源代码。修复 cuda-memcheck 以这种方式报告的任何错误后,使用 cuda-memcheck subtool options 包括 racecheck、synccheck 和 initcheck,查看是否有任何这些问题。

有没有办法在内核函数中断点?

是的,在 windows 和 linux 上都有可用的调试器。在 Windows 上,调试器集成到 Visual Studio 中。有 documentation available、演练,甚至 youtube 视频演示如何执行各种操作,例如设置断点。但是,在使用 cuda-memcheck 之前,我不会走这条路。

【讨论】:

  • 很遗憾,memcheck 没有发现任何错误。它无法运行同步检查或竞速检查,可能是因为 >> 声明。
猜你喜欢
  • 2013-08-06
  • 2010-10-09
  • 2014-12-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多