您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center 汽车系统工程   模型库
    学习助手
会员   
   
知识图谱、本体论、RAG与大模型
8月29-30日 北京+线上
企业架构方法与实践
8月27-28日 深圳+线上
AI智能体开发技术实践
9月17-18日 厦门+线上
     
   
 订阅
CUDA 调试器入门(NVIDIA Nsight Visual Studio Code Edition)
 
作/译者:听AI的话
  25   次浏览      1 次
 2026-8-27
 
编辑推荐:
本文主要介绍了如何用 VSCode 里的 NVIDIA Nsight Visual Studio Code Edition 插件,把命令行 cuda-gdb 封装成图形化界面,对 CUDA 程序(以 matrixMul 为例)做 CPU/GPU 代码联调;并顺带给出手动补 launch.json/tasks.json、sleep(100) 配合 attach 模式、以及 -g -G 编译等落地踩坑步骤。希望对你的学习有帮助。
本文来自于知乎,由火龙果软件Alice编辑推荐。

CUDA 调试器是什么?

这里其实指的是NVIDIA Nsight Visual Studio Code Edition 这个插件,我理解这个插件可以认为是CUDA-GDB的可视化界面版本,封装了命令行操作到vscode的插件的界面操作。

实验手册

参考官方文档Getting Started with the CUDA Debugger :: NVIDIA Nsight VSCE Documentation

实验环境

  • Ubuntu-22.04(为了避免麻烦,可以用root账户)
  • GPU硬件:A100 40G(需要特定版本往后的GPU驱动)
  • GPU驱动版本:11.07(对应特定的GPU架构,这个按道理越高越好,因为是向前兼容的)
  • CUDA版本(nvcc版本):11.04(这个要小于GPU驱动版本,因为你软件版本高了,需要的API硬件驱动不支持没用)
    • nvcc也不能生成过高版本的可执行文件,需要低于GPU驱动版本

1.演练:启动和调试 CUDA 应用程序

实验代码

git clone https://openi.pcl.ac.cn/eatcosmos/Getting-Started-with-the-CUDA-Debugger_1.git

1.1.打开示例项目并设置断点

1.2.创建启动配置 launch.json

vscode无法自动生成launch.json,就手动吧

1.3.构建示例并启动调试器tasks.json

vscode不知道什么原因无法自动生成tasks.json,不过没事,可以手动生成的。

启动调试

调试是成功,可以可视化单步调试了。

2.演练:使用 Attach 调试正在运行的 CUDA 应用程序

在本演练中,我们将附加并调试正在运行的基于 CUDA 的应用程序。与上一个演练一样,我们将使用矩阵乘法作为我们的应用程序。 CUDA 工具包 CUDA 示例和 GitHub 上的 NVIDIA/cuda-samples 存储库包含此示例应用程序。

实验代码

git clone https://openi.pcl.ac.cn/eatcosmos/Getting-Started-with-the-CUDA-Debugger_2.git

2.1.打开示例项目,进行少量编辑并设置断点

在 Visual Studio Code 中,打开 CUDA 示例中名为“matrixMul”的目录。

该文件包含 CPU(即 matrixMultiply() )和 GPU(即 matrixMultiplyCUDA() ,任何使用 global device 关键字指定的函数的代码)。

在 main() 入口点的第一个 printf 之后添加 sleep(100); 。这将有效地暂停程序,以便我们可以附加到正在运行的进程。调试器用attach形式捕获进程,比如在程序运行之前attach,否则断点就跳过了。参考 Debug MPI program with Visual Studio Code

#include <unistd.h>
sleep(100);
{
    int i=0;
    while (0 == i) {
        sleep(5);
    }
}

注意

  • sleep(100); // 需要分号结尾
  • sleep()函数需要调用标准库。
  • #include<windows.h> // for windows
  • #include<unistd.h> // for linux

然后我们设置一些断点,就像启动演练中一样。首先,在 GPU 代码matrixMulCUDA()中。接下来是在CPU代码matrixMultiply()中设置一些断点。

2.2.创建启动配置以附加到正在运行的进程

为了调试我们的应用程序,我们必须首先创建一个启动配置。要创建 launch.json ,请先转到 Run and Debug 选项卡,然后单击 create a launch.json file 。选择 CUDA C++ (CUDA-GDB) 作为环境(这个其实是反应在launch.json文件里的)。

2.3.构建示例

为了构建我们的应用程序,我们必须首先将构建系统与任务集成。转到命令面板并执行 Tasks: Configure Default Build Task 命令。实际上是手工创建 tasks.json,然后把东西拷贝进去的。

配置构建任务tasks.json,注意要设置工作目录cwd以便找到Makefile文件

运行构建任务

2.4.启动应用程序

在shell命令行里里面启动cu可执行文件,通过在终端上运行matrixMul文件夹中的 ./matrixMul & 在后台启动matrixMul。

bin/x86_64/linux/debug/matrixMul

 

2.5.启动调试器并附加到正在运行的应用程序

必须在 sleep(100) 到期之前,启动调试器以附加到程序,否则程序执行完了,调试器就捕获不到运行过程状态了。

