双层线程分配调度器设计是Fermi重要的技术之一。在SPA(Streaming Processor Array,流式处理器矩阵)里面,有一个全局工作分配调度器(global work distribution engine),它负责将Thread block排程分发给SPA中不同的SM。而SM里面的两个Warp调度器则负责把32线程一组的Warp分配到合适的执行单元。
基于第一代GigaThread引擎的G80能实时管理多达12288个Thread,而在Fermi上不仅线程总数增加了一倍,还提升了context switching(上下文切换)的性能。
和CPU一样,GPU也可以利用上下文切换(Context Switching)来实现支持多任务(multi-taksing)操作。Fermi的流水线架构已经针对应用程序的上下文切换进行了优化,切换的时间被缩短到10毫秒~20毫秒,较以往的GPU来说有显著的提升。
FMA指令可以避免精度的损失
除了性能的提升,上下文切换还允许开发人员开发出进行频繁kernel-kernel间通讯的应用程序,例如在图形渲染应用程序和计算应用程序之间进行细粒度的互操作。
Fermi首次实现了并发核心程序执行(Concurrent kernel execution,以下简称"CKX"),可以让GPU在同一时间执行同一个程序的上下文的不同核心程序。CKX可以让程序执行多个小kernel,从而充分利用整个GPU。例如一个物理程序可能包含了流体解算器和刚体解算器,如果串列执行的话,只能用到一半的线程处理器,而CKX就可以避免这个问题。不同程序上下文的kernel之所以能够非常高效地串列执行,是因为上下文切换速度得到了改善。
如果以GeForce 256为起点,GPU发展至今已经有10个年头。在这10年间,GPU架构发生了许多变化。如果说GPU的出现是为了让CPU从TnL计算中释放出来,那么从G80开始我们可以认为,业界正试图把更多的计算负荷从CPU转移到GPU上来,例如物理现象模拟、影像合成、科学计算,即NVIDIA提倡的GPU Computing,GPU开始承担更多的任务。
G80引入了实现线程间共享的Shared Memory(共享式内存)和barrier同步能力;引入了让不相依的多个线程同时执行单个指令的SIMT(单指令多线程)执行模型。G80奠定了GPU Computing应用的基石,而GT200则是在此基础上的增强,它使得寄存器数量倍增,实现了内存存取操作合并,支持硬件双精度浮点运算。到了Fermi,则是代表着GPU Computing在硬件架构和编程模型上已经进入成熟而完备的阶段。
与单纯地增加功能单元的做法相比,Fermi的设计团队解决了若干个GPU Computing方面棘手的难题。在Fermi架构上,数据局部性的重要性通过L1/L2 cahce得以展现;强大的并发式kernel执行让GPU执行多任务能力达到了空前的水平;显著加强的双精度浮点性能设计让GPU达到超级计算机的性能水准。后,Fermi还支持ECC技术,这从硬件架构上扫清了NVIDIA GPU进入HPC市场的障碍。NVIDIA表示,基于Fermi的显卡会在今年底或者明年初上市,价格取决于届时NVIDIA面临的竞争态势。
事实上NV现在是不是技术的成功者也值得探讨。N和A的架构孰优孰劣只能透过实际检验来衡量,事实上如果所有的测试或者游戏都关闭了优化的元素之后,两家厂商的芯片性能其实一直是在伯仲之间。 Fermi的架构看图的确很吸引人,但是NV忘了一样东西,那就是想象可以无限大,但是后却都只能立足于一片小硅片之上。随着GPU功能的复杂化,制程的更新已经明显跟不上,Fermi迟迟不能生产就是好的例子。NV继续坚持大芯片的道路现在看来无疑是错误的。 事实上NV的确很厉害,它拥有一大堆自有标准,例如PhysX和CUDA。它的确一呼百应,一大堆THE WAY游戏就是证明。但是,今天的NV和当初的3dfx何其相似,抱着自有的标准,做着黄粱美梦。事实上,任何的标准都可以有替代品。当年DirectX替代了GLIDE,今天同样Direct Computing和OpenCL可以替代CUDA和PhysX。希望NV还是要踏踏实实做好芯片的研发,不要以为自有标准是万能的。所谓的合作伙伴都是商人,商人是唯利是图的,当年他们可以抛弃3dfx,今天就可以抛弃NV。