Cuda-gdb遵循我设置的所有断点,然后在编译时添加'-arch sm_20'标志。我必须添加它以避免抛出错误:'atomicAdd is undefined'(如指向here)。这是我编译代码的当前语句:
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在我指定的断点处停止。请告诉我这种行为的原因。
我在特斯拉M2070上使用CUDA 5.5(计算能力= 2.0)
谢谢!
答案 0 :(得分:3)
来自CUDA DEBUGGER用户手册,第3.3.1节:
NVID,NVIDIA CUDA编译器驱动程序,提供了一种生成机制的机制 调试CUDA-GDB正常工作所需的信息。
-g
-G
选项 编译应用程序时,必须将对传递给NVCC才能进行调试 CUDA-GDB;例如,
nvcc -g -G foo.cu -o foo
使用此行编译CUDA应用程序foo.cu
- 强制
-O0
编译,但非常有限的死码消除除外 和寄存器溢出优化。- 使编译器在可执行文件中包含调试信息
醇>
这意味着,原则上,即使代码在调试模式下编译,也无法在内核函数中遇到断点,因为CUDA编译器可以执行一些代码优化,因此反汇编的代码无法与CUDA指令相对应。
当没有命中断点时,解决方法是在变量之后立即发出printf
语句,如Robert Crovella所建议的
CUDA debugging with VS - can't examine restrict pointers (Operation is not valid)
OP在这里选择了不同的解决方法,即编译不同的架构。实际上,编译器所做的优化可以从架构变为架构。