NSight Compute未显示已达到占用率指标,求手动计算该值的所需参数
嘿,我来帮你理清楚手动计算**已达到占用率(Achieved Occupancy)**需要的所有参数,顺便解决你找不到ncu指标的小问题~
手动计算已达到占用率的核心逻辑与所需参数
已达到占用率本质是衡量内核运行时,SM(流式多处理器)实际被利用的程度,核心公式是:
已达到占用率 = (平均每个SM活跃的Warp数) / (每个SM支持的最大Warp数)
要算出这个值,你需要两类参数:静态固定参数和动态运行时数据。
一、静态参数(从设备/内核编译信息获取)
这些参数是固定不变的,你已经提供了大部分,整理后直接用就行:
- 每个SM支持的最大线程数:
1024(你的GTX 1650设备信息里明确标注) - Warp大小:
32(CUDA标准Warp尺寸,你的设备信息也有)
→ 由此可算出每个SM支持的最大Warp数:1024 ÷ 32 = 32
另外还需要内核编译时的资源消耗数据(你给出的ptxas信息里已有部分):
- 每个线程使用的寄存器数:
18(ptxas输出明确标注) - 每个线程块的线程数:需要你确认内核启动时的
blockDim设置(比如你用dim3(256,1,1)的话,就是256) - 每个线程块使用的共享内存:如果你的内核没用到动态共享内存,默认是
0(你提供的信息里没提共享内存使用,按0处理即可)
二、动态运行时性能数据(需从ncu采集)
这部分就是你之前找不到的指标,之所以提示找不到,大概率是因为你没指定正确的指标名称或者没开启对应采样。手动计算必须拿到这两个核心指标:
sm__active_warps.sum:内核执行期间,所有SM上活跃Warp的总数sm__cycles_elapsed.sum:内核执行期间,所有SM运行的总周期数
用这两个值算出平均每个SM活跃的Warp数:
平均活跃Warp数 = sm__active_warps.sum ÷ sm__cycles_elapsed.sum
最后把这个平均值除以每个SM的最大Warp数(32),得到的就是已达到占用率。比如你ncu显示的93.04%,对应的平均活跃Warp数就是 32 × 0.9304 ≈29.77,也就是每个SM平均有30个Warp在运行。
小提示:让ncu直接输出已达到占用率
其实不用手动算,你可以直接让ncu采集占用率相关的指标组,命令如下:
ncu --section Occupancy ./你的内核可执行文件
或者指定具体指标:
ncu --metrics sm__active_warps.sum,sm__cycles_elapsed.sum ./你的内核可执行文件
这样就能直接拿到你要的93.04%的数值啦~
内容的提问来源于stack exchange,提问作者BoringSession
相关产品推荐
相关产品推荐

