2. 控制执行
CUDA 调试器允许您在调试会话期间控制 CUDA 程序的执行。CUDA 调试器支持步进到代码行,以及将程序运行到光标处。
为了使用以下任何功能,调试的 CUDA 程序必须由于在断点处停止或来自先前的执行控制语句而暂停。
2.1. 前提条件
源代码应使用 nvcc 和 the -G option 进行编译,以便提供带有调试符号和行号表的非优化代码。也可以使用 -linetable 进行编译,以便使用符号进行调试;但是,这将优化 SASS,并导致不稳定的源步进和源断点行为。
2.2. 步进行为
步进时,除调试器焦点 Warp 外,所有 Warp 均被冻结。但是,当单步跳过 __syncthreads() 时,当前代码块中的所有 Warp 均可取得进展。这允许焦点 Warp 越过 __syncthreads() 函数。
步出全局函数将恢复应用程序(与按 F5 或选择菜单命令“调试”>“继续”的结果相同)。
单步跳过内核函数的最后一行也将恢复应用程序执行。
单步跳过内联函数的最后一行与步出内联函数的结果相同。
2.3. 最佳实践
为了在调试时获得最佳步进行为,我们建议在您的代码中尽可能使用花括号。将花括号放在其自身的源代码行上。例如,由于编译器生成作用域信息的方式,以下编码风格会导致不同的步进行为。
以下代码片段导致低于最佳水平的步进行为
for () statement; for () statement; for () { statement; }
以下代码片段导致最佳步进行为
for () { statement; }
通常,通过声明临时变量来分解计算会使代码更易于调试。变量在特定行集中“存活”的可能性增加。这意味着,当您单步执行代码时,变量的值将更容易识别。
2.4. 单步调试程序
-
启动调试会话。
-
使用 Nsight CUDA 调试位置工具栏选择要单步调试的线程。
有关更多信息,请参阅指定调试器上下文。
-
从“调试”菜单中,选择“步入”。
或者,按键盘上的 F11 键。
-
当前线程的程序计数器将前进一个源代码行。
注意: |
使用“步入”会导致调试器执行当前选定线程的下一条指令。步进发生在当前焦点线程上。 |
3. 设置 GPU 断点
NVIDIA Nsight Visual Studio Code Edition 的调试器可以基于 GPU 断点控制执行。
3.1. 前提条件
源代码应使用 nvcc 和 the -G option 进行编译,以便提供带有调试符号和行号表的非优化代码。也可以使用 -linetable 进行编译,以便使用符号进行调试;但是,这将优化 SASS,并导致不稳定的源步进和源断点行为。
3.2. GPU 断点
您可以使用 NVIDIA Nsight™ VSCE 在 CUDA 代码中设置源断点。源断点允许您在指定的 CUDA 源代码行处暂停应用程序。您还可以约束断点,使其仅在特定块和线程正在执行时中断。将断点约束到特定块和线程是在大规模并行环境中至关重要的能力,在这样的环境中,您可能同时运行数百或数千个线程。
您可以使用与其他 Visual Studio Code 支持的语言相同的熟悉对话框、键盘快捷键和工具窗口来设置和配置 CUDA 断点。
3.2.1. 创建源断点
您可以在任何可执行 CUDA 源代码行上设置断点。
要在源代码行上设置断点
-
在源代码窗口中,将插入点移动到您希望应用程序中断的行。
要在跨越两行或多行的语句中设置断点,请将插入点移动到语句的最后一行。
-
从调试菜单中,选择切换断点。
或者,按 F9 键,或在源代码文档的左边距中单击鼠标左键。
红色断点字形将出现在源代码文档的左边距中。
断点字形的颜色指示断点的状态。例如,红色填充的字形指示正常的、已启用的断点。白色填充的字形指示断点已禁用。
有关断点的更多信息,请参阅 Visual Studio Code 文档中的断点部分。
3.2.2. 管理断点
使用标准的 Visual Studio Code “断点”工具窗口来启用、禁用、添加和删除断点。
有关查找示例应用程序的帮助,请参阅使用示例。
-
从 运行和调试 选项卡中,选择 断点 部分。
-
通过标记断点旁边的复选框来启用或禁用断点。
-
通过选择一个断点,然后单击工具栏中的“删除”按钮来删除断点。
-
通过单击 删除所有断点 按钮来删除所有断点。
-
通过双击断点导航到断点的源代码位置。
3.3. 条件断点
在具有数百或数千个线程的大规模并行环境中,能够将断点缩小到仅感兴趣的区域至关重要。CUDA 调试器支持为具有任意表达式的 GPU 线程设置条件断点。表达式可以使用程序变量、内部函数 blockIdx 和 threadIdx,以及一些简写宏,以便更轻松地基于 blockIdx 和 threadIdx 设置条件。
要在 CUDA C 断点上设置块或线程条件
-
在源代码行上设置断点。
-
右键单击断点。
-
从下拉菜单中,选择 编辑条件...
-
键入您希望调试器在此断点处评估的表达式。
3.4. 函数断点
NVIDIA Nsight™ VSCE 支持函数断点。要设置函数断点,请使用以下方法之一
-
从 运行和调试 选项卡的 断点 部分,选择 添加函数断点。
-
从 运行 菜单中,选择 新建断点 > 函数断点...
用户可以输入 CUDA 内核的函数。
4. 活动时中断
CUDA 调试器具有在发生某些运行时活动时(例如内核启动或发生 API 错误时)暂停执行的选项。
4.1. 启动时中断
CUDA 调试器具有在发生某些运行时活动时(例如内核启动或发生 API 错误时)暂停执行的选项。
CUDA 调试器可以在启动函数时自动插入内部断点。通过在启动配置中将 breakOnLaunch 属性设置为 true 来启用 启动时中断 功能。有关启动配置的更多信息,请参阅创建启动配置。
启用后,当任何 __global__ 内核启动时,执行将暂停。当设置函数断点很繁琐时,这很有用。如下所示,没有显示用户断点,但执行在内核入口点处暂停。
4.2. API 错误时中断
用于控制 CUDA API 错误发生时行为的设置通过启动配置中的 onAPIError 属性进行配置。有效值为
-
hide 将不会报告任何类型的错误。
-
ignore 将发出警告,但继续应用程序的执行。
-
stop 将发出错误并停止应用程序。
声明
声明
NVIDIA® Nsight™ 应用程序开发环境(用于异构平台),Visual Studio Code Edition 2024.1 用户指南发送反馈
本指南中的信息以及本指南中引用的 NVIDIA 文档中包含的所有其他信息均按“原样”提供。NVIDIA 不对产品信息的准确性、完整性或适用性做任何明示、暗示、法定或其他方面的保证,并且明确声明不对产品信息不侵权、适销性和针对特定用途的适用性作任何暗示保证。尽管客户可能因任何原因遭受任何损害,但 NVIDIA 对本指南中描述的产品对客户的累计责任应根据产品的 NVIDIA 销售条款和条件进行限制。
本指南中描述的 NVIDIA 产品不具备容错能力,并非设计、制造或旨在用于与以下任何系统的设计、建造、维护和/或操作相关的用途,在这些系统中,使用或此类系统的故障可能会导致威胁人类生命安全或严重人身伤害或财产损失的情况(包括但不限于与任何核、航空电子、生命支持或其他生命攸关的应用相关的用途)。NVIDIA 明确声明不对用于此类高风险用途的适用性作出任何明示或暗示的保证。对于因任何此类高风险用途而引起的任何索赔或损害,NVIDIA 概不承担对客户或任何第三方的全部或部分责任。
NVIDIA 不保证或声明本指南中描述的产品在未经进一步测试或修改的情况下适用于任何特定用途。NVIDIA 不一定会执行每个产品的所有参数的测试。客户全权负责确保产品适用于客户计划的应用并适合该应用,并为该应用进行必要的测试,以避免应用或产品出现缺陷。客户产品设计中的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本指南中包含的附加或不同条件和/或要求。对于可能基于或归因于以下原因的任何缺陷、损坏、成本或问题,NVIDIA 概不承担任何责任:(i) 以任何违反本指南的方式使用 NVIDIA 产品,或 (ii) 客户产品设计。
除客户有权将本指南中的信息与产品一起使用外,NVIDIA 在本指南下未授予任何其他明示或暗示的许可。只有在获得 NVIDIA 书面批准、未经修改地复制且附带所有相关的条件、限制和声明的情况下,才允许复制本指南中的信息。
商标
NVIDIA、NVIDIA 徽标以及 cuBLAS、CUDA、CUDA-GDB、CUDA-MEMCHECK、cuDNN、cuFFT、cuSPARSE、DIGITS、DGX、DGX-1、DGX Station、NVIDIA DRIVE、NVIDIA DRIVE AGX、NVIDIA DRIVE Software、NVIDIA DRIVE OS、NVIDIA Developer Zone (又名 "DevZone")、GRID、Jetson、NVIDIA Jetson Nano、NVIDIA Jetson AGX Xavier、NVIDIA Jetson TX2、NVIDIA Jetson TX2i、NVIDIA Jetson TX1、NVIDIA Jetson TK1、Kepler、NGX、NVIDIA GPU Cloud、Maxwell、Multimedia API、NCCL、NVIDIA Nsight Compute、NVIDIA Nsight Eclipse Edition、NVIDIA Nsight Graphics、NVIDIA Nsight Integration、NVIDIA Nsight Systems、NVIDIA Nsight Visual Studio Edition、NVIDIA Nsight Visual Studio Code Edition、NVLink、nvprof、Pascal、NVIDIA SDK Manager、Tegra、TensorRT、Tesla、Visual Profiler、VisionWorks 和 Volta 是 NVIDIA Corporation 在美国和其他国家/地区的商标和/或注册商标。其他公司和产品名称可能是与其关联的各自公司的商标。