Nsight Compute是定位CUDA核函数瓶颈的首选工具,可精确到指令级,通过ncu命令采集指标(如Occupancy、Memory Throughput),结合cuda-memcheck排查非法内存访问,并需确认kernel实际执行与上下文初始化。

用Nsight Compute分析CUDA核函数性能
Nsight Compute是定位单个kernel瓶颈的首选工具,能精确到指令级。启动时直接运行red”>ncu命令,例如:
- ncu –set full ./my_cuda_app:采集完整指标集(含寄存器使用、L1/LL缓存命中、warp指令吞吐等)
- ncu -k my_kernel_name ./my_cuda_app:只分析指定kernel,避免冗余数据
- 加–metrics sm__inst_executed,sm__sass_thread_inst_executed_op_dfma_pred_on可自定义关注指标
重点关注Achieved Occupancy(实际占用率)和Memory Throughput(内存带宽利用率)。若Occupancy远低于理论值(如
用Nsight Systems做全栈时序分析
Nsight Systems适合看CPU-GPU协同问题,比如主机端同步开销、kernel启动间隔、内存拷贝重叠情况。运行方式简单:
- nsys profile -t cuda,nvtx,osrt ./my_cuda_app:同时采集CUDA调用、用户标记(NVTX)、系统调用
- 生成report.nsys-rep,用GUI打开后拖动时间轴,查看GPU timeline与CPU timeline对齐关系
- 右键kernel → “Properties” 查看launch参数(grid/block大小、动态共享内存用量)
常见线索:GPU空闲间隙长 → CPU端准备数据慢;memcpy H2D/D2H频繁且小块 → 应合并传输或改用pinned memory;多个kernel串行执行却无依赖 → 可考虑流(stream)并行化。
在代码中嵌入NVTX标记提升可读性
纯靠自动采集有时难以区分逻辑段,用NVTX打点能让Nsight Systems报告一目了然:
- #include
,编译时链接-lnvToolsExt - 在关键段前后加:nvtxRangePushA(“data_preprocess”); … nvtxRangePop();
- 支持颜色和层级:nvtxRangeStartEx(&range);配合nvtxRangeEnd()做嵌套标记
标记后,在Nsight Systems中会显示彩色横条,鼠标悬停即见耗时和调用栈,调试多阶段pipeline(如预处理→推理→后处理)特别有用。
调试常见卡顿与错误提示
Nsight报错不总指向代码行,需结合上下文判断:
- “CUDA error: invalid configuration argument” → 检查grid/block尺寸是否越界(如block.x > 1024),或>>中传入负数
- “Page fault on GPU” / “unspecified launch failure” → 大概率是kernel内非法内存访问(越界、空指针、未初始化device ptr),用cuda-memcheck复现
- Nsight Compute显示“No kernels launched” → 确认程序确实执行了>>调用,且没被条件跳过;检查CUDA上下文是否正确初始化(cudaSetDevice()是否遗漏)
基本上就这些。Nsight不是黑盒,关键是把采集结果和代码结构对应起来——看到低带宽就查访存模式,看到高延迟就看同步点,工具只是把隐含行为显性化。