Cuda 并发块如何运行单个GPU流式多处理器?

Cuda 并发块如何运行单个GPU流式多处理器?,cuda,Cuda,我在学习CUDA的编程结构,学习后的感觉是:;创建块和线程后,每个块都被分配给每个流式多处理器(例如,我正在使用GForce 560Ti,它有14个流式多处理器,因此一次可以将14个块分配给所有流式多处理器)。但当我浏览一些在线资料时,比如这篇: 其中已经提到,多个块可以在一个多处理器上并发运行。我基本上对流式多处理器上线程和块的执行非常困惑。我知道块的分配和线程的执行是绝对任意的,但是我想知道块和线程的映射是如何实际发生的,以便并发执行能够发生 流式多处理器(SM)可以使用硬件多线程一次执行

我在学习CUDA的编程结构,学习后的感觉是:;创建块和线程后,每个块都被分配给每个流式多处理器(例如,我正在使用GForce 560Ti,它有14个流式多处理器,因此一次可以将14个块分配给所有流式多处理器)。但当我浏览一些在线资料时,比如这篇:


其中已经提到,多个块可以在一个多处理器上并发运行。我基本上对流式多处理器上线程和块的执行非常困惑。我知道块的分配和线程的执行是绝对任意的,但是我想知道块和线程的映射是如何实际发生的,以便并发执行能够发生

流式多处理器(SM)可以使用硬件多线程一次执行多个块,这一过程类似于

第4.2节对此进行了如下描述:

4.2硬件多线程

每个扭曲的执行上下文(程序计数器、寄存器等) 在整个过程中,由多处理器处理的数据保持在芯片上 经纱的寿命。因此,从一个执行上下文切换 到另一个没有成本,并且在每次指令发出时,都有一个偏差 调度程序选择一个线程已准备好执行下一个线程的扭曲 指令(warp的活动线程)并发出 这些线程的指令

特别是,每个多处理器都有一组32位寄存器 在warp之间进行分区,并使用并行数据缓存或共享 在线程块之间分区的内存

可以驻留和处理的块和扭曲的数量 一个给定内核在多处理器上的组合取决于 内核和 多处理器上可用的寄存器和共享内存量。 还有一个最大数量的居民区和一个最大 每个多处理器的驻留扭曲数。这些限制以及 多处理器上可用的寄存器和共享内存量 是设备计算能力的函数,并给出 如果没有足够的寄存器或共享内存 每个多处理器可处理至少一个块,即内核 将无法发射


我在回答OP的时候也读过这一部分,但我觉得它没有说服力。特别是,如果有8个块,每个块有4个线程,会发生什么。它们能否形成一个扭曲,从而并行执行?每个块将有一个扭曲。每个扭曲将有4个活动线程和28个禁用线程。