有关 Nsight System 和 Nsight Compute 的介绍与常用命令总结。

Introduction

核心定位:一个看“森林”,一个看“树木”

这是理解这两个工具最核心的一点。

  • Nsight Systems (nsys): 系统级性能分析器,负责看“森林”。它监控您的整个应用程序,告诉您CPU和GPU之间是如何交互的,时间都花在了哪些大的模块上(例如:哪个CUDA Kernel耗时最长、数据拷贝花了多久)。
  • Nsight Compute (ncu): Kernel级性能分析器,负责看“树木”。当nsys帮您找到最值得优化的那棵“树”(即耗时最长的Kernel)后,ncu会深入到这棵树的内部,详细分析它的每一个细节(例如:它的计算单元利用率如何?内存访问效率高不高?具体是哪一行代码拖慢了速度?)。

一个生动的比喻:

  • nsys 就像城市交通地图,它告诉您哪条主干道(Kernel)发生了拥堵。
  • ncu 就像汽车引擎诊断仪,它负责分析堵在路上的那辆车,告诉您它的引擎、油路、电路具体哪里出了问题。

对比总结表

方面 (Aspect) NVIDIA Nsight Systems NVIDIA Nsight Compute
命令行工具 nsys ncu
核心定位 系统级 (System-Level) 瓶颈分析 Kernel级 (Kernel-Level) 细节剖析
主要回答的问题 “我的程序瓶颈在哪里?是CPU、GPU还是数据传输?哪个Kernel最耗时?” “我的这个特定Kernel为什么慢?是受限于计算还是内存?哪行代码是瓶颈?”
分析对象 整个应用程序的生命周期 单一或多个CUDA Kernel的单次执行
报告文件后缀 .nsys-rep .ncu-rep
GUI中主要看点 时间线 (Timeline):<br>- CUDA API 调用序列<br>- Kernel启动顺序和耗时<br>- 内存拷贝(Memcpy)时序<br>- CPU/GPU并行情况 详情页 (Details Page):<br>- 性能瓶颈摘要 (Compute/Memory Bound)<br>- 源码与性能数据关联<br>- 内存层级分析 (L1/L2/DRAM)<br>- 调度器和占用率统计
对程序性能影响 较小 (主要为追踪开销) 较大 (通常会多次重放Kernel来收集不同指标)

标准的性能优化工作流 (Workflow)

一个专业且高效的GPU性能优化流程通常会结合使用这两个工具:

  1. 第一步:全局俯瞰 (使用 nsys)
    • 运行 nsys profile ./your_app 来捕获整个应用的性能数据。
    • 在Nsight Systems GUI中打开报告,查看时间线,找到耗时占比最高的CUDA Kernel(s)
  2. 第二步:深入钻研 (使用 ncu)
    • 针对第一步中找到的那个(或几个)“热点”Kernel,使用 ncu 进行深入分析。
    • 运行 ncu -k <hot_kernel_name> -o report_kernel ./your_app 来收集该Kernel的详细数据。
    • 在Nsight Compute GUI中打开报告,分析其瓶颈是计算密集还是内存密集,并定位到具体的源码行。
  3. 第三步:优化迭代
    • 根据 ncu 的分析结果,修改您的CUDA代码(例如:优化内存访问模式、提高并行度等)。
    • 完成修改后,回到第一步,再次使用 nsys 分析整个应用,确认您的修改是否带来了整体性能的提升,以及是否出现了新的瓶颈。

一句话总结

  • Nsight Systems (nsys): 找方向、看全局。帮您定位到最值得优化的性能瓶颈点。
  • Nsight Compute (ncu): 挖细节、做精修。帮您深入分析瓶颈点的内部原因并指导代码级优化。

常用命令总结

NVIDIA Nsight Systems (nsys) 命令总结

核心用途:对整个应用程序进行系统级性能分析,找到宏观瓶颈(如耗时最长的CUDA Kernel、CPU与GPU的交互问题等)。

