CUDA 中的 Warp总是包含 32 个线程,并且当 warp 在 SM 中运行时,所有这 32 个线程都运行相同的指令。上一个问题还说每个线程都有自己的指令计数器,如下所述。
那么如果所有32个线程总是执行相同的指令,为什么每个线程都需要自己的指令地址计数器,1个warp内的线程可以共享一个指令地址计数器吗?
每个线程都有自己的指令地址计数器和寄存器状态,对自己的数据执行当前指令
我无法直接回复引用的文本,因为我没有它来自的书,也不知道作者的意图。
但是,每个线程的独立程序计数器被认为是 Volta 中的一项新功能,请参见图 21 和volta 白皮书中的标题:
Volta 维护每个线程的调度资源,例如程序计数器 (PC) 和调用堆栈 (S),而早期的体系结构每个 warp 维护这些资源。
同一份白皮书可能与您在 Volta 中需要这样做的原因一样好,并且大概它可以用于更新的架构,例如图灵:
Volta 的独立线程调度允许 GPU 放弃执行任何线程,以便更好地利用执行资源或允许一个线程等待另一个线程产生数据。为了最大限度地提高并行效率,Volta 包含一个调度优化器,它确定如何将来自同一束的活动线程分组到 SIMT 单元中。这保留了之前 NVIDIA GPU 中 SIMT 执行的高吞吐量,但具有更大的灵活性:线程现在可以在 sub-warp 粒度上发散和重新收敛,而 Volta 中的收敛优化器仍然会将执行相同代码和并行运行它们以获得最大效率
因此,一个 Volta 扭曲可以有任意数量的线程子组(最大为扭曲大小,32),它们可以位于指令流中的不同位置。Volta 的设计者决定支持这种灵活性的最佳方式是(除其他外)为经线中的每个线程提供一个单独的 PC。