NVIDIA系统级性能分析工具Nsight Systems如何从入门到精通?
摘要:本文首先对NVIDIA GPU程序系统级性能分析工具Nsight Systems进行简单的介绍,然后说明了工具适用平台及安装,最后通过cuda-samples示例程序的分析,说明了如何在实际应用中使用该功能强大的工具。
1 基本情况
1.1 简介
Nsight Systems(简称nsys)是NVIDIA推出的一款系统级性能分析工具,主要用于优化 GPU 加速应用程序(尤其是基于 CUDA、OpenCL、DirectX、Vulkan 等 API 开发的程序)的性能,帮助开发者定位和解决计算、内存、通信等环节的瓶颈。所谓系统层面的分析工具,除了分析GPU的使用,还要分析CPU的使用,以及CPU和GPU的交互情况,可以捕捉CPU和GPU的各种事件,发现CPU和GPU上的等待以及不必要的同步,可以通过Nsight systems将任务均匀的分配到CPU和GPU上。做为NVIDIA核心分析工具之一,它和Compute以及Graphics有各自的侧重点:
Nsight Systems: A system-wide performance analysis tool
Nsight Compute: An interactive kernel profiler for CUDA applications
Nsight Graphics: A standalone developer tool to debug, profile, and export frames built with Direct3D, Vulkan, OpenGL, OpenVR
下图给出了CUDA程序整理优化流程,对于Nsight Systems侧重点在CPU&GPU同步、数据拷贝以及处理重叠同步运行等方面,优化后再分别用Compute完成Kernel层或者用Graphics完成图像层优化,这之后再重新进行系统层分析及优化,不断迭代最终完成应用程序优化。
接下来用下面的图来初步了解下Nsight Systems的强大功能,图中matrix_mul_test是一个GPU程序,在它执行过程中ntoskernl.exe会以线程形式参与到内存管理和设备驱动交互等环节,红色、橙色、绿色分别表示CPU占用率、当前CPU核(不同颜色表示线程运行在不同CPU核上)、线程状态(不同颜色表示不同状态Running,Ready to run,Blocked),图中标记1处于Running状态,标记2处于Ready to run状态,这时可能是ntoskernl线程在当前CPU核上时间片运行结束,CPU核已经调度给其他线程,比如标记3表示的ToDesk程序的相应线程。
通过上图可以看到,借助Nsight Systems的图形显示可以直观方便的对GPU程序的运行过程进行分析。
1.2 安装
Nsight Systems是一款跨平台应用工具,根据主机平台的不同,它支持本地或远程Profiling目标程序,简单来说就是在Linxu和Windows下既支持本地分析有支持远程分析目标程序,对于Mac系统来说,只支持远程分析目标程序,以下是完整的支持列表:
不同平台的用户,可从最后参考1地址获得相应平台的安装程序,工具当前最新版本为2025.5.1。
以Windows平台为例,下载以后直接安装NsightSystems-2025xxxxx.msi文件即可,另外如果之前安装toolkit,其实已经在在其中包含Nsight Systems,当然可能不是最新版本。其他平台看着请参考官网说明进行安装。
2 使用说明
2.1 图形界面
1. 创建工程
打开NsightSystems后,工具中默认会创建一个Project 1的工程,可以将该工程进行重命名,如改为HelloNsight,之后需要在右侧指定一个分析目标,工具支持多种方式的目标,以下进行详细解释:
(1)Localhost connection
表示本地主机连接,即对运行 Nsight Systems 的本机进行性能分析、调试。可监测和分析本机上运行的程序,收集其性能数据,像 CPU、GPU 的使用情况,线程活动等。图图中“zwv” 是已识别我的电脑名称。
(2)USB connections
指通过 USB 连接的调试目标。可用于分析连接到本机 USB 接口的设备上运行的程序性能,比如Jetson和Rive平台等,只要设备支持且正确配置,就能通过该连接进行性能数据采集。
(3)SSH connections
基于 SSH(Secure Shell)协议的远程连接。借助 SSH 安全通道,可连接到远程主机(如另一台服务器、开发机等),对远程主机上运行的程序进行性能分析和调试,方便管理不在本地的设备或集群环境中的程序性能。
(4)SSH connection groups
是 SSH 连接组,可将多个 SSH 连接进行分组管理。比如有多个远程服务器需要调试,可把它们的 SSH 连接归为一组,便于批量操作、统一管理和快速切换不同远程目标,提升对多远程环境调试的效率。
(5)Configure targets:
用于配置调试目标相关参数,比如添加新的调试目标、设置目标连接的认证信息(SSH 连接的用户名密码、密钥等 )、调整连接超时时间等,对调试目标进行个性化设置和管理,确保能正确连接、识别和调试各类目标设备或程序 。
这里以本地可执行程序vectorAdd.exe为例进行解析,该程序是NVIDIA官方提供cuda-samples中的示例程序,可以从官方Github主页上下载,主要功能就是计算两个数组之和,其源码如下:
1 /* Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions
5 * are met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above copyright
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution.
11 * * Neither the name of NVIDIA CORPORATION nor the names of its
12 * contributors may be used to endorse or promote products derived
13 * from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 /**
29 * Vector addition: C = A + B.
30 *
31 * This sample is a very basic sample that implements element by element
32 * vector addition. It is the same as the sample illustrating Chapter 2
33 * of the programming guide with some additions like error checking.
34 */
35
36 #include <stdio.h>
37
38 // For the CUDA runtime routines (prefixed with "cuda_")
39 #include <cuda_runtime.h>
40
41 #include <helper_cuda.h>
42 /**
43 * CUDA Kernel Device code
44 *
45 * Computes the vector addition of A and B into C. The 3 vectors have the same
46 * number of elements numElements.
47 */
48 __global__ void vectorAdd(const float *A, const float *B, float *C,
49 int numElements) {
50 int i = blockDim.x * blockIdx.x + threadIdx.x;
51
52 if (i < numElements) {
53 C[i] = A[i] + B[i] + 0.0f;
54 }
55 }
56
57 /**
58 * Host main routine
59 */
60 int main(void) {
61 // Error code to check return values for CUDA calls
62 cudaError_t err = cudaSuccess;
63
64 // Print the vector length to be used, and compute its size
65 int numElements = 50000;
66 size_t size = numElements * sizeof(float);
67 printf("[Vector addition of %d elements]\n", numElements);
68
69 // Allocate the host input vector A
70 float *h_A = (float *)malloc(size);
71
72 // Allocate the host input vector B
73 float *h_B = (float *)malloc(size);
74
75 // Allocate the host output vector C
76 float *h_C = (float *)malloc(size);
77
78 // Verify that allocations succeeded
79 if (h_A == NULL || h_B == NULL || h_C == NULL) {
80 fprintf(stderr, "Failed to allocate host vectors!\n");
81 exit(EXIT_FAILURE);
82 }
83
84 // Initialize the host input vectors
85 for (int i = 0; i < numElements; ++i) {
86 h_A[i] = rand() / (float)RAND_MAX;
87 h_B[i] = rand() / (float)RAND_MAX;
88 }
89
90 // Allocate the device input vector A
91 float *d_A = NULL;
92 err = cudaMalloc((void **)&d_A, size);
93
94 if (err != cudaSuccess) {
95 fprintf(stderr, "Failed to allocate device vector A (error code %s)!\n",
96 cudaGetErrorString(err));
97 exit(EXIT_FAILURE);
98 }
99
100 // Allocate the device input vector B
101 float *d_B = NULL;
102 err = cudaMalloc((void **)&d_B, size);
103
104 if (err != cudaSuccess) {
105 fprintf(stderr, "Failed to allocate device vector B (error code %s)!\n",
106 cudaGetErrorString(err));
107 exit(EXIT_FAILURE);
108 }
109
110 // Allocate the device output vector C
111 float *d_C = NULL;
112 err = cudaMalloc((void **)&d_C, size);
113
114 if (err != cudaSuccess) {
115 fprintf(stderr, "Failed to allocate device vector C (error code %s)!\n",
116 cudaGetErrorString(err));
117 exit(EXIT_FAILURE);
118 }
119
120 // Copy the host input vectors A and B in host memory to the device input
121 // vectors in
122 // device memory
123 printf("Copy input data from the host memory to the CUDA device\n");
124 err = cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
125
126 if (err != cudaSuccess) {
127 fprintf(stderr,
128 "Failed to copy vector A from host to device (error code %s)!\n",
129 cudaGetErrorString(err));
130 exit(EXIT_FAILURE);
131 }
132
133 err = cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
134
135 if (err != cudaSuccess) {
136 fprintf(stderr,
137 "Failed to copy vector B from host to device (error code %s)!\n",
138 cudaGetErrorString(err));
139 exit(EXIT_FAILURE);
140 }
141
142 // Launch the Vector Add CUDA Kernel
143 int threadsPerBlock = 256;
144 int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock;
145 printf("CUDA kernel launch with %d blocks of %d threads\n", blocksPerGrid,
146 threadsPerBlock);
147 vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);
148 err = cudaGetLastError();
149
150 if (err != cudaSuccess) {
151 fprintf(stderr, "Failed to launch vectorAdd kernel (error code %s)!\n",
152 cudaGetErrorString(err));
153 exit(EXIT_FAILURE);
154 }
155
156 // Copy the device result vector in device memory to the host result vector
157 // in host memory.
158 printf("Copy output data from the CUDA device to the host memory\n");
159 err = cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
160
161 if (err != cudaSuccess) {
162 fprintf(stderr,
163 "Failed to copy vector C from device to host (error code %s)!\n",
164 cudaGetErrorString(err));
165 exit(EXIT_FAILURE);
166 }
167
168 // Verify that the result vector is correct
169 for (int i = 0; i < numElements; ++i) {
170 if (fabs(h_A[i] + h_B[i] - h_C[i]) > 1e-5) {
171 fprintf(stderr, "Result verification failed at element %d!\n", i);
172 exit(EXIT_FAILURE);
173 }
174 }
175
176 printf("Test PASSED\n");
177
178 // Free device global memory
179 err = cudaFree(d_A);
180
181 if (err != cudaSuccess) {
182 fprintf(stderr, "Failed to free device vector A (error code %s)!\n",
183 cudaGetErrorString(err));
184 exit(EXIT_FAILURE);
185 }
186
187 err = cudaFree(d_B);
188
189 if (err != cudaSuccess) {
190 fprintf(stderr, "Failed to free device vector B (error code %s)!\n",
191 cudaGetErrorString(err));
192 exit(EXIT_FAILURE);
193 }
194
195 err = cudaFree(d_C);
196
197 if (err != cudaSuccess) {
198 fprintf(stderr, "Failed to free device vector C (error code %s)!\n",
199 cudaGetErrorString(err));
200 exit(EXIT_FAILURE);
201 }
202
203 // Free host memory
204 free(h_A);
205 free(h_B);
206 free(h_C);
207
208 printf("Done\n");
209 return 0;
210 }
vectorAdd.cu
配置待分析的可执行程序,以及设置相应的工作目录是进行分析的必选项,其他选项都是可以定制,如下所示:
2. 配置采集项
上图中采集配置项主要可以分为6个方面:
(1)CPU相关采集项
Collect CPU IP/backtrace samples(CPU 指令指针 / 回溯采样)
以设置的采样率(如 1kHz)记录 CPU 指令执行位置,结合调用栈,帮你定位程序耗时在哪些函数、代码段,分析 CPU 计算瓶颈。
Sampling rate:控制采样频率,频率越高数据越细但采集开销越大,按需平衡精度和性能。
Collect call stacks of executing threads:记录 “活跃线程” 的调用栈,明确 CPU 周期到底用在哪些函数调用里。
Collect CPU context switch trace(CPU 上下文切换追踪)
记录线程在 CPU 核心间切换、阻塞 / 唤醒等事件,分析线程调度效率,排查因频繁切换导致的性能损耗。
Collect call stacks of blocked threads:记录 “阻塞线程” 的调用栈,找到线程等待资源(锁、IO 等)的原因,优化同步逻辑。
(2)异构计算相关采集(GPU及特定API)
Collect CUDA trace
深度追踪 CUDA 调用(如核函数启动、内存分配),分析 GPU 任务调度、内存传输瓶颈,是 CUDA 程序性能优化核心配置。
Flush data periodically:定期将采集的CUDA追踪数据从内存刷写到磁盘/存储,避免因程序崩溃、异常退出导致采集数据丢失,例如10.00 seconds表示每10秒执行依次存盘操作。
Flush CUDA trace buffers on cudaProfilerStop():调用cudaProfilerStop() API时,强制将CUDA追踪缓冲区的数据存盘,
Skip some API calls:跳过部分低价值、高频次的CUDA API调用追踪,可以降低采集开销简化分析数据,让你更专注kernel launch、memory copy等关键操作。
CUDA Event trace mode:控制CUDA Event的追踪模式,Off表示关闭,如果开启,可追踪cudaEventRecord/cudaEventSynchronize等事件,分析GPU任务同步、耗时依赖。
CUDA graph trace granularity:设置CUDA Graph(任务图)的追踪粒度,如Graph(图级),Graph表示把整个CUDA Graph当作一个整体追踪,Node会细化到Graph内部的每个Node。
Trace CUDA graphs launched from device codes:追踪由设备端代码启动的CUDA Graphs。
Collect GPU memory usage:采集GPU内存的使用数据,配合核函数、内存传输的追踪,分析“内存占用”与“计算性能”的关联(如现存带宽瓶颈时,内存分配策略是否可优化)。
Collect hardware-based trace:启动硬件级追踪,采集更底层的硬件指标(如SM利用率、warp调度效率、指令吞吐率),适合深度优化核函数。
Collect GPU context switch trace
追踪 GPU 上下文切换事件(如不同 CUDA 上下文切换),排查 GPU 资源竞争、调度延迟问题。
Collect GPU Metrics
采集 GPU 硬件指标(如 SM 利用率、显存带宽),从硬件层面定位性能瓶颈,需 GPU 支持对应 metrics 采集。
Collect NVTX trace
识别程序中通过 NVTX(NVIDIA 工具扩展)标记的自定义事件 / 区间,方便关联业务逻辑(如 “模型推理阶段”“数据预处理”),分析各阶段耗时。
Collect WDDM trace(Windows 环境)
采集 WDDM(Windows 显示驱动模型)相关事件,分析 GPU 与系统显示子系统交互性能,对图形渲染、游戏等程序有帮助。
(3)图形API追踪(按需启用)
Collect DX11/DX12/OpenGL/Vulkan trace
针对对应图形 API 的程序,采集 API 调用、渲染管线事件,分析图形渲染性能,优化画面卡顿、帧率低等问题。
Collect OpenXR trace
追踪 OpenXR(跨平台 AR/VR 标准)相关事件,分析 VR/AR 应用在设备交互、场景渲染的性能表现。
(4)其他特殊采集
Collect ISR/DPCC trace
采集 ISR(中断服务程序)、DPCC(特定 GPU 调试事件),一般用于深度系统级调试,普通应用优化较少用到。
Collect custom ETW trace(Windows 环境)
采集自定义 ETW(Event Tracing for Windows)事件,可整合系统级或其他工具的自定义性能数据。
Collect Reflex SDK events
追踪 NVIDIA Reflex(低延迟优化 SDK)相关事件,分析游戏等应用的输入延迟、渲染同步性能。
(5)Python profiling options
针对 Python 程序,可配置 Python 性能分析参数(如采集 Python 函数调用栈、追踪解释器事件 ),分析 Python 脚本在 CPU/GPU 交互、第三方库调用的性能问题。
(6)右侧采集触发控制
Start profiling manually:手动点击开始 / 停止采集,灵活控制采集区间(如只抓 “程序关键流程”)。
Start profiling after/ Limit profiling to(seconds/frames):设置延迟启动、限制采集时长 / 帧数,避免采集无关数据,聚焦目标阶段(如 “前 10 秒初始化不采集,只抓后续 600 帧渲染” )。
Hotkey Start/Stop:设置快捷键(如 F12)控制采集,方便运行程序时快速触发,无需切回界面操作。
由于这些选项覆盖了从 CPU 基础分析→GPU 异构计算→图形 / VR 渲染→特殊场景(如 Python、AR/VR ) 的全链路性能采集能力,在进行配置时,按需勾选配置,以最大限度地减少跟踪开销。
3. 结果分析
首先看看在只选择“Collect CUDA trace”时的report结果:
在图中的timeline视图中可以清楚的看到主要函数调用时间线,其中三个cudaMalloc调用中,第一个调用所花费的时间要远远大于剩余两个图中标记1,这是因为在第一次调用任何CUDA API(包括cudaMalloc)时,CUDA runtime 会进行:CUDA 上下文创建(Context Creation),驱动和设备初始化,内核模块加载等操作,这部分开销通常是毫秒级,所以第一次cudaMalloc看起来很慢,图中标记2是HostToDevice内存拷贝,标记3是DeviceToHost内存拷贝,由于程序比较简单可见这两部分内存拷贝占用绝大部分的运行时间,而真正的Kernel函数调用仅仅占用3.8%,见标记4。
Report中的分析汇总给出了解析过程依赖的主要硬件资源:
诊断汇总给出了解析过程中的主要事件线索:
最后,Files给出了标准错误输出log信息,标准输出log信息,以及配置信息。
2.2 命令行
1.Nsight Systems 进行分析
命令行方式主要应用在Linux操作系统下,仍使用之前的vectorAdd作为分析对象,直接使用如下命令进行分析:
nsys profile -o report ./vectorAdd
命令执行后会生成report.nsys-rep分析文件,后续可以通过命令行获取相关信息或者Nsight Systems GUI工具直接打开该文件进行分析。
需要注意的是图中在输出结果前还有两个警告信息,它表明在当前环境下的某些功能不可用(CPU相关),所以它自动关掉了,出现这个警告,可能是和当前CPU架构或者操作系统内核等相关,可以使用nsys status --environment命令查看当前环境对 Nsight Systems 各种功能的支持情况,如输出信息如下:
1 Timestamp counter supported: Yes
2
3 CPU Profiling Environment Check
4 Root privilege: disabled
5 Linux Kernel Paranoid Level = 4
6 Linux Distribution = Ubuntu
7 Linux Kernel Version = 6.8.0-65-generic: OK
8 Linux perf_event_open syscall available: Fail
9 Sampling trigger event available: Fail
10 Intel(c) Last Branch Record support: Not Available
11 CPU Profiling Environment (process-tree): Fail
12 CPU Profiling Environment (system-wide): Fail
13
14 See the product documentation at https://docs.nvidia.com/nsight-systems for more information,
15 including information on how to set the Linux Kernel Paranoid Level.
可见在9~12行,有好几处Fail所以导致了相关CPU profiling不支持,后搜索解决方案发现,进行如下操作可能解决该问题:
# 安装 libunwind
sudo apt install libunwind-dev
# 确认用户有权限访问 perf_event
sudo sysctl -w kernel.perf_event_paranoid=1
进行上述操作后,再次检测环境,虽然仍有一个错误提示,但是再次运行nsys分析时已经不再显示两个警告信息:
2. 分析结果
可使用如下命令分析结果:
nsys stats report.nsys-rep
关键输出信息类似:
1 ** CUDA API Summary (cuda_api_sum):
2
3 Time (%) Total Time (ns) Num Calls Avg (ns) Med (ns) Min (ns) Max (ns) StdDev (ns) Name
4 -------- --------------- --------- ------------ -------- -------- ---------- ------------ ----------------
5 99.6 86,755,035 3 28,918,345.0 5,369.0 3,688 86,745,978 50,080,199.2 cudaMalloc
6 0.3 223,020 3 74,340.0 43,770.0 39,025 140,225 57,107.4 cudaMemcpy
7 0.1 92,533 3 30,844.3 21,988.0 4,057 66,488 32,143.9 cudaFree
8 0.0 21,241 1 21,241.0 21,241.0 21,241 21,241 0.0 cudaLaunchKernel
9
10 Processing [report.sqlite] with [/opt/nvidia/nsight-systems/2023.1.2/host-linux-x64/reports/cuda_gpu_kern_sum.py]...
11
12 ** CUDA GPU Kernel Summary (cuda_gpu_kern_sum):
13
14 Time (%) Total Time (ns) Instances Avg (ns) Med (ns) Min (ns) Max (ns) StdDev (ns) Name
15 -------- --------------- --------- -------- -------- -------- -------- ----------- -----------------------------------------------------
16 100.0 4,128 1 4,128.0 4,128.0 4,128 4,128 0.0 vectorAdd(const float *, const float *, float *, int)
17
18 Processing [report.sqlite] with [/opt/nvidia/nsight-systems/2023.1.2/host-linux-x64/reports/cuda_gpu_mem_time_sum.py]...
19
20 ** CUDA GPU MemOps Summary (by Time) (cuda_gpu_mem_time_sum):
21
22 Time (%) Total Time (ns) Count Avg (ns) Med (ns) Min (ns) Max (ns) StdDev (ns) Operation
23 -------- --------------- ----- -------- -------- -------- -------- ----------- ------------------
24 67.5 33,122 2 16,561.0 16,561.0 16,513 16,609 67.9 [CUDA memcpy HtoD]
25 32.5 15,937 1 15,937.0 15,937.0 15,937 15,937 0.0 [CUDA memcpy DtoH]
输出信息第1~8行是CPU API 调用耗时统计,其中Avg是平均时间,例如cudaMalloc函数在程序中一共被调用了3次,第1次由于包含GPU初始化相关内容运行时间最长,为Max值为86,745,978ns,第2次调用时间为中位数时间Med,值为5,369ns,第3次调用用时最少为Min,值为3,688ns,3次调用的平均时间Avg为28,918,345ns,StdDev为运行时间的标准偏差,其计算公式为sqrt(Σpow((xi-xavg), 2)/(n -1)),该值用于衡量数据的离散程度,即各数据点与平均值之间的平均偏离程度,其大小直接反映API调用时长的稳定性。由第8行可知,在Linux平台下整个cudaLaunchKernel调用时间仅有21,241 ns,在整个程序运行时间中的占比基本可以被忽略。输出信息第10~16行是Kernel函数vectorAdd的运行时间为4128ns,输出信息第20~25行是设备和主机内存互拷所用时间,分别是33123ns和15937ns,这三部分时间中,Kernel运行时间只占4128.0/(4128+33122+15937)=0.0776,即7.8%左右。
此外在命令行输出的report文件也可以在Nsight system GUI里直接打开,图中分别框出了Kernels运行占比、第3次cudaMalloc调用及Kernel函数vectorAdd运行时间,显示值也是和命令行中的输出信息及分析结果一致的:
3. 其他内容
在 Nsight Systems 中使用nsys profile命令时,加上--stats=true参数会产生.sqlite文件,参数会使 Nsight Systems 在收集性能数据的过程中,额外收集并整理统计信息, 而.sqlite格式在存储结构化数据和统计信息方面有较好的支持和优势。开启该参数后,工具为了更方便地存储和组织这些额外的统计数据,会生成.sqlite文件,以充分利用 SQLite 数据库在数据管理和查询上的特性,便于后续对性能统计信息进行分析、检索 。用sqlite工具打开相应文件,内容如下,由于本人对数据库操作不熟悉对此不再详细分析。
更多命令行参数请参考官方文档。
参考
1.https://developer.nvidia.com/nsight-systems/get-started
2.https://docs.nvidia.com/nsight-systems/index.html
3.https://docs.nvidia.com/nsight-systems/UserGuide/index.html
