分享

科学网

 LVADDIE 2015-01-08

2.3.1 Front End

前端中的主要阶段包括指令Cache访问,指令缓存逻辑,记分板,调度逻辑以及SIMT栈(SIMT stack)。

 

2.3.1.1 Fetch and Decode

3中指令缓存模块(I-Buffer)用于缓存从指令Cache中取出的指令。I-Buffer被静态划分,使得运行在SIMT核心上的所有warp在其中都有专门的存储空间存储指令。在当前的模型中,每个warp有两个I-Buffer条目。每个I-Buffer条目有一个有效位(valid bit),一个就绪位(ready bit)和一个对应于这个warp的译码后的指令。有效位表示当前I-Buffer的该条目中还有一个未发射的指令。就绪位表示这个warp中的译码后的指令已经准备好被发射到执行流水线中。从概念上讲,就绪位是在调度和发射阶段,通过检查记分板逻辑和可用的硬件资源被设置(在仿真器的具体实现中,一个准备就绪的检测被执行,而不是实际设置一个就绪位)。I-Buffer初始化为空,所有的有效位和就绪位都是无效的。

一个warp需要进行取指令操作,假如它在I-Buffer中没有任何有效指令。所有需要进行取指的warp以轮询的方式被调度访问指令Cache。一旦被选中,一个读请求以及下一条指令的地址被送入到指令Cache。默认情况下,两条连续的指令被取出。一旦一个warp被调度进行取指操作,I-Buffer中相应的有效位被置为有效,直到该warp中所有取出的指令都被发射到执行流水线

指令Cache是只读的,non-blocking set-associative,支持FIFOLRU替换策略以及on-misson-fill分配策略。对于指令Cache的请求可能导致命中,不命中或保留失败(reservation fail)三种情况。当miss status holding registerMSHR)满了或者Cache组中没有可用于替换的块,因为所有的块都被之前的挂起请求所预留,这是将出现保留失败的情况(Cache小节将详述更多细节)。对于命中或不命中的情况,基于轮询机制的取指调度器调度下一个warp。发生命中时,被取指的指令送入到译码阶段。对于不命中的情况,指令Cache将产生一个请求。当不命中的响应信号被接收时,相应的块被填充到指令Cache中,并且相应的warp再次被调度访问指令Cache。而当没有接收到相应信号的时候,相应的warp不会访问指令Cache

假如一个warp的所有线程都完成了所有的运算,并且不存在未完成的对于memory的写操作或对本地寄存器的写操作,表示该warp已经完成了所有的执行并且不会再被取指调度器调度。如果一个线程块(thread block)中的所有warp都已经结束,并且没有挂起的操作,则表示该线程块也已经结束。一旦一个kernel发射阶段所分派的所有线程块都结束,则表示该kernel的执行也已经结束。

   在译码阶段,当前被取出的指令被译码,然后存储到I-Buffer相应的条目中等待发射。

 

2.3.1.2 Instruction Issue

GPGPU-Sim中第二个轮询仲裁器从I-Buffer中选择一个warp发射到后续流水线中。这个轮询的仲裁器是与用于调度指令进行Cache访问的轮询仲裁器分离的,称为发射调度器。发射调度器可以进行配置,每个cycle从同一个warp中发射多条指令。当前被检测的warp中每个有效的指令(即已经被译码但没有发射)可以被发射必须满足以下4个条件:(1) warp没有在barrier上处于等待状态,(2) I-Buffer相应条目中的有效位被设置,(3) 记分板检测通过(记分板一节将进行详述),并且 (4) 指令流水线中的取操作数阶段(operand access stage)没有被挂起。

存储器指令(读,写或者memory barrier)被发射到存储器流水线。对于其他指令,如果既可以使用SP流水线也可以使用SFU流水线,则优先选择SP流水线。然而,假如一个控制冒险(control hazard)被检测到,则I-Buffer中对应于这个warp的指令被冲掉(flush)。Warp的下一个PC值被更新指向下一条指令(假设所有的分支都不发生跳转)。更多的关于处理控制流的信息参考SIMT Stack小节。

在发射阶段barrier操作被执行。此外,SIMTstack被更新(参考SIMT Stack小节),并且寄存器的依赖被跟踪(参考记分板小节)。在发射阶段所有warp等待barrier同步(“_syncthreads()”)。

 

2.3.1.3 SIMT Stack

每个warp拥有一个SIMTstack用于处理SIMT体系结构中的分支分叉(branch divergence)的执行。因为分叉将降低SIMT体系结构效果,不同的技术可以被采用来降低这种作用的影响。一个最简的技术就是PDOM机制(post-dominator stack-based reconvergence mechanism)。这项技术同步所有分叉的分支在最早的汇合点回合以增加SIMT体系结构的效率。GPGPU-Sim 3.x采用这种机制。

  SIMT stack中的条目表示不同的分叉级别。在每一个分叉的分支,一个新的条目被压入stack的顶端。Stack顶端条目被弹出,当warp到达他的汇合点。每个条目存储新分支的目标PC,最近汇合点的PC以及分叉到这个分支的线程有效掩码(active mask)。在我们的模型中,每个warpSIMT stack在其每条指令发射后被更新。对于非分支的情况,目标PC通常被更新为下一个PC值。然而,发生分支分叉时,带有新目标PC,有效掩码以及汇合点PC的条目被压入stack中。因此,一个控制冒险被检测到,假如SIMT stack顶部条目的下一个PC不等于当前被检测指令的PC

