我在学习CUDA编程结构,学习后的感受是;创建块和线程后,这些块中的每一个都分配给每个流式多处理器(例如,我使用 GForce 560Ti,它具有 14 个流式多处理器,因此一次可以将 14 个块分配给所有流式多处理器)。但是当我浏览一些在线材料时,例如这个:
http://moss.csc.ncsu.edu/~mueller/cluster/nvidia/GPU+CUDA.pdf
已经提到可以在一个多处理器上同时运行多个块。我基本上对流式多处理器上的线程和块的执行感到非常困惑。我知道块的分配和线程的执行是绝对任意的,但我想块和线程的映射实际上是如何发生的,以便并发执行可以发生。
流式多处理器 (SM) 可以使用硬件多线程(一种类似于超线程的过程)一次执行多个块。
在CUDA C编程指南介绍了本作中第4.2节如下:
4.2 硬件多线程
多处理器处理的每个扭曲的执行上下文(程序计数器、寄存器等)在扭曲的整个生命周期内都在芯片上维护。因此,从一个执行上下文切换到另一个执行上下文是没有成本的,并且在每次指令发布时,warp 调度程序都会选择一个线程准备好执行其下一条指令(warp 的活动线程)并将指令发布到这些线程.
特别是,每个多处理器都有一组 32 位寄存器,它们在 warp 之间进行分区,以及在线程块之间进行分区的并行数据缓存或共享内存。
对于给定的内核,可以在多处理器上驻留和一起处理的块和扭曲的数量取决于内核使用的寄存器和共享内存的数量以及多处理器上可用的寄存器和共享内存的数量。每个多处理器还有最大驻留块数和最大驻留扭曲数。这些限制以及多处理器上可用的寄存器和共享内存的数量是设备计算能力的函数,在附录 F 中给出。 如果每个多处理器没有足够的寄存器或共享内存来处理至少一个块,内核将无法启动。