0


VSCode远程调试CUDA代码-NVIDIA Nsight Visual Studio Code Edition

NVIDIA Nsight Visual Studio Code 版本(VSCE)是一个面向异构平台的应用程序开发环境,它将 CUDA GPU 开发引入到 Microsoft Visual Studio Code 中,支持 Linux 和 QNX 系统。NVIDIA Nsight VSCE 可以构建和调试 GPU 内核和原生 CPU 代码,并检查 GPU 和内存的状态。

使用智能 CUDA 自动代码补全特性可以提高整体开发体验,在编写代码时可以节省时间和精力。
使用 Nsight Visual Studio Code 版本进行调试提供了许多好处,包括代码格式化、轻松浏览源代码、显示和交互不同的源文件、构建可执行文件以及进行测试。
Nsight Visual Studio Code 版本支持在虚拟机或远程 Docker 容器等各种集群环境中实施 CUDA 代码开发。它还支持通过 Remote方式开发 Linux 系统上的代码。

一. 安装

  1. 安装VScode

可以到官网下载安装包:Download Visual Studio Code - Mac, Linux, Windows ,安装步骤很简单,这里不详细介绍。

  1. 安装扩展

打开VScode后,

Ctrl+Shift+X

打开扩展试图

  1. Remote-SSH

如果需要在windows机器上remote远程调试或开发Linux机器上的代码,需要下载Remote-SSH:

安装 Remote-SSH 后,可以在左侧看到远程资源管理器图标:

