检查状态
检查状态
在本节中,了解有关如何使用 CUDA 调试器的各种状态检查功能的更多信息,例如指定调试器上下文、查看内存和变量、使用 CUDA 信息视图以及使用 CUDA Warp 监视。
指定调试器上下文
注意
此功能仅受旧版 CUDA 调试器支持。下一代 CUDA 调试器将在未来的版本中支持此功能。
CUDA 中的程序执行同时发生在数百或数千个线程上。CUDA 调试器具有 CUDA 焦点选择器,可让您在当前调试的应用程序中选择感兴趣的块和线程。
局部变量 和 监视 窗口以及 单步跳入 功能使用感兴趣的块和线程作为其功能的上下文。
选择感兴趣的块和线程
从 Nsight 菜单 中,选择 窗口 > CUDA 调试焦点... 以启动 “CUDA 调试焦点”对话框。
或者,Nsight CUDA 调试 工具栏组的 CUDA 焦点选择器项显示块和线程索引,并启动 CUDA 调试焦点 对话框。
在提供的文本字段中输入所需的块索引和线程索引。块文本字段将在您键入时显示有效索引。您只能选择当前在 GPU 硬件上执行的块。
选择“确定”。
局部变量 和 监视 工具窗口显示在新选择的线程上下文中评估的变量和表达式。
注意
焦点选择器会影响断点的行为。
断点最初是无条件的。当调试器遇到第一个断点时,断点的位置将成为所有调试的焦点。单步执行和断点设置在焦点线程上。这会在下一个内核启动时重置,返回到无条件断点。 |
例如,如果当前焦点是 Block(0,0,0):Thread(5,2,0)
,则断点仅在块和线程索引与当前焦点索引匹配时才会命中。 |
哪个线程具有焦点?
考虑线程如何在 CUDA 调试器中获取焦点。例如,调试器可以在不通知您的情况下将焦点更改为另一个线程。如果焦点线程不在断点处,并且另一个线程命中数据断点、条件断点或无条件断点,则 CUDA 调试器会更改当前焦点线程。
例如,如果在块 (0,0,0) 和线程 (0,0,0) 中停止,并且断点在块 (1,0,0) 线程 (0,0,0) 中命中,则调试器将切换到新线程。当单步执行时,调试器不会切换焦点线程,因为其他线程被冻结。
操作指南:查看内存
NVIDIA Nsight™ VSE 旧版和下一代 CUDA 调试器支持 Visual Studio 内存窗口,用于检查 GPU 上内存的内容。CUDA 调试器支持查看正在调试的进程中 CUDA 当前状态的共享内存、本地内存和全局内存。
虽然下一代调试器也支持在 CPU 调试时查看内存,但本节仅讨论 GPU 内存。要在 CPU 断点或异常处查看 GPU 内存,您必须将线程焦点更改为 CUDA 线程。如果没有任何 GPU 线程正在运行,“源”窗口将显示 代码未运行
。
仅当运行 CUDA 应用程序时,才能查看 GPU 内存中的值,并且目标应用程序在 CUDA 源代码中的断点处停止。请记住以下几点
共享内存
可由从中创建它的块的任何线程访问。
具有块的生命周期。
本地内存
只能由线程访问。
具有线程的生命周期。
全局内存
可以从主机或设备访问。
具有应用程序的生命周期。
查看 GPU 内存的内容
要查看全局内存的内容
从 调试 菜单中,选择 窗口 > 内存。
选择一个 内存 窗口。如果已打开,则“内存”窗口将打开或获取焦点。
在“内存”窗口的 地址 字段中,键入您要查看的 GPU 内存地址。
键入十六进制值或当前词法作用域中有效指针的名称。
按 Enter 键。“内存”窗口将显示从指定地址开始的内存内容。
注意
提示:右键单击 内存 窗口以更改内存内容的显示方式,包括将内存内容显示为浮点数。
从 调试 菜单中,选择 窗口 > 内存。
选择一个 内存 窗口。如果已打开,则“内存”窗口将打开或获取焦点。
在 内存 窗口的 地址 字段中,键入要显示的共享内存位置的 GPU 内存地址。
确保通过使用以下语法将指针强制转换为共享内存中的指针
(__shared__ float*)p
右键单击 内存 窗口以查看显示选项。
注意
以下示例显示了用于将指针/地址强制转换为不同内存空间的语法。
共享内存:
(__shared__ int*)0x00
本地内存:
(__local__ int*)0
全局内存:
(__device__ int*)0x2001b000
注意:您无法通过编辑“内存”窗口中的值来更改 GPU 内存中的值。
在“局部变量”窗口中查看内存中的变量
启动 CUDA 调试器。
从 调试 菜单中,选择 窗口 > 内存 > 内存窗口 1。
内存 窗口打开。
将变量从 局部变量 窗口拖到 内存 窗口上。
“内存”窗口显示与变量(或指针)对应的地址处的值。
或者,您可以在“内存”窗口的 地址 字段中键入变量的名称。
在查看
__local__
、__const__
或__shared__
中的内存时,请确保 Visual Studio 内存视图设置为“自动重新评估”。这将确保显示的内存是正确的内存空间。否则,显示可能会更改为默认为全局内存的地址。
注意:您无法通过编辑“局部变量”窗口中的值来更改 GPU 内存中的值。
在“监视”窗口中查看内存中的变量
启动 CUDA 调试器。
从 Visual Studio 的 Nsight 菜单中,选择
启动 CUDA 调试(旧版)
启动 CUDA 调试(下一代)
有关为您的系统配置选择正确的调试器的信息,请参阅 系统要求 页面。
或者,可以通过以下方式启动这些调试会话
右键单击“解决方案资源管理器”中的项目,然后选择 调试 子菜单。
单击 Nsight CUDA 调试 工具栏中的关联图标。
在 Nsight 连接 下拉列表中选择关联项。
暂停执行或允许应用程序运行到断点(或者在未启用断点的情况下设置断点)。
从 调试 菜单中,选择 窗口 > 监视。
选择一个 监视 窗口。如果已打开,则“监视”窗口将打开或获取焦点。
将变量从 监视 窗口拖到 内存 窗口上。“内存”窗口显示与变量(或指针)对应的地址处的值。
操作指南:查看变量
NVIDIA Nsight™ VSE 支持标准的 Visual Studio 局部变量 窗口,用于检查 CUDA 源代码中局部变量的值,以及 监视 窗口,用于交互式评估表达式。
只有在以下情况下,CUDA 调试器中才可以使用 局部变量 窗口和 监视 窗口中的信息
基于 CUDA 的应用程序正在运行,并且
应用程序执行在执行 CUDA 源代码时暂停。
当不受私有/内部库的限制时。例如,请参阅 OptiX 限制,尤其是在应用于查看变量时。
查看局部变量的值
启动调试会话。
在 Visual Studio 中,打开一个基于 CUDA 的项目。
定义至少一个断点。
从 Nsight 菜单 中,选择
启动 CUDA 调试(旧版)
启动 CUDA 调试(下一代)
有关为您的系统配置选择正确的调试器的信息,请参阅 系统要求 页面。
或者,可以通过以下方式启动这些调试会话
右键单击“解决方案资源管理器”中的项目,然后选择 调试 子菜单。
单击 Nsight CUDA 调试 工具栏中的关联图标。
在 Nsight 连接 下拉列表中选择关联项。
您的应用程序启动,CUDA 调试器启动,并在遇到的第一个断点处停止。
暂停执行或允许应用程序运行到断点,或者在未启用断点的情况下设置断点。
从 调试 菜单中,选择 窗口 > 局部变量。“局部变量”窗口打开。
“局部变量”窗口显示当前词法作用域中的变量列表、其赋值和类型。

