我正在尝试调试一个运行良好、编译时不会出现错误或警告的源代码。问题是,当我用cuda-gdb一步一步地运行它时,根本没有启动cuda内核(我从调试器获得的输出与英伟达cuda-gbb指南中显示的完全不同),但程序仍然可以正常工作,没有任何错误。在任何时候,我都没有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 "UH211345SH203354(H211}350H211u340H211U؉MԋM324H213U330H213]340H213E350H211336H211307350 24377377377H203304([311303UH211345SH203354(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,设备查询检查没有问题。我不知道如何解决这个问题,因为英伟达论坛这些天都在离线!
提前非常感谢。
查看cuda-gdb输出,您似乎在内核启动的主机组件上(即<<<>>>)。CUDA内核的启动是异步的。主机调用准备启动,并将在启动完成之前(在某些情况下,甚至在启动工作开始之前)返回。因此,当您在主机上停止时,启动的工作可能尚未分派到GPU。
进入主机端内核启动调用不会进入设备上的内核启动。相反,尝试在内核内部设置一个断点,让应用程序自由运行。断点可以通过文件:行号(例如break matrixMul1.cu:<line>
)或名称(例如break MatrixMulKernel
)设置。当设备端断点被击中时,cuda-gdb将返回提示,并根据情况将焦点设置在设备上。