Cuda-gdb没有停在内核的断点处

时间:2014-02-12 09:27:22

标签: cuda gpgpu cuda-gdb

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) 谢谢!

1 个答案:

答案 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

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

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

当没有命中断点时,解决方法是在变量之后立即发出printf语句,如Robert Crovella所建议的

CUDA debugging with VS - can't examine restrict pointers (Operation is not valid)

OP在这里选择了不同的解决方法,即编译不同的架构。实际上,编译器所做的优化可以从架构变为架构。