NVIDIA Nsight Systems (nsys) 工具使用
工具详解:
在追求卓越性能的软件开发过程中,理解应用程序在整个系统中的行为至关重要。NVIDIA Nsight Systems (nsys
) 正是一款为此而生的强大工具。它能够帮助开发者深入了解应用程序在 CPU、GPU 和网络通信等各个层面的运行情况,从而有效地识别性能瓶颈并进行优化。本文将带你认识 nsys
工具,了解其主要功能特性,并掌握一些常用的命令。
Nsight Systems 的强大之处:全方位的性能洞察
nsys
不仅仅是一个简单的性能分析器,它提供了一套全面的功能,让你能够从系统级别审视你的应用程序:
- 全系统性能分析:
nsys
能够同时收集 CPU 指令、GPU 活动(包括 CUDA 和图形 API)、内存传输以及网络通信等多种关键性能数据,为你呈现一个完整的系统运行图。 - 直观的时间线视图: 所有收集到的数据都会以时间线的形式清晰地展示出来,让你能够直观地看到不同事件发生的先后顺序、持续时间以及它们之间的相互影响。这对于理解复杂的并发行为非常有帮助。
- 详细的性能指标:
nsys
提供了丰富的性能指标,帮助你量化应用程序对硬件资源的利用情况,例如 GPU 的利用率、内存带宽等。 - 与其他 Nsight 工具集成: 作为 NVIDIA Nsight 工具套件的一部分,
nsys
可以与 Nsight Compute 和 Nsight Graphics 等工具无缝集成,进行更深入、更专业的分析。 - 广泛的 API 支持:
nsys
兼容包括 CUDA、Direct3D、Vulkan、OpenGL、OpenVR 和 Oculus SDK 等在内的多种主流 API,覆盖了广泛的应用场景。 - 灵活的界面选择: 无论你喜欢通过命令行进行自动化分析,还是更倾向于使用图形用户界面进行交互式探索,
nsys
都提供了相应的支持。
掌握 nsys
:常用命令行参数
nsys
提供了强大的命令行界面(CLI),方便用户进行各种性能分析操作。以下是一些最常用的命令及其功能:
-
nsys profile [options] [application] [application args]
: 这是最核心的命令,用于启动应用程序并捕获其性能数据。--trace=<trace>
: 通过这个选项,你可以指定要跟踪的 API 或事件类型,例如cuda
(跟踪 CUDA API 和内核)、cudart
(跟踪 CUDA 运行时 API)、osrt
(跟踪操作系统运行时 API)、opengl
、vulkan
等。你可以使用逗号分隔多个跟踪类型,例如--trace=cuda,osrt,vulkan
。-o <filename>
: 使用此选项指定输出报告文件的名称,通常以.qdrep
格式保存。例如,-o my_report.qdrep
。--duration=<seconds>
: 设置性能分析的持续时间,单位为秒。例如,--duration=10
将会分析应用程序运行的 10 秒。--delay=<seconds>
: 设置开始性能分析前的延迟时间,单位为秒。这在需要等待应用程序启动完成后再开始分析时非常有用。--gpu-metrics-device=<device_id>
: 如果你的系统中有多个 GPU,可以使用此选项指定要收集 GPU 指标的设备 ID。--cudabacktrace=all|api|kernel|none
: 控制 CUDA 回溯信息的收集级别,有助于更深入地了解 CUDA API 调用和内核执行的上下文。- 想要了解更多选项,请随时使用
nsys profile --help
命令查看完整的帮助文档。
-
nsys launch [options] [application] [application args]
: 这个命令用于启动应用程序,并使其处于等待性能分析器连接的状态。这在你需要从另一个进程或机器上连接nsys
进行分析时非常有用。 -
nsys start [options]
: 启动一个新的性能分析会话。通常会与nsys stop
命令配合使用,用于在应用程序运行的特定时间段内进行性能分析。--trace=<trace>
: 同样用于指定要跟踪的 API 或事件类型。--output=<filename>
: 指定输出报告文件的名称。
-
nsys stop
: 停止当前正在运行的性能分析会话,并将收集到的性能数据保存到指定的文件中。 -
nsys cancel
: 如果你想要放弃当前的性能分析会话,可以使用这个命令取消并丢弃已经收集到的数据。 -
nsys service
: 启动 Nsight Systems 数据服务,这是nsys
工具后台运行的一个重要组成部分。 -
nsys stats <filename>.qdrep
: 这个命令可以从一个已经存在的.qdrep
报告文件中生成各种统计信息,帮助你快速了解性能概况。 -
nsys status
: 显示当前nsys
的运行状态,例如是否有正在进行的性能分析会话。 -
nsys shutdown
: 关闭所有与nsys
相关的进程。 -
nsys sessions list
: 列出当前所有活动的性能分析会话。 -
nsys export <filename>.qdrep --type=<format> -o <output_filename>
: 将.qdrep
报告文件导出为其他格式,例如csv
(逗号分隔值)、sqlite
(SQLite 数据库)等,方便与其他工具进行数据交换和分析。 -
nsys analyze <filename>.qdrep
: 分析报告文件,nsys
可能会识别出潜在的性能优化机会并给出建议。 -
nsys recipe <recipe_file>
: 用于运行多节点分析的配方文件,这对于分析分布式应用程序非常有用。 -
nsys nvprof [nvprof options] [application] [application args]
: 对于熟悉 NVIDIA 之前的性能分析工具nvprof
的用户,nsys
提供了这个命令来尝试将nvprof
的命令行选项转换为nsys
的选项并执行分析,方便用户进行迁移。
要获取任何特定命令的更详细信息,只需在终端中运行 nsys --help <command>
即可。例如,要查看 nsys profile
命令的所有可用选项,可以执行 nsys --help profile
。
解读 nsys
的性能报告:以 CUDA 统计为例
当我们使用 nsys
分析应用程序后,会生成一个包含丰富性能数据的报告文件。下面我们以报告中的 CUDA 统计信息为例,来了解如何解读这些数据。
首先,我们可能会看到导出进度的信息:
示例
0% 10 20 30 40 50 60 70 80 90 100%
|----|----|----|----|----|----|----|----|----|----|
***************************************************
Exported successfully to
/dli/task/report2.sqlite
Generating CUDA API Statistics...
CUDA API Statistics (nanoseconds)
Time(%) Total Time Calls Average Minimum Maximum Name
------- -------------- ---------- -------------- -------------- -------------- --------------------------------------------------------------------------------
90.4 2326812288 1 2326812288.0 2326812288 2326812288 cudaDeviceSynchronize
8.9 228554964 3 76184988.0 18275 228490423 cudaMallocManaged
0.7 18209150 3 6069716.7 5416743 7256448 cudaFree
0.0 52492 1 52492.0 52492 52492 cudaLaunchKernel
Generating CUDA Kernel Statistics...
Generating CUDA Memory Operation Statistics...
CUDA Kernel Statistics (nanoseconds)
Time(%) Total Time Instances Average Minimum Maximum Name
------- -------------- ---------- -------------- -------------- -------------- --------------------------------------------------------------------------------
100.0 2326798227 1 2326798227.0 2326798227 2326798227 addVectorsInto
CUDA Memory Operation Statistics (nanoseconds)
Time(%) Total Time Operations Average Minimum Maximum Name
------- -------------- ---------- -------------- -------------- -------------- --------------------------------------------------------------------------------
76.6 68267872 2304 29630.2 1888 171104 [CUDA Unified Memory memcpy HtoD]
23.4 20857792 768 27158.6 1152 159776 [CUDA Unified Memory memcpy DtoH]
CUDA Memory Operation Statistics (KiB)
Total Operations Average Minimum Maximum Name
----------------- -------------- ----------------- ----------------- ----------------- --------------------------------------------------------------------------------
393216.0 2304 170.7 4.000 1020.0 [CUDA Unified Memory memcpy HtoD]
131072.0 768 170.7 4.000 1020.0 [CUDA Unified Memory memcpy DtoH]
解析
导出事件4528条
Exporting 4528 events:
0% 10 20 30 40 50 60 70 80 90 100%
|----|----|----|----|----|----|----|----|----|----|
Exported successfully to
/dli/task/report2.sqlite
这表明 nsys
已经成功导出了收集到的 4528 个性能事件,并将报告保存到了 /dli/task/report2.sqlite
文件中。这个文件可以使用 nsys-ui
图形界面工具或其他兼容工具进行进一步的分析和可视化。
接下来,我们可能会看到 CUDA API 的统计信息:
CUDA API Statistics (nanoseconds)
Time(%) | Total Time | Calls | Average | Minimum | Maximum | Name |
---|---|---|---|---|---|---|
90.4 | 2326812288 | 1 | 2326812288.0 | 2326812288 | 2326812288 | cudaDeviceSynchronize |
8.9 | 228554964 | 3 | 76184988.0 | 18275 | 228490423 | cudaMallocManaged |
0.7 | 18209150 | 3 | 6069716.7 | 5416743 | 7256448 | cudaFree |
0.0 | 52492 | 1 | 52492.0 | 52492 | 52492 | cudaLaunchKernel |
这个表格展示了在性能分析期间应用程序调用的各个 CUDA API 的统计数据。例如,cudaDeviceSynchronize
这个 API 调用花费了总执行时间的 90.4%,总共耗时 2326812288 纳秒。cudaMallocManaged
被调用了 3 次,平均每次耗时 76184988 纳秒。通过分析这个表格,我们可以了解到哪些 CUDA API 调用是性能的关键。
类似地,nsys
还会提供 CUDA 内核的统计信息:
CUDA Kernel Statistics (nanoseconds)
Time(%) | Total Time | Instances | Average | Minimum | Maximum | Name |
---|---|---|---|---|---|---|
100.0 | 2326798227 | 1 | 2326798227.0 | 2326798227 | 2326798227 | addVectorsInto |
这个表格显示了每个 CUDA 内核的执行情况。在上面的例子中,名为 addVectorsInto
的内核是唯一被跟踪到的内核,它占用了所有 GPU 内核执行时间的 100%。
对于 CUDA 内存操作,nsys
会提供更详细的统计信息,包括按时间和数据量的统计:
CUDA Memory Operation Statistics (nanoseconds)
Time(%) | Total Time | Operations | Average | Minimum | Maximum | Name |
---|---|---|---|---|---|---|
76.6 | 68267872 | 2304 | 29630.2 | 1888 | 171104 | [CUDA Unified Memory memcpy HtoD] |
23.4 | 20857792 | 768 | 27158.6 | 1152 | 159776 | [CUDA Unified Memory memcpy DtoH] |
这个表格显示了内存操作的时间统计。[CUDA Unified Memory memcpy HtoD]
表明从主机到设备的数据拷贝操作发生了 2304 次,总共耗时 68267872 纳秒。[CUDA Unified Memory memcpy DtoH]
则表示从设备到主机的拷贝操作。
CUDA Memory Operation Statistics (KiB)
Total | Operations | Average | Minimum | Maximum | Name |
---|---|---|---|---|---|
393216.0 | 2304 | 170.7 | 4.000 | 1020.0 | [CUDA Unified Memory memcpy HtoD] |
131072.0 | 768 | 170.7 | 4.000 | 1020.0 | [CUDA Unified Memory memcpy DtoH] |
这个表格则展示了内存操作的数据量统计。可以看到,总共有 393216 KiB 的数据从主机传输到设备,以及 131072 KiB 的数据从设备传输到主机。正如之前提到的,大量的 HtoD 操作,特别是当平均和最小传输大小较小时(例如这里的平均 170.7 KiB,最小 4.000 KiB),可能暗示着由于按需页面错误导致的小块内存迁移。
最后,nsys
还会提供操作系统运行时 API 的统计信息:
Operating System Runtime API Statistics (nanoseconds)
Time(%) | Total Time | Calls | Average | Minimum | Maximum | Name |
---|---|---|---|---|---|---|
59.1 | 5356789601 | 275 | 19479234.9 | 21676 | 100132108 | poll |
39.6 | 3590069124 | 274 | 13102442.1 | 13797 | 100067362 | sem_timedwait |
... | ... | ... | ... | ... | ... | ... |
这个表格列出了应用程序调用的各种操作系统级别的 API 及其耗时。分析这些数据可以帮助我们理解应用程序与操作系统之间的交互,并发现潜在的系统级瓶颈。
总结
NVIDIA Nsight Systems (nsys
) 是一款功能强大的系统级性能分析工具,它通过提供全方位的性能数据和直观的可视化界面,帮助开发者深入了解应用程序在整个系统中的行为。掌握 nsys
的使用,能够让你更有效地识别性能瓶颈,优化资源利用率,最终提升应用程序的整体效率。现在就开始使用 nsys
,探索你的应用程序的性能潜力吧!