注意
块和线程索引在 blockDim
和 threadIdx
变量中公开。
注意
尚未初始化的变量将其值显示为三个问号:???
计算表达式的值
从“调试”菜单中,选择 窗口 > 监视 > 监视1 以打开或聚焦 监视 窗口。
左键单击窗口的表达式部分。
键入调试器识别的任何有效表达式。表达式可以包含当前执行位置的任何有效变量。
按 Enter 键。
CUDA 调试器评估 名称 列中显示的表达式,并将结果放在 值 列中。
如果表达式引用当前执行位置无效的变量,则表达式值将显示错误消息。
如果表达式是变量,您可以在此列中编辑值以更改变量的内容。您无法编辑 const 变量的值。“监视”窗口的右列显示表达式评估的值。
注意
CUDA 调试器支持很大一部分 C++ 表达式语法,包括
位运算符和逻辑运算符:
&, |, ^, &&, ||, <<, >>
算术运算符:
+, -, *, /
指针算术: 例如:
p+4
,
p[4]
强制类型转换:
(int *)p, (float4*)p, (__shared float4*)p
数组,长度 格式规范(仅限旧版调试器)
给定源变量
int* p
,在监视窗口中输入p ,3
会将变量视为包含三个元素的数组;展开变量后,所有元素都将可见。
注意
要在变量“监视”窗口或条件断点中使用寄存器,请指定大写 R
和十进制(非十六进制)寄存器号。例如:R9
或 R10
。
在下一代 CUDA 调试器中,您也可以使用 $
作为前缀,以区分具有等效名称的变量。 例如:$R9
或$R10
。
您也可以将鼠标悬停在反汇编视图中的寄存器上,以获取提供寄存器值的工具提示。
下一代 CUDA 调试器:另请参阅 下一代 CUDA 调试器寄存器视图 和 Visual Studio 调试器寄存器视图。
旧版 CUDA 调试器:请参阅 Visual Studio 调试器寄存器视图。
配置表达式的格式
从 Nsight 菜单中,选择 Nsight 选项。
在“Nsight 选项”窗口的左窗格中选择“调试器”组。
标记您要启用的选项。
旧版 CUDA 信息视图
CUDA 信息视图显示正在调试的进程中 CUDA 的当前状态信息。
注意
使用 OptiX 框架构建的应用程序会限制调试和分析功能。请参阅 调试和分析 OptiX 应用程序时的限制。
要查看 CUDA 信息工具窗口
启动旧版 CUDA 调试器。
打开一个基于 CUDA 的项目。
确保 Nsight Monitor 在目标计算机上运行。
从 Nsight 菜单 中,选择 启动 CUDA 调试(旧版)。或者,您可以使用以下备用方法之一
右键单击“解决方案资源管理器”中的项目,然后选择 调试 > 启动 CUDA 调试(旧版)
Nsight CUDA 调试工具栏 > 启动 CUDA 调试(旧版)
Nsight 连接工具栏 > 启动 CUDA 调试(旧版)
旧版 CUDA 调试器启动并启动目标应用程序。
从 Nsight 菜单中,选择 窗口 > CUDA 信息。选择您希望打开的 CUDA 信息页面。
CUDA 信息工具窗口的常规功能
查看行
这会显示当前视图中的行数。如果视图已过滤,则显示的数字可能小于总行数。
超链接
超链接将使用特定过滤器将当前工具窗口跳转到另一个页面。例如,单击“模块”列中的链接会将您链接到 模块 工具窗口。
过滤结果
使用 $("列名")
按列的确切名称指定,包括空格。列名必须用引号引起来。
例如,在“Warp”页面中:
$("活动掩码") == 0xffffffff
可以通过表达式过滤每个页面中的结果。这会导致更短的表达式。
例如,在“Warp”页面中:
Status=="Breakpoint" && FlatBlockIdx > 30
其他过滤技巧
要查看自动完成窗口,请键入列的第一个字母。使用 重置过滤器 清除页面的当前过滤器。
要查找具有特定字符串的所有函数,您可以使用
Name.StartsWith("bar")
、Name.Contains("bar")
、Name.Endswith("bar")
和!
运算。由超链接创建的过滤器不会在调试会话之间持久保存。这是因为这些过滤器通常具有特定的标识符,例如上下文或模块 ID,这在下一个调试会话中没有意义。但是,用户创建的任何过滤器都将与页面一起持久保存,无论它是否包含唯一 ID。
书签
书签是一种快速跳转到特定页面的方法,带有预设过滤器。
持久性
调试时,每个页面都会持久保存其上次显示的状态。通过单击超链接创建的任何过滤器都不会在下一个调试会话中持久保存。
焦点
要在 Warp 和 Lane 页面中更新当前焦点,您可以使用以下任何方法
CUDA 焦点选择器
下一个 Warp 或 上一个 Warp 命令
这些命令可以从 Visual Studio 的 Nsight 菜单或 Nsight 工具栏中使用。
在“Warp”页面中使用 设置焦点
这可以通过双击或右键单击线程并选择 设置焦点 来实现。
在同一行中的其他位置使用右键单击 > 设置焦点 或双击将转到所选 warp 中的第一个活动线程,如该行的
threadIdx
值所示。在“Lane”页面中使用 设置焦点
这可以通过双击或右键单击线程并选择 设置焦点 来实现。
CUDA 信息工具窗口页面
此工具窗口中有多个页面,可让您查看正在调试的 CUDA 应用程序的不同方面。
CUDA 信息工具窗口页面包括以下内容
数组
“数组”页面显示有关正在调试的进程中所有数组的信息。
有关“数组”页面的更多信息,请参阅 CUDA 数组。
块
“块”页面显示 GPU 上当前运行的内核中的所有活动块。“CUcontext”列中的链接将打开 上下文 页面。“# Warps”列中的 超链接 将跳转到“Warp”页面,并过滤到特定块。

