cuda - CUDA 中的 Warp 和 block 调度——到底发生了什么,以及关于合格 warp 的问题
问题描述
我了解在 CUDA 中如何安排 warp 和块 - 但不了解这两种调度安排是如何结合在一起的。我知道一旦 SM 中有足够的执行资源来支持新块,就会执行一个新块,并且我知道每个时钟周期都会选择执行合格的扭曲(如果备用执行资源允许的话)。然而,究竟是什么让经线“符合条件”?如果有足够的执行资源来支持一个新的warp——而不是一个新的块呢?块调度是否包括warp调度?帮助将不胜感激,谢谢!
解决方案
块调度是否包括warp调度?
块调度器和 warp 调度器应该被认为是 2 个独立的实体。事实上,我会将块调度程序视为设备范围的实体,而 warp 调度程序是每个 SM 实体。
您可以想象每次内核启动都可能有一个块“队列”。当 SM 上的资源变得可用时,块调度程序会将“队列”中的块存入该 SM。
根据该描述,块调度不包括扭曲调度。
然而,究竟是什么让经线“符合条件”?
我们现在正在考虑一个已经存放在 SM 上的区块。当一个 warp 有一个或多个准备好执行的指令时,它是“合格的”。“合格”的反义词是“停滞不前”。当没有准备好执行的指令时,warp 被“停止”。GPU分析器文档描述了各种可能的“停顿原因”(*),但典型的原因是依赖项:依赖于前一条指令(或操作,例如内存读取)的结果的指令在前一条指令/操作的结果准备好之前不符合发出条件。另请注意,GPU 目前不是乱序机器。如果当前要执行的下一条指令被停止,GPU 不会(很远)搜索后续指令流以寻找可能的独立可执行指令。
如果有足够的执行资源来支持一个新的warp——而不是一个新的块呢?
这并没有提供任何有用的东西。为了调度一个新块(即让块调度器在 SM 上存入一个新块),必须有足够的资源可供整个块使用。(块调度器不会逐个地存放块。这是一个全有或全无的命题,在逐个块的基础上。)
(*) 有一个称为“未选择”的“停顿原因”,实际上并不表示经纱已停顿。这意味着 warp 实际上是合格的,但它没有被选择用于该周期的指令调度,通常是因为 warp 调度程序选择了来自其他 warp 的指令,以在该周期中发出。
推荐阅读
- c++ - 从基本字符串到 int 类型的无效转换
- java - 如何在控制台中停止 mybatis 打印 SQL 脚本
- javascript - 带有jquery数据表的复选框单击事件不起作用
- c - gcc 强制不使用 DSP
- c++ - 在 C++ 中创建和释放临时虚拟变量
- css - 如何不对第一次无效的输入元素应用样式
- amazon-dynamodb - 在本地更改 DynamoDB 的端口号
- android - 即使应用程序关闭或杀死,我们如何在android N或更高版本中每2分钟调用一次api
- c# - 具有长(100 多个字符)键名的哈希表
- python - 无法在python中迭代mongo对象