要开始调试,请转到 Run and Debug 选项卡并单击 Start Debugging 按钮,或者只需按 F5 。将出现一个进程选择器。选择 matrixMul 开始调试会话。

ptrace_scope权限问题

echo 0| sudo tee /proc/sys/kernel/yama/ptrace_scope

3.演练:使用 cuda-gdbserver 启动和调试远程应用程序

远程的就没必要搞了,因为一般开发都能直接访问主机吧。

报错

fatal error: helper_functions.h: No such file or directory

sgemm.cu:6:10: fatal error: helper_functions.h: No such file or directory · Issue #2 · PacktPublishing/Learn-CUDA-Programming

nvcc fatal : Unsupported gpu architecture 'compute_89'

error: attribute "malloc" does not take arguments

  • attribute “__malloc__“ does not take arguments 报错_attribute "__malloc__" does not take arguments-CSDN博客
    • CUDA 11.5 示例抛出多个...错误:属性“__malloc__”不接受参数 - CUDA / CUDA NVCC 编译器 - NVIDIA 开发者论坛 --- CUDA 11.5 samples throw multiple ... error: attribute "__malloc__" does not take arguments - CUDA / CUDA NVCC Compiler - NVIDIA Developer Forums 猜测是因为,高版本的GCC的一些函数接口变了,而源码还用的老版本的,所以要用老版本的编译器,我怀疑这些接口是共存的,应该用老的GCC做。
  • apt-get install gcc-10 -y && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 20
  • apt-get install g++-10 -y && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 20

问题

launch.json里面的 "request": "launch"

在 launch.json 配置文件中,"request": "launch" 指定了调试会话的类型。这个配置项告诉VSCode调试器应该如何启动被调试的程序。具体来说,"launch" 请求类型意味着调试器将会启动一个新的进程,并且附加到这个进程上进行调试。

从操作系统的原理层面来解释,这个过程涉及以下几个步骤:

  1. 进程创建:当VSCode接收到 "request": "launch" 配置时,它会通过调用操作系统提供的接口来创建一个新的进程。这个接口可能是 fork()(在类Unix系统中)或 CreateProcess()(在Windows系统中)。
  2. 程序执行:新创建的进程会开始执行指定的程序(在 launch.json 中通过 "program" 指定)。这个程序可能是一个可执行文件,或者是一个脚本,或者其他任何可以由操作系统执行的东西。
  3. 调试器附加:一旦新进程开始执行,VSCode中的调试器就会附加到这个进程上。这意味着调试器会监听这个进程的执行,能够查看和修改进程的状态,包括内存、寄存器、调用栈等。
  4. 调试会话:在调试器附加到进程之后,你可以开始单步执行代码、设置断点、查看变量值等调试活动。调试器和被调试的进程之间通过某种形式的通信(比如远程调试协议)来交换信息。
  5. 进程终止:当调试会话结束时,被调试的进程可以正常或异常终止。如果进程正常结束,它将释放所有资源并退出。如果调试器强制终止进程,它也会释放资源,但可能会留下未完成的工作。

总的来说,"request": "launch" 配置项是告诉VSCode调试器去启动一个新的进程,并为这个进程提供调试功能。这是最常见的调试场景,适用于大多数需要调试的应用程序。与之相对的是 "request": "attach",它用于将调试器附加到一个已经运行的进程上,而不是创建一个新进程。

cuda-gdb 和 NVIDIA Nsight 都是 NVIDIA 提供的调试工具,用于开发和优化 CUDA 应用程序。尽管它们都可以用于调试 CUDA 程序,但它们的功能和用途有所不同。

  1. cuda-gdb:
  • cuda-gdb 是 GNU Debugger (GDB) 的一个扩展,它允许开发者调试 CUDA 程序。
  • 它提供了对 CUDA 线程和内核的控制,允许开发者设置断点、单步执行、查看变量等。
  • cuda-gdb 可以与 CUDA 运行时和 CUDA 驱动程序紧密集成,提供了对 CUDA 程序执行的深入视图。

  1. NVIDIA Nsight:
  • NVIDIA Nsight 是一个集成开发环境 (IDE) 和一系列性能分析工具,旨在帮助开发者优化 GPU 加速应用程序。
  • Nsight 提供了多种工具,包括 Nsight Systems、Nsight Compute、Nsight Graphics 等,用于分析应用程序的性能瓶颈、内存使用情况、API 调用追踪等。
  • Nsight 工具套件支持跨 CPU 和 GPU 的性能分析,以及对应用程序的详细性能报告。

cuda-gdb 和 Nsight 之间的关系可以概括为:

  • 互补性: 两者可以互补使用,cuda-gdb 更侧重于代码级别的调试,而 Nsight 更侧重于性能分析和优化。
  • 集成: 在某些情况下,Nsight IDE 可以集成 cuda-gdb 作为其后端调试器,提供统一的调试和分析体验。
  • 目标: 两者都旨在提高 CUDA 程序的开发效率和性能,但它们关注的方面不同。

