在编译过程中,库达-gdb遵守了我设置的所有断点,然后添加了‘- sm_20’标志。为了避免抛出错误,我不得不添加以下内容:“atomicAdd是未定义的”(如指向here)。下面是我当前编译代码的语句:
nvcc -g -G --maxrregcount=32 Main.cu -o SW_exe (..including header files...) -arch sm_20 当我在内核中设置一个断点时,cuda在内核的最后一行停止一次,然后程序继续运行。
(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()‘调用和标志’- sm_20‘,虽然这会使我的代码不正确,但是现在cuda停止在我指定的断点上。请告诉我这种行为的原因。
我正在特斯拉M2070上使用CUDA 5.5 (计算能力= 2.0)。
谢谢!
发布于 2014-02-14 23:03:32
来自CUDA调试器用户手册第3.3.1节:
NVCC是NVIDIA CUDA编译器驱动程序,它提供了生成CUDA-GDB正常工作所需的调试信息的机制。在编译应用程序时,必须将
-g-G选项对传递给NVCC,以便使用CUDA-GDB进行调试;例如,
nvcc -g -G foo.cu -o foo使用这一行编译CUDA应用程序foo.cu
-O0编译,除了非常有限的死代码消除和寄存器溢出优化。这意味着,原则上,即使代码是以调试模式编译的,也不能在内核函数中命中断点,因为CUDA编译器可以执行一些代码优化,因此反汇编的代码不能与CUDA指令相对应。
当断点未命中时,解决办法是在变量1想检查之后立即放置一个printf语句,正如Robert在
pointers (Operation is not valid)
OP在这里选择了一个不同的解决方法,即为不同的体系结构进行编译。实际上,编译器所做的优化可以从一个体系结构变为另一个体系结构。
https://stackoverflow.com/questions/21723664
复制相似问题