上下文
“上下文”页面显示有关当前正在调试的进程中所有 GPU 上的所有上下文的信息。此页面上的信息始终可用,即使进程尚未停止。
请注意,“SW 抢占”列用于显示应用程序是使用软件抢占(在单个 GPU 上)还是非抢占(经典或硬件)。
有关 CUDA 上下文对象类型的更多信息,请参阅 CUcontext。
函数
“函数”页面显示有关所有已加载模块中的所有函数的信息。此页面上的信息始终可用,即使进程尚未停止。

网格
“网格”页面显示 GPU 上的所有活动和排队的内核。当前内核的 # 块 将大于 0。其他内核将 # 块 设置为 0。
Lane
“Lane”页面显示有关当前焦点 warp 中所有 lane 的信息。Lane 是一个 warp 中的单个线程。
lane 的当前状态在“状态”列中显示为屏障。
内存分配
此页面显示应用程序中所有 CUcontexts
中所有 CUDA 全局内存分配的信息。此页面在内核中暂停时自动更新。
与其他页面一样,可以过滤结果。例如
CUcontext==0x02c8c258
MemoryAllocationType == "Host" && Size > 100
此页面上需要注意的几列包括以下内容
CUContext — 包含此内存分配的上下文。
类型 — 设备或主机。当用户包含任何设备端分配调用(例如
cudaMalloc
)时,使用 设备。主机 用于从设备上映射的主机分配的任何内存(例如,cudaHostAlloc
、cudaHostRegister
或其他 CUDA API 调用)。地址 — 设备端地址。对于类型为“主机”的分配,此设备端地址可以从
HostPtr
地址通过cudaHostGetDevicePointer
检索。Host Ptr
如下对于 设备 分配,这是
0x00000000
。对于 主机 分配,这将具有从
cudaHostAlloc
、cudaHostRegister
或其他主机映射函数返回的地址。
结束地址 — 只是地址加上大小(独占结束范围)。
“名称”列将来可能用于命名内存分配。
可移植、设备映射 和 写入组合 标志将在与关联的
cudaHostAlloc
或cudaHostRegister
调用一起使用时填充。
右键单击特定行,然后选择 设置内存视图表达式 以打开“内存”窗口。
模块
“模块”页面显示有关所有上下文中的所有模块的信息。此处显示的信息与 Visual Studio 模块视图中看到的模块匹配。此页面上的信息始终可用,即使进程尚未停止。
使用“模块”页面的技巧
过滤结果:使用 HasSymbols 仅查看具有符号的已加载模块。
任何没有符号的模块都无法在内核中命中断点。
“动态并行性”列显示是否存在嵌套内核启动,其中一个内核启动另一个内核。有关更多信息,请参阅 CUDA 动态并行性。
Surface
“Surface”页面提供每个 CUDA 上下文的所有 CUDA surface 对象句柄类型的详细信息。
有关更多信息,请参阅 Surface 对象 API。
纹理
“纹理”页面提供每个 CUDA 上下文的所有 CUDA 纹理对象句柄类型的详细信息。
有关更多信息,请参阅 纹理对象 API。
Warp
“Warp”页面显示 GPU 上的所有活动 warp。每一行代表一个 warp,“Lane”列显示有关视图中每个 warp 的所有 lane 的信息。Lane 是一个 warp 中的单个线程。“Lane”列提供有关任何 warp 异常的每个 lane 的详细信息;当前状态显示在“Lane”列中。
焦点
当前焦点在“Lane”列中用黄色箭头表示。
焦点更改会影响黄色箭头相对于 Warp 行和 Lane 列线程的位置。其他列不受焦点更改的影响。
更改 Warp 或 Lane 焦点也将更新其他视图(即,局部变量、监视、调用堆栈等)。
可以使用 焦点部分 中概述的方法之一手动更改线程焦点。
将光标悬停在“Lane”列中的行上将生成一个工具提示,其中包含 lane 的状态。
用户可以切换到活动或非活动 lane;但是,焦点不能更改为 未启动 的 lane。
用户可以在 warp 页面本身中冻结特定的 warp。这组冻结的 warp 与全局冻结控制分开管理。冻结 warp 1、2 和 3,然后切换全局冻结状态将使这些 warp 保持冻结状态。(有关更多详细信息,请参阅 操作指南:使用全局冻结页面。)
注意
冻结的 warp 行被禁用,并且在“冻结”列中具有 Warp。
过滤结果
使用 Warp 异常 书签过滤到当前处于异常状态的 warp。
使用 Warp @ 断点 书签过滤到仅命中断点的 warp。

