用户指南

NVIDIA Nsight Systems 用户指南

从 CLI 进行性能分析

在目标设备上安装 CLI

Nsight Systems CLI 提供了一个简单的界面,无需使用 GUI 即可在目标设备上进行收集。收集的数据随后可以复制到任何系统并在以后进行分析。

CLI 分发在标准 Nsight Systems 下载包的 Target 目录中。

如果您希望在没有 root 权限的情况下运行 CLI(推荐模式),您需要安装在您具有完全访问权限的目录中。

注意

您必须以管理员身份在 Windows 上运行 CLI。

命令行选项

Nsight Systems 命令行可以有两种形式之一

nsys [global_option]

nsys [command_switch][optional command_switch_options][application] [optional application_options]

所有命令行选项都区分大小写。对于命令开关选项,当使用短选项时,参数应跟在开关后面的空格之后;例如,-s process-tree。当使用长选项时,开关后应跟一个等号,然后是参数;例如,--sample=process-tree

对于此版本的 Nsight Systems,如果您从命令行启动进程以开始分析,则启动的进程将在收集完成时终止,包括设置了 --duration 的运行,除非用户指定 --kill none 选项(详见下文)。例外情况是,如果用户使用 NVTX、cudaProfilerStart/Stop 或热键来控制持续时间,则应用程序将继续运行,除非设置了 --kill

Nsight Systems CLI 通过使用会话来支持并发分析。每个 Nsight Systems 会话都由一系列 CLI 命令定义,这些命令定义一个或多个集合(例如,何时以及收集哪些数据)。会话以 start、launch 或 profile 命令开始。会话以 shutdown 命令结束,当 profile 命令终止时,或者,如果请求,当会话中启动的所有进程树退出时结束。多个会话可以在同一系统上同时运行。

CLI 全局选项

短选项

长选项

描述

-h

--help

帮助消息,提供有关可用命令开关及其选项的信息。

-v

--version

输出 Nsight Systems CLI 版本信息。

CLI 命令开关

Nsight Systems 命令行界面可以在两种模式下使用。您可以启动应用程序并使用指定给 nsys profile 命令的选项开始分析。或者,您可以使用交互式 CLI 命令来控制应用程序的启动和数据收集。

命令

描述

analyze

后处理现有的 Nsight Systems 结果(.nsys-rep 或 SQLite 格式),以生成专家系统报告。

cancel

取消以交互模式启动的现有集合。当前集合中已收集的所有数据都将被丢弃。

export

从现有的 .nsys-rep 文件生成导出文件。有关导出格式的更多信息,请参阅 Nsight Systems 安装目录中的 /documentation/nsys-exporter 目录。

launch

在交互模式下,在支持请求选项的环境中启动应用程序。launch 命令可以在 start 命令之前或之后执行。

nvprof

特殊选项,用于帮助从旧版 NVIDIA nvprof 工具过渡。调用 nsys nvprof [options] 将提供 nvprof [options] 的最佳可用转换。有关详细信息,请参阅 从 NVIDIA nvprof 迁移 主题。使用此选项时,nsys 的其他功能将不可用。

profile

完全形成的性能分析描述,不需要也不接受进一步的输入。使用的命令开关选项(见下表)确定收集何时开始、停止,使用哪些收集器(例如,API 跟踪、IP 采样等),监视哪些进程等。

recipe

后处理多个现有的 Nsight Systems 结果,以生成统计信息并创建各种图表。有关详细信息,请参阅 多报告分析 主题。

sessions

提供有关系统上运行的所有会话的信息。

shutdown

断开 CLI 进程与启动的应用程序的连接,并强制 CLI 进程退出。如果集合处于挂起或活动状态,则会将其取消。

start

以交互模式启动集合。start 命令可以在 launch 命令之前或之后执行。

stats

后处理现有的 Nsight Systems 结果(.nsys-rep 或 SQLite 格式),以生成统计信息。

status

报告基于 CLI 的集合的状态或性能分析环境的适用性。

stop

停止以交互模式启动的集合。执行后,所有活动集合都将停止,CLI 进程将终止,但应用程序将继续运行。

CLI Profile 命令开关选项

选择 profile 命令开关后,可以使用以下选项。用法

nsys [global-options] profile [options] [application] [application-arguments]

短选项

长选项

可能的参数

默认值

开关描述

--accelerator-trace

none,tegra-accelerators

none

从硬件引擎单元收集其他加速器工作负载跟踪。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--auto-report-name

true, false

false

使用性能分析图形应用程序的详细信息,从收集的数据中派生报告文件名。格式:[进程名称][GPU 名称][窗口分辨率][图形 API] 时间戳 .nsys-rep。如果为 true,则自动生成报告文件名。

-b

--backtrace

auto,fp,lbr,dwarf,none

选择在采样时使用的回溯方法。选项 lbr 使用 Intel(c) Corporation 的 Last Branch Record 寄存器,仅适用于代号为 Haswell 及更高版本的 Intel(c) CPU。选项 fp 是帧指针,并假定在编译期间启用了帧指针。选项 dwarf 使用 DWARF 的 CFI(调用帧信息)。将值设置为 none 可以减少收集开销。

-c

--capture-range

none, cudaProfilerApi, hotkey, nvtx

none

当使用 --capture-range 时,性能分析仅在调用适当的启动 API 或热键时才会开始。如果 --capture-range 设置为 none,则启动/停止 API 调用和热键将被忽略。

注意

热键仅适用于图形应用程序。

--capture-range-end

none, stop, stop-shutdown, repeat[:N], repeat-shutdown:N

stop-shutdown

指定捕获范围结束时的所需行为。仅当与 --capture-range 选项一起使用时适用。如果为 none,则捕获范围结束将被忽略。如果为 stop,则收集将在捕获范围结束时停止。任何后续捕获范围都将被忽略。目标应用程序将继续运行。如果为 stop-shutdown,则收集将在捕获范围结束时停止,并且会话将关闭。如果为 repeat[:N],则收集将在捕获范围结束时停止,并且后续捕获范围将触发更多收集。可选的 :N 指定要处理的最大捕获范围数。一旦收集了 N 个捕获范围,任何后续捕获范围都将被忽略。如果为 repeat-shutdown:N,则行为与 repeat:N 相同,但会话将在 N 个范围后关闭。对于 stop-shutdownrepeat-shutdown:N,始终使用 --kill 选项来指定在关闭会话时是否应终止目标应用程序。

--clock-frequency-changes

true, false

false

收集时钟频率变化。仅在 Nsight Systems Embedded Platforms Edition 和 Arm 服务器 (SBSA) 平台上可用。

--command-file

< 文件名 >

none

打开包含 profile 开关的文件并解析这些开关。请注意,命令行上的其他开关将覆盖文件中的开关。此标志可以指定多次。

--cpu-cluster-events

0x16, 0x17, …, none

none

收集每个集群的 Uncore PMU 计数器。可以选择多个值,仅用逗号分隔(无空格)。使用 --cpu-cluster-events=help 开关查看值的完整列表。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--cpu-core-events (Nsight Systems Embedded Platforms Edition)

0x11,0x13,…,none

none

收集每个内核的 PMU 计数器。可以选择多个值,仅用逗号分隔(无空格)。使用 --cpu-core-events=help 开关查看值的完整列表。

--cpu-core-events(非 Nsight Systems Embedded Platforms Edition)

“help”或最终用户以“x,y”格式选择的事件

“2”,即“已执行指令”

选择要采样的 CPU 内核事件。使用 --cpu-core-events=help 开关查看事件的完整列表以及可以同时收集的事件数。可以选择多个值,仅用逗号分隔(无空格)。使用 --event-sample 开关启用。

--cpu-core-metrics

0,1,2,…,none

none

收集 CPU 内核上的指标。可以选择多个值,仅用逗号分隔(无空格)。使用 --cpu-core-metrics=help 开关查看值的完整列表。

注意

仅在 Grace 上可用。

--cpu-socket-events

0x2a, 0x2c, …, none

none

收集每个插槽的 Uncore PMU 计数器。可以选择多个值,仅用逗号分隔(无空格)。使用 --cpu-socket-events=help 开关查看值的完整列表。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--cpuctxsw

process-tree, system-wide, none

process-tree

跟踪操作系统线程调度活动。选择 none 以禁用跟踪 CPU 上下文切换。根据平台的不同,某些值可能需要管理员或 root 权限。

注意

如果 --sample 开关设置为 none 以外的值,则 --cpuctxsw 设置将硬编码为与 --sample 开关相同的值。如果 --sample=none 并且启动了目标应用程序,则默认值为 process-tree,否则默认值为 none。在 Nsight Systems Embedded Platforms Edition 中需要 --sampling-trigger=perf 开关

--cuda-flush-interval

毫秒

请参阅描述

设置以毫秒为单位自动将缓冲的 CUDA 数据保存到存储的间隔。CUDA 数据缓冲区保存可能会导致性能分析器开销。可以使用此开关控制缓冲区保存行为。如果在运行 CUDA 11.0 或更高版本的系统上将 CUDA 刷新间隔设置为 0,则缓冲区将在填满时保存。如果在这些系统上将刷新间隔设置为非零值,则缓冲区仅在刷新间隔到期时保存。如果设置了刷新间隔,并且性能分析器在刷新间隔到期之前用完了可用缓冲区,则将根据需要分配其他缓冲区。在这种情况下,设置刷新间隔可以减少缓冲区保存开销,但会增加性能分析器的内存使用量。如果在运行旧版本 CUDA 的系统上将刷新间隔设置为 0,则缓冲区将在收集结束时保存。如果性能分析器用完了可用缓冲区,则将根据需要分配其他缓冲区。如果在这些系统上将刷新间隔设置为非零值,则缓冲区将在刷新间隔到期时保存。可以在保存缓冲区之前将 cuCtxSynchronize 调用插入到工作流程中,这将导致应用程序开销。在这种情况下,设置刷新间隔可以减少性能分析器的内存使用量,但可能会增加保存开销。对于超过 30 秒的收集,建议间隔为 10 秒。Nsight Systems Embedded Platforms Edition 的默认值为 10000,否则为 0。

--cuda-graph-trace

graph, node

graph

如果选择 graph,则 CUDA 图将作为一个整体进行跟踪,并且不会收集节点活动。这将最大限度地减少开销,但需要 CUDA 驱动程序版本 515.43 或更高版本。如果选择 node,则将收集节点活动,但 CUDA 图不会作为一个整体进行跟踪。这可能会导致显著的运行时开销。如果可用,则默认值为 graph,否则默认值为 node

--cuda-memory-usage

true, false

false

跟踪 CUDA 内核的 GPU 内存使用情况。仅当启用 CUDA 跟踪时才适用。

注意

此功能可能会导致显著的运行时开销。

--cuda-um-cpu-page-faults

true, false

false

此开关跟踪当 CPU 代码尝试访问驻留在设备上的内存页时发生的页错误。请注意,此功能可能会导致显著的运行时开销。在 Nsight Systems Embedded Platforms Edition 上不可用。

--cuda-um-gpu-page-faults

true, false

false

此开关跟踪当 GPU 代码尝试访问驻留在主机上的内存页时发生的页错误。请注意,此功能可能会导致显著的运行时开销。在 Nsight Systems Embedded Platforms Edition 上不可用。

--cudabacktrace

all, none, kernel, memory, sync, other

none

在跟踪 CUDA API 时,启用在调用 CUDA API 时收集回溯。可能会发生显著的运行时开销。可以使用 ',' 组合值。除了 none 之外的每个值都可以附加一个阈值,并在 ':' 之后。阈值是 CUDA API 必须执行的时间(以纳秒为单位),然后才能收集回溯;例如,kernel:500。每个阈值的默认值为 1000 纳秒(1 微秒)。

注意

必须启用 CPU 采样。

-y

--delay

< 秒 >

0

收集开始延迟(秒)。

-d

--duration

< 秒 >

NA

收集持续时间(秒);持续时间必须大于零。当指定的性能分析持续时间到期时,启动的进程将终止,除非用户指定 --kill none 选项(详见下文)。

--duration-frames

60 <= 整数

在此数量的帧被捕获后停止记录会话。选择此项后,命令不能包含任何其他停止选项。如果未指定,则默认情况下禁用。

--dx-force-declare-adapter-removal-support

true, false

false

Nsight Systems 跟踪初始化涉及创建 D3D 设备并丢弃它。启用此标志会在设备创建之前调用 DXGIDeclareAdapterRemovalSupport()。需要启用 DX11 或 DX12 跟踪。

--dx12-gpu-workload

true, false, individual, batch, none

individual

如果为 individual 或 true,则单独跟踪每个 DX12 工作负载的 GPU 活动。如果为 batch,则在 ExecuteCommandLists 调用批处理中跟踪 DX12 工作负载的 GPU 活动。如果为 none 或 false,则不跟踪 DX12 工作负载的 GPU 活动。请注意,此开关仅在指定 --trace=dx12 时适用。此选项仅在 Windows 目标上受支持。

--dx12-wait-calls

true, false

true

如果为 true,则跟踪在 DX12 栅栏上阻塞的等待调用。请注意,此开关仅在指定 --trace=dx12 时适用。此选项仅在 Windows 目标上受支持。

--xhv-vm-symbols

<文件路径 kernel_symbols.json>

none

XHV 采样配置文件。仅在 Nsight Systems Embedded Platforms Edition 中可用。

-e

--env-var

A=B

NA

为要启动的应用程序进程设置环境变量。环境变量应定义为 A=B。可以将多个环境变量指定为 A=B,C=D。

--enable

<plugin_name>[,arg1,arg2,…]

NA

使用指定的插件。可以多次指定此选项以启用多个插件。插件参数仅用逗号分隔(无空格)。可以使用反斜杠 \\ 转义逗号。反斜杠本身可以用另一个反斜杠 \\\\ 转义。要在参数中包含空格,请将参数括在双引号 " 中。要列出所有可用的插件,请使用 --enable=help 命令。

--etw-provider

“<名称>,<guid>”,或 JSON 文件的路径

none

添加自定义 ETW 跟踪提供程序。如果要指定比名称和 GUID 更多的属性,请提供如下所述的 JSON 配置文件。此开关可以多次使用以添加多个提供程序。注意:仅适用于 Windows 目标。

--event-sample

system-wide, none

none

使用 --cpu-core-events=help--os-events=help 开关查看事件的完整列表。如果启用了事件采样并且未选择任何事件,则默认情况下会选择 CPU 内核事件“已执行指令”。在 Nsight Systems Embedded Platforms Edition 上不可用。

--event-sampling-frequency

1 到 20 Hz 的整数

3

用于收集事件计数的采样频率。最小事件采样频率为 1 Hz。最大事件采样频率为 20 Hz。在 Nsight Systems Embedded Platforms Edition 中不可用。

--export

arrow, arrowdir, hdf, json, parquetdir, sqlite, text, none

none

基于收集的数据创建其他输出文件。此选项可以多次给出。

警告

如果收集捕获大量数据,则创建导出文件可能需要几分钟才能完成。

--flush-on-cudaprofilerstop

true, false

true

如果设置为 true,则任何对 cudaProfilerStop() 的调用都将导致 CUDA 跟踪缓冲区被刷新。请注意,无论此开关的值如何,CUDA 跟踪缓冲区都将在收集结束时刷新。

-f

--force-overwrite

true, false

false

如果为 true,则覆盖所有现有的结果文件,这些文件具有相同的输出文件名(.nsys-rep、.sqlite、.h5、.txt、.json、.arrows、_arwdir、_pqtdir)。

--ftrace

收集 ftrace 事件。参数应列出要收集的事件,格式为:subsystem1/event1,subsystem2/event2。需要 root 权限。默认情况下不收集 ftrace 事件。

--ftrace-keep-user-config

跳过初始 ftrace 设置并收集已配置的事件。默认值重置 ftrace 配置。

--gpu-metrics-devices

GPU ID, help, all, none

none

从指定的设备收集 GPU 指标。通过使用 --gpu-metrics-devices=help 开关确定 GPU ID。

--gpu-metrics-frequency

integer

10000

指定 GPU 指标采样频率。支持的最小频率为 10 (Hz)。支持的最大频率为 200000 (Hz)。

--gpu-metrics-set

alias, file:<file name>

参见描述

指定 GPU 指标的指标集。该参数必须是由 --gpu-metrics-set=help 开关报告的别名之一,或者是前缀为 file: 的指标配置文件路径。默认值是第一个支持所有选定 GPU 的指标集。

--gpu-video-device

help, <id1,id2,…>, all, none

none

分析视频设备。--help 提供支持的设备列表、不支持设备的原因和 ID。<id1,id2,...> 仅为指定的设备启用此功能。

--gpuctxsw

true,false

false

跟踪 GPU 上下文切换。请注意,这需要 r435.17 或更高版本的驱动程序以及 root 权限。

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

--hotkey-capture

‘F1’ 到 ‘F12’

‘F12’

触发性能分析会话的热键。请注意,此开关仅在指定 --capture-range=hotkey 时适用。

--ib-net-info-devices

<NIC names>

none

以逗号分隔的 NIC 名称列表。ibdiagnet 将使用这些 NIC 进行网络发现。此选项创建用于收集网络信息的 ibdiagnet 文件。示例值:mlx5_0,mlx5_1。如果设置了 --ib-net-info-output 选项,则 Nsight Systems 会将网络信息存储在该路径下。否则,它将在临时路径中创建,并在处理后丢弃。如果指定了多个 NIC,则仅保存最后一个网络信息文件。请注意,此选项不应与 --ib-net-info-files 选项一起使用。

--ib-net-info-files

<file paths>

none

以逗号分隔的文件路径列表。现有 ibdiagnet db_csv 文件的路径,包含网络信息数据。Nsight Systems 将从这些文件中读取网络信息。请勿在路径中使用 ~ 别名。请注意,此选项不应与 --ib-net-info-devices 选项一起使用。

--ib-net-info-output

<directory path>

none

设置一个目录的路径,ibdiagnet 网络发现数据将写入其中。将此选项与 --ib-net-info-devices 选项一起使用。请勿在路径中使用 ~ 别名。

--ib-switch-congestion-device

<IB switch GUIDs>

none

以逗号分隔的 InfiniBand 交换机 GUID 列表。从指定 GUID 标识的交换机收集 InfiniBand 交换机拥塞事件。此开关可以多次使用。系统范围。使用 --ib-switch-congestion-nic-device--ib-switch-congestion-percent--ib-switch-congestion-threshold-high 开关进一步控制拥塞事件的收集方式。

--ib-switch-congestion-nic-device

<NIC name>

none

NIC (HCA) 的名称,通过该 NIC 访问 InfiniBand 交换机。默认情况下,将使用第一个活动的 NIC。查找 NIC 名称的一种方法是通过 ibnetdiscover --Hca_list | grep "$(hostname)" 命令。示例用法:--ib-switch-congestion-nic-device=mlx5_3

--ib-switch-congestion-percent

1 <= integer <= 100

50

要收集的 InfiniBand 交换机拥塞事件的百分比。此选项允许减少报告拥塞事件所消耗的网络带宽。

--ib-switch-congestion-threshold-high

1 < integer <= 1023

75

InfiniBand 交换机出口端口缓冲区大小的高阈值百分比。在数据包离开 InfiniBand 交换机之前,它存储在出口端口缓冲区中。检查缓冲区的大小,如果超过给定的阈值百分比,则报告拥塞事件。该百分比可能大于 100。

--ib-switch-metrics-device

<IB switch GUIDs>

none

以逗号分隔的 InfiniBand 交换机 GUID 列表。从指定的 InfiniBand 交换机收集指标。此开关可以多次使用。系统范围。

--ib-switch-metrics-nic-device

<NIC name>

none

NIC (HCA) 的名称,通过该 NIC 访问 InfiniBand 交换机以获取性能指标。默认情况下,将使用第一个活动的 NIC。查找 NIC 名称的一种方法是通过 ibstat -l` 命令。示例用法:–ib-switch-metrics-nic-device=mlx5_3

-n

--inherit-environment

true, false

true

如果为 true,则当前环境变量和工具的环境变量将为启动的进程指定。如果为 false,则仅为启动的进程指定工具的环境变量。

--injection-use-detours

true,false

true

使用 detours 进行注入。如果为 false,则进程注入将通过 windows hooks 执行,这允许它绕过反作弊软件。

--isr

true, false

false

跟踪中断服务例程 (ISR) 和延迟过程调用 (DPC)。需要管理员权限。仅在 Windows 设备上可用。

--kill

none, sigkill, sigterm, signal number

sigterm

向目标应用程序的进程组发送信号。可以与 --duration 或范围标记一起使用。

--mpi-impl

openmpi,mpich

openmpi

当使用 --trace=mpi 跟踪 MPI API 时,使用 --mpi-impl 指定应用程序正在使用的 MPI 实现。如果未指定 MPI 实现,则 nsys 尝试根据动态链接器的搜索路径自动检测它。如果检测失败,则使用 openmpi。不支持在没有 --trace=mpi 的情况下调用 --mpi-impl

--nic-metrics

true, false

false

从支持的 NIC/HCA 设备收集指标。系统范围。在 Nsight Systems Embedded Platforms Edition 上不可用。

-p

--nvtx-capture

range@domain, range, range@*

none

指定 NVTX 范围和域以触发性能分析会话。此选项仅在与 --capture-range=nvtx 一起使用时适用。

--nvtx-domain-exclude

default, <domain_names>

选择从以逗号分隔的域列表中排除 NVTX 事件。default 排除没有域的 NVTX 事件。具有此名称或域名中包含逗号的域名必须使用 \\ 转义。

注意

只能使用 --nvtx-domain-include--nvtx-domain-exclude 中的一个。此选项仅在指定 --trace=nvtx 时适用。

--nvtx-domain-include

default, <domain_names>

选择仅包含来自以逗号分隔的域列表的 NVTX 事件。default 过滤 NVTX 默认域。具有此名称或域名中包含逗号的域名必须使用 \\ 转义。

注意

只能使用 --nvtx-domain-include--nvtx-domain-exclude 中的一个。此选项仅在指定 --trace=nvtx 时适用。

--python-functions-trace

<json_file>

指定包含请求的 NVTX 注释的 JSON 文件的路径。

--opengl-gpu-workload

true, false

true

如果为 true,则跟踪 OpenGL 工作负载的 GPU 活动。请注意,此开关仅在指定 --trace=opengl 时适用。

--os-events

“help”或最终用户以“x,y”格式选择的事件

选择要采样的 OS 事件。使用 --os-events=help 开关查看完整事件列表。可以选择多个值,仅用逗号分隔(无空格)。使用 --event-sample 开关启用。在 Nsight Systems Embedded Platforms Edition 上不可用。

--osrt-backtrace-depth

integer

24

设置为 OS 运行时库调用收集的回溯深度。

--osrt-backtrace-stack-size

integer

6144

设置堆栈转储大小(以字节为单位),以生成 OS 运行时库调用的回溯。

--osrt-backtrace-threshold

nanoseconds

80000

设置所有 OS 运行时库调用必须执行的持续时间(以纳秒为单位),超过此持续时间后才收集回溯。

--osrt-threshold

< nanoseconds >

1000 ns

设置操作系统运行时 (osrt) API 必须执行的持续时间(以纳秒为单位),超过此持续时间后才会被跟踪。远小于 1000 的值可能会导致显著的开销,并导致非常大的结果文件。

-o

--output

< 文件名 >

report#

设置报告文件名。文件名中的任何 %q{ENV_VAR} 模式都将替换为环境变量的值。文件名中的任何 %h 模式都将替换为系统的主机名。文件名中的任何 %p 模式都将替换为目标进程的 PID,如果存在进程树,则替换为根进程的 PID。文件名中的任何 %% 模式都将替换为 %。默认值为工作目录中的 report#{.nsys-rep,.sqlite,.h5,.txt,.arrows,_arwdir,_pqtdir,.json}。

--process-scope

main, process-tree, system-wide

main

选择要跟踪的进程。仅在 Nsight Systems Embedded Platforms Edition 中可用。在此工具版本中,Nsight Systems Workstation Edition 将始终在系统范围内进行跟踪。

--python-backtrace

cuda, none

none

在跟踪选定的 API 触发器时收集 Python 回溯事件。此选项在 Arm 服务器 (SBSA) 平台和 x86 Linux 目标上受支持。注意:必须启用选定的 API 和 CPU 采样的跟踪和回溯。例如,当使用 --python-backtrace=cuda 时,必须设置 --cudabacktrace

--python-sampling

true, false

false

收集 Python 回溯采样事件。此选项在 Arm 服务器 (SBSA) 平台、x86 Linux 和 Windows 目标上受支持。注意:当分析仅限 Python 的工作流程时,请考虑禁用 CPU 采样选项以减少开销。

--python-sampling-frequency

1 < integers < 2000

1000

指定 Python 采样频率。支持的最小频率为 1Hz。支持的最大频率为 2KHz。如果 --python-sampling 选项设置为 false,则忽略此选项。

--pytorch

autograd-nvtx, autograd-shapes-nvtx, none

none

当加载 torch 模块时,启用 PyTorch 的 torch.autograd.profiler.emit_nvtx()

--qnx-kernel-events

class/event,event, class/event:mode, class:mode,help,none

none

可以选择多个值,仅用逗号分隔(无空格)。有关 :mode 格式,请参阅 --qnx-kernel-events-mode 开关描述。使用 --qnx-kernel-events=help 开关查看完整的值列表。示例:--qnx-kernel-events=8/1:system:wide,_NTO_TRACE_THREAD:process:fast, \_NTO_TRACE_KERCALLENTER/\__KER_BAD,_NTO_TRACE_COMM,13。收集 QNX 内核事件。

--qnx-kernel-events-mode

system,process,fast,wide

system:fast

值仅用冒号 (:) 分隔(无空格)。systemprocess 不能同时指定。fastwide 不能同时指定。请查看 QNX 文档以确定何时选择 fastwide 模式。指定 QNX 内核事件收集的默认模式。

--resolve-symbols

true,false

true

解析捕获的样本和回溯的符号。

--retain-etw-files

true, false

false

保留跟踪生成的 ETW 文件,合并这些文件并将它们移动到输出目录。

--run-as

< username >

none

以指定的用户名运行目标应用程序。如果未指定,则目标应用程序将由与 Nsight Systems 相同的用户运行。需要 root 权限。仅适用于 Linux 目标。

-s

--sample

process-tree, system-wide, xhv, xhv-system-wide, none

process-tree

选择如何收集 CPU IP/回溯样本。如果选择 none,则禁用 CPU 采样。根据平台的不同,某些值可能需要管理员或 root 权限。选择 xhvxhv-system-wide 以启用跨虚拟机监控程序 (XHV) 采样,需要 root 权限。如果启动了目标应用程序,则默认值为 process-tree;否则,默认值为 none

注意

system-wide 并非在所有平台上都可用。

注意

如果设置为 none,除非 --cpuctxsw 开关设置为 none,否则仍将收集 CPU 上下文切换数据。

--samples-per-backtrace

integer <= 32

1

为收集的每个 CPU IP/回溯样本收集的 CPU IP 样本数。例如,如果设置为 4,则在收集的第四个 CPU IP 样本时,还将收集回溯。较低的值会增加收集的数据量。较高的值可以减少收集开销并减少丢弃的 CPU IP 样本数。如果收集 DWARF 回溯,则默认值为 4,否则默认值为 1。此选项在 Nsight Systems Embedded Platforms Edition 或非 Linux 目标上不可用。

--sampling-frequency

100 < integers < 8000

1000

指定采样/回溯频率。支持的最小频率为 100 Hz。支持的最大频率为 8000 Hz。此选项仅在 QNX、Linux for Tegra 和 Windows 目标上受支持。

--sampling-period (Nsight Systems Embedded Platforms Edition)

integer

determined dynamically

在收集 CPU 指令指针 (IP) 样本之前计数的 CPU 周期事件数。如果已配置,也可以收集回溯。采样周期越小,采样率越高。请注意,较小的采样周期会增加开销,并显著增加结果文件的大小。需要 ``–sampling-trigger=perf`` 开关。

--sampling-period (not Nsight Systems Embedded Platforms Edition)

integer

determined dynamically

在收集 CPU 指令指针 (IP) 样本之前计数的事件数。用于触发样本收集的事件是动态确定的。例如,在基于 Intel 的平台上,它可能是“参考周期”,而在 AMD 平台上,它可能是“CPU 周期”。如果已配置,也可以收集回溯。采样周期越小,采样率越高。请注意,较小的采样周期会增加开销,并显著增加结果文件的大小。此选项仅在 Linux 目标上可用。

--sampling-trigger

timer, sched, perf, cuda

timer,sched

指定回溯收集触发器。可以选择多个 API,仅用逗号分隔(无空格)。仅在 Nsight Systems Embedded Platforms Edition 目标上可用。

--session-new

[a-Z][0-9,a-Z,spaces]

profile-<id>-<application>

命名命令创建的会话。名称必须以字母字符开头,后跟可打印字符或空格字符。任何 %q{ENV_VAR} 模式都将替换为环境变量的值。任何 %h 模式都将替换为系统的主机名。任何 %% 模式都将替换为 %

-w

--show-output

true, false

true

如果为 true,则将目标进程的 stdout 和 stderr 流同时发送到控制台以及添加到报告文件的 stdout/stderr 文件。如果为 false,则仅将目标进程 stdout 和 stderr 流发送到添加到报告文件的 stdout/stderr 文件。

--soc-metrics

true,false

false

收集 SoC 指标。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--soc-metrics-frequency

integer

10000

指定 SoC 指标采样频率。支持的最小频率为 ‘100’ (Hz)。支持的最大频率为 ‘1000000’ (Hz)。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--soc-metrics-set

alias, file:<file name>

参见描述

指定 SoC 指标的指标集。该参数必须是由 --soc-metrics-set=help 开关报告的别名之一,或者是前缀为 file: 的指标配置文件路径。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--start-frame-index

1 <= integer

当帧索引达到起始帧索引之前的帧号时,启动记录会话。请注意,选择此选项时不能包含任何其他启动选项。如果未指定,则默认禁用。

-Y

--start-later

true, false

false

无限期延迟收集,直到为此会话执行 nsys start 命令。启用此选项会覆盖 --delay 选项。

--stats

true, false

false

在收集后生成摘要统计信息。

警告

如果设置为 true,则在收集后将创建一个 SQLite 数据库。如果收集捕获了大量数据,则创建数据库文件可能需要几分钟才能完成。

-x

--stop-on-exit

true, false

true

如果为 true,则在启动的进程退出或持续时间到期时自动停止收集 - 以先发生者为准。如果为 false,则必须设置持续时间,并且收集仅在持续时间到期时停止。Nsight Systems 不正式支持运行时间超过 5 分钟的运行。

-t

--trace

cuda, nvtx, cublas, cublas-verbose, cusparse, cusparse-verbose, cudnn, cudla, cudla-verbose, cusolver, cusolver-verbose, opengl, opengl-annotations, openacc, openmp, osrt, mpi, nvvideo, vulkan, vulkan-annotations, dx11, dx11-annotations, dx12, dx12-annotations, openxr, openxr-annotations, oshmem, ucx, wddm, tegra-accelerators, python-gil, syscall, none

cuda, opengl, nvtx, osrt

选择要跟踪的 API。osrt 开关控制 OS 运行时库跟踪。可以选择多个 API,仅用逗号分隔(无空格)。由于 OpenACC 和 cuXXX API 与 CUDA 紧密相关,因此选择其中一个 API 将自动启用 CUDA 跟踪。cublas、cudla、cusparse 和 cusolver 都具有 XXX-verbose 选项。当启用 DX 或 vulkan API 跟踪时,将自动收集 Reflex SDK 延迟标记。如果选择了 mpi,请参阅下面有关 --mpi-impl 选项的信息。如果选择了 <api>-annotations,则还将跟踪相应的 API。如果选择了 none 选项,则不跟踪任何 API,并且不能选择其他 API。

注意

cuDNN 在 Windows 目标上不可用。

--trace-fork-before-exec

true, false

false

如果为 true,则在 fork 之后和它们调用 exec 函数之一之前跟踪任何子进程。请注意,在此间隔内进行跟踪依赖于未定义的行为,并可能导致您的应用程序崩溃或死锁。此选项仅在 Linux 目标平台上可用。

--vsync

true, false

false

收集 vsync 事件。如果启用了 vsync 事件的收集,还将捕获 display/display_scanline ftrace 事件。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--vulkan-gpu-workload

true, false, individual, batch, none

individual

如果为 individual 或 true,则单独跟踪每个 Vulkan 工作负载的 GPU 活动。如果为 batch,则在 vkQueueSubmit 调用批处理中跟踪 Vulkan 工作负载的 GPU 活动。如果为 none 或 false,则不跟踪 Vulkan 工作负载的 GPU 活动。请注意,此开关仅在指定 --trace=vulkan 时适用。此选项在 QNX 上不受支持。

--wait

primary,all

all

如果为 primary,则 CLI 将等待应用程序进程终止。如果为 all,则 CLI 将额外等待应用程序创建的重新父进程。

--wddm-additional-events

true, false

true

如果为 true,则收集额外的 ETW 事件范围,包括上下文状态、分配、同步等待和信号事件等。请注意,此开关仅在指定 --trace=wddm 时适用。此选项仅在 Windows 目标上受支持。

--wddm-backtraces

true, false

false

如果为 true,则收集 WDDM 事件的回溯。禁用此数据收集可以减少某些目标应用程序的开销。请注意,此开关仅在指定 --trace=wddm 时适用。此选项仅在 Windows 目标上受支持。

--xhv-trace

< filepath pct.json >

none

收集虚拟机监控程序跟踪。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--xhv-trace-events

all, none, core, sched, irq, trap

all

仅在 Nsight Systems Embedded Platforms Edition 中可用。

CLI 分析命令开关选项

nsys analyze 命令使用现有结果上的专家系统规则生成报告并将其输出到终端。报告是从 .nsys-rep 文件的 SQLite 导出生成的。如果指定了 .nsys-rep 文件,则 Nsight Systems 将查找随附的 SQLite 文件并使用它。如果不存在 SQLite 导出文件,则将创建一个。

选择 analyze 命令开关后,可以使用以下选项。用法

nsys [global-options] analyze [options] [input-file]

短选项

长选项

可能的参数

默认值

开关描述

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

-f

--format

column, table, csv, tsv, json, hdoc, htable, .

指定输出格式。特殊名称“.”表示给定输出的默认格式。控制台的默认格式为 column,而文件和进程输出默认为 csv。此选项可以多次使用。也可以使用逗号分隔的列表指定多种格式 (<name[:args…][,name[:args…]…]>)。有关每种格式可用的选项,请参阅 报告格式化程序

--force-export

true, false

false

强制从指定的 .nsys-rep 文件重新导出 SQLite 文件,即使 SQLite 文件已存在。

--force-overwrite

true, false

false

覆盖任何现有的输出文件。

--help-formats

<format_name>, ALL, [none]

none

不带参数时,列出可用输出格式的摘要。如果给出了格式名称,则显示有关该格式的更详细的说明。如果给出了 ALL,则显示有关所有可用格式的更详细的说明。

--help-rules

<rule_name>, ALL, [none]

none

不带参数时,列出可用的规则及其简短描述。如果给出了规则名称,则显示有关该规则的更详细的说明。如果给出了 ALL,则显示有关所有可用规则的更详细的说明。

-o

--output

-, @<command>, <basename>, .

-

指定输出机制。有三种输出机制:打印到控制台、输出到文件或输出到命令。此选项可以多次使用。也可以使用逗号分隔的列表指定多个输出。如果给定的输出名称为“-”,则输出将显示在控制台上。如果输出名称以“@”开头,则输出指定要运行的命令。nsys 命令将执行,分析输出将通过管道传递到该命令。任何其他输出都被假定为文件的基本路径和名称。如果给出了文件基本名称,则使用的文件名将为:<basename>_<analysis&args>.<output_format>。默认基本名称(包括路径)是 SQLite 文件的名称(从输入文件或 --sqlite 选项派生),减去扩展名。输出“.”可用于指示分析应输出到文件,并且应使用默认基本名称。要使用默认基本名称将一个或多个分析输出写入文件,请使用 --output。如果输出以“@”开头,则 nsys 命令输出将通过管道传递到给定的命令。命令将运行,并且输出将通过管道传递到命令的 stdin(标准输入)。命令的 stdout 和 stderr 仍然附加到控制台,因此任何输出都将直接显示到控制台。请注意,命令字符串的解析方式存在一些限制。不支持任何 shell 扩展(包括 *、?、[] 和 ~)。该命令不能通过管道传递到另一个命令,也不能使用 shell 语法重定向到文件。命令和命令参数在空格上拆分,并且不支持任何引号(在命令语法内)。对于需要复杂命令行语法的命令,建议将该命令放入 shell 脚本文件中,并将该脚本指定为输出命令。

-q

--quiet

不显示详细消息,仅显示错误。

-r

--rule

cuda_memcpy_async, cuda_memcpy_sync, cuda_memset_sync, cuda_api_sync, gpu_gaps, gpu_time_util, dx12_mem_ops

all

指定要执行的规则,包括任何参数。此选项可以多次使用。也可以使用逗号分隔的列表指定多个规则。有关所有规则的详细信息,请参阅 专家系统 部分和 --help-rules 开关。

--sqlite

<file.sqlite>

指定 SQLite 导出文件名。如果此文件存在,则将使用它。如果此文件不存在(或如果给出了 --force-export),则将在处理之前从指定的 .nsys-rep 文件创建此文件。如果指定的输入文件也是 SQLite 文件,则不能使用此选项。

--timeunit

nsec, 纳秒, usec, 微秒, msec, 毫秒, 秒

nanoseconds

设置基本时间单位。开关的参数通过最长前缀匹配进行匹配。这意味着不必将整个单词作为开关参数写入。这类似于将“:time=<unit>”参数传递给每个格式化程序,尽管格式化程序使用更严格的命名约定。有关单位转换的更多详细信息,请参阅 nsys analyze --help-formats column

CLI 取消命令开关选项

选择 cancel 命令开关后,可以使用以下选项。用法

nsys [global-options] cancel [options]

短选项

长选项

可能的参数

默认值

开关描述

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

--session

<会话标识符>

none

取消给定会话中的采集。选项参数必须表示由 nsys sessions list 报告的有效会话名称或 ID。选项参数中的任何 %q{ENV_VAR} 模式都将被替换为环境变量的值。选项参数中的任何 %h 模式都将被替换为系统的主机名。选项参数中的任何 %% 模式都将被替换为 %

CLI 导出命令开关选项

选择 export 命令开关后,可以使用以下选项。用法

nsys [global-options] export [options] [nsys-rep-file]

短选项

长选项

可能的参数

默认值

开关描述

--append

此选项仅适用于具有现有导出文件的“文件目录”输出格式。如果给定此选项,则不会报告错误,并且现有输出文件将不会被覆盖。

-f

--force-overwrite

true, false

false

如果为 true,则使用相同的输出文件名(nsys-rep、SQLITE、HDF、TEXT、JSON、ARROW、ARROWDIR、PARQUETDIR)覆盖所有现有结果文件。

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

--include-blobs

true, false

false

控制是否将 NVTX 扩展负载导出为二进制数据。此选项仅影响 SQLite、Arrow 和 Arrow/Parquet 目录导出。

--include-json

true, false

false

控制是否在导出中包含重复的 JSON 块。某些事件包含动态定义的负载。这些负载通常导出为 JSON 块,以保留其自由形式的结构。不幸的是,JSON 文本块不是表示数据的有效方式,并且可能导致导出文件变得非常大。为了解决这个问题,扩展了一些事件类(例如 GENERIC_EVENT 数据),以在本机导出格式中导出负载数据。对于那些具有本机导出表示的事件,此标志将启用或禁用等效 JSON 块的导出。请注意,这不会抑制所有 JSON 输出。某些表(如 META_DATA_* 表和 TARGET_INFO_* 表)可能包含少量 JSON 字符串。此标志不会抑制这些字符串。此外,某些事件类(例如 ETW 事件和具有用户定义负载的 NVTX 事件)没有本机导出表示。对于 JSON 块是唯一导出格式的事件,它将始终包含在内。请注意,此标志与 JSON 导出(即 --type=json)无关,也不会更改 JSON 导出输出。

-l

--lazy

true, false

true

控制表创建是否为延迟加载。如果为 true,则仅当表包含数据时才会创建表。此选项将在未来弃用,所有导出都将是非延迟加载的。这仅影响 SQLite、HDF5、Arrow 和 Arrow/Parquet 目录导出。

-o

--output

<文件名>

<输入文件名.ext>

设置 .output 文件名。默认值是输入文件名,扩展名为所选格式的扩展名。

-q

--quiet

true, false

false

如果为 true,则不显示进度条。

--separate-strings

true,false

false

分别输出存储的字符串和线程名称,每行一个值。这仅影响 JSON 和文本输出。

-t

--type

sqlite, hdf, text, json, info, arrow, arrowdir, parquetdir

sqlite

导出格式类型。HDF 格式仅在 x86_64 Linux 和 Windows 上受支持。

--tables

<模式>[,<模式>…]

值是以逗号分隔的搜索模式列表(无空格)。可以多次指定此选项。如果设置,则仅导出与一个或多个模式匹配的表。如果未设置,则将导出所有表。此功能仅适用于 SQLite、HDFS、Arrow 和 Arrow/Parquet 目录导出。模式是区分大小写的 POSIX 基本正则表达式。

注意

这是一个为专家用户设计的高级功能。此选项不强制表之间的任何类型的依赖关系或关联,并且将真正仅导出列出的表。如果在分析功能(如 nsys statsnsys analyze)中使用部分导出,则用户有责任确保导出所有必需的表。

--times

<时间范围>[,<时间范围>…]

值是以逗号分隔的时间范围列表(无空格)。可以多次指定此选项。如果设置,则仅导出至少在一个给定范围内发生的事件。如果未设置,则将导出所有事件。此功能仅适用于 SQLite、HDFS、Arrow 和 Arrow/Parquet 目录导出。

注意

这是一个为专家用户设计的高级功能。此选项不强制相关事件(如 CUDA 启动 API 和 CUDA 内核执行)之间的任何类型的依赖关系或关联。如果在分析功能中使用过滤后的导出,例如由于缺少数据而生成,并且可能会生成意外或误导性的结果。用户有责任确保导出所有相关和相互关联的事件。

时间范围的格式为:[:][<开始时间>]/[<结束时间>][:] 单个时间范围由一对时间值定义,用斜杠分隔。至少需要一个时间值。任何省略的时间值都将默认为最小值或最大值(从零点大约 +/- 290 年)。开始时间必须小于或等于结束时间。时间值是一系列整数或浮点值,后跟可选单位。如果未给出单位,则假定数字以纳秒为单位。支持正值和负值,以及科学计数法 e。只要没有空格,就可以给出多个值/单位。单位不必按任何顺序给出,甚至可以重复。理解以下单位

ns, nsec : 纳秒

us, usec : 微秒

ms, msec : 毫秒

s, sec : 秒

m, min : 分钟 (60 秒)

h, hour : 小时 (3600 秒)

例如,值 1s2ms3us4ns 表示 1,002,003,004 纳秒。2ns5us2 将是 5004 纳秒(2 纳秒加 5 微秒加 2 纳秒)。浮点值将转换为 64 位 double,并受该格式的精度限制。默认情况下,时间范围具有 strict 边界。在时间范围的开头和/或结尾存在 : 字符会使该边界变为 non-strict,这意味着允许过滤后的事件跨越边界。本质上,如果两个边界都是严格的,则事件必须完全存在于定义的范围内,但如果两个边界都是 non-strict,则事件必须存在于定义的范围内。给定以下时间线,以及单个过滤器范围(标记为 START 和 END),给定的事件(用 = 字符标记)将被视为匹配 (T) 或不匹配 (F),具体取决于过滤器的开始/结束边界的严格性。

    START     END             S/E   :S/E    S/E:  :S/E:

      |  ====  |               T      T      T      T

=============  |               F      T      F      T

      |  ============          F      F      T      T

=====================          F      F      F      T

===== |   or   | ====          F      F      F      F

虽然许多事件都有开始时间和结束时间,但某些事件只有一个时间戳。这些类型的事件被视为开始时间等于结束时间的事件。如果事件的结束时间早于开始时间,则结束时间将调整为开始时间。如果与 --ts-normalize 和/或 --ts-shift 选项结合使用,则时间过滤器将在事件的时间值调整后应用。

--ts-normalize

true, false

false

如果为 true,则报告中的所有时间戳值都将移至 UTC 挂钟时间,如 UNIX 纪元定义的那样。此选项可以与 --ts-shift 选项结合使用,在这种情况下,将应用两个调整。如果使用此选项来对齐来自集群或分布式系统的一系列报告,则对齐的精度受系统时钟的同步精度限制。对于详细分析,建议使用 PTP 或其他高精度同步方法。NTP 不太可能产生理想的结果。此选项仅适用于 SQLite、HDF5、Arrow 和 Arrow/Parquet 目录导出。

--ts-shift

有符号整数,以纳秒为单位

0

如果给定,则报告中的所有时间戳值都将按给定的量移动。此选项可以与 --ts-normalize 选项结合使用,在这种情况下,将应用两个调整。此选项可用于“手动对齐”在不同时间捕获的报告文件,或在系统时钟同步不良的分布式系统上捕获的报告。此选项仅适用于 SQLite、HDF5、Arrow 和 Arrow/Parquet 目录导出。

CLI 启动命令开关选项

选择 launch 命令开关后,可以使用以下选项。用法

nsys [global-options] launch [options] <application> [application-arguments]

短选项

长选项

可能的参数

默认值

开关描述

-b

--backtrace

auto, fp ,lbr, dwarf, none

选择在采样时使用的回溯方法。选项 lbr 使用 Intel(c) Corporation 的 Last Branch Record 寄存器,仅适用于代号为 Haswell 及更高版本的 Intel(c) CPU。选项 fp 是帧指针,并假定在编译期间启用了帧指针。选项 dwarf 使用 DWARF 的 CFI(调用帧信息)。将值设置为 none 可以减少收集开销。

--clock-frequency-changes

true, false

false

收集时钟频率变化。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--cpu-cluster-events

0x16, 0x17, …, none

none

收集每个集群的 Uncore PMU 计数器。可以选择多个值,仅用逗号分隔(无空格)。使用 --cpu-cluster-events=help 开关查看值的完整列表。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--command-file

< 文件名 >

none

打开包含 profile 开关的文件并解析这些开关。请注意,命令行上的其他开关将覆盖文件中的开关。此标志可以指定多次。

--cpu-core-events

0x11,0x13,…,none

none

收集每个核心的 PMU 计数器。可以选择多个值,仅用逗号分隔(无空格)。使用 --cpu-core-events=help 开关查看完整的值列表。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--cpu-core-metrics

0,1,2,…,none

none

收集 CPU 核心上的指标。可以选择多个值,仅用逗号分隔(无空格)。使用 --cpu-core-metrics=help 开关查看完整的值列表。注意:仅在 Grace 上可用。

--cpu-socket-events

0x2a, 0x2c, …, none

none

收集每个插槽的 Uncore PMU 计数器。可以选择多个值,仅用逗号分隔(无空格)。使用 --cpu-socket-events=help 开关查看值的完整列表。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--cpuctxsw

process-tree, system-wide, none

process-tree

跟踪操作系统线程调度活动。选择“none”以禁用跟踪 CPU 上下文切换。根据平台的不同,某些值可能需要管理员或 root 权限。注意:如果 --sample 开关设置为除“none”以外的值,则 --cpuctxsw 设置硬编码为与 --sample 开关相同的值。如果 --sample=none 并且启动了目标应用程序,则默认值为“process-tree”,否则默认值为“none”。在 Nsight Systems Embedded Platforms Edition 中需要 --sampling-trigger=perf 开关。

--cuda-flush-interval

毫秒

请参阅描述

设置以毫秒为单位的间隔,当缓冲的 CUDA 数据自动保存到存储时。CUDA 数据缓冲区保存可能会导致分析器开销。可以使用此开关控制缓冲区保存行为。如果在运行 CUDA 11.0 或更高版本的系统上将 CUDA 刷新间隔设置为 0,则缓冲区会在填满时保存。如果在这样的系统上将刷新间隔设置为非零值,则缓冲区仅在刷新间隔到期时保存。如果设置了刷新间隔并且分析器在刷新间隔到期之前耗尽可用缓冲区,则将根据需要分配额外的缓冲区。在这种情况下,设置刷新间隔可以减少缓冲区保存开销,但会增加分析器的内存使用量。如果在运行旧版本 CUDA 的系统上将刷新间隔设置为 0,则缓冲区会在采集结束时保存。如果分析器耗尽可用缓冲区,则会根据需要分配额外的缓冲区。如果将刷新间隔设置为非零值,则在刷新间隔到期时保存缓冲区。在保存缓冲区之前,可能会在工作流程中插入 cuCtxSynchronize 调用,这将导致应用程序开销。在这种情况下,设置刷新间隔可以减少分析器的内存使用量,但可能会增加保存开销。对于超过 30 秒的采集,建议间隔为 10 秒。默认值对于 Nsight Systems Embedded Platforms Edition 为 10000,否则为 0。

--cuda-memory-usage

true, false

false

跟踪 CUDA 内核的 GPU 内存使用情况。仅当启用 CUDA 跟踪时适用。注意:此功能可能会导致显着的运行时开销。

--cuda-um-cpu-page-faults

true, false

false

此开关跟踪当 CPU 代码尝试访问驻留在设备上的内存页时发生的页错误。注意:此功能可能会导致显着的运行时开销。在 Nsight Systems Embedded Platforms Edition 上不可用。

--cuda-um-gpu-page-faults

true, false

false

此开关跟踪当 GPU 代码尝试访问驻留在主机上的内存页时发生的页错误。注意:此功能可能会导致显着的运行时开销。在 Nsight Systems Embedded Platforms Edition 上不可用。

--cudabacktrace

all, none, kernel, memory, sync, other

none

在跟踪 CUDA API 时,启用在调用 CUDA API 时收集回溯。可能会发生显着的运行时开销。可以使用 , 组合值。除 none 以外的每个值都可以在 : 之后附加一个阈值。阈值是以纳秒为单位的持续时间,CUDA API 必须执行该持续时间才能收集回溯;例如,kernel:500。每个阈值的默认值为 1000ns (1us)。注意:必须启用 CPU 采样。

--cuda-graph-trace

graph, node

graph

如果选择 graph,则 CUDA 图将作为一个整体进行跟踪,并且不会收集节点活动。这将最大限度地减少开销,但需要 CUDA 驱动程序版本 515.43 或更高版本。如果选择 node,则将收集节点活动,但不会将 CUDA 图作为一个整体进行跟踪。这可能会导致显着的运行时开销。如果可用,则默认值为 graph,否则默认值为 node

--dx-force-declare-adapter-removal-support

true, false

false

Nsight Systems 跟踪初始化涉及创建 D3D 设备并丢弃它。启用此标志会在设备创建之前调用 DXGIDeclareAdapterRemovalSupport()。需要启用 DX11 或 DX12 跟踪。

--dx12-gpu-workload

true, false, individual, batch, none

individual

如果为 individual 或 true,则单独跟踪每个 DX12 工作负载的 GPU 活动。如果为 batch,则在 ExecuteCommandLists 调用批处理中跟踪 DX12 工作负载的 GPU 活动。如果为 none 或 false,则不跟踪 DX12 工作负载的 GPU 活动。请注意,仅当指定 --trace=dx12 时,此开关才适用。此选项仅在 Windows 目标上受支持。

--dx12-wait-calls

true, false

true

如果为 true,则跟踪在 DX12 栅栏上阻塞的等待调用。请注意,此开关仅在指定 --trace=dx12 时适用。此选项仅在 Windows 目标上受支持。

-e

--env-var

A=B

NA

为要启动的应用程序进程设置环境变量。环境变量应定义为 A=B。可以将多个环境变量指定为 A=B,C=D。

--gpu-video-device

help, <id1,id2,…>, all, none

none

分析视频设备。--help 提供支持的设备列表、不支持设备的原因和 ID。<id1,id2,...> 仅为指定的设备启用此功能。

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

--hotkey-capture

‘F1’ 到 ‘F12’

‘F12’

触发性能分析会话的热键。请注意,此开关仅在指定 --capture-range=hotkey 时适用。

-n

--inherit-environment

true, false

true

如果为 true,则当前环境变量和工具的环境变量将为启动的进程指定。如果为 false,则仅为启动的进程指定工具的环境变量。

--injection-use-detours

true,false

true

使用 detours 进行注入。如果为 false,则进程注入将通过 windows hooks 执行,这允许它绕过反作弊软件。

--isr

true, false

false

跟踪中断服务例程 (ISR) 和延迟过程调用 (DPC)。需要管理员权限。仅在 Windows 设备上可用。

--mpi-impl

openmpi,mpich

openmpi

当使用 --trace=mpi 跟踪 MPI API 时,使用 --mpi-impl 指定应用程序正在使用的 MPI 实现。如果未指定 MPI 实现,则 nsys 会尝试根据动态链接器的搜索路径自动检测它。如果此操作失败,则使用“openmpi”。不支持在没有 --trace=mpi 的情况下调用 --mpi-impl

-p

--nvtx-capture

range@domain, range, range@*

none

指定 NVTX 范围和域以触发分析会话。此选项仅在与 --capture-range=nvtx 一起使用时适用。

--nvtx-domain-exclude

default, <domain_names>

选择从以逗号分隔的域列表中排除 NVTX 事件。default 排除没有域的 NVTX 事件。具有此名称或域名中包含逗号的域名必须使用 \\ 转义。

注意

只能使用 --nvtx-domain-include--nvtx-domain-exclude 中的一个。此选项仅在指定 --trace=nvtx 时适用。

--nvtx-domain-include

default, <domain_names>

选择仅包含来自逗号分隔域列表的 NVTX 事件。“default”过滤 NVTX 默认域。具有此名称或域名中包含逗号的域必须用“\”转义。

注意

只能使用 --nvtx-domain-include--nvtx-domain-exclude 中的一个。此选项仅在指定 --trace=nvtx 时适用。

--python-functions-trace

<json_file>

指定包含要跟踪的请求函数的 JSON 文件的路径。

--opengl-gpu-workload

true, false

true

如果为 true,则跟踪 OpenGL 工作负载的 GPU 活动。请注意,此开关仅在指定 --trace=opengl 时适用。

--os-events

“help”或最终用户以“x,y”格式选择的事件

选择要采样的操作系统事件。使用 --os-events=help 开关查看完整的事件列表。可以选择多个值,仅用逗号分隔(无空格)。使用 --event-sample 开关启用。

在 Nsight Systems Embedded Platforms Edition 上不可用。

--osrt-backtrace-depth

integer

24

设置为 OS 运行时库调用收集的回溯深度。

--osrt-backtrace-stack-size

integer

6144

设置堆栈转储大小(以字节为单位),以生成 OS 运行时库调用的回溯。

--osrt-backtrace-threshold

nanoseconds

80000

设置所有 OS 运行时库调用必须执行的持续时间(以纳秒为单位),超过此持续时间后才收集回溯。

--osrt-threshold

< nanoseconds >

1000 ns

设置操作系统运行时 (osrt) API 必须执行的持续时间(以纳秒为单位),超过此持续时间后才会被跟踪。远小于 1000 的值可能会导致显著的开销,并导致非常大的结果文件。

--python-backtrace

cuda, none

none

在跟踪选定的 API 触发器时收集 Python 回溯事件。此选项在 Arm 服务器 (SBSA) 平台和 x86 Linux 目标上受支持。注意:必须启用选定的 API 和 CPU 采样的跟踪和回溯。例如,当使用 --python-backtrace=cuda 时,必须设置 --cudabacktrace

--python-sampling

true, false

false

收集 Python 回溯采样事件。此选项在 Arm 服务器 (SBSA) 平台、x86 Linux 和 Windows 目标上受支持。注意:当分析仅限 Python 的工作流程时,请考虑禁用 CPU 采样选项以减少开销。

--python-sampling-frequency

1 < integers < 2000

1000

指定 Python 采样频率。支持的最小频率为 1Hz。支持的最大频率为 2KHz。如果 --python-sampling 选项设置为 false,则忽略此选项。

--pytorch

autograd-nvtx, autograd-shapes-nvtx, none

none

当加载 torch 模块时,启用 PyTorch 的 torch.autograd.profiler.emit_nvtx()

--qnx-kernel-events

class/event,event, class/event:mode, class:mode,help,none

none

可以选择多个值,仅用逗号分隔(无空格)。有关“:mode”格式,请参阅 --qnx-kernel-events-mode 开关描述。使用 --qnx-kernel-events=help 开关查看完整的值列表。示例:--qnx-kernel-events=8/1:system:wide,_NTO_TRACE_THREAD:process:fast, \_NTO_TRACE_KERCALLENTER/\__KER_BAD,_NTO_TRACE_COMM,13。收集 QNX 内核事件。

--qnx-kernel-events-mode

system,process,fast,wide

system:fast

值仅用冒号 (:) 分隔(无空格)。systemprocess 不能同时指定。fastwide 不能同时指定。请查看 QNX 文档以确定何时选择 fastwide 模式。指定 QNX 内核事件收集的默认模式。

--resolve-symbols

true,false

true

解析捕获的样本和回溯的符号。

--retain-etw-files

true, false

false

保留跟踪生成的 ETW 文件,合并这些文件并将它们移动到输出目录。

--run-as

< username >

none

以指定的用户名运行目标应用程序。如果未指定,则目标应用程序将由与 Nsight Systems 相同的用户运行。需要 root 权限。

仅适用于 Linux 目标。

-s

--sample

process-tree, system-wide, none

process-tree

选择如何收集 CPU IP/回溯样本。如果选择 none,则禁用 CPU 采样。根据平台的不同,某些值可能需要管理员或 root 权限。如果启动了目标应用程序,则默认值为 process-tree;否则,默认值为 none

注意

system-wide 并非在所有平台上都可用。

注意

如果设置为 none,除非 --cpuctxsw 开关设置为 none,否则仍将收集 CPU 上下文切换数据。

--samples-per-backtrace

integer <= 32

1

为每个收集的 CPU IP/回溯样本收集的 CPU IP 样本数量。例如,如果设置为 4,则在收集的第四个 CPU IP 样本上,还将收集回溯。较低的值会增加收集的数据量。较高的值可以减少收集开销并减少丢弃的 CPU IP 样本数量。如果收集 DWARF 回溯,则默认值为 4,否则默认值为 1。

此选项在 Nsight Systems Embedded Platforms Edition 或非 Linux 目标上不可用。

--sampling-frequency

100 < integers < 8000

1000

指定采样/回溯频率。支持的最小频率为 100 Hz。支持的最大频率为 8000 Hz。

此选项仅在 QNX、Linux for Tegra 和 Windows 目标上受支持。

--sampling-period (Nsight Systems Embedded Platforms Edition)

integer

determined dynamically

在收集 CPU 指令指针 (IP) 样本之前计数的 CPU 周期事件数。如果配置,也可能会收集回溯。采样周期越小,采样率越高。请注意,较小的采样周期会增加开销,并显着增加结果文件的大小。需要 --sampling-trigger=perf 开关。

--sampling-period (not Nsight Systems Embedded Platforms Edition)

integer

determined dynamically

在收集 CPU 指令指针 (IP) 样本之前计数的事件数。用于触发样本收集的事件是动态确定的。例如,在基于 Intel 的平台上,它可能是“参考周期”,而在 AMD 平台上,它可能是“CPU 周期”。如果配置,也可能会收集回溯。采样周期越小,采样率越高。请注意,较小的采样周期会增加开销,并显着增加结果文件的大小。

此选项仅在 Linux 目标上可用。

--sampling-trigger

timer, sched, perf, cuda

timer,sched

指定回溯收集触发器。可以选择多个 API,仅用逗号分隔(无空格)。仅在 Nsight Systems Embedded Platforms Edition 目标上可用。

--session

会话标识符

none

在指示的会话中启动应用程序。选项参数必须表示由 nsys sessions list 报告的有效会话名称或 ID。任何 %q{ENV_VAR} 模式都将被替换为环境变量的值。任何 %h 模式都将被替换为系统的主机名。任何 %% 模式都将被替换为 %

--session-new

[a-Z][0-9,a-Z,spaces]

profile-<id>-<application>

命名命令创建的会话。名称必须以字母字符开头,后跟可打印字符或空格字符。任何 %q{ENV_VAR} 模式都将替换为环境变量的值。任何 %h 模式都将替换为系统的主机名。任何 %% 模式都将替换为 %

-w

--show-output

true, false

true

如果为 true,则将目标进程的 stdout 和 stderr 流同时发送到控制台以及添加到报告文件中的 stdout/stderr 文件。如果为 false,则仅将目标进程 stdout 和 stderr 流发送到添加到报告文件中的 stdout/stderr 文件。

-t

--trace

cuda, nvtx, cublas, cublas-verbose, cusparse, cusparse-verbose, cudnn, cudla, cudla-verbose, cusolver, cusolver-verbose, opengl, opengl-annotations, openacc, openmp, osrt, mpi, nvvideo, vulkan, vulkan-annotations, dx11, dx11-annotations, dx12, dx12-annotations, openxr, openxr-annotations, oshmem, ucx, wddm, tegra-accelerators, python-gil, syscall, none

cuda, opengl, nvtx, osrt

选择要跟踪的 API。osrt 开关控制 OS 运行时库跟踪。可以选择多个 API,仅用逗号分隔(无空格)。由于 OpenACC 和 cuXXX API 与 CUDA 紧密相关,因此选择其中一个 API 将自动启用 CUDA 跟踪。cublas、cudla、cusparse 和 cusolver 都具有 XXX-verbose 选项。当启用 DX 或 vulkan API 跟踪时,将自动收集 Reflex SDK 延迟标记。如果选择了 mpi,请参阅下面有关 --mpi-impl 选项的信息。如果选择了 <api>-annotations,则还将跟踪相应的 API。如果选择了 none 选项,则不跟踪任何 API,并且不能选择其他 API。

注意

cuDNN 在 Windows 目标上不可用。

--trace-fork-before-exec

true, false

false

如果为 true,则在 fork 后和调用 exec 函数之一之前跟踪任何子进程。请注意,在此间隔内进行跟踪依赖于未定义的行为,并可能导致您的应用程序崩溃或死锁。注意:此选项仅在 Linux 目标平台上可用。

--vulkan-gpu-workload

true, false, individual, batch, none

individual

如果为 individual 或 true,则单独跟踪每个 Vulkan 工作负载的 GPU 活动。如果为 batch,则在 vkQueueSubmit 调用批处理中跟踪 Vulkan 工作负载的 GPU 活动。如果为 none 或 false,则不跟踪 Vulkan 工作负载的 GPU 活动。请注意,仅当指定 --trace=vulkan 时,此开关才适用。

此选项在 QNX 上不受支持。

--wait

primary,all

all

如果为 primary,则 CLI 将等待应用程序进程终止。如果为 all,则 CLI 将额外等待应用程序创建的重新父进程。

--wddm-additional-events

true, false

true

如果为 true,则收集额外的 ETW 事件范围,包括上下文状态、分配、同步等待和信号事件等。请注意,仅当指定 --trace=wddm 时,此开关才适用。

此选项仅在 Windows 目标上受支持。

--wddm-backtraces

true, false

false

如果为 true,则收集 WDDM 事件的回溯。禁用此数据收集可以减少某些目标应用程序的开销。请注意,仅当指定 --trace=wddm 时,此开关才适用。

此选项仅在 Windows 目标上受支持。

CLI 会话命令开关子命令

选择 sessions 命令开关后,可以使用以下子命令。用法

nsys [global-options] sessions [subcommand]

子命令

描述

list

列出所有活动会话,包括 ID、名称和状态信息

CLI 会话列表命令开关选项

选择 sessions list 命令开关后,可以使用以下选项。用法

nsys [global-options] sessions list [options]

短选项

长选项

可能的参数

默认值

开关描述

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

-p

--show-header

true, false

true

控制是否应在输出中显示标头。

CLI 关闭命令开关选项

选择 shutdown 命令开关后,可以使用以下选项。用法

nsys [global-options] shutdown [options]

短选项

长选项

可能的参数

默认值

开关描述

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

--kill

在 Linux 上:one, sigkill, sigterm, 信号编号

在 Windows 上:true, false

在 Linux 上:sigterm

在 Windows 上:true

在关闭会话时向目标应用程序的进程组发送信号。

--session

会话标识符

none

关闭指示的会话。选项参数必须表示由 nsys sessions list 报告的有效会话名称或 ID。任何 %q{ENV_VAR} 模式都将被替换为环境变量的值。任何 %h 模式都将被替换为系统的主机名。任何 %% 模式都将被替换为 %

CLI 启动命令开关选项

选择 start 命令开关后,可以使用以下选项。用法

nsys [global-options] start [options]

短选项

长选项

可能的参数

默认值

开关描述

--accelerator-trace

none,tegra-accelerators

none

从硬件引擎单元收集其他加速器工作负载跟踪。仅在 Nsight Systems Embedded Platforms Edition 中可用。

-b

--backtrace

auto,fp,lbr,dwarf,none

选择在采样时使用的回溯方法。选项 lbr 使用 Intel(c) Corporation 的 Last Branch Record 寄存器,仅适用于代号为 Haswell 及更高版本的 Intel(c) CPU。选项 fp 是帧指针,并假定在编译期间启用了帧指针。选项 dwarf 使用 DWARF 的 CFI(调用帧信息)。将值设置为 none 可以减少收集开销。

-c

--capture-range

none, cudaProfilerApi, hotkey, nvtx

none

当使用 --capture-range 时,性能分析仅在调用适当的启动 API 或热键时才会开始。如果 --capture-range 设置为 none,则启动/停止 API 调用和热键将被忽略。

注意

热键仅适用于图形应用程序。

--capture-range-end

none, stop, stop-shutdown, repeat[:N], repeat-shutdown:N

stop-shutdown

指定捕获范围结束时的所需行为。仅在与 --capture-range 选项一起使用时适用。如果 none,则将忽略捕获范围结束。如果 stop,则采集将在捕获范围结束时停止。任何后续捕获范围都将被忽略。目标应用程序将继续运行。如果 stop-shutdown,则采集将在捕获范围结束时停止,并且会话将关闭。如果 repeat[:N],则采集将在捕获范围结束时停止,并且后续捕获范围将触发更多采集。使用可选的 :N 来指定要接受的最大捕获范围数。一旦收集了 N 个捕获范围,任何后续捕获范围都将被忽略。如果 repeat-shutdown:N,则行为与 repeat:N 相同,但会话将在 N 个范围后关闭。对于 stop-shutdownrepeat-shutdown:N,与往常一样,使用 --kill 选项来指定在关闭会话时是否应终止目标应用程序。

--cpu-core-events(非 Nsight Systems Embedded Platforms Edition)

“help”或最终用户以“x,y”格式选择的事件

‘2’ 即 指令已退役

选择要采样的 CPU 内核事件。使用 --cpu-core-events=help 开关查看事件的完整列表以及可以同时收集的事件数。可以选择多个值,仅用逗号分隔(无空格)。使用 --event-sample 开关启用。

--cpuctxsw

process-tree, system-wide, none

process-tree

跟踪操作系统线程调度活动。选择 none 以禁用跟踪 CPU 上下文切换。根据平台的不同,某些值可能需要管理员或 root 权限。

注意

如果 --sample 开关设置为 none 以外的值,则 --cpuctxsw 设置将硬编码为与 --sample 开关相同的值。如果 --sample=none 并且启动了目标应用程序,则默认值为 process-tree,否则默认值为 none。在 Nsight Systems Embedded Platforms Edition 中需要 --sampling-trigger=perf 开关

--enable

<plugin_name>[,arg1,arg2,…]

NA

使用指定的插件。可以多次指定此选项以启用多个插件。插件参数仅用逗号分隔(无空格)。可以使用反斜杠 \\ 转义逗号。反斜杠本身可以用另一个反斜杠 \\\\ 转义。要在参数中包含空格,请将参数括在双引号 " 中。要列出所有可用的插件,请使用 --enable=help 命令。

--xhv-vm-symbols

<文件路径 kernel_symbols.json>

none

XHV 采样配置文件。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--etw-provider

“<名称>,<guid>”,或 JSON 文件的路径

none

添加自定义 ETW 跟踪提供程序。如果要指定比名称和 GUID 更多的属性,请提供如下所述的 JSON 配置文件。此开关可以多次使用以添加多个提供程序。注意:仅适用于 Windows 目标。

--event-sample

system-wide, none

none

使用 --cpu-core-events=help--os-events=help 开关查看事件的完整列表。如果启用了事件采样并且未选择任何事件,则默认情况下会选择 CPU 内核事件“已执行指令”。在 Nsight Systems Embedded Platforms Edition 上不可用。

--event-sampling-frequency

1 到 20 Hz 的整数

3

用于收集事件计数的采样频率。最小事件采样频率为 1 Hz。最大事件采样频率为 20 Hz。在 Nsight Systems Embedded Platforms Edition 中不可用。

--export

arrow, arrowdir, hdf, json, parquetdir, sqlite, text, none

none

基于收集的数据创建其他输出文件。此选项可以多次给出。

警告

如果收集捕获大量数据,则创建导出文件可能需要几分钟才能完成。

--flush-on-cudaprofilerstop

true, false

true

如果设置为 true,则任何对 cudaProfilerStop() 的调用都将导致 CUDA 跟踪缓冲区被刷新。请注意,无论此开关的值如何,CUDA 跟踪缓冲区都将在收集结束时刷新。

-f

--force-overwrite

true, false

false

如果为 true,则覆盖所有现有的结果文件,这些文件具有相同的输出文件名(.nsys-rep、.sqlite、.h5、.txt、.json、.arrows、_arwdir、_pqtdir)。

--ftrace

收集 ftrace 事件。参数应列出要收集的事件,格式为:subsystem1/event1,subsystem2/event2。需要 root 权限。默认情况下不收集 ftrace 事件。

--ftrace-keep-user-config

跳过初始 ftrace 设置并收集已配置的事件。默认值重置 ftrace 配置。

--gpu-metrics-devices

GPU ID, help, all, none

none

从指定的设备收集 GPU 指标。通过使用 --gpu-metrics-devices=help 开关确定 GPU ID。

--gpu-metrics-frequency

integer

10000

指定 GPU 指标采样频率。支持的最小频率为 10 (Hz)。支持的最大频率为 200000 (Hz)。

--gpu-metrics-set

alias, file:<file name>

参见描述

指定 GPU 指标的指标集。该参数必须是由 --gpu-metrics-set=help 开关报告的别名之一,或者是前缀为 file: 的指标配置文件路径。默认值是第一个支持所有选定 GPU 的指标集。

--gpu-video-device

help, <id1,id2,…>, all, none

none

分析视频设备。--help 提供支持的设备列表、不支持设备的原因和 ID。<id1,id2,...> 仅为指定的设备启用此功能。

--gpuctxsw

true,false

false

跟踪 GPU 上下文切换。请注意,这需要 r435.17 或更高版本的驱动程序以及 root 权限。

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

--ib-net-info-devices

<NIC names>

none

以逗号分隔的 NIC 名称列表。ibdiagnet 将使用这些 NIC 进行网络发现。此选项创建用于收集网络信息的 ibdiagnet 文件。示例值:mlx5_0,mlx5_1。如果设置了 --ib-net-info-output 选项,则 Nsight Systems 会将网络信息存储在该路径下。否则,它将在临时路径中创建,并在处理后丢弃。如果指定了多个 NIC,则仅保存最后一个网络信息文件。请注意,此选项不应与 --ib-net-info-files 选项一起使用。

--ib-net-info-files

<file paths>

none

以逗号分隔的文件路径列表。包含网络信息数据的现有 ibdiagnet db_csv 文件的路径。Nsight Systems 将从这些文件中读取网络信息。请勿在路径中使用 ~ 别名。请注意,此选项不应与 --ib-net-info-devices 选项一起使用。

--ib-net-info-output

<directory path>

none

设置一个目录的路径,ibdiagnet 网络发现数据将写入其中。将此选项与 --ib-net-info-devices 选项一起使用。请勿在路径中使用 ~ 别名。

--ib-switch-congestion-device

<IB switch GUIDs>

none

以逗号分隔的 InfiniBand 交换机 GUID 列表。从指定 GUID 标识的交换机收集 InfiniBand 交换机拥塞事件。此开关可以多次使用。系统范围。使用 --ib-switch-congestion-nic-device--ib-switch-congestion-percent--ib-switch-congestion-threshold-high 开关进一步控制拥塞事件的收集方式。

--ib-switch-congestion-nic-device

<NIC name>

none

NIC (HCA) 的名称,通过该 NIC 访问 InfiniBand 交换机。默认情况下,将使用第一个活动的 NIC。查找 NIC 名称的一种方法是通过 ibnetdiscover --Hca_list | grep "$(hostname)" 命令。示例用法:--ib-switch-congestion-nic-device=mlx5_3

--ib-switch-congestion-percent

1 <= integer <= 100

50

要收集的 InfiniBand 交换机拥塞事件的百分比。此选项允许减少报告拥塞事件所消耗的网络带宽。

--ib-switch-congestion-threshold-high

1 < integer <= 1023

75

InfiniBand 交换机出口端口缓冲区大小的高阈值百分比。在数据包离开 InfiniBand 交换机之前,它存储在出口端口缓冲区中。检查缓冲区的大小,如果超过给定的阈值百分比,则报告拥塞事件。该百分比可能大于 100。

--ib-switch-metrics-device

<IB switch GUIDs>

none

以逗号分隔的 InfiniBand 交换机 GUID 列表。从指定的 InfiniBand 交换机收集指标。此开关可以多次使用。系统范围。

--ib-switch-metrics-nic-device

<NIC name>

none

NIC (HCA) 的名称,通过该名称将访问 InfiniBand 交换机以获取性能指标。默认情况下,将使用第一个活动的 NIC。查找 NIC 名称的一种方法是通过 ibstat -l 命令。示例用法:–ib-switch-metrics-nic-device=mlx5_3

--isr

true, false

false

跟踪中断服务例程 (ISR) 和延迟过程调用 (DPC)。需要管理员权限。仅在 Windows 设备上可用。

--nic-metrics

true, false

false

从支持的 NIC/HCA 设备收集指标。系统范围。在 Nsight Systems Embedded Platforms Edition 上不可用。

--os-events

“help”或最终用户以“x,y”格式选择的事件

选择要采样的 OS 事件。使用 --os-events=help 开关查看完整事件列表。可以选择多个值,仅用逗号分隔(无空格)。使用 --event-sample 开关启用。在 Nsight Systems Embedded Platforms Edition 上不可用。

-o

--output

< 文件名 >

report#

设置报告文件名。文件名中的任何 %q{ENV_VAR} 模式都将被替换为环境变量的值。文件名中的任何 %h 模式都将被替换为系统的主机名。文件名中的任何 %p 模式都将被替换为目标进程的 PID 或进程树的根进程的 PID(如果存在进程树)。文件名中的任何 %% 模式都将被替换为 %。默认值为工作目录中的 report#{.nsys-rep,.sqlite,.h5,.txt,.arrows,_arwdir,_pqtdir,.json}。

--process-scope

main, process-tree, system-wide

main

选择要跟踪的进程。仅在 Nsight Systems Embedded Platforms Edition 中可用。在此工具版本中,Nsight Systems Workstation Edition 将始终在系统范围内进行跟踪。

--retain-etw-files

true, false

false

保留跟踪生成的 ETW 文件,合并这些文件并将它们移动到输出目录。

-s

--sample

process-tree, system-wide, xhv, xhv-system-wide, none

process-tree

选择如何收集 CPU IP/回溯样本。如果选择 none,则禁用 CPU 采样。根据平台的不同,某些值可能需要管理员或 root 权限。选择 xhvxhv-system-wide 以启用跨虚拟机监控程序 (XHV) 采样,需要 root 权限。如果启动了目标应用程序,则默认值为 process-tree;否则,默认值为 none

注意

system-wide 并非在所有平台上都可用。

注意

如果设置为 none,除非 --cpuctxsw 开关设置为 none,否则仍将收集 CPU 上下文切换数据。

--samples-per-backtrace

integer <= 32

1

为收集的每个 CPU IP/回溯样本收集的 CPU IP 样本数。例如,如果设置为 4,则在收集的第四个 CPU IP 样本时,还将收集回溯。较低的值会增加收集的数据量。较高的值可以减少收集开销并减少丢弃的 CPU IP 样本数。如果收集 DWARF 回溯,则默认值为 4,否则默认值为 1。此选项在 Nsight Systems Embedded Platforms Edition 或非 Linux 目标上不可用。

--sampling-frequency

100 < integers < 8000

1000

指定采样/回溯频率。支持的最小频率为 100 Hz。支持的最大频率为 8000 Hz。此选项仅在 QNX、Linux for Tegra 和 Windows 目标上受支持。

--sampling-period (Nsight Systems Embedded Platforms Edition)

integer

determined dynamically

在收集 CPU 指令指针 (IP) 样本之前计数的 CPU 周期事件数。如果配置,也可能会收集回溯。采样周期越小,采样率越高。请注意,较小的采样周期会增加开销,并显着增加结果文件的大小。需要 --sampling-trigger=perf 开关。

--sampling-period (not Nsight Systems Embedded Platforms Edition)

integer

determined dynamically

在收集 CPU 指令指针 (IP) 样本之前计数的事件数。用于触发样本收集的事件是动态确定的。例如,在基于 Intel 的平台上,它可能是“参考周期”,而在 AMD 平台上,它可能是“CPU 周期”。如果已配置,也可以收集回溯。采样周期越小,采样率越高。请注意,较小的采样周期会增加开销,并显著增加结果文件的大小。此选项仅在 Linux 目标上可用。

--sampling-trigger

timer, sched, perf, cuda

timer,sched

指定回溯收集触发器。可以选择多个 API,仅用逗号分隔(无空格)。仅在 Nsight Systems Embedded Platforms Edition 目标上可用。

--session-new

[a-Z][0-9,a-Z,spaces]

profile-<id>-<application>

命名命令创建的会话。名称必须以字母字符开头,后跟可打印字符或空格字符。任何 %q{ENV_VAR} 模式都将替换为环境变量的值。任何 %h 模式都将替换为系统的主机名。任何 %% 模式都将替换为 %

-w

--show-output

true, false

true

如果为 true,则将目标进程的 stdout 和 stderr 流同时发送到控制台以及添加到报告文件中的 stdout/stderr 文件。如果为 false,则仅将目标进程 stdout 和 stderr 流发送到添加到报告文件中的 stdout/stderr 文件。

--soc-metrics

true,false

false

收集 SoC 指标。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--soc-metrics-frequency

integer

10000

指定 SoC 指标采样频率。支持的最小频率为 ‘100’ (Hz)。支持的最大频率为 ‘1000000’ (Hz)。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--soc-metrics-set

alias, file:<file name>

参见描述

指定 SoC 指标的指标集。该参数必须是由 --soc-metrics-set=help 开关报告的别名之一,或者是前缀为 file: 的指标配置文件路径。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--stats

true, false

false

在采集后生成摘要统计信息。警告:如果设置为 true,则将在采集后创建 SQLite 数据库。如果采集捕获大量数据,则创建数据库文件可能需要几分钟才能完成。

-x

--stop-on-exit

true, false

true

如果为 true,则在启动的进程退出或持续时间到期时自动停止收集 - 以先发生者为准。如果为 false,则必须设置持续时间,并且收集仅在持续时间到期时停止。Nsight Systems 不正式支持运行时间超过 5 分钟的运行。

--vsync

true, false

false

收集 vsync 事件。如果启用了 vsync 事件的收集,还将捕获 display/display_scanline ftrace 事件。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--xhv-trace

< filepath pct.json >

none

收集虚拟机监控程序跟踪。仅在 Nsight Systems Embedded Platforms Edition 中可用。

--xhv-trace-events

all, none, core, sched, irq, trap

all

仅在 Nsight Systems Embedded Platforms Edition 中可用。

CLI 统计命令开关选项

nsys stats 命令生成一系列摘要或跟踪报告。这些报告可以输出到控制台,或输出到单个文件,或管道传输到外部进程。报告可以使用各种不同的输出格式呈现,从人类可读的文本列到更适合数据交换的格式,例如 CSV。

报告是从 .nsys-rep 文件的 SQLite 导出生成的。如果指定了 .nsys-rep 文件,则 Nsight Systems 将查找随附的 SQLite 文件并使用它。如果不存在 SQLite 文件,则将导出并创建一个。

各个报告是通过调用脚本生成的,这些脚本从 SQLite 文件读取数据并以 CSV 格式返回其报告数据。Nsight Systems 提取此数据并按请求格式化,然后将数据展示到控制台、将其写入文件或管道传输到外部进程。添加新报告就像编写一个可以读取 SQLite 文件并生成所需 CSV 输出的脚本一样简单。有关示例,请参阅附带的脚本。报告和格式化程序都可以使用参数来调整其处理。有关附带脚本和格式化程序的详细信息,请参阅报告脚本主题。

报告使用由以下各项组成的三元组进行处理

  1. 请求的报告(以及任何参数),

  2. 演示格式(以及任何参数),以及

  3. 输出(文件名、控制台或外部进程)。

指定的第一个报告使用指定的第一个格式,并通过指定的第一个输出呈现。第二个报告使用第二个格式用于第二个输出,依此类推。如果指定的报告多于格式或输出,则格式和/或输出列表将扩展以匹配提供的报告数量,方法是重复列表的最后一个指定元素(或者默认值,如果未指定任何内容)。

nsys stats 是一个非常强大的命令,可以处理复杂的参数结构,请参阅下面关于“示例 Stats 命令序列”的主题。

选择 stats 命令开关后,可以使用以下选项。用法

nsys [global-options] stats [options] [input-file]

短选项

长选项

可能的参数

默认值

开关描述

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

-f

--format

column, table, csv, tsv, json, hdoc, htable, .

指定输出格式。特殊名称“.”表示给定输出的默认格式。控制台的默认格式为 column,而文件和进程输出默认为 csv。此选项可以多次使用。也可以使用逗号分隔的列表指定多个格式 (<name[:args...][,name[:args...]...]>)。有关每种格式可用的选项,请参阅报告脚本

--force-export

true, false

false

强制从指定的 .nsys-rep 文件重新导出 SQLite 文件,即使 SQLite 文件已存在。

--force-overwrite

true, false

false

覆盖任何现有的报告文件。

--help-formats

<format_name>, ALL, [none]

none

不带参数,给出可用输出格式的摘要。如果给出了格式名称,则会显示该格式的更详细说明。如果给出 ALL,则会显示所有可用格式的更详细说明。

--help-reports

<report_name>,ALL,[none]

none

不带参数,列出可用摘要和跟踪报告的摘要。如果给出了报告名称,则会显示该报告的更详细说明。如果给出 ALL,则会显示所有可用报告的更详细说明。

-o

--output

-, @<command>, <basename>, .

-

指定输出机制。有三种输出机制:打印到控制台、输出到文件或输出到命令。此选项可以多次使用。也可以使用逗号分隔的列表指定多个输出。如果给定的输出名称为“-”,则输出将显示在控制台上。如果输出名称以“@”开头,则输出指定要运行的命令。将执行 nsys 命令,分析输出将通过管道传递到该命令。任何其他输出都假定为文件的基本路径和名称。如果给定了文件基本名称,则使用的文件名将为:<basename>\_<analysis&args>.<output_format>。默认基本名称(包括路径)是 SQLite 文件的名称(从输入文件或 --sqlite 选项派生),减去扩展名。输出“.”可用于指示分析应输出到文件,并且应使用默认基本名称。要使用默认基本名称将一个或多个分析输出写入文件,请使用以下选项:--output。如果输出以“@”开头,则 nsys 命令输出将通过管道传递到给定的命令。该命令将运行,输出将通过管道传递到命令的 stdin(标准输入)。命令的 stdout 和 stderr 仍然连接到控制台,因此任何输出都将直接显示到控制台。请注意,命令字符串的解析方式存在一些限制。不支持任何 shell 扩展(包括 *、?、[] 和 ~)。该命令不能通过管道传递到另一个命令,也不能使用 shell 语法重定向到文件。命令和命令参数在空格处拆分,并且不支持任何引号(在命令语法中)。对于需要复杂命令行语法的命令,建议将命令放入 shell 脚本文件中,并将该脚本指定为输出命令。

-q

--quiet

不显示详细消息,仅显示错误。

-r

--report

请参阅 报告脚本

指定要生成的报告,包括任何参数。此选项可以多次使用。也可以使用逗号分隔的列表指定多个报告 (<name[:args...][,name[:args...]...]>)。如果未指定任何报告,则以下内容将用作默认报告集:nvtx_sum、osrt_sum、cuda_api_sum、cuda_gpu_kern_sum、cuda_gpu_mem_time_sum、cuda_gpu_mem_size_sum、openmp_sum、opengl_khr_range_sum、opengl_khr_gpu_range_sum、vulkan_marker_sum、vulkan_gpu_marker_sum、dx11_pix_sum、dx12_gpu_marker_sum、dx12_pix_sum、wddm_queue_sum、um_sum、um_total_sum、um_cpu_page_faults_sum、openacc_sum。有关现有内置脚本以及如何制作自己的脚本的详细信息,请参阅报告脚本

--report-dir

<path>

将目录添加到用于查找报告脚本的路径。通常,只有当您有一个或多个包含个人脚本的目录时才需要这样做。此选项可以多次使用。每次使用都会在路径末尾添加一个新目录。也可以使用环境变量 NSYS_STATS_REPORT_PATH 定义搜索路径。以这种方式添加的目录将在应用程序标志之后添加。路径中的最后两个条目将始终是当前工作目录,后跟包含随附 nsys 报告的目录。

--sqlite

<file.sqlite>

指定 SQLite 导出文件名。如果此文件存在,则将使用它。如果此文件不存在(或如果给出了 --force-export),则将在处理之前从指定的 .nsys-rep 文件创建此文件。如果指定的输入文件也是 SQLite 文件,则不能使用此选项。

--timeunit

nsec, 纳秒, usec, 微秒, msec, 毫秒, 秒

nanoseconds

设置基本时间单位。开关的参数通过使用最长前缀匹配来匹配,这意味着不必将整个单词写为开关参数。它类似于将 :time=<unit> 参数传递给每个格式化程序,尽管格式化程序使用更严格的命名约定。有关单位转换的更详细信息,请参阅 nsys stats --help-formats column

CLI 状态命令开关选项

nsys status 命令返回 CLI 的当前状态。选择 status 命令开关后,可以使用以下选项。用法

nsys [global-options] status [options]

短选项

长选项

可能的参数

默认值

开关描述

--all

打印所有可用分析环境的信息。

-e

--environment

返回有关系统分析环境适用性的信息。

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

-n

--network

返回有关系统网络分析环境适用性的信息。

--session

会话标识符

none

打印指示会话的状态。选项参数必须表示有效的会话名称或 ID,如 nsys sessions list 报告的那样。任何 %q{ENV_VAR} 模式都将被替换为环境变量的值。任何 %h 模式都将被替换为系统的主机名。任何 %% 模式都将被替换为 %

CLI 停止命令开关选项

选择 stop 命令开关后,可以使用以下选项。用法

nsys [global-options] stop [options]

短选项

长选项

可能的参数

默认值

开关描述

--help

<tag>

none

打印帮助消息。该选项可以接受一个可选参数,该参数将用作标签。如果提供了标签,则仅打印与该标签相关的选项。

--keep

以秒为单位的时间

0

指示应在结果文件中保留停止命令之前多少秒的收集数据。零被视为保留所有数据的特殊设置。

--session

会话标识符

none

停止指示的会话。选项参数必须表示有效的会话名称或 ID,如 nsys sessions list 报告的那样。任何 %q{ENV_VAR} 模式都将被替换为环境变量的值。任何 %h 模式都将被替换为系统的主机名。任何 %% 模式都将被替换为 %

示例单命令行

版本信息

nsys -v

效果:将工具版本信息打印到屏幕。

以提升的权限运行

sudo nsys profile <app>

效果:Nsight Systems CLI(和目标应用程序)将以提升的权限运行。这对于某些功能是必要的,例如 FTrace 或系统范围的 CPU 采样。如果您不希望提升目标应用程序的权限,请使用 --run-as 选项。

默认分析运行

nsys profile <application>
    [application-arguments]

效果:使用给定的参数启动应用程序。立即开始收集,并在应用程序停止时结束收集。跟踪 CUDA、OpenGL、NVTX 和 OS 运行时库 API。收集 CPU 采样信息和线程调度信息。使用 Nsight Systems Embedded Platforms Edition,这将仅分析单个进程。使用 Nsight Systems Workstation Edition,这将跟踪进程树。在默认位置生成 report#.nsys-rep 文件,并在需要时递增报告编号以避免覆盖任何现有输出文件。

仅限有限跟踪运行

nsys profile --trace=cuda,nvtx -d 20
    --sample=none --cpuctxsw=none -o my_test <application>
    [application-arguments]

效果:使用给定的参数启动应用程序。立即开始收集,并在 20 秒后或应用程序结束时结束收集。跟踪 CUDA 和 NVTX API。不收集 CPU 采样信息或线程调度信息。分析任何子进程。在当前工作目录中将输出文件生成为 my_test.nsys-rep

延迟启动运行

nsys profile -e TEST_ONLY=0 -y 20
    <application> [application-arguments]

效果:设置环境变量 TEST_ONLY=0。使用给定的参数启动应用程序。在 20 秒后开始收集,并在应用程序退出时结束收集。跟踪 CUDA、OpenGL、NVTX 和 OS 运行时库 API。收集 CPU 采样和线程调度信息。分析任何子进程。在默认位置生成 report#.nsys-rep 文件,并在需要时递增报告编号以避免覆盖任何现有输出文件。

收集 ftrace 事件

nsys profile --ftrace=drm/drm_vblank_event
    -d 20

效果:收集 ftrace drm_vblank_event 事件 20 秒。在当前工作目录中生成 report#.nsys-rep 文件。请注意,ftrace 事件收集需要以 root 身份运行。要获取内核提供的 ftrace 事件列表,请运行以下命令

sudo cat /sys/kernel/debug/tracing/available_events

在单个 TU10x 上运行 GPU 指标采样

nsys profile --gpu-metrics-devices=0
    --gpu-metrics-set=tu10x-gfxt <application>

效果:启动应用程序。收集默认选项和第一个 GPU (TU10x) 的 GPU 指标,使用 tu10x-gfxt 指标集,默认频率 (10 kHz)。分析任何子进程。在默认位置生成 report#.nsys-rep 文件,并在需要时递增报告编号以避免覆盖任何现有输出文件。

以设定的频率在所有 GPU 上运行 GPU 指标采样

nsys profile --gpu-metrics-devices=all
    --gpu-metrics-frequency=20000 <application>

效果:启动应用程序。收集默认选项和所有可用 GPU 的 GPU 指标,为每个 GPU 使用第一个合适的指标集,并以 20 kHz 的频率进行采样。分析任何子进程。在默认位置生成 report#.nsys-rep 文件,并在需要时递增报告编号以避免覆盖任何现有输出文件。

收集 CPU IP/回溯和 CPU 上下文切换

nsys profile --sample=system-wide --duration=5

效果:使用默认回溯机制收集 CPU IP/回溯样本,并跟踪整个系统 5 秒钟的 CPU 上下文切换活动。请注意,这需要 root 权限才能运行。不采样硬件或 OS 事件。由于系统范围采样导致要解析的大量符号,因此此收集的后处理将花费更长的时间。

获取可用 CPU 核心事件的列表

nsys profile --cpu-core-events=help

效果:列出可以采样的 CPU 事件以及可以同时采样的 CPU 事件的最大数量。

收集系统范围的 CPU 事件并跟踪应用程序

nsys profile --event-sample=system-wide
    --cpu-core-events='1,2' --event-sampling-frequency=5 <app> [app args]

效果:使用默认回溯机制收集 CPU IP/回溯样本,跟踪 CPU 上下文切换活动,并每 200 毫秒采样每个 CPU 的“CPU 周期”和“已完成指令”事件,用于整个系统。请注意,这需要 root 权限才能运行。请注意,在使用此命令时,默认情况下会跟踪 Nsight Systems 启动的应用程序中的 CUDA、NVTX、OpenGL 和 OSRT。由于系统范围采样导致要解析的大量符号,因此此收集的后处理将花费更长的时间。

使用配置文件收集自定义 ETW 跟踪

nsys profile --etw-provider=file.JSON

效果:使用 file.JSON 的内容配置自定义 ETW 收集器。收集数据 20 秒。在当前工作目录中生成 report#.nsys-rep 文件。

模板 JSON 配置文件位于 Nsight Systems 安装目录中,路径为 \\target-windows-x64\\etw_providers_template.json。如果您调用以下命令,此路径将自动显示

nsys profile --help

level 属性只能设置为以下项之一

  • TRACE_LEVEL_CRITICAL

  • TRACE_LEVEL_ERROR

  • TRACE_LEVEL_WARNING

  • TRACE_LEVEL_INFORMATION

  • TRACE_LEVEL_VERBOSE

flags 属性只能设置为以下一项或多项

  • EVENT_TRACE_FLAG_ALPC

  • EVENT_TRACE_FLAG_CSWITCH

  • EVENT_TRACE_FLAG_DBGPRINT

  • EVENT_TRACE_FLAG_DISK_FILE_IO

  • EVENT_TRACE_FLAG_DISK_IO

  • EVENT_TRACE_FLAG_DISK_IO_INIT

  • EVENT_TRACE_FLAG_DISPATCHER

  • EVENT_TRACE_FLAG_DPC

  • EVENT_TRACE_FLAG_DRIVER

  • EVENT_TRACE_FLAG_FILE_IO

  • EVENT_TRACE_FLAG_FILE_IO_INIT

  • EVENT_TRACE_FLAG_IMAGE_LOAD

  • EVENT_TRACE_FLAG_INTERRUPT

  • EVENT_TRACE_FLAG_JOB

  • EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS

  • EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS

  • EVENT_TRACE_FLAG_NETWORK_TCPIP

  • EVENT_TRACE_FLAG_NO_SYSCONFIG

  • EVENT_TRACE_FLAG_PROCESS

  • EVENT_TRACE_FLAG_PROCESS_COUNTERS

  • EVENT_TRACE_FLAG_PROFILE

  • EVENT_TRACE_FLAG_REGISTRY

  • EVENT_TRACE_FLAG_SPLIT_IO

  • EVENT_TRACE_FLAG_SYSTEMCALL

  • EVENT_TRACE_FLAG_THREAD

  • EVENT_TRACE_FLAG_VAMAP

  • EVENT_TRACE_FLAG_VIRTUAL_ALLOC

典型案例:分析使用 CUDA 的 Python 脚本

nsys profile --trace=cuda,cudnn,cublas,osrt,nvtx
    --delay=60 python my_dnn_script.py

效果:启动 Python 脚本并在启动后 60 秒开始分析,跟踪 CUDA、cuDNN、cuBLAS、OS 运行时 API 和 NVTX,以及收集线程调度信息。

典型案例:分析使用 Vulkan 的应用程序

nsys profile --trace=vulkan,osrt,nvtx
    --delay=60 ./myapp

效果:启动应用程序并在启动后 60 秒开始分析,跟踪 Vulkan、OS 运行时 API 和 NVTX,以及收集 CPU 采样和线程调度信息。

示例交互式 CLI 命令序列

从应用程序开始时收集,手动结束

nsys start --stop-on-exit=false
nsys launch --trace=cuda,nvtx --sample=none <application> [application-arguments]
nsys stop

效果:创建交互式 CLI 进程并将其设置为在应用程序启动后立即开始收集。启动应用程序,设置为允许跟踪 CUDA 和 NVTX 以及收集线程调度信息。仅在显式请求时停止。在默认位置生成 report#.nsys-rep。

注意

如果您开始收集但未能停止收集(或者如果您允许它在退出时停止,并且应用程序运行时间过长),则系统的存储空间可能会被收集的数据填满,从而导致系统出现重大问题。Nsight Systems 每秒收集的数据量因选项而异,但通常 Nsight Systems 不支持超过 5 分钟的运行。

运行应用程序,手动开始收集,运行直到进程结束

nsys launch -w true <application> [application-arguments]
nsys start

效果:创建交互式 CLI 并启动设置为默认分析的应用程序。将应用程序输出发送到终端。在您手动开始收集感兴趣区域之前,不会收集任何数据。分析直到应用程序结束。在默认位置生成 report#.nsys-rep。

注意

如果您启动应用程序,并且该应用程序及其任何后代在调用 start 之前退出,则 Nsight Systems 将创建一个完全形成的 .nsys-rep 文件,其中不包含任何数据。

运行应用程序,命名会话,仅保留最后几秒

nsys start --session-new=mysession
nsys launch --session=mysession myapp [application-arguments]
nsys stop --session=mysession --keep=3

效果:创建命名的交互式 CLI 进程,并使用默认收集选项启动您的应用程序。手动停止该会话,并仅保留最后三秒的数据。

注意

目前,Nsight Systems 将收集所有数据,然后在停止时修剪数据。将来,我们将添加一个环形缓冲区中执行收集的选项,这样,如果用户提前知道他们希望保存多少秒的数据,我们就可以避免使用不必要的内存。

运行应用程序,使用 cudaProfilerStart/Stop 启动/停止收集

nsys start -c cudaProfilerApi
nsys launch -w true <application> [application-arguments]

效果:创建交互式 CLI 进程,并将其设置为在检测到 cudaProfileStart() 后立即开始收集。启动应用程序进行默认分析,将应用程序输出发送到终端。在下次调用 cudaProfilerStop 时、当用户调用 nsys stop 时或当根进程终止时停止收集。在默认位置生成 report#.nsys-rep

注意

如果在 nsys start -c cudaProfilerApi 之前调用 nsys launch,并且代码包含大量短时 cudaProfilerStart/Stop 对,则 Nsight Systems 可能无法正确处理它们,从而导致故障。这将在未来版本中得到纠正。

注意

使用 Nsight Systems CLI 选项 --capture-range-end-repeat 为 cudaProfilerStart/Stop 调用定义的每个捕获范围捕获单独的报告文件。为避免意外覆盖报告文件,在这种情况下,Nsight Systems 将忽略 --force-overwrite 选项。

运行应用程序,使用 NVTX 启动/停止收集

nsys start -c nvtx
nsys launch -w true -p MESSAGE@DOMAIN <application> [application-arguments]

效果:创建交互式 CLI 进程,并将其设置为在给定的域(捕获范围)中打开具有给定消息的 NVTX 范围后立即开始收集。启动应用程序进行默认分析,将应用程序输出发送到终端。当所有捕获范围都关闭时、当用户调用 nsys stop 时或当根进程终止时停止收集。在默认位置生成 report#.nsys-rep

注意

Nsight Systems CLI 仅为第一个捕获范围触发分析会话。

可以指定 NVTX 捕获范围

  • Message@Domain:给定域中具有给定消息的所有范围都是捕获范围。例如

    nsys launch -w true -p profiler@service ./app
    

    这将使分析在域“service”中打开第一个消息为“profiler”的范围时开始。

  • Message@*:所有域中具有给定消息的所有范围都是捕获范围。例如

    nsys launch -w true -p profiler@* ./app
    

    这将使分析在任何域中打开第一个消息为“profiler”的范围时开始。

  • Message:默认域中具有给定消息的所有范围都是捕获范围。例如

    nsys launch -w true -p profiler ./app
    

    这将使分析在默认域中打开第一个消息为“profiler”的范围时开始。

  • 默认情况下,仅考虑 NVTX 注册字符串提供的消息,以避免额外的开销。要启用非注册字符串检查,请使用 NSYS_NVTX_PROFILER_REGISTER_ONLY=0 环境启动您的应用程序

    nsys launch -w true -p profiler@service -e NSYS_NVTX_PROFILER_REGISTER_ONLY=0 ./app
    

注意

分隔符“@”可以使用反斜杠“\”转义。如果指定了多个没有转义字符的分隔符,则仅应用最后一个,所有其他分隔符都将被丢弃。

运行应用程序,多次启动/停止收集

交互式 CLI 支持每次启动的多个顺序收集。

nsys launch <application> [application-arguments]
nsys start
nsys stop
nsys start
nsys stop
nsys shutdown --kill sigkill

效果:创建交互式 CLI 并启动设置为默认分析的应用程序。将应用程序输出发送到终端。在执行 start 命令之前,不会收集任何数据。从 start 到请求停止之间收集数据,在当前工作目录中生成 report#.qstrm。从第二个 start 到第二个 stop 请求之间收集数据,在当前工作目录中生成 report#.nsys-rep(递增 1)。关闭交互式 CLI 并向目标应用程序的进程组发送 sigkill。

注意

nsys start 之后调用 nsys cancel 将取消收集,而不会生成报告。

示例 Stats 命令序列

显示默认统计信息

nsys stats report1.nsys-rep

效果:从 report1.nsys-rep 导出名为 report1.sqlite 的 SQLite 文件(假设它尚不存在)。以 column 格式将默认报告打印到控制台。

注意:以下两个命令序列应呈现非常相似的信息

nsys profile --stats=true <application>

nsys profile <application>
nsys stats report1.nsys-rep

显示报告中的特定数据

nsys stats --report cuda_gpu_trace report1.nsys-rep

效果:从 report1.nsys-rep 导出名为 report1.sqlite 的 SQLite 文件(假设它尚不存在)。以 column 格式将 cuda_gpu_trace 脚本生成的报告打印到控制台。

生成多个报告,以多种格式,输出到多个位置

nsys stats --report cuda_gpu_trace --report cuda_gpu_kern_sum --report cuda_api_sum --format csv,column --output .,- report1.nsys-rep

效果:从 report1.nsys-rep 导出名为 report1.sqlite 的 SQLite 文件(假设它尚不存在)。生成三个报告。第一个报告 cuda_gpu_trace 报告将以 CSV 格式输出到文件 report1_cuda_gpu_trace.csv。其他两个报告 cuda_gpu_kern_sumcuda_api_sum 将作为数据列输出到控制台。尽管给出了三个报告,但仅给出了两种格式和输出。为了协调这一点,格式和输出列表都将扩展以匹配报告列表,方法是重复最后一个元素。

将报告数据提交到命令

nsys stats --report cuda_api_sum --format table \ --output @“grep -E (-|Name|cudaFree” test.sqlite

效果:打开 test.sqlite 并在该文件上运行 cuda_api_sum 脚本。生成表格数据,并将其馈送到命令 grep -E (-|Name|cudaFree)。grep 命令将过滤掉除标头、格式和 cudaFree 数据之外的所有内容,并将结果显示到控制台。

注意

当输出名称以“@”开头时,它被定义为命令。该命令将运行,报告的输出将通过管道传递到命令的 stdin(标准输入)。命令的 stdout 和 stderr 仍然连接到控制台,因此任何输出都将直接显示到控制台。

请注意,命令字符串的解析方式存在一些限制。不支持任何 shell 扩展(包括 *、?、[] 和 ~)。该命令不能通过管道传递到另一个命令,也不能使用 shell 语法重定向到文件。命令和命令参数在空格处拆分,并且不支持任何引号(在命令语法中)。对于需要复杂命令行语法的命令,建议将命令放入 shell 脚本文件中,并将该脚本指定为输出命令

来自 --stats 选项的示例输出

nsys stats 命令可用于后分析以生成特定或个性化的报告。对于要自动生成的默认固定摘要统计信息集,您可以将 --stats 选项与 nsys profilensys start 命令结合使用,以生成一组固定的有用摘要统计信息。

如果您的运行跟踪 CUDA,则这些包括 CUDA API、内核和内存操作统计信息

CUDA Statistics

如果您的运行跟踪 OS 运行时事件或 NVTX push-pop 范围

OS runtime and NVTX Statistics

如果您的运行跟踪图形调试标记,则这些包括 DX11 调试标记、DX12 调试标记、Vulkan 调试标记或 KHR 调试标记

Graphics Vulkan debug markers Statistics

这些统计信息的配方以及有关如何创建自己的指标的文档将在该工具的未来版本中提供。

Windows 上的系统范围 API 跟踪

在 Windows 上,Nsight Systems 可以通过 CLI 的系统范围 API 跟踪来跟踪已运行应用程序中的某些 API(当前支持:DX11、DX12 和 Vulkan)。

要启动系统范围的 API 跟踪,请运行 Nsight Systems CLI,并使用 --trace 选项,其中包括一个或多个受支持的 API,将 --system-wide option set to ``true,并且不指定目标应用程序。系统范围的 API 跟踪可以与始终是系统范围的跟踪类型组合使用,例如 --trace=wddm

要跟踪 DX11 或 DX12 目标应用程序,它必须获得系统焦点,用户必须单击应用程序窗口或使用 Alt+Tab 选择它。

例如,要跟踪具有 PIX 标记和 GPU 工作负载跟踪的多个 DX12 应用程序,以及接下来 20 秒的 WDDM 事件,请运行命令

nsys profile --trace=dx12-annotations,wddm --dx12-gpu-workload=individual
--duration=20

然后单击每个目标应用程序的窗口以使其获得焦点。

要跟踪 Vulkan 目标应用程序,必须在执行 nsys profile 命令后启动它。

打开用于可视化的命令行结果文件

在 GUI 中打开 CLI 结果

CLI 将在分析完成后生成一个 .nsys-rep 文件。此文件可以在任何版本相同或版本更新的 GUI 中打开。

打开真正的大型、多 GB 的 .nsys-rep 文件可能会占用主机上的所有内存并锁定系统。这将在以后的版本中修复。

导入 Windows ETL 文件

对于 Windows 目标,可以使用 Xperf 或 Windows Performance Toolkit 中的 GPUView 随附的 log.cmd 命令捕获的 ETL 文件可以导入以创建报告,就像它们是使用 Nsight Systems 的“WDDM 跟踪”和“自定义 ETW 跟踪”功能捕获的一样。只需从“导入”对话框中选择 .etl 文件即可将其转换为 .nsys-rep 文件。

处理应用程序启动器(mpirun、deepspeed 等)

Nsight Systems 内置了对各种通信 API 的 API 跟踪支持,例如 MPI、OpenSHMEM、UCX、NCCL 和 NVSHMEM。要在多个不同的机器(计算节点)上执行各自的程序,通常使用启动器,例如 mpirun/mpiexec (MPI)、shmemrun/oshrun (OpenSHMEM)、srun (SLURM) 或 deepspeed

单节点分析 会话中,可以将 Nsight Systems CLI 前缀添加到程序(二进制文件)或启动器之前。在后一种情况下,启动器的执行也将被分析,并且所有进程都将记录到同一个报告文件中,例如对于 mpirun

nsys profile [nsys args] mpirun [mpirun args] ...

多节点分析 会话中,Nsight Systems CLI 必须前缀添加到应用程序之前,但不能添加到启动器命令之前,例如对于 mpirun

mpirun [mpirun args] nsys profile [nsys args] ...

您可以使用 %q{OMPI_COMM_WORLD_RANK} (Open MPI)、%q{PMI_RANK} (MPICH)、%q{SLURM_PROCID} (Slurm) 或 %p-o|--output 选项中,以将 rank 或进程 ID 包含到报告文件名中。

警告

如果多个进程想要同时写入同一个报告文件,则会发生错误。

分析单个进程或进程子集

仅分析程序运行的单个或少数代表性进程可能是合理的,例如,为了减少测量数据量。

为了实现这一点,可以使用包装器脚本。以下名为 nsys_profile.sh 的脚本使用 nsys 仅分析 MPI rank 0。

#!/bin/bash

# Use $PMI_RANK for MPICH and $SLURM_PROCID with srun.
if [ $OMPI_COMM_WORLD_RANK -eq 0 ]; then
  nsys profile -e NSYS_MPI_STORE_TEAMS_PER_RANK=1 -t mpi "$@"
else
  "$@"
fi

您可以相应地更改分析选项,并使用 mpirun [mpirun options] ./nsys_profile.sh ./myapp [app options] 执行。上面的代码可以轻松地适应 OpenSHMEM 和 SLURM 启动器。

注意

如果仅分析 MPI ranks 的子集,请设置环境变量 NSYS_MPI_STORE_TEAMS_PER_RANK=1 以存储每个 MPI rank 的自定义 MPI 通信器的所有成员。否则,执行可能会挂起或因 MPI 错误而失败。

DeepSpeed

DeepSpeed 提供了一个并行启动器,它在多个节点和/或 GPU 上启动 Python 脚本。对于多节点运行,需要一个简单的包装器脚本 (nsys_profile.sh) 才能使用 Nsight Systems 进行分析。

#! /bin/bash
nsys profile -t cuda,mpi,nvtx,cudnn -o rname.%p python ...

上面的脚本必须与 –no-python 选项一起使用

deepspeed --no_python [deepspeed args] ./nsys_profile.sh

GPU 和 NIC 指标收集

如果在同一节点上并发执行多个 nsys profile 实例,并且启用了 GPU 和/或 NIC 指标收集,则每个进程将收集所有可用 NIC 的指标,并尝试收集指定设备的 GPU 指标。可以使用类似于以下的简单 bash 脚本来避免这种情况

#!/bin/bash

# Use $SLURM_LOCALID with srun.
if [ $OMPI_COMM_WORLD_LOCAL_RANK -eq 0 ]; then
  nsys profile --nic-metrics=true --gpu-metrics-devices=all "$@"
else
  nsys profile "$@"
fi

上面的脚本将仅为 rank 0(节点本地 rank 0)收集 NIC 和 GPU 指标。或者,如果每个 GPU 使用一个 rank,则可以基于包装器脚本中的节点本地 rank 指定 GPU 指标设备,如下所示

#!/bin/bash

# Use $SLURM_LOCALID with srun.
nsys profile -e CUDA_VISIBLE_DEVICES=${OMPI_COMM_WORLD_LOCAL_RANK} \
  --gpu-metrics-devices=${OMPI_COMM_WORLD_LOCAL_RANK} "$@"

从 GUI 进行分析

从 GUI 分析 Linux 目标

连接到目标设备

Nsight Systems 提供了一个简单的界面,用于在 localhost 上进行分析或通过 SSH 管理与基于 Linux 或 Windows 的设备的多个连接。可以通过设备选择下拉列表启动网络连接管理器

在 x86_64 上

Empty device list

在 Tegra 上

Empty device list

该对话框具有简单的控件,允许添加、删除和修改连接

Network connection

安全注意事项:SSH 仅用于建立与目标设备的初始连接、执行检查和上传必要的文件。实际的分析命令和数据通过原始、未加密的套接字传输。Nsight Systems 不应在可能发生中间人攻击或不受信任的方可能具有对目标设备的网络访问权限的网络设置中使用。

连接到目标设备时,系统将提示您输入用户的密码。请注意,如果您选择记住密码,它将以明文形式存储在主机上的配置文件中。存储的密码绑定到远程设备的公钥指纹。

无身份验证 选项对于配置为使用 root 用户名进行无密码登录的设备很有用。要启用此类配置,请编辑目标上的文件 /etc/ssh/sshd_config 并指定以下选项

PermitRootLogin yes

然后使用 passwd 设置空密码,并使用 service ssh restart 重新启动 SSH 服务。

开放端口:Nsight Systems 守护进程需要开放端口 22 和端口 45555 以进行监听。您可以使用以下命令确认这些端口已开放

sudo firewall-cmd --list-ports --permanent
sudo firewall-cmd --reload

要开放端口,请使用以下命令,跳过 --permanent 选项仅在本会话中开放

sudo firewall-cmd --permanent --add-port 45555/tcp
sudo firewall-cmd --reload

同样,如果您在云系统上运行,则必须为入口开放端口 22 和端口 45555。

内核版本号 - 要检查目标设备上 Nsight Systems 内核支持的版本号,请在远程设备上运行以下命令

cat /proc/quadd/version

最低支持版本为 1.82。

此外,目标设备上需要存在 Netcat 命令 (nc)。例如,在 Ubuntu 上,可以使用以下命令安装此软件包

sudo apt-get install netcat-openbsd

系统范围的分析选项

目标采样选项

对于 Nsight Systems 工作站版和 Nsight Systems 嵌入式平台版,目标采样行为略有不同。

热键跟踪启动/停止

Nsight Systems 工作站版可以使用热键来控制分析。按下热键以在目标应用程序的图形窗口中启动和/或停止跟踪会话。这在跟踪使用全屏显示的游戏和图形应用程序时非常有用。在这些情况下,切换到 Nsight Systems 的 UI 会不必要地将窗口管理器的 footprint 引入到跟踪中。要启用热键的使用,请选中项目设置页面中的“Hotkey”复选框

Hotkey checkbox

默认热键为 F12。

启动进程

Nsight Systems 可以启动新进程以在目标设备上进行分析。分析器确保正确设置所有环境变量,以成功收集跟踪信息

Process: Launch

编辑参数… 链接将打开一个编辑器窗口,其中每个命令行参数都在单独的行上编辑。当参数包含空格或引号时,这很方便。

从 GUI 分析 Windows 目标

在 Windows 设备上进行分析与在 Linux 设备上进行分析类似。有关详细文档和连接信息,请参阅 从 GUI 分析 Linux 目标 部分。平台上的主要区别如下

远程连接到基于 Windows 的机器

要对目标 Windows 机器执行远程分析,请在目标机器上安装和配置 OpenSSH 服务器

热键跟踪启动/停止

Nsight Systems 工作站版可以使用热键来控制分析。按下热键以在目标应用程序的图形窗口中启动和/或停止跟踪会话。这在跟踪使用全屏显示的游戏和图形应用程序时非常有用。在这些情况下,切换到 Nsight Systems 的 UI 会不必要地将窗口管理器的 footprint 引入到跟踪中。要启用热键的使用,请选中项目设置页面中的“Hotkey”复选框

Hotkey checkbox

默认热键为 F12。

更改默认热键绑定 - 可以通过在 config.ini 文件中设置 HotKeyIntValue 配置字段来配置不同的热键绑定。

设置您想要用于从目标应用程序图形窗口触发启动/停止的热键的十进制数字标识符。默认值为 123,对应于 0x7B 或 F12 键。

虚拟键标识符在 MSDN 的虚拟键代码 中详细说明。

请注意,您必须在使用文件之前将此页面中详述的十六进制值转换为其十进制对应值。例如,要使用 F1 键作为启动/停止跟踪热键,请在 config.ini 文件中使用以下设置

HotKeyIntValue=112

Windows 上的目标采样选项

Target sampling options

Nsight Systems 可以采样一个进程树。 此处的采样意味着定期中断每个处理器。 采样率在项目设置中定义,可以是 100Hz、1KHz(默认值)、2Khz、4KHz 或 8KHz。

Thread activity option

在 Windows 上,Nsight Systems 可以收集一个进程树的线程活动。 收集线程活动意味着记录每个线程上下文切换事件,并且(可选)在线程重新调度执行时收集回溯。 线程状态显示在时间轴上。

如果收集了线程回溯,则当鼠标悬停在线程执行被阻止的区域上时,将显示线程回溯。

符号位置

符号解析发生在主机上,因此不会影响目标上分析的性能。

符号位置… 按钮打开 配置调试符号位置 对话框。

Configure debug symbols location

使用此对话框指定

  • PDB 文件的路径

  • 符号服务器

  • 本地符号缓存的位置

要使用符号服务器

  1. 安装 Windows 调试工具,它是 Windows 10 SDK 的一部分。

  2. 使用 添加服务器 按钮添加符号服务器 URL。

    有关 Microsoft 的公共符号服务器的信息,该服务器支持获取 Windows 操作系统相关的调试符号,请访问 此处

从 GUI 分析 QNX 目标

在 QNX 设备上进行分析与在 Linux 设备上进行分析类似。 有关详细文档,请参阅 从 GUI 分析 Linux 目标 部分。 平台上的主要区别如下

  • 不支持回溯采样。相反,回溯是为长时间的 OS 运行时库调用收集的。有关详细文档,请参阅 OS 运行时库跟踪 部分。

  • CUDA 支持仅限于 CUDA 9.0+。

  • QNX 设备上的文件系统可能以只读方式挂载。 在这种情况下,Nsight Systems 无法安装运行分析会话所需的目标端二进制文件。 请确保目标文件系统在连接到 QNX 目标之前是可写的。 例如,确保以下命令有效

    echo XX > /xx && ls -l /xx
    

在 JupyterLab 中进行分析

JupyterLab Nsight 扩展将 Nsight Systems 分析集成到 jupyterLab 中,用于分析 Jupyter 笔记本单元。 可以分析和分析单元启动的 CUDA 内核以及 CUDA 和 Python 代码执行。

有关更多信息和安装扩展,请访问 PyPI 上的 JupyterLab Nsight 扩展

容器和调度器支持

在容器内收集数据

虽然本节中的示例使用 Docker 容器语义,但其他容器的工作方式大致相同。

以下信息假设读者了解 Docker 容器。 有关 Docker 一般用途的更多信息,请参阅 Docker 文档

我们强烈建议使用 CLI 在容器中进行分析。 最佳容器实践是在服务不需要共址时跨容器拆分服务。 Nsight Systems GUI 不是分析所必需的,并且会引入许多依赖项,因此建议使用 CLI。 如果您愿意,GUI 可以位于您用于查看报告的单独的 side-car 容器中。 您只需要容器之间的共享文件夹。 有关更多信息,请参阅 GUI VNC 容器 部分。

启用 Docker 收集

启动 Docker 以执行 Nsight Systems 收集时,需要其他步骤来启用 perf_event_open 系统调用。 这是为了利用 Linux 内核的 perf 子系统所必需的,该子系统向 Nsight Systems 提供采样信息。

有三种方法可以启用 perf_event_open 系统调用。 您可以使用 --privileged=true 开关启用它,将 --cap-add=SYS_ADMIN 开关添加到您的 docker run 命令文件中,或者如果您的系统满足要求,您可以通过设置 seccomp 安全配置文件来启用它。

安全计算模式 (seccomp) 是 Linux 内核的一项功能,可用于限制应用程序的访问权限。 只有在内核启用了 seccomp 支持的情况下,此功能才可用。 要检查 seccomp 支持

$ grep CONFIG_SECCOMP= /boot/config-$(uname -r)

官方 Docker 文档说

"Seccomp profiles require seccomp 2.2.1 which is not available on Ubuntu
14.04, Debian Wheezy, or Debian Jessie. To use seccomp on these distributions,
you must download the latest static Linux binaries (rather than packages)."

下载与您的 Docker 版本相关的默认 seccomp 配置文件 default.json。 如果 perf_event_open 已在文件中列出,并受 CAP_SYS_ADMIN 保护,则删除 perf_event_open 行。 在“syscalls”下添加以下行,并将结果文件另存为 default_with_perf.json

{
    "name": "perf_event_open",
    "action": "SCMP_ACT_ALLOW",
    "args": []
},

然后,您将能够在启动 Docker 时使用以下开关来应用新的 seccomp 配置文件。

--security-opt seccomp=default_with_perf.json

启动 Docker 收集

这是一个已用于启动 Docker 以使用 Nsight Systems 进行测试的示例命令

sudo nvidia-docker run --network=host --security-opt seccomp=default_with_perf.json --rm -ti caffe-demo2 bash

已知一个问题是,使用旧版本的驱动程序和 CUDA 工具包,Docker 收集会过早终止。 如果收集意外结束,请更新到最新版本。

Docker 启动后,使用 Nsight Systems CLI 在 Docker 内启动收集。 生成的文件可以像任何其他 CLI 结果一样导入到 Nsight Systems 主机中。

通过 Kubernetes 启动的分析服务

现在,Nsight Systems 可以通过 sidecar 注入提供分析,而无需修改您的容器或 k8/helm 规范。

workflow graph for nsys profiling Kubernetes

启用 sidecar 后,可以使用 Kubernetes 标签按命名空间或 pod 过滤收集的数据,或者在容器进程中使用命令行正则表达式进行过滤。

此功能与各种云服务提供商的内部托管 Kubernetes 变体兼容,包括 AKS、EKS、GKE 和 OKE。

此 sidecar 的文档和下载可在 NGC Sidecar Injector 获得。

GUI VNC 容器

Nsight Systems 提供了一个构建脚本,用于构建具有 Nsight Systems GUI 和 VNC 服务器的自隔离 Docker 容器。

您可以在 Nsight Systems 安装目录下的 host-linux-x64/Scripts/VncContainer 目录(或其他架构上的类似目录)中找到 build.py 脚本。 您将需要安装 Docker 和 Python 3.5 或更高版本。

可用参数

简称

全名

描述

--vnc-password

(可选)VNC 访问的默认密码(至少 6 个字符)。 如果指定且为空,则在构建期间会询问用户。 可以在运行容器时更改。

-aba

--additional-build-arguments

(可选)将传递给 docker build 命令的其他参数。

-hd

--nsys-host-directory

(可选)包含 Nsight Systems 主机二进制文件(带有 GUI)的目录。

-td

--nsys-target-directory

(可选,可重复)包含 Nsight Systems 目标二进制文件的目录(可以多次指定)。

--tigervnc

(可选)使用 TigerVNC 而不是 x11vnc。

--http

(可选)在 Docker 容器中安装 noVNC 以进行 HTTP 访问。

--rdp

(可选)在 Docker 中安装 xRDP 以进行 RDP 访问。

--geometry

(可选)VNC 服务器的默认分辨率,格式为 WidthxHeight(默认为 1920x1080)。

--build-directory

(可选)用于保存临时文件的目录(具有当前用户的写入权限)。 默认情况下,将使用 script 或 tmp 目录。

端口

可以从容器发布这些端口,以提供对 Docker 容器的访问

端口

用途

条件

TCP 5900

VNC 访问的端口

TCP 80(可选)

HTTP 访问 noVNC 服务器的端口

容器使用 --http 参数构建

TCP 3389(可选)

RDP 访问的端口

容器使用 --rdp 参数构建

Docker 文件夹

用途

描述

/mnt/host

共享文件夹的根路径

Docker 用户拥有的文件夹(可以从 Nsight Systems GUI 访问内部内容)

/mnt/host/Projects

由容器中的 Nsight Systems UI 创建的项目和报告的文件夹

/mnt/host/logs

包含内部服务日志的文件夹

可能有助于将报告发送给开发人员

环境变量

变量名

用途

VNC_PASSWORD

VNC 访问的密码(至少 6 个字符)

NSYS_WINDOW_WIDTH

VNC 服务器显示宽度(以像素为单位)

NSYS_WINDOW_HEIGHT

VNC 服务器显示高度(以像素为单位)

示例

使用端口 5916 上的 VNC 访问

sudo docker run -p 5916:5900/tcp -ti nsys-ui-vnc:1.0

使用端口 5916 上的 VNC 访问和端口 8080 上的 HTTP 访问

sudo docker run -p 5916:5900/tcp -p 8080:80/tcp -ti nsys-ui-vnc:1.0

使用端口 5916 上的 VNC 访问、端口 8080 上的 HTTP 访问和端口 33890 上的 RDP 访问

sudo docker run -p 5916:5900/tcp -p 8080:80/tcp -p 33890:3389/tcp -ti nsys-ui-vnc:1.0

使用端口 5916 上的 VNC 访问,共享主机中的 “HOME” 文件夹,VNC 服务器分辨率为 3840x2160,以及自定义 VNC 密码

sudo docker run -p 5916:5900/tcp -v $HOME:/mnt/host/home -e NSYS_WINDOW_WIDTH=3840 -e NSYS_WINDOW_HEIGHT=2160 -e VNC_PASSWORD=7654321 -ti nsys-ui-vnc:1.0

使用端口 5916 上的 VNC 访问,共享主机中的 “HOME” 文件夹,以及用于访问容器中 Nsight Systems GUI 创建的报告的项目文件夹

sudo docker run -p 5916:5900/tcp -v $HOME:/mnt/host/home -v /opt/NsysProjects:/mnt/host/Projects -ti nsys-ui-vnc:1.0

GUI WebRTC 容器

有关创建自隔离 Docker 容器以使用 WebRTC 通过浏览器访问 Nsight Systems 的说明。 下面引用的所有脚本都可以在您的 Nsight Systems 安装中的 host*/Scripts/WebRTCContainer 文件夹中找到。

先决条件

  • x86_64 Linux

  • Docker

  • 用于下载容器内 Ubuntu 软件包的互联网访问。

构建

要构建 docker 容器,请使用以下命令

$ sudo ./build.sh

上述命令将创建一个 docker 镜像,可以使用 run.sh 运行

其他 docker 构建参数

其他 Docker Build 参数可以传递给 build.sh。 例如

$ sudo ./build.sh --network=host

运行

要运行 docker 容器

$ sudo ./run.sh

run.sh 的末尾,它将为您提供一个 URL 以连接到 WebRTC 客户端。 它看起来像 http://$HOST_IP:8080/。 您可以在浏览器中使用此地址来访问 Nsight Systems GUI 界面。

其他 docker 运行参数

其他 Docker Run 参数可以传递给 run.sh. 这些参数可用于将包含 Nsight Systems 报告的主机目录挂载到 docker 容器。 例如

$ sudo ./run.sh -v $HOME:/mnt/host/home -v /myawesomereports:/mnt/host/myawesomereports

运行时环境变量

运行时环境变量可用于配置运行时参数。

变量

描述

默认值

HOST_IP

将发送到客户端的服务器 IP。 此 IP 应可从客户端访问,以建立客户端/服务器连接。

第一个可用网络接口的 IP 地址。

HTTP_PORT

用于 HTTP 访问 Nsight Systems 用户界面的 TCP 端口。

8080

MEDIA_PORT

将用于 WebRTC 数据传输的 TCP 端口。

3478

SCREEN

用于渲染的屏幕分辨率。 当前仅支持 1920x1080、1280x720、1152x648、1024x576、960x720、800x600

1920x1080

CONTAINER_NAME

将分配给正在运行的容器的名称。

nvidia-devtools-streamer-nsys

有用的内部 Docker 文件夹列表

Docker 文件夹

用途

描述

/mnt/host/logs

包含内部服务日志的文件夹

可能有助于将报告发送给 NVIDIA 开发人员

示例

要在 10.10.10.10 网络接口上运行容器,使用 8000 HTTP 端口,8888 media 端口

$ sudo HOST_IP=10.10.10.10 HTTP_PORT=8000 MEDIA_PORT=3479 ./run.sh

停止

要停止 docker 容器,可以使用以下命令

$ sudo ./stop.sh

如果在启动容器期间使用了 CONTAINER_NAME 环境变量来指定容器的名称,则在发出停止容器的命令时也应使用相同的变量。

从 NVIDIA nvprof 迁移

使用 Nsight Systems CLI nvprof 命令

Nsight Systems CLI 的 nvprof 命令旨在帮助以前的 nvprof 用户过渡到 nsys。 nsys 不支持许多 nvprof 开关,通常是因为它们现在是 NVIDIA Nsight Compute 的一部分。

完整的 nvprof 文档可以在 https://docs.nvda.net.cn/cuda/profiler-users-guide 中找到。

Nsight Compute 的 nvprof 迁移指南可以在 https://docs.nvda.net.cn/nsight-compute/NsightComputeCli/index.html#nvprof-guide 中找到。

nsys nvprof 命令不支持下面未列出的任何 nvprof 开关。 此命令不提供其他 nsys 功能。 未来不会向此命令添加新功能。

CLI nvprof 命令开关选项

选择 nvprof 命令开关后,可以使用以下选项。 当您准备好直接使用 Nsight Systems CLI 时,请参阅 命令行选项 文档,了解下面给出的 nsys 开关。 请注意,nsys 实现和输出可能与 nvprof 不同。

用法.

nsys nvprof [options]

开关

参数(粗体为默认值)

nsys 开关

开关描述

--annotate-mpi

off, openmpi, mpich

--trace=mpi--mpi-impl

使用 NVTX 标记自动注释 MPI 调用。 指定安装在您机器上的 MPI 实现。 仅支持 OpenMPI 和 MPICH 实现。

--cpu-thread-tracing

on, off

--trace=osrt

收集有关 CPU 线程 API 活动的信息。

--profile-api-trace

none, runtime, driver,all

--trace=cuda

打开/关闭 CUDA 运行时和驱动程序 API 跟踪。 对于 Nsight Systems,没有单独的 CUDA 运行时和 CUDA 驱动程序跟踪,因此选择 runtimedriver 等同于选择 all

--profile-from-start

on, off

如果关闭,请使用 --capture-range=cudaProfilerApi

启用/禁用从应用程序启动开始的分析。 如果禁用,应用程序可以使用 {cu,cuda}Profiler{Start,Stop} 来打开/关闭分析。

-t --timeout

<nanoseconds> 默认值=0

--duration=seconds

如果大于 0,则在超时秒数后停止收集并杀死启动的应用程序。 nvprof 在 CUDA 驱动程序初始化时开始计数。 nsys 立即开始计数。

--cpu-profiling

on, off

--sampling=cpu

打开/关闭 CPU 分析

--openacc-profiling

on, off

--trace=openacc 以打开

启用/禁用从 OpenACC 分析接口记录信息。 注意:OpenACC 分析接口取决于 OpenACC 运行时的存在。 有关支持的运行时,请参阅 文档的 CUDA 跟踪部分

-o --export-profile

<文件名>

--output={filename} 和/或 --export=sqlite

导出命名文件以导入或在 Nsight Systems GUI 中打开。 字符串中的 %q{ENV_VAR} 将替换为环境变量的值。 如果未设置,则会发生错误。 %h 替换为系统主机名。 字符串中的 %% 替换为 %。 当前不支持字符串中的 %p。 % 后的任何其他字符都是非法的。 默认值为 report1,数字递增以避免覆盖用户工作目录中的文件。

-f --force-overwrite

--force-overwrite=true

强制覆盖所有同名输出文件。

-h --help

--help

打印 Nsight Systems CLI 帮助

-V --version

--version

打印 Nsight Systems CLI 版本信息

后续步骤

NVIDIA Visual Profiler (NVVP) 和 NVIDIA nvprof 已弃用。 新的 GPU 和功能将不再受这些工具支持。 我们鼓励您立即迁移到 Nsight Systems。 有关其他信息、建议和原理,请参阅 其他资源 中的博客系列。

Direct3D 跟踪

Nsight Systems 能够跟踪 Windows 目标上的 Direct3D 11 API 和 Direct3D 12 API。

D3D11 API 跟踪

Nsight Systems 可以捕获有关分析进程发出的 Direct3D 11 API 调用的信息。 这包括捕获 D3D11 API 函数的执行时间、性能标记和帧持续时间。

D3D11 API Trace

SLI 跟踪

您可以跟踪 D3D11 应用程序的 SLI 查询和对等传输。 这需要 SLI 硬件和 NVIDIA 控制台中的活动 SLI 配置文件定义。

D3D12 API 跟踪

Direct3D 12 是适用于 Microsoft Windows 的低开销 3D 图形和计算 API。 有关 Direct3D 12 的信息,请访问 Direct3D 12 编程指南

Nsight Systems 可以捕获有关分析进程对 Direct3D 12 的使用情况的信息。 这包括捕获 D3D12 API 函数的执行时间、GPU 上执行的相应工作负载、性能标记和帧持续时间。

D3D12 overview picture

“命令列表创建”行显示命令列表正在创建的时间段。 这使开发人员能够改进其应用程序的多线程命令列表创建。 命令列表创建时间段是在调用 ID3D12GraphicsCommandList::Reset 和调用 ID3D12GraphicsCommandList::Close 之间测量的。

D3D12 commandlist creation

“GPU”行显示 D3D12 队列活动的压缩视图,按队列类型进行颜色编码。 展开它将显示各个队列及其相应的 API 调用。

D3D12 GPU aggregated

为分析应用程序创建的每个 D3D12 命令队列显示一个“命令队列”行。 该行的标题显示队列的运行索引及其类型(Direct、Compute、Copy)。

D3D12 command queue overview

“DX12 API 内存操作”行显示所有 API 内存操作和非持久性资源映射。 行中的事件范围按其所属的堆类型(默认、回读、上传、自定义或 CPU 可见 VRAM)进行颜色编码,使用黄色突出显示使用警告。 通过展开该行以显示每个单独堆类型的行,可以找到操作的细分。

显示以下操作和警告

  • 调用 ID3D12Device::CreateCommittedResourceID3D12Device4::CreateCommittedResource1ID3D12Device8::CreateCommittedResource2

    • 如果未在方法的 HeapFlags 参数中设置 D3D12_HEAP_FLAG_CREATE_NOT_ZEROED,则将报告警告。

  • 调用 ID3D12Device::CreateHeapID3D12Device4::CreateHeap1

    • 如果未在方法的 pDesc 参数的 Flags 字段中设置 D3D12_HEAP_FLAG_CREATE_NOT_ZEROED,则将报告警告

  • 调用 ID3D12Resource::ReadFromSubResource

    • 如果读取到 D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE CPU 页面或从 D3D12_HEAP_TYPE_UPLOAD 资源读取,则将报告警告。

  • 调用 ID3D12Resource::WriteToSubResource

    • 如果写入来自 D3D12_CPU_PAGE_PROPERTY_WRITE_BACK CPU 页面或写入到 D3D12_HEAP_TYPE_READBACK 资源,则将报告警告。

  • ID3D12Resource::MapID3D12Resource::Unmap 的调用将匹配到非持久性映射的 [Map, Unmap] 范围。 如果映射范围是嵌套的,则仅显示最外部的范围(引用计数 = 1)。

D3D12 memory operations and usage warning

“API”行显示调用 ID3D12CommandQueue::ExecuteCommandLists 的时间段。 “GPU 工作负载”行显示 GPU 执行工作负载的时间段。 工作负载的类型(图形、计算、复制等)显示在表示工作负载 GPU 执行的条形图上。

D3D12 API and Workload

此外,您可以在其各自的行中看到 PIX 命令队列 CPU 端性能标记、GPU 端性能标记和 GPU 命令列表性能标记。

D3D12 CPU marker D3D12 GPU marker D3D12 commandlist marker

单击 GPU 工作负载会突出显示相应的 ID3D12CommandQueue::ExecuteCommandListsID3D12GraphicsCommandList::ResetID3D12GraphicsCommandList::Close API 调用,反之亦然。

D3D12 correlation

在运行数十个 CPU 线程的复杂应用程序中,检测哪个 CPU 线程被 fence 阻塞可能很困难。时间线视图显示了涉及的 3 个操作

  • CPU 线程将信号命令和 fence 值推送到命令队列中。这显示在调用线程的 DX12 同步子行上。

  • GPU 执行该命令,设置 fence 值并发出 fence 信号。这显示在 GPU 队列同步子行上。

  • CPU 线程调用 Win32 等待 API 以阻塞等待直到 fence 发出信号。这显示在线程的 OS 运行时库行上。

单击其中一个将突出显示它以及相应的其他两个调用。

D3D12 fence sync

Nsight Systems D3D12 跟踪捕获 D3D12 Work Graphs 调度调用到 DispatchGraph 以及工作图 GPU 执行的时间边界。

D3D12 Work Graphs API trace

DX12 API 行显示 ID3D12GraphicsCommandList10::DispatchGraph 调用。GPU PIX 标记行使用标题为“D3D12 graph execution”的自定义标记来标记图执行。

D3D12 API and Workload

WDDM 队列

Windows 显示驱动程序模型 (WDDM) 架构使用队列将工作数据包从 CPU 发送到 GPU。每个进程中的每个 D3D 设备都与一个或多个上下文相关联。分析的应用程序使用的图形、计算和复制命令与上下文关联,在命令缓冲区中批量处理,并推送到与该上下文相关的相关队列中。

Nsight Systems 可以在跟踪会话期间捕获这些队列的状态。

启用“收集其他范围的 ETW 事件”选项还将从 Microsoft-Windows-DxgKrnl 提供程序捕获扩展的 DxgKrnl 事件,例如上下文状态、分配、同步等待、信号事件等。

WDDM Queues

WDDM 队列中的命令缓冲区可能具有以下类型之一

  • 渲染

  • 延迟

  • 系统

  • MMIO翻转

  • 等待

  • 信号

  • 设备

  • 软件

它也可能被标记为 Present 缓冲区,表示应用程序已完成渲染并请求显示源表面。

请参阅 Microsoft 文档,了解 WDDM 架构和 DXGKETW_QUEUE_PACKET_TYPE 枚举。

要保留捕获的 .etl 跟踪文件,以便可以在其他工具(例如 GPUView)中查看它们,请在 Nsight Systems 全局“选项”对话框中的“分析行为”下更改“将 ETW 日志文件保存在项目文件夹中”选项。.etl 文件将出现在与 .nsys-rep 文件相同的文件夹中,方法是在项目资源管理器中右键单击报告并选择“在文件夹中显示...”。从每个 ETW 提供程序收集的数据将显示在其自己的 .etl 文件中,并且还将创建一个名为“Report XX-Merged-*.etl”的附加 .etl 文件,其中包含来自所有捕获源的事件。

WDDM 硬件调度器

当在 Windows 10 或更新版本中启用 GPU 硬件调度时,Windows 显示驱动程序模型 (WDDM) 使用 DxgKrnl ETW 提供程序来公开 NVIDIA GPU 硬件调度上下文切换的报告。

Nsight Systems 可以捕获这些上下文切换事件,并在时间线行中标题为“WDDM HW Scheduler - [HW 队列类型]”的 GPU 下显示。每个队列下的范围将显示与该时间段内 GPU 工作关联的进程名称和 PID。

如果在 Windows 系统显示设置中启用 GPU 硬件调度,并且在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”,则将捕获事件。

WDDM HW Scheduler row for 3D HW Queue

Vulkan API 跟踪

Vulkan 概述

Vulkan 是一种低开销、跨平台的 3D 图形和计算 API,面向从 PC 到手机和嵌入式平台的各种设备。Vulkan API 由 Khronos Group 定义。有关 Vulkan 和 Khronos Group 的信息,请访问 Khronos Vulkan 网站

Nsight Systems 可以捕获有关分析进程的 Vulkan 使用情况的信息。这包括捕获 Vulkan API 函数的执行时间、相应的 GPU 工作负载、调试实用程序标签和帧持续时间。Windows 和 x86 Linux 操作系统均支持 Vulkan 分析。

Vulkan overview picture

命令缓冲区创建行显示正在创建命令缓冲区的时间段。这使开发人员能够改进其应用程序的多线程命令缓冲区创建。命令缓冲区创建时间段在调用 vkBeginCommandBuffer 和调用 vkEndCommandBuffer 之间测量。

Vulkan command buffer creation

为分析的应用程序创建的每个 Vulkan 队列显示一个队列行。API 子行显示调用 vkQueueSubmit 的时间段。GPU 工作负载子行显示 GPU 执行工作负载的时间段。

Vulkan API and Workload

此外,您可以在 CPU 和 GPU 上看到 Vulkan 调试实用程序标签

Vulkan CPU marker

单击 GPU 工作负载会突出显示相应的 vkQueueSubmit 调用,反之亦然。

Vulkan correlation

Vulkan 内存操作行包含所有 Vulkan 主机端内存操作的聚合,例如主机阻塞写入和读取或非持久性映射-取消映射范围。

该行按堆索引和内存类型分为子行 - 每个行的工具提示和内部范围显示堆标志和内存属性标志。

Vulkan Memory Operations Vulkan Memory Operations

管线创建反馈

当跟踪目标应用程序调用 Vulkan 管线创建 API 时,Nsight Systems 利用管线创建反馈扩展来收集有关各个管线创建阶段持续时间的更多详细信息。

有关此扩展的详细信息,请参阅 管线创建反馈扩展

Vulkan 管线创建反馈在 NVIDIA 驱动程序版本 435 或更高版本上可用。

Vulkan pipeline creation feedback

Vulkan GPU 跟踪注释

  • Vulkan GPU 跟踪仅在跟踪使用 NVIDIA GPU 的应用程序时可用。

  • 计算和传输队列上 Vulkan 命令缓冲区执行范围的结束时间可能在时间线上显示得早于实际发生时间。

卡顿分析

卡顿分析概述

Windows 上的 Nsight Systems 针对使用 OpenGL、D3D11、D3D12 或 Vulkan 的分析图形应用程序显示卡顿分析可视化辅助工具,如下面各节中详细介绍。

FPS 概述

帧持续时间部分在 CPU 和 GPU 上都显示帧持续时间。

FPS overview

帧持续时间行显示当前时间线视口的实时 FPS 统计信息。显示的值为

  1. 显示的 CPU 帧数,以及捕获的总数。

  2. 当前显示时间范围的平均值、最小值和最大值 CPU 帧时间。

  3. 当前显示帧的平均 FPS 值。

  4. 帧长度的第 99 个百分位数值(以便范围内只有 1% 的帧长于此值)。

当滚动、缩放或过滤时间线视图时,这些值将自动更新。

FPS stutter row

卡顿行突出显示比其紧邻区域中的其他帧明显更长的帧。

卡顿行使用一种算法,该算法将每个帧的持续时间与周围 19 帧的中值持续时间进行比较。持续时间差小于 4 毫秒永远不会被视为卡顿,以避免显示器上布满绝对卡顿小且用户不易察觉的帧。

例如,如果卡顿阈值设置为 20%

  1. 中值持续时间为 10 毫秒。时间为 13 毫秒的帧将不会被报告(相对差异 > 20%,绝对差异 < 4 毫秒)。

  2. 中值持续时间为 60 毫秒。时间为 71 毫秒的帧将不会被报告(相对差异 < 20%,绝对差异 > 4 毫秒)。

  3. 中值持续时间为 60 毫秒。时间为 80 毫秒的帧是卡顿(相对差异 > 20%,绝对差异 > 4 毫秒,两个条件都满足)。

OSC 检测

“19 帧窗口中值”算法本身可能不适用于某些“振荡”(连续快速和慢速帧)的情况,从而导致一些误报。中值持续时间在振荡情况下没有意义,可能会产生误导。

为了解决此问题并识别是否为振荡帧,应用以下方法

  1. 对于每个帧,计算 19 帧窗口的中值持续时间、第 1 个和第 3 个四分位数。

  2. 计算第 1 个和第 3 个四分位数之间的增量和比率。

  3. 如果第 90 个百分位数的第 3 个 - 第 1 个四分位数增量数组 > 4 毫秒,并且第 90 个百分位数的第 3 个/第 1 个四分位数数组 > 1.2 (120%),则用“OSC”文本标记结果。

右键单击“帧持续时间”行标题,您可以选择目标帧速率(30、60、90 或自定义每秒帧数)。

FPS pick

通过单击自定义 FPS 显示选项,将弹出一个自定义对话框。在该对话框中,您现在可以定义帧持续时间阈值以自定义潜在问题帧的视图。此外,您可以定义卡顿分析帧的阈值。

fps_customizations

帧持续时间条是颜色编码的

  • 绿色,帧持续时间短于目标 FPS 比率所需的时间。

  • 黄色,持续时间略长于目标 FPS 速率所需的时间。

  • 红色,持续时间远远超过维持目标 FPS 速率所需的时间。

Bad FPS

CPU 帧持续时间行显示在连续帧边界调用结束之间测量的 CPU 帧持续时间

  • OpenGL 帧边界是 eglSwapBuffers/glXSwapBuffers/SwapBuffers 调用。

  • D3D11 和 D3D12 帧边界是 IDXGISwapChainX::Present 调用。

  • Vulkan 帧边界是 vkQueuePresentKHR 调用。

实际调用帧边界调用的时间可以在 CPU 帧持续时间行底部的蓝色条中看到

GPU 帧持续时间行显示在以下时间之间测量的时间

  • 此帧的第一个 GPU 工作负载执行的开始时间。

  • 下一帧的第一个 GPU 工作负载执行的开始时间。

Reflex SDK

NVIDIA Reflex SDK 是一系列 NVAPI 调用,允许应用程序将超低延迟驱动程序功能更直接地集成到其游戏中,以进一步优化模拟和渲染阶段之间的同步,并降低用户输入和最终图像渲染之间的延迟。有关 Reflex SDK 的更多详细信息,请参阅 Reflex SDK 网站

当启用 Direct3D 11、Direct3D 12 或 Vulkan API 跟踪时,Nsight Systems 将自动捕获 NVAPI 函数。

Reflex SDK 行显示以下类型的延迟标记的时间线范围

  • RenderSubmit

  • 模拟

  • Present

  • 驱动程序

  • OS 渲染队列

  • GPU 渲染

Reflex SDK

性能警告行

此行显示基于启用的捕获类型自动检测到的性能警告和常见陷阱。报告的警告包括

  • ETW 性能警告。

  • 调用 vkQueueSubmit 的 Vulkan 调用和调用 ID3D12CommandQueue::ExecuteCommandList 的 D3D12 调用,其执行时间比它们生成的 GPU 工作负载的总时间长。

  • D3D12 内存操作警告.

  • 使用可能对性能产生不利影响的 Vulkan API 函数。

  • 创建带有内存清零的 Vulkan 设备,无论是通过物理设备默认设置还是手动设置。

  • 可以组合或删除的 Vulkan 命令缓冲区屏障,例如后续屏障或读取到读取屏障。

Performance Warnings row

帧健康状况

“帧健康状况”行显示在当前帧期间花费时间明显较长的操作,与周围 19 帧中执行的相同操作的中值时间相比。这是检测帧时间卡顿原因的绝佳工具。此类操作可能是:着色器编译、present、内存映射等等。Nsight Systems 测量每个帧中此类操作的累积时间。例如:计算每个帧中着色器编译的累积时间,并将其与周围 19 帧中着色器编译的累积时间进行比较。

Vulkan 帧健康状况行示例

Frame Health Vulkan Frame Health DX12

Windows GPU 内存利用率

每个 GPU 都有两行详细说明其内存利用率:GPU VRAM,显示设备上消耗的内存,以及 GPU WDDM SYSMEM,显示主机计算机 RAM 上消耗的内存。

Memory Utilization rows

这些行显示绿色线条图,表示此内存段的内存预算,以及橙色线条图,表示实际使用的内存量。请注意,这些图表已缩放以适应遇到的最高值,如行标题中的“Y 轴”值所示。您可以使用时间线视图右上角的垂直缩放滑块使行更高,并更详细地查看图表。

Vertical Zoom slider

请注意,GPU VRAM 行中的值与 CUDA 内核内存分配图不同,有关该功能,请参阅 CUDA GPU 内存分配图

GPU VRAM 行还有几个子行,通过在树视图中展开行来访问

如果在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”和“收集其他范围的 ETW 事件,包括上下文状态、分配、同步等待和信号事件等”,则将捕获事件。

GPU VRAM row expanded

VidMm 设备挂起

此行显示 GPU 内存管理器挂起所有内存传输操作的时间范围,等待单个内存传输完成。

如果在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”和“收集其他范围的 ETW 事件,包括上下文状态、分配、同步等待和信号事件等”,则将捕获事件。

降级内存

此行显示从 GPU 本地内存降级到非本地内存(可能是由于超出 VRAM 预算)的 VRAM 量,以蓝色线条图表示。大量的降级内存可能表明视频内存泄漏或内存管理不善。请注意,“降级内存”行与其最高值缩放,类似于“GPU VRAM”和“GPU WDDM SYSMEM”行。

如果在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”和“收集其他范围的 ETW 事件,包括上下文状态、分配、同步等待和信号事件等”,则将捕获事件。

资源分配

Resource Allocations row

此行显示指示资源分配事件的标记。VRAM 资源显示为绿色标记,而 SYSMEM 资源显示为灰色。将鼠标悬停在标记上或在 事件视图 中选择标记将显示所有分配参数以及导致分配事件的调用堆栈。

如果在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”和“收集其他范围的 ETW 事件,包括上下文状态、分配、同步等待和信号事件等”,则将捕获事件。

资源迁移

Resource Migrations row

此行显示 VRAM 和 SYSMEM 之间资源移动的细分,重点是资源逐出。主行显示红色线条图,表示逐出资源内存总量和计数的时程线。

每个子行显示每个资源状态的时程线,如与其相关的 WDDM 事件所反映的那样。如果对象已使用 PIX 或 ID3D11Object::SetName / ID3D12Object::SetName 命名,则名称将显示在行标题中。无论是否命名,行标题还将显示资源维度、格式、优先级和迁移的内存大小。如果资源是使用子资源分部分迁移的,则可以展开该行以显示任何给定时间每个子资源的状态。

展开资源的行将显示与其相关的各个 WDDM 事件以及导致每个事件的调用堆栈。

默认情况下,资源按相关性(最多/最大迁移)排序。右键单击主“资源迁移”行标题,可以选择以下排序选项

  • 相关性

  • 名称

  • 格式

  • 优先级

  • 最早分配时间戳(在主机上出现的顺序)

  • 最早迁移时间戳(在设备上出现的顺序)

最初显示前 5 个资源。如果存在超过 5 个资源,则会在它们下方显示一行,其中显示隐藏资源的数量以及允许显示更多或更少资源的按钮。右键单击此行并选择“显示全部”或“显示全部折叠”以一次显示所有资源。

如果在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”和“收集其他范围的 ETW 事件,包括上下文状态、分配、同步等待和信号事件等”,则将捕获事件。此外,要将图形 API 调试名称事件与资源迁移事件相关联,应启用“收集 DX12”或“收集 Vulkan”选项。

内存传输

Memory Transfer row

此行显示所有内存传输操作的概述。设备到主机传输以橙色显示,主机到设备传输以绿色显示,丢弃的设备内存以浅绿色显示,未知事件以深灰色显示。每个事件标记的高度对应于事件影响的内存量。将鼠标悬停在标记上将显示确切的数量。

展开该行将显示按每个特定类型分解的事件。

如果在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”和“收集其他范围的 ETW 事件,包括上下文状态、分配、同步等待和信号事件等”,则将捕获事件。

系统提交的 VRAM

System Committed VRAM

此行表示当前使用 GPU 的所有进程提交的 VRAM 总大小。堆积图显示彩色图层。每个图层对应于特定进程的 VRAM 提交。

要跟踪 VRAM 提交,请在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”和“收集其他范围的 ETW 事件,包括上下文状态、分配、同步等待和信号事件等”。

VRAM 资源类型分布

VRAM Resource Types Distribution

此行显示每个进程的不同资源类型的 VRAM 使用分布。它采用颜色编码以显示不同的资源类型,并且每个段的高度对应于该资源类型使用的 VRAM 量。展开图表的父行以显示各个资源类别的详细子行。

如果在 Nsight Systems 项目设置中启用“收集 WDDM 跟踪”和“收集其他范围的 ETW 事件,包括上下文状态、分配、同步等待和信号事件等”,则将捕获事件。此外,要将图形 API 调试名称事件与资源迁移事件相关联,应启用“收集 DX12”或“收集 Vulkan”选项。

垂直同步

VSYNC 行显示监视器垂直同步发生的时间。

Vertical Synchronization

OpenMP 跟踪

Linux 版 Nsight Systems 能够捕获有关 OpenMP 事件的信息。此功能构建在 OpenMP 工具接口 (OMPT) 之上,仅完全支持 OpenMP 5.0 或更高版本中定义的工具接口的运行时库。

例如,LLVM OpenMP 运行时库部分实现了工具接口。如果您使用 PGI 编译器 <= 20.4 来构建 OpenMP 应用程序,请添加 -mp=libomp 开关以使用 LLVM OpenMP 运行时并启用基于 OMPT 的跟踪。如果您使用 Clang,请确保您链接到的 LLVM OpenMP 运行时库已启用工具接口进行编译。

OpenMP trace selection

仅处理 OMPT 回调的子集

ompt_callback_parallel_begin
ompt_callback_parallel_end
ompt_callback_sync_region
ompt_callback_task_create
ompt_callback_task_schedule
ompt_callback_implicit_task
ompt_callback_master
ompt_callback_reduction
ompt_callback_task_create
ompt_callback_cancel
ompt_callback_mutex_acquire, ompt_callback_mutex_acquired
ompt_callback_mutex_acquired, ompt_callback_mutex_released
ompt_callback_mutex_released
ompt_callback_work
ompt_callback_dispatch
ompt_callback_flush

注意

原始 OMPT 事件用于生成指示 OpenMP 操作和构造的运行时范围。

示例屏幕截图

OpenMP API trace

OS 运行时库跟踪

在 Linux 上,可以跟踪 OS 运行时库以收集有关低级用户空间 API 的信息。这会跟踪 C 运行时和 POSIX 线程 (pthread) 库公开的系统调用包装器和线程同步接口。这不会执行完整的运行时库 API 跟踪,而是侧重于可能需要很长时间才能执行的函数,或者可能导致您的线程在等待事件完成时从 CPU 中取消调度的函数。OS 运行时跟踪不适用于 Windows 目标。

OS 运行时跟踪通过以下方式补充和增强采样信息

  1. 可视化进程何时与硬件通信、控制资源、执行多线程同步或与内核调度程序交互。

  2. 通过关联 OS 运行时库跟踪如何影响线程调度来添加其他线程状态

    • 等待— 线程未在 CPU 上调度,它位于 OS 运行时库跟踪内部,并且被认为正在等待固件完成请求。

    • 在 OS 运行时库函数中— 线程已在 CPU 上调度,并且位于 OS 运行时库跟踪内部。如果跟踪表示系统调用,则进程可能在内核模式下运行。

  3. 收集长时间 OS 运行时库调用的回溯。这提供了一种收集阻塞状态回溯的方法,使您可以获得有关线程阻塞时间过长的更多上下文,同时避免不必要的短事件开销。

OS runtime libraries row

要从 Nsight Systems 启用 OS 运行时库跟踪

CLI — 将 -t--trace 选项与 osrt 参数一起使用。有关更多信息,请参阅 命令行选项

GUI — 选择收集 OS 运行时库跟踪复选框。

Configure OS runtime libraries trace

您还可以使用跳过如果短于。这将跳过短于给定阈值的调用。启用此选项将提高性能并减少时间线上的噪声。我们强烈建议您跳过短于 1 微秒的 OS 运行时库调用。

锁定资源

下面列出的函数会受到特殊处理。如果工具检测到资源已被另一个线程获取并将导致阻塞调用,我们将始终跟踪它。否则,永远不会跟踪它。

pthread_mutex_lock
pthread_rwlock_rdlock
pthread_rwlock_wrlock
pthread_spin_lock
sem_wait

请注意,即使某个调用被确定为可能阻塞,也可能在经过几个周期后实际上并未阻塞。在这种情况下,仍会跟踪该调用。

限制

  • Nsight Systems 仅跟踪 C 运行时公开的 syscall 包装器。它无法跟踪通过汇编代码调用的 syscall。

  • 仅当启用采样时,才会启用其他线程状态以及长时间调用的回溯收集。

  • 收集回溯时,无法配置深度和持续时间阈值。目前,只有超过 80 微秒的 OS 运行时库调用才会生成回溯,最多 24 帧。此限制将在产品的未来版本中删除。

  • 需要使用 -funwind-tables 编译器标志编译您的应用程序和库,以便 Nsight Systems 正确展开回溯。

OS 运行时库跟踪过滤器

OS 运行时库跟踪仅限于选定的函数列表。它还取决于链接到应用程序的 C 运行时的版本。

OS 运行时默认函数列表

Libc 系统调用包装器

accept
accept4
acct
alarm
arch_prctl
bind
bpf
brk
chroot
clock_nanosleep
connect
copy_file_range
creat
creat64
dup
dup2
dup3
epoll_ctl
epoll_pwait
epoll_wait
fallocate
fallocate64
fcntl
fdatasync
flock
fork
fsync
ftruncate
futex
ioctl
ioperm
iopl
kill
killpg
listen
membarrier
mlock
mlock2
mlockall
mmap
mmap64
mount
move_pages
mprotect
mq_notify
mq_open
mq_receive
mq_send
mq_timedreceive
mq_timedsend
mremap
msgctl
msgget
msgrcv
msgsnd
msync
munmap
nanosleep
nfsservctl
open
open64
openat
openat64
pause
pipe
pipe2
pivot_root
poll
ppoll
prctl
pread
pread64
preadv
preadv2
preadv64
process_vm_readv
process_vm_writev
pselect6
ptrace
pwrite
pwrite64
pwritev
pwritev2
pwritev64
read
readv
reboot
recv
recvfrom
recvmmsg
recvmsg
rt_sigaction
rt_sigqueueinfo
rt_sigsuspend
rt_sigtimedwait
sched_yield
seccomp
select
semctl
semget
semop
semtimedop
send
sendfile
sendfile64
sendmmsg
sendmsg
sendto
shmat
shmctl
shmdt
shmget
shutdown
sigaction
sigsuspend
sigtimedwait
socket
socketpair
splice
swapoff
swapon
sync
sync_file_range
syncfs
tee
tgkill
tgsigqueueinfo
tkill
truncate
umount2
unshare
uselib
vfork
vhangup
vmsplice
wait
wait3
wait4
waitid
waitpid
write
writev
_sysctl

POSIX 线程

pthread_barrier_wait
pthread_cancel
pthread_cond_broadcast
pthread_cond_signal
pthread_cond_timedwait
pthread_cond_wait
pthread_create
pthread_join
pthread_kill
pthread_mutex_lock
pthread_mutex_timedlock
pthread_mutex_trylock
pthread_rwlock_rdlock
pthread_rwlock_timedrdlock
pthread_rwlock_timedwrlock
pthread_rwlock_tryrdlock
pthread_rwlock_trywrlock
pthread_rwlock_wrlock
pthread_spin_lock
pthread_spin_trylock
pthread_timedjoin_np
pthread_tryjoin_np
pthread_yield
sem_timedwait
sem_trywait
sem_wait

I/O

aio_fsync
aio_fsync64
aio_suspend
aio_suspend64
fclose
fcloseall
fflush
fflush_unlocked
fgetc
fgetc_unlocked
fgets
fgets_unlocked
fgetwc
fgetwc_unlocked
fgetws
fgetws_unlocked
flockfile
fopen
fopen64
fputc
fputc_unlocked
fputs
fputs_unlocked
fputwc
fputwc_unlocked
fputws
fputws_unlocked
fread
fread_unlocked
freopen
freopen64
ftrylockfile
fwrite
fwrite_unlocked
getc
getc_unlocked
getdelim
getline
getw
getwc
getwc_unlocked
lockf
lockf64
mkfifo
mkfifoat
posix_fallocate
posix_fallocate64
putc
putc_unlocked
putwc
putwc_unlocked

杂项

forkpty
popen
posix_spawn
posix_spawnp
sigwait
sigwaitinfo
sleep
system
usleep

Syscall 跟踪(预览)

Linux 版 Nsight Systems 和 Nsight Systems Embedded Platforms Edition 能够跟踪内核空间中的 Linux 系统调用。此功能使用 Linux 的 eBPF 技术,并且在运行 Linux v5.11 或更高版本的系统上受支持,特别是那些使用启用了 CONFIG_DEBUG_INFO_BTF 构建的系统,这在大多数主要的 Linux 发行版上是默认设置。此功能需要 CAP_BPFCAP_PERFMON 功能(或者,CAP_SYS_ADMIN 或 root 权限)用于 nsys 进程,有关详细信息,请参阅 capabilities man page

要启用此功能

CLI — 将 syscall 设置为 -t--trace 选项的参数之一。

GUI — 选择收集 syscall 跟踪复选框。

Syscall trace GUI selection

示例屏幕截图

Syscall trace timeline example

NVTX 跟踪

NVIDIA 工具扩展库 (NVTX) 是一种强大的机制,允许用户手动检测其应用程序。然后,Nsight Systems 可以收集信息并将其显示在时间线上。

Nsight Systems 支持 NVTX 规范的 3.0 版本。

支持以下功能

  • nvtxDomainCreate(), nvtxDomainDestroy()
    
    nvtxDomainRegisterString()
    
  • 推入-弹出范围(在同一线程中开始和结束的嵌套范围)。

    nvtxRangePush(), nvtxRangePushEx()
    
    nvtxRangePop()
    
    nvtxDomainRangePushEx()
    
    nvtxDomainRangePop()
    
  • 开始-结束范围(进程全局且不限于单个线程的范围)

    nvtxRangeStart(), nvtxRangeStartEx()
    
    nvtxRangeEnd()
    
    nvtxDomainRangeStartEx()
    
    nvtxDomainRangeEnd()
    
  • 标记

    nvtxMark(), nvtxMarkEx()
    
    nvtxDomainMarkEx()
    
  • 线程名称

    nvtxNameOsThread()
    
  • 类别

    nvtxNameCategory()
    
    nvtxDomainNameCategory()
    

要了解有关 NVTX 特定功能的更多信息,请参阅 NVTX 头文件:nvToolsExt.hNVTX 文档

要在您的应用程序中使用 NVTX,请按照以下步骤操作

  1. 在您的源代码中添加 #include "nvtx3/nvToolsExt.h"。nvtx3 目录位于 Nsight Systems 软件包的 Target-<architecture>/nvtx/include 目录中,并且可以通过 github 在 http://github.com/NVIDIA/NVTX 上获得。

  2. 添加以下编译器标志:-ldl

  3. 添加对 NVTX API 函数的调用。例如,尝试在 main() 函数的开头添加 nvtxRangePush("main"),并在结尾的 return 语句之前添加 nvtxRangePop()

    为了在 C++ 代码中方便起见,请考虑添加一个实现 RAII(资源获取即初始化)模式的包装器,这将保证每个范围都被关闭。

  4. 在项目设置中,选中收集 NVTX 跟踪复选框。

此外,通过启用“插入 NVTX 标记热键”选项,可以通过按 F11 键将 NVTX 标记添加到正在运行的非控制台应用程序。这些标记将出现在名为“HotKey markers”的 NVTX 域下的报告中。

通常,即使应用程序不是为分析目的而构建的,也可以将对 NVTX 函数的调用保留在源代码中,因为在未连接分析器时,开销非常低。

NVTX 不适用于注释非常小的、被非常频繁调用的代码片段。一个好的经验法则是:如果被注释的代码通常需要少于 1 微秒的时间来执行,则应谨慎地在此代码周围添加 NVTX 范围。

注意

范围注释应仔细匹配。如果打开了许多范围但未关闭,则 Nsight Systems 无法以有意义的方式对其进行可视化。一个经验法则是任何时候都不要打开超过几十个范围。Nsight Systems 不支持具有许多未关闭范围的报告。

NVTX 有效负载和计数器(预览)

NVTX 扩展有效负载和 NVTX 计数器通过允许用户将任意结构化数据传递到 NVTX 事件来提高 NVTX 注释的灵活性。然后,这将允许用户在 Nsight Systems UI 中定义此数据的布局,而无需额外的数据转换。

有关更多信息,请参阅 NVTX 文档

NVTX Payloads and Counters

NVTX 域和类别

NVTX 域支持注释的范围限定。除非另有说明,否则所有事件和注释都在默认域中。此外,类别可用于对事件进行分组。

Nsight Systems 使用户能够包含或排除来自特定域的 NVTX 事件。如果您正在跨多个库进行分析,并且只对其中一些库中的 nvtx 事件感兴趣,这将特别有用。

NVTX domain selection screen

此功能也可从 CLI 获得。有关更多详细信息,请参阅 CLI 文档中的 --nvtx-domain-include--nvtx-domain-exclude

用户设置的类别将被识别并在 GUI 中显示。

NVTX screenshot with domains and categories

CUDA 跟踪

基本 CUDA 跟踪

Nsight Systems 能够捕获有关分析进程中 CUDA 执行的信息。

以下信息可以收集并在报告的时间线上显示

  • CUDA API 跟踪 — 应用程序发出的 CUDA 运行时和 CUDA 驱动程序调用的跟踪。

    • CUDA 运行时调用通常以 cuda 前缀开头(例如 cudaLaunch)。

    • CUDA 驱动程序调用通常以 cu 前缀开头(例如 cuDeviceGetCount)。

  • CUDA 工作负载跟踪 — GPU 上发生的活动跟踪,包括内存操作(例如,主机到设备内存复制)和内核执行。在使用 CUDA API 的线程中,其他子行将显示在时间线树中。

  • 在 Nsight Systems Workstation Edition 上,cuDNN 和 cuBLAS API 跟踪以及 OpenACC 跟踪。

CUDA thread rows

在时间线行树的底部附近,将出现 GPU 节点,其中包含 CUDA 节点。在 CUDA 节点中,进程中使用的每个 CUDA 上下文都将与其相应的 CUDA 流一起显示。流将包含 GPU 上的内存操作和内核启动。内核启动以蓝色表示,而内存传输以红色显示。

CUDA GPU rows

捕获 CUDA 信息的最简单方法是从 Nsight Systems 启动进程,它将为您设置环境。为此,只需设置正常启动并选中收集 CUDA 跟踪复选框即可。

对于 Nsight Systems Workstation Edition,它看起来像这样

Configure CUDA trace

对于 Nsight Systems Embedded Platforms Edition,它看起来像这样

Configure CUDA trace

其他配置参数可用

  • 收集长于 X 秒的 API 调用的回溯 - 启用 CUDA API 回溯的收集,并设置 CUDA API 事件必须花费的最短时间才能收集其回溯。将此值设置得过低可能会导致应用程序开销过高,并严重增加结果文件的大小。

  • 定期刷新数据 — 指定尝试刷新 CUDA 跟踪数据的周期。通常,为了收集完整的 CUDA 跟踪数据,应用程序需要完成用于 CUDA 工作的设备(调用 cudaDeviceReset()),然后让应用程序正常退出(而不是崩溃)。

    此选项允许在设备完成之前刷新 CUDA 跟踪数据。但是,这可能会给随机的 CUDA 驱动程序或 CUDA 运行时 API 调用带来额外的开销。

  • 跳过一些 API 调用 — 避免跟踪不重要的 CUDA 运行时 API 调用(即 cudaConfigureCall()cudaSetupArgument()cudaHostGetDevicePointers())。不跟踪这些函数可以使 Nsight Systems 显著降低性能分析开销,而不会丢失任何有趣的数据。

  • 收集 GPU 内存使用情况 - 收集用于生成 CUDA 随时间分配内存图表的信息。请注意,这将增加开销。请参阅 CUDA GPU 内存分配图表

  • 收集统一内存 CPU 页错误 - 收集当 CPU 代码尝试访问驻留在设备上的内存页时发生的页错误信息。请参阅 统一内存 CPU 页错误

  • 收集统一内存 GPU 页错误 - 收集当 GPU 代码尝试访问驻留在 CPU 上的内存页时发生的页错误信息。请参阅 统一内存 GPU 页错误

  • 收集 CUDA 图形跟踪 - 默认情况下,CUDA 跟踪将收集并公开关于整个图形的信息。用户可以选择逐节点收集。请参阅 CUDA 图形跟踪

  • 对于 Nsight Systems Workstation Edition,收集 cuDNN 跟踪收集 cuBLAS 跟踪收集 OpenACC 跟踪 - 选择要跟踪的(如果有)依赖于 CUDA 的额外库。

    当使用 PGI 运行时版本 15.7 或更高版本且不进行静态编译时,支持 OpenACC 版本 2.0、2.5 和 2.6。为了区分构造,需要 PGI 运行时 16.1 或更高版本。请注意,Nsight Systems Workstation Edition 目前不支持 GCC 实现的 OpenACC。

注意

如果您的应用程序在所有收集的 CUDA 跟踪数据复制出来之前崩溃,则部分或全部数据可能会丢失且不会出现在报告中。

注意

当分析终止时,Nsight Systems 将不会包含设备缓冲区中仍存在的 CUDA 事件信息。如果使用 cudaProfilerAPI 控制分析,建议在结束分析之前调用 cudaDeviceReset。

从 CUDA 内核启动 NVIDIA Nsight Compute

在您使用 Nsight Systems 中的 CUDA 跟踪找到潜在的问题内核后,您可能希望在该特定内核上运行 NVIDIA Nsight Compute。右键单击内核以调出菜单。

Option to run NVIDIA Nsight Compute

如果这是用户首次选择此功能,那么我们将显示以下对话框以获取他们的偏好设置

Settings for NVIDIA Nsight Compute

第一个选项使用已知参数调用 NVIDIA Nsight Compute UI。这是本地或远程性能分析的首选选项。用户必须提供 ncu-ui 可执行文件的位置。Nsight Systems 将验证路径和可执行文件是否有效。

第二个选项是为了方便那些在主机系统上没有安装 NVIDIA Nsight Compute 的用户,他们只是想要命令行,他们可以使用该命令行在远程目标上自行运行 Nsight Compute,而无需太多自动化操作。

Dialog to give the command line to use with Nsight Compute

如果用户选择启动 NCU UI 的选项,Nsight Systems 将使用 Nsight Systems 运行中的任何相关参数来调用它。

下面的屏幕截图显示了由 Nsight Systems 调用的 NCU UI。红色圆圈表示由 Nsight Systems 预先填充的参数。用户可以在启动应用程序和分析所选内核之前修改这些参数中的任何一个。

Nsight Compute launch gui

CUDA GPU 内存分配图表

当从收集 CUDA 跟踪选项集中选择收集 GPU 内存使用情况选项时,Nsight Systems 将跟踪 CUDA GPU 内存分配和释放,并在时间轴中呈现此信息的图表。这与在 Windows 目标上进行卡顿分析期间生成的 GPU 内存图表不同。请参阅 Windows GPU 内存利用率

在下面左侧的报告中,内存在收集期间被分配和释放。在右侧的报告中,内存被分配,但在收集期间未被释放。

CUDA memory allocation graphs where the memory is or is not released during application run

这是另一个示例,其中分配发生在多个 GPU 上。

CUDA memory usage graph on multiple threads

统一内存传输跟踪

对于 Nsight Systems Workstation Edition,当选择 CUDA 跟踪时,统一内存(也称为托管内存)传输跟踪在 Nsight Systems 中自动启用。在不执行任何统一内存传输的程序中,它不会产生开销。数据在时间轴的托管内存区域中显示

UVM trace

HtoD 传输 表示 CUDA 内核访问了驻留在主机上的托管内存,因此内核执行暂停并将数据传输到设备。此处的大量流量将导致 CUDA 内核的性能下降,因此请考虑使用来自固定主机内存的手动 cudaMemcpy 操作来代替。

PtoP 传输 表示 CUDA 内核访问了驻留在不同设备上的托管内存,因此内核执行暂停并将数据传输到此设备。此处的大量流量将导致性能下降,因此请考虑使用手动 cudaMemcpyPeer 操作从其他设备的内存传输来代替。显示这些事件的行是针对目标设备 - 源设备显示在每个传输事件的工具提示中。

DtoH 传输 表示 CPU 访问了驻留在 CUDA 设备上的托管内存,因此 CPU 执行暂停并将数据传输到系统内存。此处的大量流量将导致 CPU 代码的性能下降,因此请考虑使用来自固定主机内存的手动 cudaMemcpy 操作来代替。

一些统一内存传输以红色突出显示,以指示潜在的性能问题

Unified Memory transfer migration cause highlight

具有以下迁移原因的传输将被突出显示

  • 一致性

    发生统一内存迁移以保证数据一致性。SM(流式多处理器)停止,直到迁移完成。

  • 驱逐

    统一内存迁移到 CPU,因为它被驱逐以腾出 GPU 上另一个内存块的空间。这发生在 Linux 上使用计算能力 ≥ 6 的内存过度提交时。

统一内存 CPU 页错误

Nsight Systems 中的统一内存 CPU 页错误功能跟踪当 CPU 代码尝试访问驻留在设备上的内存页时发生的页错误。

注意

在测试中,收集统一内存 CPU 页错误可能会导致高达 70% 的开销。仅在需要时使用此功能。

Unified Memory CPU Page Faults on timeline

统一内存 GPU 页错误

Nsight Systems 中的统一内存 GPU 页错误功能跟踪当 GPU 代码尝试访问驻留在主机上的内存页时发生的页错误。

注意

在测试中,收集统一内存 GPU 页错误可能会导致高达 70% 的开销。仅在需要时使用此功能。

Unified Memory GPU Page Faults on timeline

CUDA 图形跟踪

Nsight Systems 能够以图形或节点粒度捕获应用程序中关于 CUDA 图形的信息。这可以在 CLI 中使用 --cuda-graph-trace 选项设置,或者在 GUI 中通过设置相应的下拉列表设置。

Configure CUDA graph trace

当 CUDA 图形跟踪设置为 graph 时,用户在时间轴上将每个图形视为一个项目

CUDA Graph trace at the graph level

当 CUDA 图形跟踪设置为 node 时,用户在时间轴上将每个图形视为一组节点

CUDA Graph trace at the node level

以图形级别而不是跟踪底层节点来跟踪 CUDA 图形可以显著减少开销。此选项仅在 CUDA 驱动程序 515.43 或更高版本中可用。

CUDA Python 回溯

对于 Arm 服务器 (SBSA) 平台和 x86 Linux 目标的 Nsight Systems,当捕获 CUDA 回溯时,能够捕获 Python 回溯信息。

要从 Nsight Systems 启用 CUDA Python 回溯

CLI — 设置 --python-backtrace=cuda

GUI — 选择为选定的 API 调用收集 Python 回溯复选框。

Configure CUDA Python Backtrace

示例屏幕截图

CUDA Python Backtrace

CLI 的 CUDA 默认函数列表

CUDA 运行时 API

cudaBindSurfaceToArray
cudaBindTexture
cudaBindTexture2D
cudaBindTextureToArray
cudaBindTextureToMipmappedArray
cudaConfigureCall
cudaCreateSurfaceObject
cudaCreateTextureObject
cudaD3D10MapResources
cudaD3D10RegisterResource
cudaD3D10UnmapResources
cudaD3D10UnregisterResource
cudaD3D9MapResources
cudaD3D9MapVertexBuffer
cudaD3D9RegisterResource
cudaD3D9RegisterVertexBuffer
cudaD3D9UnmapResources
cudaD3D9UnmapVertexBuffer
cudaD3D9UnregisterResource
cudaD3D9UnregisterVertexBuffer
cudaDestroySurfaceObject
cudaDestroyTextureObject
cudaDeviceReset
cudaDeviceSynchronize
cudaEGLStreamConsumerAcquireFrame
cudaEGLStreamConsumerConnect
cudaEGLStreamConsumerConnectWithFlags
cudaEGLStreamConsumerDisconnect
cudaEGLStreamConsumerReleaseFrame
cudaEGLStreamConsumerReleaseFrame
cudaEGLStreamProducerConnect
cudaEGLStreamProducerDisconnect
cudaEGLStreamProducerReturnFrame
cudaEventCreate
cudaEventCreateFromEGLSync
cudaEventCreateWithFlags
cudaEventDestroy
cudaEventQuery
cudaEventRecord
cudaEventRecord_ptsz
cudaEventSynchronize
cudaFree
cudaFreeArray
cudaFreeHost
cudaFreeMipmappedArray
cudaGLMapBufferObject
cudaGLMapBufferObjectAsync
cudaGLRegisterBufferObject
cudaGLUnmapBufferObject
cudaGLUnmapBufferObjectAsync
cudaGLUnregisterBufferObject
cudaGraphicsD3D10RegisterResource
cudaGraphicsD3D11RegisterResource
cudaGraphicsD3D9RegisterResource
cudaGraphicsEGLRegisterImage
cudaGraphicsGLRegisterBuffer
cudaGraphicsGLRegisterImage
cudaGraphicsMapResources
cudaGraphicsUnmapResources
cudaGraphicsUnregisterResource
cudaGraphicsVDPAURegisterOutputSurface
cudaGraphicsVDPAURegisterVideoSurface
cudaHostAlloc
cudaHostRegister
cudaHostUnregister
cudaLaunch
cudaLaunchCooperativeKernel
cudaLaunchCooperativeKernelMultiDevice
cudaLaunchCooperativeKernel_ptsz
cudaLaunchKernel
cudaLaunchKernel_ptsz
cudaLaunch_ptsz
cudaMalloc
cudaMalloc3D
cudaMalloc3DArray
cudaMallocArray
cudaMallocHost
cudaMallocManaged
cudaMallocMipmappedArray
cudaMallocPitch
cudaMemGetInfo
cudaMemPrefetchAsync
cudaMemPrefetchAsync_ptsz
cudaMemcpy
cudaMemcpy2D
cudaMemcpy2DArrayToArray
cudaMemcpy2DArrayToArray_ptds
cudaMemcpy2DAsync
cudaMemcpy2DAsync_ptsz
cudaMemcpy2DFromArray
cudaMemcpy2DFromArrayAsync
cudaMemcpy2DFromArrayAsync_ptsz
cudaMemcpy2DFromArray_ptds
cudaMemcpy2DToArray
cudaMemcpy2DToArrayAsync
cudaMemcpy2DToArrayAsync_ptsz
cudaMemcpy2DToArray_ptds
cudaMemcpy2D_ptds
cudaMemcpy3D
cudaMemcpy3DAsync
cudaMemcpy3DAsync_ptsz
cudaMemcpy3DPeer
cudaMemcpy3DPeerAsync
cudaMemcpy3DPeerAsync_ptsz
cudaMemcpy3DPeer_ptds
cudaMemcpy3D_ptds
cudaMemcpyArrayToArray
cudaMemcpyArrayToArray_ptds
cudaMemcpyAsync
cudaMemcpyAsync_ptsz
cudaMemcpyFromArray
cudaMemcpyFromArrayAsync
cudaMemcpyFromArrayAsync_ptsz
cudaMemcpyFromArray_ptds
cudaMemcpyFromSymbol
cudaMemcpyFromSymbolAsync
cudaMemcpyFromSymbolAsync_ptsz
cudaMemcpyFromSymbol_ptds
cudaMemcpyPeer
cudaMemcpyPeerAsync
cudaMemcpyToArray
cudaMemcpyToArrayAsync
cudaMemcpyToArrayAsync_ptsz
cudaMemcpyToArray_ptds
cudaMemcpyToSymbol
cudaMemcpyToSymbolAsync
cudaMemcpyToSymbolAsync_ptsz
cudaMemcpyToSymbol_ptds
cudaMemcpy_ptds
cudaMemset
cudaMemset2D
cudaMemset2DAsync
cudaMemset2DAsync_ptsz
cudaMemset2D_ptds
cudaMemset3D
cudaMemset3DAsync
cudaMemset3DAsync_ptsz
cudaMemset3D_ptds
cudaMemsetAsync
cudaMemsetAsync_ptsz
cudaMemset_ptds
cudaPeerRegister
cudaPeerUnregister
cudaStreamAddCallback
cudaStreamAddCallback_ptsz
cudaStreamAttachMemAsync
cudaStreamAttachMemAsync_ptsz
cudaStreamCreate
cudaStreamCreateWithFlags
cudaStreamCreateWithPriority
cudaStreamDestroy
cudaStreamQuery
cudaStreamQuery_ptsz
cudaStreamSynchronize
cudaStreamSynchronize_ptsz
cudaStreamWaitEvent
cudaStreamWaitEvent_ptsz
cudaThreadSynchronize
cudaUnbindTexture

CUDA 主要 API

cu64Array3DCreate
cu64ArrayCreate
cu64D3D9MapVertexBuffer
cu64GLMapBufferObject
cu64GLMapBufferObjectAsync
cu64MemAlloc
cu64MemAllocPitch
cu64MemFree
cu64MemGetInfo
cu64MemHostAlloc
cu64Memcpy2D
cu64Memcpy2DAsync
cu64Memcpy2DUnaligned
cu64Memcpy3D
cu64Memcpy3DAsync
cu64MemcpyAtoD
cu64MemcpyDtoA
cu64MemcpyDtoD
cu64MemcpyDtoDAsync
cu64MemcpyDtoH
cu64MemcpyDtoHAsync
cu64MemcpyHtoD
cu64MemcpyHtoDAsync
cu64MemsetD16
cu64MemsetD16Async
cu64MemsetD2D16
cu64MemsetD2D16Async
cu64MemsetD2D32
cu64MemsetD2D32Async
cu64MemsetD2D8
cu64MemsetD2D8Async
cu64MemsetD32
cu64MemsetD32Async
cu64MemsetD8
cu64MemsetD8Async
cuArray3DCreate
cuArray3DCreate_v2
cuArrayCreate
cuArrayCreate_v2
cuArrayDestroy
cuBinaryFree
cuCompilePtx
cuCtxCreate
cuCtxCreate_v2
cuCtxDestroy
cuCtxDestroy_v2
cuCtxSynchronize
cuD3D10CtxCreate
cuD3D10CtxCreateOnDevice
cuD3D10CtxCreate_v2
cuD3D10MapResources
cuD3D10RegisterResource
cuD3D10UnmapResources
cuD3D10UnregisterResource
cuD3D11CtxCreate
cuD3D11CtxCreateOnDevice
cuD3D11CtxCreate_v2
cuD3D9CtxCreate
cuD3D9CtxCreateOnDevice
cuD3D9CtxCreate_v2
cuD3D9MapResources
cuD3D9MapVertexBuffer
cuD3D9MapVertexBuffer_v2
cuD3D9RegisterResource
cuD3D9RegisterVertexBuffer
cuD3D9UnmapResources
cuD3D9UnmapVertexBuffer
cuD3D9UnregisterResource
cuD3D9UnregisterVertexBuffer
cuEGLStreamConsumerAcquireFrame
cuEGLStreamConsumerConnect
cuEGLStreamConsumerConnectWithFlags
cuEGLStreamConsumerDisconnect
cuEGLStreamConsumerReleaseFrame
cuEGLStreamProducerConnect
cuEGLStreamProducerDisconnect
cuEGLStreamProducerPresentFrame
cuEGLStreamProducerReturnFrame
cuEventCreate
cuEventCreateFromEGLSync
cuEventCreateFromNVNSync
cuEventDestroy
cuEventDestroy_v2
cuEventQuery
cuEventRecord
cuEventRecord_ptsz
cuEventSynchronize
cuGLCtxCreate
cuGLCtxCreate_v2
cuGLInit
cuGLMapBufferObject
cuGLMapBufferObjectAsync
cuGLMapBufferObjectAsync_v2
cuGLMapBufferObjectAsync_v2_ptsz
cuGLMapBufferObject_v2
cuGLMapBufferObject_v2_ptds
cuGLRegisterBufferObject
cuGLUnmapBufferObject
cuGLUnmapBufferObjectAsync
cuGLUnregisterBufferObject
cuGraphicsD3D10RegisterResource
cuGraphicsD3D11RegisterResource
cuGraphicsD3D9RegisterResource
cuGraphicsEGLRegisterImage
cuGraphicsGLRegisterBuffer
cuGraphicsGLRegisterImage
cuGraphicsMapResources
cuGraphicsMapResources_ptsz
cuGraphicsUnmapResources
cuGraphicsUnmapResources_ptsz
cuGraphicsUnregisterResource
cuGraphicsVDPAURegisterOutputSurface
cuGraphicsVDPAURegisterVideoSurface
cuInit
cuLaunch
cuLaunchCooperativeKernel
cuLaunchCooperativeKernelMultiDevice
cuLaunchCooperativeKernel_ptsz
cuLaunchGrid
cuLaunchGridAsync
cuLaunchKernel
cuLaunchKernel_ptsz
cuLinkComplete
cuLinkCreate
cuLinkCreate_v2
cuLinkDestroy
cuMemAlloc
cuMemAllocHost
cuMemAllocHost_v2
cuMemAllocManaged
cuMemAllocPitch
cuMemAllocPitch_v2
cuMemAlloc_v2
cuMemFree
cuMemFreeHost
cuMemFree_v2
cuMemGetInfo
cuMemGetInfo_v2
cuMemHostAlloc
cuMemHostAlloc_v2
cuMemHostRegister
cuMemHostRegister_v2
cuMemHostUnregister
cuMemPeerRegister
cuMemPeerUnregister
cuMemPrefetchAsync
cuMemPrefetchAsync_ptsz
cuMemcpy
cuMemcpy2D
cuMemcpy2DAsync
cuMemcpy2DAsync_v2
cuMemcpy2DAsync_v2_ptsz
cuMemcpy2DUnaligned
cuMemcpy2DUnaligned_v2
cuMemcpy2DUnaligned_v2_ptds
cuMemcpy2D_v2
cuMemcpy2D_v2_ptds
cuMemcpy3D
cuMemcpy3DAsync
cuMemcpy3DAsync_v2
cuMemcpy3DAsync_v2_ptsz
cuMemcpy3DPeer
cuMemcpy3DPeerAsync
cuMemcpy3DPeerAsync_ptsz
cuMemcpy3DPeer_ptds
cuMemcpy3D_v2
cuMemcpy3D_v2_ptds
cuMemcpyAsync
cuMemcpyAsync_ptsz
cuMemcpyAtoA
cuMemcpyAtoA_v2
cuMemcpyAtoA_v2_ptds
cuMemcpyAtoD
cuMemcpyAtoD_v2
cuMemcpyAtoD_v2_ptds
cuMemcpyAtoH
cuMemcpyAtoHAsync
cuMemcpyAtoHAsync_v2
cuMemcpyAtoHAsync_v2_ptsz
cuMemcpyAtoH_v2
cuMemcpyAtoH_v2_ptds
cuMemcpyDtoA
cuMemcpyDtoA_v2
cuMemcpyDtoA_v2_ptds
cuMemcpyDtoD
cuMemcpyDtoDAsync
cuMemcpyDtoDAsync_v2
cuMemcpyDtoDAsync_v2_ptsz
cuMemcpyDtoD_v2
cuMemcpyDtoD_v2_ptds
cuMemcpyDtoH
cuMemcpyDtoHAsync
cuMemcpyDtoHAsync_v2
cuMemcpyDtoHAsync_v2_ptsz
cuMemcpyDtoH_v2
cuMemcpyDtoH_v2_ptds
cuMemcpyHtoA
cuMemcpyHtoAAsync
cuMemcpyHtoAAsync_v2
cuMemcpyHtoAAsync_v2_ptsz
cuMemcpyHtoA_v2
cuMemcpyHtoA_v2_ptds
cuMemcpyHtoD
cuMemcpyHtoDAsync
cuMemcpyHtoDAsync_v2
cuMemcpyHtoDAsync_v2_ptsz
cuMemcpyHtoD_v2
cuMemcpyHtoD_v2_ptds
cuMemcpyPeer
cuMemcpyPeerAsync
cuMemcpyPeerAsync_ptsz
cuMemcpyPeer_ptds
cuMemcpy_ptds
cuMemcpy_v2
cuMemsetD16
cuMemsetD16Async
cuMemsetD16Async_ptsz
cuMemsetD16_v2
cuMemsetD16_v2_ptds
cuMemsetD2D16
cuMemsetD2D16Async
cuMemsetD2D16Async_ptsz
cuMemsetD2D16_v2
cuMemsetD2D16_v2_ptds
cuMemsetD2D32
cuMemsetD2D32Async
cuMemsetD2D32Async_ptsz
cuMemsetD2D32_v2
cuMemsetD2D32_v2_ptds
cuMemsetD2D8
cuMemsetD2D8Async
cuMemsetD2D8Async_ptsz
cuMemsetD2D8_v2
cuMemsetD2D8_v2_ptds
cuMemsetD32
cuMemsetD32Async
cuMemsetD32Async_ptsz
cuMemsetD32_v2
cuMemsetD32_v2_ptds
cuMemsetD8
cuMemsetD8Async
cuMemsetD8Async_ptsz
cuMemsetD8_v2
cuMemsetD8_v2_ptds
cuMipmappedArrayCreate
cuMipmappedArrayDestroy
cuModuleLoad
cuModuleLoadData
cuModuleLoadDataEx
cuModuleLoadFatBinary
cuModuleUnload
cuStreamAddCallback
cuStreamAddCallback_ptsz
cuStreamAttachMemAsync
cuStreamAttachMemAsync_ptsz
cuStreamBatchMemOp
cuStreamBatchMemOp_ptsz
cuStreamCreate
cuStreamCreateWithPriority
cuStreamDestroy
cuStreamDestroy_v2
cuStreamSynchronize
cuStreamSynchronize_ptsz
cuStreamWaitEvent
cuStreamWaitEvent_ptsz
cuStreamWaitValue32
cuStreamWaitValue32_ptsz
cuStreamWaitValue64
cuStreamWaitValue64_ptsz
cuStreamWriteValue32
cuStreamWriteValue32_ptsz
cuStreamWriteValue64
cuStreamWriteValue64_ptsz
cuSurfObjectCreate
cuSurfObjectDestroy
cuSurfRefCreate
cuSurfRefDestroy
cuTexObjectCreate
cuTexObjectDestroy
cuTexRefCreate
cuTexRefDestroy
cuVDPAUCtxCreate
cuVDPAUCtxCreate_v2

X86 CLI 的 cuDNN 函数列表

cuDNN API 函数

cudnnActivationBackward
cudnnActivationBackward_v3
cudnnActivationBackward_v4
cudnnActivationForward
cudnnActivationForward_v3
cudnnActivationForward_v4
cudnnAddTensor
cudnnBatchNormalizationBackward
cudnnBatchNormalizationBackwardEx
cudnnBatchNormalizationForwardInference
cudnnBatchNormalizationForwardTraining
cudnnBatchNormalizationForwardTrainingEx
cudnnCTCLoss
cudnnConvolutionBackwardBias
cudnnConvolutionBackwardData
cudnnConvolutionBackwardFilter
cudnnConvolutionBiasActivationForward
cudnnConvolutionForward
cudnnCreate
cudnnCreateAlgorithmPerformance
cudnnDestroy
cudnnDestroyAlgorithmPerformance
cudnnDestroyPersistentRNNPlan
cudnnDivisiveNormalizationBackward
cudnnDivisiveNormalizationForward
cudnnDropoutBackward
cudnnDropoutForward
cudnnDropoutGetReserveSpaceSize
cudnnDropoutGetStatesSize
cudnnFindConvolutionBackwardDataAlgorithm
cudnnFindConvolutionBackwardDataAlgorithmEx
cudnnFindConvolutionBackwardFilterAlgorithm
cudnnFindConvolutionBackwardFilterAlgorithmEx
cudnnFindConvolutionForwardAlgorithm
cudnnFindConvolutionForwardAlgorithmEx
cudnnFindRNNBackwardDataAlgorithmEx
cudnnFindRNNBackwardWeightsAlgorithmEx
cudnnFindRNNForwardInferenceAlgorithmEx
cudnnFindRNNForwardTrainingAlgorithmEx
cudnnFusedOpsExecute
cudnnIm2Col
cudnnLRNCrossChannelBackward
cudnnLRNCrossChannelForward
cudnnMakeFusedOpsPlan
cudnnMultiHeadAttnBackwardData
cudnnMultiHeadAttnBackwardWeights
cudnnMultiHeadAttnForward
cudnnOpTensor
cudnnPoolingBackward
cudnnPoolingForward
cudnnRNNBackwardData
cudnnRNNBackwardDataEx
cudnnRNNBackwardWeights
cudnnRNNBackwardWeightsEx
cudnnRNNForwardInference
cudnnRNNForwardInferenceEx
cudnnRNNForwardTraining
cudnnRNNForwardTrainingEx
cudnnReduceTensor
cudnnReorderFilterAndBias
cudnnRestoreAlgorithm
cudnnRestoreDropoutDescriptor
cudnnSaveAlgorithm
cudnnScaleTensor
cudnnSoftmaxBackward
cudnnSoftmaxForward
cudnnSpatialTfGridGeneratorBackward
cudnnSpatialTfGridGeneratorForward
cudnnSpatialTfSamplerBackward
cudnnSpatialTfSamplerForward
cudnnTransformFilter
cudnnTransformTensor
cudnnTransformTensorEx

OpenACC 跟踪

适用于 Linux x86_64 的 Nsight Systems 能够捕获分析进程中关于 OpenACC 执行的信息。

当使用 PGI 运行时版本 15.7 或更高版本时,支持 OpenACC 版本 2.0、2.5 和 2.6。为了区分构造(请参阅下面的工具提示),需要 PGI 运行时 16.0 或更高版本。请注意,Nsight Systems 目前不支持 GCC 实现的 OpenACC。

在时间轴树的 CPU 行下,每个使用 OpenACC 的线程都将显示 OpenACC 跟踪信息。您可以单击 OpenACC API 调用以查看与底层 CUDA API 调用的关联性(以青色突出显示)

OpenACC rows

如果 OpenACC API 导致 GPU 工作,也会突出显示

OpenACC rows

将鼠标悬停在特定的 OpenACC 构造上将弹出一个工具提示,其中包含有关该构造的详细信息

OpenACC construct tooltip

要从 Nsight Systems GUI 捕获 OpenACC 信息,请选中收集 CUDA 跟踪配置下的收集 OpenACC 跟踪复选框。请注意,启用 OpenACC 跟踪也将启用 CUDA 跟踪。

Configure CUDA trace

注意

如果您的应用程序在所有收集的 OpenACC 跟踪数据复制出来之前崩溃,则部分或全部数据可能会丢失且不会出现在报告中。

OpenGL 跟踪

可以跟踪 OpenGL 和 OpenGL ES API,以协助分析 CPU 和 GPU 交互。

一些使用示例包括

  1. 可视化 eglSwapBuffers(或类似函数)耗时多久。

  2. API 跟踪可以轻松显示线程状态和图形驱动程序行为之间的关联性,从而揭示 CPU 可能在等待 GPU 的位置。

  3. 发现 GPU 上的机会气泡,可以在其中创建更多 GPU 工作负载。

  4. 使用 KHR_debug 扩展在 CPU 和 GPU 上跟踪 GL 事件。

Nsight Systems 中的 OpenGL 跟踪功能包括两种不同的活动,这些活动将显示在这些线程的 CPU 行中

  • CPU 跟踪:拦截应用程序对 API(例如 OpenGL、OpenGL ES、EGL、GLX、WGL 等)的 API 调用。

  • GPU 跟踪(或工作负载跟踪):跟踪由使用 OpenGL 或 OpenGL ES 触发的 GPU 工作负载(活动)。由于绘制调用是背靠背执行的,因此 GPU 工作负载跟踪范围包括许多 OpenGL 绘制调用和操作,以优化性能开销,而不是跟踪每个单独的操作。

为了收集 GPU 跟踪,使用 glQueryCounter() 函数来测量成批 GPU 工作负载完成所需的时间。

Configure OpenGL trace
Configure OpenGL functions

KHR_debug 调用定义的范围类似于 OpenGL API 和 OpenGL GPU 工作负载跟踪。在这种情况下,GPU 范围表示增量绘制成本。它们不能完全解释可以并行执行多个绘制调用的 GPU。在这种情况下,Nsight Systems 将不会显示重叠的 GPU 范围。

使用命令行进行 OpenGL 跟踪

有关使用目标 CLI 的一般信息,请参阅 Linux 上的 CLI 性能分析。对于 CLI,跟踪的函数设置为以下列表

glWaitSync
glReadPixels
glReadnPixelsKHR
glReadnPixelsEXT
glReadnPixelsARB
glReadnPixels
glFlush
glFinishFenceNV
glFinish
glClientWaitSync
glClearTexSubImage
glClearTexImage
glClearStencil
glClearNamedFramebufferuiv
glClearNamedFramebufferiv
glClearNamedFramebufferfv
glClearNamedFramebufferfi
glClearNamedBufferSubDataEXT
glClearNamedBufferSubData
glClearNamedBufferDataEXT
glClearNamedBufferData
glClearIndex
glClearDepthx
glClearDepthf
glClearDepthdNV
glClearDepth
glClearColorx
glClearColorIuiEXT
glClearColorIiEXT
glClearColor
glClearBufferuiv
glClearBufferSubData
glClearBufferiv
glClearBufferfv
glClearBufferfi
glClearBufferData
glClearAccum
glClear
glDispatchComputeIndirect
glDispatchComputeGroupSizeARB
glDispatchCompute
glComputeStreamNV
glNamedFramebufferDrawBuffers
glNamedFramebufferDrawBuffer
glMultiDrawElementsIndirectEXT
glMultiDrawElementsIndirectCountARB
glMultiDrawElementsIndirectBindlessNV
glMultiDrawElementsIndirectBindlessCountNV
glMultiDrawElementsIndirectAMD
glMultiDrawElementsIndirect
glMultiDrawElementsEXT
glMultiDrawElementsBaseVertex
glMultiDrawElements
glMultiDrawArraysIndirectEXT
glMultiDrawArraysIndirectCountARB
glMultiDrawArraysIndirectBindlessNV
glMultiDrawArraysIndirectBindlessCountNV
glMultiDrawArraysIndirectAMD
glMultiDrawArraysIndirect
glMultiDrawArraysEXT
glMultiDrawArrays
glListDrawCommandsStatesClientNV
glFramebufferDrawBuffersEXT
glFramebufferDrawBufferEXT
glDrawTransformFeedbackStreamInstanced
glDrawTransformFeedbackStream
glDrawTransformFeedbackNV
glDrawTransformFeedbackInstancedEXT
glDrawTransformFeedbackInstanced
glDrawTransformFeedbackEXT
glDrawTransformFeedback
glDrawTexxvOES
glDrawTexxOES
glDrawTextureNV
glDrawTexsvOES
glDrawTexsOES
glDrawTexivOES
glDrawTexiOES
glDrawTexfvOES
glDrawTexfOES
glDrawRangeElementsEXT
glDrawRangeElementsBaseVertexOES
glDrawRangeElementsBaseVertexEXT
glDrawRangeElementsBaseVertex
glDrawRangeElements
glDrawPixels
glDrawElementsInstancedNV
glDrawElementsInstancedEXT
glDrawElementsInstancedBaseVertexOES
glDrawElementsInstancedBaseVertexEXT
glDrawElementsInstancedBaseVertexBaseInstanceEXT
glDrawElementsInstancedBaseVertexBaseInstance
glDrawElementsInstancedBaseVertex
glDrawElementsInstancedBaseInstanceEXT
glDrawElementsInstancedBaseInstance
glDrawElementsInstancedARB
glDrawElementsInstanced
glDrawElementsIndirect
glDrawElementsBaseVertexOES
glDrawElementsBaseVertexEXT
glDrawElementsBaseVertex
glDrawElements
glDrawCommandsStatesNV
glDrawCommandsStatesAddressNV
glDrawCommandsNV
glDrawCommandsAddressNV
glDrawBuffersNV
glDrawBuffersATI
glDrawBuffersARB
glDrawBuffers
glDrawBuffer
glDrawArraysInstancedNV
glDrawArraysInstancedEXT
glDrawArraysInstancedBaseInstanceEXT
glDrawArraysInstancedBaseInstance
glDrawArraysInstancedARB
glDrawArraysInstanced
glDrawArraysIndirect
glDrawArraysEXT
glDrawArrays
eglSwapBuffersWithDamageKHR
eglSwapBuffers
glXSwapBuffers
glXQueryDrawable
glXGetCurrentReadDrawable
glXGetCurrentDrawable
glGetQueryObjectuivEXT
glGetQueryObjectuivARB
glGetQueryObjectuiv
glGetQueryObjectivARB
glGetQueryObjectiv

OpenXR API 跟踪

OpenXR 是一种免版税的开放标准,可为增强现实 (AR) 和虚拟现实 (VR)(统称为 XR)平台和设备提供高性能访问。有关 OpenXR 的信息,请访问 OpenXR 概述

Nsight Systems 可以捕获分析进程中关于 OpenXR 使用情况的信息。这包括捕获 OpenXR API 函数的执行时间、调试标签和帧持续时间。Windows 操作系统支持 OpenXR 性能分析。

OpenXR overview picture

自定义 ETW 跟踪

使用自定义 ETW 跟踪功能来启用和收集任何基于清单的 ETW 日志。收集的事件将显示在时间轴上,每个事件类型都有专用行。

自定义 ETW 在 Windows 目标机器上可用。

Adding details of an ETW provider
Adding an ETW provider to the trace settings
Display of custom ETW trace events on the timeline

要保留捕获的 .etl 跟踪文件,以便可以在其他工具(例如 GPUView)中查看它们,请在 Nsight Systems 全局选项对话框中的性能分析行为下更改 将 ETW 日志文件保存在项目文件夹中 选项。.etl 文件将出现在与 .nsys-rep 文件相同的文件夹中,可以通过右键单击项目资源管理器中的报告并选择在文件夹中显示…来访问。从每个 ETW 提供程序收集的数据将显示在其自己的 .etl 文件中,并且还会创建一个名为 Report XX-Merged-\*.etl 的附加 .etl 文件,其中包含来自所有捕获源的事件。

GPU 硬件性能分析

GPU 上下文切换

Nsight Systems 提供了跟踪 GPU 上下文切换的功能。请注意,这需要驱动程序 r435.17 或更高版本以及 root 权限。

要启用跟踪,请使用 --gpuctxsw 选项从 CLI 运行

具体而言,行为如下

以 root 身份收集 GPU 上下文切换数据时,您将获得来自所有进程的上下文记录。记录具有有效的上下文 ID 和进程 ID,并具有全精度时间戳。

以普通用户身份收集 GPU 上下文切换数据时,您仍然会获得来自所有进程的上下文记录。对于以您的用户身份运行的进程,记录具有有效的上下文 ID 和进程 ID,以及全精度时间戳。对于以不同用户身份运行的进程,记录具有上下文 ID = 0 和进程 ID = 0,以及降低精度的时间戳(但仍保证顺序正确)。

当在使用 vGPU 的虚拟机中收集 GPU 上下文切换数据时,上述规则适用于与您的 VM 相关的记录。不会收集其他 VM 上运行的上下文的记录,因此当 vGPU 切换到另一个 VM 的上下文时,时间轴可能会显示间隙。我们目前不支持在使用 vGPU 的主机系统上收集 GPU 上下文切换数据。

GPU 指标

概述

GPU 指标功能旨在识别在使用 GPU 进行计算和图形的应用程序中的性能限制因素。它使用定期采样来收集与不同 GPU 硬件单元相关的性能指标和详细的计时统计信息,利用专用硬件以最小的开销单次捕获此数据。

注意

GPU 指标将为您提供精确的设备级别信息,但它不知道涉及哪个进程或上下文。GPU 上下文切换跟踪提供的信息精度较低,但会为您提供进程和上下文信息。

Example report with GPU Metrics

这些指标提供了关于计算、图形和输入/输出 (IO) 活动中 GPU 效率随时间变化的概述,例如

  • IO 吞吐量: PCIe、NVLink 和 GPU 内存带宽

  • SM 利用率: SM 活动、张量核心活动、指令发布、warp 占用率和未分配的 warp 插槽

它旨在帮助用户回答常见问题

  • 我的 GPU 是否空闲?

  • 我的 GPU 是否已满载?内核网格大小和流是否足够?我的 SM 和 warp 插槽是否已满?

  • 我是否正在使用 Tensor Core?

  • 我的指令速率是否高?

  • 我是否可能受 IO 或 warp 数量等限制?

Nsight Systems GPU 指标仅适用于 Linux x86-64 和 aarch64 目标,以及 Windows 目标。它需要 NVIDIA Turing 架构或更新版本。

最低要求的驱动程序版本

  • NVIDIA Turing 架构 TU10x、TU11x - r440

  • NVIDIA Ampere 架构 GA100 - r450

  • NVIDIA Ampere 架构 GA100 MIG - r470 TRD1

  • NVIDIA Ampere 架构 GA10x - r455

注意

权限: 需要提升的权限。在 Linux 上使用 sudo 来提升权限。在 Windows 上,用户必须从管理员命令提示符运行或接受 UAC 提升对话框。有关更多信息,请参阅 权限问题和性能计数器

注意

Tensor Core: 如果您运行 nsys profile --gpu-metrics-devices all,则可以在 GUI 中SM 指令/Tensor Active 行下找到 Tensor Core 利用率。

请注意,期望 CUDA 内核达到 100% Tensor Core 利用率是不现实的,因为还存在其他开销。一般来说,操作的计算密集度越高,CUDA 内核可以达到的 Tensor Core 利用率就越高。

从 CLI 启动 GPU 指标

GPU 指标功能由 3 个 CLI 开关控制

  • --gpu-metrics-devices=[all, cuda-visible, none, <index>] 选择要采样的 GPU(默认为 none)。

  • --gpu-metrics-set=[<alias>, file:<file name>] 选择要使用的指标集(默认为列表中第一个合适的)。

  • --gpu-metrics-frequency=[10..200000] 选择采样频率(以 Hz 为单位)(默认为 10000)。

要使用默认选项并在 GPU 1 上采样 GPU 指标

# Must have elevated permissions (see https://developer.nvidia.com/ERR_NVGPUCTRPERM) or be root (Linux) or Administrator (Windows)
$ nsys profile --gpu-metrics-devices=1 ./my-app

要列出可用的 GPU,请使用

$ nsys profile --gpu-metrics-devices=help
Possible --gpu-metrics-devices values are:
    1: Turing TU104 | GeForce RTX 2070 SUPER PCI[0000:65:00.0]
    all: Select all supported GPUs
    cuda-visible: Select GPUs that match CUDA_VISIBLE_DEVICES
    none: Disable GPU Metrics [Default]
Some GPUs are not supported:
    0: Volta GV100 | Quadro GV100 PCI[0000:17:00.0]
See the user guide: https://docs.nvda.net.cn/nsight-systems/UserGuide/index.html#gpu-metrics

默认情况下,使用支持所有选定 GPU 的第一个指标集。您可以从列表中手动选择另一个指标集。要查看可用于所选 GPU 的指标集,请使用

$ nsys profile --gpu-metrics-devices=all --gpu-metrics-set=help
Possible --gpu-metrics-set values are:
    tu10x        : General Metrics for NVIDIA TU10x (any frequency)
    tu10x-gfxt   : Graphics Throughput Metrics for NVIDIA TU10x (frequency >= 10kHz)
    file:<file name> : use metric set from a given file

默认情况下,采样频率设置为 10 kHz。但是,您可以使用以下命令手动将其设置为 10 Hz 到 200 kHz

--gpu-metrics-frequency=<value>

从 GUI 启动 GPU 指标

有关从 CLI 启动 GPU 指标的命令以及示例,请参阅 从 CLI 进行性能分析

在 Nsight Systems 中启动分析时,选择收集 GPU 指标

GPU Metrics: GUI overview

选择 GPU 下拉列表以选择您希望采样的 GPU。

选择 指标集: 下拉列表以选择您要采样的可用指标集。

GPU Metrics: Metric sets

注意

未被采样的 GPU 的指标集将灰显。

采样频率

可以从 10 Hz - 200 kHz 的范围内选择采样频率。默认值为 10 kHz。

没有缓冲区溢出事件的最大采样频率取决于 GPU(SM 计数)、GPU 负载强度和整体系统负载。芯片越大,负载越高,最大频率越低。如果您需要更高的频率,可以增加频率,直到在诊断摘要报告页面中收到“缓冲区溢出”消息。

每个指标集在其描述中都有建议的采样频率范围。这些范围是近似值。如果您在时间轴上观察到 数据不一致数据丢失 范围,请尝试更接近建议的频率。

可用指标

  • GPC 时钟频率 - gpc__cycles_elapsed.avg.per_second

    平均 GPC 时钟频率,以赫兹为单位。在公共文档中,GPC 时钟可能被称为“应用程序”时钟、“图形”时钟、“基本”时钟或“加速”时钟。

    注意

    GPC 的收集机制可能会导致样本之间出现小幅波动。

  • SYS 时钟频率 - sys__cycles_elapsed.avg.per_second

    平均 SYS 时钟频率,以赫兹为单位。GPU 前端(命令处理器)、复制引擎和性能监视器在 SYS 时钟下运行。在 Turing 和 NVIDIA GA100 GPU 上,采样频率基于 SYS 时钟周期(而不是时间),因此每秒样本数将随 SYS 时钟而变化。在 NVIDIA GA10x GPU 上,采样频率基于固定频率时钟。最大频率与 SYS 时钟线性缩放。

  • GR 活动 - gr__cycles_active.sum.pct_of_peak_sustained_elapsed

    图形/计算引擎处于活动状态的周期百分比。如果图形管道中有任何工作,或者计算管道正在处理工作,则图形/计算引擎处于活动状态。

    GA100 MIG - 尚不支持 MIG。此计数器将报告主 GR 引擎的活动。

  • 同步计算进行中 - gr__dispatch_cycles_active_queue_sync.avg.pct_of_peak_sustained_elapsed

    同步计算进行中的周期百分比。

    CUDA:在配置了 64 个子上下文的 MPS 的情况下,CUDA 将仅报告同步队列。同步是指在 VEID=0 中提交的工作。

    图形:如果有任何从直接队列提交的计算工作正在进行中,则为真。

  • 异步计算进行中 - gr__dispatch_cycles_active_queue_async.avg.pct_of_peak_sustained_elapsed

    异步计算进行中的周期百分比。

    CUDA:CUDA 将仅报告所有计算工作为异步。一个例外是如果配置了 MPS 并且使用了所有 64 个子上下文。1 个子上下文 (VEID=0) 将报告为同步。

    图形:如果有任何从计算队列提交的计算工作正在进行中,则为真。

  • 绘制开始 - fe__draw_count.avg.pct_of_peak_sustained_elapsed

    发布到图形管道的绘制调用与图形管道的最大持续速率之比。

    注意

    该百分比将始终非常低,因为前端可以发布绘制调用的速度远快于管道执行绘制调用的速度。此行的呈现方式将更改,以帮助指示何时正在发布绘制调用。

  • 调度开始 - gr__dispatch_count.avg.pct_of_peak_sustained_elapsed

    计算网格启动(调度)到计算管道的比率与计算管道的最大持续速率之比。

    注意

    该百分比将始终非常低,因为前端可以发布网格启动的速度远快于管道执行绘制调用的速度。此行的呈现方式将更改,以帮助指示何时正在发布网格启动。

  • 顶点/细分/几何 Warp 进行中 - tpc__warps_active_shader_vtg_realtime.avg.pct_of_peak_sustained_elapsed

    驻留在 SM 上的活动顶点、几何、细分和网格着色器 warp 与每个 SM 的最大 warp 数之比,以百分比表示。

  • 像素 Warp 进行中 - tpc__warps_active_shader_ps_realtime.avg.pct_of_peak_sustained_elapsed

    驻留在 SM 上的活动像素/片段着色器 warp 与每个 SM 的最大 warp 数之比,以百分比表示。

  • 计算 Warp 进行中 - tpc__warps_active_shader_cs_realtime.avg.pct_of_peak_sustained_elapsed

    驻留在 SM 上的活动计算着色器 warp 与每个 SM 的最大 warp 数之比,以百分比表示。

  • 活动 SM 未使用 Warp 插槽 - tpc__warps_inactive_sm_active_realtime.avg.pct_of_peak_sustained_elapsed

    SM 上未使用的 warp 插槽与每个 SM 的最大 warp 数之比,以百分比表示。这表明如果占用率不受资源(例如着色器类型的最大 warp 数、共享内存、每个线程的寄存器或每个 SM 的线程块)的限制,则 SM 上可以容纳多少 warp。

  • 空闲 SM 未使用 Warp 插槽 - tpc__warps_inactive_sm_idle_realtime.avg.pct_of_peak_sustained_elapsed

    由于空闲 SM 导致的未使用 warp 插槽与每个 SM 的最大 warp 数之比,以百分比表示。

    这表明 SM 上的当前工作负载不足以将工作负载放置在所有 SM 上。这可能是由于

    • CPU 使 GPU 处于饥饿状态。

    • 当前工作太小而无法使 GPU 饱和。

    • 当前工作正在衰减,但阻止了下一项工作。

  • SM 活动 - sm__cycles_active.avg.pct_of_peak_sustained_elapsed

    SM 在飞行中(在 SM 上分配)至少有 1 个 warp 的周期与周期数的比率,以百分比表示。值为 0 表示所有 SM 都处于空闲状态(没有 warp 在飞行中)。值为 50% 可能表示所有 SM 在采样周期的 50% 时间内处于活动状态,或者 50% 的 SM 在采样周期的 100% 时间内处于活动状态之间的某种梯度。

  • SM 指令发布 - sm__inst_executed_realtime.avg.pct_of_peak_sustained_elapsed

    SM 子分区(warp 调度程序)发布指令的周期与采样周期中周期数的比率,以百分比表示。

  • Tensor Active - sm__pipe_tensor_cycles_active_realtime.avg.pct_of_peak_sustained_elapsed

    SM 张量管道处于活动状态发布张量指令的周期与采样周期中周期数的比率,以百分比表示。

    TU102/4/6:此指标在 TU10x 上不可用于定期采样。请参阅 Tensor Active/FP16 Active。

  • Tensor Active / FP16 Active - sm__pipe_shared_cycles_active_realtime.avg.pct_of_peak_sustained_elapsed

    仅限 TU102/4/6。

    SM 张量管道或 FP16x2 管道处于活动状态发布张量指令的周期与采样周期中周期数的比率,以百分比表示。

  • DRAM 读取带宽 - dramc__read_throughput.avg.pct_of_peak_sustained_elapsed, dram__read_throughput.avg.pct_of_peak_sustained_elapsed

  • VRAM 读取带宽 - FBPA.TriageA.dramc__read_throughput.avg.pct_of_peak_sustained_elapsed, FBSP.TriageSCG.dramc__read_throughput.avg.pct_of_peak_sustained_elapsed, FBSP.TriageAC.dramc__read_throughput.avg.pct_of_peak_sustained_elapsed

    DRAM 接口在读取数据时处于活动状态的周期数与同一时间段内经过的周期数之比,以百分比表示。

  • DRAM 写入带宽 - dramc__write_throughput.avg.pct_of_peak_sustained_elapsed, dram__write_throughput.avg.pct_of_peak_sustained_elapsed

  • VRAM 写入带宽 - FBPA.TriageA.dramc__write_throughput.avg.pct_of_peak_sustained_elapsed, FBSP.TriageSCG.dramc__write_throughput.avg.pct_of_peak_sustained_elapsed, FBSP.TriageAC.dramc__write_throughput.avg.pct_of_peak_sustained_elapsed

    DRAM 接口在写入数据时处于活动状态的周期数与同一时间段内经过的周期数之比,以百分比表示。

  • NVENC 活动

    NVENC.TriageTop.nvenc__cycles_active.avg.pct_of_peak_sustained_elapsed

    NVENC 单元在主动处理命令的周期数与同一采样周期内的周期数之比,以百分比表示。

  • NVENC 读取吞吐量

    NVENC.TriageTop.nvenc__memif2nvenc_read_throughput.avg.pct_of_peak_sustained_elapsed

    NVENC 写入吞吐量

    NVENC.TriageTop.nvenc__nvenc2memif_write_throughput.avg.pct_of_peak_sustained_elapsed

    NVENC 单元在主动处理读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • OFA 活动

    OFA.TriageTop.ofa_cycles_active.avg.pct_of_peak_sustained_elapsed

    OFA (光流加速器) 在主动处理命令的周期数与同一采样周期内的周期数之比,以百分比表示。

  • OFA 读取吞吐量

    OFA.TriageTop.ofa__memif2ofa_read_throughput.avg.pct_of_peak_sustained_elapsed

    OFA 写入吞吐量

    OFA.TriageTop.ofa__ofa2memif_write_throughput.avg.pct_of_peak_sustained_elapsed

    OFA (光流加速器) 在主动处理读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • NVLink 接收字节数 - nvlrx__bytes.avg.pct_of_peak_sustained_elapsed

    NVLink 接口上接收的字节数与采样周期内可接收的最大字节数之比,以百分比表示。此值包含协议开销。

  • NVLink 传输字节数 - nvltx__bytes.avg.pct_of_peak_sustained_elapsed

    NVLink 接口上发送的字节数与采样周期内可发送的最大字节数之比,以百分比表示。此值包含协议开销。

  • PCIe 读取吞吐量 - pcie__read_bytes.avg.pct_of_peak_sustained_elapsed

    PCIe 接口上接收的字节数与采样周期内可接收的最大字节数之比,以百分比表示。理论值是根据 PCIe 代数和通道数计算得出的。此值包含协议开销。

  • PCIe 写入吞吐量 - pcie__write_bytes.avg.pct_of_peak_sustained_elapsed

    PCIe 接口上发送的字节数与采样周期内可接收的最大字节数之比,以百分比表示。理论值是根据 PCIe 代数和通道数计算得出的。此值包含协议开销。

  • PCIe 读取 BAR1 请求 - pcie__rx_requests_aperture_bar1_op_read.sum

  • PCIe 写入 BAR1 请求 - pcie__rx_requests_aperture_bar1_op_write.sum

    BAR1 是一个 PCI Express (PCIe) 接口,用于允许 CPU 或其他设备直接访问 GPU 内存。GPU 通常使用其复制引擎传输内存,这不会显示为 BAR1 活动。CPU 上的 GPU 驱动程序会进行少量 BAR1 访问,但更大量的流量通常来自其他技术。

    在 Linux 上,GPU Direct、GPU Direct RDMA 和 GPU Direct Storage 等技术通过 PCIe BAR1 传输数据。在 GPU Direct RDMA 的情况下,这将是以太网或 InfiniBand 适配器直接写入 GPU 内存。

    在 Windows 上,Direct3D12 资源也可以通过 NVAPI 函数直接供 CPU 访问,以支持从 GPU 缓冲区进行少量写入或读取,在这种情况下,过多的 BAR1 访问可能表示性能问题,正如《使用 CPU 可见 VRAM 优化 DX12 资源上传到 GPU》技术博客文章中所展示的那样。

导出和查询数据

可以使用 Nsight Systems CLI 导出功能访问指标值以进行自动化处理。

提取 SMs Active 值的示例

$ nsys export -t sqlite report.nsys-rep
$ sqlite3 report.sqlite "SELECT timestamp, value FROM GPU_METRICS JOIN TARGET_INFO_GPU_METRICS USING (metricId) WHERE value != 0 and metricName == "SMs Active" LIMIT 10;"

309277039|80
309301295|99
309325583|99
309349776|99
309373872|60
309397872|19
309421840|100
309446000|100
309470096|100
309494161|99

值是整数百分比 (0..100)。

限制

  • 如果使用了带有 NVLink 的指标集,但链接未激活,它们可能会显示为完全利用。

  • 一次只能使用一个订阅这些计数器的工具,因此,Nsight Systems GPU 指标功能不能与以下工具同时使用

    • Nsight Graphics

    • Nsight Compute

    • DCGM (数据中心 GPU 管理器)

      使用以下命令

      • dcgmi profile --pause

      • dcgmi profile --resume

      或 API

      • dcgmProfPause

      • dcgmProfResume

    • 使用以下技术的非 NVIDIA 产品

      • 直接在应用程序中使用的 CUPTI 采样。CUPTI 跟踪是可以的 (虽然它会阻止 Nsight Systems CUDA 跟踪)

      • DCGM 库

  • Nsight Systems 限制了可用于存储 GPU 指标样本的内存量。以更高的采样率或在具有更多 SM 的 GPU 上进行分析有超出此限制的风险。这将导致时间轴上出现填充 Missing Data 范围的间隙。未来的版本将减少这种情况发生的频率。

NVML 功耗和温度指标 (预览)

Nsight Systems 现在可以定期从 GPU 采样功耗和温度指标,并在 GUI 中的时间轴上绘制它们。这些指标由 NVML API 调用 nvmlDeviceGetPowerUsagenvmlDeviceGetTemperature 分别提供。功耗指标以毫瓦 (mW) 为单位提供,温度以摄氏度 (C) 为单位提供。

要启用功耗和温度采样,请将以下选项添加到 nsys profilestart 命令

--enable nvml_metrics[,arg1[=value1],arg2[=value2], ...]

nvml_metrics 插件名称后没有空格。后面跟着逗号分隔的参数列表或参数=值对。带有空格的参数应括在双引号中。

支持的参数是

短名称

长名称

可能的参数

默认值

开关描述

-i

--interval

integer

100

采样间隔,以毫秒为单位

-h

--help

打印帮助消息

使用示例

  • nsys profile --enable nvml_metrics ...

    每 100 毫秒对所有可用 GPU 上的功耗和温度进行采样。

  • nsys profile --enable nvml_metrics,-i10

    每 10 毫秒对所有可用 GPU 上的功耗和温度进行采样。

有关 Nsight Systems 插件的常规信息,请参阅 Nsight Systems 插件 (预览) 系统。

SoC 指标

概述

SoC 指标功能旨在识别在 NVIDIA SoC 上运行的应用程序中的性能限制因素,并且类似于 GPU 指标。

Nsight Systems SoC 指标仅适用于 aarch64 上的 Linux 和 QNX 目标。它需要 NVIDIA Orin 架构或更高版本。

可用指标

  • CPU 读取吞吐量

    mcc__dram_throughput_srcnode_cpu_op_read.avg.pct_of_peak_sustained_elapsed

    CPU 写入吞吐量

    mcc__dram_throughput_srcnode_cpu_op_write.avg.pct_of_peak_sustained_elapsed

    SoC 内存控制器主动处理来自 CPU 的读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • GPU 读取吞吐量

    mcc__dram_throughput_srcnode_gpu_op_read.avg.pct_of_peak_sustained_elapsed

    GPU 写入吞吐量

    mcc__dram_throughput_srcnode_gpu_op_write.avg.pct_of_peak_sustained_elapsed

    SoC 内存控制器主动处理来自 GPU 的读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • DBB 读取吞吐量

    mcc__dram_throughput_srcnode_dbb_op_read.avg.pct_of_peak_sustained_elapsed

    DBB 写入吞吐量

    mcc__dram_throughput_srcnode_dbb_op_write.avg.pct_of_peak_sustained_elapsed

    SoC 内存控制器主动处理来自非 CPU/非 GPU 的读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • DRAM 读取吞吐量

    mcc__dram_throughput_op_read.avg.pct_of_peak_sustained_elapsed

    DRAM 写入吞吐量

    mcc__dram_throughput_op_write.avg.pct_of_peak_sustained_elapsed

    SoC 内存控制器主动处理读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • DLA0/DLA1 活动

    nvdla__cycles_active.avg.pct_of_peak_sustained_elapsed

    DLA (深度学习加速器) 在主动处理命令的周期数与同一采样周期内的周期数之比,以百分比表示。

  • DLA0/DLA1 读取吞吐量

    nvdla__dbb2nvdla_read_throughput.avg.pct_of_peak_sustained_elapsed

    DLA0/DLA1 写入吞吐量

    nvdla__nvdla2dbb_write_throughput.avg.pct_of_peak_sustained_elapsed

    DLA (深度学习加速器) 在主动处理读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • NVENC 活动

    nvenc__cycles_active.avg.pct_of_peak_sustained_elapsed

    NVENC 单元在主动处理命令的周期数与同一采样周期内的周期数之比,以百分比表示。

  • NVENC 读取吞吐量

    nvenc__memif2nvenc_read_throughput.avg.pct_of_peak_sustained_elapsed

    NVENC 写入吞吐量

    nvenc__nvenc2memif_write_throughput.avg.pct_of_peak_sustained_elapsed

    NVENC 单元在主动处理读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • PVA VPU 活动

    pvavpu__vpu_cycles_active.avg.pct_of_peak_sustained_elapsed

    PVA (可编程视觉加速器) VPU (向量处理单元) 在主动处理命令的周期数与同一采样周期内的周期数之比,以百分比表示。

  • PVA DMA 读取吞吐量

    pva__dbb2pvadma_read_throughput.avg.pct_of_peak_sustained_elapsed

    PVA DMA 写入吞吐量

    pva__pvadma2dbb_write_throughput.avg.pct_of_peak_sustained_elapsed

    PVA (可编程视觉加速器) VPU (向量处理单元) 在主动处理读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

    注意

    要在 DRIVE 6.0.8.0 上启用 PVA 跟踪,请在挂载任何其他分区之前运行以下两个命令

    echo 1 >/dev/nvpvadebugfs/pva0/tracing echo 2 >/dev/nvpvadebugfs/pva0/trace_level

  • OFA 活动

    ofa_cycles_active.avg.pct_of_peak_sustained_elapsed

    OFA (光流加速器) 在主动处理命令的周期数与同一采样周期内的周期数之比,以百分比表示。

  • OFA 读取吞吐量

    ofa__memif2ofa_read_throughput.avg.pct_of_peak_sustained_elapsed

    OFA 写入吞吐量

    ofa__ofa2memif_write_throughput.avg.pct_of_peak_sustained_elapsed

    OFA (光流加速器) 在主动处理读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

  • VIC 活动

    vic_cycles_active.avg.pct_of_peak_sustained_elapsed

    VIC (视频图像合成器) 在主动处理命令的周期数与同一采样周期内的周期数之比,以百分比表示。

  • VIC 读取吞吐量

    vic__dbb2vic_read_throughput.avg.pct_of_peak_sustained_elapsed

    VIC 写入吞吐量

    vic__vic2dbb_write_throughput.avg.pct_of_peak_sustained_elapsed

    VIC (视频图像合成器) 在主动处理读取/写入操作的周期数与同一采样周期内的周期数之比,以百分比表示。

从 CLI 启动 SoC 指标

SoC 指标功能由 3 个 CLI 开关控制

  • --soc-metrics=[true, false] 启用 SoC 指标采样 (默认为 false)

  • --soc-metrics-set=[<alias>, file:<file name>] 选择要使用的指标集 (默认为列表中第一个合适的)

  • --soc-metrics-frequency=[100..200000] 选择采样频率,以 Hz 为单位 (默认为 10000)

使用默认选项进行分析

# Must be root or added to 'debug' group
$ nsys profile --soc-metrics=true ./my-app

从 GUI 启动 SoC 指标

在 Nsight Systems 中启动分析时,选择 收集 SoC 指标

这些设置类似于 GPU 指标

有关从 CLI 启动 SoC 指标的命令以及示例,请参阅 CLI 文档

Linux 上的 CPU 分析

Linux 目标上的 Nsight Systems 利用 Linux OS 的 perf 子系统来采样 CPU 指令指针 (IP) 和回溯、跟踪 CPU 上下文切换以及采样 CPU 和 OS 事件计数。Linux perf 工具使用相同的 perf 子系统。

v5.15 之前的 Linux 内核上的 Nsight Systems Embedded Platforms Edition 使用自定义内核模块来收集相同的数据。Nsight Systems CLI 命令 nsys status --environment 指示何时使用内核模块而不是 Linux OS 的 perf 子系统。

功能

  • CPU 指令指针 / 回溯采样

    Nsight Systems 可以定期采样 CPU 指令指针 / 回溯。样本的收集由硬件事件溢出触发 - 例如,在每个线程每 100 万个 CPU 参考周期后收集一个样本。在 GUI 中,样本显示在各个线程时间轴、事件查看器以及自顶向下、自底向上或平面视图中,这些视图提供数据的直方图式摘要。IP / 回溯集合可以在进程树或系统范围模式下配置。在进程树模式下,Nsight Systems 将采样该进程及其由该工具启动的任何子进程。在系统范围模式下,Nsight Systems 将采样系统上运行的所有进程,包括由该工具启动的任何进程。

  • CPU 上下文切换跟踪

    Nsight Systems 可以跟踪操作系统在逻辑 CPU 上调度线程的每次时间和操作系统从逻辑 CPU 取消调度线程的每次时间。该数据用于在 Nsight Systems GUI 中显示 CPU 利用率和 OS 线程利用率。上下文切换集合可以在进程树或系统范围模式下配置。在进程树模式下,Nsight Systems 将跟踪该进程及其由 Nsight Systems 启动的任何子进程。在系统范围模式下,Nsight Systems 将跟踪系统上运行的所有进程,包括由 Nsight Systems 启动的任何进程。

  • CPU 事件采样

    Nsight Systems 可以定期采样 CPU 硬件事件计数和 OS 事件计数,并在 Nsight Systems GUI 中显示事件随时间变化的速率。事件样本集合只能在系统范围模式下配置。在系统范围模式下,Nsight Systems 将采样系统上运行的所有 CPU 的事件计数和 OS 事件计数。事件计数不直接与进程或线程关联。

  • CPU 核心指标

    Nsight Systems 可以访问并提供有关 CPU 核心指标的信息。此功能仅在 Linux 上可用,且仅适用于 NVIDIA Grace CPU。--cpu-core-metrics=help 命令将列出 39 个不同的指标。这些指标在 Grace 性能调优指南 中进行了描述。然后,可以将选定的选项 ID 馈送到 --cpu-core-metrics 开关。

系统要求

偏执级别

CPU IP/回溯采样进程树模式

CPU IP/回溯采样系统范围模式

CPU 上下文切换跟踪进程树模式

CPU 上下文切换跟踪系统范围模式

事件采样系统范围模式

3 或更高

不可用

不可用

不可用

不可用

不可用

2

仅用户模式 IP/回溯样本

不可用

可用

不可用

不可用

1

内核和用户模式 IP/回溯样本

不可用

可用

不可用

不可用

0, -1

内核和用户模式 IP/回溯样本

内核和用户模式 IP/回溯样本

可用

可用

硬件和 OS 事件

  • 内核版本

    为了支持 Nsight Systems 使用的 CPU 分析功能,内核版本必须大于或等于 v4.3。RedHat 已将所需功能向后移植到 v3.10.0-693 内核。RedHat 发行版及其衍生版本 (例如 CentOS) 需要 3.10.0-693 或更高版本的内核。使用 uname -r 命令检查内核版本。

  • perf_event_open 系统调用

    perf_event_open 系统调用需要可用。在 Docker 容器中运行时,默认的 seccomp 设置通常会阻止 perf_event_open 系统调用。要解决此问题,在使用 Docker 启动 docker 时使用 run --privileged 开关或修改 docker 的 seccomp 设置。某些 VM (虚拟机),例如 AWS,也可能会阻止 perf_event_open 系统调用。

  • 采样触发器

    在极少数情况下,采样触发器不可用。采样触发器是导致收集样本的硬件或软件事件。某些 VM 阻止访问硬件事件,因此阻止硬件事件用作采样触发器。在这些情况下,如果可能,Nsight Systems 将回退到使用软件触发器。

  • 检查目标系统

    使用 nsys status --environment 命令检查系统是否满足 Nsight Systems CPU 分析要求。下面显示了此命令的示例输出。请注意,此命令不检查 Linux 功能覆盖 - 即,用户或可执行文件是否具有 CAP_SYS_ADMINCAP_PERFMON 功能。另请注意,此命令不指示是否可以使用系统范围模式。

    environment status output

配置 CPU 分析收集

从 CLI 配置 Nsight Systems 进行 CPU 分析时,请使用以下部分或全部选项:--sample--cpuctxsw--event-sample--backtrace--cpu-core-events--event-sampling-frequency--os-events--samples-per-backtrace--sampling-period

有关这些选项的详细信息,包括示例,请参见 从 CLI 进行分析

从 GUI 配置时,以下选项可用

GUI configuration for CPU profiling

CPU 分析期间使用的配置记录在分析摘要中

CPU profiling in analysis summary

以及诊断摘要中

CPU profiling in diagnostics summary

可视化 CPU 分析结果

以下是可视化 CPU 分析结果的示例屏幕截图。有关导航时间轴视图和回溯的详细信息,请参阅 用户指南的 GUI 中读取报告的时间轴视图 部分。

CPU IP/回溯数据示例

Timeline showing CPU IP/backtrace information

在时间轴中,可以在每个线程的时间轴下找到黄橙色标记,指示在该线程上收集 IP / 回溯样本的时刻 (例如,请参见上面“特定样本”框中的黄橙色标记)。将光标悬停在标记上将导致工具提示显示该样本的回溯。

时间轴下方是一个下拉列表,其中包含多个选项,包括“事件视图”、“自顶向下视图”、“自底向上视图”和“平面视图”。所有这四个视图都可用于查看 CPU IP / 回溯采样数据。

事件采样示例

CPU Event Sampling in GUI

事件采样在收集期间采样硬件或软件事件计数,然后在时间轴上将这些事件绘制为速率。上面的屏幕截图显示了四个硬件事件。核心和缓存事件绘制在关联的 CPU 行下 (请参见屏幕截图中的红色框),而非核心和 OS 事件绘制在它们自己的行中 (请参见屏幕截图中的绿色框)。将光标悬停在时间轴中的事件采样行上会显示该时刻的事件速率。

Arm 自顶向下分析 - 预览功能

Arm 自顶向下方法支持性能分析、工作负载特征分析和微架构探索。您可以在 Arm 自顶向下方法 找到有关该技术的详细信息。

Nsight Systems 提供脚本来支持为 Grace CPU 运行此分析。

在您的 target-linux-sbsa-armv8/cpu 目录中,查找名为 collect_grace_topdown.sh 的脚本。此脚本简化了收集执行工作负载的传统 CPU 自顶向下分析所需的所有 CPU 核心指标数据。

该脚本按顺序运行多个系统范围的 nsys profile 命令来收集数据。您可以像往常一样将其他 Nsight Systems 选项添加到命令行,但以下例外情况除外

  • --event-sample--event-sampling-interval--cpu-core-events--cpu-core-metrics 开关由脚本设置为自顶向下分析。

  • -f--force-overwrite 开关由脚本设置为 true

  • -o--output 开关由脚本设置以生成预定义的输出 nsys-rep 文件列表。

  • --kill 开关设置为默认值 sigterm

如果要由脚本启动应用程序,请在 nsys 开关和应用程序命令行之间放置一个 --

示例命令行

collect_grace_topdown.sh --trace=osrt,nvtx,cuda -- myApp arg1 arg2

输出文件将写入当前工作目录。输出由一系列 .nsys-rep 文件组成,这些文件包含执行工作负载的自顶向下分析所需的指标数据。可以在 Nsight Systems GUI 中打开这些文件以在时间轴上查看指标结果。计划在未来的版本中实现更自动化的 Grace 自顶向下数据分析。

注意

Arm 自顶向下分析需要多个系统范围的集合,并且可能需要相当长的时间才能运行和后处理。

常见问题

  • 减少采样引起的开销

    有几种方法可以减少采样引起的开销。

    • 禁用采样 (即,使用 --sampling=none 开关)。

    • 使用 --sampling-period 开关增加采样周期 (即,降低采样率)。

    • 停止收集回溯 (即,使用 --backtrace=none 开关) 或收集更有效率的回溯 - 如果可用,请使用 --backtrace=lbr 开关。

    • 减少每个样本收集的回溯数。请参阅 --samples-per-backtrace 开关的文档。

  • 节流

    Linux 操作系统强制执行处理采样中断的最大时间。这意味着,如果收集样本的时间超过指定的时间量,操作系统将节流 (即,减慢) 采样率,以防止 perf 子系统引起过多的开销。发生这种情况时,即使线程非常繁忙,采样数据也可能变得不规则。

    Throttling see in GUI

    上面的屏幕截图显示了在收集中 CPU IP / 回溯采样被节流的情况。请注意线程时间轴上采样刻度线的不规则间隔。Nsight Systems GUI 的诊断消息中提供了集合节流的次数。如果集合频繁节流 (例如,数千次),则增加采样周期应有助于减少节流。

    注意

    当发生节流时,操作系统会在 procfs 中设置新的 (较低的) 最大采样率。必须重置此值,然后才能再次提高采样率。使用以下命令重置 OS 的最大采样率 echo '100000' | sudo tee /proc/sys/kernel/perf_event_max_sample_rate

  • 样本间隔不规则

    我的样本不是周期性的 - 为什么?我的样本聚集在一起 - 为什么?样本之间存在间隙 - 为什么?可能的原因

    • 节流,如上所述。

    • 偏执级别设置为 2。如果偏执级别设置为 2,则每当工作负载进行系统调用并花费时间执行内核模式代码时,将不会收集样本,并且采样数据中将存在间隙。

    • 采样触发器本身不是周期性的。如果触发事件不是周期性的,例如,指令已完成事件,则样本收集将主要在发生缓存未命中时进行。

  • 未收集到 CPU 分析数据

    有一些常见问题会导致未收集到 CPU 分析数据

    • 系统要求未满足。使用 nsys status --environment 命令检查您的系统设置,并参阅上面的“系统要求”部分。

    • 我在 Docker 容器中分析了我的工作负载,但未收集到采样数据。默认情况下,Docker 容器会阻止 perf_event_open 系统调用被利用。要覆盖此行为,请使用 --privileged 开关启动 Docker 或修改 Docker 的 seccomp 设置。

    • 我在运行 Ubuntu 20+ 的 Docker 容器中分析了我的工作负载,该容器运行在内核版本 < 3.10.0-693 的 CentOS 主机系统之上。nsys status --environment 命令指示支持 CPU 分析。主机操作系统内核版本决定是否允许 CPU 分析,而版本 < 3.10.0-693 的 CentOS 主机太旧了。在这种情况下,nsys status --environment 命令是不正确的。

NVIDIA 视频分析

NVIDIA 视频硬件分析

限制/要求

NVIDIA 视频硬件分析需要

  • Linux (x86_64 或 Arm) 和 Windows (x86_64)

  • 仅涵盖运行 ResMan 内核驱动程序的桌面平台

  • 驱动版本 >= 535

  • GPU 架构 Turing+

以下情况不支持 NVIDIA 视频硬件分析:

  • 移动平台

  • 驱动版本 < 535

  • GPU 架构 < Turing

  • GSP 已启用且驱动版本 < 545.31

  • MIG 已启用

  • 保密计算已启用

  • vGPU

要了解有关 GSP 及其默认启用的 GPU 的更多信息,请参阅以下链接

要永久关闭 GSP

sudo su -c 'echo options nvidia NVreg_EnableGpuFirmware=0 > /etc/modprobe.d/nvidia-gsp.conf'
sudo update-initramfs -u # for Ubuntu-based systems

然后重启。

或者,如果您不想重启,这将禁用 GSP 直到下次重启

sudo rmmod nvidia_uvm nvidia_drm nvidia_modeset nvidia && \
sudo insmod /lib/modules/$(uname -r)/updates/dkms/nvidia.ko NVreg_EnableGpuFirmware=0
for i in $(seq 0 7); do sudo nvidia-smi -i $i -pm ENABLED; done

从 CLI 运行

此功能通过 --gpu-video-device 选项启用。它在 nsys profilensys launchnsys start 命令中可用。

此选项的行为与 --gpu-metrics-device 完全相同,并接受以下参数

  • --gpu-video-device help - 列出支持的设备及其 ID,列出不支持的设备(如果有)及其原因。

  • --gpu-video-device none - 关闭此功能。

  • --gpu-video-device all - 在所有支持的设备上启用此功能。如果没有设备支持此功能,则返回错误。

  • --gpu-video-device <id1,id2,...> - 在指定的设备上启用此功能。ID 对应于 help 返回的内容。如果 ID 无效,则返回错误。

示例

$ nsys profile --gpu-video-device help
Possible --gpu-video-device values are:
    0: NVIDIA GeForce RTX 3070 PCI[0000:65:00.0]
    all: Select all supported GPUs
    none: Disable GPU video accelerator tracing [Default]

Some GPUs don't support video accelerator tracing:
    Quadro P620 PCI[0000:04:00.0] (reason = Arch Pascal < Turing)

See the user guide: https://docs.nvda.net.cn/nsight-systems/UserGuide/index.html

请注意,这是一个系统级功能;即,它不需要启动程序。

video hardware trace example

NVIDIA 视频编解码器 SDK 跟踪

Nsight Systems for x86 Linux 和 Windows 目标平台可以跟踪来自 NV Video Codec SDK 的调用。此软件跟踪可以从 GUI 启动,也可以使用 CLI 中的 --trace nvvideo 启动

NV Video Codec SDK trace selection

在时间轴上,将显示 CPU 上对 NV Encoder API 和 NV Decoder API 的调用。

NV Video Codec SDK trace in timeline

默认跟踪的 NV Encoder API 函数

NvEncodeAPICreateInstance
nvEncOpenEncodeSession
nvEncGetEncodeGUIDCount
nvEncGetEncodeGUIDs
nvEncGetEncodeProfileGUIDCount
nvEncGetEncodeProfileGUIDs
nvEncGetInputFormatCount
nvEncGetInputFormats
nvEncGetEncodeCaps
nvEncGetEncodePresetCount
nvEncGetEncodePresetGUIDs
nvEncGetEncodePresetConfig
nvEncGetEncodePresetConfigEx
nvEncInitializeEncoder
nvEncCreateInputBuffer
nvEncDestroyInputBuffer
nvEncCreateBitstreamBuffer
nvEncDestroyBitstreamBuffer
nvEncEncodePicture
nvEncLockBitstream
nvEncUnlockBitstream
nvEncLockInputBuffer
nvEncUnlockInputBuffer
nvEncGetEncodeStats
nvEndGetSequenceParams
nvEncRegisterAsyncEvent
nvEncUnregisterAsyncEvent
nvEncMapInputResource
nvEncUnmapInputResource
nvEncDestroyEncoder
nvEncInvalidateRefFrames
nvEncOpenEncodeSessionEx
nvEncRegisterResource
nvEncUnregisterResource
nvEncReconfigureEncoder
nvEncCreateMVBuffer
nvEncDestroyMVBuffer
nvEncRunMotionEstimationOnly
nvEncGetLastErrorString
nvEncSetIOCudaStreams
nvEncGetSequenceParamEx

默认跟踪的 NV Decoder API 函数

cuvidCreateVideoSource
cuvidCreateVideoSourceW
cuvidDestroyVideoSource
cuvidSetVideoSourceState
cudaVideoState
cuvidGetSourceVideoFormat
cuvidGetSourceAudioFormat
cuvidCreateVideoParser
cuvidParseVideoData
cuvidDestroyVideoParser
cuvidCreateDecoder
cuvidDestroyDecoder
cuvidDecodePicture
cuvidGetDecodeStatus
cuvidReconfigureDecoder
cuvidMapVideoFrame
cuvidUnmapVideoFrame
cuvidMapVideoFrame64
cuvidUnmapVideoFrame64
cuvidCtxLockCreate
cuvidCtxLockDestroy
cuvidCtxLock
cuvidCtxUnlock

默认跟踪的 NV JPEG API 函数

nvjpegBufferDeviceCreate
nvjpegBufferDeviceDestroy
nvjpegBufferDeviceRetrieve
nvjpegBufferPinnedCreate
nvjpegBufferPinnedDestroy
nvjpegBufferPinnedRetrieve
nvjpegCreate
nvjpegCreateEx
nvjpegCreateSimple
nvjpegDecode
nvjpegDecodeBatched
nvjpegDecodeBatchedEx
nvjpegDecodeBatchedInitialize
nvjpegDecodeBatchedPreAllocate
nvjpegDecodeBatchedSupported
nvjpegDecodeBatchedSupportedEx
nvjpegDecodeJpeg
nvjpegDecodeJpegDevice
nvjpegDecodeJpegHost
nvjpegDecodeJpegTransferToDevice
nvjpegDecodeParamsCreate
nvjpegDecodeParamsDestroy
nvjpegDecodeParamsSetAllowCMYK
nvjpegDecodeParamsSetOutputFormat
nvjpegDecodeParamsSetROI
nvjpegDecodeParamsSetScaleFactor
nvjpegDecoderCreate
nvjpegDecoderDestroy
nvjpegDecoderJpegSupported
nvjpegDecoderStateCreate
nvjpegDestroy
nvjpegEncodeGetBufferSize
nvjpegEncodeImage
nvjpegEncodeRetrieveBitstream
nvjpegEncodeRetrieveBitstreamDevice
nvjpegEncoderParamsCopyHuffmanTables
nvjpegEncoderParamsCopyMetadata
nvjpegEncoderParamsCopyQuantizationTables
nvjpegEncoderParamsCreate
nvjpegEncoderParamsDestroy
nvjpegEncoderParamsSetEncoding
nvjpegEncoderParamsSetOptimizedHuffman
nvjpegEncoderParamsSetQuality
nvjpegEncoderParamsSetSamplingFactors
nvjpegEncoderStateCreate
nvjpegEncoderStateDestroy
nvjpegEncodeYUV,(nvjpegHandle_t handle
nvjpegGetCudartProperty
nvjpegGetDeviceMemoryPadding
nvjpegGetImageInfo
nvjpegGetPinnedMemoryPadding
nvjpegGetProperty
nvjpegJpegStateCreate
nvjpegJpegStateDestroy
nvjpegJpegStreamCreate
nvjpegJpegStreamDestroy
nvjpegJpegStreamGetChromaSubsampling
nvjpegJpegStreamGetComponentDimensions
nvjpegJpegStreamGetComponentsNum
nvjpegJpegStreamGetFrameDimensions
nvjpegJpegStreamGetJpegEncoding
nvjpegJpegStreamParse
nvjpegJpegStreamParseHeader
nvjpegSetDeviceMemoryPadding
nvjpegSetPinnedMemoryPadding
nvjpegStateAttachDeviceBuffer
nvjpegStateAttachPinnedBuffer

网络通信分析

Nsight Systems 可用于分析几种流行的网络通信协议。要启用此功能,请选择“通信分析选项”下拉菜单。

Project settings screen

然后选择您要跟踪的库

Communication library selection screen

对应的 Nsight Systems CLI --trace|-t 选项是 mpioshmemucx。对于多节点运行,请参阅“从 CLI 进行分析”主题中的“处理应用程序启动器”部分。

MPI API 跟踪

Nsight Systems 通过 --trace=mpi 或选择网络分析选项下的 MPI 复选框,内置了对基于 Open MPI 和 MPICH 的 MPI 实现的 API 跟踪支持。如果 MPI 实现的自动检测失败,可以通过 --mpi-impl=[openmpi|mpich] 或 GUI 中的相应复选框来指定它。

Nsight Systems 将跟踪 MPI API 的子集,包括阻塞和非阻塞点对点和集体通信,以及 MPI 单边通信、文件 I/O 和打包操作(请参阅跟踪的 MPI 函数)。

如果您需要更多地控制跟踪 API 的列表,或者您正在使用不同的 MPI 实现,则可以使用 GitHub 上的 NVTX wrappers for MPI。选择一个非“MPI”的 NVTX 域名,因为当 MPI 跟踪未启用时,它会被 Nsight Systems 过滤掉。按如下方式使用 NVTX 仪器化的 MPI wrapper 库

nsys profile -e LD_PRELOAD=${PATH_TO_YOUR_NVTX_MPI_LIB} --trace=nvtx
MPI API trace

注意

如果并非所有 rank 都被跟踪,则必须将 NSYS_MPI_STORE_TEAMS_PER_RANK 设置为 1。如果 communicator 跟踪仍然导致问题,可以通过设置 NSYS_MPI_DISABLE_COMMUNICATOR_TRACKING=1 来禁用它。

MPI 通信参数

Nsight Systems 可以获取有关 MPI 通信参数的附加信息。目前,这些参数仅在鼠标悬停工具提示或事件日志中可见。这意味着数据仅通过 GUI 可用。该工具的未来版本会将此信息导出到 SQLite 数据文件中以进行后运行分析。

为了完全解释 MPI 通信,必须将与通信操作关联的所有 rank 的数据加载到 Nsight Systems 中。

这是 MPI_COMM_WORLD 数据的示例。这不需要任何额外的 team 数据,因为本地 rank 与全局 rank 相同。

(屏幕截图显示了 rank 3 上 MPI_Bcast 调用的通信参数。)

MPI communication parameter trace

当并非所有参与 MPI 通信的进程都加载到 Nsight Systems 中时,以下信息可用。

  • 右侧屏幕截图显示了重用的 communicator 句柄(最后一个数字增加)。

  • 编码:MPI_COMM[\*team size\*]*global-group-root-rank\*.*group-ID\*

MPI communication parameter trace

当所有报告都加载到 Nsight Systems 中时

  • 除了组本地 rank 之外,还显示世界 rank “(world rank X)”。

  • 编码:MPI_COMM[*team size*]{rank0, rank1, …}。

  • 最多显示 8 个 rank(数字代表世界 rank,列表中的位置是组本地 rank)。

MPI communication parameter trace

跟踪的 MPI 函数

MPI_Init[_thread], MPI_Finalize
MPI_Send, MPI_{B,S,R}send, MPI_Recv, MPI_Mrecv
MPI_Sendrecv[_replace]

MPI_Barrier, MPI_Bcast
MPI_Scatter[v], MPI_Gather[v]
MPI_Allgather[v], MPI_Alltoall[{v,w}]
MPI_Allreduce, MPI_Reduce[_{scatter,scatter_block,local}]
MPI_Scan, MPI_Exscan

MPI_Isend, MPI_I{b,s,r}send, MPI_I[m]recv
MPI_{Send,Bsend,Ssend,Rsend,Recv}_init
MPI_Start[all]
MPI_Ibarrier, MPI_Ibcast
MPI_Iscatter[v], MPI_Igather[v]
MPI_Iallgather[v], MPI_Ialltoall[{v,w}]
MPI_Iallreduce, MPI_Ireduce[{scatter,scatter_block}]
MPI_I[ex]scan
MPI_Wait[{all,any,some}]

MPI_Put, MPI_Rput, MPI_Get, MPI_Rget
MPI_Accumulate, MPI_Raccumulate
MPI_Get_accumulate, MPI_Rget_accumulate
MPI_Fetch_and_op, MPI_Compare_and_swap

MPI_Win_allocate[_shared]
MPI_Win_create[_dynamic]
MPI_Win_{attach, detach}
MPI_Win_free
MPI_Win_fence
MPI_Win_{start, complete, post, wait}
MPI_Win_[un]lock[_all]
MPI_Win_flush[_local][_all]
MPI_Win_sync

MPI_File_{open,close,delete,sync}
MPI_File_{read,write}[_{all,all_begin,all_end}]
MPI_File_{read,write}_at[_{all,all_begin,all_end}]
MPI_File_{read,write}_shared
MPI_File_{read,write}_ordered[_{begin,end}]
MPI_File_i{read,write}[_{all,at,at_all,shared}]
MPI_File_set_{size,view,info}
MPI_File_get_{size,view,info,group,amode}
MPI_File_preallocate

MPI_Pack[_external]
MPI_Unpack[_external]

OpenSHMEM 库跟踪

如果选择 OpenSHMEM 库跟踪,Nsight Systems 将跟踪 OpenSHMEM API 函数的子集,这些函数最有可能涉及性能瓶颈。为了保持低开销,Nsight Systems 不会跟踪所有函数。

未跟踪的 OpenSHMEM 1.5 函数

shmem_my_pe
shmem_n_pes
shmem_global_exit
shmem_pe_accessible
shmem_addr_accessible
shmem_ctx_{create,destroy,get_team}
shmem_global_exit
shmem_info_get_{version,name}
shmem_{my_pe,n_pes,pe_accessible,ptr}
shmem_query_thread
shmem_team_{create_ctx,destroy}
shmem_team_get_config
shmem_team_{my_pe,n_pes,translate_pe}
shmem_team_split_{2d,strided}
shmem_test*

UCX API 跟踪

如果选择 UCX API 跟踪,Nsight Systems 将跟踪 UCX 协议层 UCP 的函数子集,这些函数最有可能涉及性能瓶颈。为了保持低开销,Nsight Systems 不会跟踪所有函数。

以下环境变量控制记录的内容

  • NSYS_UCP_COMM_SUBMIT:(默认启用)如果设置为 0,则不再记录 UCP 通信提交调用。这些调用通常很短,因为通信本身在 worker 线程中处理。

  • NSYS_UCP_COMM_PROGRESS:(默认启用)如果设置为 0,则禁用(进程本地)UCP 通信进度的跟踪。进度跟踪使用 UCP 完成回调。

  • NSYS_UCP_COMM_PARAMS:(默认启用)如果设置为 0,则不会记录 UCP 通信参数(标签、远程 worker UID、打包消息大小、缓冲区地址)。记录远程 worker UID 需要 UCX >= 1.12.0。记录打包消息大小需要 UCX >= 1.14.0。

跟踪的 UCX 函数

ucp_am_send_nb[x]
ucp_am_recv_data_nbx
ucp_am_data_release
ucp_atomic_{add{32,64},cswap{32,64},fadd{32,64},swap{32,64}}
ucp_atomic_{post,fetch_nb,op_nbx}
ucp_cleanup
ucp_config_{modify,read,release}
ucp_disconnect_nb
ucp_dt_{create_generic,destroy}
ucp_ep_{create,destroy,modify_nb,close_nbx}
ucp_ep_flush[{_nb,_nbx}]
ucp_listener_{create,destroy,query,reject}
ucp_mem_{advise,map,unmap,query}
ucp_{put,get}[_nbi]
ucp_{put,get}_nb[x]
ucp_request_{alloc,cancel,is_completed}
ucp_rkey_{buffer_release,destroy,pack,ptr}
ucp_stream_data_release
ucp_stream_recv_data_nb
ucp_stream_{send,recv}_nb[x]
ucp_stream_worker_poll
ucp_tag_msg_recv_nb[x]
ucp_tag_{send,recv}_nbr
ucp_tag_{send,recv}_nb[x]
ucp_tag_send_sync_nb[x]
ucp_worker_{create,destroy,get_address,get_efd,arm,fence,wait,signal,wait_mem}
ucp_worker_flush[{_nb,_nbx}]
ucp_worker_set_am_{handler,recv_handler}

未跟踪的 UCX 函数

ucp_config_print
ucp_conn_request_query
ucp_context_{query,print_info}
ucp_get_version[_string]
ucp_ep_{close_nb,print_info,query,rkey_unpack}
ucp_mem_print_info
ucp_request_{check_status,free,query,release,test}
ucp_stream_recv_request_test
ucp_tag_probe_nb
ucp_tag_recv_request_test
ucp_worker_{address_query,print_info,progress,query,release_address}

来自其他 UCX 层的其他 API 函数可能会在产品的未来版本中添加。

NVIDIA NVSHMEM 和 NCCL 跟踪

NVIDIA 网络通信库 NVSHMEM 和 NCCL 已使用 NVTX 注释进行了检测。要在 Nsight Systems 中启用对这些库的跟踪,请在 GUI 或 CLI 中启用 NVTX 跟踪。要启用 NVSHMEM 库的 NVTX 检测,请确保正确设置了环境变量 NVSHMEM_NVTX;例如,NVSHMEM_NVTX=common

NIC 指标采样

概述

NVIDIA ConnectX 智能网络接口卡(智能 NIC)为网络操作提供高级硬件卸载和加速。在 Nsight Systems 时间轴上查看智能 NIC 指标,使开发人员能够更好地了解其应用程序的网络使用情况。开发人员可以使用此信息来优化应用程序的性能。

限制/要求

  • NIC 指标采样支持从 ConnectX 5 开始的 NVIDIA ConnectX 板卡

  • NIC 指标采样仅在 Linux x86_64 和 Arm Server (SBSA) 机器上受支持,最低 Linux 内核为 4.12,最低 MLNX_OFED 为 4.1。您可以从 MLNX_OFED 下载中心下载 MLX_OFED 驱动程序的最新版本和存档版本。如果在容器中收集 NIC 指标,请确保容器可以访问主机上的驱动程序。要手动检查 OFED 是否已安装并获取其版本,您可以运行

    • /usr/bin/ofed_info

    • cat /sys/module/"$(cat /proc/modules | grep -o -E "^mlx._core")"/version

要检查目标系统是否满足 NIC 指标收集的要求,您可以运行 nsys status --network

使用命令行收集 NIC 指标

要使用 Nsight Systems CLI 收集 NIC 性能指标,请添加 --nic-metrics 命令行开关

nsys profile --nic-metrics=true my_app
NIC metric sampling screenshot

可用指标

  • 发送字节数 - 通过所有 NIC 端口发送的字节数。

  • 接收字节数 - 所有 NIC 端口接收的字节数。

  • 平均发送数据包大小 - 通过所有 NIC 端口发送的数据包的平均字节大小。

  • 平均接收数据包大小 - 所有 NIC 端口接收的数据包的平均字节大小。

  • CNP 发送数 - NIC 发送的拥塞通知数据包数。

  • CNP 接收数 - NIC 接收和处理的拥塞通知数据包数。

  • 发送等待 - 端口有数据要传输但在整个 tick 期间没有发送数据的 tick 数(由于信用不足或缺乏仲裁)

注意

仅当提到的指标在分析期间具有非零值时才会显示。

使用示例

  • Bytes sent/secBytes received/sec 指标能够识别空闲和繁忙的 NIC 时间。

    • 开发人员可以将网络操作从繁忙时间转移到空闲时间,以减少网络拥塞和延迟。

    • 开发人员可以使用空闲 NIC 时间发送更多数据,而不会降低应用程序性能。

  • CNP(拥塞通知数据包)接收/发送和发送等待指标可以解释网络延迟。看到网络拥塞时段的开发人员可能会重写其算法以避免观察到的拥塞。

InfiniBand 交换机指标采样

NVIDIA Quantum InfiniBand 交换机提供高带宽、低延迟的通信。在 Nsight Systems 时间轴上查看交换机指标,使开发人员能够更好地了解其应用程序的网络使用情况。开发人员可以使用此信息来优化应用程序的性能。

限制/要求

IB 交换机指标采样支持所有 NVIDIA Quantum 交换机。用户需要具有查询 InfiniBand 交换机指标的权限。

要检查当前用户是否具有查询 InfiniBand 交换机指标的权限,请检查用户是否具有访问 /dev/infiniband/umad* 的权限

要在 RedHat 系统上授予用户查询 InfiniBand 交换机指标的权限,请按照 RedHat Solutions 中的说明进行操作。

要使用 Nsight Systems CLI 收集 InfiniBand 交换机性能指标,请添加 --ib-switch-metrics-device 命令行开关,后跟以逗号分隔的 InfiniBand 交换机 GUID 列表。例如

nsys profile --ib-switch-metrics-device=<IB switch GUID> my_app

要获取给定 NIC 可访问的 InfiniBand 交换机列表,请使用

sudo ibswitches -C <nic name>
InfiniBand Switch performance metrics sampling screenshot

可用指标

  • 发送字节数 - 通过所有交换机端口发送的字节数

  • 接收字节数 - 所有交换机端口接收的字节数

  • 发送等待 - 交换机端口(由

    PortSelect 选择)有数据要传输但在整个 tick 期间没有发送数据的 tick 数(由于信用不足或缺乏仲裁)

  • 平均发送数据包大小 - 平均发送 InfiniBand 数据包大小

  • 平均接收数据包大小 - 平均接收 InfiniBand 数据包大小

InfiniBand 交换机拥塞事件

概述

NVIDIA Quantum InfiniBand 交换机提供高带宽、低延迟的通信。

当交换机出口端口拥塞时,数据包会在出口端口队列中等待,然后再从交换机发送出去。这会增加这些数据包的延迟。

Nsight Systems Workstation Edition 使您能够在 Nsight Systems 时间轴上查看交换机出口端口何时拥塞。这使开发人员能够更好地了解由应用程序网络使用引起的延迟。开发人员可以使用此信息来优化应用程序的性能。

限制/要求

IB 交换机拥塞事件支持需要

  • Quantum 2 交换机或更新版本

  • 固件版本 31.2012.1068 或更高版本

  • 用户需要具有发送管理数据报的权限

要获取给定 NIC 可访问的 InfiniBand 交换机列表,请使用:sudo ibswitches -C <nic name>

要检查当前用户是否具有发送管理数据报的权限,请检查用户是否具有访问 /dev/umad 的权限。要在 RedHat 系统上授予用户查询 InfiniBand 交换机指标的权限,请按照 RedHat Solutions 中给出的说明进行操作。

使用命令行

要使用 Nsight Systems CLI 收集 InfiniBand 交换机拥塞事件,请添加以下命令行开关

  • ib-switch-congestion-device 这后面应跟一个以逗号分隔的 InfiniBand 交换机 GUID 列表,将从中收集拥塞事件。

  • ib-switch-congestion-nic-device 这后面应跟一个 NIC (HCA) 的名称,InfiniBand 交换机将通过该 NIC 访问。配置文件的 InfiniBand 交换机应可通过此 NIC 访问。

  • ib-switch-congestion-percent 这定义了要收集的 InfiniBand 交换机拥塞事件的百分比。此选项允许减少报告拥塞事件所消耗的网络带宽。值范围为 [1,100]。

  • ib-switch-congestion-threshold-high 这定义了 InfiniBand 交换机出口端口队列大小的高阈值。当数据包进入 InfiniBand 交换机时,其数据存储在入口端口缓冲区中。指向数据包数据的指针插入到出口端口的队列中,数据包将从该队列退出交换机。此时,将此命令开关给出的阈值与出口队列数据大小进行比较。如果队列数据大小超过阈值,则报告拥塞事件。阈值以入口端口大小的百分比给出。出口端口队列可以指向来自多个入口端口缓冲区的数据,因此阈值可以大于 100%。值范围为 (1,1023]

infiniband congestion sampling screenshot

InfiniBand 网络信息

概述

默认情况下,Nsight Systems 显示低级标识符,如 LID(本地标识符)和 GUID(全局唯一标识符)。相反,Nsight Systems 可以利用 InfiniBand 网络信息来显示节点和交换机的实际名称。这使得 Nsight Systems 报告更直观,更易于一目了然地理解。

InfiniBand 网络信息发现是使用 ibdiagnet 实用程序完成的。以下两种方式均可:

  • 运行 ibdiagnet 并存储生成的网络信息文件,供 Nsight Systems 稍后使用。

    • 此方法适用于大型网络,其中

      ibdiagnet 的网络发现时间可能很长,并且对于只有管理员有权查询网络信息的网络。

  • 用户可以要求 Nsight Systems 运行 ibdiagnet 以在分析会话期间收集网络信息。

    • 此方法适用于小型网络。

限制/要求

用户需要具有发送 MAD(管理数据报)的权限。要检查您是否具有发送 MAD 的权限,请检查您是否可以访问 /dev/infiniband/umad* 文件。要在 RedHat 系统上授予用户发送 MAD 的权限,请按照 RedHat Solutions 中的说明进行操作。

相关开关

以下 Nsight Systems 命令行开关启用收集 InfiniBand 网络信息

  • ib-net-info-devices

    这后面应跟一个以逗号分隔的 NIC 名称列表,ibdiagnet 将从中运行网络发现。网络发现的结果将自动加载到 Nsight Systems 中。

  • ib-net-info-files

    这后面应跟一个以逗号分隔的预生成的 ibdiagnet db_csv 文件路径列表,Nsight Systems 将读取这些文件。

  • ib-net-info-output

    这后面应跟一个目录的路径,Nsight Systems 将在其中存储 ibdiagnet 网络发现数据。这些文件将由 ib-net-info-devices 命令行开关使用。此命令行开关只能与 ib-net-info-devices 命令行开关一起使用。

InfiniBand network information

上图显示了拥塞事件。InfiniBand 网络信息用于显示节点和交换机名称,而不是 LID。

Amazon AWS EFA 指标

Nsight Systems 现在可以定期采样 AWS Elastic Fabric Adapters (EFA) 的性能计数器,并在 GUI 中的时间轴上绘制它。这使开发人员能够分析网络通信如何参与其多节点应用程序的关键路径。此插件与 AWS 合作创建,可在 AWS EC2 NVIDIA GPU 加速计算实例 上运行。

要启用 AWS EFA 指标,请将以下选项添加到 nsys profilestart 命令

--enable efa_metrics[,arg1[=value1],arg2[=value2], ...]

efa_metrics 插件名称后没有空格。它后面跟一个以逗号分隔的参数或 argument=value 对列表。带空格的参数应放在双引号中。

支持的参数是

名称

可能的参数

默认值

开关描述

-efa-non-rdma

true, false

false

采样 Infiniband 非 RDMA 计数器

-efa-sysfs

<path>

/sys/class/infiniband

EFA 计数器 sysfs 的根目录

-efa-work-requests

true, false

false

采样 Infiniband WorkRequest 计数器

-errors

true, false

false

采样错误计数器

-freq

整数,负值表示 1/F 频率

10

目标采样频率(赫兹)

-mode

throughput, delta, total

throughput

将采样的计数器报告为每秒值、自上次采样以来的增量或累积总和。

-packets

true, false

false

采样数据包计数器

使用示例

  • nsys profile --enable efa_metrics ...

    采样所有 EFA 适配器,以字节/秒显示。

  • nsys profile --enable efa_metrics,-packets,-errors,-efa-non-rdma ...

    采样所有可用的 EFA 适配器计数器。

  • nsys profile --enable efa_metrics,-mode=total ...

    采样所有 EFA 适配器,显示自分析开始以来的总值和。

  • nsys profile --enable efa_metrics,-efa-counters-sysfs="/mnt/nv/sys", ...

    在不同的 sysfs 目录中查找 EFA 计数器。在某些 k8s 环境中很有用。

此收集器是 Nsight Systems 插件(预览) 系统的第一个用例。

网络接口指标

Nsight Systems 现在可以定期采样网络接口设备的性能计数器,并在 GUI 中的时间轴上绘制它们。

要启用网络设备指标,请将以下选项添加到 nsys profilestart 命令

--enable network_interface[,arg1[=value1],arg2[=value2], ...]

network_interface 插件名称后没有空格。它后面跟一个以逗号分隔的参数或 argument=value 对列表。带空格的参数应放在双引号中。

支持的参数是

短名称

长名称

可能的参数

默认值

开关描述

-i

--interval

integer

100000

采样间隔(微秒)

-d

--device

正则表达式

“.+”(并过滤物理设备)

要采样的设备

-m

--metricd

正则表达式

“.*_bytes”

要采样的指标

-h

--help

打印帮助消息

使用示例

  • nsys profile --enable network_interface ...

    每 100 毫秒采样所有物理网络设备的字节指标。

  • nsys profile --enable network_interface,-dall ...

    每 100 毫秒采样所有网络设备的字节指标。

  • nsys profile --enable network_interface,-i10000,-dall,-m".+"

    每 10 毫秒采样所有网络设备的所有指标。

有关 Nsight Systems 插件的常规信息,请参阅 Nsight Systems 插件 (预览) 系统。

存储指标分析

Nsight Systems 可以分析几种主要的存储/远程存储协议。

要激活此功能,请使用 Nsight Systems CLI --storage-metrics 选项,后跟以逗号分隔的所需参数列表。

可用参数

  • --nfs-volumes={all | volume1[,volume2][,volume3..]}:为指定的卷启用 NFS 存储分析(指定 all 以分析所有卷)。

  • --lustre-volumes={all | volume1[,volume2][,volume3..]}:为指定的卷启用 Lustre 存储分析(指定 all 以分析所有卷)。

  • --lustre-llite-dir=<path>:指定 llite 目录挂载的路径。这是 /sys/kernel/debug/lustre/llite 目录挂载点(如果启用了 Lustre 分析,则为必填项)。

  • --storage-devices={all | device1[,device2][,device3..]}:启用指定本地存储或 NVMeOF 设备的存储分析(指定 all 以分析所有设备)。

使用示例

Multiple storage protocols report file (Timeline view)

在报告文件的“时间轴视图”下,可以在“挂载点”部分查看存储指标。每一行包含一个卷或设备的指标,卷/设备名称旁边是存储类型。展开每一行将显示该卷/设备的收集指标。

Multiple storage protocols report file (Files)

存储指标收集过程的 stdoutstderr 日志文件可以在“文件”部分下查看,这可能有助于调试。

向非特权用户公开 Lustre 驱动程序计数器

Lustre 驱动程序通过位于 /sys/kernel/debug/lustre 下的虚拟文件公开性能计数器。但是,非特权用户无法访问此路径。

要向非特权用户公开 Lustre 计数器,超级用户应创建到 /sys/kernel/debug/lustre 的挂载点。例如

su - root
mkdir /mnt/lustre-stats
mount --bind /sys/kernel/debug/lustre /mnt/lustre-stats``

--lustre-llite-dir= 命令行参数应指向此挂载点下的 llite 目录;这将使 Nsight Systems 能够读取 Lustre 计数器。例如:--lustre-llite-dir=/mnt/lustre-stats/llite

  1. NFS 存储示例

    NFS 存储分析的 Nsight Systems 命令行示例

    ./nsys profile --storage-metrics --nfs-volumes=all <target-application>

    NFS storage report file with expanding counters
  2. Lustre 存储示例

    Lustre 存储分析的 Nsight Systems 命令行示例

    ./nsys profile --storage-metrics --lustre-volumes=dtdata,--lustre-llite-dir=/mnt/lustre-stats/llite <target-application>

    Lustre storage report file with expanding counters
  3. 本地/NVMeOF 存储示例

    本地存储和 NVMeOF 设备分析的 Nsight Systems 命令行示例

    ./nsys profile --storage-metrics --storage-devices=all <target-application>

    Local / NVMeOF storage report file with expanding counters

也可以组合使用这些参数以一次分析多个存储协议。例如

./nsys profile --storage-metrics --nfs-volumes=all,--lustre-volumes=all,--storage-devices=<device_name1>,<device_name2>,--lustre-llite-dir=<path_to_llite_directory> <target-application>

注意

有两种类型的读取/写入指标

  • 应用程序级别读取/写入 - 显示应用程序读取/写入到存储设备的数据量(以字节为单位)。

  • 驱动程序级别读取/写入 - 显示驱动程序读取/写入到存储设备的吞吐量(以字节/秒为单位)。

例如,当应用程序使用 “write” POSIX 函数向文件写入 10 MB 数据时,整个 10 MB 数据将在单个采样点出现在应用程序级别写入计数器中。相同的 10 MB 数据可能分散在多个驱动程序级别写入计数器采样点中,因为 NFS 驱动程序可能需要一些时间才能将 10 MB 数据写入 NFS 存储服务器。

Python 性能分析

Nsight Systems 在过去几年中添加了几个功能,以增强用户优化其 Python 代码的能力。

注意

您可能会发现您的所有 Python 应用程序输出都在运行结束时出现,而不是在事件发生时出现。

Python 将根据 stdout 指向 tty 还是其他内容来更改 stdout 的缓冲方式。Nsight Systems 将应用程序 stdout 重定向到一个管道,以便将 stdout 解复用到文件和终端。副作用是,这使得 Python 将 stdout 缓冲从行缓冲更改为页缓冲。您可以使用 python -u 选项或 PYTHONUNBUFFERED environment 环境变量来覆盖此行为。

Python 回溯采样

适用于 Arm 服务器 (SBSA) 平台、x86 Linux 和 Windows 目标的 Nsight Systems 能够定期捕获 Python 回溯信息。此功能在跟踪版本 3.9 或更高版本的 Python 解释器时可用。捕获 Python 回溯是在周期性采样中完成的,采样频率范围为 1Hz - 2KHz,默认值为 1KHz。请注意,此功能为 Python 进程提供有意义的回溯。当分析纯 Python 工作流程时,请考虑禁用 CPU 采样选项以减少开销。

要从 Nsight Systems 启用 Python 回溯采样

命令行 — 设置 --python-sampling=true 并使用 --python-sampling-frequency 选项来设置采样率。

图形界面 — 选中 收集 Python 回溯样本 复选框。

Configure Python Backtrace

示例屏幕截图

Python Backtrace sampling

Python 函数跟踪

适用于 Arm 服务器 (SBSA) 平台、x86 Linux 和 Windows 目标的 Nsight Systems 能够使用 NVTX 注释 Python 函数。

Python 源代码不需要任何更改。此功能需要 CPython 解释器,3.8 或更高版本。

注释在 JSON 文件中配置。示例文件位于 Nsight Systems 安装文件夹中的 <target-platform-folder>/PythonFunctionsTrace/annotations.json 中。

注意

不支持从模块 __main__ 注释函数。

要从 Nsight Systems 启用 Python 函数跟踪

命令行 — 设置 --python-functions-trace=<json_file>

图形界面 — 选中 Python 函数跟踪 复选框并指定 JSON 文件。

Configure Python Functions Trace

示例屏幕截图

Python Functions Trace

Python GIL 跟踪

适用于 Arm 服务器 (SBSA) 平台、x86 Linux 和 Windows 目标的 Nsight Systems 能够跟踪 Python 线程何时等待持有和持有 GIL(全局解释器锁)。

Python 源代码不需要任何更改。此功能需要 CPython 解释器,3.9 或更高版本。

命令行 — 设置 --trace=python-gil

图形界面 — 在 Python 性能分析选项 下选中 跟踪 GIL 复选框。

Configure Python GIL Tracing

示例屏幕截图

Python GIL Tracing

PyTorch Autograd NVTX

适用于 Arm 服务器 (SBSA) 平台、x86 Linux 和 Windows 目标的 Nsight Systems 能够在加载 torch 模块后立即自动启用 torch.autograd.profiler.emit_nvtx()

Python 源代码不需要任何更改。此功能需要 CPython 解释器,3.8 或更高版本。

要启用 PyTorch autograd nvtx,请从命令行使用 --pytorch 选项运行 Nsight Systems

设置 --pytorch=autograd-nvtx 以启用 torch.autograd.profiler.emit_nvtx(record_shapes=False),或设置 --pytorch=autograd-shapes-nvtx 以启用 torch.autograd.profiler.emit_nvtx(record_shapes=True)(暗示 --trace=nvtx)。

示例屏幕截图

PyTorch Autograd NVTX

分析嵌入式虚拟机

Nsight Systems 和 DRIVE Hypervisor 支持带有调用堆栈的周期性 CPU 采样。它在 DRIVE Linux 和 QNX 上均可工作。

调用堆栈是使用帧指针收集的。Linux 内核、QNX 内核和 NVIDIA 提供的用户空间库都是使用帧指针编译的。为了确保正确的调用堆栈,我们建议使用帧指针支持编译所有应用程序代码,使用 GCC、Clang 和 QCC 的 -fno-omit-frame-pointer

这是一个实验性功能,预计将来会发生变化。

符号可以针对用户空间代码和内核空间代码进行解析

  • 在用户空间中,跨虚拟机管理程序 (XHV) 采样事件与来自 Linux Perf 和 QNX Tracelogger 的 CPU 线程状态跟踪相匹配。之后,Nsight Systems 可以知道模块文件名,并且可以直接从这些文件(如果它们未被剥离)或通过查找带有符号的附加文件来解析符号。请参阅下面的更多详细信息。

  • 在内核空间(Linux 内核、QNX 内核和附加服务 VM)中,符号使用指定的带有符号的 ELF 文件进行解析。kernel_symbols.json 输入文件指定了此 ELF 文件的位置。

请按照以下步骤学习如何

  • 刷写开发套件(这些步骤仅作为示例给出,确切步骤可能因您的具体情况而异)。

  • 复制必要的文件:pct.json、eventlib schema 文件和 kernel_symbols.json。

  • 编写 kernel_symbols.json 以允许解析 Linux 内核、QNX 内核和附加服务 VM 中的符号。

  • 请参阅示例命令行命令以收集数据。

已知问题

  • 目前,此功能与 Linux 和 QNX 上的标准 CPU 采样不兼容。

  • 当同时启用时,虚拟机管理程序跟踪和 XHV 采样可能会将过多数据写入到相同的 eventlib 缓冲区中,并且 Nsight Systems 代理可能无法跟上速率,从而丢失事件。如果发生这种情况,请使用 --xhv-trace-events=none 禁用虚拟机管理程序跟踪事件。

刷写 DRIVE OS QNX/Linux

登录 NVIDIA GPU Cloud (NGC)

sudo docker login nvcr.io

Username: ``$oauthtoken``
Password: <NGC API key>

Docker 命令

sudo docker run --rm --privileged --net host \
    -v /dev/bus/usb:/dev/bus/usb \
    -v /tmp:/drive_flashing \
    -it <docker image>

<docker image> - Docker 镜像链接。

示例

6.0.8.0 QNX

sudo docker run --rm --privileged --net host \
    -v /dev/bus/usb:/dev/bus/usb \
    -v /tmp:/drive_flashing \
    -it nvcr.io/{MY_NGC_ORG}/driveos-pdk/drive-agx-orin-qnx-aarch64-pdk-build-x86:6.0.8.0-0003

6.0.9.1 QNX

sudo docker run --rm --privileged --net host \
    -v /dev/bus/usb:/dev/bus/usb \
    -v /tmp:/drive_flashing \
    -it nvcr.io/{MY_NGC_ORG}/driveos-pdk/drive-agx-orin-qnx-aarch64-pdk-build-x86:6.0.9.1-latest

6.0.8.0 Linux

sudo docker run --rm --privileged --net host \
    -v /dev/bus/usb:/dev/bus/usb \
    -v /tmp:/drive_flashing \
    -it nvcr.io/{MY_NGC_ORG}/driveos-pdk/drive-agx-orin-linux-aarch64-pdk-build-x86:6.0.8.0-0003

在容器内部,使用 flash.py 刷写

cd /drive
./flash.py <aurix> <board>
  • <board> - 目标板基本名称:‘p3710’ 或 ‘p3663’。

  • <aurix> - Aurix 串口,例如:/dev/ttyACM1, /dev/ttyUSB1

示例

Firespray p3710

./flash.py /dev/ttyACM1 p3710

Drive Orin p3663

./flash.py /dev/ttyUSB1 p3663

列出可用的 EMMC 和 UFS 分区

df -h

格式化电源安全文件系统分区并挂载它,例如 vblk_ufs40

mkqnx6fs /dev/vblk_ufs40 -q
mount -o rw /dev/vblk_ufs40 /
# df -h
/dev/vblk_ufs40             116G      7.5G      108G       7%  /
ifs                          16M       16M         0     100%  /
ifs                          52M       52M         0     100%  /
...

注意

有关 DRIVE OS 安装的更多信息,请参阅以下链接:NVIDIA DRIVE OS 文档(有用的页面:DRIVE OS Linux 安装指南DRIVE OS QNX 安装指南)。

创建 XHV 目录

在容器内部,p3710 的示例,QNX/Linux

QNX

cd /drive_flashing
mkdir -p xhv/hypervisor/configs/t234ref-release/pct/qnx xhv/schemas
cp -rv /drive/drive-foundation/virtualization/hypervisor/t23x/configs/t234ref-release/pct/p3710-10-a03/qnx/pct.json ./xhv/hypervisor/configs/t234ref-release/pct/qnx/
cp -rv /drive/drive-foundation/schemas/event ./xhv/schemas/

Linux

cd /drive_flashing
mkdir -p xhv/hypervisor/configs/t234ref-release/pct/linux xhv/schemas
cp -rv /drive/drive-foundation/virtualization/hypervisor/t23x/configs/t234ref-release/pct/p3710-10-a03/linux/pct.json ./xhv/hypervisor/configs/t234ref-release/pct/linux/
cp -rv /drive/drive-foundation/schemas/event ./xhv/schemas/

XHV 目录示例 (Linux)

xhv/
├── hypervisor
│             └── configs
│                 └── t234ref-release
│                     └── pct
│                         └── linux
│                             └── pct.json
└── schemas
    └── event
        ├── audioserver_events.json
        ├── bpmp_events.json
        ├── cem_events.json
        ├── hv_events.json
        ├── i2c_events.json
        ├── Makefile.gen-event-headers.tmk
        ├── monitor_events.json
        ├── se_events.json
        ├── sysmgr_events.json
        └── vsc_events.json

将 XHV 目录复制到目标

scp -r xhv <user>@<target-IP>

eventlib_dump 工具 (QNX/Linux)

cp -rv /drive/drive-qnx/nvidia-bsp/aarch64le/sbin/eventlib_dump /drive_flashing/
cp -rv /drive/drive-linux/filesystem/contents/bin/eventlib_dump /drive_flashing/

特定命令行选项

选项

可能的参数

默认值

开关描述

--sample

process-tree, system-wide, xhv, xhv-system-wide, none

process-tree

选择 ‘xhv’ 或 ‘xhv-system-wide’ 以启用跨虚拟机管理程序 (XHV) 采样,需要 root 权限。

--xhv-vm-symbols

< filepath kernel_symbols.json >

none

XHV 采样配置(可选,用于内核符号)。

--xhv-trace

< filepath pct.json >

none

收集虚拟机管理程序跟踪。

--xhv-trace-events

all, none, core, sched, irq, trap

all

HV 跟踪事件。

示例

nsys profile --sample=xhv --trace=nvtx,osrt,cuda --xhv-vm-symbols=/root/kernel_symbols.json --xhv-trace=/root/xhv/hypervisor/configs/p3710-10-a01/pct/qnx/pct.json --xhv-trace-events=none sleep 5
nsys profile --sample=xhv-system-wide --xhv-vm-symbols=/root/kernel_symbols.json --xhv-trace=/root/xhv/hypervisor/configs/p3710-10-a01/pct/qnx/pct.json --xhv-trace-events=none sleep 5

示例屏幕截图

VMProfiler screenshot

配置文件(用于内核符号)

示例

QNX,kernel_symbols.json 文件

{
    "guest_cfg": [
        {
            "guest_id": 0,
            "guest_name": "Guest VM 0",
            "symbols": "/root/symbols/procnto-smp-instr-safety.guest_vm.bin.sym"
        },
        {
            "guest_id": 1,
            "guest_name": "Update service",
            "symbols": "/root/symbols/procnto-smp-instr-safety.update_vm.bin.sym"
        },
        {
            "guest_id": 2,
            "guest_name": "Resource Manager Server"
        },
        {
            "guest_id": 3,
            "guest_name": "Storage Server"
        },
        {
            "guest_id": 4,
            "guest_name": "Ethernet Server"
        },
        {
            "guest_id": 5,
            "guest_name": "Debug Server"
        }
    ],
    "symbol_files": {
        "Sidekick": "/root/symbols/sidekick.unstripped"
    }
}

Linux,kernel_symbols.json 文件

{
    "guest_cfg": [
        {
            "guest_id": 0,
            "guest_name": "Guest VM 0",
            "symbols": "/home/nvidia/vmlinux"
        },
        {
            "guest_id": 1,
            "guest_name": "Update service"
        }
    ],
    "symbol_files": {
    }
}

符号文件

包含符号文件的目录列表

  • 命令行:DbgFileSearchPath 配置选项,例如:DbgFileSearchPath="/lib:/root/symbols" - 包含符号/调试文件的目录列表。在 Linux 上,默认路径为 /usr/lib/debug。在 QNX 上,没有默认路径。

    示例

    NSYS_CONFIG_DIRECTIVES='DbgFileSearchPath="/lib:/root/symbols"' nsys profile --sample=xhv  --xhv-vm-symbols=/root/kernel_symbols.json --xhv-trace=/root/xhv/hypervisor/configs/p3710-10-a01/pct/qnx/pct.json --xhv-trace-events=none sleep 5
    
  • 图形界面:Symbol location 按钮。

搜索是非递归的。

有几种搜索符号文件的方法 - Nsight Systems 会为每个目标文件按顺序尝试它们

  • Build-id 调试文件(仅限命令行)

    <符号目录>/.build-id/… - 包含调试文件(或指向调试文件的链接)的目录。

    示例

    .build-id/
    ├── 00
         └── 6627b119cc2aee77e10e0535fc243fce8fe66e.debug
    ├── 01
         ├── 3e4007e3cb24359203fc02b63bb90f16db5b23.debug
         └── fb938bc0f029c41a8e1e88f01f88f75cf3a0d3.debug
    ...
    
  • Debuglink 文件(仅限命令行)

    <符号目录>/<符号文件> - 必须匹配来自 debuglink 部分的文件名和 CRC 才能找到符号文件。

  • 文件名和 build-id(命令行/图形界面)

    <符号目录>/<符号文件> - 通过文件名和 build-id。

从图形界面进行 XHV 性能分析

XHV 选项

VMProfiler GUI screenshot

使用此对话框指定 XHV 参数

  • Collect HV Trace - 启用 XHV 跟踪。

  • 主机上 pct.json 文件的位置。存在预定义的 XHV JSON 文件层次结构,例如

xhv/
├── hypervisor
│             └── configs
│                 └── t234ref-release
│                     └── pct
│                         └── linux
│                             └── pct.json
└── schemas
    └── event
        ...
        ├── hv_events.json
        ...
  • Collect VM Profile - 启用 XHV 采样,取决于 Collect HV Trace

  • Event mask - 选择 XHV 跟踪事件,此选项可以指定为 None

  • 主机上 kernel_symbols.json 文件的位置。请注意,此文件包含内核符号文件的目标路径(请参阅上面的示例)。

  • Skip idleCombine EL0 复选框已弃用。

向报告添加您自己的集合

Nsight Systems 允许用户向报告文件添加其他信息,以便与其他 Nsight Systems 选项一起显示。

Nsight Systems 插件(预览)

什么是插件?

Nsight Systems 插件是独立的应用程序,可以与主应用程序一起进行性能分析,也可以在系统范围的性能分析中不使用主应用程序。插件发出的 NVTX 事件与主应用程序事件显示在同一时间线上。此外,任何 stdout 和 stderr 流都以与目标应用程序相同的方式捕获。

要使插件可用于性能分析,请创建一个包含清单文件 nsys-plugin.yaml 的目录,然后将其放置在 Nsight Systems 目标 CLI 二进制文件旁边的 “plugins” 目录中。清单文件描述了插件及其配置。

清单文件内容

清单文件是一个 YAML 文件,包含以下必需字段

PluginName: SamplePlugin
ExecutablePath: PluginExecutableRelativeToManifest
Description: This is a sample plugin.

如何启动插件

nsys profilensys start 命令中支持插件。插件进程由 Nsight Systems 启动,就像它是目标应用程序一样,并在性能分析结束时终止。可以通过使用多个 --enable 选项来启动同一插件的多个实例。

如何将参数传递给插件

要将参数传递给插件,请在启动目标应用程序时,在插件名称后的 --enable 选项中指定它们。参数应仅用逗号分隔(无空格)。逗号可以使用反斜杠 \\ 转义。反斜杠本身可以用另一个反斜杠 \\\\ 转义。要在参数中包含空格,请将参数用双引号 " 括起来。

有关示例,请参阅关于 Amazon AWS 弹性 Fabric 适配器 (EFA) 网络计数器 的章节。

支持的平台

目前,x86_64 和 arm64 Linux 上支持插件。

示例插件

您可以查看 Nsight Systems 安装路径,例如 /opt/nvidia/nsight-systems/2024.5.1/target-linux-x64,在 samples 目录下的示例插件的源代码。

NetworkPlugin.cpp 源文件是与 Nsight Systems 以二进制形式一起提供的 network_interface 插件的精确源代码。用户可以修改此插件或将其用作指南来创建自己的插件,用于分析其预期的指标来源。

导入 NVTXT

ImportNvtxt 是一个实用程序,允许将 NVTXT 文件转换为 Nsight Systems 报告文件 (*.nsys-rep) 或将其与现有报告文件合并。

注意

NvtxtImport 支持自定义 TimeBase 值。仅支持以下值

  • 手动 — 时间戳使用绝对值设置。

  • 相对 — 时间戳使用相对于要与 NVTXT 文件合并的报告文件的相对值设置。

  • ClockMonotonicRaw — NVTXT 文件中的时间戳值被认为是在与要使用 clock_gettime(CLOCK_MONOTONIC_RAW, ...) 调用与 NVTXT 合并的报告文件相同的目标上收集的。

  • CNTVCT — NVTXT 文件中的时间戳值被认为是在

    与要使用 CNTVCT 值与 NVTXT 合并的报告文件相同的目标上收集的。

您可以通过帮助消息获取用法信息。

打印帮助消息

-h [ --help ]

显示有关报告文件的信息

--cmd info -i [--input] arg

从现有 NVTXT 文件创建报告文件

--cmd create -n [--nvtxt] arg -o [--output] arg [-m [--mode] mode_name mode_args] [--target <Hw:Vm>] [--update_report_time]

将 NVTXT 文件合并到现有报告文件

--cmd merge -i [--input] arg -n [--nvtxt] arg -o [--output] arg [-m [--mode] mode_name mode_args] [--target <Hw:Vm>] [--update_report_time]

模式描述

  • lerp - 使用线性插值插入

    --mode lerp --ns_a arg --ns_b arg [--nvtxt_a arg --nvtxt_b arg]
    
  • lin - 使用线性方程插入

    --mode lin  --ns_a arg --freq arg [--nvtxt_a arg]
    

模式参数

  • ns_a - 纳秒值

  • ns_b - 纳秒值(大于 ns_a

  • nvtxt_a - 与 ns_a 纳秒对应的 nvtxt 文件的时间单位值

  • nvtxt_b - 与 ns_b 纳秒对应的 nvtxt 文件的时间单位值

  • freq - nvtxt 文件的定时器频率

  • --target <Hw:Vm> - 指定目标 ID,例如 --target 0:1

  • --update_report_time - 在

    合并时,如果需要,延长报告的性能分析会话时间。如果没有此选项,则在合并期间将跳过性能分析会话时间窗口之外的所有事件。

命令

信息

要查找报告的开始和结束时间,请使用 info 命令。

用法

ImportNvtxt --cmd info -i [--input] arg

示例

ImportNvtxt info Report.nsys-rep
Analysis start (ns) 83501026500000
Analysis end (ns)   83506375000000

创建

您可以使用现有的 NVTXT 通过 create 命令创建报告文件。

用法

ImportNvtxt --cmd create -n [--nvtxt] arg -o [--output] arg [-m [--mode] mode_name mode_args]

可用模式为

  • lerp — 使用线性插值插入。

  • lin — 使用线性方程插入。

lerp 模式的用法是

--mode lerp --ns_a arg --ns_b arg [--nvtxt_a arg --nvtxt_b arg]

使用

  • ns_a — 纳秒值。

  • ns_b — 纳秒值(大于 ns_a)。

  • nvtxt_a — 与 ns_a 纳秒对应的 nvtxt 文件的时间单位值。

  • nvtxt_b — 与 ns_b 纳秒对应的 nvtxt 文件的时间单位值。

如果未指定 nvtxt_anvtxt_b,则它们分别设置为 nvtxt 文件的最小和最大时间值。

lin 模式的用法是

--mode lin --ns_a arg --freq arg [--nvtxt_a arg]

使用

  • ns_a — 纳秒值。

  • freq — nvtxt 文件的定时器频率。

  • nvtxt_a — 与 ns_a 纳秒对应的 nvtxt 文件的时间单位值。

如果未指定 nvtxt_a,则将其设置为 nvtxt 文件的最小时间值。

示例

ImportNvtxt --cmd create -n Sample.nvtxt -o Report.nsys-rep

输出将是新生成的报告文件,该文件可以由 Nsight Systems 打开和查看。

合并

要将 NVTXT 文件与现有报告文件合并,请使用 merge 命令。

用法

ImportNvtxt --cmd merge -i [--input] arg -n [--nvtxt] arg -o [--output] arg [-m [--mode] mode_name mode_args]

可用模式为

  • lerp — 使用线性插值插入。

  • lin — 使用线性方程插入。

lerp 模式的用法是

--mode lerp --ns_a arg --ns_b arg [--nvtxt_a arg --nvtxt_b arg]

使用

  • ns_a — 纳秒值。

  • ns_b — 纳秒值(大于 ns_a)。

  • nvtxt_a — 与 ns_a 纳秒对应的 nvtxt 文件的时间单位值。

  • nvtxt_b — 与 ns_b 纳秒对应的 nvtxt 文件的时间单位值。

如果未指定 nvtxt_anvtxt_b,则它们分别设置为 nvtxt 文件的最小和最大时间值。

lin 模式的用法是

--mode lin  --ns_a arg --freq arg [--nvtxt_a arg]

使用

  • ns_a — 纳秒值。

  • freq — nvtxt 文件的定时器频率。

  • nvtxt_a — 与 ns_a 纳秒对应的 nvtxt 文件的时间单位值。

如果未指定 nvtxt_a,则将其设置为 nvtxt 文件的最小时间值。

<filename.nvtxt> 中的时间值假定为纳秒,如果未指定模式。

示例

ImportNvtxt --cmd merge -i Report.nsys-rep -n Sample.nvtxt -o NewReport.nsys-rep

在图形界面中读取您的报告

生成新报告

用户可以通过停止性能分析会话来生成新报告。如果性能分析会话已取消,则不会生成报告,并且所有收集的数据都将被丢弃。

将创建一个新的 .nsys-rep 文件,并将其放入与项目文件 (.qdproj) 相同的目录中。

打开现有报告

可以使用 文件 > 打开… 打开现有的 .nsys-rep 文件。

共享报告文件

报告文件 (.nsys-rep) 是自包含的,可以与 Nsight Systems 的其他用户共享。唯一的要求是始终使用相同或更新版本的 Nsight Systems 来打开报告文件。

项目文件 (.qdproj) 目前不可共享,因为它们包含报告文件的完整路径。

要快速导航到包含报告文件的目录,请在项目浏览器中右键单击它,然后在上下文菜单中选择 在文件夹中显示…

报告选项卡

在生成新报告或加载现有报告时,将创建一个新选项卡。报告选项卡最重要的部分是

  • 视图选择器 — 允许在多报告视图(对于单个报告不存在)、分析摘要时间线视图诊断摘要符号解析日志视图之间切换。

    Page selector
  • 时间线 — 这是显示所有图表的地方。

  • 函数表 — 位于时间线下方,它以多种方式显示有关目标应用程序中函数的统计信息。

此外,以下控件可用

  • 缩放滑块 — 允许您垂直缩放时间线上的图表。

分析摘要视图

此视图显示性能分析会话的摘要。特别是,查看用于生成此报告的项目配置非常有用。可以使用鼠标光标选择和复制此视图中的信息。

诊断摘要视图

此视图显示重要消息。其中一些是在性能分析会话期间生成的,而另一些是在报告中处理和分析数据时添加的。消息可以是以下类型之一

  • 信息性消息

  • 警告

  • 错误

为了引起对重要诊断消息的注意,摘要行显示在时间线视图的右上角

Diagnostics messages

可以使用鼠标光标选择和复制此视图中的信息。

符号解析日志视图

此视图显示与解析符号过程相关的所有消息。当时间线视图的符号表中的某些符号名称未解析时,它可能有助于调试问题。

时间线视图

时间线视图由两个主要控件组成:顶部的时间线和底部的包含事件视图和函数表的窗格。在某些情况下,当进程的采样未启用时,函数表可能为空并隐藏。

底部视图选择器设置底部窗格中显示的视图。

Bottom view selection

时间线

时间线是一个多功能的控件,左侧包含树状层次结构,中间包含行标签列,右侧包含相应的图表。可以使用时间线选项隐藏行标签列。

Timeline Options button

层次结构的内容取决于用于收集报告的项目设置。例如,如果某个功能未启用,则时间线上将不会显示相应的行。

要生成时间线屏幕截图而无需打开完整的图形界面,请使用命令

nsys-ui.exe --screenshot filename.nsys-rep

将鼠标悬停在图形界面中的元素上将弹出工具提示,以提供其他信息,例如该函数调用的参数或调用堆栈。可以通过悬停并右键单击以调出上下文菜单中的 复制工具提示 选项来复制工具提示

时间线导航

缩放和滚动

在 Nsight Systems 图形界面的右上角,您将看到此部分

scroll bar to set vertical scaling

滑块设置屏幕行的高度,放大镜将其重置为原始设置。

有很多方法可以在时间线上水平缩放和滚动。单击上面看到的键盘图标,将打开下面的对话框,其中解释了这些方法。

various options for zoom and scroll

时间线/事件关联

要在事件视图中显示跟踪事件,请右键单击时间线行,然后选择 在事件视图中显示 命令。所选行及其所有子行的事件将显示在事件视图中。请注意,显示的事件将对应于时间线中的当前缩放级别,放大或缩小将重置事件窗格过滤器。

如果已选择时间线行在事件视图中显示,则双击该行上的时间线项将自动滚动事件视图的内容,以使相应的事件视图项可见并选中它。如果该事件具有工具提示信息,它将显示在右侧窗格中。

同样,双击事件视图中的特定实例将在时间线中突出显示相应的事件。

行高

时间线中的几行使用高度作为对资源利用率百分比进行建模的一种方式。即使时间线完全缩小,这也使用户可以深入了解正在发生的事情。

various options for zoom and scroll

在此图中,您看到内核占用率有一个可变高度的彩色条。

Nsight Systems 计算屏幕特定像素宽度表示的时间段内的平均占用率。然后,它使用该平均值来设置彩色部分的顶部。因此,例如,如果内核在该时间片中处于活动状态的时间为 25%,则该条将向上延伸到行高的 25%。

为了清楚地区分,如果行高的百分比非零,但将表示为小于一个垂直像素,则 Nsight Systems 会将其显示为一个像素高。灰色高度表示该时间范围内的最大使用率。

此行高编码用于 CPU 利用率、线程和进程占用率、内核占用率和内存传输活动行。

行百分比

在上一张图中,您还看到 GPU 中的流行的前面有百分比。

显示在流前面的百分比表示此特定流占用的上下文运行时间比例。

% stream = 100.0 X streamUsage / contextUsage
streamUsage = total amount of time this stream is active on GPU
contextUsage = total amount of time all streams for this context are active on GPU

因此,“26% 流 1” 表示流 1 占其上下文总运行时间的 26%。

Total running time = sum of durations of all kernels and memory ops that
run in this context

时间线选项

我们强烈建议对大小和颜色使用操作系统/桌面默认设置,但是如果您想自己设置它们,可以使用 工具 > 选项 对话框进行设置。

以上操作将全局更改此图形界面的选项。也可以更改特定打开报告的某些选项。在视图选择器附近有一个 “选项…” 按钮

Timeline Options button

此按钮将显示一个对话框,允许显示/隐藏以下内容

  • 关联箭头;

  • 行标签;

  • CPU 占用率图表。

默认情况下,时间线将基于会话时间。如果您想切换到全局时间,请单击最左侧列顶端的小箭头以显示如下所示的下拉列表

system time dropdown

事件视图

事件视图提供了跟踪事件的表格显示。可以搜索和排序视图内容。

双击事件视图中的项目会自动将时间线视图聚焦在相应的时间线项目上。

在调试标记边界内发生的 API 调用、GPU 执行和调试标记将嵌套显示在该调试标记下。支持多级嵌套。

事件视图识别以下类型的调试标记

  • NVTX

  • Vulkan VK_EXT_debug_marker 标记,VK_EXT_debug_utils 标签

  • PIX 事件和标记

  • OpenGL KHR_debug 标记

Events View nested debug markers

您可以通过突出显示行,使用 ShiftCtrl 启用多选,从事件视图中复制和粘贴。右键单击所选内容将为您提供复制选项。

Events View copy selection

粘贴到文本中会为您提供制表符分隔的视图

Events View paste into notepad

粘贴到电子表格中会正确复制到行和列中

Events View paste into spreadsheet

函数表模式

Function table modes

函数表可以在三种模式下工作

  • 自顶向下视图 — 在此模式下,展开顶层函数会提供有关被调用函数的信息。顶层函数之一通常是您的应用程序的主函数,或运行时库定义的另一个入口点。

  • 自底向上视图 — 这是自顶向下视图的反向视图。在顶层,是采样分析器直接命中的函数。要探索通往这些函数的所有可能的调用链,您需要展开顶层函数的子树。

  • 平面视图 — 此视图枚举了分析器观察到的所有函数,即使它们从未被直接命中,而只是出现在调用堆栈的某个位置。此视图通常提供代码的哪些部分是 CPU 密集型的高级概述。

每种视图都有助于理解被分析应用程序的特定性能问题。例如

  • 当尝试查找可以优化的特定瓶颈函数时,应使用自底向上视图。通常,应检查最上面的几个函数。展开它们以了解它们在哪些上下文中被使用。

  • 要导航应用程序的调用树,并在通常情况下搜索消耗异常大量 CPU 时间的算法和代码部分时,应使用自顶向下视图。

  • 要快速评估应用程序的哪些部分或算法的高级部分消耗了大量的 CPU 时间,请使用平面视图。

自顶向下和自底向上视图具有自身总计列,而平面视图具有平面列。理解每列的含义非常重要

  • 自顶向下视图

    • 自身列表示执行此特定函数指令所花费的相对时间量。

    • 总计列显示执行此函数所花费的时间,包括从此函数调用的所有其他函数。同级行的总计值加起来等于父行的总计值,或者对于顶层行,为 100%。

  • 自底向上视图

    • 自身列对于顶层行,与自顶向下视图中一样,显示直接在此函数中花费了多少时间。所有顶层行的自身时间加起来为 100%。

    • 自身列对于子行,根据通往该函数的各种调用链分解父行的值。同级行的自身时间加起来等于父行的值。

  • 平面视图

    • 平面列显示此函数在调用堆栈的任何位置花费了多少时间。此列中的值不累加,也没有其他重要的关系。

注意

如果低影响函数已被过滤掉,则值可能无法正确加起来达到 100% 或父行的值。可以禁用此过滤。

符号表的内容与时间线紧密相关。用户可以在时间线上应用和修改过滤器,它们将影响符号表中显示的信息

  • 按线程过滤 — 与每个具有采样信息的线程相关联的时间线上都有一个复选框。符号表中仅表示选中复选框的线程。

  • 时间过滤 — 可以通过按住鼠标左键在时间线上设置时间过滤器,在时间线上感兴趣的区域上拖动,然后在下拉菜单中选择按选择过滤。在这种情况下,只有在选定时间范围内收集的采样信息才会被用于构建符号表。

注意

如果用于构建符号表的采样数据太少(例如,当采样率配置为低,并且基于时间的过滤使用的时间段很短时),则符号表中的数字在某些情况下可能不具有代表性或不准确。

函数表注释

最后分支记录与帧指针

用于收集回溯的两种可用机制是 Intel 最后分支记录 (LBR) 和帧指针。LBR 用于通过一组有限的硬件寄存器跟踪每个分支指令。它们可以配置为生成回溯,但基于 CPU 的微架构,其深度有限。收集 LBR 实际上是免费的,但可能没有您需要的那么深入,以便充分了解工作负载如何到达特定的指令指针 (IP)。

仅当二进制文件使用 -fno-omit-frame-pointer 编译器开关编译时,帧指针才起作用。要确定在 Linux 上运行的 x86_64 二进制文件上是否启用了帧指针,请使用 objdump -d [binary_file] 命令转储二进制文件的汇编代码,并在所有函数的开头查找此模式;

push   %rbp
mov    %rsp,%rbp

当二进制文件中提供帧指针时,将捕获完整的堆栈跟踪。请注意,应用程序经常使用并随操作系统一起提供的库(例如 libc)以发布模式生成,因此不包含帧指针。通常,当回溯包含来自系统库的地址时,由于缺少帧指针,回溯将无法进一步解析,因为帧指针轨迹变冷。

开发了一个简单的应用程序来显示差异。该应用程序调用函数 a(),它调用 b(),它调用 c(),等等。函数 z() 调用一个繁重的计算函数,名为 matrix_multiply()。几乎所有的 IP 样本都是在 matrix_multiple 执行时收集的。接下来的两个屏幕截图显示了帧指针和 LBR 之间的主要区别之一。

frame pointer backtrace
lbr backtrace

请注意,帧指针示例显示了完整的堆栈跟踪,而 LBR 示例由于 CPU 中 LBR 寄存器的数量有限,仅显示了部分堆栈。

内核样本

当在执行内核模式(即操作系统)函数时捕获 IP 样本时,该样本将显示一个以 0xffffffff 开头的地址,并映射到 [kernel.kallsyms] 模块。

kernel mode sample backtrace

[vdso]

当 CPU 正在虚拟动态共享对象中执行函数时,可能会收集样本。在这种情况下,样本将被解析(即映射)到 [vdso] 模块。vdso 手册页 提供了 vdso 的以下描述

The “vDSO“ (virtual dynamic shared object) is a small shared library
that the kernel automatically maps into the address space of all
user-space applications.  Applications usually do not need to concern
themselves with these details as the vDSO is most commonly called by
the C library.  This way you can code in the normal way using
standard functions and the C library will take care of using any
functionality that is available via the vDSO.

Why does the vDSO exist at all?  There are some system calls the
kernel provides that user-space code ends up using frequently, to the
point that such calls can dominate overall performance. This is due
both to the frequency of the call as well as the context-switch
overhead that results from exiting user space and entering the
kernel.

[未知]

当地址无法解析(即,无法映射到模块)时,将显示其在进程地址空间中的地址,并且其模块将被标记为 [未知]。

过滤器对话框

Filter dialog
  • 折叠未解析的行在某些二进制代码没有符号的情况下很有用。在这种情况下,由仅包含未解析符号的子树在自顶向下视图中会被折叠,因为它们提供的信息非常少。

  • 隐藏 CPU 使用率低于 X% 的函数对于大型应用程序很有用,在大型应用程序中,采样分析器仅命中许多函数几次。要过滤掉通常对于 CPU 性能瓶颈分析不重要的“长尾”,应选中此复选框。

时间线与函数表的使用示例

这是一个使用时间线和函数表以及指令指针 (IP)/回溯采样数据的示例演练

时间线

当在 Nsight Systems GUI 中打开收集结果时,有多种方法可以查看 CPU 分析数据 - 尤其是 CPU IP/回溯数据。

Timeline showing CPU IP/backtrace information

在时间轴中,可以在每个线程的时间轴下找到黄橙色标记,指示在该线程上收集 IP / 回溯样本的时刻 (例如,请参见上面“特定样本”框中的黄橙色标记)。将光标悬停在标记上将导致工具提示显示该样本的回溯。

在时间线下方是一个下拉列表,其中包含多个选项,包括事件视图、自顶向下视图、自底向上视图和平视图。所有这四个视图都可用于查看 CPU IP/回溯采样数据。

如果选择了自底向上视图,则这是时间线视图屏幕下半部分显示的采样摘要。请注意,摘要包括短语“使用了 65,022 个样本”,表明摘要了多少个样本。默认情况下,样本中少于 0.5% 的函数不会显示。使用 filter 按钮来修改该设置。

Timeline showing CPU IP/backtrace information

当采样数据被过滤时,采样摘要将总结所选样本。可以基于操作系统线程、基于时间或两者兼而有之来过滤样本。在上面,取消选中线程旁边的复选框会从采样摘要中删除其样本。在时间线上拖动光标并选择“过滤并放大”会选择在选定时间内收集的样本,如下所示。样本摘要包括短语“由于应用了过滤器,显示了 0.35%(225 个样本)的数据”,表明摘要结果中仅包含 225 个样本。

Timeline showing CPU IP/backtrace information, filtered

一次取消选择一个线程的复选框可能很乏味。单击线程旁边的向下箭头,然后选择“仅显示此线程”以取消选择除该线程之外的所有线程。

How to deselect all threads except one

如果在时间线视图的下拉列表中选择了事件视图,请右键单击特定线程,然后选择“在事件视图中显示”。在事件视图中将显示在该线程执行时收集的样本。双击事件视图中的特定样本会导致时间线显示何时收集该样本;请参阅下面的绿色框。该样本的回溯也显示在事件视图中。

events view

回溯

要了解用于到达采样摘要中显示的特定函数的代码路径,请右键单击函数并选择“展开”。

expand backtrace

上面显示了展开函数回溯时会发生什么。在本例中,PCQueuePop 函数是从 CmiGetNonLocal 函数调用的,CmiGetNonLocal 函数由 CsdNextMessage 函数调用,CsdNextMessage 函数由 CsdScheduleForever 函数调用。[最大深度] 字符串标记收集的回溯的结尾。

zoom in expand backtrace

请注意,默认情况下,少于总回溯 0.5% 的回溯会被隐藏。此行为可能会使百分比结果难以理解。如果显示所有回溯(即,禁用过滤器),则结果看起来非常不同,并且数字会按预期相加。要禁用过滤器,请单击“过滤器…”按钮并取消选中隐藏 CPU 使用率低于 X% 的函数复选框。

no function filter backtraces

禁用过滤器后,将重新计算回溯。请注意,您可能需要右键单击该函数并再次选择展开,以使所有回溯都显示出来。

reset backtraces

当收集回溯时,整个样本(IP 和回溯)被视为单个样本。如果两个样本具有完全相同的 IP 和回溯,则它们在最终结果中求和。如果两个样本具有相同的 IP 但回溯不同,则它们将显示为具有相同的叶节点(即 IP)但回溯不同。如前所述,当回溯结束时,它们会用 [最大深度] 字符串标记(除非回溯可以追溯到其来源;例如,__libc_start_main),或者回溯因 IP 无法解析而中断。

在上面,叶函数是 PCQueuePop。在本例中,有 11 个不同的回溯导致 PCQueuPop — 所有这些回溯都以 [最大深度] 结尾。例如,主要路径是 PCQueuPop<-CmiGetNonLocal<-CsdNextmessage<-CsdScheduleForever<-[Max depth]。此路径占所有样本的 5.67%,如第 5 行(红色数字)所示。第二主要路径是 PCQueuPop<-CmiGetNonLocal<-[Max depth],占所有样本的 0.44%,如第 24 行(红色数字)所示。路径 PCQueuPop<-CmiGetNonLocal<-CsdNextmessage<-CsdScheduleForever<-Sequencer::integrate(int)<-[Max depth] 占样本的 0.03%,如第 7 行(红色数字)所示。将 [最大深度] 行(第 5、7、9、13、15、16、17、19、21、23 和 24 行)中显示的百分比相加,得出 7.04%,这等于与第 0 行(红色数字)中显示的 PCQueuePop 函数关联的样本百分比。

多报告时间线视图

在单独的窗格中查看多个报告

您可以选择在单独的窗格中查看两个或多个 Nsight Systems 结果文件。为此,请在选项卡中打开每个文件。抓住其中一个选项卡并取消停靠

One tab in gui is floating above the screen

当您将光标悬停在 GUI 中间时,您将看到用于停靠窗格的选项

Arrows in the GUI show where you can dock the tab

多个报告可以停靠在窗口中。

Picture of GUI with four reports docked.

在同一时间线中查看多个报告

您可以在单个时间线中打开多个报告。可以使用以下方法之一完成此操作

  • 在主菜单中选择文件 > 打开…,然后选择多个报告文件。

  • 在主菜单中选择文件 > 新建多报告视图,添加您想要在多报告视图中打开的报告文件,然后单击“应用”按钮。

    New multi-report view

多报告视图包含简单的编辑器,允许添加/删除一些报告文件,并在应用该组报告后将它们全部加载到单个时间线上。

Multi-report-view

加载报告后,可以使用视图选择器再次打开多报告视图,更改报告集,然后单击“应用”按钮以使用新的报告集重新加载时间线。

所选的报告集可以保存为多报告视图文档,并且稍后可以打开以再次加载相同的集合。

时间同步

当将多个报告加载到单个时间线中时,需要调整它们之间的时间戳,以便在同一时间发生的事件看起来是对齐的。

Nsight Systems 可以根据收集开始时间前后记录的 UTC 时间自动调整时间戳。当没有其他更精确的方法可用时,默认使用此方法。此时间可以在报告文件的分析摘要页面中看到为 t=0 时的 UTC 时间。请参阅您的操作系统文档,了解如何使用网络时间协议 (NTP) 同步软件时钟。基于 NTP 的时间同步不是很精确,典型误差在一个到数十毫秒的量级。

在同一物理机器上收集的报告可以使用基于 时间戳计数器 (TSC) 值的同步。这些是特定于平台的计数器,通常在用户空间应用程序中使用 x86_64 架构上的 RDTSC 指令或通过读取 Arm64 上的 CNTVCT 寄存器来访问。它们的以纳秒为单位转换的值可以在报告文件的分析摘要页面中看到为 t=0 时的 TSC 。使用 TSC 值同步的报告可以以纳秒级精度对齐。

当 Nsight Systems 检测到报告来自同一目标,并且相同的 TSC 值对应于非常接近的 UTC 时间时,会自动激活基于 TSC 的时间同步。当显式设置环境变量 NSYS_HW_ID 对于两个报告都相同时,或者当目标主机名相同且 NSYS_HW_ID 未为任一目标设置时,目标被认为是相同的。UTC 和 TSC 时间偏移之间的差异必须小于 1 秒才能选择基于 TSC 的时间同步。

要了解使用了哪种同步方法,请导航到添加的报告的分析摘要选项卡,并检查目标的 报告对齐源 属性。请注意,第一个报告将没有此参数。

TODO TODO

当将多个报告加载到单个时间线时,始终建议首先检查时间同步是否正确,方法是放大预期对齐的同步或通信事件。

时间线层次结构

当报告添加到同一时间线时,Nsight Systems 将按照上述方式按时间戳自动对齐它们。如果您希望 Nsight Systems 也识别匹配的进程或硬件信息,您需要在报告收集时(例如,在使用 “nsys profile …” 命令时)设置环境变量 NSYS_SYSTEM_IDNSYS_HW_ID,如下所示。

当将一对给定的报告文件加载到同一时间线时,它们将以以下配置之一合并

  • 不同硬件 — 当报告来自不同的物理机器,并且这些报告中没有共享硬件资源时使用。当既未设置 NSYS_HW_ID 也未设置 NSYS_SYSTEM_ID 且目标主机名不同或不存在时,将使用此模式,并且可以通过指定不同的 NSYS_HW_ID 值来额外指示此模式。

  • 不同系统,相同硬件 — 当报告在同一物理机器上的不同虚拟机 (VM) 或容器上收集时使用。要激活此模式,请在收集报告时指定相同的 NSYS_HW_ID 值。

  • 相同系统 — 当报告在同一操作系统(或容器)环境中收集时使用。在此模式下,进程标识符 (PID) 100 将在两个报告中都指向相同的进程。要手动激活此模式,请在收集报告时指定相同的 NSYS_SYSTEM_ID 值。当目标主机名相同且既未提供 NSYS_HW_ID 也未提供 NSYS_SYSTEM_ID 时,将自动选择此模式。

以下图表演示了典型案例

TODO

示例:MPI

一个典型的场景是使用 MPI 实现之一运行计算作业。可以单独分析应用程序的每个实例,从而生成多个报告文件。例如

# Run MPI job without the profiler:
mpirun <mpirun-options> ./myApp
# Run MPI job and profile each instance of the application:
mpirun <mpirun-options> nsys profile -o report-%p <nsys-options>./myApp

当每个 MPI 进程在不同的节点上运行时,上面的命令可以正常工作,因为将使用默认的配对模式(不同硬件)。

当所有 MPI 进程仅在 localhost 上运行时,请使用此命令(值 “A” 是任意选择的,它可以是任何非空字符串)

NSYS_SYSTEM_ID=A mpirun <mpirun-options> nsys profile -o report-%p < nsys -options> ./myApp

为了方便起见,MPI 进程可以编码到报告文件名中。对于 Open MPI,请使用以下命令根据全局进程值创建报告文件

mpirun <mpirun-options> nsys profile -o report-%q{OMPI_COMM_WORLD_RANK} < nsys -options> ./myApp

基于 MPICH 的实现设置环境变量 PMI_RANK,而 Slurm (srun) 在 SLURM_PROCID 中提供全局 MPI 进程。

在时间线中同步多个报告的限制

  • 仅完全支持使用 Nsight Systems 2021.3 及更高版本收集的报告文件。

  • 尚无法将在单个 CLI 分析会话中收集的顺序报告加载到单个时间线中。

附加图表 - 火焰图

从 Nsight Systems 报告生成火焰图不是内置功能,但可以使用位于 <nsys-install-dir>/<host-folder>/Scripts/Flamegraph 的脚本 stackcollapse_nsys.py 从 Nsight Systems 报告创建此类图表。在该位置还有一个包含其他使用详情的 README.md 文件

要求

用法

从 Linux 上的 Nsight Systems 报告文件生成火焰图

python3 stackcollapse_nsys.py report.nsys-rep | ./flamegraph.pl > result_flamegraph.svg

从 Windows 上的 Nsight Systems 报告文件生成火焰图

PowerShell -Command "python stackcollapse_nsys.py report.nsys-rep | perl flamegraph.pl > result_flamegraph.svg"

该脚本将报告导出到 SQLite,查询 CPU 样本并将它们作为 flamegraph.pl 的输入传递。

参数

以下参数可以传递给脚本

短选项

长选项

默认值

开关描述

--nsys

当前 Nsight Systems CLI 安装位置

Nsight Systems CLI 目录的路径(例如,/opt/nvidia/nsight-systems/2022.4.1/target-linux-x64)。

-o

--out

输出写入标准输出

包含适用于 flamegraph.pl 的数据的结果文件的路径。

--full_function_names

False

如果可用,则使用带有返回类型、参数和展开模板的完整函数名称。

注意

默认情况下,脚本尝试缩短函数定义(消除返回类型、参数和模板)。在某些复杂情况下,缩短可能会失败并返回完整的函数定义。要禁用缩短,可以使用 --full_function_names=False 参数。

这是一个从 Nsight Systems 报告生成的火焰图的示例。该程序是 GROMACS 的调试版本,在两个进程上运行,每个进程运行两个 OpenMP 线程。

Flamegraph generated from Nsight Systems collection

收集后分析

一旦您使用 Nsight Systems 进行了分析,就可以使用许多选项来分析收集的数据,以及以各种格式输出数据。这些选项可以从 CLI 或 GUI 获得。

可用的导出格式

SQLite 架构参考

Nsight Systems 能够从 .nsys-rep 结果文件导出 SQLite 数据库文件。从 CLI 中,使用 nsys export。从 GUI 中,调用 File->Export...

注意

.nsys-rep 报告格式是 Nsight Systems 唯一应被视为向前兼容的数据格式。SQLite 架构将来可能会更改。

可以使用 sqlite3 工具内置命令 .schema 获取具体数据库的架构。sqlite3 工具可以位于 Nsight Systems 安装的目标或主机目录中。

注意

目前,表是延迟创建的,因此并非文档中描述的每个表都会出现在特定的数据库中。这将在产品的未来版本中更改。如果您想要所有可能表的完整架构,请在导出阶段使用 nsys export --lazy=false

目前,为导出数据库中的每种数据类型创建一个表。由于导出数据的使用模式可能差异很大,并且尚未建立默认用例,因此不会创建索引或额外的约束。相反,请参阅 SQLite 示例部分,以获取常见配方列表。这可能会在产品的未来版本中更改。

要检查导出的 SQLite 文件的版本,请检查 META_DATA_EXPORT 表中的 EXPORT_SCHEMA_VERSION 的值。架构版本是一个常见的三值主版本号/次版本号/微版本号。第一个值或主版本值指示数据库的总体格式,并且仅在整个数据库格式进行重大重写或重构时才会更改。假设如果主版本更改,则所有脚本或查询都将中断。中间值或次版本值会在任何时候发生更局部但可能具有破坏性的更改(例如,重命名现有列或更改现有列的类型)时更改。最后一个值或微版本值会在任何时候进行添加(例如,新的表或列)时更改,这些添加在使用编写良好的最佳实践查询时应该不会引入任何破坏性更改。

这是截至 2024.7 版本的架构,架构版本为 3.16.3。

CREATE TABLE StringIds (
    -- Consolidation of repetitive string values.

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- ID reference value.
    value                       TEXT      NOT NULL                     -- String value.
);
CREATE TABLE ANALYSIS_FILE (
    -- Analysis file content

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- ID reference value.
    filename                    TEXT,                                  -- File path
    contentId                   INTEGER,                               -- REFERENCES StringIds(id) -- File content
    globalPid                   INTEGER   NOT NULL                     -- Serialized GlobalId.
);
CREATE TABLE ThreadNames (
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Thread name
    priority                    INTEGER,                               -- Priority of the thread.
    globalTid                   INTEGER                                -- Serialized GlobalId.
);
CREATE TABLE ProcessStreams (
    globalPid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    filenameId                  INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- File name
    contentId                   INTEGER   NOT NULL                     -- REFERENCES StringIds(id) -- Stream content
);
CREATE TABLE TARGET_INFO_SYSTEM_ENV (
    globalVid                   INTEGER,                               -- Serialized GlobalId.
    devStateName                TEXT      NOT NULL,                    -- Device state name.
    name                        TEXT      NOT NULL,                    -- Property name.
    nameEnum                    INTEGER   NOT NULL,                    -- Property enum value.
    value                       TEXT      NOT NULL                     -- Property value.
);
CREATE TABLE TARGET_INFO_NIC_INFO (
    GUID                        INTEGER   NOT NULL,                    -- Network interface GUID
    stateName                   TEXT      NOT NULL,                    -- Device state name
    nicId                       INTEGER   NOT NULL,                    -- Network interface Id
    name                        TEXT      NOT NULL,                    -- Network interface name
    deviceId                    INTEGER   NOT NULL,                    -- REFERENCES ENUM_NET_DEVICE_ID(id)
    vendorId                    INTEGER   NOT NULL,                    -- REFERENCES ENUM_NET_VENDOR_ID(id)
    linkLayer                   INTEGER   NOT NULL                     -- REFERENCES ENUM_NET_LINK_TYPE(id)
);
CREATE TABLE NIC_ID_MAP (
    -- Map between NIC info nicId and NIC metric globalId

    nicId                       INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_NIC_INFO(nicId)
    globalId                    INTEGER   NOT NULL                     -- REFERENCES NET_NIC_METRIC(globalId)
);
CREATE TABLE TARGET_INFO_SESSION_START_TIME (
    utcEpochNs                  INTEGER,                               -- UTC Epoch timestamp at start of the capture (ns).
    utcTime                     TEXT,                                  -- Start of the capture in UTC.
    localTime                   TEXT                                   -- Start of the capture in local time of target.
);
CREATE TABLE ANALYSIS_DETAILS (
    -- Details about the analysis session.

    globalVid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    duration                    INTEGER   NOT NULL,                    -- The total time span of the entire trace (ns).
    startTime                   INTEGER   NOT NULL,                    -- Trace start timestamp in nanoseconds.
    stopTime                    INTEGER   NOT NULL                     -- Trace stop timestamp in nanoseconds.
);
CREATE TABLE PMU_EVENT_REQUESTS (
    -- PMU event requests

    id                          INTEGER   NOT NULL,                    -- PMU event request.
    eventid                     INTEGER,                               -- PMU counter event id.
    source                      INTEGER   NOT NULL,                    -- REFERENCES ENUM_PMU_EVENT_SOURCE(id)
    unit_type                   INTEGER   NOT NULL,                    -- REFERENCES ENUM_PMU_UNIT_TYPE(id)
    event_name                  TEXT,                                  -- PMU counter unique name

    PRIMARY KEY (id)
);
CREATE TABLE TARGET_INFO_GPU (
    vmId                        INTEGER   NOT NULL,                    -- Serialized GlobalId.
    id                          INTEGER   NOT NULL,                    -- Device ID.
    name                        TEXT,                                  -- Device name.
    busLocation                 TEXT,                                  -- PCI bus location.
    isDiscrete                  INTEGER,                               -- True if discrete, false if integrated.
    l2CacheSize                 INTEGER,                               -- Size of L2 cache (B).
    totalMemory                 INTEGER,                               -- Total amount of memory on the device (B).
    memoryBandwidth             INTEGER,                               -- Amount of memory transferred (B).
    clockRate                   INTEGER,                               -- Clock frequency (Hz).
    smCount                     INTEGER,                               -- Number of multiprocessors on the device.
    pwGpuId                     INTEGER,                               -- PerfWorks GPU ID.
    uuid                        TEXT,                                  -- Device UUID.
    luid                        INTEGER,                               -- Device LUID.
    chipName                    TEXT,                                  -- Chip name.
    cuDevice                    INTEGER,                               -- CUDA device ID.
    ctxswDevPath                TEXT,                                  -- GPU context switch device node path.
    ctrlDevPath                 TEXT,                                  -- GPU control device node path.
    revision                    INTEGER,                               -- Revision number.
    nodeMask                    INTEGER,                               -- Device node mask.
    constantMemory              INTEGER,                               -- Memory available on device for __constant__ variables (B).
    maxIPC                      INTEGER,                               -- Maximum instructions per count.
    maxRegistersPerBlock        INTEGER,                               -- Maximum number of 32-bit registers available per block.
    maxShmemPerBlock            INTEGER,                               -- Maximum optin shared memory per block.
    maxShmemPerBlockOptin       INTEGER,                               -- Maximum optin shared memory per block.
    maxShmemPerSm               INTEGER,                               -- Maximum shared memory available per multiprocessor (B).
    maxRegistersPerSm           INTEGER,                               -- Maximum number of 32-bit registers available per multiprocessor.
    threadsPerWarp              INTEGER,                               -- Warp size in threads.
    asyncEngines                INTEGER,                               -- Number of asynchronous engines.
    maxWarpsPerSm               INTEGER,                               -- Maximum number of warps per multiprocessor.
    maxBlocksPerSm              INTEGER,                               -- Maximum number of blocks per multiprocessor.
    maxThreadsPerBlock          INTEGER,                               -- Maximum number of threads per block.
    maxBlockDimX                INTEGER,                               -- Maximum X-dimension of a block.
    maxBlockDimY                INTEGER,                               -- Maximum Y-dimension of a block.
    maxBlockDimZ                INTEGER,                               -- Maximum Z-dimension of a block.
    maxGridDimX                 INTEGER,                               -- Maximum X-dimension of a grid.
    maxGridDimY                 INTEGER,                               -- Maximum Y-dimension of a grid.
    maxGridDimZ                 INTEGER,                               -- Maximum Z-dimension of a grid.
    computeMajor                INTEGER,                               -- Major compute capability version number.
    computeMinor                INTEGER,                               -- Minor compute capability version number.
    smMajor                     INTEGER,                               -- Major multiprocessor version number.
    smMinor                     INTEGER                                -- Minor multiprocessor version number.
);
CREATE TABLE TARGET_INFO_XMC_SPEC (
    vmId                        INTEGER   NOT NULL,                    -- Serialized GlobalId.
    clientId                    INTEGER   NOT NULL,                    -- Client ID.
    type                        TEXT      NOT NULL,                    -- Client type.
    name                        TEXT      NOT NULL,                    -- Client name.
    groupId                     TEXT      NOT NULL                     -- Client group ID.
);
CREATE TABLE TARGET_INFO_PROCESS (
    processId                   INTEGER   NOT NULL,                    -- Process ID.
    openGlVersion               TEXT      NOT NULL,                    -- OpenGL version.
    correlationId               INTEGER   NOT NULL,                    -- Correlation ID of the kernel.
    nameId                      INTEGER   NOT NULL                     -- REFERENCES StringIds(id) -- Function name
);
CREATE TABLE TARGET_INFO_NVTX_CUDA_DEVICE (
    name                        TEXT      NOT NULL,                    -- CUDA device name assigned using NVTX.
    hwId                        INTEGER   NOT NULL,                    -- Hardware ID.
    vmId                        INTEGER   NOT NULL,                    -- VM ID.
    deviceId                    INTEGER   NOT NULL                     -- Device ID.
);
CREATE TABLE TARGET_INFO_NVTX_CUDA_CONTEXT (
    name                        TEXT      NOT NULL,                    -- CUDA context name assigned using NVTX.
    hwId                        INTEGER   NOT NULL,                    -- Hardware ID.
    vmId                        INTEGER   NOT NULL,                    -- VM ID.
    processId                   INTEGER   NOT NULL,                    -- Process ID.
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL                     -- Context ID.
);
CREATE TABLE TARGET_INFO_NVTX_CUDA_STREAM (
    name                        TEXT      NOT NULL,                    -- CUDA stream name assigned using NVTX.
    hwId                        INTEGER   NOT NULL,                    -- Hardware ID.
    vmId                        INTEGER   NOT NULL,                    -- VM ID.
    processId                   INTEGER   NOT NULL,                    -- Process ID.
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    streamId                    INTEGER   NOT NULL                     -- Stream ID.
);
CREATE TABLE TARGET_INFO_CUDA_CONTEXT_INFO (
    nullStreamId                INTEGER   NOT NULL,                    -- Stream ID.
    hwId                        INTEGER   NOT NULL,                    -- Hardware ID.
    vmId                        INTEGER   NOT NULL,                    -- VM ID.
    processId                   INTEGER   NOT NULL,                    -- Process ID.
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    parentContextId             INTEGER,                               -- For green context, this is the parent context id.
    isGreenContext              INTEGER                                -- Is this a Green Context?
);
CREATE TABLE TARGET_INFO_CUDA_STREAM (
    streamId                    INTEGER   NOT NULL,                    -- Stream ID.
    hwId                        INTEGER   NOT NULL,                    -- Hardware ID.
    vmId                        INTEGER   NOT NULL,                    -- VM ID.
    processId                   INTEGER   NOT NULL,                    -- Process ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    priority                    INTEGER   NOT NULL,                    -- Priority of the stream.
    flag                        INTEGER   NOT NULL                     -- REFERENCES ENUM_CUPTI_STREAM_TYPE(id)
);
CREATE TABLE TARGET_INFO_WDDM_CONTEXTS (
    context                     INTEGER   NOT NULL,
    engineType                  INTEGER   NOT NULL,
    nodeOrdinal                 INTEGER   NOT NULL,
    friendlyName                TEXT      NOT NULL
);
CREATE TABLE TARGET_INFO_PERF_METRIC (
    id                          INTEGER   NOT NULL,                    -- Event or Metric ID value
    name                        TEXT      NOT NULL,                    -- Event or Metric name
    description                 TEXT      NOT NULL,                    -- Event or Metric description
    unit                        TEXT      NOT NULL                     -- Event or Metric measurement unit
);
CREATE TABLE TARGET_INFO_NETWORK_METRICS (
    metricsListId               INTEGER   NOT NULL,                    -- Metric list ID
    metricsIdx                  INTEGER   NOT NULL,                    -- List index of metric
    name                        TEXT      NOT NULL,                    -- Name of metric
    description                 TEXT      NOT NULL,                    -- Description of metric
    unit                        TEXT      NOT NULL                     -- Measurement unit of metric
);
CREATE TABLE TARGET_INFO_COMPONENT (
    componentId                 INTEGER   NOT NULL,                    -- Component ID
    name                        TEXT      NOT NULL,                    -- Component name
    instance                    INTEGER,                               -- Component instance
    parentId                    INTEGER                                -- Parent Component ID
);
CREATE TABLE NET_IB_DEVICE_INFO (
    networkId                   INTEGER   NOT NULL,                    -- The Device's Network ID
    guid                        INTEGER,                               -- Device Guid
    name                        TEXT,                                  -- Device Name
    des                         TEXT,                                  -- Device description
    lid                         INTEGER                                -- Device Lid
);
CREATE TABLE NET_IB_DEVICE_PORT_INFO (
    guid                        INTEGER,                               -- REFERENCES NET_IB_DEVICE_INFO(guid) -- Device Global Identifier
    portNumber                  INTEGER   NOT NULL,                    -- Internal Port Number
    portLabel                   TEXT      NOT NULL,                    -- Port Label
    portLid                     INTEGER   NOT NULL                     -- Port Lid
);
CREATE TABLE NET_IB_DEVICE_TYPE_MAP (
    guid                        INTEGER,                               -- REFERENCES NET_IB_DEVICE_INFO(guid) -- Device Global Identifier
    deviceType                  INTEGER   NOT NULL                     -- REFERENCES ENUM_NET_IB_DEVICE_TYPE(id)
);
CREATE TABLE META_DATA_CAPTURE (
    -- information about nsys capture parameters

    name                        TEXT      NOT NULL,                    -- Name of meta-data record
    value                       TEXT                                   -- Value of meta-data record
);
CREATE TABLE META_DATA_EXPORT (
    -- information about nsys export process

    name                        TEXT      NOT NULL,                    -- Name of meta-data record
    value                       TEXT                                   -- Value of meta-data record
);
CREATE TABLE ENUM_NSYS_EVENT_TYPE (
    -- Nsys event type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NSYS_EVENT_CLASS (
    -- Nsys event class labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NSYS_GENERIC_EVENT_SOURCE (
    -- Nsys generic event source labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NSYS_GENERIC_EVENT_GROUP (
    -- Nsys generic event group labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NSYS_GENERIC_EVENT_FIELD_TYPE (
    -- Nsys generic event field type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NSYS_GENERIC_EVENT_FIELD_ETW_PROPERTY (
    -- Nsys generic event field ETW property flag labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NSYS_GENERIC_EVENT_FIELD_ETW_TYPE (
    -- Nsys generic event field ETW type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NSYS_GENERIC_EVENT_FIELD_ETW_FLAGS (
    -- Nsys generic event field ETW map info flag labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_GPU_CTX_SWITCH (
    -- GPU context switch labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_MEMCPY_OPER (
    -- CUDA memcpy operation labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_MEM_KIND (
    -- CUDA memory kind labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_MEMPOOL_TYPE (
    -- CUDA mempool type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_MEMPOOL_OPER (
    -- CUDA mempool operation labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_DEV_MEM_EVENT_OPER (
    -- CUDA device mem event operation labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_KERNEL_LAUNCH_TYPE (
    -- CUDA kernel launch type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_SHARED_MEM_LIMIT_CONFIG (
    -- CUDA shared memory limit config labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_UNIF_MEM_MIGRATION (
    -- CUDA unified memory migration cause labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_UNIF_MEM_ACCESS_TYPE (
    -- CUDA unified memory access type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUDA_FUNC_CACHE_CONFIG (
    -- CUDA function cache config labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUPTI_STREAM_TYPE (
    -- CUPTI stream type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_CUPTI_SYNC_TYPE (
    -- CUPTI synchronization type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_STACK_UNWIND_METHOD (
    -- Stack unwind method labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_SAMPLING_THREAD_STATE (
    -- Sampling thread state labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_SCHEDULING_THREAD_BLOCK (
    -- Scheduling thread block labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENGL_DEBUG_SOURCE (
    -- OpenGL debug source labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENGL_DEBUG_TYPE (
    -- OpenGL debug type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENGL_DEBUG_SEVERITY (
    -- OpenGL debug severity labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_VULKAN_PIPELINE_CREATION_FLAGS (
    -- Vulkan pipeline creation feedback flag labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_D3D12_HEAP_TYPE (
    -- D3D12 heap type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_D3D12_PAGE_PROPERTY (
    -- D3D12 CPU page property labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_D3D12_HEAP_FLAGS (
    -- D3D12 heap flag labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_D3D12_CMD_LIST_TYPE (
    -- D3D12 command list type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENACC_DEVICE (
    -- OpenACC device type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENACC_EVENT_KIND (
    -- OpenACC event type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENMP_EVENT_KIND (
    -- OpenMP event kind labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENMP_THREAD (
    -- OpenMP thread labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENMP_DISPATCH (
    -- OpenMP dispatch labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENMP_SYNC_REGION (
    -- OpenMP sync region labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENMP_WORK (
    -- OpenMP work labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENMP_MUTEX (
    -- OpenMP mutex labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENMP_TASK_FLAG (
    -- OpenMP task flags labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_OPENMP_TASK_STATUS (
    -- OpenMP task status labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_SLI_TRANSER (
    -- OpenMP task status labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_DXGI_FORMAT (
    -- DXGI image format labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NVDRIVER_EVENT_ID (
    -- NV-Driver event it labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_WDDM_PAGING_QUEUE_TYPE (
    -- WDDM paging queue type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_WDDM_PACKET_TYPE (
    -- WDDM packet type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_WDDM_ENGINE_TYPE (
    -- WDDM engine type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_WDDM_INTERRUPT_TYPE (
    -- WDDM DMA interrupt type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_WDDM_VIDMM_OP_TYPE (
    -- WDDM VidMm operation type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NET_LINK_TYPE (
    -- NIC link layer labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NET_DEVICE_ID (
    -- NIC PCIe device id labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NET_VENDOR_ID (
    -- NIC PCIe vendor id labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_ETW_MEMORY_TRANSFER_TYPE (
    -- memory transfer type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_PMU_EVENT_SOURCE (
    -- PMU event source labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_PMU_UNIT_TYPE (
    -- PMU unit type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_VIDEO_ENGINE_TYPE (
    -- Video engine type id labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_VIDEO_ENGINE_CODEC (
    -- Video engine codec labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_DIAGNOSTIC_SEVERITY_LEVEL (
    -- Diagnostic message severity level labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_DIAGNOSTIC_SOURCE_TYPE (
    -- Diagnostic message source type labels

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_DIAGNOSTIC_TIMESTAMP_SOURCE (
    -- Diagnostic message timestamp source lables

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NET_IB_DEVICE_TYPE (
    -- network device types

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE ENUM_NET_IB_CONGESTION_EVENT_TYPE (
    -- IB Switch congestion event types

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- Enum numerical value.
    name                        TEXT,                                  -- Enum symbol name.
    label                       TEXT                                   -- Enum human name.
);
CREATE TABLE GENERIC_EVENT_SOURCES (
    -- Generic event source modules

    sourceId                    INTEGER   NOT NULL   PRIMARY KEY,      -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event source name
    timeSourceId                INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_GENERIC_EVENT_SOURCE(id)
    sourceGroupId               INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_GENERIC_EVENT_GROUP(id)
    hyperType                   TEXT,                                  -- Hypervisor Type
    hyperVersion                TEXT,                                  -- Hypervisor Version
    hyperStructPrefix           TEXT,                                  -- Hypervisor Struct Prefix
    hyperMacroPrefix            TEXT,                                  -- Hypervisor Macro Prefix
    hyperFilterFlags            INTEGER,                               -- Hypervisor Custom Filter Flags
    hyperDomain                 TEXT,                                  -- Hypervisor Domain
    data                        TEXT                                   -- JSON encoded generic event source description.
);
CREATE TABLE GENERIC_EVENT_TYPES (
    -- Generic event type/schema descriptions.

    typeId                      INTEGER   NOT NULL   PRIMARY KEY,      -- Serialized GlobalId.
    sourceId                    INTEGER   NOT NULL,                    -- REFERENCES GENERIC_EVENT_SOURCES(sourceId)
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event type name
    hyperComment                TEXT,                                  -- Event Type Hypervisor Comment
    ftraceFormat                TEXT,                                  -- Event Type FTrace Format
    etwProviderId               INTEGER,                               -- Event Type ETW Provider Id
    etwProviderNameId           INTEGER,                               -- Event Type ETW Provider Name Id
    etwTaskId                   INTEGER,                               -- Event Type ETW Task Id
    etwTaskNameId               INTEGER,                               -- Event Type ETW Task Name Id
    etwEventId                  INTEGER,                               -- Event Type ETW Event Id
    etwVersion                  INTEGER,                               -- Event Type ETW Version
    etwGuidHigh                 INTEGER,                               -- Event Type ETW GUID high
    etwGuidLow                  INTEGER,                               -- Event Type ETW GUID low
    etwGuid                     TEXT,                                  -- ETW Provider GUID.
    data                        TEXT                                   -- JSON encoded generic event type description.
);
CREATE TABLE GENERIC_EVENT_TYPE_FIELDS (
    -- Generic event type/schema individual data field descriptions.

    typeId                      INTEGER   NOT NULL,                    -- Serialized GlobalId.
    fieldIdx                    INTEGER   NOT NULL,                    -- Index of type field
    fieldNameId                 INTEGER   NOT NULL,                    -- Name of field.
    offset                      INTEGER   NOT NULL,                    -- Field alignment offset size, in bytes.
    size                        INTEGER   NOT NULL,                    -- Field size, in bytes.
    type                        INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_GENERIC_EVENT_FIELD_TYPE(id)
    hyperTypeName               TEXT,                                  -- Event Field Hypervisor Type Name
    hyperFormat                 TEXT,                                  -- Event Field Hypervisor Format
    hyperComment                TEXT,                                  -- Event Field Hypervisor Comment
    ftracePrefix                TEXT,                                  -- Event Field FTrace Prefix
    ftraceSuffix                TEXT,                                  -- Event Field FTrace Suffix
    etwFlags                    INTEGER,                               -- REFERENCES ENUM_NSYS_GENERIC_EVENT_FIELD_ETW_PROPERTY(id)
    etwCountFieldIndex          INTEGER,                               -- Event Field ETW Count Field Index
    etwLengthFieldIndex         INTEGER,                               -- Event Field ETW Length Field Index
    etwType                     INTEGER,                               -- REFERENCES ENUM_NSYS_GENERIC_EVENT_FIELD_ETW_TYPE(id)
    etwMapInfoFlags             INTEGER,                               -- REFERENCES ENUM_NSYS_GENERIC_EVENT_FIELD_ETW_FLAGS(id)
    etwOrderedFieldIndex        INTEGER                                -- Event Field ETW Ordered Field Index
);
CREATE TABLE GENERIC_EVENT_TYPE_FIELD_MAP (
    -- Generic event ENUM data.  Mostly used by ETW.

    typeId                      INTEGER   NOT NULL,                    -- Serialized GlobalId.
    fieldIdx                    INTEGER   NOT NULL,                    -- Index of type field
    enum                        INTEGER   NOT NULL,                    -- Event Field ETW Map Info enum.
    name                        TEXT      NOT NULL,                    -- Event Field ETW Map Info Name.
    nameId                      INTEGER   NOT NULL                     -- Event Field ETW Map Info Name Id.
);
CREATE TABLE GENERIC_EVENTS (
    -- Dynamic or unstructured event data.

    genericEventId              INTEGER   NOT NULL   PRIMARY KEY,      -- Id of particular generic event
    rawTimestamp                INTEGER   NOT NULL,                    -- Raw event timestamp recorded during profiling.
    timestamp                   INTEGER   NOT NULL,                    -- Event timestamp converted to the profiling session timeline.
    typeId                      INTEGER   NOT NULL,                    -- REFERENCES GENERIC_EVENT_TYPES(typeId)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    data                        TEXT                                   -- JSON encoded event data.
);
CREATE TABLE GENERIC_EVENT_DATA (
    -- GENERIC_EVENTS data values.

    genericEventId              INTEGER   NOT NULL,                    -- REFERENCES GENERIC_EVENTS(genericEventId)
    fieldIdx                    INTEGER   NOT NULL,                    -- Index of type field
    intVal                      INTEGER,                               -- Integer value, signed
    uintVal                     INTEGER,                               -- Integer value, unsigned
    floatVal                    REAL,                                  -- Floating point value, 32-bit
    doubleVal                   REAL                                   -- Floating point value, 64-bit
);
CREATE TABLE ETW_PROVIDERS (
    -- Names and identifiers of ETW providers captured in the report.

    providerId                  INTEGER   NOT NULL   PRIMARY KEY,      -- Provider ID.
    providerNameId              INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Provider name
    guid                        TEXT      NOT NULL                     -- ETW Provider GUID.
);
CREATE TABLE ETW_TASKS (
    -- Names and identifiers of ETW tasks captured in the report.

    taskNameId                  INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Task name
    taskId                      INTEGER   NOT NULL,                    -- The event task ID.
    providerId                  INTEGER   NOT NULL                     -- Provider ID.
);
CREATE TABLE ETW_EVENTS (
    -- Raw ETW events captured in the report.

    rawTimestamp                INTEGER   NOT NULL,                    -- Raw event timestamp recorded during profiling.
    timestamp                   INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    typeId                      INTEGER   NOT NULL,                    -- REFERENCES GENERIC_EVENT_TYPES(typeId)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    opcode                      INTEGER,                               -- The event opcode.
    data                        TEXT      NOT NULL                     -- JSON encoded event data.
);
CREATE TABLE TARGET_INFO_GPU_METRICS (
    -- GPU Metrics, metric names and ids.

    typeId                      INTEGER   NOT NULL,                    -- REFERENCES GENERIC_EVENT_TYPES(typeId)
    sourceId                    INTEGER   NOT NULL,                    -- REFERENCES GENERIC_EVENT_SOURCES(sourceId)
    typeName                    TEXT      NOT NULL,                    -- Name of event type.
    metricId                    INTEGER   NOT NULL,                    -- Id of metric in event; not assumed to be stable.
    metricName                  TEXT      NOT NULL                     -- Definitive name of metric.
);
CREATE TABLE GPU_METRICS (
    -- GPU Metrics, events and values.

    rawTimestamp                INTEGER   NOT NULL,                    -- Raw event timestamp recorded during profiling.
    timestamp                   INTEGER   NOT NULL,                    -- Event timestamp (ns).
    typeId                      INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_GPU_METRICS(typeId) and GENERIC_EVENT_TYPES(typeId)
    metricId                    INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_GPU_METRICS(metricId)
    value                       INTEGER   NOT NULL                     -- Counter data value
);
CREATE TABLE TARGET_INFO_SOC_METRICS (
    -- SoC Metrics, metric names and ids.

    typeId                      INTEGER   NOT NULL,                    -- REFERENCES GENERIC_EVENT_TYPES(typeId)
    sourceId                    INTEGER   NOT NULL,                    -- REFERENCES GENERIC_EVENT_SOURCES(sourceId)
    typeName                    TEXT      NOT NULL,                    -- Name of event type.
    metricId                    INTEGER   NOT NULL,                    -- Id of metric in event; not assumed to be stable.
    metricName                  TEXT      NOT NULL                     -- Definitive name of metric.
);
CREATE TABLE SOC_METRICS (
    -- SoC Metrics, events and values.

    rawTimestamp                INTEGER   NOT NULL,                    -- Raw event timestamp recorded during profiling.
    timestamp                   INTEGER   NOT NULL,                    -- Event timestamp (ns).
    typeId                      INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_SOC_METRICS(typeId) and GENERIC_EVENT_TYPES(typeId)
    metricId                    INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_GPU_METRICS(metricId)
    value                       INTEGER   NOT NULL                     -- Counter data value
);
CREATE TABLE MPI_COMMUNICATORS (
    -- Identification of MPI communication groups.

    rank                        INTEGER,                               -- Active MPI rank
    timestamp                   INTEGER,                               -- Time of MPI communicator creation.
    commHandle                  INTEGER,                               -- MPI communicator handle.
    parentHandle                INTEGER,                               -- MPI communicator handle.
    localRank                   INTEGER,                               -- Local MPI rank in a communicator.
    size                        INTEGER,                               -- MPI communicator size.
    groupRoot                   INTEGER,                               -- Root rank (global) in MPI communicator.
    groupRootUid                INTEGER,                               -- Group root's communicator ID.
    members                     TEXT                                   -- MPI communicator members (index is global rank).
);
CREATE TABLE NVTX_PAYLOAD_SCHEMAS (
    -- NVTX payload schema attributes.

    domainId                    INTEGER,                               -- User-controlled ID that can be used to group events.
    schemaId                    INTEGER,                               -- Identifier of the payload schema.
    name                        TEXT,                                  -- Schema name.
    type                        INTEGER,                               -- Schema type.
    flags                       INTEGER,                               -- Schema flags.
    numEntries                  INTEGER,                               -- Number of payload schema entries.
    payloadSize                 INTEGER,                               -- Size of the static payload.
    alignTo                     INTEGER                                -- Field alignment in bytes.
);
CREATE TABLE NVTX_PAYLOAD_SCHEMA_ENTRIES (
    -- NVTX payload schema entries.

    domainId                    INTEGER   NOT NULL,                    -- User-controlled ID that can be used to group events.
    schemaId                    INTEGER   NOT NULL,                    -- Identifier of the payload schema.
    idx                         INTEGER   NOT NULL,                    -- Index of the entry in the payload schema.
    flags                       INTEGER,                               -- Payload entry flags.
    type                        INTEGER,                               -- Payload entry type.
    name                        TEXT,                                  -- Label of the payload entry.
    description                 TEXT,                                  -- Description of the payload entry.
    arrayOrUnionDetail          INTEGER,                               -- Array length (index) or selected union member.
    offset                      INTEGER                                -- Entry offset in the binary data in bytes.
);
CREATE TABLE NVTX_PAYLOAD_ENUMS (
    -- NVTX payload enum attributes.

    domainId                    INTEGER,                               -- User-controlled ID that can be used to group events.
    schemaId                    INTEGER,                               -- Identifier of the payload schema.
    name                        TEXT,                                  -- Schema name.
    numEntries                  INTEGER,                               -- Number of entries in the enum.
    size                        INTEGER                                -- Size of enumeration type in bytes.
);
CREATE TABLE NVTX_PAYLOAD_ENUM_ENTRIES (
    -- NVTX payload enum entries.

    domainId                    INTEGER   NOT NULL,                    -- User-controlled ID that can be used to group events.
    schemaId                    INTEGER   NOT NULL,                    -- Identifier of the payload schema.
    idx                         INTEGER   NOT NULL,                    -- Index of the entry in the payload schema.
    name                        TEXT,                                  -- Name of the enum value.
    value                       INTEGER,                               -- Value of the enum entry.
    isFlag                      INTEGER                                -- Indicates that the entry sets a specific set of bits, which can be used to define bitsets.
);
CREATE TABLE NVTX_SCOPES (
    -- NVTX scopes.

    domainId                    INTEGER,                               -- User-controlled ID that can be used to group events.
    scopeId                     INTEGER,                               -- Scope ID.
    parentScopeId               INTEGER,                               -- Parent scope ID.
    path                        TEXT                                   -- Scope path.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_MEMCPY (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    greenContextId              INTEGER,                               -- Green context ID.
    streamId                    INTEGER   NOT NULL,                    -- Stream ID.
    correlationId               INTEGER,                               -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    bytes                       INTEGER   NOT NULL,                    -- Number of bytes transferred (B).
    copyKind                    INTEGER   NOT NULL,                    -- REFERENCES ENUM_CUDA_MEMCPY_OPER(id)
    deprecatedSrcId             INTEGER,                               -- Deprecated, use srcDeviceId instead.
    srcKind                     INTEGER,                               -- REFERENCES ENUM_CUDA_MEM_KIND(id)
    dstKind                     INTEGER,                               -- REFERENCES ENUM_CUDA_MEM_KIND(id)
    srcDeviceId                 INTEGER,                               -- Source device ID.
    srcContextId                INTEGER,                               -- Source context ID.
    dstDeviceId                 INTEGER,                               -- Destination device ID.
    dstContextId                INTEGER,                               -- Destination context ID.
    migrationCause              INTEGER,                               -- REFERENCES ENUM_CUDA_UNIF_MEM_MIGRATION(id)
    graphNodeId                 INTEGER,                               -- REFERENCES CUDA_GRAPH_NODE_EVENTS(graphNodeId)
    virtualAddress              INTEGER                                -- Virtual base address of the page/s being transferred.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_MEMSET (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    greenContextId              INTEGER,                               -- Green context ID.
    streamId                    INTEGER   NOT NULL,                    -- Stream ID.
    correlationId               INTEGER,                               -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    value                       INTEGER   NOT NULL,                    -- Value assigned to memory.
    bytes                       INTEGER   NOT NULL,                    -- Number of bytes set (B).
    graphNodeId                 INTEGER,                               -- REFERENCES CUDA_GRAPH_NODE_EVENTS(graphNodeId)
    memKind                     INTEGER                                -- REFERENCES ENUM_CUDA_MEM_KIND(id)
);
CREATE TABLE CUPTI_ACTIVITY_KIND_KERNEL (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    greenContextId              INTEGER,                               -- Green context ID.
    streamId                    INTEGER   NOT NULL,                    -- Stream ID.
    correlationId               INTEGER,                               -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    demangledName               INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Kernel function name w/ templates
    shortName                   INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Base kernel function name
    mangledName                 INTEGER,                               -- REFERENCES StringIds(id) -- Raw C++ mangled kernel function name
    launchType                  INTEGER,                               -- REFERENCES ENUM_CUDA_KERNEL_LAUNCH_TYPE(id)
    cacheConfig                 INTEGER,                               -- REFERENCES ENUM_CUDA_FUNC_CACHE_CONFIG(id)
    registersPerThread          INTEGER   NOT NULL,                    -- Number of registers required for each thread executing the kernel.
    gridX                       INTEGER   NOT NULL,                    -- X-dimension grid size.
    gridY                       INTEGER   NOT NULL,                    -- Y-dimension grid size.
    gridZ                       INTEGER   NOT NULL,                    -- Z-dimension grid size.
    blockX                      INTEGER   NOT NULL,                    -- X-dimension block size.
    blockY                      INTEGER   NOT NULL,                    -- Y-dimension block size.
    blockZ                      INTEGER   NOT NULL,                    -- Z-dimension block size.
    staticSharedMemory          INTEGER   NOT NULL,                    -- Static shared memory allocated for the kernel (B).
    dynamicSharedMemory         INTEGER   NOT NULL,                    -- Dynamic shared memory reserved for the kernel (B).
    localMemoryPerThread        INTEGER   NOT NULL,                    -- Amount of local memory reserved for each thread (B).
    localMemoryTotal            INTEGER   NOT NULL,                    -- Total amount of local memory reserved for the kernel (B).
    gridId                      INTEGER   NOT NULL,                    -- Unique grid ID of the kernel assigned at runtime.
    sharedMemoryExecuted        INTEGER,                               -- Shared memory size set by the driver.
    graphNodeId                 INTEGER,                               -- REFERENCES CUDA_GRAPH_NODE_EVENTS(graphNodeId)
    sharedMemoryLimitConfig     INTEGER                                -- REFERENCES ENUM_CUDA_SHARED_MEM_LIMIT_CONFIG(id)
);
CREATE TABLE CUPTI_ACTIVITY_KIND_SYNCHRONIZATION (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    greenContextId              INTEGER,                               -- Green context ID.
    streamId                    INTEGER   NOT NULL,                    -- Stream ID.
    correlationId               INTEGER,                               -- Correlation ID of the synchronization API to which this result is associated.
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    syncType                    INTEGER   NOT NULL,                    -- REFERENCES ENUM_CUPTI_SYNC_TYPE(id)
    eventId                     INTEGER   NOT NULL                     -- Event ID for which the synchronization API is called.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_CUDA_EVENT (
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    greenContextId              INTEGER,                               -- Green context ID.
    streamId                    INTEGER   NOT NULL,                    -- Stream ID.
    correlationId               INTEGER,                               -- Correlation ID of the event record API to which this result is associated.
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    eventId                     INTEGER   NOT NULL                     -- Event ID for which the event record API is called.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_GRAPH_TRACE (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    greenContextId              INTEGER,                               -- Green context ID.
    streamId                    INTEGER   NOT NULL,                    -- Stream ID.
    correlationId               INTEGER,                               -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    graphId                     INTEGER   NOT NULL,                    -- REFERENCES CUDA_GRAPH_EVENTS(graphId)
    graphExecId                 INTEGER   NOT NULL                     -- REFERENCES CUDA_GRAPH_EVENTS(graphExecId)
);
CREATE TABLE CUPTI_ACTIVITY_KIND_RUNTIME (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- ID used to identify events that this function call has triggered.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    returnValue                 INTEGER   NOT NULL,                    -- Return value of the function call.
    callchainId                 INTEGER                                -- REFERENCES CUDA_CALLCHAINS(id)
);
CREATE TABLE CUDNN_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL                     -- REFERENCES StringIds(id) -- Function name
);
CREATE TABLE CUBLAS_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL                     -- REFERENCES StringIds(id) -- Function name
);
CREATE TABLE CUDA_GRAPH_NODE_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    graphNodeId                 INTEGER   NOT NULL,                    -- Graph node ID.
    originalGraphNodeId         INTEGER                                -- Reference to the original graph node ID, if cloned node.
);
CREATE TABLE CUDA_GRAPH_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    graphId                     INTEGER,                               -- Graph ID.
    originalGraphId             INTEGER,                               -- Reference to the original graph ID, if cloned.
    graphExecId                 INTEGER                                -- Executable graph ID.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_BLOCK_TRACE (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER,                               -- Device ID.
    correlationId               INTEGER,                               -- Correlation ID of the event record API to which this result is associated.
    nodeId                      INTEGER,                               -- Node ID of the event record API to which this result is associated.
    SMId                        INTEGER,                               -- SM ID of the event on which the particular event was running.
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    BlockID                     INTEGER   NOT NULL,                    -- Block ID.
    UGPUId                      INTEGER,                               -- uGPU ID of the event on which the particular event was running.
    CGAId                       INTEGER                                -- CGA ID of the event on which the particular event was running.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_BLOCK_PHASE_TRACE (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER,                               -- Device ID.
    correlationId               INTEGER,                               -- Correlation ID of the event record API to which this result is associated.
    nodeId                      INTEGER,                               -- Node ID of the event record API to which this result is associated.
    SMId                        INTEGER,                               -- SM ID of the event on which the particular event was running.
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    BlockID                     INTEGER   NOT NULL,                    -- Block ID.
    phase1Timestamp             INTEGER   NOT NULL,                    -- Phase start timestamp.
    phase2Timestamp             INTEGER   NOT NULL,                    -- Phase stop timestamp.
    UGPUId                      INTEGER,                               -- uGPU ID of the event on which the particular event was running.
    CGAId                       INTEGER                                -- CGA ID of the event on which the particular event was running.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_WARP_TRACE (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER,                               -- Device ID.
    correlationId               INTEGER,                               -- Correlation ID of the event record API to which this result is associated.
    nodeId                      INTEGER,                               -- Node ID of the event record API to which this result is associated.
    SMId                        INTEGER,                               -- SM ID of the event on which the particular event was running.
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    BlockID                     INTEGER   NOT NULL,                    -- Block ID.
    WarpID                      INTEGER   NOT NULL,                    -- Warp ID.
    UGPUId                      INTEGER,                               -- uGPU ID of the event on which the particular event was running.
    CGAId                       INTEGER                                -- CGA ID of the event on which the particular event was running.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_WARP_PHASE_TRACE (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    deviceId                    INTEGER,                               -- Device ID.
    correlationId               INTEGER,                               -- Correlation ID of the event record API to which this result is associated.
    nodeId                      INTEGER,                               -- Node ID of the event record API to which this result is associated.
    SMId                        INTEGER,                               -- SM ID of the event on which the particular event was running.
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    BlockID                     INTEGER   NOT NULL,                    -- Block ID.
    WarpID                      INTEGER   NOT NULL,                    -- Warp ID.
    UGPUId                      INTEGER,                               -- uGPU ID of the event on which the particular event was running.
    CGAId                       INTEGER                                -- CGA ID of the event on which the particular event was running.
);
CREATE TABLE CUDA_UM_CPU_PAGE_FAULT_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    globalPid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    address                     INTEGER   NOT NULL,                    -- Virtual address of the page that faulted.
    originalFaultPc             INTEGER,                               -- Program counter of the CPU instruction that caused the page fault.
    CpuInstruction              INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    module                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Module name
    unresolvedFaultPc           INTEGER,                               -- True if the program counter was not resolved.
    sourceFile                  INTEGER,                               -- Source file where the page fault occurred.
    sourceLine                  INTEGER                                -- Source line number that caused the page fault in the source file.
);
CREATE TABLE CUDA_UM_GPU_PAGE_FAULT_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalPid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    address                     INTEGER   NOT NULL,                    -- Virtual address of the page that faulted.
    numberOfPageFaults          INTEGER   NOT NULL,                    -- Number of page faults for the same page.
    faultAccessType             INTEGER   NOT NULL                     -- REFERENCES ENUM_CUDA_UNIF_MEM_ACCESS_TYPE(id)
);
CREATE TABLE CUDA_GPU_MEMORY_USAGE_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    globalPid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    address                     INTEGER   NOT NULL,                    -- Virtual address of the allocation/deallocation.
    pc                          INTEGER   NOT NULL,                    -- Program counter of the allocation/deallocation.
    bytes                       INTEGER   NOT NULL,                    -- Number of bytes allocated/deallocated (B).
    memKind                     INTEGER   NOT NULL,                    -- REFERENCES ENUM_CUDA_MEM_KIND(id)
    memoryOperationType         INTEGER   NOT NULL,                    -- REFERENCES ENUM_CUDA_DEV_MEM_EVENT_OPER(id)
    name                        TEXT,                                  -- Variable name, if available.
    correlationId               INTEGER,                               -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
    streamId                    INTEGER,                               -- Stream ID.
    localMemoryPoolAddress      INTEGER,                               -- Base address of the local memory pool used
    localMemoryPoolReleaseThreshold   INTEGER,                         -- Release threshold of the local memory pool used
    localMemoryPoolSize         INTEGER,                               -- Size of the local memory pool used
    localMemoryPoolUtilizedSize   INTEGER,                             -- Utilized size of the local memory pool used
    importedMemoryPoolAddress   INTEGER,                               -- Base address of the imported memory pool used
    importedMemoryPoolProcessId   INTEGER                              -- Process ID of the imported memory pool used
);
CREATE TABLE CUDA_GPU_MEMORY_POOL_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    globalPid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    deviceId                    INTEGER   NOT NULL,                    -- Device ID.
    address                     INTEGER   NOT NULL,                    -- The base virtual address of the memory pool.
    operationType               INTEGER   NOT NULL,                    -- REFERENCES ENUM_CUDA_MEMPOOL_OPER(id)
    poolType                    INTEGER   NOT NULL,                    -- REFERENCES ENUM_CUDA_MEMPOOL_TYPE(id)
    correlationId               INTEGER,                               -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
    minBytesToKeep              INTEGER,                               -- Minimum number of bytes to keep of the memory pool.
    localMemoryPoolReleaseThreshold   INTEGER,                         -- Release threshold of the local memory pool used
    localMemoryPoolSize         INTEGER,                               -- Size of the local memory pool used
    localMemoryPoolUtilizedSize   INTEGER                              -- Utilized size of the local memory pool used
);
CREATE TABLE CUDA_CALLCHAINS (
    id                          INTEGER   NOT NULL,                    -- Part of PRIMARY KEY (id, stackDepth).
    symbol                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    module                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Module name
    unresolved                  INTEGER,                               -- True if the symbol was not resolved.
    originalIP                  INTEGER,                               -- Instruction pointer value.
    stackDepth                  INTEGER   NOT NULL,                    -- Zero-base index of the given function in call stack.

    PRIMARY KEY (id, stackDepth)
);
CREATE TABLE MPI_RANKS (
    -- Mapping of global thread IDs (gtid) to MPI ranks

    globalTid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    rank                        INTEGER   NOT NULL                     -- MPI rank
);
CREATE TABLE MPI_P2P_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- Registered NVTX domain/string
    commHandle                  INTEGER,                               -- MPI communicator handle.
    tag                         INTEGER,                               -- MPI message tag
    remoteRank                  INTEGER,                               -- MPI remote rank (destination or source)
    size                        INTEGER,                               -- MPI message size in bytes
    requestHandle               INTEGER                                -- MPI request handle.
);
CREATE TABLE MPI_COLLECTIVES_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- Registered NVTX domain/string
    commHandle                  INTEGER,                               -- MPI communicator handle.
    rootRank                    INTEGER,                               -- root rank in the collective
    size                        INTEGER,                               -- MPI message size in bytes (send size for bidirectional ops)
    recvSize                    INTEGER,                               -- MPI receive size in bytes
    requestHandle               INTEGER                                -- MPI request handle.
);
CREATE TABLE MPI_START_WAIT_EVENTS (
    -- MPI_Start*, MPI_Test* and MPI_Wait*

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- Registered NVTX domain/string
    requestHandle               INTEGER                                -- MPI request handle.
);
CREATE TABLE MPI_OTHER_EVENTS (
    -- MPI events without additional parameters

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    textId                      INTEGER                                -- REFERENCES StringIds(id) -- Registered NVTX domain/string
);
CREATE TABLE UCP_WORKERS (
    globalTid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    workerUid                   INTEGER   NOT NULL                     -- UCP worker UID
);
CREATE TABLE UCP_SUBMIT_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- Registered NVTX domain/string
    bufferAddr                  INTEGER,                               -- Address of the message buffer
    packedSize                  INTEGER,                               -- Message size (packed) in bytes
    peerWorkerUid               INTEGER,                               -- Peer's UCP worker UID
    tag                         INTEGER                                -- UCP message tag
);
CREATE TABLE UCP_PROGRESS_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- Registered NVTX domain/string
    bufferAddr                  INTEGER,                               -- Address of the message buffer
    packedSize                  INTEGER,                               -- Message size (packed) in bytes
    peerWorkerUid               INTEGER,                               -- Peer's UCP worker UID
    tag                         INTEGER                                -- UCP message tag
);
CREATE TABLE UCP_EVENTS (
    -- UCP events without additional parameters

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    textId                      INTEGER                                -- REFERENCES StringIds(id) -- Registered NVTX domain/string
);
CREATE TABLE NVTX_EVENTS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    eventType                   INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_TYPE(id)
    rangeId                     INTEGER,                               -- Correlation ID returned from a nvtxRangeStart call.
    category                    INTEGER,                               -- User-controlled ID that can be used to group events.
    color                       INTEGER,                               -- Encoded ARGB color value.
    text                        TEXT,                                  -- Explicit name/text (non-registered string)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    endGlobalTid                INTEGER,                               -- Serialized GlobalId.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- Registered NVTX domain/string
    domainId                    INTEGER,                               -- User-controlled ID that can be used to group events.
    uint64Value                 INTEGER,                               -- One of possible payload value union members.
    int64Value                  INTEGER,                               -- One of possible payload value union members.
    doubleValue                 REAL,                                  -- One of possible payload value union members.
    uint32Value                 INTEGER,                               -- One of possible payload value union members.
    int32Value                  INTEGER,                               -- One of possible payload value union members.
    floatValue                  REAL,                                  -- One of possible payload value union members.
    jsonTextId                  INTEGER,                               -- One of possible payload value union members.
    jsonText                    TEXT,                                  -- One of possible payload value union members.
    binaryData                  TEXT                                   -- Binary payload. See docs for format.
);
CREATE TABLE OPENGL_API (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_TYPE(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    endGlobalTid                INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- First function name
    endNameId                   INTEGER,                               -- REFERENCES StringIds(id) -- Last function name
    returnValue                 INTEGER   NOT NULL,                    -- Return value of the function call.
    frameId                     INTEGER,                               -- Index of the graphics frame starting from 1.
    contextId                   INTEGER,                               -- Context ID.
    gpu                         INTEGER,                               -- GPU index.
    display                     INTEGER                                -- Display ID.
);
CREATE TABLE OPENGL_WORKLOAD (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_TYPE(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    endGlobalTid                INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- First function name
    endNameId                   INTEGER,                               -- REFERENCES StringIds(id) -- Last function name
    returnValue                 INTEGER   NOT NULL,                    -- Return value of the function call.
    frameId                     INTEGER,                               -- Index of the graphics frame starting from 1.
    contextId                   INTEGER,                               -- Context ID.
    gpu                         INTEGER,                               -- GPU index.
    display                     INTEGER                                -- Display ID.
);
CREATE TABLE KHR_DEBUG_EVENTS (
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_TYPE(id)
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER,                               -- Event end timestamp (ns).
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- Debug marker/group text
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    source                      INTEGER,                               -- REFERENCES ENUM_OPENGL_DEBUG_SOURCE(id)
    khrdType                    INTEGER,                               -- REFERENCES ENUM_OPENGL_DEBUG_TYPE(id)
    id                          INTEGER,                               -- KHR event ID.
    severity                    INTEGER,                               -- REFERENCES ENUM_OPENGL_DEBUG_SEVERITY(id)
    correlationId               INTEGER,                               -- ID used to correlate KHR CPU trace to GPU trace.
    context                     INTEGER                                -- Context ID.
);
CREATE TABLE OSRT_API (
    -- OS runtime libraries traced to gather information about low-level userspace APIs.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    returnValue                 INTEGER   NOT NULL,                    -- Return value of the function call.
    nestingLevel                INTEGER,                               -- Zero-base index of the nesting level.
    callchainId                 INTEGER   NOT NULL                     -- REFERENCES OSRT_CALLCHAINS(id)
);
CREATE TABLE OSRT_CALLCHAINS (
    -- Callchains attached to OSRT events, depending on selected profiling settings.

    id                          INTEGER   NOT NULL,                    -- Part of PRIMARY KEY (id, stackDepth).
    symbol                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    module                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Module name
    kernelMode                  INTEGER,                               -- True if kernel mode.
    thumbCode                   INTEGER,                               -- True if thumb code.
    unresolved                  INTEGER,                               -- True if the symbol was not resolved.
    specialEntry                INTEGER,                               -- True if artifical entry added during processing callchain.
    originalIP                  INTEGER,                               -- Instruction pointer value.
    unwindMethod                INTEGER,                               -- REFERENCES ENUM_STACK_UNWIND_METHOD(id)
    stackDepth                  INTEGER   NOT NULL,                    -- Zero-base index of the given function in call stack.

    PRIMARY KEY (id, stackDepth)
);
CREATE TABLE PROFILER_OVERHEAD (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    returnValue                 INTEGER   NOT NULL                     -- Return value of the function call.
);
CREATE TABLE SCHED_EVENTS (
    -- Thread scheduling events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    cpu                         INTEGER   NOT NULL,                    -- ID of CPU this thread was scheduled in or out.
    isSchedIn                   INTEGER   NOT NULL,                    -- 0 if thread was scheduled out, non-zero otherwise.
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    threadState                 INTEGER,                               -- REFERENCES ENUM_SAMPLING_THREAD_STATE(id)
    threadBlock                 INTEGER                                -- REFERENCES ENUM_SCHEDULING_THREAD_BLOCK(id)
);
CREATE TABLE COMPOSITE_EVENTS (
    -- Thread sampling events.

    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- ID of the composite event.
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    cpu                         INTEGER,                               -- ID of CPU this thread was running on.
    threadState                 INTEGER,                               -- REFERENCES ENUM_SAMPLING_THREAD_STATE(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    cpuCycles                   INTEGER   NOT NULL                     -- Value of Performance Monitoring Unit (PMU) counter.
);
CREATE TABLE SAMPLING_CALLCHAINS (
    -- Callchain entries obtained from composite events, used to construct function table views.

    id                          INTEGER   NOT NULL,                    -- REFERENCES COMPOSITE_EVENTS(id)
    symbol                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    module                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Module name
    kernelMode                  INTEGER,                               -- True if kernel mode.
    thumbCode                   INTEGER,                               -- True if thumb code.
    unresolved                  INTEGER,                               -- True if the symbol was not resolved.
    specialEntry                INTEGER,                               -- True if artifical entry added during processing callchain.
    originalIP                  INTEGER,                               -- Instruction pointer value.
    unwindMethod                INTEGER,                               -- REFERENCES ENUM_STACK_UNWIND_METHOD(id)
    stackDepth                  INTEGER   NOT NULL,                    -- Zero-base index of the given function in call stack.

    PRIMARY KEY (id, stackDepth)
);
CREATE TABLE PERF_EVENT_SOC_OR_CPU_RAW_EVENT (
    -- SoC and CPU raw event values from Sampled Performance Counters.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    vmId                        INTEGER,                               -- VM ID.
    componentId                 INTEGER,                               -- REFERENCES TARGET_INFO_COMPONENT(componentId)
    eventId                     INTEGER,                               -- REFERENCES TARGET_INFO_PERF_METRIC(id)
    count                       INTEGER                                -- Counter data value
);
CREATE TABLE PERF_EVENT_SOC_OR_CPU_METRIC_EVENT (
    -- SoC and CPU metric values from Sampled Performance Counters.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    vmId                        INTEGER,                               -- VM ID.
    componentId                 INTEGER,                               -- REFERENCES TARGET_INFO_COMPONENT(componentId)
    metricId                    INTEGER,                               -- REFERENCES TARGET_INFO_PERF_METRIC(id)
    value                       REAL                                   -- Metric data value
);
CREATE TABLE SLI_QUERIES (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    frameId                     INTEGER   NOT NULL,                    -- Index of the graphics frame starting from 1.
    occQueryIssued              INTEGER   NOT NULL,                    -- Occlusion query issued.
    occQueryAsked               INTEGER   NOT NULL,                    -- Occlusion query asked.
    eventQueryIssued            INTEGER   NOT NULL,                    -- Event query issued.
    eventQueryAsked             INTEGER   NOT NULL,                    -- Event query asked.
    numberOfTransferEvents      INTEGER   NOT NULL,                    -- Number of transfer events.
    amountOfTransferredData     INTEGER   NOT NULL                     -- Cumulative size of resource data that was transferred.
);
CREATE TABLE SLI_P2P (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    frameId                     INTEGER   NOT NULL,                    -- Index of the graphics frame starting from 1.
    transferSkipped             INTEGER   NOT NULL,                    -- Number of transfers that were skipped.
    srcGpu                      INTEGER   NOT NULL,                    -- Source GPU ID.
    dstGpu                      INTEGER   NOT NULL,                    -- Destination GPU ID.
    numSubResources             INTEGER   NOT NULL,                    -- Number of sub-resources to transfer.
    resourceSize                INTEGER   NOT NULL,                    -- Size of resource.
    subResourceIdx              INTEGER   NOT NULL,                    -- Sub-resource index.
    smplWidth                   INTEGER,                               -- Sub-resource surface width in samples.
    smplHeight                  INTEGER,                               -- Sub-resource surface height in samples.
    smplDepth                   INTEGER,                               -- Sub-resource surface depth in samples.
    bytesPerElement             INTEGER,                               -- Number of bytes per element.
    dxgiFormat                  INTEGER,                               -- REFERENCES ENUM_DXGI_FORMAT(id)
    logSurfaceNames             TEXT,                                  -- Surface name.
    transferInfo                INTEGER,                               -- REFERENCES ENUM_SLI_TRANSER(id)
    isEarlyPushManagedByNvApi   INTEGER,                               -- True if early push managed by NVAPI. False otherwise.
    useAsyncP2pForResolve       INTEGER,                               -- True if async Peer-to-Peer used for resolve. False otherwise.
    transferFuncName            TEXT,                                  -- "A - BE" for asynchronous transfer, "S - BE" for synchronous transfer.
    regimeName                  TEXT,                                  -- Name of the regime scope that includes the resource.
    debugName                   TEXT,                                  -- Debug name assigned to the resource by the application code.
    bindType                    TEXT                                   -- Bind type.
);
CREATE TABLE SLI_STATS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    countComplexFrames          INTEGER   NOT NULL,                    -- Complex frames count.
    countStats                  INTEGER   NOT NULL,                    -- Number of frame statistics collected for the inactive-time histogram.
    totalInactiveTime           INTEGER   NOT NULL,                    -- Total inactive time (μs).
    minPbSize                   INTEGER   NOT NULL,                    -- Min push buffer size.
    maxPbSize                   INTEGER   NOT NULL,                    -- Max push buffer size.
    totalPbSize                 INTEGER   NOT NULL                     -- Total push buffer size.
);
CREATE TABLE DX12_API (
    id                          INTEGER   NOT NULL   PRIMARY KEY,
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    shortContextId              INTEGER,                               -- Short form of the COM interface object address.
    frameId                     INTEGER,                               -- Index of the graphics frame starting from 1.
    color                       INTEGER,                               -- Encoded ARGB color value.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- PIX marker text
    commandListType             INTEGER,                               -- REFERENCES ENUM_D3D12_CMD_LIST_TYPE(id)
    objectNameId                INTEGER,                               -- REFERENCES StringIds(id) -- D3D12 object name
    longContextId               INTEGER                                -- Long form of the COM interface object address.
);
CREATE TABLE DX12_WORKLOAD (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    shortContextId              INTEGER,                               -- Short form of the COM interface object address.
    frameId                     INTEGER,                               -- Index of the graphics frame starting from 1.
    gpu                         INTEGER,                               -- GPU index.
    color                       INTEGER,                               -- Encoded ARGB color value.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- PIX marker text
    commandListType             INTEGER,                               -- REFERENCES ENUM_D3D12_CMD_LIST_TYPE(id)
    objectNameId                INTEGER,                               -- REFERENCES StringIds(id) -- D3D12 object name
    longContextId               INTEGER                                -- Long form of the COM interface object address.
);
CREATE TABLE DX12_MEMORY_OPERATION (
    gpu                         INTEGER,                               -- GPU index.
    rangeStart                  INTEGER,                               -- Offset denoting the beginning of a memory range (B).
    rangeEnd                    INTEGER,                               -- Offset denoting the end of a memory range (B).
    subresourceId               INTEGER,                               -- Subresource index.
    heapType                    INTEGER,                               -- REFERENCES ENUM_D3D12_HEAP_TYPE(id)
    heapFlags                   INTEGER,                               -- REFERENCES ENUM_D3D12_HEAP_FLAGS(id)
    cpuPageProperty             INTEGER,                               -- REFERENCES ENUM_D3D12_PAGE_PROPERTY(id)
    nvApiFlags                  INTEGER,                               -- NV specific flags. See docs for specifics.
    traceEventId                INTEGER   NOT NULL                     -- REFERENCES DX12_API(id)
);
CREATE TABLE VULKAN_API (
    id                          INTEGER   NOT NULL   PRIMARY KEY,
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    contextId                   INTEGER                                -- Short form of the interface object address.
);
CREATE TABLE VULKAN_WORKLOAD (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    gpu                         INTEGER,                               -- GPU index.
    contextId                   INTEGER,                               -- Short form of the interface object address.
    color                       INTEGER,                               -- Encoded ARGB color value.
    textId                      INTEGER                                -- REFERENCES StringIds(id) -- Vulkan CPU debug marker string
);
CREATE TABLE VULKAN_DEBUG_API (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    contextId                   INTEGER,                               -- Short form of the interface object address.
    color                       INTEGER,                               -- Encoded ARGB color value.
    textId                      INTEGER                                -- REFERENCES StringIds(id) -- Vulkan CPU debug marker string
);
CREATE TABLE VULKAN_PIPELINE_CREATION_EVENTS (
    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- ID of the pipeline creation event.
    duration                    INTEGER,                               -- Event duration (ns).
    flags                       INTEGER,                               -- REFERENCES ENUM_VULKAN_PIPELINE_CREATION_FLAGS(id)
    traceEventId                INTEGER   NOT NULL                     -- REFERENCES VULKAN_API(id) -- ID of the attached vulkan API.
);
CREATE TABLE VULKAN_PIPELINE_STAGE_EVENTS (
    id                          INTEGER   NOT NULL   PRIMARY KEY,      -- ID of the pipeline stage event.
    duration                    INTEGER,                               -- Event duration (ns).
    flags                       INTEGER,                               -- REFERENCES ENUM_VULKAN_PIPELINE_CREATION_FLAGS(id)
    creationEventId             INTEGER   NOT NULL                     -- REFERENCES VULKAN_PIPELINE_CREATION_EVENTS(id) -- ID of the attached pipeline creation event.
);
CREATE TABLE GPU_CONTEXT_SWITCH_EVENTS (
    tag                         INTEGER   NOT NULL,                    -- REFERENCES ENUM_GPU_CTX_SWITCH(id)
    vmId                        INTEGER   NOT NULL,                    -- VM ID.
    seqNo                       INTEGER   NOT NULL,                    -- Sequential event number.
    contextId                   INTEGER   NOT NULL,                    -- Context ID.
    timestamp                   INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    gpuId                       INTEGER                                -- GPU index.
);
CREATE TABLE OPENMP_EVENT_KIND_THREAD (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    threadId                    INTEGER,                               -- Internal thread sequence starting from 1.
    threadType                  INTEGER                                -- REFERENCES ENUM_OPENMP_THREAD(id)
);
CREATE TABLE OPENMP_EVENT_KIND_PARALLEL (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    parallelId                  INTEGER,                               -- Internal parallel region sequence starting from 1.
    parentTaskId                INTEGER                                -- ID for task that creates this parallel region.
);
CREATE TABLE OPENMP_EVENT_KIND_SYNC_REGION_WAIT (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    parallelId                  INTEGER,                               -- ID of the parallel region that this event belongs to.
    taskId                      INTEGER,                               -- ID of the task that this event belongs to.
    kind                        INTEGER                                -- REFERENCES ENUM_OPENMP_SYNC_REGION(id)
);
CREATE TABLE OPENMP_EVENT_KIND_SYNC_REGION (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    parallelId                  INTEGER,                               -- ID of the parallel region that this event belongs to.
    taskId                      INTEGER,                               -- ID of the task that this event belongs to.
    kind                        INTEGER                                -- REFERENCES ENUM_OPENMP_SYNC_REGION(id)
);
CREATE TABLE OPENMP_EVENT_KIND_TASK (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    parallelId                  INTEGER,                               -- ID of the parallel region that this event belongs to.
    taskId                      INTEGER,                               -- ID of the task that this event belongs to.
    kind                        INTEGER                                -- REFERENCES ENUM_OPENMP_TASK_FLAG(id)
);
CREATE TABLE OPENMP_EVENT_KIND_MASTER (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    parallelId                  INTEGER,                               -- ID of the parallel region that this event belongs to.
    taskId                      INTEGER                                -- ID of the task that this event belongs to.
);
CREATE TABLE OPENMP_EVENT_KIND_REDUCTION (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    parallelId                  INTEGER,                               -- ID of the parallel region that this event belongs to.
    taskId                      INTEGER                                -- ID of the task that this event belongs to.
);
CREATE TABLE OPENMP_EVENT_KIND_TASK_CREATE (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    parentTaskId                INTEGER,                               -- ID of the parent task that is creating a new task.
    newTaskId                   INTEGER                                -- ID of the new task that is being created.
);
CREATE TABLE OPENMP_EVENT_KIND_TASK_SCHEDULE (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    parallelId                  INTEGER,                               -- ID of the parallel region that this event belongs to.
    priorTaskId                 INTEGER,                               -- ID of the task that is being switched out.
    priorTaskStatus             INTEGER,                               -- REFERENCES ENUM_OPENMP_TASK_STATUS(id)
    nextTaskId                  INTEGER                                -- ID of the task that is being switched in.
);
CREATE TABLE OPENMP_EVENT_KIND_CANCEL (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    taskId                      INTEGER                                -- ID of the task that is being cancelled.
);
CREATE TABLE OPENMP_EVENT_KIND_MUTEX_WAIT (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    kind                        INTEGER,                               -- REFERENCES ENUM_OPENMP_MUTEX(id)
    waitId                      INTEGER,                               -- ID indicating the object being waited.
    taskId                      INTEGER                                -- ID of the task that this event belongs to.
);
CREATE TABLE OPENMP_EVENT_KIND_CRITICAL_SECTION (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    kind                        INTEGER,                               -- REFERENCES ENUM_OPENMP_MUTEX(id)
    waitId                      INTEGER                                -- ID indicating the object being held.
);
CREATE TABLE OPENMP_EVENT_KIND_MUTEX_RELEASED (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    kind                        INTEGER,                               -- REFERENCES ENUM_OPENMP_MUTEX(id)
    waitId                      INTEGER,                               -- ID indicating the object being released.
    taskId                      INTEGER                                -- ID of the task that this event belongs to.
);
CREATE TABLE OPENMP_EVENT_KIND_LOCK_INIT (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    kind                        INTEGER,                               -- REFERENCES ENUM_OPENMP_MUTEX(id)
    waitId                      INTEGER                                -- ID indicating object being created/destroyed.
);
CREATE TABLE OPENMP_EVENT_KIND_LOCK_DESTROY (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    kind                        INTEGER,                               -- REFERENCES ENUM_OPENMP_MUTEX(id)
    waitId                      INTEGER                                -- ID indicating object being created/destroyed.
);
CREATE TABLE OPENMP_EVENT_KIND_WORKSHARE (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    kind                        INTEGER,                               -- REFERENCES ENUM_OPENMP_WORK(id)
    parallelId                  INTEGER,                               -- ID of the parallel region that this event belongs to.
    taskId                      INTEGER,                               -- ID of the task that this event belongs to.
    count                       INTEGER                                -- Measure of the quantity of work involved in the region.
);
CREATE TABLE OPENMP_EVENT_KIND_DISPATCH (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    kind                        INTEGER,                               -- REFERENCES ENUM_OPENMP_DISPATCH(id)
    parallelId                  INTEGER,                               -- ID of the parallel region that this event belongs to.
    taskId                      INTEGER                                -- ID of the task that this event belongs to.
);
CREATE TABLE OPENMP_EVENT_KIND_FLUSH (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- Currently unused.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    eventKind                   INTEGER,                               -- REFERENCES ENUM_OPENMP_EVENT_KIND(id)
    threadId                    INTEGER                                -- ID of the thread that this event belongs to.
);
CREATE TABLE D3D11_PIX_DEBUG_API (
    -- D3D11 debug marker events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    shortContextId              INTEGER,                               -- Short form of the COM interface object address.
    frameId                     INTEGER,                               -- Index of the graphics frame starting from 1.
    color                       INTEGER,                               -- Encoded ARGB color value.
    textId                      INTEGER                                -- REFERENCES StringIds(id) -- PIX marker text
);
CREATE TABLE D3D12_PIX_DEBUG_API (
    -- D3D12 debug marker events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    correlationId               INTEGER,                               -- First ID matching an API call to GPU workloads.
    endCorrelationId            INTEGER,                               -- Last ID matching an API call to GPU workloads.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    shortContextId              INTEGER,                               -- Short form of the COM interface object address.
    frameId                     INTEGER,                               -- Index of the graphics frame starting from 1.
    color                       INTEGER,                               -- Encoded ARGB color value.
    textId                      INTEGER,                               -- REFERENCES StringIds(id) -- PIX marker text
    commandListType             INTEGER,                               -- REFERENCES ENUM_D3D12_CMD_LIST_TYPE(id)
    objectNameId                INTEGER,                               -- REFERENCES StringIds(id) -- D3D12 object name
    longContextId               INTEGER                                -- Long form of the COM interface object address.
);
CREATE TABLE WDDM_EVICT_ALLOCATION_EVENTS (
    -- Raw ETW EvictAllocation events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    allocationHandle            INTEGER   NOT NULL                     -- Global allocation handle.
);
CREATE TABLE WDDM_PAGING_QUEUE_PACKET_START_EVENTS (
    -- Raw ETW PagingQueuePacketStart events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    dxgDevice                   INTEGER,                               -- Address of an IDXGIDevice.
    dxgAdapter                  INTEGER,                               -- Address of an IDXGIAdapter.
    pagingQueue                 INTEGER   NOT NULL,                    -- Address of the paging queue.
    pagingQueuePacket           INTEGER   NOT NULL,                    -- Address of the paging queue packet.
    sequenceId                  INTEGER   NOT NULL,                    -- Internal sequence starting from 0.
    alloc                       INTEGER,                               -- Allocation handle.
    vidMmOpType                 INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_VIDMM_OP_TYPE(id)
    pagingQueueType             INTEGER   NOT NULL                     -- REFERENCES ENUM_WDDM_PAGING_QUEUE_TYPE(id)
);
CREATE TABLE WDDM_PAGING_QUEUE_PACKET_STOP_EVENTS (
    -- Raw ETW PagingQueuePacketStop events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    pagingQueue                 INTEGER   NOT NULL,                    -- Address of the paging queue.
    pagingQueuePacket           INTEGER   NOT NULL,                    -- Address of the paging queue packet.
    sequenceId                  INTEGER   NOT NULL                     -- Internal sequence starting from 0.
);
CREATE TABLE WDDM_PAGING_QUEUE_PACKET_INFO_EVENTS (
    -- Raw ETW PagingQueuePacketInfo events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    pagingQueue                 INTEGER   NOT NULL,                    -- Address of the paging queue.
    pagingQueuePacket           INTEGER   NOT NULL,                    -- Address of the paging queue packet.
    sequenceId                  INTEGER   NOT NULL                     -- Internal sequence starting from 0.
);
CREATE TABLE WDDM_QUEUE_PACKET_START_EVENTS (
    -- Raw ETW QueuePacketStart events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    context                     INTEGER   NOT NULL,                    -- The context ID of WDDM queue.
    dmaBufferSize               INTEGER   NOT NULL,                    -- The dma buffer size.
    dmaBuffer                   INTEGER   NOT NULL,                    -- The reported address of dma buffer.
    queuePacket                 INTEGER   NOT NULL,                    -- The address of queue packet.
    progressFenceValue          INTEGER   NOT NULL,                    -- The fence value.
    packetType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_PACKET_TYPE(id)
    submitSequence              INTEGER   NOT NULL,                    -- Internal sequence starting from 1.
    allocationListSize          INTEGER   NOT NULL,                    -- The number of allocations referenced.
    patchLocationListSize       INTEGER   NOT NULL,                    -- The number of patch locations.
    present                     INTEGER   NOT NULL,                    -- True or False if the packet is a present packet.
    engineType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_ENGINE_TYPE(id)
    syncObject                  INTEGER                                -- The address of fence object.
);
CREATE TABLE WDDM_QUEUE_PACKET_STOP_EVENTS (
    -- Raw ETW QueuePacketStop events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    context                     INTEGER   NOT NULL,                    -- The context ID of WDDM queue.
    queuePacket                 INTEGER   NOT NULL,                    -- The address of queue packet.
    packetType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_PACKET_TYPE(id)
    submitSequence              INTEGER   NOT NULL,                    -- Internal sequence starting from 1.
    preempted                   INTEGER   NOT NULL,                    -- True or False if the packet is preempted.
    timeouted                   INTEGER   NOT NULL,                    -- True or False if the packet is timeouted.
    engineType                  INTEGER   NOT NULL                     -- REFERENCES ENUM_WDDM_ENGINE_TYPE(id)
);
CREATE TABLE WDDM_QUEUE_PACKET_INFO_EVENTS (
    -- Raw ETW QueuePacketInfo events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    context                     INTEGER   NOT NULL,                    -- The context ID of WDDM queue.
    packetType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_PACKET_TYPE(id)
    submitSequence              INTEGER   NOT NULL,                    -- Internal sequence starting from 1.
    engineType                  INTEGER   NOT NULL                     -- REFERENCES ENUM_WDDM_ENGINE_TYPE(id)
);
CREATE TABLE WDDM_DMA_PACKET_START_EVENTS (
    -- Raw ETW DmaPacketStart events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    context                     INTEGER   NOT NULL,                    -- The context ID of WDDM queue.
    queuePacketContext          INTEGER   NOT NULL,                    -- The queue packet context.
    uliSubmissionId             INTEGER   NOT NULL,                    -- The queue packet submission ID.
    dmaBuffer                   INTEGER   NOT NULL,                    -- The reported address of dma buffer.
    packetType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_PACKET_TYPE(id)
    ulQueueSubmitSequence       INTEGER   NOT NULL,                    -- Internal sequence starting from 1.
    quantumStatus               INTEGER   NOT NULL,                    -- The quantum Status.
    engineType                  INTEGER   NOT NULL                     -- REFERENCES ENUM_WDDM_ENGINE_TYPE(id)
);
CREATE TABLE WDDM_DMA_PACKET_STOP_EVENTS (
    -- Raw ETW DmaPacketStop events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    context                     INTEGER   NOT NULL,                    -- The context ID of WDDM queue.
    uliCompletionId             INTEGER   NOT NULL,                    -- The queue packet completion ID.
    packetType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_PACKET_TYPE(id)
    ulQueueSubmitSequence       INTEGER   NOT NULL,                    -- Internal sequence starting from 1.
    preempted                   INTEGER   NOT NULL,                    -- True or False if the packet is preempted.
    engineType                  INTEGER   NOT NULL                     -- REFERENCES ENUM_WDDM_ENGINE_TYPE(id)
);
CREATE TABLE WDDM_DMA_PACKET_INFO_EVENTS (
    -- Raw ETW DmaPacketInfo events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    context                     INTEGER   NOT NULL,                    -- The context ID of WDDM queue.
    uliCompletionId             INTEGER   NOT NULL,                    -- The queue packet completion ID.
    faultedVirtualAddress       INTEGER   NOT NULL,                    -- The virtual address of faulted process.
    faultedProcessHandle        INTEGER   NOT NULL,                    -- The address of faulted process.
    packetType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_PACKET_TYPE(id)
    ulQueueSubmitSequence       INTEGER   NOT NULL,                    -- Internal sequence starting from 1.
    interruptType               INTEGER   NOT NULL,                    -- REFERENCES ENUM_WDDM_INTERRUPT_TYPE(id)
    quantumStatus               INTEGER   NOT NULL,                    -- The quantum Status.
    pageFaultFlags              INTEGER   NOT NULL,                    -- The page fault flag ID.
    engineType                  INTEGER   NOT NULL                     -- REFERENCES ENUM_WDDM_ENGINE_TYPE(id)
);
CREATE TABLE WDDM_HW_QUEUE_EVENTS (
    -- Raw ETW HwQueueStart events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    context                     INTEGER   NOT NULL,                    -- The context ID of WDDM queue.
    hwQueue                     INTEGER   NOT NULL,                    -- The address of HW queue.
    parentDxgHwQueue            INTEGER   NOT NULL                     -- The address of parent Dxg HW queue.
);
CREATE TABLE NVVIDEO_ENCODER_API (
    -- NV Video Encoder API traced to gather information about NVIDIA Video Codek SDK Encoder APIs.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    apiId                       INTEGER                                -- REFERENCES GPU_VIDEO_ENGINE_WORKLOAD(apiId)
);
CREATE TABLE NVVIDEO_DECODER_API (
    -- NV Video Encoder API traced to gather information about NVIDIA Video Codek SDK Decoder APIs.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    apiId                       INTEGER                                -- REFERENCES GPU_VIDEO_ENGINE_WORKLOAD(apiId)
);
CREATE TABLE NVVIDEO_JPEG_API (
    -- NV Video Encoder API traced to gather information about NVIDIA Video Codek SDK JPEG APIs.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL                     -- REFERENCES StringIds(id) -- Function name
);
CREATE TABLE GPU_VIDEO_ENGINE_WORKLOAD (
    -- Video engine workload events

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalEngineId              INTEGER   NOT NULL,                    -- Serialized GlobalId.
    engineType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_VIDEO_ENGINE_TYPE(id)
    engineId                    INTEGER   NOT NULL,
    vmId                        INTEGER   NOT NULL,                    -- Driver provided ID.
    contextId                   INTEGER,                               -- Context ID.
    globalPid                   INTEGER,                               -- Serialized GlobalId.
    apiId                       INTEGER   NOT NULL,                    -- ID used to correlate API and workload trace.
    codecId                     INTEGER                                -- REFERENCES ENUM_VIDEO_ENGINE_CODEC(id)
);
CREATE TABLE GPU_VIDEO_ENGINE_MISSING (
    -- Video engine missing ranges

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalEngineId              INTEGER   NOT NULL,                    -- Serialized GlobalId.
    rangeCount                  INTEGER   NOT NULL                     -- Number of missing ranges.
);
CREATE TABLE MEMORY_TRANSFER_EVENTS (
    -- Raw ETW Memory Transfer events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    gpu                         INTEGER,                               -- GPU index.
    taskId                      INTEGER   NOT NULL,                    -- The event task ID.
    eventId                     INTEGER   NOT NULL,                    -- Event ID.
    allocationGlobalHandle      INTEGER   NOT NULL,                    -- Address of the global allocation handle.
    dmaBuffer                   INTEGER   NOT NULL,                    -- The reported address of dma buffer.
    size                        INTEGER   NOT NULL,                    -- The size of the dma buffer in bytes.
    offset                      INTEGER   NOT NULL,                    -- The offset from the start of the reported dma buffer in bytes.
    memoryTransferType          INTEGER   NOT NULL                     -- REFERENCES ENUM_ETW_MEMORY_TRANSFER_TYPE(id)
);
CREATE TABLE NV_LOAD_BALANCE_MASTER_EVENTS (
    -- Raw ETW NV-wgf2um LoadBalanceMaster events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    eventId                     INTEGER   NOT NULL,                    -- Event ID.
    task                        TEXT      NOT NULL,                    -- The task name.
    frameCount                  INTEGER   NOT NULL,                    -- The frame ID.
    frameTime                   REAL      NOT NULL,                    -- Frame duration.
    averageFrameTime            REAL      NOT NULL,                    -- Average of frame duration.
    averageLatency              REAL      NOT NULL,                    -- Average of latency.
    minLatency                  REAL      NOT NULL,                    -- The minimum latency.
    averageQueuedFrames         REAL      NOT NULL,                    -- Average number of queued frames.
    totalActiveMs               REAL      NOT NULL,                    -- Total active time in milliseconds.
    totalIdleMs                 REAL      NOT NULL,                    -- Total idle time in milliseconds.
    idlePercent                 REAL      NOT NULL,                    -- The percentage of idle time.
    isGPUAlmostOneFrameAhead    INTEGER   NOT NULL                     -- True or False if GPU is almost one frame ahead.
);
CREATE TABLE NV_LOAD_BALANCE_EVENTS (
    -- Raw ETW NV-wgf2um LoadBalance events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalTid                   INTEGER   NOT NULL,                    -- Serialized GlobalId.
    gpu                         INTEGER   NOT NULL,                    -- GPU index.
    eventId                     INTEGER   NOT NULL,                    -- Event ID.
    task                        TEXT      NOT NULL,                    -- The task name.
    averageFPS                  REAL      NOT NULL,                    -- Average frame per second.
    queuedFrames                REAL      NOT NULL,                    -- The amount of queued frames.
    averageQueuedFrames         REAL      NOT NULL,                    -- Average number of queued frames.
    currentCPUTime              REAL      NOT NULL,                    -- The current CPU time.
    averageCPUTime              REAL      NOT NULL,                    -- Average CPU time.
    averageStallTime            REAL      NOT NULL,                    -- Average of stall time.
    averageCPUIdleTime          REAL      NOT NULL,                    -- Average CPU idle time.
    isGPUAlmostOneFrameAhead    INTEGER   NOT NULL                     -- True or False if GPU is almost one frame ahead.
);
CREATE TABLE PROCESSES (
    -- Names and identifiers of processes captured in the report.

    globalPid                   INTEGER,                               -- Serialized GlobalId.
    pid                         INTEGER,                               -- The process ID.
    name                        TEXT                                   -- The process name.
);
CREATE TABLE CUPTI_ACTIVITY_KIND_OPENACC_DATA (
    -- OpenACC data events collected using CUPTI.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    eventKind                   INTEGER   NOT NULL,                    -- REFERENCES ENUM_OPENACC_EVENT_KIND(id)
    DeviceType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_OPENACC_DEVICE(id)
    lineNo                      INTEGER   NOT NULL,                    -- Line number of the directive or program construct.
    cuDeviceId                  INTEGER   NOT NULL,                    -- CUDA device ID. Valid only if deviceType is acc_device_nvidia.
    cuContextId                 INTEGER   NOT NULL,                    -- CUDA context ID. Valid only if deviceType is acc_device_nvidia.
    cuStreamId                  INTEGER   NOT NULL,                    -- CUDA stream ID. Valid only if deviceType is acc_device_nvidia.
    srcFile                     INTEGER,                               -- REFERENCES StringIds(id) -- Source file name or path
    funcName                    INTEGER,                               -- REFERENCES StringIds(id) -- Function in which event occurred
    correlationId               INTEGER,                               -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
    bytes                       INTEGER,                               -- Number of bytes.
    varName                     INTEGER                                -- REFERENCES StringIds(id) -- Variable name
);
CREATE TABLE CUPTI_ACTIVITY_KIND_OPENACC_LAUNCH (
    -- OpenACC launch events collected using CUPTI.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    eventKind                   INTEGER   NOT NULL,                    -- REFERENCES ENUM_OPENACC_EVENT_KIND(id)
    DeviceType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_OPENACC_DEVICE(id)
    lineNo                      INTEGER   NOT NULL,                    -- Line number of the directive or program construct.
    cuDeviceId                  INTEGER   NOT NULL,                    -- CUDA device ID. Valid only if deviceType is acc_device_nvidia.
    cuContextId                 INTEGER   NOT NULL,                    -- CUDA context ID. Valid only if deviceType is acc_device_nvidia.
    cuStreamId                  INTEGER   NOT NULL,                    -- CUDA stream ID. Valid only if deviceType is acc_device_nvidia.
    srcFile                     INTEGER,                               -- REFERENCES StringIds(id) -- Source file name or path
    funcName                    INTEGER,                               -- REFERENCES StringIds(id) -- Function in which event occurred
    correlationId               INTEGER,                               -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
    numGangs                    INTEGER,                               -- Number of gangs created for this kernel launch.
    numWorkers                  INTEGER,                               -- Number of workers created for this kernel launch.
    vectorLength                INTEGER,                               -- Number of vector lanes created for this kernel launch.
    kernelName                  INTEGER                                -- REFERENCES StringIds(id) -- Kernel name
);
CREATE TABLE CUPTI_ACTIVITY_KIND_OPENACC_OTHER (
    -- OpenACC other events collected using CUPTI.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Event name
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    eventKind                   INTEGER   NOT NULL,                    -- REFERENCES ENUM_OPENACC_EVENT_KIND(id)
    DeviceType                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_OPENACC_DEVICE(id)
    lineNo                      INTEGER   NOT NULL,                    -- Line number of the directive or program construct.
    cuDeviceId                  INTEGER   NOT NULL,                    -- CUDA device ID. Valid only if deviceType is acc_device_nvidia.
    cuContextId                 INTEGER   NOT NULL,                    -- CUDA context ID. Valid only if deviceType is acc_device_nvidia.
    cuStreamId                  INTEGER   NOT NULL,                    -- CUDA stream ID. Valid only if deviceType is acc_device_nvidia.
    srcFile                     INTEGER,                               -- REFERENCES StringIds(id) -- Source file name or path
    funcName                    INTEGER,                               -- REFERENCES StringIds(id) -- Function in which event occurred
    correlationId               INTEGER                                -- REFERENCES CUPTI_ACTIVITY_KIND_RUNTIME(correlationId)
);
CREATE TABLE NET_NIC_METRIC (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalId                    INTEGER   NOT NULL,                    -- Serialized GlobalId.
    portId                      INTEGER   NOT NULL,                    -- REFERENCES NET_IB_DEVICE_PORT_INFO(portNumber) -- Port ID
    metricsListId               INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_NETWORK_METRICS(metricsListId)
    metricsIdx                  INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_NETWORK_METRICS(metricsIdx)
    value                       INTEGER   NOT NULL                     -- Counter data value
);
CREATE TABLE NET_IB_SWITCH_METRIC (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalId                    INTEGER   NOT NULL,                    -- Serialized GlobalId.
    portId                      INTEGER   NOT NULL,                    -- REFERENCES NET_IB_DEVICE_PORT_INFO(portNumber) -- Port ID
    metricsListId               INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_NETWORK_METRICS(metricsListId)
    metricsIdx                  INTEGER   NOT NULL,                    -- REFERENCES TARGET_INFO_NETWORK_METRICS(metricsIdx)
    value                       INTEGER   NOT NULL                     -- Counter data value
);
CREATE TABLE NET_IB_SWITCH_CONGESTION_EVENT (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    globalId                    INTEGER   NOT NULL,                    -- Serialized GlobalId.
    congestionType              INTEGER,                               -- REFERENCES ENUM_NET_IB_CONGESTION_EVENT_TYPE(id)
    collectorGUID               INTEGER,                               -- Collector GUID
    packetSLID                  INTEGER,                               -- Packet Source LID
    packetDLID                  INTEGER,                               -- Packet Destination LID
    packetSL                    INTEGER,                               -- Packet Service Level
    packetOpCode                INTEGER,                               -- Packet Operation Code
    packetSourceQP              INTEGER,                               -- Packet Source Queue Pair
    packetDestinationQP         INTEGER,                               -- Packet Destination Queue Pair
    switchIngressPort           INTEGER,                               -- Packet's Ingress Switch Port
    switchEgressPort            INTEGER                                -- Packet's Egress Switch Port
);
CREATE TABLE PMU_EVENTS (
    -- CPU Core events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalVm                    INTEGER   NOT NULL,                    -- Serialized GlobalId.
    cpu                         INTEGER   NOT NULL,                    -- CPU ID
    counter_id                  INTEGER                                -- REFERENCES PMU_EVENT_COUNTERS(id)
);
CREATE TABLE PMU_EVENT_COUNTERS (
    -- CPU Core events counters.

    id                          INTEGER   NOT NULL,
    idx                         INTEGER   NOT NULL,                    -- REFERENCES PMU_EVENT_REQUESTS(id).
    value                       INTEGER   NOT NULL                     -- Counter data value
);
CREATE TABLE TRACE_PROCESS_EVENT_NVMEDIA (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL,                    -- REFERENCES StringIds(id) -- Function name
    correlationId               INTEGER                                -- First ID matching an API call to GPU workloads.
);
CREATE TABLE TEGRA_INTERNAL_API_CALLS (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL                     -- REFERENCES StringIds(id) -- Function name
);
CREATE TABLE UNCORE_PMU_EVENTS (
    -- PMU Uncore events.

    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    globalVm                    INTEGER   NOT NULL,                    -- Serialized GlobalId.
    clusterId                   INTEGER,                               -- Cluster ID.
    counterId                   INTEGER                                -- REFERENCES UNCORE_PMU_EVENT_VALUES(id).
);
CREATE TABLE UNCORE_PMU_EVENT_VALUES (
    -- Uncore events values.

    id                          INTEGER   NOT NULL,
    type                        INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_TYPE(id)
    value                       INTEGER   NOT NULL,                    -- Event value.
    rawId                       INTEGER   NOT NULL,                    -- Event value raw ID.
    clusterId                   INTEGER                                -- Cluster ID.
);
CREATE TABLE DIAGNOSTIC_EVENT (
    timestamp                   INTEGER   NOT NULL,                    -- Event timestamp (ns).
    timestampType               INTEGER   NOT NULL,                    -- REFERENCES ENUM_DIAGNOSTIC_TIMESTAMP_SOURCE(id)
    source                      INTEGER   NOT NULL,                    -- REFERENCES ENUM_DIAGNOSTIC_SOURCE_TYPE(id)
    severity                    INTEGER   NOT NULL,                    -- REFERENCES ENUM_DIAGNOSTIC_SEVERITY_LEVEL(id)
    text                        TEXT      NOT NULL,                    -- Diagnostic message text
    globalPid                   INTEGER                                -- Serialized GlobalId.
);
CREATE TABLE SYSCALL (
    start                       INTEGER   NOT NULL,                    -- Event start timestamp (ns).
    end                         INTEGER   NOT NULL,                    -- Event end timestamp (ns).
    eventClass                  INTEGER   NOT NULL,                    -- REFERENCES ENUM_NSYS_EVENT_CLASS(id)
    globalTid                   INTEGER,                               -- Serialized GlobalId.
    nameId                      INTEGER   NOT NULL                     -- REFERENCES StringIds(id) -- Function name
);

注意

GENERIC_EVENTS.typeId 是一个复合位字段,它将 HW ID、VM ID、源 ID 和类型 ID 与以下结构组合在一起

<硬件 ID:8><VM ID:8><源 ID:16><类型 ID:32>

类型 ID 是另一个复合位字段,它将 GPU 指标事件标记和 GPU ID 组合在一起。要提取后者,您需要获取低 8 位

SELECT typeId & 0xFF AS gpuId FROM GENERIC_EVENTS

某些事件类型已被弃用,Nsight Systems 不再支持它们。虽然这些事件的表将不再出现在导出的 SQL 数据库中,但旧版本的 Nsight Systems 导出的数据库可能仍然包含它们。

CREATE TABLE ETW_EVENTS_DEPRECATED_TABLE (
    [...]
);
CREATE TABLE GPU_MEMORY_BUDGET_EVENTS (
    -- Raw ETW VidMmProcessBudgetChange events (deprecated).

    [...]
);
CREATE TABLE GPU_MEMORY_USAGE_EVENTS (
    -- Raw ETW VidMmProcessUsageChange events (deprecated).

    [...]
);
CREATE TABLE DEMOTED_BYTES_EVENTS (
    -- Raw ETW VidMmProcessDemotedCommitmentChange events (deprecated).

    [...]
);
CREATE TABLE TOTAL_BYTES_RESIDENT_IN_SEGMENT_EVENTS (
    -- Raw ETW TotalBytesResidentInSegment events (deprecated).

    [...]
);

SQLite 架构事件值

以下是存储在 Nsight Systems SQLite 架构中的枚举中的设置值

CUDA 事件类值

0 - TRACE_PROCESS_EVENT_CUDA_RUNTIME
1 - TRACE_PROCESS_EVENT_CUDA_DRIVER
13 - TRACE_PROCESS_EVENT_CUDA_EGL_DRIVER
28 - TRACE_PROCESS_EVENT_CUDNN
29 - TRACE_PROCESS_EVENT_CUBLAS
33 - TRACE_PROCESS_EVENT_CUDNN_START
34 - TRACE_PROCESS_EVENT_CUDNN_FINISH
35 - TRACE_PROCESS_EVENT_CUBLAS_START
36 - TRACE_PROCESS_EVENT_CUBLAS_FINISH
67 - TRACE_PROCESS_EVENT_CUDABACKTRACE
77 - TRACE_PROCESS_EVENT_CUDA_GRAPH_NODE_CREATION

有关收集的事件和数据类型的详细信息,请参阅 CUPTI 文档

NVTX 事件类型值

33 - NvtxCategory
34 - NvtxMark
39 - NvtxThread
59 - NvtxPushPopRange
60 - NvtxStartEndRange
75 - NvtxDomainCreate
76 - NvtxDomainDestroy

text 和 textId 列之间的区别在于,如果 NVTX 事件消息是通过调用 nvtxDomainRegisterString 函数传递的,则该消息将通过 textId 字段可用,否则,如果提供了消息,则 text 字段将包含该消息。

OpenGL 事件

KHR 事件类值

62 - KhrDebugPushPopRange
63 - KhrDebugGpuPushPopRange

KHR 源类型值

0x8249 - GL_DEBUG_SOURCE_THIRD_PARTY
0x824A - GL_DEBUG_SOURCE_APPLICATION

KHR 类型值

0x824C - GL_DEBUG_TYPE_ERROR
0x824D - GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
0x824E - GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
0x824F - GL_DEBUG_TYPE_PORTABILITY
0x8250 - GL_DEBUG_TYPE_PERFORMANCE
0x8251 - GL_DEBUG_TYPE_OTHER
0x8268 - GL_DEBUG_TYPE_MARKER
0x8269 - GL_DEBUG_TYPE_PUSH_GROUP
0x826A - GL_DEBUG_TYPE_POP_GROUP

KHR 严重性值

0x826B - GL_DEBUG_SEVERITY_NOTIFICATION
0x9146 - GL_DEBUG_SEVERITY_HIGH
0x9147 - GL_DEBUG_SEVERITY_MEDIUM
0x9148 - GL_DEBUG_SEVERITY_LOW

OSRT 事件类值

可以跟踪操作系统运行时库,以收集有关低级用户空间 API 的信息。这会跟踪 C 运行时和 POSIX 线程 (pthread) 库公开的系统调用包装器和线程同步接口。这不会执行完整的运行时库 API 跟踪,而是专注于可能需要很长时间才能执行或可能导致您的线程在等待事件完成时从 CPU 中取消调度的函数。

OSRT 事件可能附加了调用链,具体取决于选定的分析设置。在这种情况下,可以使用 callchainId 列从 OSRT_CALLCHAINS 表中选择相关的调用链

OSRT 事件类值

27 - TRACE_PROCESS_EVENT_OS_RUNTIME
31 - TRACE_PROCESS_EVENT_OS_RUNTIME_START
32 - TRACE_PROCESS_EVENT_OS_RUNTIME_FINISH

DX12 事件类值

41 - TRACE_PROCESS_EVENT_DX12_API
42 - TRACE_PROCESS_EVENT_DX12_WORKLOAD
43 - TRACE_PROCESS_EVENT_DX12_START
44 - TRACE_PROCESS_EVENT_DX12_FINISH
52 - TRACE_PROCESS_EVENT_DX12_DISPLAY
59 - TRACE_PROCESS_EVENT_DX12_CREATE_OBJECT

PIX 事件类值

65 - TRACE_PROCESS_EVENT_DX12_DEBUG_API
75 - TRACE_PROCESS_EVENT_DX11_DEBUG_API

Vulkan 事件类值

53 - TRACE_PROCESS_EVENT_VULKAN_API
54 - TRACE_PROCESS_EVENT_VULKAN_WORKLOAD
55 - TRACE_PROCESS_EVENT_VULKAN_START
56 - TRACE_PROCESS_EVENT_VULKAN_FINISH
60 - TRACE_PROCESS_EVENT_VULKAN_CREATE_OBJECT
66 - TRACE_PROCESS_EVENT_VULKAN_DEBUG_API

Vulkan 标志

VALID_BIT = 0x00000001
CACHE_HIT_BIT = 0x00000002
BASE_PIPELINE_ACCELERATION_BIT = 0x00000004

SLI 事件类值

62 - TRACE_PROCESS_EVENT_SLI
63 - TRACE_PROCESS_EVENT_SLI_START
64 - TRACE_PROCESS_EVENT_SLI_FINISH

SLI 传输信息值

0 - P2P_SKIPPED
1 - P2P_EARLY_PUSH
2 - P2P_PUSH_FAILED
3 - P2P_2WAY_OR_PULL
4 - P2P_PRESENT
5 - P2P_DX12_INIT_PUSH_ON_WRITE

WDDM 事件值

VIDMM 操作类型值

0 - None
101 - RestoreSegments
102 - PurgeSegments
103 - CleanupPrimary
104 - AllocatePagingBufferResources
105 - FreePagingBufferResources
106 - ReportVidMmState
107 - RunApertureCoherencyTest
108 - RunUnmapToDummyPageTest
109 - DeferredCommand
110 - SuspendMemorySegmentAccess
111 - ResumeMemorySegmentAccess
112 - EvictAndFlush
113 - CommitVirtualAddressRange
114 - UncommitVirtualAddressRange
115 - DestroyVirtualAddressAllocator
116 - PageInDevice
117 - MapContextAllocation
118 - InitPagingProcessVaSpace
200 - CloseAllocation
202 - ComplexLock
203 - PinAllocation
204 - FlushPendingGpuAccess
205 - UnpinAllocation
206 - MakeResident
207 - Evict
208 - LockInAperture
209 - InitContextAllocation
210 - ReclaimAllocation
211 - DiscardAllocation
212 - SetAllocationPriority
1000 - EvictSystemMemoryOfferList

分页队列类型值

0 - VIDMM_PAGING_QUEUE_TYPE_UMD
1 - VIDMM_PAGING_QUEUE_TYPE_Default
2 - VIDMM_PAGING_QUEUE_TYPE_Evict
3 - VIDMM_PAGING_QUEUE_TYPE_Reclaim

数据包类型值

0 - DXGKETW_RENDER_COMMAND_BUFFER
1 - DXGKETW_DEFERRED_COMMAND_BUFFER
2 - DXGKETW_SYSTEM_COMMAND_BUFFER
3 - DXGKETW_MMIOFLIP_COMMAND_BUFFER
4 - DXGKETW_WAIT_COMMAND_BUFFER
5 - DXGKETW_SIGNAL_COMMAND_BUFFER
6 - DXGKETW_DEVICE_COMMAND_BUFFER
7 - DXGKETW_SOFTWARE_COMMAND_BUFFER

引擎类型值

0 - DXGK_ENGINE_TYPE_OTHER
1 - DXGK_ENGINE_TYPE_3D
2 - DXGK_ENGINE_TYPE_VIDEO_DECODE
3 - DXGK_ENGINE_TYPE_VIDEO_ENCODE
4 - DXGK_ENGINE_TYPE_VIDEO_PROCESSING
5 - DXGK_ENGINE_TYPE_SCENE_ASSEMBLY
6 - DXGK_ENGINE_TYPE_COPY
7 - DXGK_ENGINE_TYPE_OVERLAY
8 - DXGK_ENGINE_TYPE_CRYPTO

DMA 中断类型值

1 = DXGK_INTERRUPT_DMA_COMPLETED
2 = DXGK_INTERRUPT_DMA_PREEMPTED
4 = DXGK_INTERRUPT_DMA_FAULTED
9 = DXGK_INTERRUPT_DMA_PAGE_FAULTED

队列类型值

0 = Queue_Packet
1 = Dma_Packet
2 = Paging_Queue_Packet

驱动程序事件

负载平衡事件类型值

1 - LoadBalanceEvent_GPU
8 - LoadBalanceEvent_CPU
21 - LoadBalanceMasterEvent_GPU
22 - LoadBalanceMasterEvent_CPU

OpenMP 事件

OpenMP 事件类值

78 - TRACE_PROCESS_EVENT_OPENMP
79 - TRACE_PROCESS_EVENT_OPENMP_START
80 - TRACE_PROCESS_EVENT_OPENMP_FINISH

OpenMP 事件类型值

15 - OPENMP_EVENT_KIND_TASK_CREATE
16 - OPENMP_EVENT_KIND_TASK_SCHEDULE
17 - OPENMP_EVENT_KIND_CANCEL
20 - OPENMP_EVENT_KIND_MUTEX_RELEASED
21 - OPENMP_EVENT_KIND_LOCK_INIT
22 - OPENMP_EVENT_KIND_LOCK_DESTROY
25 - OPENMP_EVENT_KIND_DISPATCH
26 - OPENMP_EVENT_KIND_FLUSH
27 - OPENMP_EVENT_KIND_THREAD
28 - OPENMP_EVENT_KIND_PARALLEL
29 - OPENMP_EVENT_KIND_SYNC_REGION_WAIT
30 - OPENMP_EVENT_KIND_SYNC_REGION
31 - OPENMP_EVENT_KIND_TASK
32 - OPENMP_EVENT_KIND_MASTER
33 - OPENMP_EVENT_KIND_REDUCTION
34 - OPENMP_EVENT_KIND_MUTEX_WAIT
35 - OPENMP_EVENT_KIND_CRITICAL_SECTION
36 - OPENMP_EVENT_KIND_WORKSHARE

OpenMP 线程类型值

1 - OpenMP Initial Thread
2 - OpenMP Worker Thread
3 - OpenMP Internal Thread
4 - Unknown

OpenMP 同步区域类型值

1 - Barrier
2 - Implicit barrier
3 - Explicit barrier
4 - Implementation-dependent barrier
5 - Taskwait
6 - Taskgroup

OpenMP 任务类型值

1 - Initial task
2 - Implicit task
3 - Explicit task

OpenMP 先前任务状态值

1 - Task completed
2 - Task yielded to another task
3 - Task was cancelled
7 - Task was switched out for other reasons

OpenMP 互斥锁类型值

1 - Waiting for lock
2 - Testing lock
3 - Waiting for nested lock
4 - Tesing nested lock
5 - Waitng for entering critical section region
6 - Waiting for entering atomic region
7 - Waiting for entering ordered region

OpenMP 临界区类型值

5 - Critical section region
6 - Atomic region
7 - Ordered region

OpenMP 工作共享类型值

1 - Loop region
2 - Sections region
3 - Single region (executor)
4 - Single region (waiting)
5 - Workshare region
6 - Distrubute region
7 - Taskloop region

OpenMP 调度类型值

1 - Iteration
2 - Section

常见 SQLite 示例

常用辅助命令

当使用 sqlite3 命令行工具时,将数据打印为命名列会很有帮助,这可以使用以下命令完成

.mode column
.headers on

默认列宽由结果第一行中的数据确定。如果这效果不佳,您可以手动指定宽度。

.width 10 20 50

获取示例报告

Nsight Systems 的 CLI 界面用于分析 radixSortThrust CUDA 示例,然后使用 nsys export 导出生成的 .nsys-rep 文件。

nsys profile --trace=cuda,osrt radixSortThrust
nsys export --type sqlite report1.nsys-rep

序列化进程和线程标识符

Nsight Systems 以序列化形式存储事件的来源标识符。对于导出的具有 globalTid 或 globalPid 字段的事件,请使用以下代码提取数字 TID 和 PID。

SELECT globalTid / 0x1000000 % 0x1000000 AS PID, globalTid % 0x1000000 AS TID FROM TABLE_NAME;

注意

globalTid 字段同时包含 TID 和 PID 值,而 globalPid 仅包含 PID 值。

将 CUDA 内核启动与 CUDA API 内核启动关联起来

ALTER TABLE CUPTI_ACTIVITY_KIND_RUNTIME ADD COLUMN name TEXT;
ALTER TABLE CUPTI_ACTIVITY_KIND_RUNTIME ADD COLUMN kernelName TEXT;

UPDATE CUPTI_ACTIVITY_KIND_RUNTIME SET kernelName =
    (SELECT value FROM StringIds
    JOIN CUPTI_ACTIVITY_KIND_KERNEL AS cuda_gpu
        ON cuda_gpu.shortName = StringIds.id
        AND CUPTI_ACTIVITY_KIND_RUNTIME.correlationId = cuda_gpu.correlationId);

UPDATE CUPTI_ACTIVITY_KIND_RUNTIME SET name =
    (SELECT value FROM StringIds WHERE nameId = StringIds.id);

选择导致内核执行的 10 个最长的 CUDA API 范围。

SELECT name, kernelName, start, end FROM CUPTI_ACTIVITY_KIND_RUNTIME
    WHERE kernelName IS NOT NULL ORDER BY end - start LIMIT 10;

结果

name                    kernelName               start       end
----------------------  -----------------------  ----------  ----------
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  658863435   658868490
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  609755015   609760075
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  632683286   632688349
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  606495356   606500439
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  603114486   603119586
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  802729785   802734906
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  593381170   593386294
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  658759955   658765090
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  681549917   681555059
cudaLaunchKernel_v7000  RadixSortScanBinsKernel  717812527   717817671

删除与开销重叠的范围

使用此查询来计算与开销范围重叠的 CUDA API 范围。

将 “SELECT COUNT(*)” 替换为 “DELETE” 以删除此类范围。

SELECT COUNT(*) FROM CUPTI_ACTIVITY_KIND_RUNTIME WHERE rowid IN
(
    SELECT cuda.rowid
    FROM PROFILER_OVERHEAD as overhead
    INNER JOIN CUPTI_ACTIVITY_KIND_RUNTIME as cuda ON
    (cuda.start BETWEEN overhead.start and overhead.end)
    OR (cuda.end BETWEEN overhead.start and overhead.end)
    OR (cuda.start < overhead.start AND cuda.end > overhead.end)
);

结果

COUNT(*)
----------
1095

查找导致原始图形节点创建的 CUDA API 调用

SELECT graph.graphNodeId, api.start, graph.start as graphStart, api.end,
    api.globalTid, api.correlationId, api.globalTid,
    (SELECT value FROM StringIds where api.nameId == id) as name
FROM CUPTI_ACTIVITY_KIND_RUNTIME as api
JOIN
    (
        SELECT start, graphNodeId, globalTid from CUDA_GRAPH_NODE_EVENTS
        GROUP BY graphNodeId
        HAVING COUNT(originalGraphNodeId) = 0
    ) as graph
ON api.globalTid == graph.globalTid AND api.start < graph.start AND api.end > graph.start
ORDER BY graphNodeId;

结果

graphNodeId  start       graphStart  end         globalTid        correlationId  globalTid        name
-----------  ----------  ----------  ----------  ---------------  -------------  ---------------  -----------------------------
1            584366518   584378040   584379102   281560221750233  109            281560221750233  cudaGraphAddMemcpyNode_v10000
2            584379402   584382428   584383139   281560221750233  110            281560221750233  cudaGraphAddMemsetNode_v10000
3            584390663   584395352   584396053   281560221750233  111            281560221750233  cudaGraphAddKernelNode_v10000
4            584396314   584397857   584398438   281560221750233  112            281560221750233  cudaGraphAddMemsetNode_v10000
5            584398759   584400311   584400812   281560221750233  113            281560221750233  cudaGraphAddKernelNode_v10000
6            584401083   584403047   584403527   281560221750233  114            281560221750233  cudaGraphAddMemcpyNode_v10000
7            584403928   584404920   584405491   281560221750233  115            281560221750233  cudaGraphAddHostNode_v10000
29           632107852   632117921   632121407   281560221750233  144            281560221750233  cudaMemcpyAsync_v3020
30           632122168   632125545   632127989   281560221750233  145            281560221750233  cudaMemsetAsync_v3020
31           632131546   632133339   632135584   281560221750233  147            281560221750233  cudaMemsetAsync_v3020
34           632162514   632167393   632169297   281560221750233  151            281560221750233  cudaMemcpyAsync_v3020
35           632170068   632173334   632175388   281560221750233  152            281560221750233  cudaLaunchHostFunc_v10000

OSRT 范围的回溯

添加文本列使以下查询的结果更易于阅读。

ALTER TABLE OSRT_API ADD COLUMN name TEXT;
UPDATE OSRT_API SET name = (SELECT value FROM StringIds WHERE OSRT_API.nameId = StringIds.id);

ALTER TABLE OSRT_CALLCHAINS ADD COLUMN symbolName TEXT;
UPDATE OSRT_CALLCHAINS SET symbolName = (SELECT value FROM StringIds WHERE symbol = StringIds.id);

ALTER TABLE OSRT_CALLCHAINS ADD COLUMN moduleName TEXT;
UPDATE OSRT_CALLCHAINS SET moduleName = (SELECT value FROM StringIds WHERE module = StringIds.id);

打印最长 OSRT 范围的回溯。

SELECT globalTid / 0x1000000 % 0x1000000 AS PID, globalTid % 0x1000000 AS TID,
    start, end, name, callchainId, stackDepth, symbolName, moduleName
FROM OSRT_API LEFT JOIN OSRT_CALLCHAINS ON callchainId == OSRT_CALLCHAINS.id
WHERE OSRT_API.rowid IN (SELECT rowid FROM OSRT_API ORDER BY end - start DESC LIMIT 1)
ORDER BY stackDepth LIMIT 10;

结果

PID         TID         start       end         name                    callchainId  stackDepth  symbolName                      moduleName
----------  ----------  ----------  ----------  ----------------------  -----------  ----------  ------------------------------  ----------------------------------------
19163       19176       360897690   860966851   pthread_cond_timedwait  88           0           pthread_cond_timedwait@GLIBC_2  /lib/x86_64-linux-gnu/libpthread-2.27.so
19163       19176       360897690   860966851   pthread_cond_timedwait  88           1           0x7fbc983b7227                  /usr/lib/x86_64-linux-gnu/libcuda.so.418
19163       19176       360897690   860966851   pthread_cond_timedwait  88           2           0x7fbc9835d5c7                  /usr/lib/x86_64-linux-gnu/libcuda.so.418
19163       19176       360897690   860966851   pthread_cond_timedwait  88           3           0x7fbc983b64a8                  /usr/lib/x86_64-linux-gnu/libcuda.so.418
19163       19176       360897690   860966851   pthread_cond_timedwait  88           4           start_thread                    /lib/x86_64-linux-gnu/libpthread-2.27.so
19163       19176       360897690   860966851   pthread_cond_timedwait  88           5           __clone                         /lib/x86_64-linux-gnu/libc-2.27.so

分析进程输出流。

ALTER TABLE ProcessStreams ADD COLUMN filename TEXT;
UPDATE ProcessStreams SET filename = (SELECT value FROM StringIds WHERE ProcessStreams.filenameId = StringIds.id);

ALTER TABLE ProcessStreams ADD COLUMN content TEXT;
UPDATE ProcessStreams SET content = (SELECT value FROM StringIds WHERE ProcessStreams.contentId = StringIds.id);

选择所有收集的 stdout 和 stderr 流。

select globalPid / 0x1000000 % 0x1000000 AS PID, filename, content from ProcessStreams;

结果

PID         filename                                                 content
----------  -------------------------------------------------------  --------------------------------------------------------------------------------------------------------------------
19163       /tmp/nvidia/nsight_systems/streams/pid_19163_stdout.log  /home/user_name/NVIDIA_CUDA-10.1_Samples/6_Advanced/radixSortThrust/radixSortThrust Starting...

GPU Device 0: "Quadro P2000" with compute capability 6.1


Sorting 1048576 32-bit unsigned int keys and values

radixSortThrust, Throughput = 401.0872 MElements/s, Time = 0.00261 s, Size = 1048576 elements
Test passed

19163       /tmp/nvidia/nsight_systems/streams/pid_19163_stderr.log

线程摘要

请注意,Nsight Systems 在采样事件处理期间应用了额外的逻辑来解决丢失事件的问题。这意味着以下查询的结果可能与 “分析摘要” 选项卡中显示的结果略有不同。

使用 CPU 周期(如果可用)计算的线程摘要。

SELECT
    globalTid / 0x1000000 % 0x1000000 AS PID,
    globalTid % 0x1000000 AS TID,
    ROUND(100.0 * SUM(cpuCycles) /
        (
            SELECT SUM(cpuCycles) FROM COMPOSITE_EVENTS
            GROUP BY globalTid / 0x1000000000000 % 0x100
        ),
        2
    ) as CPU_utilization,
    (SELECT value FROM StringIds WHERE id =
        (
            SELECT nameId FROM ThreadNames
            WHERE ThreadNames.globalTid = COMPOSITE_EVENTS.globalTid
        )
    ) as thread_name
FROM COMPOSITE_EVENTS
GROUP BY globalTid
ORDER BY CPU_utilization DESC
LIMIT 10;

结果

PID         TID         CPU_utilization  thread_name
----------  ----------  ---------------  ---------------
19163       19163       98.4             radixSortThrust
19163       19168       1.35             CUPTI worker th
19163       19166       0.25             [NS]

当未收集 PMU 计数器数据时,可以使用调度数据计算线程运行时间。

CREATE INDEX sched_start ON SCHED_EVENTS (start);

CREATE TABLE CPU_USAGE AS
SELECT
    first.globalTid as globalTid,
    (SELECT nameId FROM ThreadNames WHERE ThreadNames.globalTid = first.globalTid) as nameId,
    sum(second.start - first.start) as total_duration,
    count() as ranges_count
FROM SCHED_EVENTS as first
LEFT JOIN SCHED_EVENTS as second
ON second.rowid =
    (
        SELECT rowid
        FROM SCHED_EVENTS
        WHERE start > first.start AND globalTid = first.globalTid
        ORDER BY start ASC
        LIMIT 1
    )
WHERE first.isSchedIn != 0
GROUP BY first.globalTid
ORDER BY total_duration DESC;

SELECT
    globalTid / 0x1000000 % 0x1000000 AS PID,
    globalTid % 0x1000000 AS TID,
    (SELECT value FROM StringIds where nameId == id) as thread_name,
    ROUND(100.0 * total_duration / (SELECT SUM(total_duration) FROM CPU_USAGE), 2) as CPU_utilization
FROM CPU_USAGE
ORDER BY CPU_utilization DESC;

结果

PID         TID         thread_name      CPU_utilization
----------  ----------  ---------------  ---------------
19163       19163       radixSortThrust  93.74
19163       19169       radixSortThrust  3.22
19163       19168       CUPTI worker th  2.46
19163       19166       [NS]             0.44
19163       19172       radixSortThrust  0.07
19163       19167       [NS Comms]       0.05
19163       19176       radixSortThrust  0.02
19163       19170       radixSortThrust  0.0

函数表

这些示例演示了如何计算平面视图和自底向上视图(仅限顶层)统计信息。

设置

ALTER TABLE SAMPLING_CALLCHAINS ADD COLUMN symbolName TEXT;
UPDATE SAMPLING_CALLCHAINS SET symbolName = (SELECT value FROM StringIds WHERE symbol = StringIds.id);

ALTER TABLE SAMPLING_CALLCHAINS ADD COLUMN moduleName TEXT;
UPDATE SAMPLING_CALLCHAINS SET moduleName = (SELECT value FROM StringIds WHERE module = StringIds.id);

获取平面视图

SELECT symbolName, moduleName, ROUND(100.0 * sum(cpuCycles) /
    (SELECT SUM(cpuCycles) FROM COMPOSITE_EVENTS), 2) AS flatTimePercentage
FROM SAMPLING_CALLCHAINS
LEFT JOIN COMPOSITE_EVENTS ON SAMPLING_CALLCHAINS.id == COMPOSITE_EVENTS.id
GROUP BY symbol, module
ORDER BY flatTimePercentage DESC
LIMIT 5;

获取自底向上视图(仅限顶层)

SELECT symbolName, moduleName, ROUND(100.0 * sum(cpuCycles) /
    (SELECT SUM(cpuCycles) FROM COMPOSITE_EVENTS), 2) AS selfTimePercentage
FROM SAMPLING_CALLCHAINS
LEFT JOIN COMPOSITE_EVENTS ON SAMPLING_CALLCHAINS.id == COMPOSITE_EVENTS.id
WHERE stackDepth == 0
GROUP BY symbol, module
ORDER BY selfTimePercentage DESC
LIMIT 5;

结果

symbolName   moduleName   flatTimePercentage
-----------  -----------  ------------------
[Max depth]  [Max depth]  99.92
thrust::zip  /home/user_  24.17
thrust::zip  /home/user_  24.17
thrust::det  /home/user_  24.17
thrust::det  /home/user_  24.17
symbolName      moduleName                                   selfTimePercentage
--------------  -------------------------------------------  ------------------
0x7fbc984982b6  /usr/lib/x86_64-linux-gnu/libcuda.so.418.39  5.29
0x7fbc982d0010  /usr/lib/x86_64-linux-gnu/libcuda.so.418.39  2.81
thrust::iterat  /home/user_name/NVIDIA_CUDA-10.1_Samples/6_  2.23
thrust::iterat  /home/user_name/NVIDIA_CUDA-10.1_Samples/6_  1.55
void thrust::i  /home/user_name/NVIDIA_CUDA-10.1_Samples/6_  1.55

DX12 API 帧持续时间直方图

该示例演示了如何计算 DX12 CPU 帧持续时间并从中构建直方图。

CREATE INDEX DX12_API_ENDTS ON DX12_API (end);

CREATE TEMP VIEW DX12_API_FPS AS SELECT end AS start,
    (SELECT end FROM DX12_API
        WHERE end > outer.end AND nameId == (SELECT id FROM StringIds
            WHERE value == "IDXGISwapChain::Present")
        ORDER BY end ASC LIMIT 1) AS end
FROM DX12_API AS outer
    WHERE nameId == (SELECT id FROM StringIds WHERE value == "IDXGISwapChain::Present")
ORDER BY end;

持续时间为 [X, X + 1] 毫秒的帧数。

SELECT
    CAST((end - start) / 1000000.0 AS INT) AS duration_ms,
    count(*)
FROM DX12_API_FPS
WHERE end IS NOT NULL
GROUP BY duration_ms
ORDER BY duration_ms;

结果

duration_ms  count(*)
-----------  ----------
3            1
4            2
5            7
6            153
7            19
8            116
9            16
10           8
11           2
12           2
13           1
14           4
16           3
17           2
18           1

GPU 上下文切换事件枚举

GPU 上下文持续时间介于第一个 BEGIN 事件和匹配的 END 事件之间。

SELECT (CASE tag WHEN 8 THEN "BEGIN" WHEN 7 THEN "END" END) AS tag,
    globalPid / 0x1000000 % 0x1000000 AS PID,
    vmId, seqNo, contextId, timestamp, gpuId FROM GPU_CONTEXT_SWITCH_EVENTS
WHERE tag in (7, 8) ORDER BY seqNo LIMIT 10;

结果

tag         PID         vmId        seqNo       contextId   timestamp   gpuId
----------  ----------  ----------  ----------  ----------  ----------  ----------
BEGIN       23371       0           0           1048578     56759171    0
BEGIN       23371       0           1           1048578     56927765    0
BEGIN       23371       0           3           1048578     63799379    0
END         23371       0           4           1048578     63918806    0
BEGIN       19397       0           5           1048577     64014692    0
BEGIN       19397       0           6           1048577     64250369    0
BEGIN       19397       0           8           1048577     1918310004  0
END         19397       0           9           1048577     1918521098  0
BEGIN       19397       0           10          1048577     2024164744  0
BEGIN       19397       0           11          1048577     2024358650  0

解析 NVTX 类别名称

该示例演示了如何解析 NVTX 标记和范围的 NVTX 类别名称。

WITH
  event AS (
    SELECT *
    FROM NVTX_EVENTS
    WHERE eventType IN (34, 59, 60) -- mark, push/pop, start/end
  ),
  category AS (
    SELECT
      category,
      domainId,
      text AS categoryName
    FROM NVTX_EVENTS
    WHERE eventType == 33 --  new category
  )
SELECT
  start,
  end,
  globalTid,
  eventType,
  domainId,
  category,
  categoryName,
  text
FROM event JOIN category USING (category, domainId)
ORDER BY start;

结果

start       end         globalTid        eventType   domainId    category    categoryName               text
----------  ----------  ---------------  ----------  ----------  ----------  -------------------------  ----------------
18281150    18311960    281534938484214  59          0           1           FirstCategoryUnderDefault  Push Pop Range A
18288187    18306674    281534938484214  59          0           2           SecondCategoryUnderDefaul  Push Pop Range B
18294247                281534938484214  34          0           1           FirstCategoryUnderDefault  Mark A
18300034                281534938484214  34          0           2           SecondCategoryUnderDefaul  Mark B
18345546    18372595    281534938484214  60          1           1           FirstCategoryUnderMyDomai  Start End Range
18352924    18378342    281534938484214  60          1           2           SecondCategoryUnderMyDoma  Start End Range
18359634                281534938484214  34          1           1           FirstCategoryUnderMyDomai  Mark A
18365448                281534938484214  34          1           2           SecondCategoryUnderMyDoma  Mark B

使用 NVTX 重命名 CUDA 内核

该示例演示了如何将最内层的 NVTX push-pop 范围映射到匹配的 CUDA 内核运行。

ALTER TABLE CUPTI_ACTIVITY_KIND_KERNEL ADD COLUMN nvtxRange TEXT;
CREATE INDEX nvtx_start ON NVTX_EVENTS (start);


UPDATE CUPTI_ACTIVITY_KIND_KERNEL SET nvtxRange = (
    SELECT NVTX_EVENTS.text
    FROM NVTX_EVENTS JOIN CUPTI_ACTIVITY_KIND_RUNTIME ON
        NVTX_EVENTS.eventType == 59 AND
        NVTX_EVENTS.globalTid == CUPTI_ACTIVITY_KIND_RUNTIME.globalTid AND
        NVTX_EVENTS.start <= CUPTI_ACTIVITY_KIND_RUNTIME.start AND
        NVTX_EVENTS.end >= CUPTI_ACTIVITY_KIND_RUNTIME.end
    WHERE
        CUPTI_ACTIVITY_KIND_KERNEL.correlationId == CUPTI_ACTIVITY_KIND_RUNTIME.correlationId
    ORDER BY NVTX_EVENTS.start DESC LIMIT 1
);

SELECT start, end, globalPid, StringIds.value as shortName, nvtxRange
FROM CUPTI_ACTIVITY_KIND_KERNEL JOIN StringIds ON shortName == id
ORDER BY start LIMIT 6;

结果

start       end         globalPid          shortName      nvtxRange
----------  ----------  -----------------  -------------  ----------
526545376   526676256   72057700439031808  MatrixMulCUDA
526899648   527030368   72057700439031808  MatrixMulCUDA  Add
527031648   527162272   72057700439031808  MatrixMulCUDA  Add
527163584   527294176   72057700439031808  MatrixMulCUDA  My Kernel
527296160   527426592   72057700439031808  MatrixMulCUDA  My Range
527428096   527558656   72057700439031808  MatrixMulCUDA

选择带有回溯的 CUDA 调用

ALTER TABLE CUPTI_ACTIVITY_KIND_RUNTIME ADD COLUMN name TEXT;
UPDATE CUPTI_ACTIVITY_KIND_RUNTIME SET name = (SELECT value FROM StringIds WHERE CUPTI_ACTIVITY_KIND_RUNTIME.nameId = StringIds.id);

ALTER TABLE CUDA_CALLCHAINS ADD COLUMN symbolName TEXT;
UPDATE CUDA_CALLCHAINS SET symbolName = (SELECT value FROM StringIds WHERE symbol = StringIds.id);

SELECT globalTid % 0x1000000 AS TID,
    start, end, name, callchainId, stackDepth, symbolName
FROM CUDA_CALLCHAINS JOIN CUPTI_ACTIVITY_KIND_RUNTIME ON callchainId == CUDA_CALLCHAINS.id
ORDER BY callchainId, stackDepth LIMIT 11;

结果

TID         start       end         name           callchainId  stackDepth  symbolName
----------  ----------  ----------  -------------  -----------  ----------  --------------
11928       168976467   169077826   cuMemAlloc_v2  1            0           0x7f13c44f02ab
11928       168976467   169077826   cuMemAlloc_v2  1            1           0x7f13c44f0b8f
11928       168976467   169077826   cuMemAlloc_v2  1            2           0x7f13c44f3719
11928       168976467   169077826   cuMemAlloc_v2  1            3           cuMemAlloc_v2
11928       168976467   169077826   cuMemAlloc_v2  1            4           cudart::driver
11928       168976467   169077826   cuMemAlloc_v2  1            5           cudart::cudaAp
11928       168976467   169077826   cuMemAlloc_v2  1            6           cudaMalloc
11928       168976467   169077826   cuMemAlloc_v2  1            7           cudaError cuda
11928       168976467   169077826   cuMemAlloc_v2  1            8           main
11928       168976467   169077826   cuMemAlloc_v2  1            9           __libc_start_m
11928       168976467   169077826   cuMemAlloc_v2  1            10          _start

SLI 对等查询

该示例演示了如何查询资源大小大于值且在按资源大小降序排序的时间范围内的 SLI 对等事件。

SELECT *
FROM SLI_P2P
WHERE resourceSize < 98304 AND start > 1568063100 AND end < 1579468901
ORDER BY resourceSize DESC;

结果

start       end         eventClass  globalTid          gpu         frameId     transferSkipped  srcGpu      dstGpu      numSubResources  resourceSize  subResourceIdx  smplWidth   smplHeight  smplDepth   bytesPerElement  dxgiFormat  logSurfaceNames  transferInfo  isEarlyPushManagedByNvApi  useAsyncP2pForResolve  transferFuncName  regimeName  debugName   bindType
----------  ----------  ----------  -----------------  ----------  ----------  ---------------  ----------  ----------  ---------------  ------------  --------------  ----------  ----------  ----------  ---------------  ----------  ---------------  ------------  -------------------------  ---------------------  ----------------  ----------  ----------  ----------
1570351100  1570351101  62          72057698056667136  0           771         0                256         512         1                1048576       0               256         256         1           16               2                            3             0                          0
1570379300  1570379301  62          72057698056667136  0           771         0                256         512         1                1048576       0               64          64          64          4                31                           3             0                          0
1572316400  1572316401  62          72057698056667136  0           773         0                256         512         1                1048576       0               256         256         1           16               2                            3             0                          0
1572345400  1572345401  62          72057698056667136  0           773         0                256         512         1                1048576       0               64          64          64          4                31                           3             0                          0
1574734300  1574734301  62          72057698056667136  0           775         0                256         512         1                1048576       0               256         256         1           16               2                            3             0                          0
1574767200  1574767201  62          72057698056667136  0           775         0                256         512         1                1048576       0               64          64          64          4                31                           3             0                          0

通用事件

按 PID 的系统调用使用情况直方图

SELECT json_extract(data, '$.common_pid') AS PID, count(*) AS total
FROM GENERIC_EVENTS WHERE PID IS NOT NULL AND typeId = (
  SELECT typeId FROM GENERIC_EVENT_TYPES
  WHERE json_extract(data, '$.Name') = "raw_syscalls:sys_enter")
GROUP BY PID
ORDER BY total DESC
LIMIT 10;

结果

PID         total
----------  ----------
5551        32811
9680        3988
4328        1477
9564        1246
4376        1204
4377        1167
4357        656
4355        655
4356        640
4354        633

以 JSON 格式获取通用事件

文本和 JSON 导出模式不包含通用事件。使用以下查询(不带 LIMIT 子句)来提取通用事件、类型和源的 JSON 行表示。

SELECT json_insert('{}',
    '$.sourceId', sourceId,
    '$.data', json(data)
)
FROM GENERIC_EVENT_SOURCES LIMIT 2;

SELECT json_insert('{}',
    '$.typeId', typeId,
    '$.sourceId', sourceId,
    '$.data', json(data)
)
FROM GENERIC_EVENT_TYPES LIMIT 2;

SELECT json_insert('{}',
    '$.rawTimestamp', rawTimestamp,
    '$.timestamp', timestamp,
    '$.typeId', typeId,
    '$.data', json(data)
)
FROM GENERIC_EVENTS LIMIT 2;

结果

json_insert('{}',
    '$.sourceId', sourceId,
    '$.data', json(data)
)
---------------------------------------------------------------------------------------------------------------
{"sourceId":72057602627862528,"data":{"Name":"FTrace","TimeSource":"ClockMonotonicRaw","SourceGroup":"FTrace"}}
json_insert('{}',
    '$.typeId', typeId,
    '$.sourceId', sourceId,
    '$.data', json(data)
)
--------------------------------------------------------------------------------------------------------------------
{"typeId":72057602627862547,"sourceId":72057602627862528,"data":{"Name":"raw_syscalls:sys_enter","Format":"\"NR %ld (%lx, %lx, %lx, %lx, %lx, %lx)\", REC->id, REC->args[0], REC->args[1], REC->args[2], REC->args[3], REC->args[4], REC->args[5]","Fields":[{"Name":"common_pid","Prefix":"int","Suffix":""},{"Name":"id","Prefix":"long","S
{"typeId":72057602627862670,"sourceId":72057602627862528,"data":{"Name":"irq:irq_handler_entry","Format":"\"irq=%d name=%s\", REC->irq, __get_str(name)","Fields":[{"Name":"common_pid","Prefix":"int","Suffix":""},{"Name":"irq","Prefix":"int","Suffix":""},{"Name":"name","Prefix":"__data_loc char[]","Suffix":""},{"Name":"common_type",
json_insert('{}',
    '$.rawTimestamp', rawTimestamp,
    '$.timestamp', timestamp,
    '$.typeId', typeId,
    '$.data', json(data)
)
--------------------------------------------------------------------------------------------------------------------
{"rawTimestamp":1183694330725221,"timestamp":6236683,"typeId":72057602627862670,"data":{"common_pid":"0","irq":"66","name":"327696","common_type":"142","common_flags":"9","common_preempt_count":"0"}}
{"rawTimestamp":1183694333695687,"timestamp":9207149,"typeId":72057602627862670,"data":{"common_pid":"0","irq":"66","name":"327696","common_type":"142","common_flags":"9","common_preempt_count":"0"}}

Arrow 格式描述

Arrow 类型导出文件 .arrows 使用 IPC 流格式来存储文件中的所有表。可以通过将文件作为 arrow 流打开来读取这些表。例如,可以使用 arrow python 包中的 open_stream 函数。有关可用于读取 IPC 流文件的接口的更多信息,请参阅 Apache Arrow 文档 [1, 2]。

每个表的名称都包含在模式元数据中。因此,在读取每个表时,用户可以从元数据中提取表标题。表名称元数据字段的键为 table_name。所有可用表的标题可以在 SQLite 模式参考 部分找到。

下面提供了用 Python 编写的示例函数,用于读取 .arrows 文件中的所有 Arrow 表

import pyarrow as pa

def read_tables(arrow_file):
    with pa.input_stream(arrow_file) as source:
        while source.tell() < source.size():
            try:
                yield pa.ipc.open_stream(arrow_file).read_all()
            except:
                continue

Arrow 目录导出器类型 _arwdir 将创建一个目录,其中每个表/数据集对应一个 arrow 文件。

JSON 和文本格式描述

JSON 和 TXT 导出格式是通过序列化缓冲的消息生成的,每个消息占一行。首先,处理所有收集的事件。然后序列化字符串,接着是 stdout、stderr 流(如果有),最后是线程名称。

输出布局

{Event #1}
{Event #2}
...
{Event #N}
{Strings}
{Streams}
{Threads}

为了更轻松地 grep JSON 输出,可以使用 --separate-strings 开关来强制手动拆分字符串、流和线程名称数据。

示例行拆分:nsys export --type=json --separate-strings sample.nsys-rep -- -

{"type":"String","id":"3720","value":"Process 14944 was launched by the profiler"}
{"type":"String","id":"3721","value":"Profiling has started."}
{"type":"String","id":"3722","value":"Profiler attached to the process."}
{"type":"String","id":"3723","value":"Profiling has stopped."}
{"type":"ThreadName","globalTid":"72057844756653436","nameId":"14","priority":"10"}
{"type":"ThreadName","globalTid":"72057844756657940","nameId":"15","priority":"10"}
{"type":"ThreadName","globalTid":"72057844756654400","nameId":"24","priority":"10"}

与以下内容比较:nsys export --type=json sample.nsys-rep -- -

{"data":["[Unknown]","[Unknown kernel module]","[Max depth]","[Broken backtraces]",
  "[Called from Java]","QnxKernelTrace","mm_","task_submit","class_id","syncpt_id",
  "syncpt_thresh","pid","tid","FTrace","[NSys]","[NSys Comms]", "..." ,"Process
  14944 was launched by the profiler","Profiling has started.","Profiler attached
  to the process.","Profiling has stopped."]}
{"data":[{"nameIdx":"14","priority":"10","globalTid":"72057844756653436"},
  {"nameIdx":"15","priority":"10","globalTid":"72057844756657940"},{"nameIdx":"24",
  "priority":"10","globalTid":"72057844756654400"}]}

请注意,此处仅显示最后几行以使其更清晰,并且添加了回车符和缩进以避免文档换行。

统计分析

Nsight Systems 附带的统计报告

Nsight Systems 开发团队创建并维护了一组用于某些常用统计报告的报告脚本。这些脚本将进行更新,以适应 SQLite 模式或内部数据结构的任何更改。

这些脚本位于 Nsight Systems 软件包的 Target-<architecture>/reports 目录中。以下是可用的标准报告

注意

显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

注意

默认情况下,所有时间值均以纳秒为单位给出。如果您希望使用不同的时间单位输出结果,请在运行 recipe 时使用 --timeunit 选项。

cuda_api_gpu_sum[:nvtx-name][:base|:mangled] – CUDA 摘要(API/内核/内存操作)

参数

  • nvtx-name : 可选参数,如果给定,将在内核名称前加上最内层封闭 NVTX 范围的名称。

  • base - 可选参数,如果给定,将使摘要基于内核的基本名称,而不是模板化的名称。

  • mangled - 可选参数,如果给定,将使摘要基于内核的原始乱码名称,而不是模板化的名称。

注意

显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此内核所有执行的总时间

  • 实例数 : 此内核的执行次数

  • 平均值 : 此内核的平均执行时间

  • 中位数 : 此内核的执行时间中位数

  • 最小值 : 此内核的最小执行时间

  • 最大值 : 此内核的最大执行时间

  • 标准差 : 此内核的执行时间标准差

  • 类别 : 操作类别

  • 操作 : 内核名称

此报告提供了 CUDA API 调用、内核和内存操作及其执行时间的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该 API 调用、内核或内存操作在列出的 API、内核和内存操作的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

此报告结合了 cuda_api_sumcuda_gpu_kern_sumcuda_gpu_mem_size_sum 报告中的数据。它与 nvprof --dependency-analysis 的配置文件部分非常相似。

cuda_api_sum – CUDA API 摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此函数所有执行的总时间

  • 调用次数 : 对此函数的调用次数

  • 平均值 : 此函数的平均执行时间

  • 中位数 : 此函数的执行时间中位数

  • 最小值 : 此函数的最小执行时间

  • 最大值 : 此函数的最大执行时间

  • 标准差 : 此函数时间的标准差

  • 名称 : 函数名称

此报告提供了 CUDA API 函数及其执行时间的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该函数在列出的函数的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

cuda_api_trace – CUDA API 跟踪

参数 - 无

输出:所有时间值默认为纳秒

  • 开始 : API 调用发生时的时间戳

  • 持续时间 : API 调用的长度

  • 名称 : API 函数名称

  • 结果 : API 调用的返回值

  • CorrID : 用于映射到其他 CUDA 调用的关联 ID

  • Pid : 发出调用的进程 ID

  • Tid : 发出调用的线程 ID

  • T-Pri : 调用线程的运行优先级

  • 线程名称 : 调用 API 函数的线程名称

此报告提供了 CUDA API 函数调用的跟踪记录及其执行时间。

cuda_gpu_kern_gb_sum[:nvtx-name][:base|:mangled] – CUDA GPU 内核/网格/块摘要

参数

  • nvtx-name - 可选参数,如果给定,将在内核名称前加上最内层封闭 NVTX 范围的名称。

  • base - 可选参数,如果给定,将使摘要基于内核的基本名称,而不是模板化的名称。

  • mangled - 可选参数,如果给定,将使摘要基于内核的原始乱码名称,而不是模板化的名称。

注意

显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此内核所有执行的总时间

  • 实例数 : 对此内核的调用次数

  • 平均值 : 此内核的平均执行时间

  • 中位数 : 此内核的执行时间中位数

  • 最小值 : 此内核的最小执行时间

  • 最大值 : 此内核的最大执行时间

  • 标准差 : 此内核时间的标准差

  • GridXYZ : 内核启动调用的网格维度

  • BlockXYZ : 内核启动调用的块维度

  • 名称 : 内核名称

此报告提供了 CUDA 内核及其执行时间的摘要。内核按网格维度、块维度和内核名称排序。“时间”列是使用“总时间”列的总和计算得出的,表示该内核在列出的内核的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

cuda_gpu_kern_sum[:nvtx-name][:base|:mangled] – CUDA GPU 内核摘要

注意

在 Nsight Systems 的最新版本中,此报告已扩展为包含 CUDA 网格和块维度并按其排序。此更改是为了适应进行某种类型优化工作的开发人员。不幸的是,此更改给进行不同类型优化工作的开发人员带来了意想不到的负担。为了满足这两种用例,此报告已恢复为原始形式,不包含网格或块信息。创建了一个名为 cuda_gpu_kern_gb_sum 的新报告,其中保留了网格和块信息。

参数

  • nvtx-name - 可选参数,如果给定,将在内核名称前加上最内层封闭 NVTX 范围的名称。

  • base - 可选参数,如果给定,将使摘要基于内核的基本名称,而不是模板化的名称。

  • mangled - 可选参数,如果给定,将使摘要基于内核的原始乱码名称,而不是模板化的名称。

注意

显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此内核所有执行的总时间

  • 实例数 : 对此内核的调用次数

  • 平均值 : 此内核的平均执行时间

  • 中位数 : 此内核的执行时间中位数

  • 最小值 : 此内核的最小执行时间

  • 最大值 : 此内核的最大执行时间

  • 标准差 : 此内核时间的标准差

  • 名称 : 内核名称

此报告提供了 CUDA 内核及其执行时间的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该内核在列出的内核的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

cuda_gpu_mem_size_sum – CUDA GPU 内存操作摘要(按大小)

参数 - 无

输出

  • 总计 : 此操作使用的总内存

  • 计数 : 此操作的执行次数

  • 平均值 : 此操作的平均内存大小

  • 中位数 : 此操作的内存大小中位数

  • 最小值 : 此操作的最小内存大小

  • 最大值 : 此操作的最大内存大小

  • 标准差 : 此操作的内存大小标准差

  • 操作 : 操作名称

此报告提供了 GPU 内存操作及其使用的内存量的摘要。

cuda_gpu_mem_time_sum – CUDA GPU 内存操作摘要(按时间)

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此操作所有执行的总时间

  • 计数 : 此类型操作的数量

  • 平均值 : 此操作的平均执行时间

  • 中位数 : 此操作的执行时间中位数

  • 最小值 : 此操作的最小执行时间

  • 最大值 : 此操作的最大执行时间

  • 标准差 : 此操作的执行时间标准差

  • 操作 : 内存操作名称

此报告提供了 GPU 内存操作及其执行时间的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该操作在列出的操作的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

cuda_gpu_sum[:nvtx-name][:base|:mangled] – CUDA GPU 摘要(内核/内存操作)

参数

  • nvtx-name - 可选参数,如果给定,将在内核名称前加上最内层封闭 NVTX 范围的名称。

  • base - 可选参数,如果给定,将使摘要基于内核的基本名称,而不是模板化的名称。

  • mangled - 可选参数,如果给定,将使摘要基于内核的原始乱码名称,而不是模板化的名称。

注意

显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此内核所有执行的总时间

  • 实例数 : 此内核的执行次数

  • 平均值 : 此内核的平均执行时间

  • 中位数 : 此内核的执行时间中位数

  • 最小值 : 此内核的最小执行时间

  • 最大值 : 此内核的最大执行时间

  • 标准差 : 此内核的执行时间标准差

  • 类别 : 操作类别

  • 操作 : 内核名称

此报告提供了 CUDA 内核和内存操作及其执行时间的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该内核或内存操作在列出的内核和内存操作的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

此报告结合了 cuda_gpu_kern_sumcuda_gpu_mem_time_sum 报告中的数据。此报告与命令 nvprof --print-gpu-summary 的输出非常相似。

cuda_gpu_trace[:nvtx-name][:base|:mangled] – CUDA GPU 跟踪

参数

  • nvtx-name - 可选参数,如果给定,将在内核名称前加上最内层封闭 NVTX 范围的名称。

  • base - 可选参数,如果给定,将显示内核的基本名称,而不是模板化的名称。

  • mangled - 可选参数,如果给定,将显示内核的原始乱码名称,而不是模板化的名称。

注意

显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

输出:所有时间值默认为纳秒

  • 开始 : 开始时间的时间戳

  • 持续时间 : 事件长度

  • CorrId : 关联 ID

  • GrdX, GrdY, GrdZ : 网格值

  • BlkX, BlkY, BlkZ : 块值

  • Reg/Trd : 每个线程的寄存器数

  • StcSMem : 静态共享内存大小

  • DymSMem : 动态共享内存大小

  • Bytes : 内存操作的大小

  • 吞吐量 : 内存吞吐量

  • SrcMemKd : Memcpy 源内存类型或 memset 内存类型

  • DstMemKd : Memcpy 目标内存类型

  • 设备 : GPU 设备名称和 ID

  • Ctx : 上下文 ID

  • GreenCtx: Green 上下文 ID

  • Strm : 流 ID

  • 名称 : 跟踪事件名称

此报告显示 CUDA 内核和内存操作的跟踪。项目按开始时间排序。

cuda_kern_exec_sum[:nvtx-name][:base|:mangled] – CUDA 内核启动和执行时间摘要

参数

  • nvtx-name - 可选参数,如果给定,将在内核名称前加上最内层封闭 NVTX 范围的名称。

  • base - 可选参数,如果给定,将使摘要基于内核的基本名称,而不是模板化的名称。

  • mangled - 可选参数,如果给定,将使摘要基于内核的原始乱码名称,而不是模板化的名称。

注意

显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

输出:所有时间值默认为纳秒

  • PID : 发出内核启动调用的进程 ID

  • TID : 发出内核启动调用的线程 ID

  • DevId : 执行内核的 CUDA 设备 ID(哪个 GPU)

  • 计数 : 内核记录数

  • QCount : 队列时间为正的内核记录数

平均值、中位数、最小值、最大值和标准差,适用于

  • TAvg, TMed, TMin, TMax, TStdDev : 总时间

  • AAvg, AMed, AMin, AMax, AStdDev : API 时间

  • QAvg, QMed, QMin, QMax, QStdDev : 队列时间

  • KAvg, KMed, KMin, KMax, KStdDev : 内核时间

  • API 名称 : 用于启动内核的 CUDA API 调用名称

  • 内核名称 : CUDA 内核名称

此报告提供了 CUDA 内核的启动和执行时间的摘要。启动和执行分为三个阶段:“API 时间”,用于启动内核的 CPU 上 CUDA API 调用的执行时间;“队列时间”,启动调用和内核执行之间的时间;以及“内核时间”,GPU 上的内核执行时间。“总时间”不仅仅是其他时间的总和,因为这些阶段有时会重叠。相反,总时间从 API 调用的开始到 API 调用的结束或内核执行的结束(以较晚者为准)运行。

报告的队列时间是从 API 调用的结束到内核执行的开始测量的。实际队列时间稍长,因为内核在 API 调用的中间而不是函数执行的最后一纳秒排队。由于这种延迟,内核执行可能在 CUDA 启动调用返回之前开始。在这些情况下,不会报告队列时间。队列平均值、最小值、最大值和标准差计算中仅包含队列时间为正的内核启动。“QCount”列指示有多少启动具有正队列时间(以及有多少启动参与了队列时间统计信息的计算)。从“计数”中减去“QCount”将指示有多少内核没有队列时间。

请注意,有队列时间并非本质上是坏事。队列时间表示在调度新内核启动时,GPU 正忙于运行其他任务。如果每个内核启动都是立即的,没有任何队列时间,则 _可能_ 表示 GPU 空闲且利用率低。就性能优化而言,消除队列时间不一定是一个目标。

cuda_kern_exec_trace[:nvtx-name][:base|:mangled] – CUDA 内核启动和执行时间跟踪

参数

  • nvtx-name - 可选参数,如果给定,将在内核名称前加上最内层封闭 NVTX 范围的名称。

  • base - 可选参数,如果给定,将使摘要基于内核的基本名称,而不是模板化的名称。

  • mangled - 可选参数,如果给定,将使摘要基于内核的原始乱码名称,而不是模板化的名称。

注意:显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

输出:所有时间值默认为纳秒

  • API 开始 : CUDA API 启动调用的开始时间戳

  • API 持续时间 : CUDA API 启动调用的持续时间

  • 队列开始 : 队列等待时间的开始时间戳(如果存在)

  • 队列持续时间 : 队列等待时间的持续时间(如果存在)

  • 内核开始 : CUDA 内核的开始时间戳

  • 内核持续时间 : CUDA 内核的持续时间

  • 总持续时间 : 从 API 开始到内核结束的持续时间

  • PID : 发出内核启动调用的进程 ID

  • TID : 发出内核启动调用的线程 ID

  • DevId : 执行内核的 CUDA 设备 ID(哪个 GPU)

  • API 函数 : 用于启动内核的 CUDA API 调用名称

  • GridXYZ : 内核启动调用的网格维度

  • BlockXYZ : 内核启动调用的块维度

  • 内核名称 : CUDA 内核名称

此报告提供了每个 CUDA 内核的启动和执行时间的跟踪。启动和执行分为三个阶段:“API 时间”,用于启动内核的 CPU 上 CUDA API 调用的执行时间;“队列时间”,启动调用和内核执行之间的时间;以及“内核时间”,GPU 上的内核执行时间。“总时间”不仅仅是其他时间的总和,因为这些阶段有时会重叠。相反,总时间从 API 调用的开始到 API 调用的结束或内核执行的结束(以较晚者为准)运行。

报告的队列时间是从 API 调用的结束到内核执行的开始测量的。实际队列时间稍长,因为内核在 API 调用的中间而不是函数执行的最后一纳秒排队。由于这种延迟,内核执行可能在 CUDA 启动调用返回之前开始。在这些情况下,不会报告队列时间。

请注意,有队列时间并非本质上是坏事。队列时间表示在调度新内核启动时,GPU 正忙于运行其他任务。如果每个内核启动都是立即的,没有任何队列时间,则 _可能_ 表示 GPU 空闲且利用率低。就性能优化而言,消除队列时间不一定是一个目标。

dx11_pix_sum – DX11 PIX 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此 rage 的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

此报告提供了 D3D11 PIX CPU 调试标记及其执行时间的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该范围在列出的范围的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

dx12_gpu_marker_sum – DX12 GPU 命令列表 PIX 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

此报告提供了 DX12 PIX GPU 命令列表调试标记及其执行时间的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该范围在列出的范围的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

dx12_pix_sum – DX12 PIX 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

此报告提供了 D3D12 PIX CPU 调试标记及其执行时间的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该范围在列出的范围的执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

mpi_event_sum – MPI 事件摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此事件所有实例的总时间

  • 实例数 : 此事件的实例数

  • 平均值 : 此事件的平均执行时间

  • 中位数 : 此事件的执行时间中位数

  • 最小值 : 此事件的最小执行时间

  • 最大值 : 此事件的最大执行时间

  • 标准差 : 此事件的执行时间标准差

  • 来源: 事件数据的原始来源类

  • 名称 : MPI 事件名称

此报告提供了所有记录的 MPI 事件的摘要。“时间”列是使用“总时间”列的总和计算得出的,表示该事件在列出事件的总执行时间中所占的百分比,而不是应用程序 wall 或 CPU 执行时间的百分比。

mpi_event_trace – MPI 事件跟踪

参数 - 无

输出:所有时间值默认为纳秒

  • 开始 : 事件的开始时间戳

  • 结束 : 事件的结束时间戳

  • 持续时间 : 事件的持续时间

  • 事件 : 事件类型名称

  • Pid : 生成事件的进程 Id

  • Tid : 生成事件的线程 Id

  • Tag : MPI 消息标签

  • Rank : 生成事件的 MPI Rank

  • PeerRank : 发送或接收类型事件的其他 MPI rank

  • RootRank : 广播类型事件的根 MPI rank

  • Size : 单向操作(发送和接收)的消息大小

  • CollSendSize : 集合操作的发送消息大小

  • CollRecvSize : 集合操作的接收消息大小

此报告提供了所有记录的 MPI 事件的跟踪记录。

请注意,具有不同 rank、tag 或 size 值的 MPI_Sendrecv 事件被分为两个单独的报告行,一行报告发送,另一行报告接收。如果仅存在一行,则可以假定 rank、tag 和 size 相同。

mpi_msg_size_sum – MPI 消息大小摘要

参数 - 无

输出:消息大小值以字节为单位

  • 总消息量 : 来自此 API 函数所有实例的聚合消息大小

  • 实例数 : 此 API 函数的实例数

  • 平均值 : 此 API 函数的平均消息大小

  • 中位数 : 此 API 函数的消息大小中位数

  • 最小值 : 此 API 函数的最小消息大小

  • 最大值 : 此 API 函数的最大消息大小

  • 标准差 : 此 API 函数的消息大小标准差

  • 来源 : 消息来源 (p2p, coll_send, coll_recv)

  • 名称 : MPI API 函数名称

此报告提供了所有集合和点对点 MPI 调用的消息大小摘要。

请注意,对于 MPI 集合,报告显示 Source 等于 coll_send 的已发送消息和 Source 等于 coll_recv 的已接收消息。

network_congestion[:ticks_threshold=<ticks_per_ms>] – 网络设备拥塞

参数

  • ticks_threshold=<ticks_per_ms> - 报告拥塞的阈值,单位为 ticks/ms。默认为 10000。

输出:所有时间值默认为纳秒

  • 开始 : 拥塞间隔的开始时间戳

  • 结束 : 拥塞间隔的结束时间戳

  • 持续时间 : 拥塞间隔的持续时间

  • 发送等待率: 间隔期间的拥塞率

  • GUID : 设备 GUID

  • 名称 : 设备名称

此报告显示发送等待率高的拥塞事件。默认情况下,仅显示发送等待率高于 10000 ticks/ms 的事件,但可以设置自定义阈值。

每个事件定义设备遇到一定程度拥塞的时间段。拥塞程度由发送等待率定义,单位为每毫秒的时间滴答数 (ticks/ms)。滴答的具体持续时间取决于设备,但可以假定为纳秒级。拥塞是通过计算端口有数据要传输但由于信用不足或缺乏仲裁而未发送数据的滴答数来衡量的。显示的发送等待率值是在事件期间计数的滴答数,并根据事件的持续时间进行归一化。较高的发送等待率值表示更严重的拥塞。

由于滴答的具体持续时间取决于设备,因此分析应侧重于同一设备生成的事件的相对发送等待率。跨设备比较绝对发送等待率只有在已知时间滴答持续时间相似的情况下才有意义。

对于 IB 交换机指标,我们不显示设备名称,仅显示 GUID。

nvtx_gpu_proj_sum – NVTX GPU 投影摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 范围 : NVTX 范围的名称

  • 样式 : 范围样式;开始/结束或推入/弹出

  • 总投影时间: 此范围名称的所有实例使用的总投影时间

  • 总范围时间: 此范围名称的所有实例使用的原始 NVTX 范围总时间

  • 范围实例数 : 此范围的实例数

  • 投影平均值 : 此范围的平均投影时间

  • 投影中位数 : 此范围的投影时间中位数

  • 投影最小值 : 此范围的最小投影时间

  • 投影最大值 : 此范围的最大投影时间

  • 投影标准差 : 此范围的投影时间标准差

  • GPU 操作总数 : GPU 操作总数

  • GPU 操作平均数 : GPU 操作平均数

  • 平均范围级别 : 平均范围堆栈深度

  • 平均子范围数 : 子范围的平均数

此报告提供了从 CPU 投影到 GPU 的 NVTX 时间范围的摘要。每个 NVTX 范围包含一个或多个 GPU 操作。如果用于启动操作的 CUDA API 调用位于 NVTX 范围内,则 GPU 操作被视为由 NVTX 范围“包含”。仅考虑在同一线程上开始和结束的范围。

投影范围将具有第一个封闭 GPU 操作的开始时间戳和最后一个封闭 GPU 操作的结束时间戳。然后,此报告按名称和样式汇总所有范围实例。请注意,当一个 NVTX 范围可能包含另一个范围时,子范围的时间不会从父范围中减去。这是因为投影时间可能不像原始 NVTX 范围时间那样严格重叠。因此,所有范围的总投影时间可能超过总采样持续时间。

nvtx_gpu_proj_trace – NVTX GPU 投影跟踪

参数 - 无

输出:所有时间值默认为纳秒

  • 名称 : NVTX 范围的名称

  • 投影开始 : 投影范围开始时间戳

  • 投影持续时间 : 投影范围持续时间

  • 原始开始 : 原始 NVTX 范围开始时间戳

  • 原始持续时间 : 原始 NVTX 范围持续时间

  • 样式 : 范围样式;开始/结束或推入/弹出

  • PID : 进程 ID

  • TID : 线程 ID

  • NumGPUOps : 封闭 GPU 操作的数量

  • Lvl : 堆栈级别,从 0 开始

  • NumChild : 子范围的数量

  • RangeId : 范围的任意 ID

  • ParentId : 封闭范围的范围 ID

  • RangeStack : 构成推入/弹出堆栈的范围 ID

此报告提供了从 CPU 投影到 GPU 的 NVTX 时间范围的跟踪。每个 NVTX 范围包含一个或多个 GPU 操作。如果用于启动操作的 CUDA API 调用位于 NVTX 范围内,则 GPU 操作被视为由 NVTX 范围“包含”。仅考虑在同一线程上开始和结束的范围。

投影范围将具有第一个封闭 GPU 操作的开始时间戳和最后一个封闭 GPU 操作的结束时间戳,以及堆栈状态和与其他 NVTX 范围的关系。

nvtx_kern_sum[:base|:mangled] – NVTX 范围内核摘要

参数

  • base - 可选参数,如果给定,将使摘要基于 CUDA 内核的基本名称,而不是模板化的名称。

  • mangled - 可选参数,如果给定,将使摘要基于内核的原始乱码名称,而不是模板化的名称。

注意

显示乱码名称的功能是报告文件格式的最新添加,并且需要使用最新版本的 Nsight Systems 捕获配置文件数据。重新导出现有报告文件是不够的。如果原始的乱码内核名称数据不可用,将使用默认的 demangled 名称。

输出:所有时间值默认为纳秒

  • NVTX 范围 : 范围名称

  • 样式 : 范围样式;开始/结束或推入/弹出

  • PID : 此范围和内核集的进程 ID

  • TID : 此范围和内核集的线程 ID

  • NVTX 实例数 : NVTX 范围实例数

  • 内核实例数 : CUDA 内核实例数

  • 总时间 : 此范围的所有内核实例使用的总时间

  • 平均值 : 内核的平均执行时间

  • 中位数 : 内核的执行时间中位数

  • 最小值 : 内核的最小执行时间

  • 最大值 : 内核的最大执行时间

  • StdDev : 内核执行时间的标准偏差

  • Kernel Name : 内核名称

本报告提供 CUDA 内核的摘要,按 NVTX 范围分组。为了计算此摘要,每个内核都与同一进程和线程 ID 中的一个或多个包含 NVTX 范围相匹配。如果用于启动内核的 CUDA API 调用位于 NVTX 范围内,则认为内核被“包含”在 NVTX 范围内。内核的实际执行时间可能比 NVTX 范围持续时间更长。如果范围重叠,则特定的内核实例可能与多个 NVTX 范围关联。例如,如果内核在 push/pop 范围堆栈内启动,则内核被认为被堆栈上的所有范围“包含”,而不仅仅是最深层的范围。如果 NVTX 范围出现在同名的其他 NVTX 范围内部,这将变得非常混乱。

一旦每个内核与一个或多个 NVTX 范围关联,范围和内核的列表将按范围名称、内核名称和 PID/TID 分组。“NVTX Inst”列指示包含此内核的 NVTX 范围实例的数量,而“Kern Inst”列指示摘要行中内核实例的数量。然后计算内核实例及其执行时间的摘要。

nvtx_pushpop_sum – NVTX Push/Pop 范围摘要

参数 - 无

输出:所有时间值均以纳秒为单位给出

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

本报告提供 NV Tools Extensions Push/Pop 范围及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该范围占所列范围执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

nvtx_pushpop_trace – NVTX Push/Pop 范围跟踪

参数 - 无

输出:所有时间值默认为纳秒

  • Start : 范围开始时间戳

  • End : 范围结束时间戳

  • Duration : 范围持续时间

  • DurChild : 所有子范围的持续时间

  • DurNonChild : 此范围减去子范围的持续时间

  • 名称 : NVTX 范围的名称

  • PID : 进程 ID

  • TID : 线程 ID

  • Lvl : 堆栈级别,从 0 开始

  • NumChild : 子范围的数量

  • RangeId : 范围的任意 ID

  • ParentId : 封闭范围的范围 ID

  • RangeStack : 构成推入/弹出堆栈的范围 ID

  • NameTree : 前缀为级别指示器的范围名称

本报告提供 NV Tools Extensions Push/Pop 范围的跟踪,包括它们的执行时间、堆栈状态以及与其他 push/pop 范围的关系。

nvtx_startend_sum – NVTX Start/End 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

本报告提供 NV Tools Extensions Start/End 范围及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该范围占所列范围执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

nvtx_sum – NVTX 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 样式 : 范围样式;开始/结束或推入/弹出

  • 范围 : 范围名称

本报告提供 NV Tools Extensions Start/End 和 Push/Pop 范围及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该范围占所列范围执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

nvvideo_api_sum – NvVideo API 摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此函数所有执行的总时间

  • 调用次数 : 对此函数的调用次数

  • 平均值 : 此函数的平均执行时间

  • 中位数 : 此函数的执行时间中位数

  • 最小值 : 此函数的最小执行时间

  • 最大值 : 此函数的最大执行时间

  • 标准差 : 此函数时间的标准差

  • Event Type : 此函数所属的 API 类型

  • 名称 : 函数名称

本报告提供 NvVideo API 函数及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该函数占所列函数执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

openacc_sum – OpenACC 摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • Total Time : 所有事件类型执行所用的总时间

  • Count : 事件类型数量

  • Avg : 事件类型的平均执行时间

  • Med : 事件类型的中位数执行时间

  • Min : 事件类型的最小执行时间

  • Max : 事件类型的最大执行时间

  • StdDev : 事件类型执行时间的标准偏差

  • Name : 事件名称

本报告提供 OpenACC 事件及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该事件类型占所列事件执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

opengl_khr_gpu_range_sum – OpenGL KHR_debug GPU 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

本报告提供 OpenGL KHR_debug GPU PUSH/POP 调试范围及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该范围占所列范围执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

opengl_khr_range_sum – OpenGL KHR_debug 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

本报告提供 OpenGL KHR_debug CPU PUSH/POP 调试范围及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该范围占所列范围执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

openmp_sum – OpenMP 摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • Total Time : 所有事件类型执行所用的总时间

  • Count : 事件类型数量

  • Avg : 事件类型的平均执行时间

  • Med : 事件类型的中位数执行时间

  • Min : 事件类型的最小执行时间

  • Max : 事件类型的最大执行时间

  • StdDev : 事件类型执行时间的标准偏差

  • Name : 事件名称

本报告提供 OpenMP 事件及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该事件类型占所列事件执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

osrt_sum – OS 运行时摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此函数所有执行的总时间

  • 调用次数 : 对此函数的调用次数

  • 平均值 : 此函数的平均执行时间

  • 中位数 : 此函数的执行时间中位数

  • 最小值 : 此函数的最小执行时间

  • 最大值 : 此函数的最大执行时间

  • StdDev : 此函数执行时间的标准偏差

  • 名称 : 函数名称

本报告提供操作系统函数及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该函数占所列函数执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

syscall_sum – Syscall 摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • Total Time : 此 syscall 的所有执行所用的总时间

  • Num Calls : 对此 syscall 的调用次数

  • Avg : 此 syscall 的平均执行时间

  • Med : 此 syscall 的中位数执行时间

  • Min : 此 syscall 的最小执行时间

  • Max : 此 syscall 的最大执行时间

  • StdDev : 此 syscall 执行时间的标准偏差

  • Name : syscall 名称

本报告提供 syscall 及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该 syscall 占所列 syscall 执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

um_cpu_page_faults_sum – 统一内存 CPU 页面错误摘要

参数 - 无

输出

CPU Page Faults : 发生的 CPU 页面错误数 CPU Instruction Address : 导致 CPU 页面错误的 CPU 指令地址

本报告提供统一内存的 CPU 页面错误摘要。

um_sum[:rows=<limit>] – 统一内存分析摘要

参数

  • rows=<limit> - 查询返回的最大行数。默认为 10。

输出

  • Virtual Address : 正在传输的页面的虚拟基地址

  • HtoD Migration Size : 从主机传输到设备的字节数

  • DtoH Migration Size : 从设备传输到主机的字节数

  • CPU Page Faults : 虚拟基地址发生的 CPU 页面错误数

  • GPU Page Faults : 虚拟基地址发生的 GPU 页面错误数

  • Migration Throughput : 每秒传输的字节数

本报告提供统一内存的数据迁移摘要。

um_total_sum – 统一内存总计摘要

参数 - 无

输出

  • Total HtoD Migration Size : 从主机传输到设备的字节总数

  • Total DtoH Migration Size : 从设备传输到主机的字节总数

  • Total CPU Page Faults : 发生的 CPU 页面错误总数

  • Total GPU Page Faults : 发生的 GPU 页面错误总数

  • Minimum Virtual Address : 传输页面的虚拟地址范围的最小值

  • Maximum Virtual Address : 传输页面的虚拟地址范围的最大值

本报告提供统一内存的所有页面错误的摘要。

vulkan_api_sum – Vulkan API 摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此函数所有执行的总时间

  • Num Calls: 对此函数的调用次数

  • 平均值 : 此函数的平均执行时间

  • 中位数 : 此函数的执行时间中位数

  • 最小值 : 此函数的最小执行时间

  • 最大值 : 此函数的最大执行时间

  • 标准差 : 此函数时间的标准差

  • 名称 : 函数名称

本报告提供 Vulkan API 函数及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该函数占所列函数执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

vulkan_api_trace – Vulkan API 跟踪

参数 - 无

输出:所有时间值默认为纳秒

  • 开始 : API 调用发生时的时间戳

  • 持续时间 : API 调用的长度

  • 名称 : API 函数名称

  • Event Class : Vulkan 跟踪事件类型

  • Context : 跟踪上下文 ID

  • CorrID : 用于映射到其他 Vulkan 调用的关联 ID

  • Pid : 发出调用的进程 ID

  • Tid : 发出调用的线程 ID

  • T-Pri : 调用线程的运行优先级

  • 线程名称 : 调用 API 函数的线程名称

本报告提供 Vulkan API 函数调用的跟踪记录及其执行时间。

vulkan_gpu_marker_sum – Vulkan GPU 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

本报告提供 Vulkan GPU 调试标记及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该范围占所列范围执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

vulkan_marker_sum – Vulkan 范围摘要

参数 - 无

输出:所有时间值默认为纳秒

  • 时间 : “总时间”的百分比

  • 总时间 : 此范围所有实例的总时间

  • 实例数 : 此范围的实例数

  • 平均值 : 此范围的平均执行时间

  • 中位数 : 此范围的执行时间中位数

  • 最小值 : 此范围的最小执行时间

  • 最大值 : 此范围的最大执行时间

  • 标准差 : 此范围的执行时间标准差

  • 范围 : 范围名称

本报告提供 CPU 上的 Vulkan 调试标记及其执行时间的摘要。请注意,“Time”列是使用“Total Time”列的总和计算得出的,表示该范围占所列范围执行时间的百分比,而不是应用程序挂钟时间或 CPU 执行时间的百分比。

wddm_queue_sum – WDDM 队列利用率摘要

参数 - 无

输出:所有时间值默认为纳秒

  • Utilization : 队列非空闲的时间百分比

  • Instances : 事件数量

  • Avg : 平均事件持续时间

  • Med : 中位数事件持续时间

  • Min : 最小事件持续时间

  • Max : 最大事件持续时间

  • StdDev : 事件持续时间的标准偏差

  • Name : 事件名称

  • Q Type : 队列类型 ID

  • Q Name : 队列类型名称

  • PID : 与事件关联的进程 ID

  • GPU ID : GPU 索引

  • Context : 队列的 WDDM 上下文

  • Engine : 引擎类型 ID

  • Node Ord : WDDM 节点序号 ID

本报告提供 WDDM 队列利用率的摘要。利用率是通过比较队列中有一个或多个活动事件的时间量与给定进程 ID 的最小和最大事件时间(无论队列上下文如何)定义的总持续时间来计算的。

Nsight Systems 附带的报告格式化程序

Nsight Systems 中提供以下格式

Column

用法

column[:nohdr][:nolimit][:nofmt][:<width>[:<width>]...]

参数

  • nohdr : 不显示标题。

  • nolimit : 删除自动宽度列的 100 个字符限制 注意:这可能会导致列非常宽。

  • nofmt : 不重新格式化数字。

  • <width>... : 定义一个或多个列的显式宽度。如果给定值 .,则列将自动调整。如果给定的宽度为 0,则不会显示该列。

列格式化程序以垂直文本列的形式呈现数据。它主要设计为一种人类可读的格式,用于在控制台显示器上显示数据。

文本数据将左对齐,而数字数据将右对齐。如果数据溢出可用列宽,它将被标记为“…”字符,以指示数据值被裁剪。裁剪始终发生在右侧,即使对于数字数据也是如此。

数字将被重新格式化,以便更容易视觉扫描和理解。这包括添加千位分隔符。此过程需要将数字的字符串表示形式转换为其本机表示形式(整数或浮点数),然后再转换回字符串表示形式以进行打印。此转换过程尝试保留数字表示形式的元素,例如小数位数或科学计数法的使用,但转换并非总是完美的(数字应始终相同,但表示形式可能不同)。要禁用重新格式化过程,请使用参数 nofmt

如果未给出显式宽度,则列会根据标题大小和数据的前 100 行自动调整其宽度。此自动调整限制为最大宽度 100 个字符。要允许更大的自动宽度列,请传递初始参数 nolimit。如果前 100 行未计算出正确的列宽,建议提供显式列宽。

Table

用法

table[:nohdr][:nolimit][:nofmt][:<width>[:<width>]...]

参数

  • nohdr : 不显示标题。

  • nolimit : 删除自动宽度列的 100 个字符限制 注意:这可能会导致列非常宽。

  • nofmt : 不重新格式化数字。

  • <width>... : 定义一个或多个列的显式宽度。如果给定值 .,则列将自动调整。如果给定的宽度为 0,则不会显示该列。

表格格式化程序在文本框内以垂直文本列的形式呈现数据。除了列之间的线条外,它与列格式化程序相同。

CSV

用法

csv[:nohdr]

参数

  • nohdr : 不显示标题。

csv 格式化程序将数据输出为逗号分隔值。此格式通常用于导入到其他数据应用程序,例如电子表格和数据库。

CSV 文件有很多不同的标准。大多数差异在于如何处理转义符,这意味着包含逗号或空格的数据值。

此 CSV 格式化程序将通过将整个值用双引号括起来来转义逗号。

TSV

用法

tsv[:nohdr][:esc]

参数

  • nohdr : 不显示标题。

  • esc : 转义制表符,而不是删除它们。

TSV 格式化程序将数据输出为制表符分隔值。此格式有时用于导入到其他数据应用程序,例如电子表格和数据库。

大多数 TSV 导入/导出系统不允许数据值中包含制表符。格式化程序通常会将任何制表符替换为单个空格。如果提供了 esc 参数,则任何制表符都将被替换为文字字符“t”。

JSON

用法

json

参数:无参数

JSON 格式化程序将数据输出为 JSON 对象数组。每个对象代表一行数据,并使用列名称作为字段标签。所有对象都具有相同的字段。格式化程序尝试识别数值以及 JSON 关键字,并转换它们。空值作为空字符串传递(而不是 nil 或作为缺失字段)。

目前,格式化程序不会转义引号,因此如果数据值包含双引号,它将损坏 JSON 文件。

HDoc
hdoc[:title=<title>][:css=<URL>]

参数

  • title : HTML 文档标题的字符串。

  • css : 要包含的 CSS 文档的 URL。

HDoc 格式化程序生成一个完整、可验证(大部分)的独立 HTML 文档。它旨在在 Web 浏览器中打开,或通过 <iframe> 包含在更大的文档中。

HTable

用法

htable

参数:无参数

HTable 格式化程序输出原始 HTML <table>,不包含任何周围的 HTML 文档。它旨在包含到更大的 HTML 文档中。虽然大多数 Web 浏览器都会打开并显示该文档,但对于这种类型的用途,最好使用 HDoc 格式。

专家系统分析

Nsight Systems 专家系统是一项旨在自动检测应用程序性能优化机会的功能。它使用一组预定义的规则来确定应用程序是否具有已知的不良模式。

从 CLI 使用专家系统

用法

nsys [global-options] analyze [options]
       [nsys-rep-or-sqlite-file]

如果将 .nsys-rep 文件作为输入文件给出,并且在同一目录中没有同名的 .sqlite 文件,则将生成该文件。

注意

GUI 中的专家系统视图将为您提供等效的命令行。

从 GUI 使用专家系统

专家系统视图可以在与事件视图相同的下拉菜单中找到。如果同一目录中没有与 .nsys-rep 文件同名的 .sqlite 文件,则将生成该文件。

专家系统视图具有以下组件

  1. 用于选择要运行的规则的下拉菜单。

  2. 规则描述和建议摘要。

  3. 将给出相同结果的 CLI 命令。

  4. 包含运行规则结果的表格。

  5. 允许用户指定规则参数的“设置”按钮。

Expert systems information as shown in the GUI

上下文菜单可用于将表格条目与时间线关联。选项与事件视图相同

  • 缩放到时间线上选定的内容(ctrl+双击)

对于不返回事件而是返回任意时间范围(例如,GPU 利用率规则)的规则,不支持高亮显示。

CLI 和 GUI 共享相同的规则脚本和消息。GUI 和 CLI 中的输出表格可能存在一些格式差异。

专家系统规则

规则是在 Nsight Systems 的 SQLite DB 输出上运行的脚本,用于查找常见的可改进的使用模式。

每个规则都有一个建议摘要,其中包含对发现的问题的解释和解决建议。默认情况下,仅显示前 50 个结果。

专家系统中目前有六个规则。下面将对它们进行描述。其他规则将在 Nsight Systems 的未来版本中提供。

CUDA 同步操作规则

使用可分页内存的异步 memcpy

此规则识别出如果内存是可分页的,则最终变为同步的异步内存传输。此规则不适用于 Nsight Systems Embedded Platforms Edition

建议:如果适用,请改用固定内存

CUDA Graph trace at the node level

同步 Memcpy

此规则识别出阻塞主机的同步内存传输。

建议:改用 cudaMemcpy*Async API。

同步 Memset

此规则识别出阻塞主机的同步 memset 操作。

建议:改用 cudaMemset*Async API。

同步 API

此规则识别出同步 API,这些 API 会阻塞主机,直到所有发出的 CUDA 调用完成。

建议:避免过度使用同步。使用异步 CUDA 事件调用,例如 cudaStreamWaitEvent 和 cudaEventSynchronize,以防止主机同步。

GPU 低利用率规则

Nsight Systems 根据集合中的 API 跟踪数据确定 GPU 利用率。当前规则考虑 CUDA、Vulkan、DX12 和 OpenGL API 对 GPU 的使用。

GPU 饥饿

此规则识别出 GPU 空闲时间超过 500 毫秒的时间范围。阈值是可调整的。

建议:使用 CPU 采样数据、OS 运行时阻塞状态回溯和/或与线程同步相关的 OS 运行时 API,以了解 CPU 缓慢或阻塞是否导致了间隙。向 CPU 代码添加 NVTX 注释以了解间隙背后的原因。

注意:对于每个进程,都会检查每个 GPU,并在时间范围内查找间隙,该时间范围从该设备上第一个 GPU 操作的开始到该设备上最后一个 GPU 操作的结束。用户无法解决的 GPU 间隙将被排除在外。这包括

  • GPU 间隙中间的性能分析开销。

  • 在第一个 GPU 操作之前报告中看到的初始间隙。

  • 在最后一个 GPU 操作之后看到的最终间隙。

GPU 低利用率

此规则识别出利用率低的时间区域。

建议:使用 CPU 采样数据、OS 运行时阻塞状态回溯和/或与线程同步相关的 OS 运行时 API,以了解 CPU 缓慢或阻塞是否导致了间隙。向 CPU 代码添加 NVTX 注释以了解间隙背后的原因。

注意:对于每个进程,都会检查每个 GPU,并在时间范围内查找间隙,该时间范围从该设备上第一个 GPU 操作的开始到该设备上最后一个 GPU 操作的结束。然后将此时间范围划分为相等的块,并计算每个块的 GPU 利用率。利用率包括用户无法解决的所有 GPU 操作以及性能分析开销。

利用率是指“时间”利用率,而不是“资源”利用率。此规则尝试查找 GPU 何时使用或未使用的时间间隙,但不考虑使用了多少 GPU 资源。因此,单个正在运行的 memcpy 被认为与占用所有内核的大型内核具有相同的“利用率”。如果多个操作在同一块中同时运行,则它们的利用率将被加起来,并且可能超过 100%。

将显示使用率百分比低于阈值的块。如果连续块的使用率百分比较低,则会将各个块合并为单个显示记录,并保留百分比的加权平均值。这就是为什么返回的块可能具有不同的持续时间。

多报告分析

Nsight Systems 多报告分析是一项功能,旨在更好地支持跨多个结果文件的复杂统计分析。此功能的可能用例包括

  • 多节点分析 - 当您在集群上运行 Nsight Systems 时,它通常会在集群上的每个 rank 生成一个结果文件。虽然您可以将多个结果文件加载到 GUI 中进行可视化,但此分析系统允许您跨所有结果文件运行统计分析。

  • 多遍分析 - Nsight Systems 中的某些功能由于开销或硬件考虑因素而无法一起运行。例如,可用的 CPU 性能计数器通常比 CPU 具有的寄存器更多。使用此分析,您可以运行具有不同计数器集的多次运行,然后将结果一起分析。

  • 多次运行分析 - 有时您想比较两次不同时间进行的运行。也许您在两个不同的硬件配置上运行了该工具,并想查看发生了什么变化。也许您正在进行回归测试或性能改进分析,并想检查您的状态。统计比较这些结果文件可以显示模式。

分析步骤

注意

在使用多报告分析之前,请确保您已安装所有必需的依赖项。有关更多信息,请参阅安装指南中的安装多报告分析系统

  1. 生成报告 - 像往常一样生成报告,事实上,您可以使用以前生成的报告。

  2. 设置 - 选择 recipe(请参阅下面的可用 Recipe),为其提供任何必需的参数,然后运行。

  3. 启动分析 - Nsight Systems 将使用您的本地系统或 Dask(如您所选)运行分析。

  4. 输出 - 输出是一个目录,其中包含一个 .nsys-analysis 文件,然后可以在 Nsight Systems GUI 中打开该文件。

  5. 查看数据 - 根据您的 recipe,您可以有任意数量的可视化效果,从简单的表格信息到可以在 GUI 内打开的 Jupyter Notebook。

可用的多报告 Recipe

所有多报告 recipe 都使用 recipe CLI 命令开关运行。

用法

nsys recipe [args] <recipe-name> [recipe args]

Nsight Systems 提供了几个初始分析 recipe,主要基于使我们现有的统计和专家系统规则能够进行多报告运行。

这些 recipe 可以在 <target-linux-x64>/python/packages/nsys-recipe/recipes 中找到。请注意,所有 recipe 都是 python 脚本的形式。您可以更改给定的 recipe 或编写自己的 recipe 以满足您的需求。有关如何执行此操作的示例,请参阅教程:创建用户定义的 Recipe。但是,请注意,API 可能会在接下来的几个版本中发生更改。其他 recipe 将持续添加。

有关特定 recipe 的更多信息,包括 recipe 参数,请使用 nsys recipe [recipe name] --help

Recipe 列表

每个 recipe 都将标记有一个或多个关键字,以帮助理解其用途。

关键字

描述

专家系统

该 recipe 源自专家系统。同名脚本也可通过 nsys analyze 获得,但其行为和实现可能有所不同。

统计系统

该 recipe 源自统计系统。同名脚本也可通过 nsys stats 获得,但其行为和实现可能有所不同。

跟踪

该 recipe 提供 GUI 时间轴中可观察到的各个事件的跟踪记录。

摘要

该 recipe 提供事件的摘要视图,通常表示聚合数据。

步调

该 recipe 提供对特定事件在应用程序中如何进展的详细分析。

热图

该 recipe 提供可视化应用程序中模式的热图。

  • cuda_api_sumCUDA API 摘要

    此 recipe 提供 CUDA API 函数及其执行时间的摘要。

    关键字:CUDA、摘要、统计系统

  • cuda_api_syncCUDA 同步 API

    此 recipe 识别出阻塞主机直到发出的 CUDA 调用完成的同步 API。

    关键字:CUDA、同步、跟踪、专家系统

  • cuda_gpu_kern_histCUDA GPU 内核持续时间直方图

    此 recipe 表示 CUDA 内核在其所有实例或程序中所有内核的持续时间中的概率。

    关键字:CUDA、内核、直方图、持续时间

  • cuda_gpu_kern_paceCUDA GPU 内核步调

    此 recipe 调查整个应用程序中特定 CUDA 内核的进度和一致性。

    关键字:CUDA、内核、步调

  • cuda_gpu_kern_sumCUDA GPU 内核摘要

    此 recipe 提供 CUDA 内核及其执行时间的摘要。

    关键字:CUDA、内核、摘要、统计系统

  • cuda_gpu_mem_size_sumCUDA GPU MemOps 摘要(按大小)

    此 recipe 提供 GPU 内存操作及其使用的内存量的摘要。

    关键字:CUDA、内存、摘要、统计系统

  • cuda_gpu_mem_time_sumCUDA GPU MemOps 摘要(按时间)

    此 recipe 提供 GPU 内存操作及其执行时间的摘要。

    关键字:CUDA、内存、摘要、统计系统

  • cuda_gpu_time_util_mapCUDA GPU 时间利用率热图

    此 recipe 计算 CUDA 内核的 GPU 利用率百分比。

    关键字:CUDA、内核、热图

  • cuda_memcpy_asyncCUDA 使用可分页内存的异步 Memcpy

    此 recipe 识别出如果内存是可分页的,则最终变为同步的异步内存传输。

    关键字:CUDA、Memcpy、跟踪、专家系统

  • cuda_memcpy_syncCUDA 同步 Memcpy

    此 recipe 识别出同步的内存传输。

    关键字:CUDA、Memcpy、跟踪、专家系统

  • cuda_memset_syncCUDA 同步 Memset

    此 recipe 识别出使用固定主机内存或统一内存区域的同步 memset 操作。

    关键字:CUDA、Memset、跟踪、专家系统

  • diff统计差异

    此脚本比较同一统计 recipe 两次运行的输出。

    关键字:差异、摘要

  • dx12_mem_opsDX12 内存操作

    此 recipe 标记带有警告的问题内存操作。

    关键字:DX12、内存、跟踪、专家系统

  • gpu_gapsGPU 间隙

    此 recipe 识别出 GPU 空闲时间超过设定阈值的时间区域。

    关键字:CUDA、利用率、专家系统

  • gpu_metric_util_mapGPU 指标利用率热图

    此 recipe 计算 SM Active、SM Issue 和 Tensor Active 指标的百分比。

    关键字:GPU 指标、热图

  • gpu_time_utilGPU 时间利用率

    此 recipe 识别出 GPU 利用率低的时间区域。

    关键字:CUDA、利用率、专家系统

  • mpi_gpu_time_util_mapMPI 和 GPU 时间利用率热图

    此 recipe 计算 GPU 和 MPI 利用率的百分比以及两者之间的重叠。

    关键字:MPI、CUDA、内核、利用率、热图

  • mpi_sumMPI 摘要

    此 recipe 提供 MPI 函数及其执行时间的摘要。

    关键字:MPI、摘要

  • nccl_gpu_overlap_traceNCCL GPU 重叠跟踪

    此 recipe 计算通信和计算内核的重叠百分比。

    关键字:NCCL、CUDA、内核、重叠、跟踪

  • nccl_gpu_proj_sumNCCL GPU 投影摘要

    此 recipe 提供从 CPU 投影到 GPU 的 NCCL 函数及其执行时间的摘要。

    关键字:NCCL、CUDA、GPU 投影、摘要

  • nccl_gpu_time_util_mapNCCL GPU 时间利用率热图

    此方法计算 NCCL 和计算内核的 GPU 利用率百分比,以及两者之间的重叠。

    关键词: NCCL, CUDA, 内核, 利用率, 重叠, 热图

  • nccl_sumNCCL 摘要

    此方法提供 NCCL 函数及其执行时间的摘要。

    关键词: NCCL, 摘要

  • network_map_awsAWS 指标热图

    此方法显示 AWS EFA 指标的热图。

    关键词: 网络, AWS, EFA, 热图

  • network_sum网络流量摘要

    此方法提供 NIC 和 InfiniBand 交换机上的网络流量摘要。

    关键词: 网络, 摘要

  • network_traffic_map网络设备流量热图

    此方法显示网络设备的发送流量、接收流量和拥塞事件的热图。

    关键词: 网络, 热图

  • nvlink_sumNVLink 网络带宽摘要

    此方法提供 NVLink 网络带宽的摘要。

    关键词: NVLink, 摘要

  • nvtx_gpu_proj_paceNVTX GPU 投影步调

    此方法研究整个应用程序中从 CPU 投影到 GPU 的特定 NVTX 范围的进度和一致性。

    关键词: NVTX, GPU 投影, 步调

  • nvtx_gpu_proj_sumNVTX GPU 投影摘要

    此方法提供从 CPU 投影到 GPU 的 NVTX 时间范围及其执行时间的摘要。

    关键词: NVTX, GPU 投影, 摘要, 统计系统

  • nvtx_gpu_proj_traceNVTX GPU 投影跟踪

    此方法提供从 CPU 投影到 GPU 的 NVTX 时间范围的跟踪。

    关键词: NVTX, GPU 投影, 跟踪, 统计系统

  • nvtx_paceNVTX 步调

    此方法研究整个应用程序中特定 NVTX 范围的进度和一致性。

    关键词: NVTX, 步调

  • nvtx_sumNVTX 范围摘要

    此方法提供 NVTX 开始/结束和推/弹范围及其执行时间的摘要。

    关键词: NVTX, 摘要, 统计系统

  • osrt_sumOS 运行时摘要

    此方法提供 C 库函数及其执行时间的摘要。

    关键词: OSRT, 摘要, 统计系统

  • storage_util_map存储指标热图

    此方法显示存储设备指标的热图。

    关键词: 存储, 热图

  • ucx_gpu_time_util_mapUCX 和 GPU 时间利用率热图

    此方法计算 GPU 和 UCX 利用率的百分比以及两者之间的重叠。

    关键词: UCX, CUDA, 内核, 热图

方法输出示例

成功运行的方法会输出一个包含不同文件的目录。本节给出一些常见的输出类型示例。

表格

跟踪或摘要数据将存储在数据存储格式中,例如 CSV、Parquet 或 Arrow。通常,您也可以在输出 Jupyter 笔记本中访问相同的数据。

  • 摘要表

Summary Table
  • 跟踪表

Analysis in Nsys GUI
  • 重叠表

Analysis in Nsys GUI

可视化

一些方法在输出 Jupyter 笔记本中包含数据可视化。这些图表使用 Plotly,它提供交互性。

  • 摘要图

Analysis in Nsys GUI
  • 箱线图

Analysis in Nsys GUI
  • 折线图

Analysis in Nsys GUI
  • Top N 图

Analysis in Nsys GUI
  • 步调图

Analysis in Nsys GUI
  • 热图

Analysis in Nsys GUI

在 Jupyter Notebook 中打开

运行方法命令会创建一个新的分析文件 (.nsys-analysis)。打开 Nsight Systems GUI 并选择 文件->打开,然后选择您的文件。

Analysis in Nsys GUI

打开文件夹图标并单击笔记本图标以打开 Jupyter 笔记本。

Select .nsys-analysis file

运行 Jupyter 笔记本

Run notebook

输出将显示在屏幕上。在本例中,是运行 Jacobi 求解器的活动热图。

Heatmap

配置 Dask

多报告分析系统不提供配置 Dask 环境的选项。但是,您可以通过直接修改方法脚本或使用 Dask 配置系统中的以下选项之一来实现此目的

  • YAML 文件:默认情况下,Dask 搜索 ~/.config/dask//etc/dask/ 中的所有 YAML 文件。可以使用环境变量 DASK_ROOT_CONFIGDASK_CONFIG 更改此搜索路径。有关完整的位置列表和查找顺序,请参阅 Dask 文档。示例

    $ cat example.yaml
    'Distributed':
            'scheduler':
                'allowed-failures': 5
    
  • 环境变量:Dask 搜索所有以 DASK_ 开头的环境变量,然后通过转换为小写并将双下划线更改为嵌套结构来转换键。有关完整的变量列表,请参阅 Dask 文档。示例

    DASK_DISTRIBUTED__SCHEDULER__ALLOWED_FAILURES=5
    

Dask 客户端

在未设置任何配置的情况下,dask-futures 模式选项使用默认参数初始化 Dask 客户端,这会导致在后台创建 LocalCluster。以下是可以设置以更改默认行为的 YAML/环境变量

  • distributed.comm.timeouts.connect / DASK_DISTRIBUTED__COMM__TIMEOUTS__CONNECT

  • client-name / DASK_CLIENT_NAME

  • scheduler-address / DASK_SCHEDULER_ADDRESS

  • distributed.client.heartbeat / DASK_DISTRIBUTED__CLIENT__HEARTBEAT

  • distributed.client.scheduler-info-interval / DASK_DISTRIBUTED__CLIENT__SCHEDULER_INFO_INTERVAL

  • distributed.client.preload / DASK_DISTRIBUTED__CLIENT__PRELOAD

  • distributed.client.preload-argv / DASK_DISTRIBUTED__CLIENT__PRELOAD_ARGV

方法的环境变量

方法有其自己的环境变量列表,以使配置更完整和灵活。这些环境变量要么在 Dask 的配置系统中缺失,要么是方法系统特有的

  • NSYS_DASK_SCHEDULER_FILE:包含调度程序信息的文件路径。它将用于初始化 Dask 客户端。

  • NSYS_DIR:包含目标和主机目录的 Nsight Systems 目录的路径。nsys 可执行文件和方法依赖项将在此目录中搜索,而不是从当前运行的方法文件路径推断出的目录。

教程:创建用户定义的方法

Nsight Systems 方法系统旨在可扩展,我们希望许多用户使用它来创建自己的方法。本简短教程将重点介绍创建方法所需的步骤,该方法是 Nsight Systems 方法包中包含的方法之一的自定义版本。

步骤 1:创建方法目录和脚本

<install-dir>/target-linux-x64/python/packages/nsys_recipe/recipes 文件夹中根据新方法的名称创建一个新目录。对于本示例,我们将新方法命名为 new_metric_util_map。我们将复制现有的 gpu_metric_util_map.py 脚本,并在 new_metric_util_map 目录中创建一个名为 new_metric_util_map.py 的新脚本。我们还将 heatmap.ipynb 和 metadata json 文件复制到 new_metric_util_map 目录中。在 Linux 终端窗口中键入以下步骤

> cd <install-dir>/target-linux-x64/python/packages/nsys_recipe
> mkdir new_metric_util_map
> cp gpu_metric_util_map/metadata.json new_metric_util_map/metadata.json
> cp gpu_metric_util_map/heatmap.ipynb new_metric_util_map/heatmap.ipynb
> cp gpu_metric_util_map/gpu_metric_util_map.py new_metric_util_map/new_metric_util_map.py

metadata.json 中的模块名称替换为 new_metric_util_map,并根据您的喜好更新显示名称和描述。此外,将 new_metric_util_map.py 中的类名 GpuMetricUtilMap 重命名为 NewMetricUtilMap。我们将在后续步骤中讨论新方法代码的详细功能。

步骤 2:修改映射器函数

许多方法都结构化为 map-reduce 算法。对于报告目录中的每个 .nsys-rep 文件,都会调用 mapper 函数。mapper 函数对每个 Nsight Systems 报告中的事件执行一系列计算,并生成中间数据集。然后,reduce 函数将中间结果组合起来以生成最终结果。mapper 函数可以并行调用,可以在单个节点的多个内核上(使用并发 python 模块),也可以在多节点方法分析的多个 ranks 上(使用 Dask 分布式模块)。

当我们创建一个新方法时,我们需要创建一个从 Recipe 基类派生的类。对于我们的示例,该类将称为 NewMetricUtilMap(我们在步骤 1 中已将其重命名)。

mapper 函数称为 mapper_func()。如果文件尚不存在,它将首先将 .nsys-rep 文件转换为数据存储文件 (SQLite/Parquet/Arrow)。然后,它将从导出的文件中读取所有必需的表到方法所需的 Pandas Dataframe 中。GPU 指标数据使用名为 GENERIC_EVENTS 的数据库模式表存储。为了获得额外的灵活性,GENERIC_EVENTS 将数据表示为 JSON 对象,该对象存储为字符串。NewMetricUtilMap 类从 JSON 对象中提取字段,并将它们累积到热图的直方图 bin 中。

原始脚本检索了三个 GPU 指标:SM 活动、SM 发射和张量活动。在我们新版本的脚本中,我们将提取第四个指标:活动 SM 中未分配的 Warp。

  1. 找到此行(大约第 44 行)

    metric_cols = ["SMs Active", "SM Issue", "Tensor Active"]
    
  2. 添加“活动 SM 中未分配的 Warp”指标

    metric_cols = [
        "SMs Active",
        "SM Issue",
        "Tensor Active",
        "Unallocated Warps in Active SMs",
    ]
    

步骤 3:修改 reduce 函数

我们的新 mapper 函数将提取四个 GPU 指标,并将它们作为 Pandas DataFrame 返回。reduce 函数接收 DataFrames 列表,每个 DataFrame 对应分析中的一个 .nsys-rep 文件,并使用 Pandas concat 函数将它们组合成单个 DataFrame。由于 reducer 函数在我们的例子中是通用的,因此无需修改。但是,如果您想添加任何额外的后处理,可以在此函数中进行。

步骤 4:向 Jupyter 笔记本添加绘图

我们的新方法类将使用 to_parquet() 函数创建包含 reducer 函数生成的所有数据的 Parquet 输出文件。它还将使用 create_notebook() 函数创建 Jupyter 笔记本文件。

在此步骤中,我们将更改 create_notebook() 函数以生成第四个指标的绘图。为此,我们需要更改这两行(位于 new_metric_util_map/heatmap.ipynb 的第二个单元格中)

metrics = [
   "SMs Active",
   "SM Issue",
   "Tensor Active",
]

改为

metrics = [
    "SMs Active",
    "SM Issue",
    "Tensor Active",
    "Unallocated Warps in Active SMs",
]

这完成了 NewMetricUtilMap 类的所有修改。

步骤 5:运行新方法

如果新方法位于默认方法目录 nsys_recipe/recipes 中,我们可以使用 nsys recipe 命令直接运行它,如下所示

> nsys recipe new_metric_util_map --input <directory of reports>

也可以将方法放置在此目录之外。在这种情况下,您需要在运行 nsys recipe 命令时将环境变量 NSYS_RECIPE_PATH 设置为包含方法的目录。

成功后,该方法应生成一个新的方法结果目录,名为 new_metric_util_map-1

如果我们打开该方法中的 Jupyter 笔记本并执行代码,我们应该看到新的热图以及原始版本的方法生成的三个图表。这是一个示例

Output from tutorial recipe

Visual Studio 集成

NVIDIA Nsight Integration 是一个 Visual Studio 扩展,允许您从 Visual Studio 内部访问 Nsight Systems 的强大功能。

当 Nsight Systems 与 NVIDIA Nsight Integration 一起安装时,Nsight Systems 活动将显示在 Visual Studio 菜单栏中的 NVIDIA Nsight 菜单下。这些活动使用当前项目设置和可执行文件启动 Nsight Systems。

Install extension to Microsoft Visual Studio

选择“跟踪”命令将启动 Nsight Systems,创建一个新的 Nsight Systems 项目,并应用来自当前 Visual Studio 项目的设置

  • 目标应用程序路径

  • 命令行参数

  • 工作文件夹

如果“跟踪”命令已与此 Visual Studio 项目一起使用,则 Nsight Systems 将加载相应的 Nsight Systems 项目,并且任何先前捕获的跟踪会话都将可以使用 Nsight Systems 项目资源管理器树进行查看。

有关从 Visual Studio 内部使用 Nsight Systems 的更多信息,请访问

故障排除

常规故障排除

性能分析

如果在性能分析会话期间分析器行为异常,或者性能分析会话无法启动,请尝试以下步骤

  • 关闭主机应用程序。

  • 重启目标设备。

  • 启动主机应用程序并连接到目标设备。

Nsight Systems 在主机上使用设置文件 (NVIDIA Nsight Systems.ini) 来存储有关已加载项目、报告文件、窗口布局配置等的信息。设置文件的位置在 帮助 → 关于 对话框中描述。删除设置文件会将 Nsight Systems 恢复到全新状态,但所有项目和报告将从项目资源管理器中消失。

环境变量

默认情况下,Nsight Systems 将临时文件写入 /tmp 目录。如果您使用的系统不允许写入 /tmp/tmp 目录的存储空间有限,则可以使用 TMPDIR 环境变量来设置不同的位置。一个例子

TMPDIR=/testdata ./bin/nsys profile -t cuda matrixMul

Windows 目标跟踪不支持环境变量控制,但有一个快速解决方法

  • 创建一个批处理文件,设置环境变量并启动您的应用程序。

  • 将 Nsight Systems 设置为启动批处理文件作为其目标;即,将项目设置目标路径设置为批处理文件的路径。

  • 开始跟踪。Nsight Systems 将在新 cmd 实例中启动批处理文件,并跟踪它启动的任何子进程。实际上,它将跟踪整个进程树,其根是运行您的批处理文件的 cmd。

WebGL 测试

Nsight Systems 无法使用默认的 Chrome 启动命令进行性能分析。要分析 WebGL,请遵循以下命令结构

“C:\Program Files (x86)\Google\Chrome\Application\chrome.exe”
       --inprocess-gpu --no-sandbox --disable-gpu-watchdog --use-angle=gl
       https://webglsamples.org/aquarium/aquarium.html

QNX 目标的常见问题

  • 确保 tracelogger 实用程序可用并且可以在目标上运行。

  • 确保 /tmp 目录可访问并支持子目录。

  • 在 Nsight Systems 版本之间切换时,与先前版本相关的进程(包括守护程序 fork 的已分析应用程序)必须在新的版本使用之前被终止。如果您在 Nsight Systems 版本之间切换后遇到问题,请尝试重启目标。

CLI 故障排除

.nsys-rep 文件无法加载

如果您使用 CLI 收集了报告文件,但该报告无法在 GUI 中打开,请检查您的 GUI 版本是否与您使用的 CLI 版本相同或更高。如果不是,请下载新版本的 Nsight Systems GUI,您将能够加载和可视化您的报告。

这种情况最常发生在您仅使用 CLI 包(例如 NVIDIA HPC SDK 中提供的包)更新 Nsight Systems 时。

.nsys-rep 文件未生成

CLI 最初生成 .qdstrm 文件。.qdstrm 文件是中间结果文件,不适用于多次导入。它需要处理。通常,这会自动发生。如果未自动发生,您可以使用独立的 QdstrmImporter 实用程序来生成优化的 .nsys-rep 文件。然后,您可以使用此文件在本地可视化,在不同的机器上打开结果,或与队友共享结果。

CLI 和 QdstrmImporter 版本必须匹配才能将 .qdstrm 文件转换为 .nsys-rep 文件。然后,可以在相同版本或更新版本的 GUI 中打开此 .nsys-rep 文件。

要在主机系统上运行 QdstrmImporter,请在安装目录的 Host-x86_64 目录中查找 QdstrmImporter 二进制文件。QdstrmImporter 适用于所有主机平台。请参阅以下选项。

要在目标系统上运行 QdstrmImporter,请将 Linux Host-x86_64 目录复制到目标 Linux 系统,或直接在目标上安装 Nsight Systems for Linux 主机。Windows 或 macOS 主机 QdstrmImporter 将无法在 Linux 目标上工作。请参阅以下选项。

短选项

长选项

参数

描述

-h

--help

帮助消息,提供有关可用选项及其参数的信息。

-v

--version

输出 QdstrmImporter 版本信息

-i

--input-file

文件名或路径

从此位置导入 .qdstrm 文件。

-o

--output-file

文件名或路径

为生成的 .nsys-rep 文件提供不同的文件名或路径。默认值与 .qdstrm 文件名称和路径相同。

在停止状态下启动进程

在许多情况下,从应用程序执行的开始就对其进行性能分析非常重要。启动进程时,Nsight Systems 通过确保在 Linux 上执行 exec() 系统调用之前完全初始化性能分析会话来处理此问题。

如果 Nsight Systems 的进程启动功能不足,则应手动启动应用程序,并且应将分析器配置为附加到已启动的进程。一种方法是在应用程序代码的早期调用 sleep(),这将为用户提供时间在 Nsight Systems Embedded Platforms Edition 中附加到该进程,但是还有另外两种更方便的机制可以在 Linux 上使用,而无需重新编译应用程序。(请注意,本节的其余部分仅适用于基于 Linux 的目标设备。)

这两种机制都确保在进程创建时(因此其 PID 是已知的)与调用任何应用程序代码之间的时间内,进程被停止并等待信号传递后才继续。

LD_PRELOAD

第一种机制使用 LD_PRELOAD 环境变量。它仅适用于动态链接的二进制文件,因为静态二进制文件不调用运行时链接器,因此不受 LD_PRELOAD 环境变量的影响。

  • 对于 ARMv7 二进制文件,预加载

    /opt/nvidia/nsight_systems/libLauncher32.so
    
  • 否则,如果从主机运行,则预加载

    /opt/nvidia/nsight_systems/libLauncher64.so
    
  • 否则,如果从 CLI 运行,则预加载

    [installation_directory]/libLauncher64.so
    

最常见的做法是将环境变量指定为进程启动命令的一部分,例如

$ LD_PRELOAD=/opt/nvidia/nsight_systems/libLauncher64.so ./my-aarch64-binary --arguments

加载后,此库将向自身发送 SIGSTOP 信号,这等效于在终端中键入 Ctrl+Z。该进程现在是一个后台作业,您可以使用标准命令(如 jobs、fgbg)来控制它们。使用 jobs -l 查看启动进程的 PID。

当附加到停止的进程时,Nsight Systems 将发送 SIGCONT 信号,这等效于使用 bg 命令。

启动器

第二种机制可以与任何二进制文件一起使用。使用 [安装目录]/launcher 启动您的应用程序,例如

$ /opt/nvidia/nsight_systems/launcher ./my-binary --arguments

进程将被启动、守护进程化,并等待 SIGUSR1 信号。使用 Nsight Systems 附加到进程后,用户需要从命令行手动恢复进程的执行

$ pkill -USR1 launcher

注意

请注意,pkill 将向任何具有匹配名称的进程发送信号。如果不需要这样做,请使用 kill 将其发送到特定进程。标准输出和错误流被重定向到 /tmp/stdout_<PID>.txt/tmp/stderr_<PID>.txt

启动器机制比 LD_PRELOAD 选项更复杂且自动化程度更低,但为用户提供了更多控制权。

GUI 故障排除

分析或诊断摘要中的空白或黑色页面

如果运行 Nsight Systems 时分析摘要诊断摘要页面显示为空白或黑色,则可能是由渲染问题引起的,通常与 OpenGL 或 Vulkan 的驱动程序有关。

要解决此问题,请尝试使用以下命令运行 Nsight Systems

QTWEBENGINE_CHROMIUM_FLAGS="--no-sandbox" QMLSCENE_DEVICE=softwarecontext [installation_path]/host-linux-[arch]/nsys-ui

加载 Qt xcb 平台插件需要 xcb-cursor0 或 libxcb-cursor0

如果您遇到以下错误,则可能缺少必需的 xcb-cursor

qt.qpa.plugin: From 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platform plugin.

此问题通常发生在 RHEL 上,但也可能影响其他发行版。要解决此问题,请根据您的操作系统安装必需的 xcb-cursor

  • RHEL/CentOS/Fedora:

    sudo dnf install -y xcb-util-cursor
    
  • OpenSUSE:

    sudo dnf install -y xcb-util-cursor
    
  • Debian/Ubuntu:

    sudo apt-get install -y libxcb-cursor0
    

其他库加载错误

如果打开 Nsight Systems Linux GUI 失败并出现以下错误之一,则您可能缺少一些必需的库

This application failed to start because it could not find or load the Qt platform plugin "xcb" in "". Available platform plugins are: xcb. Reinstalling the application may fix this problem.

error while loading shared libraries: [library_name]: cannot open shared object file: No such file or directory
具有 root 权限的 Ubuntu 18.04/20.04/22.04 和 CentOS 7/8/9
  • 启动以下命令,它将在系统目录中安装所有必需的库

    [installation_path]/host-linux-[arch]/Scripts/DependenciesInstaller/install-dependencies.sh
    
  • 照常启动 Linux GUI。

不具有 root 权限的 Ubuntu 18.04/20.04/22.04 和 CentOS 7/8/9
  • 选择将安装依赖项的目录 (dependencies_path)。此目录应该是当前用户可写的。

  • 启动以下命令(如果已运行,请转到下一步),它将在 [dependencies_path] 中安装所有必需的库

    [installation_path]/host-linux-[arch]/Scripts/DependenciesInstaller/install-dependencies-without-root.sh [dependencies_path]
    
  • 此外,使用以下命令启动 Linux GUI

    source [installation_path]/host-linux-[arch]/Scripts/DependenciesInstaller/setup-dependencies-environment.sh [dependencies_path] && [installation_path]/host-linux-[arch]/nsys-ui
    
其他平台,或者如果之前的步骤没有帮助

使用以下命令行启动 Nsight Systems 以确定缺少哪些库并安装它们。

$ QT_DEBUG_PLUGINS=1 [installation_path]/host-linux-[arch]/nsys-ui

如果工作负载在通过 Nsight Systems 启动时未运行或时间线为空,请检查 stderr.log 和 stdout.log(单击显示 时间线视图 的下拉菜单,然后单击 文件)以查看应用程序遇到的错误。

Stderr Log

符号解析

如果堆栈跟踪信息缺少符号并且您有符号文件,则可以手动重新解析使用 ResolveSymbols 实用程序。这可以通过右键单击项目资源管理器窗口中的报告文件并选择“解析符号…”来完成。

或者,您可以在 [安装路径]\Host 目录中找到该实用程序作为单独的可执行文件。此实用程序适用于 ELF 格式文件、Windows PDB 目录和符号服务器,或每行格式为 <start><length><name> 的文件。

短选项

长选项

参数

描述

-h

--help

帮助消息,提供有关可用选项的信息。

-l

--process-list

打印全局进程 ID 列表

-s

--sym-file

文件名

符号文件路径

-b

--base-addr

地址

如果设置,则符号文件中的 <start> 被视为从此基地址开始的相对地址

-p

--global-pid

pid

应解析报告中的哪个进程。如果报告中只有一个进程,则可以省略。

-f

--force

此选项强制使用给定的符号文件。

-i

--report

文件名

包含未解析符号的报告的路径。

-o

--output

文件名

输出文件的路径和名称。如果省略,则在原始文件名中添加“resolved”后缀。

-d

--directories

目录路径

符号文件夹路径列表,用分号字符分隔。仅在 Windows 上可用。

-v

--servers

服务器 URL

符号服务器列表,使用与 _NT_SYMBOL_PATH 环境变量相同的格式,即 srv*<LocalStore>*<SymbolServerURL>。仅在 Windows 上可用。

-n

--ignore-nt-sym-path

忽略存储在 _NT_SYMBOL_PATH 环境变量中的符号位置。仅在 Windows 上可用。

Tegra 上损坏的回溯

在 Nsight Systems Embedded Platforms Edition 中,符号表中有一个名为 损坏的回溯 的特殊条目。此条目用于表示调用链中 Nsight Systems 使用的展开算法无法确定下一个(调用者)函数的点。

损坏的回溯发生的原因是缺少与当前函数相关的信息,展开算法可以使用这些信息。在自顶向下视图中,这些函数是“损坏的回溯”行的直接子项。

可以通过修改构建系统以提供至少一种展开信息来消除损坏的回溯。Nsight Systems 中的算法使用的展开信息类型包括以下内容

对于 ARMv7 二进制文件

  • ELF 段中的 DWARF 信息:.debug_frame.zdebug_frame.eh_frame.eh_frame_hdr。此信息是最精确的。.zdebug_frame.debug_frame 的压缩版本,因此通常最多存在其中一个。.eh_frame_hdr.eh_frame 的配套段,可能会缺失。

    编译器标志:-g

  • 以 EHABI 格式提供的异常处理信息,位于 .ARM.exidx.ARM.extab ELF 段中。如果所有信息都足够紧凑以编码到 .ARM.exidx 中,则 .ARM.extab 可能会缺失。

    编译器标志:-funwind-tables

  • 帧指针(内置到 .text 段中)。

    编译器标志:-fno-omit-frame-pointer

对于 Aarch64 二进制文件

  • ELF 段中的 DWARF 信息:.debug_frame.zdebug_frame.eh_frame.eh_frame_hdr。请参阅上面的其他注释。

    编译器标志:-g

  • 帧指针(内置到 .text 段中)。

    编译器标志:-fno-omit-frame-pointer

如果以下 ELF 段的大小为 4 字节,则应将其视为空:.debug_frame.eh_frame.ARM.exidx。在这种情况下,这些段仅包含终止记录,没有有用的信息。

对于 GCC,使用以下编译器调用来查看工具链中默认启用了哪些编译器标志(例如,检查是否默认启用了 -funwind-tables

$ gcc -Q --help=common

对于 GCC 和 Clang,在编译器调用命令中添加 -### 以查看实际使用的编译器标志。

由于 EHABI 和 DWARF 信息是按单元编译的(每个 .cpp.c 文件以及每个静态库都可以使用或不使用此信息构建),因此 ELF 段的存在并不能保证每个函数都具有必要的展开信息。

Aarch64 程序调用标准要求使用帧指针。添加帧指针会降低执行速度,但在大多数情况下,这种差异可以忽略不计。

ELF 文件的调试版本

通常,在构建二进制文件之后,特别是如果它是使用调试信息(-g 编译器标志)构建的,则在部署或安装之前会对其进行精简。在这种情况下,包含有用信息的 ELF 区段,例如非导出函数名称或展开信息,也可能会被精简。

一种解决方案是部署或安装原始的未精简库,而不是精简后的库,但在许多情况下,这会很不方便。Nsight Systems 可以使用来自其他位置的缺失信息。

对于使用 Ubuntu 的目标设备,请参阅 调试符号包。这些软件包通常安装带有 /usr/lib/debug 前缀的调试 ELF 文件。Nsight Systems 可以在那里找到调试库,如果它与原始库匹配(例如,内置的 BuildID 相同),它将被拾取并用于提供符号名称和展开信息。

许多软件包在同一存储库中都有调试配套包,可以直接使用 APT (apt-get) 安装。查找带有 -dbg 后缀的软件包。对于其他软件包,请参阅 调试符号包 wiki 页面,了解如何添加 debs 软件包存储库。设置存储库并运行 apt-get update 后,查找带有 -dbgsym 后缀的软件包。

要验证是否已拾取并从目标设备下载库的调试版本,请查看分析摘要模块摘要 部分

Debug library has been used

日志记录

要在主机上启用日志记录,请参阅此配置文件

host-linux-x64/nvlog.config.template

报告任何 bug 时,请包含帮助 → 关于对话框中描述的构建版本号。如果可能,请附上日志文件和报告 (.nsys-rep) 文件,因为它们已经包含必要的版本信息。

Linux 目标上的详细远程日志记录

从主机上的 GUI 连接到基于 Linux 的设备时,可以使用详细日志记录。通过命令行启动时,此额外的调试信息不可用。Nsight Systems 将其可执行文件和库文件安装到以下目录中

/opt/nvidia/nsight_systems/

要在从主机启动时在目标设备上启用详细日志记录,请按照以下步骤操作

  1. 关闭主机应用程序。

  2. 重启目标设备。

  3. 将主机目录中的 nvlog.config 放置到目标上的 /opt/nvidia/nsight_systems 目录中。

  4. 从 SSH 控制台,启动以下命令

    sudo /opt/nvidia/nsight_systems/nsys --daemon --debug
    
  5. 启动主机应用程序并连接到目标设备。

目标设备上的日志收集到此文件中(如果已启用)

nsys.log

在启动 nsys 命令的目录中。

请注意,在某些情况下,调试日志记录可能会显着降低分析器的速度。

Linux 目标上的详细 CLI 日志记录

要启用 Nsight Systems CLI 和目标应用程序注入行为的详细日志记录

  1. 在 target-linux-x64 目录中,将 thenvlog.config.template 文件重命名为 nvlog.config。

  2. 在该文件中,更改行

    $ nsys-ui.log
    

    $ nsys-agent.log
    
  3. 运行采集,并且 target-linux.x64 目录应包含名为 nsys-agent.log 的文件。

注意

在某些情况下,调试日志记录可能会显着降低分析器的速度。

Windows 目标上的详细日志记录

从主机上的 GUI 连接到基于 Windows 的设备时,可以使用详细日志记录。默认情况下,Nsight Systems 将其可执行文件和库文件安装到以下目录中

C:\Program Files\NVIDIA Corporation\Nsight Systems 2023.3

要在从主机启动时在目标设备上启用详细日志记录,请按照以下步骤操作

  1. 关闭主机应用程序。

  2. 终止 nsys 进程。

  3. 将主机目录中的 nvlog.config 放置在目标设备上 Nsight Systems Windows 代理旁边。

    • 本地 Windows 目标

      C:\Program Files\NVIDIA Corporation\Nsight Systems 2023.3\target-windows-x64
      
    • 远程 Windows 目标

      C:\Users\<user name>\AppData\Local\Temp\nvidia\nsight_systems
      
  4. 启动主机应用程序并连接到目标设备。

目标设备上的日志收集到此文件中(如果已启用)

nsight-sys.log

在与 Nsight Systems Windows 代理相同的目录中。

注意

在某些情况下,调试日志记录可能会显着降低分析器的速度。

其他资源

正在寻找信息以帮助您最有效地使用 Nsight Systems?以下是您可能想要查看的更多资源

培训研讨会

NVIDIA 深度学习学院培训 - 自定进度的在线课程 使用 Nsight 分析工具优化 CUDA 机器学习代码

CUDA 开发者工具 YouTube 频道 - NVIDIA Nsight Systems 简介

2018 NCSA Blue Waters 网络研讨会 - 仅视频 NVIDIA Nsight Systems 介绍

博客文章

NVIDIA 开发者博客,这些是由工具和领域专家编写的较长篇幅的技术文章。

特色视频

短视频,只有一两分钟,用于介绍新功能。

会议演讲

更多支持

要提交 bug 报告或在 Nsight Systems 论坛上提问,您需要注册 NVIDIA 开发者计划。请参阅 FAQ。您无需注册即可阅读论坛。

之后,您可以访问 Nsight Systems 论坛NVIDIA Bug 跟踪系统

要直接从 GUI 提交反馈,请转到帮助->发送反馈并填写表格。如果您希望收到 Nsight Systems 团队的回复,请输入您的电子邮件地址。

Feedback