NVIDIA提供了专业的GPU性能分析工具,在性能优化领域常用的是Nsight Systems和Nsight Compute。
性能分析工作流程如图1所示。从Nsight Systems开始,获得应用的系统级概览,通过消除系统级瓶颈,例如不必要的线程同步或数据移动,并提高算法的系统级并行性。完成此操作后,继续使用Nsight Compute优化最重要的CUDA内核。定期返回Nsight Systems以确保始终专注于最大的性能瓶颈,否则瓶颈可能已经转移,此时再对核函数优化可能不会达到预期效果。
nsys profile -y 1 -d 100 app
各参数含义:
在命令中增加--stats=true可以在采集结束之后查看系统概览。
Linux上的采集性能的Nsight版本需要和Windows版本一致。
如下图所示,kernel函数k_eam_fast明显最耗时,所以可以针对性地去分析优化该kernel代码。
更详细的使用指导请参考文档:https://docs.nvidia.com/nsight-systems/index.html
ncu --metrics sm__warps_active.avg.pct_of_peak_sustained_active --kernel-name k_eam_fast app
各参数含义:
GPU微架构相关指标请参考:https://docs.nvidia.com/nsight-compute/NsightComputeCli/index.html#nvprof-metric-comparison
ncu --set full --import-source=yes --launch-skip 1000 --launch-count 1 --kernel-name k_eam_fast --export ncu-log app
执行后生成分析报告。
各参数含义:
指标 |
含义 |
---|---|
GPU Speed Of Light Throughput |
查看GPU计算和存储资源的整体使用情况。 |
Compute Workload Analysis |
查看SM计算资源的使用情况,以及IPC。 |
Memory Workload Analysis |
查看各级存储的使用情况。 |
Scheduler Statistics |
查看warp调度器发射指令的情况。 |
Warp State Statistics |
查看kernel执行期间warp的状态信息。 |
Instruction Statistics |
查看SASS汇编指令组成和执行情况。 |
Launch Statistics |
查看kernel启动的资源配置情况(grid/block/thread/warp/register/shared memory) |
Occupancy |
查看warp占用率。 |
基于此可以定位到具体哪些代码存在问题。
更详细的使用指导请参考文档:https://docs.nvidia.com/nsight-compute/index.html
可以看出计算资源的吞吐较低。
可以看出“Stall Long Scoreboard”是导致warp stall的主要原因。
Stall Long Scoreboard的意思是下一条指令的执行依赖于L1TEX (local, global, surface, tex)数据的到来。
解决思路:可以通过增加数据局部性来提高cache命中,或者将频繁使用的数据移至shared memory中。
关于Warp Scheduler State的描述请参考:https://docs.nvidia.com/nsight-compute/2022.2/ProfilingGuide/index.html#statistical-sampler