GTX580warp调度的疑惑

求教各位,GTX580是如何通过每个SMX中仅有的4个warp scheduilar,8个dispatch来成功调度192个核心的呢,这与ILP是不是有一些关系呢?谢谢各位

LZ您好,您的问题中有一个自相矛盾的地方,GTX 580是fermi核心SM2.0的,但是您后面询问的SMX则是kepler核心SM3.X的。下面一律按照最新的kepler核心的SMX的情况回答。

CUDA C Programming Guide Appendix F里面F.5讲述了计算能力3.x的一些情况,现引用一段相关内容如下:
“When a multiprocessor is given warps to execute, it first distributes them among the four
schedulers. Then, at every instruction issue time, each scheduler issues two independent
instructions for one of its assigned warps that is ready to execute, if any.”

文中可以看出,当每次可以发射指令的时候,每个scheduler可以发射当前抓取的warp的准备就绪可以执行的2个指令。以及我们知道,每个周期都可以发射指令。
如此,4个scheduler每周期可以发射4322=256条指令(按线程计算;如果按warp计算,则是4*2=8条指令,每条指令都会并行执行一个warp的线程数量次。)如果都是SP上跑的计算指令的话,可以发射给256个SP(CUDA CORE),这已经超过了一个SMX所拥有的SP数量——192。因此,单纯考虑SP数量的话,发射能力是超出的。

同时需要说明,有些指令是发射到SMX内部的访存单元和SFU上面的,算上所有的计算(SFU和SP)和访存单元,发射和执行能力还是比较均衡的。

以及这个和ILP的关系。
我觉得双发射(就是上面的一个scheduler一个周期可以对一个warp发射两条独立的指令)应该算得上是一种ILP。
但是ILP这个经常指代另外一种优化操作,即人工将长延迟的访存提到靠前的地方,然后在访存后插入多条无关的计算,使得访存的指令可以和后面的其他计算指令相并行,用后面的计算部分掩盖访存的时间,从而便于调度的时候掩盖访存时间。这样做可能会增加kernel寄存器的使用量。

您的问题大致答复如上,供您参考。

欢迎您莅临CUDA ZONE,祝您编码顺利~

首先感谢版主在我问题出错的情况下仍然给予回答。
但是,GTX680白皮书上有To feed the execution resources of SMX, each unit contains four warp schedulers, and each warp
scheduler is capable of dispatching two instructions per warp every clock.
的描述,所以我理解为每个warp的两条指令实际是分别给16个SP核心运行的因此有以上疑问。
但是如果scheduler通过两个dispatch发送的两条指令是同时给32个核心工作的还是它们之间有先后顺序呢?
另外,ILP是通过Better performance at lower occupancy这个PPT中得到的信息,里面提到了一个很奇怪的现象,就是如果想让GTX560Ti这种架构的GPU能够达到超过66.6%的吞吐量,就必须使用ILP,那么想请教版主,这个意思是如果没有ILP指令,那么warp scheduler只会取两条指令,而有可并行指令就会取三条或者四条么?
最后一个问题,就是,SMX的warp schedular是在一个时钟周期内取得两条指令的么?如果是这样,那么上述的GTX560Ti的情况又是如何?也是在一个时钟周期内取得么?
谢谢版主指教,祝版主身体健康

LZ您好,您客气了,您此次问题,我大致解释如下:

1:1个scheduler每周期可以对抓取的一个warp发射两条无关的指令。但是手册中并没有解释是如何发射到执行单元的,因此我并不知道具体的硬件行为。

但是,反过来讲,只算发射能力是否足够的话,其实不知道具体的硬件行为,并不影响的。
假定上述一个warp的2条指令是发射给16个sp的,那么足够这组sp计算4个周期,那么后面3个周期,scheduler就可以发射到其他的各组sp上去。这样,4周期用了4组sp,这4组sp都是忙碌的(实际上单看这组行为,后一组sp要比前一组晚一个周期拿到指令,但是如果考虑到scheduler是不停地每4周期给这4组sp发射任务,仍然可以看做是跑满的。)

假定一个warp的2条指令是发射给32个sp的,那么够这32个sp计算两个周期,那么下一个周期scheduler就可以将另外一个warp的2条指令发给另外的32个sp。类似上面的计算方法,4周期,4组忙碌的sp(sp是16个一组的,这个是硬件结构)。

假定一个warp的2条指令是发射给64个sp的,那么够这64个sp计算一个周期,那么下一个周期,再拿一个warp的2个指令发射给这4组64个sp,每次都这样,那么4周期,4组sp忙碌。

所有这3种情况,最后都是4个周期,4组SP忙碌,完成了4个warp每warp2条指令的计算。

因此,无论实际执行情况如何,在等价的意义下,考虑发射和执行能力,上述3种情况是一回事。

