Nsight System & Nsight Compute
有关 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性能优化流程通常会结合使用这两个工具:
- 第一步:全局俯瞰 (使用 
nsys)- 运行 
nsys profile ./your_app来捕获整个应用的性能数据。 - 在Nsight Systems GUI中打开报告,查看时间线,找到耗时占比最高的CUDA Kernel(s)。
 
 - 运行 
 - 第二步:深入钻研 (使用 
ncu)- 针对第一步中找到的那个(或几个)“热点”Kernel,使用 
ncu进行深入分析。 - 运行 
ncu -k <hot_kernel_name> -o report_kernel ./your_app来收集该Kernel的详细数据。 - 在Nsight Compute GUI中打开报告,分析其瓶颈是计算密集还是内存密集,并定位到具体的源码行。
 
 - 针对第一步中找到的那个(或几个)“热点”Kernel,使用 
 - 第三步:优化迭代
- 根据 
ncu的分析结果,修改您的CUDA代码(例如:优化内存访问模式、提高并行度等)。 - 完成修改后,回到第一步,再次使用 
nsys分析整个应用,确认您的修改是否带来了整体性能的提升,以及是否出现了新的瓶颈。 
 - 根据 
 
一句话总结
- Nsight Systems (
nsys): 找方向、看全局。帮您定位到最值得优化的性能瓶颈点。 - Nsight Compute (
ncu): 挖细节、做精修。帮您深入分析瓶颈点的内部原因并指导代码级优化。 
常用命令总结
NVIDIA Nsight Systems (nsys) 命令总结
核心用途:对整个应用程序进行系统级性能分析,找到宏观瓶颈(如耗时最长的CUDA Kernel、CPU与GPU的交互问题等)。
基础命令结构:nsys profile [options] <应用程序> [应用程序参数]
常用命令示例
- 
基础性能分析
这是最简单的命令,它会追踪大部分支持的API(CUDA, OpenGL, OS runtime)并生成一份报告。
nsys profile ./my_app- 说明:运行后会在当前目录生成一个名为 
report<N>.nsys-rep的报告文件。 
 - 说明:运行后会在当前目录生成一个名为 
 - 
指定输出并强制覆盖(推荐用法)
为报告指定一个有意义的名称,并避免因文件已存在而报错。
nsys profile -o my_report --force-overwrite=true ./my_app-o, --output <文件名>:指定输出报告的名称。--force-overwrite=true:如果报告文件已存在,则自动覆盖。
 - 
聚焦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工具扩展,允许您在代码中插入自定义的标记范围,非常强大。
 - 
获取命令行统计摘要
有时您不想打开GUI,只想快速看一下各个Kernel的耗时统计。
nsys profile --stats=true ./my_app--stats=true:运行结束后,在命令行终端直接打印出一份性能统计摘要表格,包括CUDA Kernel耗时排序、API调用统计等。
 - 
环境检查
用于验证 nsys 能否正确识别您的GPU、驱动和系统环境(我们之前用过的)。
nsys status --environment 
NVIDIA Nsight Compute (ncu) 命令总结
核心用途:对单个CUDA Kernel进行深入、细致的性能剖析,找出微观瓶颈(如内存访问、计算单元效率等)。
基础命令结构:ncu [options] <应用程序> [应用程序参数]
常用命令示例(推荐按工作流顺序使用)
- 
第一步:列出所有可分析的Kernel
在分析之前,先查看您的应用程序中包含哪些可以被 ncu 分析的Kernel。
Bash
ncu --list-kernels ./my_app- 说明:这将打印一个Kernel列表,方便您复制其确切名称用于下一步。
 
 - 
第二步:分析指定的单个Kernel(最核心用法)
这是 ncu 最推荐的使用方式,精确、高效。
Bash
ncu -k <Kernel的部分或完整名称> -o my_kernel_report --force-overwrite=true ./my_app-k, --kernel-name <正则表达式>:指定要分析的Kernel名称,支持正则表达式匹配。-o, --output <文件名>:指定输出报告的名称,后缀为.ncu-rep。
 - 
分析一个Kernel的特定启动次数
如果一个Kernel被循环调用上千次,您可能只想分析其中某几次。
Bash
ncu -k my_kernel_name -c 10 -o my_kernel_report ./my_app-c, --launch-count <次数>:指定分析该Kernel的前10次启动。
 - 
收集指定的性能指标集合(提高效率)
ncu 收集所有指标非常耗时。您可以只收集您关心的“指标集(Section)”。
Bash
# 示例:只收集内存和调度器相关的指标
ncu --section MemoryWorkloadAnalysis --section SchedulerStats -k my_kernel_name -o my_kernel_report ./my_app--section <节名称>:指定要收集的数据集。您可以通过ncu --list-sections查看所有可用的节。
 - 
分析整个应用(非常耗时,慎用)
不加任何过滤,分析程序中启动的所有Kernel。
Bash
ncu --set full -o full_app_report --force-overwrite=true ./my_app--set full:收集所有可用指标集,这会导致程序被极大地拖慢,因为每个Kernel都可能被重放(Replay)很多次。