Nsight Compute(NCU) Scheduler Statistics 数据解读

本文详细介绍了GPU中的Warp调度过程,以Volta架构为例,每个SM有4个WarpScheduler,每个周期最多可调度16个warps。内容包括Warp状态、调度策略以及性能统计数据如active warps、stalled warps和发射率等。通过案例分析,揭示了提高kernel效率的关键在于增加eligible warps数量和减少stall时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文内容主要参考YT上的这个视频:

https://www.youtube.com/watch?v=nYSdsJE2zMs

Warp硬件架构介绍

以Volta架构为例,每个SM有4个Warp Scheduler,每个Warp Scheduler有4个warp slots,因此Volta架构中整个GPU每个cycle总共最多可以有16个warps同时处于被调度的状态,每个时钟周期最多可以发射4个warps。(而以前的Turing架构只有8个warp slots,可以看出未来GPU中warp slot数量应该是有上升趋势的。)

Warp调度过程介绍

为了画图简单,下面就用8个warp slots做演示,每个时钟周期也按照只能发射一个warp去假设。

首先,下图左侧画的Warp Slots中0-7个方块代表了GPU中的全部8个Warp Slots。其次,右侧的Warp States介绍了NV中对warp的5种分类,其中白色Unused表示还在warp队列中排队的warp,这个状态的warp一般先不用关心;凡是有颜色的warp其实都属于Active Warp,这里的灰色warp是不属于其他3种绿色的Active Warp,指这个warp所在的block已经被调度到指定SM上的warp(这里为了严谨说的有点绕了,简单理解灰色块就是还没准备好被发射的warp);Eligible Warp就是准备好被发射的Warp;Stalled是指因为一些原因(指令还没加载完成、依赖项还没有得到等等)而被中断暂停的warp;Seleted表示被选中发射的warp。

下面就看一下warp调度过程:

假设核函数执行到第N个时钟周期时,有3个Stalled Warp(最下面深绿色的0-2 Slots中的Warp)和2个Eligible Warp以及3个Unused Warp。这时,随机选取一个Eligible Warp(3号warp)放在下面的Issue slot中发射。这个时钟周期就过去了。

 

 到了下一个也就是N+1个时钟周期时,上一步选的3号warp因为取指令需要不止一个时钟周期而被stall变成深绿色。这时所有之前发射的warp都被stall了,warp scheduler不得不再选一个eligible warp来发射,因此选则了唯一的eligible warp也就是4号warp来发射。

再到N+2个时钟周期时,有一个warp执行结束就退出warp slot了,而warp slot中也没有可以发射的eligible warp了,因此这个周期就这样空过去了。

 

再下一个周期即N+3个时钟周期,新增了两个eligible warp,又在eligible warp中随机选择一个(2号)warp发射。

 
Scheduler Statistics 数据解读

cycles_active:一共有多少个包含active warp的cycle。

warps_active:一共有多少个active warp(有颜色的方块有多少个)。

warp_active/cycle_active:warps_active除以cycles_active

achieved_occupancy:warps_active/(warp最大active数量*cycles_active)(warp最大active数量就是上文提到的,Volta的16和Turing的8)

                                achieved_occupancy = 有颜色的方块数量 / 所有的方块数量

warps_stalled:被stall的warp数量。即深绿色方块的数量。

warps_eligible:全部cycle中eligible warp出现的总数。 即浅绿色方块的数量。

 warps_issued:总共发射的warp数量。 

 warps_issued/cycles_active:字面意思

issue_slot_utilization:发射了warp的cycle数量 / cycles_active

上述数据中,所有以warps开头的数据在Nsight Compute中都是要除以cycles_active来显示的。通常后面会加 Per Scheduler表示除以cycles_active。

 这个例子是在V100中运行的,V100最佳情况下Active Warps Per Scheduler可以无限接近16,但该kernel平均分配每个调度器7.65个active warp,但是每个周期只有平均0.92个warp是eligible warp,真正被发射的每个周期才0.41个warp,这是很差的指标了。一般是两种方法改善:一是增加eligible warp的数量,二是减少active warp的stall时间。

 

 

 

 

 

 

### 关于 Nsight Compute 的安装方法 Nsight ComputeNVIDIA 提供的一款强大的工具,用于分析和调试 CUDA 应用程序的性能。以下是有关其安装的相关说明: #### 系统需求 在安装之前,请确认您的系统满足以下条件: - 支持的操作系统:Windows 或 Linux。 - 已安装兼容版本的 NVIDIA 驱动程序(通常需要较新的驱动版本)。具体支持的驱动版本可以在官方文档中找到[^5]。 #### 下载与安装过程 1. **访问官网** 前往 NVIDIA 官方网站的 Nsight Compute 页面下载最新版本的安装包[^6]。地址如下:`https://developer.nvidia.com/nsight-compute` 2. **选择适合的平台** 根据操作系统选择对应的安装文件。对于 Windows 用户,可以选择 `.exe` 可执行文件;而对于 Linux 用户,则提供 `.run` 脚本形式的安装包。 3. **运行安装向导** - 在 Windows 上双击 `.exe` 文件启动安装向导。 - 对于 Linux 平台,在终端中赋予脚本可执行权限并通过命令行运行它: ```bash chmod +x nsight_compute_*.run ./nsight_compute_*.run ``` 4. **完成配置** 按照提示逐步操作即可顺利完成部署。如果遇到依赖项缺失的情况,需手动解决这些前置条件后再继续尝试安装。 #### 后续验证步骤 为了确保成功设置好环境,可以通过简单的测试来检验功能是否正常运作。打开命令行界面输入 `ncu --version` 来查看已安裝好的NVIDIA Nsight Compute 版本号信息[^7]。 ```python import subprocess result = subprocess.run(['ncu', '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) print(result.stdout.decode()) if result.returncode != 0: print("Error:", result.stderr.decode()) ``` 上述 Python 小片段可用于自动化检测是否存在可用的 NCU 实例以及获取相应详情。 --- ### 注意事项 尽管本文提供了基础指导方针,实际应用过程中可能还会面临更多复杂情形。比如特定硬件架构下的额外调整或者与其他软件框架集成时产生的冲突等问题都需要单独处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值