“Lane”列的颜色图例如下
颜色 |
线程状态 |
|
---|---|---|
有关“Warp”页面的更多信息,请参阅 CUDA Warp 监视部分的 示例场景。
下一代状态检查视图
NVIDIA Nsight Visual Studio Edition 5.5 及更高版本为开发人员带来了前所未有的应用程序开发功能,在同一调试会话中结合了本机 Visual Studio CPU 和 CUDA GPU 调试。这种新的调试架构将 Nsight 的功能扩展到最新的 Volta GPU,同时在 GPU 内核和本机 CPU 代码上提供无缝、同构的调试体验。
下一代 CUDA 调试器提供了许多独立的工具窗口,用于检查目标应用程序的状态。
注意
下一代 CUDA 调试器旨在与配备最新驱动程序和操作系统的 Pascal、Volta 和 Turing 系列 GPU 配合使用。某些旧版 CUDA 调试器的功能、较旧的 GPU、驱动程序和操作系统可能不受支持。请参阅系统要求,了解旧版 CUDA 调试器和下一代 CUDA 调试器之间的差异,以确定哪一个更适合您的需求。
查看下一代 CUDA 信息工具窗口
启动下一代 CUDA 调试器。
打开一个基于 CUDA 的项目。
确保 Nsight Monitor 在目标计算机上运行。
从 Nsight 菜单中,选择“启动 CUDA 调试(下一代)”。或者,您可以使用以下备选方法之一
在解决方案资源管理器中右键单击项目,然后选择 调试 > 启动 CUDA 调试(下一代)
Nsight CUDA 调试工具栏 > 启动 CUDA 调试(下一代)
Nsight Connections 工具栏 > 启动 CUDA 调试(下一代)
下一代 CUDA 调试器启动并启动目标应用程序。
从 Nsight 菜单中,选择 窗口 以选择一个受支持的工具,该工具允许您检查目标应用程序的状态(Warp 信息、通道、Warp 监视、资源 或 GPU 寄存器)。
下一代 CUDA 信息工具窗口的通用功能
过滤结果
有两种模式可用于创建过滤器
JavaScript 模式 — 使用列的确切名称(包括空格)创建 JavaScript 表达式,格式为
$("Column Name")
。键入'$'
将生成一个列表,可用于选择预格式化的列名。$('Grid ID') == 2 || $('BP Hit Mask') == 1
$('Active Mask') == 80000000
$('Active Mask') != "FFFFFFFF" && $('Status') == "Breakpoint")
$('Status').match(/breakpoint/i)
(function (a, b) { return a.toLowerCase() == b.toLowerCase(); })($("Status"), "breakpoint")
RegEx 模式 — 创建正则表达式以匹配所需行单元格的(不区分大小写)文本
^8
: 过滤单元格字符串以“'8'
”开头的行point
:过滤单元格字符串包含“'point'
”的行
焦点
要在“Warp 信息”和“通道”页面中更新当前的 CUDA 线程焦点,您可以使用以下任何方法
下一个 Warp 或 上一个 Warp 命令
这些命令可以从 Visual Studio 的 Nsight 菜单或 Nsight 工具栏中使用。
在“Warp”页面中使用 设置焦点
这可以通过双击线程(Warp 的通道)来实现。
在“Lane”页面中使用 设置焦点
这可以通过双击线程(Warp 的通道)来实现。
下一代 CUDA 调试器工具窗口
此工具窗口中有多个页面,可让您查看正在调试的 CUDA 应用程序的不同方面。
CUDA 信息工具窗口页面包括以下内容
Warp 信息
“Warp 信息”页面显示 GPU 上的所有活动 Warp。每一行代表一个 Warp,“线程”列显示视图中每个 Warp(行)的所有通道(子列)的信息。通道是 Warp 中的单个线程。“线程”列提供有关任何 Warp 异常的每个通道的详细信息;当前状态显示在“线程”列中。
焦点
当前焦点在“线程”列中用黄色箭头表示。
可以使用焦点部分中概述的方法之一手动更改线程焦点。
焦点更改会影响黄色箭头相对于 Warp 行和 线程 列线程的位置。其他列不受焦点更改的影响。
更改 Warp 或 Lane 焦点也将更新其他视图(即,局部变量、监视、调用堆栈等)。
用户可以切换到活动或非活动 lane;但是,焦点不能更改为 未启动 的 lane。
用户可以在 warp 页面本身中冻结特定的 warp。这组冻结的 warp 与全局冻结控制分开管理。冻结 warp 1、2 和 3,然后切换全局冻结状态将使这些 warp 保持冻结状态。(有关更多详细信息,请参阅 操作指南:使用全局冻结页面。)
注意
与旧版 CUDA 调试器不同,冻结的 Warp 行不会被禁用,并且没有 冻结 列。此指示器将在未来的版本中添加。

