3. Nsight Compute快速上手

Nsight Compute(简称 ncu)是 NVIDIA 面向单个 CUDA 内核做深度性能剖析的工具。与 Nsight Systems 关注整条时间线上的系统级行为不同,Nsight Compute 把注意力集中在一个或一组内核上,回答“这个内核为什么慢、慢在计算还是访存、瓶颈落在哪条流水线”这类问题。本节从安装配置讲到一次完整的单内核剖面采集,并解释 Speed Of Light 面板与基础指标的含义。

安装与配置

Nsight Compute 随 CUDA Toolkit 一起分发,也可以单独从 NVIDIA 官网下载安装包。安装后需要确认两件事:命令行工具 ncu 是否在 PATH 中,以及目标机器是否允许性能计数器访问。在 Linux 上,非 root 用户默认无法读取 GPU 硬件计数器,需要调整驱动参数:

# 查看当前权限状态
cat /proc/driver/nvidia/params | grep RmProfilingAdminOnly

# 若为 1,则仅管理员可采集;改为 0 后普通用户可采集
sudo sh -c 'echo "options nvidia NVreg_RestrictProfilingToAdminUsers=0" \
  > /etc/modprobe.d/nvidia-profiler.conf'
sudo update-initramfs -u
sudo reboot

重启后用 ncu --version 验证版本,并运行 ncu --query-metrics | head 确认能列出指标。若在容器或云主机中,还需确认 GPU 直通与驱动版本匹配。GUI 版本(Nsight Compute 独立界面)与命令行共享同一套采集引擎,二者可交叉使用:命令行适合脚本化、批量采集,GUI 适合交互式浏览与对比。

命令行基本操作

最常用的一条命令是直接对可执行文件做剖面采集。默认情况下 ncu 会剖析进程内所有内核,通常我们只关心其中某一个,因此用 -k 按内核名过滤,用 -c 限制采集次数:

# 只采集名字匹配 vecAdd 的内核,采集 1 次,输出到报告文件
ncu -k vecAdd -c 1 -o vecadd_report ./my_app

# 采集后直接在终端打印 Speed Of Light 与基础指标
ncu -k vecAdd -c 1 --set basic ./my_app

# 查看某个内核可用的全部指标
ncu --query-metrics-mode suffix --metrics sm__throughput.avg.pct_of_peak_sustained_elapsed ./my_app

其中 --set 用于选择指标集合,常用的有 basic、full、roofline。basic 覆盖 Speed Of Light 与占用率等核心指标,适合快速定位;full 采集全部可用指标,耗时长、报告大,适合深入分析。采集完成后可用 ncu --import vecadd_report.ncu-rep --page details 在命令行回放报告,或在 GUI 中打开 .ncu-rep 文件。

GUI 基本操作

GUI 的典型流程是:新建工程 → 指定可执行文件与工作目录 → 设置内核过滤与采集集 → 启动采集 → 在报告页中逐面板查看。报告页左侧是内核列表,右侧从上到下依次是 Speed Of Light、Memory Workload Analysis、Compute Workload Analysis、Occupancy、Scheduler Statistics 等面板。点击任一指标旁的“i”图标可查看该指标的定义与计算方式,这对理解数值来源非常关键。

对单个内核进行剖面采集

下面以一个向量加法内核为例,说明一次完整采集的观察过程。示例内核每个线程处理一个元素,网格与线程块配置为 256 线程/块、共 4096 个块,处理 1M 个 float 元素。假设在示例环境(某款数据中心 GPU)上采集,得到如下 Speed Of Light 结果:

Section: GPU Speed Of Light Throughput
  Memory Throughput     [%]   78.4
  Compute (SM) Throughput[%]  21.7
  DRAM Throughput       [%]   76.9
  Duration              [us]  42.6

这组数据说明:内存吞吐已接近峰值(78.4%),而计算吞吐只有 21.7%,内核明显受限于访存而非计算。进一步查看 Memory Workload Analysis,若 L1/TEX 命中率低、DRAM 读写量大,则说明数据复用不足,可考虑合并访存、使用共享内存或向量化加载。反之,若 Compute Throughput 高而 Memory 低,则应检查指令混合、分支发散与寄存器压力。

单内核剖面采集与 Speed Of Light 判读 采集流程 1. 确认 ncu 与计数器权限 ncu --version / query-metrics 2. 按内核名过滤 ncu -k vecAdd -c 1 3. 选择指标集 --set basic / full / roofline 4. 输出报告 -o report.ncu-rep 5. GUI 打开报告 逐面板查看与对比 关键:先看 Speed Of Light 再决定深入哪个面板 Speed Of Light 面板(示例数据) Memory Throughput 78.4% Compute (SM) Throughput 21.7% DRAM Throughput 76.9% 判读:Memory 78.4% ≫ Compute 21.7% → 内核受限于访存,而非计算 → 下一步查看 Memory Workload Analysis Memory Workload Analysis Compute Workload Analysis Occupancy Scheduler Statistics

理解 Speed Of Light 与基础指标

Speed Of Light(SOL)是 Nsight Compute 的核心判读入口,它把内核的实测吞吐与硬件理论峰值做比值,用百分比表示“离光速还有多远”。面板主要给出四个数:Memory Throughput、Compute (SM) Throughput、DRAM Throughput 和 Duration。前两者分别代表内存子系统与 SM 计算流水线的利用率,DRAM Throughput 单独反映显存带宽占用。判读原则是:谁高谁就是瓶颈方向。当 Memory 明显高于 Compute,说明内核在等数据;当 Compute 明显高于 Memory,说明计算单元是限制因素;两者都低则可能是延迟受限或占用率不足。

基础指标面板还包括 Occupancy 与 Scheduler Statistics。Occupancy 反映每个 SM 上活跃 warp 数与硬件上限的比值,过低会导致延迟无法被隐藏;Scheduler Statistics 中的 Issue Slot Utilization 表示调度器发射指令的忙碌程度,若该值低而 Occupancy 也低,通常说明并行度不足。把这些指标与 SOL 结合,就能形成一条从“哪里慢”到“为什么慢”的判读链路。

采集时建议先用 --set basic 快速定位瓶颈方向,确认方向后再用 --set full 或指定指标做深入采集,避免一次性采集全部指标导致耗时过长、报告难以阅读。
性能计数器采集会引入额外开销,内核执行时间可能比正常运行时更长,因此 Duration 只用于横向对比同一采集条件下的不同内核,不要直接当作生产环境下的真实耗时。