如果这是首次连接到主机计算机,请单击 “+“”并在弹出对话框中添加新的 SSH 连接: ssh username@ip_address,然后根据弹出的说明连接主机计算机。如果已有现有的 SSH 目标,可以直接连接并输入密码进行连接。在 VS Code 中按 Ctrl+`,就可以调出终端,该终端已经 SSH 到主机计算机。接下来需要安装两个插件:

1)C/C++

安装C/C++扩展:

  1. Nsight Visual Studio Code Edition

安装Nsight Visual Studio Code Edition:

二. 编译

  1. 打开CUDA代码

例如打开CUDA samples文件夹:NVIDIA_CUDA-1x.x_SAMPLES ,通过Terminal→Configure Tasks新增tasks.json,并用下面内容进行替换:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "CUDA Build",
            "type": "shell",
            "command": "make dbg=1",
            "problemMatcher":["$nvcc","$gcc"],
            "group":{
                "kind": "build",
                "isDefault": true
            },
            "options": {
                "cwd": "${fileDirname}"
            }
        }
    ]
}
  1. 编译

选择sample matrixMul里的.cu文件,Terminal→Run Build Task进行编译:

三.调试

在VScode里重新打开需要调试的代码文件夹,如cuda sample里的matrixMul文件夹,点击Run→Add Configuration后会生成launch.json, 替换里面的内容:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "CUDA: Debug with CUDA-GDB",
            "type": "cuda-gdb",
            "debuggerPath": "/usr/local/cuda/bin/cuda-gdb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "breakOnLaunch": true,
        }
    ]
}

在.cu文件里设置断点后点击Run→Start Debuggging开始调试。

1. 断点

NVIDIA Nsight Visual Studio Code Edition 的调试器可以基于 GPU 断点来控制执行。

1)前提条件
源代码应使用 -G 选项通过 nvcc 编译,以提供带有调试符号和行表信息的未优化代码。也可以使用 -linetable 编译,以便使用符号进行调试;然而,这将优化 SASS,并导致源代码步进和源断点行为异常。

2)设置GPU 断点
可以使用 NVIDIA Nsight VSCE 在 CUDA 代码中设置源代码断点。源代码断点允许在指定的 CUDA 源代码行暂停应用程序的执行。还可以限制断点仅在特定块和线程执行时中断。在大规模并行环境中,将断点限制到特定块和线程是一个关键功能,因为可能同时拥有数百或数千个线程。

可以使用与 Visual Studio Code 支持的其他语言相同的熟悉的对话框、键盘快捷键和工具窗口来设置和配置 CUDA 断点。
可以在任何可执行的 CUDA 源代码行上设置断点。源代码文档的左侧边距中会出现一个红色的断点标记。

断点标记的颜色表示断点的状态。例如,红色填充的标记表示正常启用的断点,白色填充的标记表示断点被禁用。

3)管理断点

  1. 找到BREAKPOINTS视图
  2. 通过勾选断点旁边的复选框来启用或禁用断点。
  3. 选择断点并单击工具栏中的"删除"按钮来删除断点。
  4. 单击"删除所有断点"按钮来删除所有断点。
  5. 双击断点可导航到源代码位置。

4)条件断点
在拥有数百或数千个线程的大规模并行环境中,能够将断点缩小到感兴趣的区域非常关键。CUDA 调试器支持为 GPU 线程设置带有任意表达式的条件断点。表达式可以使用程序变量、内置的 blockIdx 和 threadIdx,以及一些简短的宏,使基于 blockIdx 和 threadIdx 的条件设置更加容易。

要在 CUDA C 断点上设置块或线程条件:

  1. 在源代码行上设置断点。
  2. 右击断点。
  3. 从下拉菜单中,选择"Edit Breakpoint..."
  4. 输入希望调试器在此断点处的表达式。
  1. 函数断点
    NVIDIA NsightVSCE 支持函数断点。要设置函数断点可以按照以下步骤:
  1. 从"Run"菜单中,选择"New Breakpoint" > "Function Breakpoint..."
  2. 输入 CUDA 内核的函数名。

2. 查看变量

NVIDIA Nsight VSCE 支持标准的 Visual Studio 局部变量视图,用于检查 CUDA 源代码中局部变量的值,还支持观察视图,用于交互式计算表达式。

1)查看局部变量的值

  1. 启动调试会话。
  2. 在 Visual Studio Code 中,打开包含 CUDA 项目的文件夹。
  3. 定义至少一个断点。
  4. 按 F5 开始调试。
  5. 暂停执行或允许应用程序运行到断点,或设置一个新的断点。
  6. 从"VARIABLES"选项卡中选择"Local"。
  7. 局部变量视图会显示当前词法作用域内变量的列表、分配的值和类型。

2)计算表达式的值

  1. 选择"WATCH"。
  2. 单击 + 添加表达式。
  3. 输入调试器可识别的任何有效表达式。该表达式可以包含当前执行位置有效的任何变量。
  4. 按 Enter 键。
  5. CUDA 调试器会计算表达式并显示结果。
  6. 如果表达式引用的变量在当前执行位置无效,则表达式值将显示为 <Not available>。
  7. 如果表达式是一个变量,可以编辑该列中的值来更改变量的内容。

  1. 查看Register的值

在调试GPU代码的时候,Register里会展示**

SASS

,

Predicate

,

Uniform

,

Uniform Predicate,
Other

**

3. 指定调试器上下文

CUDA 中的程序执行是在成百上千个线程同时进行的。CUDA 调试器提供了 "CUDA: Change CUDA debug focus" 命令,允许选择当前调试应用程序中感兴趣的块和线程。

Locals(局部变量)和 Watch(监视)视图,以及 Step Into(单步进入)功能,都使用感兴趣的块和线程作为上下文。

1)选择感兴趣的块和线程
点击VScode右下角CUDA focus状态后会显示 CUDA 调试焦点输入框。在提供的输入框中输入所需的块索引和线程索引,按 Enter 键。

Locals(局部变量)和 Watch(监视)工具窗口显示在新选择的线程上下文中求值的变量和表达式。

注意:更改 CUDA 调试焦点会影响断点的行为。断点最初是无条件的。当调试器遇到第一个断点时,断点的位置成为所有调试的焦点。步进和断点设置在焦点线程上。这将在下一个内核启动时重置,返回到无条件断点。例如,如果当前焦点是block(0,0,0)thread(5,2,0),那么断点只会在块和线程索引匹配当前焦点索引时命中。

  1. 哪个线程有焦点?
    考虑线程如何在 CUDA 调试器中获得焦点。例如,调试器可以在不通知的情况下将焦点切换到另一个线程。如果焦点线程不在断点处,而不同的线程命中数据断点、条件断点或无条件断点,CUDA 调试器会更改当前焦点线程。

例如,如果在block(0,0,0)和thread(0,0,0)处停止,而block(1,0,0)thread(0,0,0)中的断点被命中,调试器将切换到新的线程。调试器在步进时不会切换焦点线程,因为其他线程都被冻结了。

4. 执行cuda-gdb命令

debug过程中,在打开的Debug Console里可以执行cuda-gdb命令,如`info breakpoints检查所有的breakpoints,

-exec info registers

检查Register, 具体命令参考:CUDA-GDB

标签: vscode ide 编辑器

本文转载自: https://blog.csdn.net/zhujingwen_tongji/article/details/141361075
版权归原作者 翊桐公羽 所有, 如有侵权,请联系我们删除。

“VSCode远程调试CUDA代码-NVIDIA Nsight Visual Studio Code Edition”的评论:

还没有评论