Debugging CUDA:使用-deviceemu和gdb进行调试

Debugging CUDA:使用-deviceemu和gdb进行调试,debugging,gdb,cuda,Debugging,Gdb,Cuda,我编写了一个CUDA应用程序,其中包含一些硬编码参数(通过#defines)。一切似乎都正常,所以我尝试了一些其他参数。现在,程序不能正常工作了 所以,我想调试它。我使用-deviceemu-g-O0选项编译应用程序,因为我读到可以使用gdb对其进行调试。在gdb中,我使用breakkernelstart在内核开始处设置断点 然而,gdb在我的CUDA内核的开始处跳转,但是我不能单步通过它,因为它不允许我检查内核中的东西。我认为最好给出gdb的输出: Breakpoint 1, kernelst

我编写了一个CUDA应用程序,其中包含一些硬编码参数(通过
#define
s)。一切似乎都正常,所以我尝试了一些其他参数。现在,程序不能正常工作了

所以,我想调试它。我使用
-deviceemu-g-O0
选项编译应用程序,因为我读到可以使用gdb对其进行调试。在gdb中,我使用
breakkernelstart
在内核开始处设置断点

然而,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
断点1,内核启动(\uuuuCuda\u0=0x100000,\uuuuCuda\u1=0x101000,\uuuuuCuda\u2=0x102000,\uuuuuCuda\u3=0x102100)位于cudatest.cu:287
(gdb)s
__在/tmp/tmpxft\u000004\u00000000-1\u cudatest.cudafe1.stub.c:7处的设备存根
7/tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c:没有这样的文件或目录。
in/tmp/tmpxft_00000;3c4_00000000-1_cudatest.cudafe1.stub.c
(gdb)s
cudaLaunch(条目=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\311\303U\211\345\203\354\074\070\307\004$\340\005\b\350\345\341\377\377\243P!\005\b\307\234P!\004\U\773\USDA\U\773本地运行时包括:cuda/773
(gdb)s
(gdb)s
cudatest处的cudatest(uuuuuuCuda_0=0x100000,uuuCuda_1=0x101000,uuuuuuuuCuda_2=0x102000,uuuuuuuuCuda_3=0x102100)。cu:354
(gdb)s
之后,它跳回我的
main
过程

我知道我的规格很模糊,但有人能猜到问题出在哪里吗?是否可以使用gdb检查内核

  • 使用cuda gdb
  • 编译:
    nvcc-g-g filename.cu
  • 在a.out上调用cuda gdb
  • 您可以像往常一样在内核函数中设置断点
  • 运行这个程序,它应该在内核函数中停止
  • 您甚至可以使用
    cuda-thread
    等命令获取当前线程的详细信息。存在其他命令,如
    cuda block
  • 要在线程之间切换,请说
    cuda线程(x,y,z)
  • 有关更多详细信息,请参阅cuda gdb最新版本的文档。如果您使用的是cuda toolkit的最新版本(即今天的3.2版),请确保您正在查看最新版本的文档(因为选项已发生了很大变化)

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

    希望这有帮助

  • 使用cuda gdb
  • 编译:
    nvcc-g-g filename.cu
  • 在a.out上调用cuda gdb
  • 您可以像往常一样在内核函数中设置断点
  • 运行这个程序,它应该在内核函数中停止
  • 您甚至可以使用
    cuda-thread
    等命令获取当前线程的详细信息。存在其他命令,如
    cuda block
  • 要在线程之间切换,请说
    cuda线程(x,y,z)
  • 有关更多详细信息,请参阅cuda gdb最新版本的文档。如果您使用的是cuda toolkit的最新版本(即今天的3.2版),请确保您正在查看最新版本的文档(因为选项已发生了很大变化)

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

    希望这有帮助。

    使用以下工具编译:

    nvcc-g-g——保持

    为我解决了这个问题。这确保编译期间生成的所有中间文件不会被擦除,以便调试器可以找到它们。

    使用以下方法编译:

    nvcc-g-g——保持


    为我解决了这个问题。这可以确保编译期间生成的所有中间文件不会被删除,以便调试器可以找到它们。

    我认为像gdb这样的调试器不需要“-keep”中的信息。“--keep”只是将程序集和原始源代码放在同一个文件中。我认为像gdb这样的调试器不需要“-keep”中的信息。“--keep”只是将程序集和原始源代码放在同一个文件中。