“线程”列的颜色图例如下

有关“Warps”页面的更多信息,请参阅 CUDA Warp 监视部分的示例场景。
Warp 监视
“Warp 监视”页面显示所有 Warp 中被监视变量的当前状态信息。
有关更多信息,请参阅 Warp 监视文档,该文档在下一代和旧版 CUDA 调试器中通用。
下一代 CUDA 调试器工具窗口
“通道”页面显示当前焦点 Warp 中所有通道的信息。通道是单个 Warp 中的单个线程。
lane 的当前状态在“状态”列中显示为屏障。
焦点
当前焦点在第一列中用黄色箭头表示。
可以使用焦点部分中概述的方法之一手动更改线程焦点,从而更改通道焦点。
焦点更改会影响黄色的行位置。
更改 Warp 或 Lane 焦点也将更新其他视图(即,局部变量、监视、调用堆栈等)。
用户可以切换到活动或非活动 lane;但是,焦点不能更改为 未启动 的 lane。
资源
“资源”视图显示正在调试的 CUDA 应用程序的不同方面。
使用顶部的下拉列表,可以选择不同的视图,其中每个视图都特定于一种资源(上下文、流、内核等)。“过滤器”编辑允许您使用当前选定资源的列标题创建过滤器表达式。
资源表显示每个资源实例的所有信息。资源是动态添加的,并且在运行时和目标应用程序暂停时都可用。当资源被销毁时,它将从其表中删除。

