1

在编译时添加“-arch sm_20”标志之前,Cuda-gdb 遵守了我设置的所有断点。我必须添加它以避免抛出错误:'atomicAdd is undefined'(如此处所指出)。这是我当前编译代码的语句:

nvcc -g -G --maxrregcount=32 Main.cu -o SW_exe (..including header files...) -arch sm_20 

当我在内核中设置断点时,cuda-gdb 在内核的最后一行停止一次,然后程序继续。

(cuda-gdb) b SW_kernel_1.cu:49
Breakpoint 1 at 0x4114a0: file ./SW_kernel_1.cu, line 49.
...
[Launch of CUDA Kernel 5 (diagonalComputation<<<(1024,1,1),(128,1,1)>>>) on Device 0]

Breakpoint 1, diagonalComputation (__cuda_0=15386, __cuda_1=128, __cuda_2=0xf00400000, __cuda_3=0xf00200000, 
__cuda_4=100, __cuda_5=0xf03fa0000, __cuda_6=0xf04004000, __cuda_7=0xf040a0000, __cuda_8=0xf00200200, 
__cuda_9=15258, __cuda_10=5, __cuda_11=-3, __cuda_12=8, __cuda_13=1) at ./SW_kernel_1.cu:183
183     }
(cuda-gdb) c
Continuing.

但正如我所说,如果我删除“atomicAdd()”调用和标志“-arch sm_20”,这虽然会使我的代码不正确,但现在 cuda-gdb 会在我指定的断点处停止。请告诉我这种行为的原因。
我在 Tesla M2070(计算能力 = 2.0)上使用 CUDA 5.5。
谢谢!

4

1 回答 1

3

来自 CUDA DEBUGGER 用户手册,第 3.3.1 节:

NVCC 是 NVIDIA CUDA 编译器驱动程序,提供了一种机制,用于生成 CUDA-GDB 正常工作所需的调试信息。编译应用程序时必须将-g -G选项对传递给 NVCC,以便使用 CUDA-GDB 进行调试;例如,

nvcc -g -G foo.cu -o foo

使用这一行编译 CUDA 应用程序 foo.cu

  1. 强制-O0编译,除了非常有限的死代码消除和寄存器溢出优化。
  2. 使编译器在可执行文件中包含调试信息

这意味着,原则上,即使在调试模式下编译代码,也不会在内核函数中命中断点,因为 CUDA 编译器可以执行一些代码优化,因此反汇编代码无法对应 CUDA 指令。

当断点未命中时,一种解决方法是在printf要检查的变量之后立即放置一条语句,正如 Robert Crovella 在

使用 VS 进行 CUDA 调试 - 无法检查限制指针(操作无效)

OP 在这里选择了不同的解决方法,即针对不同的架构进行编译。事实上,编译器所做的优化可能会因架构而异。

于 2014-02-14T23:03:32.843 回答