两个块可以在同一个warp中执行吗?

Posted

技术标签:

【中文标题】两个块可以在同一个warp中执行吗?【英文标题】:Can two blocks be executed in the same warp? 【发布时间】:2013-05-16 06:21:19 【问题描述】:

来自 CUDA C 编程指南:

一个线程块的线程同时在一个线程上执行 多处理器,多个线程块可以同时执行 一个多处理器。当线程块终止时,新的块 在腾出的多处理器上启动。

现在,假设我有许多(例如 1000 个)块,每个块包含几个线程(例如 4 个),并且每个线程使用很少的寄存器,以便多个线程可以一起运行。

我想知道,如果,例如32 个线程,8 个块实际上会一起运行来填充 warp,或者如果这不会发生。

阅读上述引文后,我的猜测是,如果要执行的指令对于 warp 中的所有线程都相同,则可能会发生这种情况,而不管线程所在的块(在此情况下,来自 8 个块的 32 个线程恰好具有相同的程序计数器)。

但也许我完全错了。所以我想更好地理解如果块大小小于扭曲大小会发生什么。

【问题讨论】:

【参考方案1】:

这不会发生。经线中的线程总是来自同一个块。

来自编程指南,关于threads into warps的汇编:

一个块被分割成warp的方式总是一样的;每个 warp 包含连续的线程,增加线程 ID,第一个 warp 包含线程 0。线程层次结构描述了线程 ID 如何与块中的线程索引相关。

【讨论】:

【参考方案2】:

每个 warp 都专属于某个线程块,因此,在您的示例中,如果您有一个具有 8 个线程的线程块,则将分配整个 warp(32 个线程)的资源并执行整个 warp;唯一的区别是只允许前 8 个线程进行写入,其余线程将被屏蔽。 无法在多个线程块之间共享扭曲。

【讨论】:

你有这方面的参考吗? @AkiRoss 并没有在我脑海中浮现。 CUDA 工具包中包含的占用计算器是一个很好的起点。您可以尝试使用“每个块的线程数”值,您会发现从 1 到 32 没有任何变化……在 gpu 上分配资源时有一定的粒度。您可以在占用计算器的“GPU 数据”表中找到更多详细信息。 @AkiRoss 术语“线程”也不是一个特别好的名称。实际上,SM 使用经纱而不是“线程”。 Warp 基本上以 SIMD 方式执行,宽度为 32(加上一些额外的发散处理)。 “线程”只是描述 SIMD 中这 32 个部分之一的名称。 是的,我知道在内核、SIMD 和 SIMT 架构上执行 warp,但我不确定这种可能性。感谢您的建议。

以上是关于两个块可以在同一个warp中执行吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果知道warp中所有线程的条件相同,如何避免在CUDA程序中执行条件的两个分支?

为啥要费心去了解 CUDA Warps?

如何使翘曲导致另一个翘曲处于空闲状态?

用于重叠数据的内核设计,启动单独的 warp

CUDA中的warp和bank的机制是啥?

cuda基础---cuda通信机制