为什么每个线程在warp中都有自己的指令地址计数器?

问题描述 投票:0回答:1

CUDA中的经线始终包含32个线程,而当经线在SM中运行时,all of these 32 threads run the same instruction始终。前一个问题还说每个线程都有其自己的指令计数器,如下所述。

然后为什么如果所有32个线程始终执行同一条指令,每个线程都需要自己的指令地址计数器,那么1个warp中的线程是否可以共享一个指令地址计数器?

每个线程都有自己的指令地址计数器和寄存器状态,并根据自己的数据执行当前指令

cuda
1个回答
3
投票

我无法直接回复引用的文本,因为我没有本书的出处,也不知道作者的意图。

但是,每个线程一个独立的程序计数器在Volta中被视为一项新功能,请参见图21和the volta whitepaper中的标题:

Volta维护每个线程的调度资源,例如程序计数器(PC)和调用堆栈(S),而较早的体系结构则按翘曲维护这些资源。

同一份白皮书可能会做得很好,因为您会发现为什么在Volta中需要这样做,并且大概可以推广到诸如Turing之类的较新架构:

Volta的独立线程调度使GPU可以执行任何线程,更好地利用执行资源或允许一个线程等待数据被生成另一个。为了最大程度地提高并行效率,Volta包含一个调度优化器,它可以如何将来自同一经线的活动线程组合到SIMT单元中。这保留了高与以前的NVIDIA GPU一样,具有SIMT执行的吞吐量,但具有更大的灵活性:线程现在可以以次扭曲粒度发散并重新收敛,而Volta仍会将执行相同代码的线程归为一组并并行运行以获得最大效率

因此,Volta warp可以具有任意数量的线程子组(最大为warp大小为32),这些子组可以位于指令流中的不同位置。 Volta设计人员认为,支持这种灵活性的最佳方法是(例如)在经线中为每个线程提供单独的PC。

© www.soinside.com 2019 - 2024. All rights reserved.