2010-10-27 193 views
1

我编写了一个CUDA应用程序,其中包含一些硬编码参数(通过#define s)。似乎一切正常,所以我尝试了其他一些参数。现在,该程序无法正常工作了。CUDA:使用-deviceemu和gdb进行调试

所以,我想调试它。我使用-deviceemu -g -O0选项编译应用程序,因为我读过,然后可以使用gdb进行调试。在gdb中,我使用break kernelstart在内核开始处设置了一个断点。

但是,gdb在我的CUDA内核开始时跳转,但我无法一步步完成它,因为它不允许我检查内核中的东西。我认为这是最好的,如果我给GDB的输出:

Breakpoint 1, kernelstart (__cuda_0=0x100000, __cuda_1=0x101000, __cuda_2=0x102000, __cuda_3=0x102100) at cudatest.cu:287 
(gdb) s 
__device_stub__Z12kernelstartPjS_S_S_ (__par0=0x100000, __par1=0x101000, __par2=0x102000, __par3=0x102100) at /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c:7 
7 /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c: No such file or directory. 
    in /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c 
(gdb) s 
cudaLaunch<char> (entry=0x804a98d "U\211\345\203\354\030\213E\024\211D$\f\213E\020\211D$\b\213E\f\211D$\004\213E\b\211\004$\350\r\377\377\377\311\303U\211\345\203\354\070\307\004$\340 \005\b\350\345\341\377\377\243P!\005\b\307\004$x\234\004\b\350\b\001") at /usr/local/cuda/bin/../include/cuda_runtime.h:773 
(gdb) s 
(gdb) s 
cudatest (__cuda_0=0x100000, __cuda_1=0x101000, __cuda_2=0x102000, __cuda_3=0x102100) at cudatest.cu:354 
(gdb) s 

后,这一点,它就跳回到我的main程序。

我知道我的规格比含糊不清,但任何人都可以猜测问题在哪里?是否有可能使用gdb检查内核?

回答

7
  1. 使用CUDA-GDB
  2. 编译:nvcc -g -G filename.cu
  3. 调用CUDA-GDB您的a.out
  4. 你可以设置你的内核函数照常内断点。
  5. 运行该程序,它应该停止在你的内核函数中。
  6. 你甚至可以使用诸如cuda thread之类的命令获得正在执行的当前线程的详细信息。其他命令如cuda block存在。
  7. 要切换线程说cuda thread (x,y,z)

之间欲了解更多详情,请参阅CUDA-GDB的文件的最新版本。如果您使用的是最新版本的cuda工具包(即截至今日的3.2版本),请确保您正在查看最新版本的文档(因为选项已经发生了很大变化)。

并且还要确保从控制台(X11外部)运行cuda-gdb,因为您正在停止GPU进行调试。

希望这会有所帮助。

1

与编译:

NVCC -g -G --keep

固定的这个问题对我来说。这可确保编译过程中生成的所有中间文件都不会被擦除,以便调试器可以找到它们。

+0

我不认为来自“--keep”的信息不需要像gdb这样的调试器。 “--keep”只是将程序集和原始源代码放在同一个文件中。 – codetwiddler 2011-03-07 23:36:53