You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:19:06