Cuda 可以在同一个扭曲中执行两个块吗?

Cuda 可以在同一个扭曲中执行两个块吗?,cuda,Cuda,从CUDA C编程指南: 线程块的线程在一个线程上并发执行 多处理器和多个线程块可以在上并发执行 一个多处理器。当线程块终止时,新的块将被删除 在空出的多处理器上启动 现在,假设我有许多(例如1000)块,每个块由几个线程组成(例如4个),每个线程使用很少的寄存器,这样多个线程就可以一起运行 我想了解,如果给定一个扭曲(例如32条线),8个块是否会一起运行以填充扭曲,或者这不会发生 在阅读了上面的引文之后,我猜测如果要对warp中的所有线程执行相同的指令,而不考虑线程所在的块(在本例中,8个块中

从CUDA C编程指南:

线程块的线程在一个线程上并发执行 多处理器和多个线程块可以在上并发执行 一个多处理器。当线程块终止时,新的块将被删除 在空出的多处理器上启动

现在,假设我有许多(例如1000)块,每个块由几个线程组成(例如4个),每个线程使用很少的寄存器,这样多个线程就可以一起运行

我想了解,如果给定一个扭曲(例如32条线),8个块是否会一起运行以填充扭曲,或者这不会发生

在阅读了上面的引文之后,我猜测如果要对warp中的所有线程执行相同的指令,而不考虑线程所在的块(在本例中,8个块中的32个线程恰好具有相同的程序计数器),则可能会发生这种情况


但也许我完全错了。因此,我想更好地理解如果块大小小于warp大小会发生什么。

每个warp都是某个threadblock独有的,因此,在您的示例中,如果您有一个具有8个线程的threadblock,那么将为整个warp(32个线程)分配资源,并执行整个warp;唯一的区别是,只允许前8个线程进行写操作,其余线程将被屏蔽。
不可能在多个线程块之间共享一个扭曲。

每个扭曲都是某个线程块所独有的,因此,在您的示例中,如果您有一个具有8个线程的线程块,则将为整个扭曲(32个线程)分配资源,并执行整个扭曲;唯一的区别是,只允许前8个线程进行写操作,其余线程将被屏蔽。
不可能在多个螺纹块之间共享扭曲。

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

从编程指南中,关于以下部件的组装:

块划分为扭曲的方式始终相同;每个扭曲包含连续的、递增的线程ID,第一个扭曲包含线程0。线程层次结构描述线程ID与块中线程索引的关系


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

从编程指南中,关于以下部件的组装:

块划分为扭曲的方式始终相同;每个扭曲包含连续的、递增的线程ID,第一个扭曲包含线程0。线程层次结构描述线程ID与块中线程索引的关系


你对此有什么参考资料吗?@AkiRoss不知道。CUDA工具包中包含的ocupancy计算器是一个很好的起点。您可以使用“每个块的线程数”值进行实验,您将看到从1到32没有任何变化。。。在gpu上分配资源时有一定的粒度。您可以在职业计算器的“GPU数据”表中找到更多详细信息。@AkiRoss同时,术语“线程”并不是一个很好的名称。事实上,SM使用扭曲而不是“线”。Warp基本上以SIMD方式执行,宽度为32(加上一些额外的发散处理)。“线程”只是一个用来描述SIMD中32个部件之一的名称。是的,我知道在核心、SIMD和SIMT架构上执行warp,但我不确定这种可能性。谢谢你的建议。你对此有什么参考资料吗?@AkiRoss我不知道。CUDA工具包中包含的ocupancy计算器是一个很好的起点。您可以使用“每个块的线程数”值进行实验,您将看到从1到32没有任何变化。。。在gpu上分配资源时有一定的粒度。您可以在职业计算器的“GPU数据”表中找到更多详细信息。@AkiRoss同时,术语“线程”并不是一个很好的名称。事实上,SM使用扭曲而不是“线”。Warp基本上以SIMD方式执行,宽度为32(加上一些额外的发散处理)。“线程”只是一个用来描述SIMD中32个部件之一的名称。是的,我知道在核心、SIMD和SIMT架构上执行warp,但我不确定这种可能性。谢谢你的建议。