cuda代码在释放模式下产生不正确的结果

cuda代码在释放模式下产生不正确的结果,cuda,Cuda,我的CUDA代码在调试模式下生成正确的结果。但是,在发布模式下,相同的代码会产生垃圾结果。线程之间的同步在调试模式和发布模式之间的行为会有所不同吗?我认为,您遇到了竞争条件问题。您可以重新组织代码,并在需要时添加同步。在调试模式下,您的线程通常是按顺序执行的,您不会遇到这个问题。使用-O0生成的代码会导致优化程度较低的代码,并且会显著增加全局和本地内存访问,这可能会隐藏争用条件。如果您认为共享内存中可能存在竞争条件,可以尝试使用新的CUDA 5.0预览内存检查器,它支持某些形式的竞争条件检测。您

我的CUDA代码在调试模式下生成正确的结果。但是,在发布模式下,相同的代码会产生垃圾结果。线程之间的同步在调试模式和发布模式之间的行为会有所不同吗?

我认为,您遇到了竞争条件问题。您可以重新组织代码,并在需要时添加同步。在调试模式下,您的线程通常是按顺序执行的,您不会遇到这个问题。

使用-O0生成的代码会导致优化程度较低的代码,并且会显著增加全局和本地内存访问,这可能会隐藏争用条件。如果您认为共享内存中可能存在竞争条件,可以尝试使用新的CUDA 5.0预览内存检查器,它支持某些形式的竞争条件检测。您最好的选择是查找两个线程之间共享内存的任何位置,并确定是否缺少同步线程的线程围栏。

“在调试模式下,您的线程通常以某种顺序执行,您不会遇到此问题。”。你能指出哪里有文档记录吗?@talonmies CUDA调试没有很好的文档记录。这是我们的猜测。我认为这是因为生成了许多额外的调试代码。你有任何相反的信息吗?我有,而且我相信断言硬件执行或调度模型会根据编译器绘图的不同而有所变化是毫无意义的。调试构建所做的是消除一些优化,并将共享内存和寄存器溢出到本地内存,以便主机可以在执行期间检查它们的状态。根据体系结构的不同,这会极大地改变行为,既可以删除某些硬件内存保护,也可以使用不同的指令(和JIT优化)对块本地内存进行操作。@talonmies:我对这些发现感到兴奋。我调试了我的代码并做出了这个猜测。我认为,隐藏竞争条件的另一个可能原因是,在调试代码中,对全局内存的每次访问都经过双重检查,以依赖于绑定条件,等等。实际上,这导致每个变量都变得不稳定,正如您所说的,共享变量实际上可以位于全局空间中。这有助于隐藏种族状况。