5

我正在运行cuda-memcheck调试我的代码,输出如下

========= Program hit cudaErrorCudartUnloading (error 29) due to "driver shutting down" on CUDA API call to cudaFree. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so.1 [0x2e40d3]
=========     Host Frame:./nmt [0x53526]
=========     Host Frame:./nmt [0xfbd9]
terminate called after throwing an instance of '=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 [0x3c259]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 [0x3c2a5]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xfc) [0x21ecc]
thrust::system::system_error'
=========     Host Frame:./nmt [0x530a]
=========
  what():  driver shutting down
========= Error: process didn't terminate successfully
========= Internal error (20)
========= No CUDA-MEMCHECK results found

是否可以从Host Frame:./nmt [0x53526]代码中的中断行中看出?如果是这样,我该怎么做?

4

2 回答 2

2

正如@talonmies 所指出的(我怀疑他不会介意我发布 CW 答案),该cuda-memcheck工具提供了额外的堆栈回溯功能,可以通过--show-backtrace添加到命令行的开关来启用该功能。

回溯可能包括主机和设备功能(即主机和设备回溯。)

如果应用程序还使用主机调试符号信息进行了编译(例如-g在 linux 上),则cuda-memcheck可以在主机回溯中显示主机函数的函数名称。

文档中提供了其他使用信息。

于 2015-07-03T01:15:03.907 回答
0

对我来说cuda-memcheck,使用不同的子工具,例如memcheck, racecheckinitcheck并且synccheck经常产生没有行号甚至没有提到的主机功能的主机回溯。在互联网上搜索只显示这个问题,但我已经传递-g甚至传递-g3给主机编译器,并且在文档中说--show-backtrace标记为默认情况下(明确传递它没有帮助)。所以我对回溯执行以下操作:cuda-memcheckyes

考虑您的编译程序被调用a.out,并且您在主机回溯中得到一行,例如Host Frame:./nmt [0x530a]. 然后打开你的程序cuda-gdb

cuda-gdb a.out

然后,让您的程序加载所有共享库(至少到main()函数中的某个点)。cuda-gdb在提示符中输入以下内容:

b main
r

然后,使用以下命令查找函数名称:

info symbol 0x530a

或使用以下命令查找行号:

info line *0x530a

为您打印0x530a的地址在哪里。cuda-memcheck我猜 NVIDIA 可以很容易地自动执行此操作(以及在打印它们的地方解构主机函数名称)。

于 2021-10-14T18:46:46.190 回答