在选择使用哪个工具时,开发者应根据自己的需求来决定。如果主要关注代码调试和错误查找,cuda-gdb 可能是更合适的选择。如果关注的是性能优化和资源使用情况,Nsight 工具套件可能更有帮助。在实际开发中,开发者往往会根据需要在这两个工具之间切换使用。

NVIDIA Nsight Systems 和 Nsight Compute 是 NVIDIA 提供的两种不同的性能分析工具,它们针对不同的性能分析需求和场景。以下是两者的主要区别:

NVIDIA Nsight Systems (nsys):

  1. Nsight Systems 是一个系统分析工具,专注于对应用程序的整体性能进行分析,包括 CPU 和 GPU 的性能。
  2. 它提供了低开销的性能分析会话,通常包括采样和跟踪技术。
  3. Nsight Systems 可以收集应用程序的执行时间线、调用栈回溯、硬件计数器等数据。
  4. 它可以分析多进程、多核的 CPU 性能,以及 CUDA 运行时和驱动程序 API 调用。
  5. Nsight Systems 支持跨平台的性能分析,包括 x86_64、ARM、PowerPC 等架构。
  6. 它适用于分析应用程序的整体性能,识别系统瓶颈,如 CPU 利用率、内存访问模式等。

NVIDIA Nsight Compute:

  1. Nsight Compute 是一个交互式性能分析和优化工具,专门针对 CUDA 和 OptiX 应用程序。
  2. 它提供了详细的性能指标、API 调试、引导式分析、内存工作负载可视化、源代码关联和 CUDA 图探索等功能。
  3. Nsight Compute 专注于 GPU 内核的性能分析,包括 roofline 分析、occupancy、内存访问模式等。
  4. 它允许开发者深入到 CUDA 内核层面,进行性能瓶颈的识别和优化。
  5. Nsight Compute 支持在 x86_64 Windows、Linux、PowerPC 和 Arm Server Based System Architecture 平台上进行本地或远程分析。

总结来说,Nsight Systems 更侧重于系统级别的性能分析,包括 CPU 和 GPU 的整体性能,而 Nsight Compute 则专注于 CUDA 应用程序的深入性能分析,特别是 GPU 内核的性能优化。开发者可以根据分析目标和需求选择适合的工具。

CUDA QNX 是指在 QNX 操作系统上使用 CUDA 技术进行并行计算开发的一套解决方案。QNX 是由 BlackBerry 公司开发的一个商业 Unix-like 操作系统,广泛应用于嵌入式系统和汽车行业中,特别是在高级驾驶辅助系统(ADAS)和自动驾驶汽车的软件平台中。

在 QNX 系统上使用 CUDA 技术意味着开发者可以利用 NVIDIA 的 GPU 加速器来提高应用程序的性能。为了在 QNX 上使用 CUDA,NVIDIA 提供了专门的 CUDA 库和工具,这些库和工具被设计为与 QNX 兼容,并且可以针对 QNX 目标架构进行交叉编译。

根据搜索结果,NVIDIA 为 QNX 提供了 CUDA 交叉编译库,这使得开发者能够在不同的主机系统上为 QNX 目标平台编译 CUDA 应用程序。例如,开发者可以在 x86 架构的 Linux 主机上安装 CUDA 交叉编译库,然后为 QNX 的 ARM 或其他目标架构编译 CUDA 应用程序。

这种交叉编译的能力对于开发跨平台应用程序非常重要,特别是在需要在多种硬件和操作系统上运行的嵌入式系统和汽车行业中。通过 CUDA QNX,开发者可以利用 NVIDIA GPU 的强大计算能力,为 QNX 系统上的图形渲染、机器学习和其他高性能计算任务创建高效的并行计算解决方案。

   
25   次浏览       1 次
相关文章

基于图卷积网络的图深度学习
自动驾驶中的3D目标检测
工业机器人控制系统架构介绍
项目实战:如何构建知识图谱
 
相关文档

5G人工智能物联网的典型应用
深度学习在自动驾驶中的应用
图神经网络在交叉学科领域的应用研究
无人机系统原理
相关课程

人工智能、机器学习&TensorFlow
机器人软件开发技术
人工智能,机器学习和深度学习
图像处理算法方法与实践

最新活动计划
知识图谱.本体论.RAG大模型 8-29[在线]
企业架构方法与实践 8-27[深圳]
FDE(前沿部署工程师)实践指南 9-8[北京]
AI智能体开发技术实践 9-17[厦门]
UAF架构体系与实践 9-22[北京]
MBSE(基于模型的系统工程)9-29[北京]
 
 
最新文章
AIGC技术与应用全解析
详解知识图谱的构建全流程
大模型升级与设计之道
自动驾驶和辅助驾驶系统
ROS机器人操作系统底层原理
最新课程
人工智能,机器学习和深度学习
人工智能与机器学习应用实战
人工智能-图像处理和识别
人工智能、机器学习& TensorFlow+Keras框架实践
人工智能+Python+大数据
成功案例
某综合性科研机构 人工智能与机器学习
某银行 人工智能+Python+大数据
北京 人工智能、机器学习& TensorFlow
某领先数字地图提供商 Python数据分析
中国移动 人工智能、机器学习和深度学习