Visual studio 2008 为什么cuda程序在运行期间而不是调试期间崩溃

Visual studio 2008 为什么cuda程序在运行期间而不是调试期间崩溃,visual-studio-2008,cuda,Visual Studio 2008,Cuda,我正在使用VisualStudio2008在Windows上工作。 我的Cuda程序在运行期间崩溃,即屏幕变黑,我想操作系统会杀死内核,因为看门狗超时导致执行时间过长(大约10秒)。然而,我不明白为什么同一个程序没有崩溃,或者为什么在调试内核时操作系统没有杀掉?在调试期间,内核仍然需要大约10秒(或更长)的时间来执行 谢谢这些问题通常发生在比赛条件出现问题时。由于调试运行较慢,因此不会出现错误,但当调试关闭时,指令会以不同的顺序处理,程序会崩溃。通常,从调试初始化值到零,这可能会发生,而rele

我正在使用VisualStudio2008在Windows上工作。 我的Cuda程序在运行期间崩溃,即屏幕变黑,我想操作系统会杀死内核,因为看门狗超时导致执行时间过长(大约10秒)。然而,我不明白为什么同一个程序没有崩溃,或者为什么在调试内核时操作系统没有杀掉?在调试期间,内核仍然需要大约10秒(或更长)的时间来执行


谢谢

这些问题通常发生在比赛条件出现问题时。由于调试运行较慢,因此不会出现错误,但当调试关闭时,指令会以不同的顺序处理,程序会崩溃。

通常,从调试初始化值到零,这可能会发生,而release不会初始化值。首先,我要确保所有内容都已初始化。另一张海报中提到的种族状况也可能发生。您可能还希望尝试在发布版本中禁用优化。编译器偶尔(但不是经常)会执行破坏代码的不安全优化。请记住,通常如果您认为编译器有缺陷,那么您就错了,特别是对于没有几年经验的人

在我的例子中,当我通过NSight CUDA调试器(Visual Studio 2012)执行程序时,它执行得很好。但是,如果我在NSight之外运行它,或者使用Visual Studio内部调试器,或者单独运行,调用
cudaGLMapBufferObject(void**devPtr,GLuint bufObj)
将失败,返回未知错误的
cuda_状态
enum,如果我在该错误之后没有退出,其他调用将失败,并出现相同的错误


这是因为我忘记在使用动态大小共享内存的内核中传递第三个参数(定义运行时大小的共享内存的大小)。

以防万一,它会帮助其他人


我也遇到了同样的问题(但在VS 2013和cuda 7.5上工作),当我关闭属性的cuda C/C++->设备部分中的生成GPU调试信息和生成行号信息时,我解决了这个问题。

内核中没有任何竞争条件,因为我只使用1个线程测试它。即使只有一个线程运行也会导致屏幕变黑,所以我想这不是因为比赛条件,而是看门狗超时。我同意约瑟夫的观点。如果可能的话,你应该发布你的代码。如果您的代码中存在争用条件、超出限制的内存访问,那么Cuda程序执行在visual studio中总是会显示这种行为。调试器初始化为零的值是什么?我的评论不是针对Cuda的,但通常在编程时,当调试和发布不同时,初始化和不初始化是需要注意的。实际上,我刚刚检查过,在调试中,NVCC似乎没有将值初始化为任何值。即使NVCC没有给出初始化,释放和调试也可能在内存中有不同的值,这将导致不确定性行为。另外,由另一个编译器(CL或GCC)复制到GPU的值可能受到初始化的影响。为了回答您的问题,编译器通常会初始化为零,但并不总是,这可能取决于数据类型。此外,如果您正在读取未分配的内存,则可能会遇到调试程序/调试堆设置的特殊值,如0xDEADBEEF。