首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cuda-gdb不会在内核内部的断点停止。

Cuda-gdb不会在内核内部的断点停止。
EN

Stack Overflow用户
提问于 2014-02-12 09:27:22
回答 1查看 2.8K关注 0票数 2

在编译过程中,库达-gdb遵守了我设置的所有断点,然后添加了‘- sm_20’标志。为了避免抛出错误,我不得不添加以下内容:“atomicAdd是未定义的”(如指向here)。下面是我当前编译代码的语句:

代码语言:javascript
复制
nvcc -g -G --maxrregcount=32 Main.cu -o SW_exe (..including header files...) -arch sm_20 

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

代码语言:javascript
复制
(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)。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-14 23:03:32

来自CUDA调试器用户手册第3.3.1节:

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

代码语言:javascript
复制
nvcc -g -G foo.cu -o foo

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

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

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

当断点未命中时,解决办法是在变量1想检查之后立即放置一个printf语句,正如Robert在

pointers (Operation is not valid)

OP在这里选择了一个不同的解决方法,即为不同的体系结构进行编译。实际上,编译器所做的优化可以从一个体系结构变为另一个体系结构。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21723664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档