4. Nsight Compute CLI
Nsight Compute CLI 的用户指南。
4.1. 简介
NVIDIA Nsight Compute CLI (ncu) 提供了一种非交互式方法,用于从命令行分析应用程序的性能。它可以直接在命令行上打印结果,或者将结果存储在报告文件中。它还可以用于简单地启动目标应用程序(详见 常规 部分),然后在之后附加 NVIDIA Nsight Compute 或另一个 ncu 实例。
对于从 nvprof 迁移到 NVIDIA Nsight Compute 的用户,请另行参阅 Nvprof 迁移指南,以比较功能和工作流程。
4.2. 快速入门
使用命令行性能分析器启动目标应用程序
命令行性能分析器启动目标应用程序,检测目标 API,并为指定的内核收集性能分析结果。CLI 可执行文件名为 ncu。此名称的快捷方式位于 NVIDIA Nsight Compute 安装的基本目录中。实际可执行文件位于 Windows 上的
target\windows-desktop-win7-x64
文件夹或 Linux 上的target/linux-desktop-glibc_2_11_3-x64
文件夹中。默认情况下,NVIDIA Nsight Compute 安装在 Linux 上的/usr/local/cuda-<cuda-version>/NsightCompute-<version>
和 Windows 上的C:\Program Files\NVIDIA Corporation\Nsight Compute <version>
中。要为目标应用程序中所有内核启动收集
basic
集,请启动$ ncu -o profile CuVectorAddMulti.exe
应用程序在检测模式下运行,并且对于每次内核启动,都会创建一个性能分析结果。默认情况下,结果会写入 profile.nsight-cuprof。来自计算性能分析器的每个输出都以
==PROF==
开头。其他行是来自应用程序本身的输出。对于每个已分析的内核,都会显示内核函数的名称和数据收集的进度。要收集所有请求的性能分析信息,可能需要多次重放内核。在性能分析完成后,会显示每个内核的总重放次数。[Vector addition of 1144477 elements] ==PROF== Connected to process 5268 Copy input data from the host memory to the CUDA device CUDA kernel launch A with 4471 blocks of 256 threads ==PROF== Profiling "vectorAdd_A" - 0: 0%....50%....100% - 46 passes CUDA kernel launch B with 4471 blocks of 256 threads ==PROF== Profiling "vectorAdd_B" - 1: 0%....50%....100% - 46 passes Copy output data from the CUDA device to the host memory Done ==PROF== Disconnected from process 5268 ==PROF== Report: profile.ncu-rep
自定义数据收集
可以使用选项来指定应为哪些内核收集数据。
-c
限制了收集的内核启动次数。-s
在数据收集开始之前跳过给定数量的内核。-k
允许您通过正则表达式匹配内核名称来筛选内核。--kernel-id
允许您按上下文、流、名称和调用筛选内核,类似于 nvprof。要限制为每次内核启动应收集的内容,请使用
--section
按标识符指定确切的 *.section(文件)。每个 section 文件定义了一组要收集的指标,这些指标在逻辑上分组,以解决特定的性能问题。默认情况下,会收集与basic
集关联的 section。使用--list-sets
查看当前可用集的列表。使用--list-sections
查看当前可用 section 的列表。预定义 section 文件的默认搜索目录和位置也称为sections/
。有关更多详细信息,请参阅性能分析指南。或者,您可以使用
--metrics
收集一组单独的指标。可以使用--query-metrics
查询可用的指标。有关指标的命名约定和结构的说明,请参阅指标结构。NVIDIA Nsight Compute 中的大多数指标都使用基本名称和各种后缀命名,例如 sm__throughput.avg.pct_of_peak_sustained_elapsed。基本名称是 sm__throughput,后缀是 avg.pct_of_peak_sustained_elapsed。这是因为大多数指标都遵循相同的结构并具有相同的后缀集。在选择用于性能分析的指标时,您需要将基本名称或完整名称传递给 NVIDIA Nsight Compute。使用
--query-metrics-mode suffix --metrics <metrics list>
查看所选指标的完整名称。某些其他指标不遵循这种结构化的命名方式。它们记录在指标参考中。
更改命令行输出
默认情况下,临时文件用于存储性能分析结果,数据会打印到命令行。要永久存储性能分析器报告,请使用
-o
指定输出文件名。除了将结果存储在报告文件中,命令行性能分析器还可以使用不同的页面打印结果。这些页面对应于 UI 报告中的相应页面。默认情况下,如果没有指定显式输出文件,则会打印详细信息页面。要选择其他页面或除了存储在显式文件中之外还进行打印,请使用
--page=<Page>
命令。目前,支持以下页面:details, raw, source
。使用
--csv
使任何输出都以逗号分隔,以便于进一步处理。有关更多选项(例如摘要视图),请参阅控制台输出。在 UI 中打开报告
UI 可执行文件名为 ncu-ui。此名称的快捷方式位于 NVIDIA Nsight Compute 安装的基本目录中。实际可执行文件位于 Windows 上的
host\windows-desktop-win7-x64
文件夹或 Linux 上的host/linux-desktop-glibc_2_11_3-x64
文件夹中。在 UI 窗口中,关闭启动活动对话框,然后通过文件 > 打开打开报告文件,方法是将报告文件拖到 NVIDIA Nsight Compute 中。您还可以将报告文件指定为可执行文件的命令行参数,即
ncu-ui <MyReport.ncu-rep>
。或者,当在具有主机平台支持的平台上使用 NVIDIA Nsight Compute CLI 时,可以直接将--open-in-ui
与 ncu 一起使用,以在用户界面中打开收集的报告。报告在新文档窗口中打开。有关报告的更多信息,请参阅性能分析器报告,了解如何通过 NVIDIA Nsight Compute 收集性能分析信息。
4.3. 用法
4.3.1. 模式
模式会更改命令行性能分析器的基本行为。根据选择的模式,可以使用不同的命令行选项。例如,如果选择了附加模式,则启动无效。
启动并附加: 目标应用程序在本地系统上使用该工具的注入库启动。根据选择的性能分析选项,将对应用程序中选定的内核进行性能分析,并将结果打印到控制台或存储在报告文件中。一旦目标应用程序完成或崩溃,并且一旦所有结果都已处理,该工具就会退出。
这是默认模式,也是唯一支持在选定平台上分析子进程的模式。
启动: 目标应用程序在本地系统上使用该工具的注入库启动。一旦达到第一个拦截的 API 调用(通常是
cuInit()
),所有应用程序线程都会被挂起。现在,应用程序希望工具附加以进行性能分析。您可以使用 NVIDIA Nsight Compute 或使用命令行性能分析器的附加模式进行附加。附加: 该工具尝试连接到先前使用 NVIDIA Nsight Compute 或使用命令行性能分析器的启动模式启动的目标应用程序。该工具可以附加到本地系统上的目标,也可以使用远程连接。
4.3.2. 多进程支持
NVIDIA Nsight Compute CLI 支持在以下平台上分析多进程应用程序:x86_64 Windows、x86_64 Linux、DRIVE OS Linux、DRIVE OS QNX、PowerPC。有关如何启用此功能,请参阅启动选项。
在 x86_64 Windows 上,NVIDIA Nsight Compute CLI 默认支持分析从 32 位应用程序启动的 64 位进程。在 x86_64 Linux 上,从 32 位应用程序启动需要启用 support-32bit
选项,并且必须在您的系统上安装所需的 32 位库。在 DRIVE OS Linux、DRIVE OS QNX 和 PowerPC 上,不支持跟踪 32 位应用程序。在任何平台上都不支持分析 32 位进程。
NVIDIA Nsight Compute CLI 可用于分析使用 mpirun
命令启动的应用程序。
要在节点上分析所有 rank 并将所有性能分析数据存储在单个报告文件中
ncu --target-processes all -o <report-name> mpirun [mpi arguments] <app> [app arguments]
要分析多节点提交,每个节点可以使用一个 NVIDIA Nsight Compute CLI 实例。确保您为每个 rank 指定唯一的报告文件。
mpirun [mpi arguments] ncu -o report_%q{OMPI_COMM_WORLD_RANK} <app> [app arguments]
要分析单个 rank,可以使用包装脚本。以下脚本(名为“wrap.sh”)仅分析 rank 0
#!/bin/bash if [[ $OMPI_COMM_WORLD_RANK == 0 ]]; then ncu -o report_${OMPI_COMM_WORLD_RANK} --target-processes all "$@" else "$@" fi
然后执行
mpirun [mpi arguments] ./wrap.sh <app> [app arguments]
4.3.3. 输出页面
命令行性能分析器支持使用各种页面将结果打印到控制台。每个页面在 NVIDIA Nsight Compute 的性能分析器报告中都有对应的页面。在命令行性能分析器中,它们经过轻微调整以适合控制台输出。要选择页面,请使用 --page
选项。默认情况下,使用详细信息页面。请注意,如果未使用 --page
但使用了 --export
,则不会将任何结果打印到控制台。
详细信息: 此页面表示 NVIDIA Nsight Compute 的详细信息页面。对于每次分析的内核启动,每个收集的指标都作为 section 打印为三列表格,后跟应用于此 section 的任何规则结果。未与任何 section 关联的规则结果会在内核的 section 之后打印。
第一个 section 表格列显示指标名称。如果指标在 section 中被赋予标签,则会改用该标签。第二列显示指标单位(如果可用)。第三列显示单位值。指标单位和值都会自动调整到最合适的数量级。默认情况下,仅显示 section 标头中定义的指标。可以通过在命令行中传递
--details-all
选项来更改此设置。某些指标将显示多个值,以“;”分隔,例如 memory_l2_transactions_global Kbytes 240; 240; 240; 240; 240。这些是实例指标,每个表示的实例都有一个值。实例可以是流式多处理器、汇编源代码行等。
原始数据: 此页面表示 NVIDIA Nsight Compute 的原始数据页面。对于每次分析的内核启动,每个收集的指标都将打印为三列表格。除了来自 section 的指标外,这还包括自动收集的指标,例如设备属性和内核启动信息。
第一列显示指标名称。第二列和第三列分别显示指标单位和值。指标单位和值都会自动调整到最合适的数量级。不包括未解析的 regex:、group: 或 breakdown: 指标。
4.3.4. 性能分析导入
使用 --import
选项,可以将保存的报告导入到命令行性能分析器中。使用此标志时,大多数其他选项都不可用,但某些结果筛选选项除外。它们在性能分析选项表中标记为如此。
4.3.5. 筛选后的性能分析导出
将 --import
和 --export
选项以及支持的筛选选项一起使用,您可以将所需的结果从一个报告导出到另一个报告。此处也支持大多数可与单独的 --import
一起使用的筛选性能分析选项,但 --metrics
和 --section
除外。
4.3.6. 指标和单位
在可用且适用时,指标会与其单位一起显示。这是为了明确指标是否表示周期、线程、字节/秒等等。
默认情况下,单位会自动缩放,以便指标值以合理的数量级显示。单位使用其 SI 系数进行缩放,即,基于字节的单位使用 1000 的因子和前缀 K、M、G 等进行缩放。基于时间的单位也使用 1000 的因子以及前缀 n、u 和 m 进行缩放。可以使用命令行选项更改此缩放,有关详细信息,请参阅控制台输出选项。
4.3.7. NVTX 过滤
--nvtx-include <configuration> --nvtx-exclude <configuration>
您可以多次使用这两个选项,提及所有 --nvtx-include
配置,然后提及所有 --nvtx-exclude
配置。NVTX 过滤需要 --nvtx
选项。
NVTX 范围有两种类型:NvtxRangeStart/End 和 NvtxRangePush/Pop。下面简要介绍了这两种类型的配置语法。范围和域名称都可以包含空格。请注意,以下示例中的“Domain”和“range”仅用于说明目的,并非标记域或范围名称所必需。
Push-Pop 范围
量词
描述
示例
/
范围名称之间的分隔符。当仅给出一个范围名称时,必须附加分隔符以指示这是指 push/pop 范围。
A_range/
A_range/B 范围
A_range/\*/B 范围
[
范围位于堆栈底部
[A_range
[A_range/+/范围 Z
]
范围位于堆栈顶部
范围 Z]
范围 C/\*/范围 Z]
两个其他范围之间只有一个 B 范围
B 范围/+/范围 D
*
两个其他范围之间有零个或多个范围
B 范围/\*/范围 Z
@
指定域名称。如果未提及,则假定为 <默认域>
Domain-A@A_range
Domain B@A_range/\*/范围 Z]
包括包装在“<default-domain>”的 push/pop 范围“A_range”内的内核
ncu --nvtx --nvtx-include "A_range/" CuNvtx.exe
包括包装在“Domain-A”的 push/pop 范围“A_range”内的内核
ncu --nvtx --nvtx-include "Domain-A@A_range/" CuNvtx.exe
包括包装在“<default domain>”的 push/pop 范围“A_range”内的内核,其中“A_range”位于堆栈底部
ncu --nvtx --nvtx-include "[A_range" CuNvtx.exe
包括包装在“<default domain>”的 push/pop 范围“A_range”和“B range”内的内核,它们之间有零个或多个范围
ncu --nvtx --nvtx-include "A_range/*/B range" CuNvtx.exe
排除包装在“<default domain>”的 push/pop 范围“A_range”和“B range”内的内核,它们之间有零个或多个范围
ncu --nvtx --nvtx-exclude "A_range/*/B range" CuNvtx.exe
仅包括包装在“<default domain>”的 push/pop 范围“A_range”内但不包括堆栈顶部的“B range”内的内核
ncu --nvtx --nvtx-include "A_range/" --nvtx-exclude "B range]" CuNvtx.exe
Start-End 范围
量词
描述
示例
,
范围名称之间的分隔符
A_range,B 范围
B 范围,A_range,范围 C
@
指定域名称。如果未提及,则假定为 <默认域>
Domain-A@A_range
Domain B@B 范围,范围 Z
包括包装在“Domain-A”的 start/end 范围“A_range”内的内核
ncu --nvtx --nvtx-include "Domain-A@A_range" CuNvtx.exe
包括包装在“<default domain>”的 start/end 范围“A_range”和“B range”内的内核
ncu --nvtx --nvtx-include "A_range,B range" CuNvtx.exe
包括包装在“<default domain>”的 start/end 范围“A_range”或“B range”内的内核
ncu --nvtx --nvtx-include "A_range" --nvtx-include "B range" CuNvtx.exe
包括所有内核,但包装在“<default domain>”的 start/end 范围“A_range”内的内核除外
ncu --nvtx --nvtx-exclude "A_range" CuNvtx.exe
仅包括包装在“<default domain>”的 start/end 范围“B range”内而不是“A_range”内的内核
ncu --nvtx --nvtx-include "B range"--nvtx-exclude "A_range" CuNvtx.exe
正则表达式支持
NvtxRangeStart/End 和 NvtxRangePush/Pop 这两种类型的配置语法相同。此外,要使用正则表达式,请遵循以下语法。
提供前缀“regex:”以将 nvtx 配置视为正则表达式。
ncu --nvtx --nvtx-include "regex:Domain[A-Z]@Range[0-9]/" CuNvtx.exe
分析包装在域为匹配正则表达式“Domain[A-Z]”的 push/pop 范围(正则表达式为“Range[0-9]”)内的内核。仅当“[”或“]”分别位于范围部分的开头或结尾时,才为配置的范围部分提供前缀“/”到“[”或“]”。这是必需的,以便 NCU 可以区分“[”或“]”是正则表达式的一部分还是表示堆栈的顶部/底部。
ncu --nvtx --nvtx-include "regex:[0-9]domainA@/[0-9]rangeA,RangeC[0-9/]" CuNvtx.exe
分析包装在域为匹配正则表达式“[0-9]domainA”的 start/end 范围(正则表达式为“[0-9]rangeA”和“RangeC[0-9]”)内的内核。如果任何量词是域/范围名称的一部分,则需要使用“\\”或“\”作为前缀。对于“$”量词,仅“\\”前缀有效。
其他信息
--nvtx-include "DomainA@RangeA,DomainB@RangeB" //Not a valid config
在单个 NVTX 配置中,可以指定与单个域相关的多个范围。不支持在单个 NVTX 配置中提及来自不同域的范围。
--nvtx-include "A_range\[i\]"
量词
@ , [ ] / * +
(包括正则表达式量词)可以在域/范围名称中使用前缀“\”。分析应用程序中包装在“<default domain>”的“A_range[i]”内的内核。--nvtx-include "A_range" //Start/End configuration --nvtx-inlcude "A_range/" //Push/Pop configuration --nvtx-inlcude "A_range]" //Push/Pop configuration
如果域/范围名称包含“\”,则需要在配置中提供“\\\\”。
不要在任何量词之前使用“\\\\”。
对于 Push/Pop 配置,如果仅包含/排除单个范围而不指定堆栈帧位置“[”或“]”,请在末尾使用“/”量词。
--nvtx-include "A_range/*/B range"
提及 Push/Pop 配置的顺序很重要。在上面的示例中,“A_range”应位于范围堆栈中的“B range”下方,以便分析内核。
NVTX 过滤遵循 cudaProfilerStart() 和 cudaProfilerStop()。不支持没有名称的范围。
4.3.8. 配置文件
--config-file on/off
选项,可以启用或禁用从配置文件解析参数。--config-file-path <path>
选项,可以覆盖配置文件的默认路径和名称。config.ncu-cfg
在当前工作目录、Linux 上的 $HOME/.config/NVIDIA Corporation
和 Windows 上的 %APPDATA%\NVIDIA Corporation\
中搜索。如果找到有效的配置文件,ncu 会解析该文件并将任何命令行参数初始化为文件中设置的值。如果在当前调用期间也显式设置了相同的命令行参数,则以后者为准。可以在各种通用模式下设置参数,ncu 命令行参数用于确定需要从配置文件中解析哪个通用模式。有关更多详细信息,请参见下表。
命令行参数 |
通用模式 |
---|---|
ncu –mode launch-and-attach CuVectorAddMulti.exe |
启动并附加 |
ncu –mode launch CuVectorAddMulti.exe |
启动 |
ncu –mode attach |
附加 |
ncu –list-sets、ncu –list-sections、ncu –list-rules 和 ncu –list-metrics |
列表 |
ncu –query-metrics |
查询 |
ncu -i <MyReport.ncu-rep> |
导入 |
这些通用模式应使用类似于 INI 的语法在配置文件中定义,如下所示
[<general-mode>]
<parameter>=<value>
;<comments>
用法示例
[Launch-and-attach]
-c = 1
--section = LaunchStats, Occupancy
[Import]
--open-in-ui
-c = 1
--section = LaunchStats, Occupancy
通过此配置,每当在 launch-and-attach
模式下分析应用程序时,ncu 都会解析在 [Launch-and-attach]
块下设置的参数。以相同的方式,每当导入报告时,都会解析在 [Import]
块下设置的参数。如果存在一组对每种模式通用的参数,则可以将不同的模式组合在一起。上面显示的示例可以在组合两种模式后重写为
[Launch-and-attach, import]
-c = 1
--section = LaunchStats, Occupancy
[Import]
--open-in-ui
其他要点
诸如
--open-in-ui
之类的选项不需要设置任何值。这些选项不应传递任何值。诸如
--section
之类的选项可以在命令行中多次传递。这些选项应仅在通用模式下编写一次,所有必需的值都用逗号分隔,如下所示。显式设置这些选项的值不会覆盖配置文件值。相反,所有值都将组合在一起并设置为该选项。[<general-mode>] <parameter>=<value1>,<value2>,...
4.3.9. 内核重命名
在某些情况下,使用内核函数或重整名称很难区分结果。但是,反重整名称可能非常长且难以理解。为了处理这种情况,内核反重整名称在某种程度上会自动简化。要查看原始内核反重整名称,请使用 --rename-kernels off
选项禁用内核重命名。如果简化的内核反重整名称被证明没有用,则可以通过配置文件重命名它。内核重命名配置文件应为 YAML 文件,并以以下格式编写
-
- Original: mergeRanksAndIndicesKernel(unsigned int *, unsigned int *, unsigned int, unsigned int, unsigned int)
- Renamed: Merge Rank Kernel
-
- Original: void mergeSortSharedKernel<(unsigned int)1>(unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int)
- Renamed: Merge Sort Kernel
ncu-kernel-renames.yaml
的搜索方式与配置文件的搜索方式类似。--rename-kernels-export on
选项将报告中的反重整名称导出到配置文件,并映射以重命名它们。--rename-kernels-path <path>
选项,可以覆盖导入重命名名称和导出时使用的文件的默认路径和名称。--kernel-name
和 --kernel-id
选项筛选报告中的内核。4.4. 命令行选项
对于长命令行选项,传递唯一的初始子字符串可能就足够了。
4.4.1. 常规
选项 |
描述 |
默认 |
---|---|---|
h,help |
显示帮助消息 |
|
v,version |
显示版本信息 |
|
mode |
选择与目标应用程序交互的模式
|
启动并附加 |
p,port |
用于连接到 |
49152 |
max-connections |
用于连接到目标应用程序的最大端口数 |
64 |
config-file |
使用 config.ncu-cfg 配置文件设置参数。在当前工作目录、“$HOME/.config/NVIDIA Corporation”(在 Linux 上)和“%APPDATA%\NVIDIA Corporation\”(在 Windows 上)中搜索。 |
on |
config-file-path |
覆盖配置文件的默认路径。 |
4.4.2. 启动
选项 |
描述 |
默认 |
---|---|---|
check-exit-code |
检查应用程序退出代码,如果退出代码不是 0,则打印错误。如果设置了此选项,则当退出代码不是 0 时, |
yes |
injection-path-64 |
覆盖注入库的默认路径。注入库供工具用于拦截相关 API(如 CUDA 或 NVTX)。 |
|
preload-library |
在注入库之前,预先加载要由应用程序加载的共享库。可以多次指定此选项,库将按照指定的顺序加载。 |
|
call-stack |
启用 CPU 调用堆栈收集。 |
false |
call-stack-type |
设置应收集的调用堆栈类型。可以指定多种类型。暗示 –call-stack。 请注意,Python 调用堆栈收集需要 CPython 版本 3.9 或更高版本。 |
native 示例
|
nvtx |
为工具启用 NVTX 支持。 |
false |
target-processes |
选择要分析的进程。可用模式包括
|
all |
target-processes-filter |
设置逗号分隔的表达式以筛选要分析的进程。
进程的可执行文件名部分将在匹配项中考虑。筛选器的处理在第一个匹配项处停止。如果指定了任何肯定筛选器,则不会对任何与肯定筛选器不匹配的进程进行性能分析。 |
示例
|
support-32bit |
支持分析从 32 位应用程序启动的进程。此选项仅在 x86_64 Linux 上可用。在 Windows 上,默认启用跟踪 32 位应用程序。 |
no |
null-stdin |
启动应用程序时使用 ‘/dev/null’ 作为其标准输入。这避免了应用程序从标准输入读取时被 |
false |
4.4.3. Attach
选项 |
描述 |
默认 |
---|---|---|
hostname |
设置用于连接到目标应用程序正在运行的机器的主机名或 IP 地址。当附加到本地目标应用程序时,请使用 127.0.0.1。 |
127.0.0.1 |
4.4.4. Profile
选项 |
描述 |
默认值/示例 |
---|---|---|
devices |
列出要启用性能分析的 GPU 设备,以逗号分隔。1 |
所有设备 示例
|
filter-mode |
设置内核启动的过滤模式。可用模式
|
global |
kernel-id |
设置用于匹配内核的标识符。如果内核与标识符不匹配,则在性能分析中将被忽略。 标识符必须采用以下格式:context-id:stream-id:[name-operator:]kernel-name:invocation-nr
如果上下文/流 ID 是正数,则将严格对照 CUDA 上下文/流 ID 进行匹配。否则,它将被视为正则表达式,并对照使用 NVTX 库指定的上下文/流名称进行匹配。1 |
示例
|
k,kernel-name |
设置用于匹配内核名称的表达式。
如果内核名称或提供的表达式不匹配,则在性能分析中将被忽略。1 |
示例
|
kernel-name-base |
设置
|
function |
rename-kernels |
对内核反混淆名称执行简化。使用配置文件重命名反混淆名称。有关更多详细信息,请参阅 内核重命名。 |
on |
rename-kernels-export |
将报告中的反混淆名称导出到新文件,并指定用于重命名的映射。使用 |
off |
rename-kernels-path |
覆盖配置文件的默认路径,该文件应在导入重命名的内核或导出反混淆名称时使用。仅在使用 |
|
c,launch-count |
限制分析的内核启动次数。计数仅针对与内核过滤器匹配的启动递增。1 |
|
s,launch-skip |
设置开始分析内核之前要跳过的内核启动次数。该数字仅考虑与内核过滤器匹配的启动。1 |
0 |
launch-skip-before-match |
设置开始分析之前要跳过的内核启动次数。计数针对所有启动递增,无论内核过滤器如何。1 |
0 |
range-filter |
过滤器,用于分析匹配的 NVTX 范围或通过 cu(da)ProfilerStart/Stop API 创建的开始/停止范围的指定实例。 以 [yes/no/on/off]:[start/stop range instance(s)]:[NVTX range instance(s)] 格式指定
|
示例
|
kill |
当分析完请求的 –launch-count 时,终止目标应用程序。允许的值
|
no |
replay-mode |
用于多次重放内核启动以收集所有请求的性能分析数据的机制
|
kernel |
app-replay-buffer |
应用程序重放缓冲区位置。
|
file |
app-replay-match |
应用程序重放内核匹配策略。对于所有选项,内核都基于每个进程和每个设备 (GPU) 进行匹配。以下选项用于更详细地配置应用的策略。
|
grid |
app-replay-mode |
应用程序重放内核匹配模式
|
balanced |
range-replay-options |
范围重放选项,以逗号分隔。支持以下选项
|
none |
graph-profiling |
CUDA 图形性能分析模式
|
node |
list-sets |
列出在搜索到的 section 文件夹中找到的所有 section 集并退出。对于每个集,都会显示关联的 section,以及作为此集一部分收集的指标的估计数量。此数字可用作估计此集的每个内核启动的相对性能分析开销。 |
|
set |
要收集的 section 集的标识符。如果未指定,则收集 |
如果未给出 |
list-sections |
列出在搜索到的 section 文件夹中找到的所有 section 并退出。 |
|
section |
添加要收集的 section 标识符,方式如下
当与 |
如果未给出 |
section-folder |
为 |
如果未给出 |
section-folder-recursive |
为 |
如果未给出 |
list-rules |
列出在搜索到的 section 文件夹中找到的所有规则并退出。 |
|
apply-rules |
将活动和适用的规则应用于每个性能分析结果。使用
|
yes |
rule |
添加要应用的规则标识符。暗示 |
如果未给出 |
import-source |
如果可从 -lineinfo 获得,则将相关的 CUDA 源文件永久导入到报告中。允许的值
使用 |
no |
source-folders |
添加逗号分隔的递归搜索路径,用于查找要导入到报告中的缺失 CUDA 源文件。 |
|
list-metrics |
列出从活动 section 收集的所有指标。如果使用 |
|
query-metrics |
查询系统上设备的可用指标。使用 |
|
query-metrics-mode |
设置查询指标的模式。暗示
|
base |
query-metrics-collection |
设置要查询的指标收集类型。暗示 |
profiling |
metrics |
指定要分析的所有指标,以逗号分隔。如果未给出 传递给此选项的名称支持以下前缀
不支持组合多个前缀。 如果指标需要后缀才能有效,并且未使用 导入报告时,不支持 使用 |
|
disable-extra-suffixes |
禁用收集所有指标的额外后缀(avg、min、max、sum)。仅收集明确指定的指标。 |
|
list-chips |
列出所有支持的芯片,这些芯片可以与 |
|
chips |
指定用于查询指标的芯片,以逗号分隔。 |
示例
|
profile-from-start |
设置是否应从应用程序启动时开始分析。允许的值
|
yes |
disable-profiler-start-stop |
禁用性能分析器启动/停止。启用后, |
|
quiet |
禁止所有性能分析输出。 |
|
verbose |
使性能分析器输出更详细。 |
|
cache-control |
控制性能分析期间 GPU 缓存的行为。允许的值
|
all |
clock-control |
控制性能分析期间 GPU 时钟的行为。允许的值
|
base |
pipeline-boost-state |
控制 Tensor Core 提升状态。建议设置稳定的 Tensor Core 提升以进行应用程序性能分析,从而确保可预测的运行到运行性能。允许的值
|
stable |
nvtx-include |
||
nvtx-exclude |
||
nvtx-push-pop-scope |
指定推入-弹出范围的范围。
|
thread |
4.4.5. PM Sampling
这些选项适用于 PM 采样。有关 Warp 状态采样中使用的选项,请参阅 此处。
选项 |
描述 |
默认 |
---|---|---|
pm-sampling-interval |
以周期或纳秒为单位设置 PM 采样间隔(取决于架构),或者在为 0 时动态确定。 |
0 (自动) |
pm-sampling-buffer-size |
以字节为单位设置设备端 PM 采样分配的大小,或者在为 0 时动态确定。 |
0 (自动) |
pm-sampling-max-passes |
设置用于 PM 采样的最大传递次数,或者在为 0 时动态确定。 |
0 (自动) |
4.4.6. Warp Sampling
这些选项适用于 Warp 状态采样。有关 PM 采样中使用的选项,请参阅 此处。
选项 |
描述 |
默认 |
---|---|---|
warp-sampling-interval |
在 [0..31] 范围内设置采样周期。实际频率为 2 ^ (5 + 值) 个周期。如果设置为 ‘auto’,则性能分析器会尝试自动确定高采样频率,而不会跳过样本或使输出缓冲区溢出。 |
auto |
warp-sampling-max-passes |
设置用于采样的最大传递次数(有关性能分析开销的更多详细信息,请参阅 内核性能分析指南)。 |
5 |
warp-sampling-buffer-size |
以字节为单位设置设备端样本分配的大小。 |
32*1024*1024 |
4.4.7. File
选项 |
描述 |
默认 |
---|---|---|
log-file |
将所有工具输出发送到指定文件或标准通道之一。该文件将被覆盖。如果该文件不存在,将创建一个新文件。“stdout” 作为完整文件名表示标准输出通道 (stdout)。“stderr” 作为完整文件名表示标准错误通道 (stderr)。” |
如果未设置 |
o,export |
设置用于写入性能分析报告的输出文件。如果未设置,将使用一个临时文件,该文件稍后将被删除。与 |
如果设置了 |
f,force-overwrite |
强制覆盖所有输出文件。 |
默认情况下,性能分析器不会覆盖现有输出文件,而是显示错误。 |
i,import |
设置用于读取性能分析结果的输入文件。 |
|
open-in-ui |
在 UI 中打开报告,而不是在终端上显示结果。(仅在主机平台上可用) |
|
section-folder-restore |
将库存文件恢复到默认 section 文件夹或随附 –section-folder 选项指定的文件夹。如果操作将覆盖已修改的文件,则需要 –force-overwrite 选项。 |
4.4.8. 控制台输出
选项 |
描述 |
默认 |
---|---|---|
csv |
使用逗号分隔值作为控制台输出。默认情况下,隐含 –print-units base。 |
|
page |
选择要打印控制台输出的报告页面。可用页面有
|
details。如果未给出 |
print-source |
选择源代码视图
指标与源代码的关联在 sass 和 cuda,sass 源代码视图中可用。使用 |
sass |
resolve-source-file |
在 |
|
print-details |
选择应在详细信息页面输出中显示的 section 的哪个部分
替换已弃用的选项 |
header |
print-metric-name |
选择一个选项以在“指标名称”列中显示它
|
label |
print-units |
选择指标单位缩放的模式。可用模式有
|
auto |
print-metric-attribution |
显示绿色上下文结果的指标的归因级别。 |
false |
print-fp |
在控制台输出中将所有数值指标显示为浮点数。 |
false |
print-kernel-base |
设置内核名称输出的基础。有关选项,请参阅 |
demangled |
print-metric-instances |
设置具有实例值的指标的输出模式
|
none |
print-nvtx-rename |
选择如何使用 NVTX 进行重命名
|
none |
print-rule-details |
打印规则结果的附加详细信息,例如触发指标。当前在 CSV 模式下无效。 |
false |
print-summary |
选择摘要输出模式。可用模式有
|
none |
4.4.9. 响应文件
可以通过将 @FileName
添加到命令行来指定响应文件。文件名必须紧跟 @
字符。每个响应文件的内容都将插入到相应的响应文件选项的位置。
4.4.10. 文件宏
使用选项 -o
或 --export
指定的文件名支持以下宏展开。报告文件名中出现的这些宏将被替换为相应的字符序列。除非另有说明,否则宏不能用作文件路径的一部分。
宏 |
描述 |
---|---|
%h |
展开为主机名,即命令行分析器正在运行的计算机的名称。 |
%q{ENV_NAME} |
展开为命令行分析器环境中具有给定名称 |
%p |
展开为命令行分析器的进程 ID。 |
%i |
展开为最低的未使用正整数,以保证生成的文件名尚未使用。此宏在输出文件名中只能使用一次。 |
%% |
展开为输出文件名中的单个 |
4.5. 环境变量
以下环境变量可以在启动 NVIDIA Nsight Compute CLI 或 UI 之前分别设置。
名称 |
描述 |
默认值/值 |
---|---|---|
NV_COMPUTE_PROFILER_DISABLE_STOCK_FILE_DEPLOYMENT |
禁用文件部署到版本化的 默认情况下,使用用户文档文件夹中的版本化目录,以确保考虑到任何潜在的用户更新。 仅在 NVIDIA Nsight Compute CLI 中受支持。 |
默认值:未设置 设置为 “1” 以禁用部署。 |
NV_COMPUTE_PROFILER_LOCAL_CONNECTION_OVERRIDE |
覆盖前端和分析目标进程之间默认的本地连接机制。默认机制取决于平台。只有当本地启动中的前端和目标进程之间存在连接问题时,才应使用此选项。 |
默认值:未设置(使用默认机制) 设置为 “uds” 以使用 Unix 域套接字连接(仅在 Posix 平台上可用)。设置为 “tcp” 以使用 TCP(在所有平台上都可用)。设置为 “named-pipes” 以使用 Windows 命名管道(仅在 Windows 上可用)。 |
NV_COMPUTE_PROFILER_DISABLE_SW_PRE_PASS |
禁用指令级软件 (SW) 指标预先扫描。当收集 SW 补丁指标(例如 |
默认值:未设置(在适用时使用预先扫描) 设置为 “1” 以禁用预先扫描。 |
4.6. Nvprof 迁移指南
本指南提供了从 nvprof 迁移到 NVIDIA Nsight Compute CLI 的技巧。NVIDIA Nsight Compute CLI 尝试提供与 nvprof 尽可能多的功能和使用对等性,但某些功能现在由不同的工具覆盖,并且某些命令行选项已更改其名称或含义。
4.6.1. 跟踪
GPU 和 API 跟踪
NVIDIA Nsight Compute CLI 不支持任何形式的 GPU 或 API 活动跟踪。此功能由 NVIDIA Nsight Systems 覆盖。
4.6.2. 指标收集
查找可用指标
对于 nvprof,您可以使用
--query-metrics
来查看机器上当前设备可用的指标列表。您还可以使用--devices
来过滤要查询的本地设备。对于 NVIDIA Nsight Compute CLI,此功能是相同的。但是,此外,您可以将--query-metrics
与--chip [chipname]
结合使用,以查询任何芯片的可用指标,而不仅仅是当前 CUDA 设备中的指标。请注意,nvprof 和 NVIDIA Nsight Compute CLI 之间的指标名称已更改,并且 GV100 之后(包括 GV100)和之前的芯片之间的指标名称也不同。有关 nvprof 和 NVIDIA Nsight Compute 指标名称的比较,请参阅 指标比较。
在 Volta 及更高版本的 GPU 上,大多数指标都使用基本名称和各种后缀命名,例如 sm__throughput.avg.pct_of_peak_sustained_elapsed。基本名称是 sm__throughput,后缀是 avg.pct_of_peak_sustained_elapsed。这是因为大多数指标都遵循相同的结构并具有相同的后缀集。在为分析选择指标时,您需要将完整名称传递给 NVIDIA Nsight Compute。
为了减少在使用
--query-metrics
时为 Volta 及更高版本的 GPU 显示的指标数量,默认情况下仅显示基本名称。使用--query-metrics-mode suffix --metrics <metrics list>
查看所选指标的完整名称。使用--query-metrics-mode all
直接查看所有指标及其完整名称。选择要收集的指标
在 nvprof 和 NVIDIA Nsight Compute CLI 中,您都可以在
--metrics
选项中指定逗号分隔的指标名称列表。虽然 nvprof 允许您收集列表或所有指标,但在 NVIDIA Nsight Compute CLI 中,您可以使用正则表达式来选择所有可用指标的更精细的子集。例如,您可以使用--metrics "regex:.*"
收集所有指标,或使用--metrics "regex:smsp__cycles_elapsed"
收集所有 “smsp__cycles_elapsed” 指标。选择要收集的事件
您无法在 NVIDIA Nsight Compute CLI 中收集任何事件。
选择要收集的 section
在 nvprof 中,您可以收集单个指标或事件,或预配置的集合(all、analysis-metrics)。NVIDIA Nsight Compute CLI 添加了 section 的概念。section 是一个文件,用于描述要为哪个 GPU 架构或架构范围收集哪些指标。此外,它还定义了这些指标如何在命令行输出或用户界面中显示。这包括在表格、图表、直方图等中进行结构化。
NVIDIA Nsight Compute CLI 附带一组预定义的 section,位于
sections
目录中。您可以检查、修改或扩展这些 section,以及添加新的 section,例如,轻松收集重复的指标集。每个 section 都指定一个唯一的section 标识符,并且在搜索路径中不得有两个具有相同标识符的 section。默认情况下,收集与
basic
section 集关联的 section。您可以使用--section [section identifier]
选项一次或多次选择一个或多个单独的 section。如果未给出--section
选项,但使用了--metrics
,则不会收集任何 section。选择要收集的 section 集
在 nvprof 中,您可以收集单个指标或事件,或预配置的集合(all、analysis-metrics)。NVIDIA Nsight Compute CLI 添加了section 集的概念。section 集定义了一组要一起收集的 section,以便根据所需的分析详细程度实现不同的分析开销。
如果未选择其他选项,则收集
basic
section 集。您可以使用--set [set identifier]
选项一次或多次选择一个或多个集。如果未给出--set
选项,但使用了--section
或--metrics
,则不会收集任何集。
4.6.3. 指标比较
NVIDIA Nsight Compute 使用两组指标,具体取决于分析的 GPU 架构。对于 nvprof 指标,下表列出了 NVIDIA Nsight Compute 中的等效指标(如果可用)。有关 PerfWorks 指标结构的详细说明,请参阅 指标结构。
以 sm__& 开头的指标是按 SM 收集的。以 *smsp__ 开头的指标是按 SM 子分区收集的。但是,所有相应的 nvprof 事件仅按 SM 收集。有关这些术语的更多详细信息,请查看 指标指南。
nvprof 指标 |
PerfWorks 指标或公式 (>= SM 7.0) |
---|---|
achieved_occupancy |
sm__warps_active.avg.pct_of_peak_sustained_active |
atomic_transactions |
l1tex__t_set_accesses_pipe_lsu_mem_global_op_atom.sum + l1tex__t_set_accesses_pipe_lsu_mem_global_op_red.sum |
atomic_transactions_per_request |
(l1tex__t_sectors_pipe_lsu_mem_global_op_atom.sum + l1tex__t_sectors_pipe_lsu_mem_global_op_red.sum) / (l1tex__t_requests_pipe_lsu_mem_global_op_atom.sum + l1tex__t_requests_pipe_lsu_mem_global_op_red.sum) |
branch_efficiency |
smsp__sass_average_branch_targets_threads_uniform.pct |
cf_executed |
smsp__inst_executed_pipe_cbu.sum + smsp__inst_executed_pipe_adu.sum |
cf_fu_utilization |
不适用 |
cf_issued |
不适用 |
double_precision_fu_utilization |
smsp__inst_executed_pipe_fp64.avg.pct_of_peak_sustained_active |
dram_read_bytes |
dram__bytes_read.sum |
dram_read_throughput |
dram__bytes_read.sum.per_second |
dram_read_transactions |
dram__sectors_read.sum |
dram_utilization |
dram__throughput.avg.pct_of_peak_sustained_elapsed |
dram_write_bytes |
dram__bytes_write.sum |
dram_write_throughput |
dram__bytes_write.sum.per_second |
dram_write_transactions |
dram__sectors_write.sum |
eligible_warps_per_cycle |
smsp__warps_eligible.sum.per_cycle_active |
flop_count_dp |
smsp__sass_thread_inst_executed_op_dadd_pred_on.sum + smsp__sass_thread_inst_executed_op_dmul_pred_on.sum + smsp__sass_thread_inst_executed_op_dfma_pred_on.sum * 2 |
flop_count_dp_add |
smsp__sass_thread_inst_executed_op_dadd_pred_on.sum |
flop_count_dp_fma |
smsp__sass_thread_inst_executed_op_dfma_pred_on.sum |
flop_count_dp_mul |
smsp__sass_thread_inst_executed_op_dmul_pred_on.sum |
flop_count_hp |
smsp__sass_thread_inst_executed_op_hadd_pred_on.sum + smsp__sass_thread_inst_executed_op_hmul_pred_on.sum + smsp__sass_thread_inst_executed_op_hfma_pred_on.sum * 2 |
flop_count_hp_add |
smsp__sass_thread_inst_executed_op_hadd_pred_on.sum |
flop_count_hp_fma |
smsp__sass_thread_inst_executed_op_hfma_pred_on.sum |
flop_count_hp_mul |
smsp__sass_thread_inst_executed_op_hmul_pred_on.sum |
flop_count_sp |
smsp__sass_thread_inst_executed_op_fadd_pred_on.sum + smsp__sass_thread_inst_executed_op_fmul_pred_on.sum + smsp__sass_thread_inst_executed_op_ffma_pred_on.sum * 2 |
flop_count_sp_add |
smsp__sass_thread_inst_executed_op_fadd_pred_on.sum |
flop_count_sp_fma |
smsp__sass_thread_inst_executed_op_ffma_pred_on.sum |
flop_count_sp_mul |
smsp__sass_thread_inst_executed_op_fmul_pred_on.sum |
flop_count_sp_special |
不适用 |
flop_dp_efficiency |
smsp__sass_thread_inst_executed_ops_dadd_dmul_dfma_pred_on.avg.pct_of_peak_sustained_elapsed |
flop_hp_efficiency |
smsp__sass_thread_inst_executed_ops_hadd_hmul_hfma_pred_on.avg.pct_of_peak_sustained_elapsed |
flop_sp_efficiency |
smsp__sass_thread_inst_executed_ops_fadd_fmul_ffma_pred_on.avg.pct_of_peak_sustained_elapsed |
gld_efficiency |
smsp__sass_average_data_bytes_per_sector_mem_global_op_ld.pct |
gld_requested_throughput |
不适用 |
gld_throughput |
l1tex__t_bytes_pipe_lsu_mem_global_op_ld.sum.per_second |
gld_transactions |
l1tex__t_sectors_pipe_lsu_mem_global_op_ld.sum |
gld_transactions_per_request |
l1tex__average_t_sectors_per_request_pipe_lsu_mem_global_op_ld.ratio |
global_atomic_requests |
l1tex__t_requests_pipe_lsu_mem_global_op_atom.sum |
global_hit_rate |
(l1tex__t_sectors_pipe_lsu_mem_global_op_ld_lookup_hit.sum + l1tex__t_sectors_pipe_lsu_mem_global_op_st_lookup_hit.sum + l1tex__t_sectors_pipe_lsu_mem_global_op_red_lookup_hit.sum + l1tex__t_sectors_pipe_lsu_mem_global_op_atom_lookup_hit.sum) / (l1tex__t_sectors_pipe_lsu_mem_global_op_ld.sum + l1tex__t_sectors_pipe_lsu_mem_global_op_st.sum + l1tex__t_sectors_pipe_lsu_mem_global_op_red.sum + l1tex__t_sectors_pipe_lsu_mem_global_op_atom.sum) |
global_load_requests |
l1tex__t_requests_pipe_lsu_mem_global_op_ld.sum |
global_reduction_requests |
l1tex__t_requests_pipe_lsu_mem_global_op_red.sum |
global_store_requests |
l1tex__t_requests_pipe_lsu_mem_global_op_st.sum |
gst_efficiency |
smsp__sass_average_data_bytes_per_sector_mem_global_op_st.pct |
gst_requested_throughput |
不适用 |
gst_throughput |
l1tex__t_bytes_pipe_lsu_mem_global_op_st.sum.per_second |
gst_transactions |
l1tex__t_sectors_pipe_lsu_mem_global_op_st.sum |
gst_transactions_per_request |
l1tex__average_t_sectors_per_request_pipe_lsu_mem_global_op_st.ratio |
half_precision_fu_utilization |
smsp__inst_executed_pipe_fp16.avg.pct_of_peak_sustained_active |
inst_bit_convert |
smsp__sass_thread_inst_executed_op_conversion_pred_on.sum |
inst_compute_ld_st |
smsp__sass_thread_inst_executed_op_memory_pred_on.sum |
inst_control |
smsp__sass_thread_inst_executed_op_control_pred_on.sum |
inst_executed |
smsp__inst_executed.sum |
inst_executed_global_atomics |
smsp__sass_inst_executed_op_global_atom.sum |
inst_executed_global_loads |
smsp__inst_executed_op_global_ld.sum |
inst_executed_global_reductions |
smsp__inst_executed_op_global_red.sum |
inst_executed_global_stores |
smsp__inst_executed_op_global_st.sum |
inst_executed_local_loads |
smsp__inst_executed_op_local_ld.sum |
inst_executed_local_stores |
smsp__inst_executed_op_local_st.sum |
inst_executed_shared_atomics |
smsp__inst_executed_op_shared_atom.sum + smsp__inst_executed_op_shared_atom_dot_alu.sum + smsp__inst_executed_op_shared_atom_dot_cas.sum |
inst_executed_shared_loads |
smsp__inst_executed_op_shared_ld.sum |
inst_executed_shared_stores |
smsp__inst_executed_op_shared_st.sum |
inst_executed_surface_atomics |
smsp__inst_executed_op_surface_atom.sum |
inst_executed_surface_loads |
smsp__inst_executed_op_surface_ld.sum + smsp__inst_executed_op_shared_atom_dot_alu.sum + smsp__inst_executed_op_shared_atom_dot_cas.sum |
inst_executed_surface_reductions |
smsp__inst_executed_op_surface_red.sum |
inst_executed_surface_stores |
smsp__inst_executed_op_surface_st.sum |
inst_executed_tex_ops |
smsp__inst_executed_op_texture.sum |
inst_fp_16 |
smsp__sass_thread_inst_executed_op_fp16_pred_on.sum |
inst_fp_32 |
smsp__sass_thread_inst_executed_op_fp32_pred_on.sum |
inst_fp_64 |
smsp__sass_thread_inst_executed_op_fp64_pred_on.sum |
inst_integer |
smsp__sass_thread_inst_executed_op_integer_pred_on.sum |
inst_inter_thread_communication |
smsp__sass_thread_inst_executed_op_inter_thread_communication_pred_on.sum |
inst_issued |
smsp__inst_issued.sum |
inst_misc |
smsp__sass_thread_inst_executed_op_misc_pred_on.sum |
inst_per_warp |
smsp__average_inst_executed_per_warp.ratio |
inst_replay_overhead |
不适用 |
ipc |
smsp__inst_executed.avg.per_cycle_active |
issue_slot_utilization |
smsp__issue_active.avg.pct_of_peak_sustained_active |
issue_slots |
smsp__inst_issued.sum |
issued_ipc |
smsp__inst_issued.avg.per_cycle_active |
l2_atomic_throughput |
2 * ( lts__t_sectors_op_atom.sum.per_second + lts__t_sectors_op_red.sum.per_second ) |
l2_atomic_transactions |
2 * ( lts__t_sectors_op_atom.sum + lts__t_sectors_op_red.sum ) |
l2_global_atomic_store_bytes |
lts__t_bytes_equiv_l1sectormiss_pipe_lsu_mem_global_op_atom.sum |
l2_global_load_bytes |
lts__t_bytes_equiv_l1sectormiss_pipe_lsu_mem_global_op_ld.sum |
l2_local_global_store_bytes |
lts__t_bytes_equiv_l1sectormiss_pipe_lsu_mem_local_op_st.sum + lts__t_bytes_equiv_l1sectormiss_pipe_lsu_mem_global_op_st.sum |
l2_local_load_bytes |
lts__t_bytes_equiv_l1sectormiss_pipe_lsu_mem_local_op_ld.sum |
l2_read_throughput |
lts__t_sectors_op_read.sum.per_second + lts__t_sectors_op_atom.sum.per_second + lts__t_sectors_op_red.sum.per_second 2 |
l2_read_transactions |
lts__t_sectors_op_read.sum + lts__t_sectors_op_atom.sum + lts__t_sectors_op_red.sum 2 |
l2_surface_load_bytes |
lts__t_bytes_equiv_l1sectormiss_pipe_tex_mem_surface_op_ld.sum |
l2_surface_store_bytes |
lts__t_bytes_equiv_l1sectormiss_pipe_tex_mem_surface_op_st.sum |
l2_tex_hit_rate |
lts__t_sector_hit_rate.pct |
l2_tex_read_hit_rate |
lts__t_sector_op_read_hit_rate.pct |
l2_tex_read_throughput |
lts__t_sectors_srcunit_tex_op_read.sum.per_second |
l2_tex_read_transactions |
lts__t_sectors_srcunit_tex_op_read.sum |
l2_tex_write_hit_rate |
lts__t_sector_op_write_hit_rate.pct |
l2_tex_write_throughput |
lts__t_sectors_srcunit_tex_op_write.sum.per_second |
l2_tex_write_transactions |
lts__t_sectors_srcunit_tex_op_write.sum |
l2_utilization |
lts__t_sectors.avg.pct_of_peak_sustained_elapsed |
l2_write_throughput |
lts__t_sectors_op_write.sum.per_second + lts__t_sectors_op_atom.sum.per_second + lts__t_sectors_op_red.sum.per_second |
l2_write_transactions |
lts__t_sectors_op_write.sum + lts__t_sectors_op_atom.sum + lts__t_sectors_op_red.sum |
ldst_executed |
不适用 |
ldst_fu_utilization |
smsp__inst_executed_pipe_lsu.avg.pct_of_peak_sustained_active |
ldst_issued |
不适用 |
local_hit_rate |
不适用 |
local_load_requests |
l1tex__t_requests_pipe_lsu_mem_local_op_ld.sum |
local_load_throughput |
l1tex__t_bytes_pipe_lsu_mem_local_op_ld.sum.per_second |
local_load_transactions |
l1tex__t_sectors_pipe_lsu_mem_local_op_ld.sum |
local_load_transactions_per_request |
l1tex__average_t_sectors_per_request_pipe_lsu_mem_local_op_ld.ratio |
local_memory_overhead |
不适用 |
local_store_requests |
l1tex__t_requests_pipe_lsu_mem_local_op_st.sum |
local_store_throughput |
l1tex__t_sectors_pipe_lsu_mem_local_op_st.sum.per_second |
local_store_transactions |
l1tex__t_sectors_pipe_lsu_mem_local_op_st.sum |
local_store_transactions_per_request |
l1tex__average_t_sectors_per_request_pipe_lsu_mem_local_op_st.ratio |
nvlink_data_receive_efficiency |
不适用 |
nvlink_data_transmission_efficiency |
不适用 |
nvlink_overhead_data_received |
(nvlrx__bytes_data_protocol.sum / nvlrx__bytes.sum) * 100 |
nvlink_overhead_data_transmitted |
(nvltx__bytes_data_protocol.sum / nvltx__bytes.sum) * 100 |
nvlink_receive_throughput |
nvlrx__bytes.sum.per_second |
nvlink_total_data_received |
nvlrx__bytes.sum |
nvlink_total_data_transmitted |
nvltx__bytes.sum |
nvlink_total_nratom_data_transmitted |
不适用 |
nvlink_total_ratom_data_transmitted |
不适用 |
nvlink_total_response_data_received |
不适用 |
nvlink_total_write_data_transmitted |
不适用 |
nvlink_transmit_throughput |
nvltx__bytes.sum.per_second |
nvlink_user_data_received |
nvlrx__bytes_data_user.sum |
nvlink_user_data_transmitted |
nvltx__bytes_data_user.sum |
nvlink_user_nratom_data_transmitted |
不适用 |
nvlink_user_ratom_data_transmitted |
不适用 |
nvlink_user_response_data_received |
不适用 |
nvlink_user_write_data_transmitted |
不适用 |
pcie_total_data_received |
pcie__read_bytes.sum |
pcie_total_data_transmitted |
pcie__write_bytes.sum |
shared_efficiency |
smsp__sass_average_data_bytes_per_wavefront_mem_shared.pct |
shared_load_throughput |
l1tex__data_pipe_lsu_wavefronts_mem_shared_op_ld.sum.per_second |
shared_load_transactions |
l1tex__data_pipe_lsu_wavefronts_mem_shared_op_ld.sum |
shared_load_transactions_per_request |
不适用 |
shared_store_throughput |
l1tex__data_pipe_lsu_wavefronts_mem_shared_op_st.sum.per_second |
shared_store_transactions |
l1tex__data_pipe_lsu_wavefronts_mem_shared_op_st.sum |
shared_store_transactions_per_request |
不适用 |
shared_utilization |
l1tex__data_pipe_lsu_wavefronts_mem_shared.avg.pct_of_peak_sustained_elapsed |
single_precision_fu_utilization |
smsp__pipe_fma_cycles_active.avg.pct_of_peak_sustained_active |
sm_efficiency |
smsp__cycles_active.avg.pct_of_peak_sustained_elapsed |
sm_tex_utilization |
l1tex__texin_sm2tex_req_cycles_active.avg.pct_of_peak_sustained_elapsed |
special_fu_utilization |
smsp__inst_executed_pipe_xu.avg.pct_of_peak_sustained_active |
stall_constant_memory_dependency |
smsp__warp_issue_stalled_imc_miss_per_warp_active.pct |
stall_exec_dependency |
smsp__warp_issue_stalled_short_scoreboard_per_warp_active.pct + smsp__warp_issue_stalled_wait_per_warp_active.pct |
stall_inst_fetch |
smsp__warp_issue_stalled_no_instruction_per_warp_active.pct |
stall_memory_dependency |
smsp__warp_issue_stalled_long_scoreboard_per_warp_active.pct |
stall_memory_throttle |
smsp__warp_issue_stalled_drain_per_warp_active.pct + smsp__warp_issue_stalled_lg_throttle_per_warp_active.pct |
stall_not_selected |
smsp__warp_issue_stalled_not_selected_per_warp_active.pct |
stall_other |
smsp__warp_issue_stalled_dispatch_stall_per_warp_active.pct + smsp__warp_issue_stalled_misc_per_warp_active.pct |
stall_pipe_busy |
smsp__warp_issue_stalled_math_pipe_throttle_per_warp_active.pct + smsp__warp_issue_stalled_mio_throttle_per_warp_active.pct |
stall_sleeping |
smsp__warp_issue_stalled_sleeping_per_warp_active.pct |
stall_sync |
smsp__warp_issue_stalled_barrier_per_warp_active.pct + smsp__warp_issue_stalled_membar_per_warp_active.pct |
stall_texture |
smsp__warp_issue_stalled_tex_throttle_per_warp_active.pct |
surface_atomic_requests |
l1tex__t_requests_pipe_tex_mem_surface_op_atom.sum |
surface_load_requests |
l1tex__t_requests_pipe_tex_mem_surface_op_ld.sum |
surface_reduction_requests |
l1tex__t_requests_pipe_tex_mem_surface_op_red.sum |
surface_store_requests |
l1tex__t_requests_pipe_tex_mem_surface_op_st.sum |
sysmem_read_bytes |
lts__t_sectors_aperture_sysmem_op_read * 32 |
sysmem_read_throughput |
lts__t_sectors_aperture_sysmem_op_read.sum.per_second |
sysmem_read_transactions |
lts__t_sectors_aperture_sysmem_op_read.sum |
sysmem_read_utilization |
不适用 |
sysmem_utilization |
不适用 |
sysmem_write_bytes |
lts__t_sectors_aperture_sysmem_op_write * 32 |
sysmem_write_throughput |
lts__t_sectors_aperture_sysmem_op_write.sum.per_second |
sysmem_write_transactions |
lts__t_sectors_aperture_sysmem_op_write.sum |
sysmem_write_utilization |
不适用 |
tensor_precision_fu_utilization |
sm__pipe_tensor_op_hmma_cycles_active.avg.pct_of_peak_sustained_active |
tensor_precision_int_utilization |
sm__pipe_tensor_op_imma_cycles_active.avg.pct_of_peak_sustained_active (SM 7.2+) |
tex_cache_hit_rate |
l1tex__t_sector_hit_rate.pct |
tex_cache_throughput |
不适用 |
tex_cache_transactions |
l1tex__lsu_writeback_active.avg.pct_of_peak_sustained_active + l1tex__tex_writeback_active.avg.pct_of_peak_sustained_active |
tex_fu_utilization |
smsp__inst_executed_pipe_tex.avg.pct_of_peak_sustained_active |
tex_sm_tex_utilization |
l1tex__f_tex2sm_cycles_active.avg.pct_of_peak_sustained_elapsed |
tex_sm_utilization |
sm__mio2rf_writeback_active.avg.pct_of_peak_sustained_elapsed |
tex_utilization |
不适用 |
texture_load_requests |
l1tex__t_requests_pipe_tex_mem_texture.sum |
warp_execution_efficiency |
smsp__thread_inst_executed_per_inst_executed.ratio |
warp_nonpred_execution_efficiency |
smsp__thread_inst_executed_per_inst_executed.pct |
4.6.4. 事件比较
对于 nvprof 事件,下表列出了 NVIDIA Nsight Compute 中的等效指标(如果可用)。有关 PerfWorks 指标结构的详细说明,请参阅 指标结构。
以 sm__ 开头的指标是按 SM 收集的。以 smsp__ 开头的指标是按 SM 子分区收集的。但是,所有相应的 nvprof 事件仅按 SM 收集。有关这些术语的更多详细信息,请查看 指标指南。
nvprof 事件 |
PerfWorks 指标或公式 (>= SM 7.0) |
---|---|
active_cycles |
sm__cycles_active.sum |
active_cycles_pm |
sm__cycles_active.sum |
active_cycles_sys |
sys__cycles_active.sum |
active_warps |
sm__warps_active.sum |
active_warps_pm |
sm__warps_active.sum |
atom_count |
smsp__inst_executed_op_generic_atom_dot_alu.sum |
elapsed_cycles_pm |
sm__cycles_elapsed.sum |
elapsed_cycles_sm |
sm__cycles_elapsed.sum |
elapsed_cycles_sys |
sys__cycles_elapsed.sum |
fb_subp0_read_sectors |
dram__sectors_read.sum |
fb_subp1_read_sectors |
dram__sectors_read.sum |
fb_subp0_write_sectors |
dram__sectors_write.sum |
fb_subp1_write_sectors |
dram__sectors_write.sum |
global_atom_cas |
smsp__inst_executed_op_generic_atom_dot_cas.sum |
gred_count |
smsp__inst_executed_op_global_red.sum |
inst_executed |
sm__inst_executed.sum |
inst_executed_fma_pipe_s0 |
smsp__inst_executed_pipe_fma.sum |
inst_executed_fma_pipe_s1 |
smsp__inst_executed_pipe_fma.sum |
inst_executed_fma_pipe_s2 |
smsp__inst_executed_pipe_fma.sum |
inst_executed_fma_pipe_s3 |
smsp__inst_executed_pipe_fma.sum |
inst_executed_fp16_pipe_s0 |
smsp__inst_executed_pipe_fp16.sum |
inst_executed_fp16_pipe_s1 |
smsp__inst_executed_pipe_fp16.sum |
inst_executed_fp16_pipe_s2 |
smsp__inst_executed_pipe_fp16.sum |
inst_executed_fp16_pipe_s3 |
smsp__inst_executed_pipe_fp16.sum |
inst_executed_fp64_pipe_s0 |
smsp__inst_executed_pipe_fp64.sum |
inst_executed_fp64_pipe_s1 |
smsp__inst_executed_pipe_fp64.sum |
inst_executed_fp64_pipe_s2 |
smsp__inst_executed_pipe_fp64.sum |
inst_executed_fp64_pipe_s3 |
smsp__inst_executed_pipe_fp64.sum |
inst_issued1 |
sm__inst_issued.sum |
l2_subp0_read_sector_misses |
lts__t_sectors_op_read_lookup_miss.sum |
l2_subp1_read_sector_misses |
lts__t_sectors_op_read_lookup_miss.sum |
l2_subp0_read_sysmem_sector_queries |
lts__t_sectors_aperture_sysmem_op_read.sum |
l2_subp1_read_sysmem_sector_queries |
lts__t_sectors_aperture_sysmem_op_read.sum |
l2_subp0_read_tex_hit_sectors |
lts__t_sectors_srcunit_tex_op_read_lookup_hit.sum |
l2_subp1_read_tex_hit_sectors |
lts__t_sectors_srcunit_tex_op_read_lookup_hit.sum |
l2_subp0_read_tex_sector_queries |
lts__t_sectors_srcunit_tex_op_read.sum |
l2_subp1_read_tex_sector_queries |
lts__t_sectors_srcunit_tex_op_read.sum |
l2_subp0_total_read_sector_queries |
lts__t_sectors_op_read.sum + lts__t_sectors_op_atom.sum + lts__t_sectors_op_red.sum |
l2_subp1_total_read_sector_queries |
lts__t_sectors_op_read.sum + lts__t_sectors_op_atom.sum + lts__t_sectors_op_red.sum |
l2_subp0_total_write_sector_queries |
lts__t_sectors_op_write.sum + lts__t_sectors_op_atom.sum + lts__t_sectors_op_red.sum |
l2_subp1_total_write_sector_queries |
lts__t_sectors_op_write.sum + lts__t_sectors_op_atom.sum + lts__t_sectors_op_red.sum |
l2_subp0_write_sector_misses |
lts__t_sectors_op_write_lookup_miss.sum |
l2_subp1_write_sector_misses |
lts__t_sectors_op_write_lookup_miss.sum |
l2_subp0_write_sysmem_sector_queries |
lts__t_sectors_aperture_sysmem_op_write.sum |
l2_subp1_write_sysmem_sector_queries |
lts__t_sectors_aperture_sysmem_op_write.sum |
l2_subp0_write_tex_hit_sectors |
lts__t_sectors_srcunit_tex_op_write_lookup_hit.sum |
l2_subp1_write_tex_hit_sectors |
lts__t_sectors_srcunit_tex_op_write_lookup_hit.sum |
l2_subp0_write_tex_sector_queries |
lts__t_sectors_srcunit_tex_op_write.sum |
l2_subp1_write_tex_sector_queries |
lts__t_sectors_srcunit_tex_op_write.sum |
not_predicated_off_thread_inst_executed |
smsp__thread_inst_executed_pred_on.sum |
pcie_rx_active_pulse |
不适用 |
pcie_tx_active_pulse |
不适用 |
prof_trigger_00 |
不适用 |
prof_trigger_01 |
不适用 |
prof_trigger_02 |
不适用 |
prof_trigger_03 |
不适用 |
prof_trigger_04 |
不适用 |
prof_trigger_05 |
不适用 |
prof_trigger_06 |
不适用 |
prof_trigger_07 |
不适用 |
inst_issued0 |
smsp__issue_inst0.sum |
sm_cta_launched |
sm__ctas_launched.sum |
shared_load |
smsp__inst_executed_op_shared_ld.sum |
shared_store |
smsp__inst_executed_op_shared_st.sum |
generic_load |
smsp__inst_executed_op_generic_ld.sum |
generic_store |
smsp__inst_executed_op_generic_st.sum |
global_load |
smsp__inst_executed_op_global_ld.sum |
global_store |
smsp__inst_executed_op_global_st.sum |
local_load |
smsp__inst_executed_op_local_ld.sum |
local_store |
smsp__inst_executed_op_local_st.sum |
shared_atom |
smsp__inst_executed_op_shared_atom.sum |
shared_atom_cas |
smsp__inst_executed_op_shared_atom_dot_cas.sum |
shared_ld_bank_conflict |
l1tex__data_bank_conflicts_pipe_lsu_mem_shared_op_ld.sum |
shared_st_bank_conflict |
l1tex__data_bank_conflicts_pipe_lsu_mem_shared_op_st.sum |
shared_ld_transactions |
l1tex__data_pipe_lsu_wavefronts_mem_shared_op_ld.sum |
shared_st_transactions |
l1tex__data_pipe_lsu_wavefronts_mem_shared_op_st.sum |
tensor_pipe_active_cycles_s0 |
smsp__pipe_tensor_cycles_active.sum |
tensor_pipe_active_cycles_s1 |
smsp__pipe_tensor_cycles_active.sum |
tensor_pipe_active_cycles_s2 |
smsp__pipe_tensor_cycles_active.sum |
tensor_pipe_active_cycles_s3 |
smsp__pipe_tensor_cycles_active.sum |
thread_inst_executed |
smsp__thread_inst_executed.sum |
warps_launched |
smsp__warps_launched.sum |
4.6.5. 过滤
按内核名称过滤
nvprof 和 NVIDIA Nsight Compute CLI 都支持过滤应收集哪些内核的数据。在 nvprof 中,选项是
--kernels
,并应用于后续的指标收集选项。在 NVIDIA Nsight Compute CLI 中,选项名为--kernel-name
,并应用于完整的应用程序执行。换句话说,除非内核在不同的 GPU 架构上执行,否则 NVIDIA Nsight Compute CLI 目前不支持为不同的内核收集不同的指标。按内核 ID 过滤
Nvprof 允许用户使用内核 ID 描述来指定要分析的内核,使用的选项仍然是
--kernels
。在 NVIDIA Nsight Compute CLI 中,此内核 ID 的语法是相同的,但选项名为--kernel-id
。按设备过滤
nvprof 和 NVIDIA Nsight Compute CLI 都使用
--devices
来过滤要分析的设备。与 nvprof 相比,在 NVIDIA Nsight Compute CLI 中,该选项全局应用,而不仅限于后续选项。
4.6.6. 输出
API 跟踪和摘要
NVIDIA Nsight Compute CLI 不支持任何形式的 API 使用相关输出。在分析期间不捕获任何 API 数据。
依赖性分析
NVIDIA Nsight Compute CLI 不支持任何依赖性分析。在分析期间不捕获任何 API 数据。
GPU 跟踪
NVIDIA Nsight Compute CLI 不支持任何 GPU 跟踪输出。由于在分析期间进行内核重放,内核执行是串行化的,并且开始和结束时间戳不一定与应用程序执行期间的时间戳匹配。此外,不记录内存活动的记录。
打印摘要
虽然 nvprof 有多个命令行选项来指定要打印哪些摘要信息,但 NVIDIA Nsight Compute CLI 使用
--print-summary
选项的更多参数。分析数据可以按per-gpu
、per-kernel
或per-nvtx
上下文进行汇总。内核名称反混淆
Nvprof 允许用户使用
--demangling
选项来决定是否启用名称反混淆。NVIDIA Nsight Compute CLI 目前始终在输出中反混淆内核名称。此外,选项--kernel-regex-base
可用于决定在过滤期间匹配内核名称时应使用哪种名称格式。页面
Nvprof 没有输出页面的概念,所有数据都以列表或摘要形式显示。NVIDIA Nsight Compute CLI 使用页面来定义数据的结构和打印方式。这些页面对应于 GUI 版本中使用的报告页面。选项
--page
可用于选择要显示的页面,默认情况下选择details
页面。所有页面还支持以 CSV 格式打印,以便于后处理,使用--csv
选项。
4.6.7. 启动和附加
启动进程进行分析
在 nvprof 中,要分析的应用程序作为命令行参数传递给工具。该应用程序必须是本地可执行文件。或者,您可以选择以守护进程模式使用该工具,并分析本地计算机上的所有适用进程(nvprof 选项
--profile-all-processes
)。在 nvprof 中,通过--profile-child-processes
标志来决定是分析完整的进程树还是仅分析根进程。在 NVIDIA Nsight Compute CLI 中,为此使用--target-processes
选项。NVIDIA Nsight Compute CLI 有几种模式来确定要收集哪个应用程序的数据。默认情况下,通过命令行传递给工具的可执行文件将被启动、连接和分析。此模式称为
launch-and-attach
(启动并附加)。启动进程以进行附加
与 nvprof 相比,您可以选择仅启动本地可执行文件。在这种模式下(
--mode launch
),进程启动、连接,然后在第一次 CUDA API 调用时暂停。随后,还有第三种模式(--mode attach
)用于附加到使用上述模式启动的任何进程。在这种情况下,所有分析和输出选项都将传递给 NVIDIA Nsight Compute CLI 的附加实例。远程分析
最后,使用
launch
和attach
,您可以连接到远程计算机上启动的进程,该计算机甚至可以运行与本地主机不同的操作系统。使用--hostname
选择要连接的远程主机。
声明
声明
所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”,无论合并或单独)均“按原样”提供。NVIDIA 对这些材料不作任何明示、暗示、法定或其他方面的保证,并且明确声明不承担所有关于不侵权、适销性和特定用途适用性的默示保证。
所提供的信息据信是准确可靠的。但是,NVIDIA 公司对因使用此类信息而造成的后果,或因使用此类信息而可能导致的侵犯第三方专利或其他权利的行为不承担任何责任。在 NVIDIA 公司的任何专利权项下,未以暗示或其他方式授予任何许可。本出版物中提到的规格如有更改,恕不另行通知。本出版物取代并替换以前提供的所有其他信息。未经 NVIDIA 公司明确书面批准,NVIDIA 公司产品不得用作生命支持设备或系统中的关键组件。
商标
NVIDIA 和 NVIDIA 徽标是 NVIDIA 公司在美国和其他国家/地区的商标或注册商标。其他公司和产品名称可能是与其相关的各自公司的商标。