如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?
Posted
技术标签:
【中文标题】如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?【英文标题】:How do I use cuda-gdb with a g++ linked program that uses an nvcc compiled static library? 【发布时间】:2012-11-28 17:50:27 【问题描述】:我正在为一个 g++ 链接项目开发一个 nvcc 编译的静态库。如何在最终的可执行文件上使用 cuda-gdb?我得到的只是“程序正常退出”,没有任何 printf 输出或任何东西。
nvcc 在编译静态库时肯定会被赋予 -g -G 参数。
这是我的命令行缓冲区:
cuda-gdb /home/sean/cuda-workspace/cudasplat/Debug/cudasplat
NVIDIA (R) CUDA Debugger
5.0 release
Portions Copyright (C) 2007-2012 NVIDIA Corporation
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/sean/cuda-workspace/cudasplat/Debug/cudasplat...done.
(cuda-gdb) set args -t a1-31 a2-31 a3-31 a4-31 -L 30 -o tx_coverage -d /var/www/userman/plot-temp/ -db -85 -ngs -dbm -R 20
(cuda-gdb) run
Starting program: /home/sean/cuda-workspace/cudasplat/Debug/cudasplat -t a1-31 a2-31 a3-31 a4-31 -L 30 -o tx_coverage -d /var/www/userman/plot-temp/ -db -85 -ngs -dbm -R 20
[Thread debugging using libthread_db enabled]
Exiting...
Program exited normally.
(cuda-gdb)
这是在没有调试的情况下通常会发生的情况:
/home/sean/cuda-workspace/cudasplat/Debug/cudasplat -t a1-31 a2-31 a3-31 a4-31 -L 30 -o tx_coverage -d /var/www/userman/plot-temp/ -db -85 -ngs -dbm -R 20
--==[ Welcome To CUDASPLAT! HD v1.4.0a ]==--
Loading "51:52:113:114-hd.sdf" into page 1... Done!
Loading "50:51:113:114-hd.sdf" into page 2... Done!
Loading "50:51:114:115-hd.sdf" into page 3... Done!
Loading "51:52:114:115-hd.sdf" into page 4... Done!
copying 444 mb into device memory (3878 mb free)
finished copy
min_north 50, max_north 52, min_west 113, max_west 115
allocated antenna memory
invalid argument in ../cudapath.cu at line 551
【问题讨论】:
您的程序正常退出。您在调试器中发出了 run 命令,因此它一直运行到遇到断点(您没有设置任何断点)或程序终止。我猜你的问题是关于程序输出的?当您在命令行运行时与 cuda-gdb 中的 set args 命令相比,您传递的参数是否相同? (这些 args 中是否有任何重定向输出?)另一种可能性是,在调试情况下,您的程序在输出任何内容之前正在经历终止。也许在 main 设置一个断点,然后单步执行第一个格式化输出,看看会发生什么。 看来它没有使用我给它的参数执行程序。当我在应该根据参数调用的函数上设置断点时,提供的这些断点都没有被命中。 不确定那里发生了什么。当我使用一个需要 2 个参数的简单程序启动 cuda-gdb 并执行set args 10 10
时,我会得到预期的结果,同样,如果我不设置参数,我会打印出预期的错误消息。由于您甚至没有收到 Welcome To CUDAPLAT 消息(大概这是您的代码的早期部分?)也许您可以单步执行而不是设置断点。您可能会更好地了解正在发生的事情。
【参考方案1】:
-
您应该在发出运行命令之前设置断点。
您的应用程序是否执行正确的错误检查?请注意,cuda-gdb 可能会“隐藏”用于渲染操作系统图形界面的 GPU。例如。如果您有单个 GPU 系统并在窗口环境(例如 GTK 或 KDE)中从 cuda-gdb 运行 CUDA 应用程序,您的应用程序可能会失败,因为不会检测到 GPU。
【讨论】:
应用程序是否会因为在窗口管理器中运行而在常规运行时失败? 可能不会。如果像 deviceQuery 这样的工具可以“看到”GPU,那么对于应用程序的普通(非 gdb)运行来说,任何其他程序也应该没有问题。我在运行 Gnome 的 RHEL 6.2 笔记本电脑上运行 cuda-gdb,它似乎在 GUI 中的终端会话中运行良好。然而,在这种单 GPU 场景中,请注意在设备代码中设置断点,它们可能会挂起 GUI。对于这些情况,我使用不同的方法,即使用非 NVIDIA GPU 进行显示(即 X),并将 NVIDIA CUDA GPU 从 X 中排除。 我做了一些挖掘,你是对的,这就是我遇到的问题。看来我要浪费一天的时间才能在旅途中获得第二张视频卡:\ 另一种方法是将机器设置为运行级别 3 并通过 ssh 进入其中,假设您尝试调试的应用程序不使用 X。 @Sean 请注意,还有一个看门狗定时器问题 - 如果您的内核需要很长时间才能完成,如果在用于驱动显示的设备上运行它们可能会过早终止。我不知道确切的超时长度 - 几秒钟。以上是关于如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Windows 中将 nvcc 与 gcc/g++ 集成?