我正在研究CUDA编程结构,学习后的感受是:创建块和线程后,每个块都会分配给每个流式多处理器(例如,我使用的是 GForce 560Ti,它有 14 个流式多处理器,因此一次可以将 14 个块分配给所有流式多处理器)。但当我浏览一些在线材料时,例如这个:
http://moss.csc.ncsu.edu/~mueller/cluster/nvidia/GPU+CUDA.pdf
其中提到多个块可以在一个多处理器上同时运行。我基本上对流式多处理器上的线程和块的执行感到非常困惑。我知道块的分配和线程的执行绝对是任意的,但我想知道块和线程的映射实际上是如何发生的,以便可以发生并发执行。
流式多处理器 (SM) 可以使用以下方式一次执行多个块硬件多线程,一个类似于超线程.
The CUDA C 编程指南第 4.2 节对此进行了如下描述:
4.2 硬件多线程
每个 warp 的执行上下文(程序计数器、寄存器等)
由多处理器处理的数据在整个过程中都保持在片上
扭曲的寿命。因此,从一个执行上下文切换
到另一个没有成本,并且在每次指令发出时,都会发生扭曲
调度程序选择一个线程束,该线程束已准备好执行下一个线程
指令(经线的活动线程)并发出
给这些线程的指令。
特别是,每个多处理器都有一组 32 位寄存器,
在 warp 之间进行分区,并行数据缓存或共享
在线程块之间划分的内存。
可以驻留和处理的块和扭曲的数量
给定内核的多处理器上的一起取决于
内核使用的寄存器和共享内存的数量以及
多处理器上可用的寄存器和共享内存的数量。
还有最大居民块数和最大
每个多处理器的常驻扭曲数。这些限制以及
多处理器上可用的寄存器和共享内存的数量
是设备计算能力的函数,并给出
在附录 F 中。如果没有足够的寄存器或共享内存
每个多处理器可用于处理至少一个块,内核
将无法启动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)