设备
“设备”设置显示有关正在调试的 GPU 的信息。
第一列表示设备属性的“名称”。
下列表示 CUDA_VISIBLE_DEVICE
设备重新映射后的设备索引。此处显示 设备 0
。

上下文
“上下文”设置显示有关当前正在调试的进程中所有 GPU 上的所有上下文的信息。此页面上的信息始终可用,即使进程尚未停止。

流
“流”设置显示有关并发内核流、它们的 ID 和优先级的信息。

模块
“模块”设置显示有关所有上下文中所有模块的信息。此处显示的信息与 Visual Studio “模块”视图中看到的模块相匹配。此页面上的信息始终可用,即使进程尚未停止。

函数
“函数”设置显示有关所有已加载模块中所有函数的信息。此页面上的信息始终可用,即使进程尚未停止。

内存分配
此页面显示应用程序中所有 CUcontexts
中所有 CUDA 全局内存分配的信息。此页面在内核中暂停时自动更新。
与其他页面一样,可以过滤结果。例如
$('Context') == 0x23e4c4400a0
$('Allocation type') == "HOST MEMORY ALLOC" && $('Size Requested') > 100
此页面上需要注意的几列包括以下内容
分配类型 — 设备或主机。
当用户包含任何设备端分配调用(例如
cudaMalloc
)时,使用 设备。主机 用于从映射到设备的主机分配的任何内存(例如,
cudaHostAlloc
、cudaHostRegister
或其他 CUDA API 调用)。地址 — 设备端地址。对于类型为“主机”的分配,此设备端地址可以通过
cudaHostGetDevicePointer
从主机地址
获取。主机地址
如下所示对于 设备 分配,这是
None
。对于 主机 分配,这将具有从
cudaHostAlloc
、cudaHostRegister
或其他主机映射函数返回的地址。
上下文 — 包含此内存分配的上下文。
CUmemoryPool — 此分配的内存池地址。如果不使用池,则为 0x0。
池分配模式 — 从池分配时使用的 cudaMemPoolAttr.enumerator
图形
“图形”设置显示 CUDA 图形启动信息。

图形节点
“图形节点”设置显示每个 CUDA 图形启动的图形节点信息。

已编译图形
“已编译图形”设置显示有关已编译 CUDA 图形启动的信息。
已编译图形节点
“已编译图形节点”设置显示每个已编译 CUDA 图形启动的图形节点信息。

