我正在研究CUDA编程结构,以及我在学习之后的感受;在创建块和线程之后,将每个块分配给每个流式多处理器(例如,我使用GForce 560Ti,其具有14个流式多处理器,因此一次可以将14个块分配给所有流式多处理器)。但是,当我浏览几个在线资料时,例如:
http://moss.csc.ncsu.edu/~mueller/cluster/nvidia/GPU+CUDA.pdf
其中提到可以在一个多处理器上同时运行多个块。我基本上非常混淆线程和流多处理器上的块的执行。我知道块的分配和线程的执行绝对是任意的,但我想如何实际发生块和线程的映射,以便可以发生并发执行。
答案 0 :(得分:4)
流式多处理器(SM)可以使用硬件多线程一次执行多个块,这个过程类似于Hypter-Threading。
CUDA C Programming Guide在第4.2节中描述如下:
4.2硬件多线程
每个warp的执行上下文(程序计数器,寄存器等) 在整个过程中,由多处理器处理的片段保持在芯片上 经度的一生。因此,从一个执行上下文切换 到另一个没有成本,并在每个指令发布时间,一个扭曲 scheduler选择一个具有准备好执行下一个线程的线程的warp 指令(warp的活动线程)并发出 对那些线程的指示。
特别是,每个多处理器都有一组32位寄存器 在warp和并行数据缓存或共享之间进行分区 在线程块之间分区的内存。
可以驻留和处理的块和warp的数量 在给定内核的多处理器上一起依赖于 内核使用的寄存器和共享内存的数量 多处理器上可用的寄存器和共享内存量。 还有最大数量的常驻块和最大数量 每个多处理器的驻留warp数。这些限制也是如此 多处理器上可用的寄存器和共享内存量 是给定的设备的计算能力的函数 在附录F中。如果没有足够的寄存器或共享内存 每个多处理器可用于处理至少一个块,即内核 将无法启动。