0

我正在尝试调试一个运行良好并且在编译时没有给出错误或警告的源代码。问题是当我用 cuda-gdb 一步一步运行它时,根本没有启动任何 CUDA 内核(我从调试器得到的输出与 Nvidia cuda-gdb 指南中显示的完全不同),但是程序仍然可以正常工作,没有任何错误。在任何时候我都没有得到 CUDA 内核、设备或线程。显然,焦点也没有放在任何东西上。我正在使用 CUDA-GDB 的 4.2 版本。

这是我应该启动内核时从调试器得到的:

Breakpoint 1, matrixMulGPU (M=0x609160, N=0x609270, P=0x609490, Width=8)
    at matrixMul1.cu:141
141     MatrixMulKernel<<<dimGrid, dimBlock>>>(Md, Nd, Pd, Width);
(cuda-gdb) step
MatrixMulKernel (__cuda_0=0x210000, __cuda_1=0x210100, __cuda_2=0x210200, 
    __cuda_3=8) at matrixMul1.cu:103
103 __global__ void MatrixMulKernel(float *Md, float *Nd, float *Pd, int Width){
(cuda-gdb) step
__device_stub__Z15MatrixMulKernelPfS_S_i (__par0=0x210000, __par1=0x210100, 
    __par2=0x210200, __par3=8)
    at tmpxft_000016d4_00000000-1_matrixMul1.cudafe1.stub.c:5
5   tmpxft_000016d4_00000000-1_matrixMul1.cudafe1.stub.c: Arquivo ou diretório não encontrado.
    in tmpxft_000016d4_00000000-1_matrixMul1.cudafe1.stub.c
(cuda-gdb) step
cudaLaunch<char> (
    entry=0x4011ea "UH\211\345SH\203\354(H\211}\350H\211u\340H\211U؉MԋM\324H\213U\330H\213]\340H\213E\350H\211\336H\211\307\350\024\377\377\377H\203\304([\311\303UH\211\345SH\203\354(\277Pn@") at cuda_runtime.h:958
958   return cudaLaunch((const char*)entry);
(cuda-gdb) step
959 }
(cuda-gdb) step
MatrixMulKernel (__cuda_0=0x210000, __cuda_1=0x210100, __cuda_2=0x210200, 
    __cuda_3=8) at matrixMul1.cu:121
121 }

我的 CUDA 设备是 GeForce 8400M GS,我对 deviceQuery 检查没有任何问题。我不知道如何解决这个问题,因为这些天 Nvidia 论坛处于离线状态!

提前非常感谢。

4

1 回答 1

1

查看 cuda-gdb 输出,您似乎在内核启动的主机组件上(即 <<< >>>)。CUDA 内核启动是异步的。主机调用准备启动并将在它完成之前返回(或者在某些情况下甚至在启动的工作开始之前)。因此,当您在主机上停止时,已启动的工作可能尚未分派到 GPU。

进入主机端内核启动调用不会进入设备上的内核启动。相反,尝试在内核内部设置一个断点,让应用程序自由运行。断点可以通过 file:linenumber (egbreak matrixMul1.cu:<line>或 name (eg break MatrixMulKernel) 设置。当设备端断点被命中时,cuda-gdb 将返回提示并在适当的时候将焦点设置在设备上。

于 2012-09-11T06:30:19.650 回答