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)、openglvulkan 等。你可以使用逗号分隔多个跟踪类型,例如 --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,探索你的应用程序的性能潜力吧!

posted @ 2025-03-25 16:21  MKY-门可意  阅读(1616)  评论(0)    收藏  举报