【无标题】

CUDA 调试器入门

实验手册

参考官方文档 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.打开示例项目并设置断点

image-20240321222636710

1.2.创建启动配置 launch.json

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

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

image-20240322214705211

启动调试(F5)

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

image-20240322223348474

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

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

实验代码

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

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

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

在 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);
    }
}

image-20240322232830769

注意

sleep(100); // 需要分号结尾

sleep()函数需要调用标准库。

#include<windows.h> // for windows

#include<unistd.h> // for linux

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

image-20240322233224955

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

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

image-20240322233826939

2.3.构建示例

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

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

image-20240322234049832

运行构建任务

image-20240322235242739

2.4.启动应用程序

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

bin/x86_64/linux/debug/matrixMul

image-20240322235750085

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

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

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

image-20240323000814097

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’

image-20240322213358717

error: attribute “malloc” does not take arguments

问题

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和nsight什么关系?

找到了第 1 篇资料:GPU性能分析利器Nsight System(一) - 知乎

找到了第 2 篇资料:GPU性能分析利器Nsight System(一) - 知乎

找到了第 3 篇资料:NVIDIA Nsight 系统优化 CUDA 内存传输 - NVIDIA 技术博客

找到了第 4 篇资料:CUDA进阶第一篇:CUDA调试 - CUDA - NVIDIA 官方 …

一共找到 4 篇资料,正在阅读…

找到了 4 篇资料作为参考:

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

  1. cuda-gdb:
    • cuda-gdb 是 GNU Debugger (GDB) 的一个扩展,它允许开发者调试 CUDA 程序。
    • 它提供了对 CUDA 线程和内核的控制,允许开发者设置断点、单步执行、查看变量等。
    • cuda-gdb 可以与 CUDA 运行时和 CUDA 驱动程序紧密集成,提供了对 CUDA 程序执行的深入视图。
  2. 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 工具套件可能更有帮助。在实际开发中,开发者往往会根据需要在这两个工具之间切换使用。

Nsight Systems、Nsight Compute什么区别

找到了第 1 篇资料:GPU性能分析利器Nsight System(一) - 知乎

找到了第 2 篇资料:NVIDIA性能分析工具nsight-compute入门 - 知乎

找到了第 3 篇资料:NVIDIA Nsight Systems 入门及使用-CSDN博客

找到了第 4 篇资料:Nsight Compute | NVIDIA Developer | NVIDIA Developer

找到了第 5 篇资料:Getting Started with Nsight Compute | NVIDIA Developer

一共找到 5 篇资料,正在阅读…

找到了 5 篇资料作为参考:

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 是什么

找到了第 1 篇资料:用TensorRT针对AArch64用户的交叉编译示例 - 知乎

找到了第 2 篇资料:Cross-Compiling for the NVIDIA DRIVE Platform (QNX)

找到了第 3 篇资料:Build and Run the Sample Applications for DRIVE OS 6.x QNX | NVIDIA Docs

一共找到 3 篇资料,正在阅读…

找到了 3 篇资料作为参考:

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 系统上的图形渲染、机器学习和其他高性能计算任务创建高效的并行计算解决方案。

  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值