图形实例
“图形实例”设置显示有关每个 CUDA 图形实例的信息。
寄存器
“寄存器”视图显示 GPU 寄存器的当前状态。如果自上次执行中断以来值已更改,则寄存器及其值将显示为红色。
此视图分为 5 个部分
SASS — 此部分显示着色器汇编代码寄存器。
谓词 — 这些寄存器显示当前线程的当前谓词状态。
条件代码 — 基于上次执行指令的逻辑条件代码。
PTX — 显示 PTX 寄存器。
PTX loc — 显示作用域内的 GPU PTX 寄存器。
注意: 条件代码寄存器在 Volta 系列 GPU 或更高版本上不可用。
您可以右键单击“寄存器”视图来配置视图,或将内容复制到剪贴板。
注意
要在变量监视窗口或条件断点中使用 SASS 寄存器,请指定寄存器大写字母 R
和十进制(非十六进制)寄存器号。例如:R9
或 R10
。
在下一代 CUDA 调试器中,您也可以使用 $
作为前缀来区分 SASS 寄存器和具有等效名称的变量。例如:$R9
或 $R10
。
您也可以将鼠标悬停在反汇编视图中的 SASS 寄存器上,以获取提供寄存器值的工具提示。
注意
PTX 寄存器和变量可以在“监视窗口”中使用,方法是在寄存器或变量前加上 %
符号。例如:%R17
。目前,您不能将 PTX 寄存器用于条件断点。
请注意,有时 PTX 寄存器可能会跨越 SASS 寄存器对,如下面的格式所示
<PTX register double> = <SASS register>,SASS register>)
例如
%rd3 = R6,R7
如果应用程序在构建时未使用 nvcc 标志来为 CUDA 内核生成符号信息 (–G
),则 PTX 寄存器将为空白。|
注意
如果在 Turing(计算能力 7.5)或更高版本的 GPU 上进行调试,您还可以隐藏/显示“Uniform”和“Uniform Predicate”寄存器。
注意:要在变量监视窗口或条件断点中使用 Uniform 或“Uniform Predicate”寄存器,请指定寄存器大写字母 UR
或 UP
,以及十进制(非十六进制)寄存器号。例如:UP9
或 UR10
。
在下一代 CUDA 调试器中,您也可以使用 $
作为前缀来区分 Uniform 寄存器和具有等效名称的变量。例如:$UP9
或 $UR10
。
有关更多信息,请参阅 Visual Studio 调试器寄存器视图。
CUDA Warp 监视
注意
从 NVIDIA Nsight Visual Studio Edition 2020.1 开始,下一代和旧版 CUDA 调试器都支持此功能。
Visual Studio 的本地和全局变量工具窗口一次仅支持查看单个线程中的变量。NVIDIA Nsight™ VSE CUDA 调试器使用当前焦点线程和堆栈帧来评估这些表达式。
旧版调试器的 CUDA Warp 监视工具窗口显示有关单个焦点 Warp 的已评估表达式的信息。
使用 CUDA 调试器 Warp 监视功能
在 Visual Studio 中开始调试您的项目。
在 Visual Studio 中,打开一个基于 CUDA 的项目。
定义至少一个断点。
从 Nsight 菜单中,选择 启动 CUDA 调试(旧版或下一代)。
或者,可以通过以下方式启动此调试会话
右键单击“解决方案资源管理器”中的项目,然后选择 调试 子菜单。
单击 Nsight CUDA 调试工具栏中的关联图标。
在 Nsight 连接 下拉列表中选择关联项。
您的应用程序启动,并且 CUDA 旧版调试器启动。
暂停执行,允许应用程序运行到断点,或者在未启用断点的情况下设置断点。
从 Nsight 菜单中,选择 窗口 > CUDA Warp 监视。
选择适当的 Warp 监视窗口。
选择后,您将看到一个 Warp 监视窗口,用户可以在其中添加自己的表达式进行监视。
当 CUDA 调试器通过命中断点或异常(例如,来自 CUDA 内存检查器)在内核中停止时,将评估表达式。
可以从 Warp 监视 上下文菜单中编辑表达式,方法是右键单击工具窗口。
注意
下一代 CUDA 调试器未提供此上下文菜单。
此处显示的功能包括以下内容
添加监视 — 向“监视”窗口添加新表达式。(您可以使用 F2 编辑当前列中的表达式。)
复制列 — 这会将元素复制到剪贴板,以便将其粘贴到另一个文档中(例如,电子表格)。
删除监视 / 全部清除 — 删除当前表达式,或删除已输入的所有表达式。
十六进制显示 — 此菜单项控制 Visual Studio 全局十六进制显示设置。它与 Visual Studio 的“监视”、“局部变量”和“自动”窗口中使用的设置相同。
CUDA 焦点可以通过以下四个工具窗口之一进行更改
CUDA 焦点选择器
CUDA 信息页面
“下一个/上一个 Warp”命令
暂停事件
当当前 CUDA 焦点更改时,视图会更新,并且始终显示包含当前焦点线程的 Warp。
示例场景
示例:发散 Warp 监视
在此场景中,通道的 PC 与焦点通道的 PC 不同。与焦点发散的通道具有灰色背景。
注意
请注意,这与非活动通道不同。您可以更改为非活动通道,其他通道将显示为发散。
示例 1. 成功评估的示例,在通道 16 处发散。在此图中,焦点是通道 16。
示例 2. 更改为不同的焦点会显示其他通道与焦点发散。(这通过反转白色和灰色背景来表示。) 在此实例中,通道更改为 0,因此通道 16-31 现在为灰色;PC 位于第 54 行。
示例 3. 在这里,您可以看到,变量可能在某些通道中有效,但在其他通道中无效。
示例:错误类型
Warp 监视中可能由于各种原因而发生错误。例如
通道可能位于不同的 PC;因此,给定表达式的评估范围可能会有所不同。
影子变量的类型可能与焦点通道的类型不同。
示例 4. 这说明了影子变量错误。在这里,焦点变量的类型为
float
,但它正在遮蔽一个 int
。
错误的另一个常见原因是当通道与焦点通道发散并且位于不同的堆栈帧中时。CUDA Warp 监视功能不会在其他堆栈帧中进行评估。
示例 5. 这说明了堆栈帧错误。在这里,帧“SubFrame”在偶数通道中不存在,因此无法评估。
GPU Core Dump 文件
注意
注意:旧版 CUDA 调试器不支持使用 OptiX 应用程序核心转储进行调试。
NVIDIA Nsight™ VSE 支持调试 CUDA GPU core dump。要使用此功能,有 3 个要求
需要设置系统环境变量
CUDA_ENABLE_COREDUMP_ON_EXCEPTION=1
。需要在 CUDA 项目属性中启用“生成 GPU 调试信息”,并且应用程序需要使用命令行参数
-G
进行编译。指定的 GPU CUDA 调试器支持在其上生成 core dump 的 GPU 架构。
旧版 CUDA 调试器 支持 Maxwell GPU,但请注意,在 WDDM 或 MCDM 驱动程序模式下不支持在 Maxwell 设备上生成 core dump。
下一代 CUDA 调试器 支持 Pascal 和更高版本的 GPU。
如果在 WSL 上运行,则必须将注册表项
>HKEY_LOCAL_MACHINE\SOFTWARE\NVIDIA Corporation\GPUDebugger\EnableInterface
设置为(DWORD) 1
。
GPU core dump 将在当前目录中生成为 *.nvcudmp
文件。在 Visual Studio 中,当前目录通过项目设置进行设置:“项目属性”>“调试”>“工作目录”。使用 $(OutDir)
将指定应用程序可执行目录。请注意,应用程序也可能更改工作目录。如果您未使用 NSIGHT_CUDA_DEBUGGER=1
使进程可附加 CUDA,则可以使用 CUDA_COREDUMP_FILE
环境变量指定 .nvcudmp
文件的不同位置和名称,可以选择使用以下格式说明符:%p
(PID);%h
(主机名);%t
(时间戳)。
您可以在 Visual Studio 中打开此生成的文件(或先前生成的 core dump 文件),可以从 文件 > 打开 菜单中打开,也可以将其拖放到 Visual Studio 中。

