4

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

http://moss.csc.ncsu.edu/~mueller/cluster/nvidia/GPU+CUDA.pdf

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

4

1 回答 1

6

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

CUDA C 编程指南在第4.2 节中对此进行了如下描述:

4.2 硬件多线程

由多处理器处理的每个 warp 的执行上下文(程序计数器、寄存器等)在 warp 的整个生命周期内都在芯片上维护。因此,从一个执行上下文切换到另一个执行上下文是没有成本的,并且在每个指令发出时间,warp 调度程序都会选择一个线程准备好执行其下一条指令(warp 的活动线程)并将指令发布给这些线程.

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

对于给定内核,可以在多处理器上一起驻留和处理的块和扭曲的数量取决于内核使用的寄存器和共享内存的数量以及多处理器上可用的寄存器和共享内存的数量。每个多处理器也有最大数量的驻留块和驻留扭曲的最大数量。这些限制以及多处理器上可用的寄存器和共享内存的数量是设备计算能力的函数,并在附录 F 中给出。如果每个多处理器没有足够的寄存器或共享内存来处理至少一个块,内核将无法启动。

于 2012-08-31T10:03:10.930 回答