【问题标题】:How to a warp cause another warp be in the Idle state?一个经线如何导致另一个经线处于空闲状态?
【发布时间】:2018-08-06 21:18:41
【问题描述】:

正如您在问题标题中看到的那样,我想知道一个经线如何导致另一个经线进入 空闲 状态。我在 SO 中阅读了很多 Q/A,但找不到答案。在任何时候,一个块中只能运行一个经线?如果是这样,warp 的空闲状态就没有任何意义,但是如果我们可以同时运行多个 warp,每个 warp 就可以分别对其他 warp 做它们的工作。

论文说:不规则的工作项导致整个warp处于空闲状态(例如,下图中的warp0 w.r.t. warp1)。

【问题讨论】:

  • @RobertCrovella 我读了太多,但我不明白。您能否评论其中与我的问题相关的一个?我用纸读。 span>
  • @RobertCrovella 我编辑了我的问题并添加了我阅读的论文的一些部分。

标签: cuda gpu block warp-scheduler


【解决方案1】:

Nsight VSE 分析器对扭曲状态使用的术语在http://docs.nvidia.com/gameworks/index.html#developertools/desktop/nsight/analysis/report/cudaexperiments/kernellevel/issueefficiency.htm 中定义。这些术语也用于许多关于性能分析的 GTC 演示文稿中。

当线程块的所有资源都可用时,计算工作分配器 (CWD) 将在 SM 上启动线程块。资源包括:

  • 线程阻塞槽
  • warp 槽(方块足够)
  • 为每个 warp 注册
  • 块的共享内存
  • 块的障碍

当一个 SM 有足够的资源时,线程块在 SM 上启动。线程块被光栅化为扭曲。 Warp 被分配给 warp 调度器。资源被分配给每个warp。此时,warp 处于活动状态,这意味着 warp 可以执行指令。

在每个周期,每个 warp 调度程序从符合条件的 warp 列表中进行选择(活动的,未停止的)并为该 warp 发出 1-2 条指令。由于多种原因,warp 可能会停止。请参阅上面的文档。

Kepler - Volta GPU(GP100 除外)的每个流式多处理器 (SM) 有 4 个 warps 调度程序(子分区)。线程块的所有经线必须在同一个 SM 上。因此,在每个给定的循环中,一个线程块可以为线程块中最多 4 个(子分区)warp 发出指令。

每个 warp 调度程序可以在每个周期中选择任何符合条件的 warp。 SM 是流水线的,因此最大大小的线程块(1024 个线程 == 32 个线程)的所有线程都可以在每个周期都有指令。

我可以在没有其他上下文的情况下确定的唯一空闲定义是: - 如果一个 warp 调度程序有 2 个符合条件的 warp 并且选择了 1 个,则另一个被停止在称为未选择的状态。 - 如果线程块中的扭曲执行屏障(__syncthreads),那么扭曲将在屏障上停止(不合格),直到满足屏障的要求。经线停在屏障上。

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 2014-01-23
    • 2016-07-20
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2022-01-10
    • 2021-10-15
    • 2021-07-27
    相关资源
    最近更新 更多