这将向您显示一个只读视图,其中包含三个可折叠部分中的原始信息:dump 摘要、寄存器和可见的 CUDA 设备。
注意
目前,NVIDIA Nsight™ VSE 仅支持 GPU core dump;任何生成的 CPU core dump 信息都将被忽略。
从此摘要视图中,您可以启动以下任一项
下一代 CUDA 调试器,用于在 Pascal 或更高版本的 GPU 上生成的 core dump 文件。
旧版 CUDA 调试器,用于在 Pascal 或更早版本的 GPU 上生成的 core dump 文件。
需要使用设置为目标应用程序的 GPU core dump 文件启动相应的 CUDA 调试器。请注意,这仅适用于本地调试配置,因此 Nsight Monitor 必须在本地计算机上运行。这将允许您查看 CUDA 调试信息,这些信息可以提供更多诊断详细信息,例如
导致致命错误的异常。
设备列表及其信息,例如 ID、名称、描述、SM、SM 数量、Warp 数量、通道数量。
PC 的地址。
寄存器列表及其值。
异常命中的设备、网格、块、Warp 和线程。
通知
通知
所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“资料”,单独或合并)均按“原样”提供。NVIDIA 不对资料作出任何明示、暗示、法定或其他方面的保证,并明确声明不承担所有关于不侵权、适销性和针对特定用途适用性的默示保证。
所提供的信息据信是准确和可靠的。但是,NVIDIA 公司对使用此类信息造成的后果或因使用此类信息而可能导致的侵犯第三方专利或其他权利的行为不承担任何责任。无论是暗示还是其他方式,均未授予 NVIDIA 公司任何专利权项下的许可。本出版物中提及的规格如有更改,恕不另行通知。本出版物取代并替换以前提供的所有其他信息。未经 NVIDIA 公司明确书面批准,NVIDIA 公司产品不得用作生命支持设备或系统中的关键组件。
商标
NVIDIA 和 NVIDIA 徽标是 NVIDIA 公司在美国和其他国家/地区的商标或注册商标。其他公司和产品名称可能是与其关联的各自公司的商标。