基础命令结构nsys profile [options] <应用程序> [应用程序参数]

常用命令示例

  1. 基础性能分析

    这是最简单的命令,它会追踪大部分支持的API(CUDA, OpenGL, OS runtime)并生成一份报告。

    nsys profile ./my_app
    • 说明:运行后会在当前目录生成一个名为 report<N>.nsys-rep 的报告文件。
  2. 指定输出并强制覆盖(推荐用法)

    为报告指定一个有意义的名称,并避免因文件已存在而报错。

    nsys profile -o my_report --force-overwrite=true ./my_app
    • -o, --output <文件名>:指定输出报告的名称。
    • --force-overwrite=true:如果报告文件已存在,则自动覆盖。
  3. 聚焦CUDA和NVTX分析

    如果只关心GPU活动,可以通过 -t 参数减少追踪开销,让报告更清晰。

    nsys profile -t cuda,nvtx -o my_cuda_report --force-overwrite=true ./my_app
    • -t, --trace <API>:指定要追踪的API集合。cuda 是CUDA运行时和驱动API,nvtx 是NVIDIA工具扩展,允许您在代码中插入自定义的标记范围,非常强大。
  4. 获取命令行统计摘要

    有时您不想打开GUI,只想快速看一下各个Kernel的耗时统计。

    nsys profile --stats=true ./my_app
    • --stats=true:运行结束后,在命令行终端直接打印出一份性能统计摘要表格,包括CUDA Kernel耗时排序、API调用统计等。
  5. 环境检查

    用于验证 nsys 能否正确识别您的GPU、驱动和系统环境(我们之前用过的)。

    nsys status --environment

NVIDIA Nsight Compute (ncu) 命令总结

核心用途:对单个CUDA Kernel进行深入、细致的性能剖析,找出微观瓶颈(如内存访问、计算单元效率等)。

基础命令结构ncu [options] <应用程序> [应用程序参数]

常用命令示例(推荐按工作流顺序使用)

  1. 第一步:列出所有可分析的Kernel

    在分析之前,先查看您的应用程序中包含哪些可以被 ncu 分析的Kernel。

    Bash

    ncu --list-kernels ./my_app
    • 说明:这将打印一个Kernel列表,方便您复制其确切名称用于下一步。
  2. 第二步:分析指定的单个Kernel(最核心用法)

    这是 ncu 最推荐的使用方式,精确、高效。

    Bash

    ncu -k <Kernel的部分或完整名称> -o my_kernel_report --force-overwrite=true ./my_app
    • -k, --kernel-name <正则表达式>:指定要分析的Kernel名称,支持正则表达式匹配。
    • -o, --output <文件名>:指定输出报告的名称,后缀为 .ncu-rep
  3. 分析一个Kernel的特定启动次数

    如果一个Kernel被循环调用上千次,您可能只想分析其中某几次。

    Bash

    ncu -k my_kernel_name -c 10 -o my_kernel_report ./my_app
    • -c, --launch-count <次数>:指定分析该Kernel的前10次启动。
  4. 收集指定的性能指标集合(提高效率)

    ncu 收集所有指标非常耗时。您可以只收集您关心的“指标集(Section)”。

    Bash

    # 示例:只收集内存和调度器相关的指标
    ncu --section MemoryWorkloadAnalysis --section SchedulerStats -k my_kernel_name -o my_kernel_report ./my_app
    • --section <节名称>:指定要收集的数据集。您可以通过 ncu --list-sections 查看所有可用的节。
  5. 分析整个应用(非常耗时,慎用)

    不加任何过滤,分析程序中启动的所有Kernel。

    Bash

    ncu --set full -o full_app_report --force-overwrite=true ./my_app
    • --set full:收集所有可用指标集,这会导致程序被极大地拖慢,因为每个Kernel都可能被重放(Replay)很多次。