同时考虑到有4个scheduler,那么最终可以计算出,每周期单独考虑SP计算指令的话,可以发射256指令,这已经超出了SMX中192 sp的硬件资源。实际上剩余的发射能力可以给访存和SFU使用,以及并不保证每次都能双发射。

因此,可以得到我前面答复的情况。

您的第一个问题先答复如此。

2:以及,如果您看到ILP是从《Better performance at lower occupancy》这篇经典文献里面的,那么这里的ILP实际上是我在2#中提到的“另外一种优化操作”。和双发射带来的ILP没有直接关系。

以及本来就没有ILP指令的,这只是一种安排访存和计算的方法。
以及scheduler不会因为这种安排而多读取指令,其最大能力就是双发射,这是硬件决定的。
以及,对于fermi SM2.1及其之后的kepler而言,发射能力一般是足够用的。fermi SM2.0有时候发射能力会有所欠缺。

以及,ILP做法在fermi时代比较常见,kepler时代效果如何,我还不掌握具体情况。

您的第二个问题,大致答复如上。

版主您好,对于第一个问题,有一个小小的疑问,就是2条指令足够16个sp计算4个周期以及2条指令够32个sp计算两个周期是可以从哪个资料获得的呢?不胜感激

3:您的这个问题涉及一个背景知识,NV GPU的频率情况。我来先大致说一下。

在迄今为止所有支持CUDA的N卡GPU里面,除了kepler以外,都有两个频率。
一个称为GPU核心频率,另一个称为SP频率。SP是跑在后者频率上的,scheduler等其他部分是跑在前者频率上的。
后者是前者的两倍,因而,有时又称前者为基频,后者为倍频。

在kepler上,NV重新衡量了GPU功耗约束和集成度约束,最终修改了之前的设计,使得所有部分都跑在同一个频率上,不再区分。此时达到同样的峰值,需要更多的晶体管(更高的集成度),但是功耗会降低。

-----------------------------------背景知识的分割线---------------------------------------

那么,对于kepler GPU,首先是不区分频率的,因为只有一个频率。
根据手册,scheduler每周期可以发射同一个warp的两个无关指令,并分发给执行单元。
手册中并无实现细节介绍,亦无法回答scheduler是如何/何时取得指令的。

对于GTX 560Ti,这是fermi核心 SM 2.1的GPU。
印象中,其scheduler在一个GPU 核心周期内,对同一个warp发射两条无关指令,并分发给执行单元。手册中同样无实现细节。我们无从得知在一个SP周期内,是发射一个warp的1条指令,还是发射一个half-warp的两条指令,以及亦无法得知具体分发给哪个执行单元,分发遵循哪些规律。

不过,类似之前的讨论,单纯计算发射能力和执行能力的话,其实是无关细节的。
同时类似地,也无法回答scheduler是如何/何时得到指令的。

最后,需要补充说明一下,虽然fermi SM2.1上是两个scheduler VS 48 SP(暂不考虑其他单元),而kepler上是4 scheduler VS 192 SP,看上去似乎kepler的scheduler不够用。其实不然。

因为kepler上SP的频率和scheduler的频率是一样的,而fermi上SP频率是倍频的。
这相当于kepler上使用了更快的scheduler,或者说,这相当于kepler上有8个过去那种半速/基频的scheduler,因此kepler上的发射能力依然是充足的,其与计算能力依然是均衡的。

大致如上,您的三个问题到此答复完毕。

感谢您莅临CUDA ZONE,欢迎您常来,祝您编码愉快~

感谢版主莅临指导,祝版主身体健康。

LZ您好,是这样的,这是根据指令的吞吐量数据得到的。

对于吞吐量最高的指令(如浮点乘法,加法,FMA),每个SP每SP周期(对于fermi和之前的GPU)/每周期(对于kepler)可以完成一条(确切说法是灌入流水线一条,但需要若干周期后才能得到最后的结果)。

那么,如果有一个warp的两条此类指令,实际上有32*2=64条指令。
对于16sp,需要连续灌入4次,这是4周期;对于32sp,需要连续灌入2次,这是2周期;对于64sp,需要灌入一次。

以及,此时考虑的是SP吞吐量最高的指令,这些指令也是堆scheduler能力要求最高的指令。如果吞吐量高的指令scheduler都能应对,那么对于吞吐量更低的指令,scheduler更加不会成为瓶颈。

以及必须强调的是,上述4#和本楼举的这些例子,都是为了说明发射能力和执行能力的关系的,都是在某种“等价”观点下的分析讨论。
这不代表硬件的实际行为,以及我们也无法得知硬件的实际行为,NV并没有公开这些资料。

您的疑问答复如上,祝您好运~

您客气了,欢迎您常来论坛讨论~

祝您晚安~