文章“Dynamic Warp Formation: Efficient MIMD Control Flow on SIMD GraphicsHardware”讲述了更多的细节,可以参考。

注意,众所周知NVIDAAMD实际上使用特殊指令调整它们divergencestack中的内容。这些特殊指令在PTX中是不可见的,但实际硬件的SASS指令集可见(可以使用decuda或者NVIDIAcuobjdump可见)。当前GPGPU-Sim 3.x版本可以通过PTXPlus被配置以执行SASS,但它忽略了这些底层指令,替代以一个控制流图来识别immediate post-dominators。我们计划支持这些底层的分支指令在GPGPU-Sim3.x的未来版本中。

 

2.3.1.4 Scoreboard

记分板算法检测WAWRAW依赖冒险。如上所述,被一个warp写入的寄存器在发射阶段被预留。记分板算法依靠warpID进行索引。它存储了对应某个warp ID的所需要的寄存器的数目。预留的寄存器在写回阶段被释放。

如上所述,一个warp中被译码的指令不会被调度发射直到记分板显示没有WAWRAW的冒险存在。记分板检测WAWRAW冒险通过跟踪哪些寄存器将被一条指令写入,这条指令已经发射但还没有写回结果到寄存器堆中。


2.3.2 Register Access and the OperandCollector

多个NVIDIA的专利描述了一种称为“operandcollector”的结构。Operand collector由一组缓存和仲裁逻辑组成,是对由多个单端口RAM bank构成的多端口寄存器堆的外围访问逻辑。其寄存器堆的组织排列可以节省能耗和面积,对于改善吞吐率十分重要。注意,AMD也是适用分bank的寄存器对组织形式,但由编译器负责确保所有对于寄存器堆的访问没有bank冲突出现。图4提供了对于GPGPU-Sim 3.xoperand collector模型的详细描述。

在指令译码后,一个叫做collector的硬件单元被分配,用来缓存指令中的源操作数。

Collector单元不是用来通过寄存器重命名(register renaming)来去除名字依赖(name pendency)的,而是作为一种方式将对寄存器中操作数的访问按时间间隔开来以保证一个cycle内对一个bank不会出现多于1次的访问。如图所示,四个collector单元中的任何一个都由三个操作数的条目组成。每个条目包括四个字段:1个有效位(valid),一个寄存器识别符(register identifier),一个就绪位(ready)和操作数。每个操作数字段保存一个128字节源操作数,即324字节的单元(每个4字节的值对应一个warp中的一个线程)。此外,collector单元包括一个识别符表示指令属于哪个warp。仲裁器对于每一个bank对应一个读请求队列,用于保存访问请求,直到它们都被授权(grant)。

当一条指令经过译码阶段并且存在collector单元可用,则该collector单元被分配给该指令,相应的operandwarpregister identifier以及有效位被设置。此外,源操作数读请求被排队到仲裁器。为了简化设计,执行单元写回的数据的优先级总是高于读请求。仲裁器选择一组至多4个无bank冲突的访问发送到寄存器堆。为了减少crossbarcollector单元的面积,每个collector单元每个cycle只接收一个操作数。

To reduce crossbar and collector unit areathe selection is made so that each collector unit only receives one operand percycle.


4 Operandcollector microarchitecture

 

当每个操作数被从寄存器堆读出并放入到相应的collector单元中,就绪位被设设置。最终,当一个指令的所有操作数都就绪后,该指令被发射到一个SIMD执行单元。

在我们的模型中,每条后端流水线(SP,SFU, MEM)都有一组专用的collector单元,并且他们共享一个通用collector单元池。每条流水线可用的单元数目以及池容量都是可配置的。


2.3.3 ALU Pipelines

GPGPU-Sim v3.x建模了两类ALU功能单元。

l  SP:执行所有的ALU指令除了超越函数。

l  SFU:执行所有的超越函数指令(Sine, Cosine, Log… etc.)。

两类ALU单元都是流水的,SIMD化的。SP单元每个cycle执行一个warp指令,而SFU单元根据指令类型,可能几个cycle执行一个warp指令。例如,SFU单元每4cycle执行一个sine指令,每2cycle执行一个求倒数指令。不同的指令类型有不同的执行延迟。

每个SIMT核心有一个SP单元和一个SFU单元。每个单元有独立的端口连接operand collector。两个单元共享同一个输出寄存器,连接到公共的写回阶段。在operand collector输出有一个结果总线分配器(result bus allocator),确保单元不会因为写回被挂起。每条指令在发射到另一个单元前,都需要在结果总线中需要分配一个cycle slot。注意,存储流水线有自己的写回阶段,不被这个结果总线分配器所管理。



http://blog.sciencenet.cn/blog-1067211-724107.html  转载请注明来自科学网博客,并请注明作者姓名。
上一篇:[笔记] GPGPU-SIM微结构模型(一)
下一篇:[笔记] GPGPU-SIM微结构模型(三)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多