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

Cuda 为什么每个线程在warp中都有自己的指令地址计数器?,cuda,Cuda,CUDA中的经纱始终包含32条线,当经纱在SM中运行时。前面的问题还说每个线程都有自己的指令计数器,如下所述 那么为什么每个线程都需要自己的指令地址计数器呢?如果所有32个线程都执行同一条指令,那么1 warp中的线程是否可以共享一个指令地址计数器呢 每个线程都有自己的指令地址计数器和寄存器状态,并对自己的数据执行当前指令 我无法直接回应引用的文本,因为我没有它的出处,也不知道作者的意图 但是,每个线程的独立程序计数器被认为是Volta的一个新功能,请参见图21和中的标题: Volta维护每个线

CUDA中的经纱始终包含32条线,当经纱在SM中运行时。前面的问题还说每个线程都有自己的指令计数器,如下所述

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

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


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

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

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

同一份白皮书的作用可能与您将发现的Volta为什么需要这一功能一样好,并且它可能会推广到图灵等较新的体系结构:

Volta的独立线程调度允许GPU产生任何线程的执行,或者 更好地利用执行资源或允许一个线程等待 另一个为了最大限度地提高并行效率,Volta包括一个调度优化器,它决定 如何将来自同一扭曲的活动线程组合到SIMT单元中。这就保留了高风险 SIMT执行的吞吐量与以前的NVIDIA GPU相同,但具有更大的灵活性:线程 现在可以在子扭曲粒度上发散和重新聚合,而收敛优化器在 Volta仍然会将执行相同代码的线程分组并并行运行 为了获得最大的效率


因此,Volta-warp可以有任意数量的线程子组(最多可达warp大小32),它们可以位于指令流中的不同位置。沃尔特的设计师们认为,支持这种灵活性的最佳方式是(除其他外)为warp中的每个线程提供一台单独的PC

每个线程一个独立的程序计数器被认为是Volta的一个新特性,请参见图21和中的标题:“Volta维护每个线程的调度资源,如程序计数器(PC)和调用堆栈,而早期的体系结构则维护这些资源的每个扭曲。”同一份白皮书可能与您将发现的Volta为什么需要这一功能一样出色,并且可能会将其推广到图灵等较新的体系结构。我很好奇这里的堆栈是什么意思。对于一阶近似值,它的含义与所描述的相同。对不起。我知道堆栈是什么,我的意思是,Volta是否在寄存器文件中为warp中的每个线程分配堆栈(或堆栈信息),而Volta之前的这些信息对warp是全局的?如果是这样的话,大概编译器在使用该功能时会非常保守……我无法解释编译器的行为。如果你愿意,你可以自己检查。寄存器由编译器分配。另外,给定线程的堆栈存在于逻辑本地空间中。寄存器是该空间可能的物理备份之一,但不是唯一可能的物理备份。堆栈几乎肯定不是一个寄存器支持的实体,因为根据我对已编译代码的反汇编和查看,堆栈通常通过寄存器间接索引进行访问,而寄存器不能通过索引进行访问。普通的记忆可以。我明白了,谢谢。这对于支持这类东西非常有用,因为它使移植代码更加容易。像往常一样,通过将代码调整到体系结构,或者在本例中调整到范例,可以获得更多。我希望在CUDA中使用真正的非内联函数调用的情况很少是合理的,即使这样做是可能的