关于warp的一些疑问

问题1:在费米架构中,每个SM中存在两个warp调度器,是不是就是说每次可以发出两束warp指令呢?
问题2: 在费米架构中,一束warp包含32个线程,为什么执行的时候,每次只有16个线程处于活跃状态,而不是32个线程
都处于活跃状态?如果是因为每个SM有两个warp调度器的原因,为什么设计的时候不设计成只有一个呢?

谢谢解答。

这个每次有歧义,因为SM中存在2种时钟频率,基本频率和倍频。这个“每次”给您按照倍频算了。

(1)是的,的确如此。“每两次”,可以为来自2个warp中4条指令进行发射给执行单元的。(手册里有详细说明,这里不赘述了)。也就等效于,“每次”,为来自2个warp的2条指令进行发射。

(2)因为处于某些考虑,每个warp sheduler, 同时为16个线程发射2条指令,是等效于1次为32个线程发射1条指令的。这样实际还是等效于您的“32个线程都处于活动状态(为他们执行指令)的”。

(3)为何如此设计,可能处于众多考虑。例如每次抓取一个warp后,scheduler所需要的各种资源(指令,执行单元的安排等等),设计的复杂度,执行的效率,等因素,可能设计成2个更为容易,更能表达性能。这些可能是设计人员的考虑因素。
举个例子,上文说了,为2个warp在2个周期内执行4条指令。固然等价于为1个warp在2个周期内执行8条指令。但如果设计1个能力加倍的超级warp scheduler, 可能复杂度和成本要远远大于2.所以不如拆分成2个简单些了。
当然这是硬件设计人员考虑的,我们无法知道影响他们思考的实际因素。这只是猜测。

感谢版主的回答,这里还有一个小的问题,就是为16个线程发射2条指令,那么这16个线程是如何执行这两条指令的呢?是同时执行,还是轮流执行?另外看到有Dual Issue的文章说道,执行一条指令至少需要四个时钟周期,但是每两个时钟周期就可以发送一条指令,可能是我理解有误,但是如果是这样的话,指令执行速度应当是小于指令获取速度,因此,给16个线程发2条指令执行我就不太能想通。最后还有一个小小的问题,手册是指CUDA编程手册么?谢谢版主。

楼主您好。

实际上,线程是数据和代码流的载体,而不是一个执行者。具体的执行,是执行单元执行来自线程中的指令(以及执行过程还会使用来自线程中的数据, 例如线程私有的寄存器等)。

issue速率和指令的执行需要多少个cycles是无关的。这要归功于现在的流水线设计。假设某工厂,从生产的流水线一头,每分钟都会流入元件,开始制造的;但可能此流水线很长,需要10个步骤才能完成,10分钟后产品才能出来。但这并不妨碍每分钟都制造一个元件的。

而上文的warp/half-warp和这个类似,每个周期都开始执行某指令,不代表某指令必须立刻完成,他完全可以几个周期,甚至几十个周期才能完成。

关于您询问的手册,一般可以参考《CUDA Programming Guide》,《CUDA Toolkit Reference Manual》,《CUDA Best practices guide》等。这些书籍跟随NV的toolkit免费发布。也可以参考本坛的yyfn风辰的作品《CUDA编程指南》。这个是中文版的。也许对您方便点。

谢谢版主耐心解答,版主早点休息,注意身体,祝版主身体健康

您客气了。服务您是我的荣幸。

感谢您的深夜来访,祝您工作、生活愉快!