● 全新的Pre-Scheduling过程
早在GeForce GTX680的首测的过程中,Kepler架构全新的Scheduling过程就引起了我们极大的兴趣,它是Kepler众多“黑科技”中隐藏最深同时可能产生的影响也最为深远的改进之一。由于ISA结构资料的缺失以及测试初期对底层架构信息掌握的不足,我们在当时无法了解这一改进的细节。伴随着信息收集以及后续测试的不断深入,我们现在终于获得了足够的细节,同时也成功的将它与GK104的SMX结构改进以及NVIDIA的架构发展过程联系在了一起。
GPU的逻辑结构决定了它并不适合被用来执行关联度过高过深的条件分支过程,因此对于任务的关联性检查以及将关联指令打散到不同的线程块中就成了整个GPU任务队列执行过程中一个非常重要的步骤。在以Fermi为代表的传统仲裁体系中,任务会在解码过程之后完成指令的关联性检查,如果指令存在超过一定限度的关联性,为了规避条件分支对性能产生的影响,这些指令会被重新打包以便ALU团簇进行吞吐。在完成这些关联性检查之后,明确执行方向的指令才会被送入流水线中进行执行。为了加快这一过程的速度,Fermi架构为这个过程提供了Multiport Post decode Queue以及对应Register的硬件支持。这部分工作执行的场所以及Multiport Post decode Queue和对应Register所处的位置,就在SM单元的Logic controller。
在Kepler中,这一传统的过程发生了巨大的变化,任务会在进入GPU之前先根据Sched.info进行关联度判断以及选择,然后直接进行解码并被送入流水线中完成后续处理。传统的关联性检查以及指令重组等过程被Sched.info-select所取代。在执行过Pre-Scheduling过程之后,指令从解码到执行之间的延迟被大幅降低,整个流水线因此获得了更高的执行效率和复用率。而执行这一过程的场合也不再是SMX单元的Logic controller,它被挪到了我们熟悉的X86处理器,也就是你主板上插着的那颗CPU中。
Fermi架构SM单元内部的Scheduler以及Dispatch Unit比例
由于新的Scheduling过程在CPU中基于软件形式完成,因此传统Logic controller中与Pre-Scheduling相关的硬件,比如Fermi中的Multiport Post decode Queue(解码后队列)以及对应的Register(寄存器)等等DCA(Dependency check Architecture,负责依赖性检查的逻辑结构)也就没有了存在的必要,它们所占用的晶体管资源可以被释放出来,Logic controller的规模也因此得以大幅削减。尽管目前的Pre-Scheduling只涉及中等以下关联性的检查,并没有完全取代全部的Scheduling动作,关联度较深的指令依旧需要传统的硬件DCA来快速执行,但这一改进还是促使NVIDIA将SMX中Warp Scheduler的密度削减到了Fermi的1/3。
除此之外,Pre-Scheduling让指令从解码到执行之间的过程变得更加简洁,从线程进入SMX到抵达ALU进行执行这一过程的延迟也被降低。延迟的缩短缓解了线程派发效率带来的负担,让硬件不再需要配备大量的分派资源来提升任务分派的效率,以便抵充前面延迟所带来的性能损失,因此SMX单元中的Dispatch Unit密度也随之得以降低。在SMX中,NVIDIA配给的Dispatch Unit密度只有Fermi的66%。
DCA的大量削减以及Warp Scheduler和Dispatch Unit密度的下降促成了Logic controller的的最终瘦身,这不仅直接导致了NVIDIA可以放心大胆的扩张SMX单元的规模,将更多ALU资源纳入到GPU体系中去,更成功的将传统DCA硬件运行过程的功耗转移到了CPU当中。有了更多直接运算资源带来的性能,同时功耗矛盾也得到了缓解,基于Kepler构架的GeForce GTX690拥有目前的单卡性能王座也就不是什么奇怪的事情了。