Cayman核心的流处理器结构
于是Cayman核心诞生了,胖ALU下岗,只保留了剩下4个对等的全功能ALU。裁员归裁员,原来胖ALU的工作还得有人干,Cayman的4D架构在执行特殊功能指令时,需要占用3个ALU同时运算。
5D改4D之后最大的改进就是,去掉了体积最大的ALU,原本属于它的晶体管可以用来安放更多的SIMD引擎,据AMD官方称流处理器单元的性能/面积比 可以提升10%。而且现在是4个ALU共享1个指令发射端口,指令派发压力骤减,执行效率提升。双精度浮点运算能力也从原来单精度的1/5提高到了1 /4。
效率更进一步:双图形引擎
前面介绍过,从RV770到Cypress核心,图形引擎和超线程分配处理器都只有一个,但图形引擎内部的Hierarchical Z(分层消影器)和Rasterizer(光栅器)分为两份。 到了Barts核心,超线程分配处理器从一个变成两个。现在的Cayman核心则更进一步,图形引擎也变成了两个,也就是除了分层消影器和光栅器外,几何着色指令分配器、顶点着色指令分配器、还有曲面细分单元都变成了两份: 两个曲面细分单元再加上两个超线程分配处理器,AMD官方称HD6970的曲面细分性能可以达到HD6870的两倍、HD5870的三倍。其它方面比如顶点着色、几何着色性能都会有显著的提升。
通用计算效能也有改进
和Cypress、Barts相比,Cayman在通用计算方面也有一定程度的改进,主要体现在具备了一定程度的多路并行执行能力;双路DMA引擎可以同 时透过外部总线和本地显存读写数据;改进的流控制提高了指令执行效率和运算单元浪费;当然双精度运算能力的提高对于科学计算也大有裨益。
不过,这些改进都是治标不治本,VLIW架构从5D到4D只是一小步,只能一定程度上的提高指令执行效率,而无法根治GPU编程困难、复杂指令和条件指令 的兼容性问题。总的来说,Cayman核心依然只是单纯为游戏而设计的GPU,AMD把5D改为4D也是基于提升3D渲染性能的考虑。
GPU的一大步:NVIDIA G80图形架构解析
AMD的GPU架构介绍了这么多,对于其优缺点也心知肚明了,之前笔者反复提到了“效率”二字,其参照物当然就是NVIDIA的GPU,现在我们就来看看NVIDIA的GPU架构有什么特点,效率为什么会比较高?为什么更适合并行计算?
SIMD效率不高的根本原因
无论AMD怎么调整架构,5D还是4D的结构都还是SIMD,也就是这4-5个ALU要共用一个指令发射端口,这样就对GPU指令派发器提出了很高的要 求:如果没有把4-5个指令打包好发送到过来,那么运算单元就不会全速运行;如果发送过来的4-5个指令当中包含条件指令,但运行效率就会降至连50%都 不到,造成灾难性的资源浪费。
解决方法也不是没有,但都治标不治本,需要对游戏/程序本身进行优化,尽量避免使用标量指令、条件指令和混合指令,驱动为程序专门做优化,难度可想而知。 而治本的方法就是抛弃SIMD架构,从源头上解决指令组合预分配的问题。
G80革命性的MIMD架构
NVIDIA的科学家对图形指令结构进行了深入研究,它们发现标量数据流所占比例正在逐年提升,如果渲染单元还是坚持SIMD设计会让效率下降。为此 NVIDIA在G80中做出大胆变革:流处理器不再针对矢量设计,而是统统改成了标量ALU单元,这种架构叫做MIMD(Multiple Instruction Multiple Data,多指令多数据流)
G80核心架构,每个流处理器就是一个标量ALU
如此一来,对于依然占据主流的4D矢量操作来说,G80需要让1个流处理器在4个周期内才能完成,或者是调动4个流处理器在1个周期内完成,那么G80的执行效率岂不是很低?没错,所以NVIDIA大幅提升了流处理器工作频率(两倍于核心频率),扩充了流处理器的规模(128个),这样G80的128个标量流处理器的运算能力就基本相当于传统的64个(128×2?)4D矢量ALU。大家应该知道R600拥有64个5D矢量ALU,最终的性能G80要远胜 R600。
当然这只是在处理4D指令时的情形,随着图形画面越来越复杂,1D、2D、3D指令所占比例正在逐年增多,而G80在遇到这种指令时可说是如鱼得水,与 4D一样不会有任何效能损失,指令转换效率高并且对指令的适应性非常好,这样G80就将GPU Shader执行效率提升到了新的境界!
MIMD架构的劣势
G80的架构听起来很完美,但也存在不可忽视的缺点:根据前面的分析可以得知,4个1D标量ALU和1个4D矢量ALU的运算能力是相当的,但是前者需要 4个指令发射端和4个控制单元,而后者只需要1个,如此一来MIMD架构所占用的晶体管数将远大于SIMD架构!
所以AMD的SIMD架构可以用较少的晶体管造出庞大数量的流处理器、拥有恐怖的理论浮点运算能力;而NVIDIA的MIMD架构必须使用更多的晶体管制 造出看似比较少的流处理器,理论浮点运算能力相差很远。双方走的都是极端路线,AMD以数量弥补效率的不足,而NVIDIA以效率弥补数量的劣势。
真正的并行计算架构:GT200只为计算优化
G80的MIMD架构开了一个好头,128个流处理器虽然听起来虽然没有AMD 320个那么多,但这些流处理器是可以媲美真正的CPU核心,在执行任何指令时都能发挥出接近理论值的性能,这样高效率的核心如果只是用来玩游戏岂不太可惜了?
于是在游戏市场大获全胜的NVIDIA并没有止步于此,而是将目光放在了更长远的高性能计算领域,一边着手开发基于GPU计算的应用程序中间件,帮助程序 员以更高效的方式开发基于GPU硬件加速的软件,另一方面在G80的基础上继续优化核心架构,将MIMD架构高效率的优势发挥到极致!
GT200核心:真正的并行计算架构
G80依然只是为DX10 3D渲染而设计的,虽然MIMD架构本身能够胜任并行数据计算的需要,但NVIDIA发现图形架构还有继续改进的余地,只要在核心内部设计全新的控制模块,并对微架构进行专门的优化,就能将GPU的图形架构改造成更加适合非图形领域的并行数据处理架构。 第一代统一渲染架构的主要目的是把原本像素着色、顶点着色以及新增的几何着色,统一交给流处理器来处理。而NVIDIA的GT200核心则被称为第二代统 一渲染架构,其主要含义就是将图形处理架构和并行计算架构完美的结合起来,成为一颗真正意义上的通用处理器,超越图形处理器的概念! GT200相对于G80,不止是把流处理器数量从128个扩充到240个这么简单,其实最关键之处是对TPC(线程处理器簇)和SM(流处理器簇)的改进:
新增Atomic原子操作:透过原子操作,硬粒化之后的线程操作管理将更加 有序和具体,这也就意味着像素或者其他类型如通用计算应用的Thread的生成、仲裁、泵送、内存位置确定和执行过程都将变得更加精确和高效,Atomic单元和原子操作的引入也为未来NVIDIA构架最终实现并行化设计起到了关键的先导作用。
每个SM可执行线程上限提升:G80/G92核心每个SM(即不可拆分的8核心流处理器)最多可执行768条线程,而GTX200核心的每个SM提升至1024条,而且GTX200拥有更多的SM,芯片实力达到原来的2.5倍! 每个SM的指令寄存器翻倍:GTX200与G80核心在SM结构上基本相同的,但功能有所提升,在执行 线程数增多的同时,NVIDIA还将每个SM中间的Local Memory容量翻倍(从16K到32K)。Local Memory用于存储SM即将执行的上千条指令,容量增大意味着可以存储更多的指令、超长的指令、或是各种复杂的混合式指令,这对于提高SM的执行效能大 有裨益。
DX10游戏会越来越多的使用复杂的混合式Shader指令,一旦排队中的超长指令溢出或者在N个周期内都排不上队,那么就会造成效率下降的情况,此时双倍寄存器容量的优势就体现出来了。由于Local Memory并不会消耗太多晶体管,因此将其容量翻倍是很合算的。
纹理单元数量提升,比率下降,达到了ATI当年鼓吹的3:1水平 其它改进还有:几何着色性能提升,提高双指令执行(Dual-Issue)效率,达到93%-94%之多,支持双精度64Bit浮点运算,运算能力为单精度的1/8。
综合来看,GT200除了流处理器、纹理单元、光栅单元这些硬货数量增多对游戏性能大有裨益以外,其它细节部分的优化跟游戏关系不大。因为GT200是为 并行计算而设计的,从GT200开始,GPU计算变得更加实用和普及,NVIDIA的Tesla开始进入科学实验室,并杀进超级计算机市场。
DX11与并行计算的完美结合:GF100/110的野心
随着Tesla在高性能计算领域日渐深入人心,NVIDIA也在与科研工作者们进行深入的沟通,倾听一线用户的需求,以便在下代GPU核心中做出相应的优化改进。当时用户最大的需求有两点:第一,科学家和超级计算只看重64bit双精度浮点运算能力,GT200性能太低,只有单精度的1/8;第二:企业级 用户对稳定性要求更高,传统的显卡不支持显存ECC(错误检查和纠正),计算出错后效率较低。
这就是下一代GPU的设计目标。而且,这次GF100不仅要满足并行计算的需求,还要兼顾DX11游戏性能,针对DX11新增的曲面细分、几何运算做出相应的改进,时间紧、任务重、压力大。
过于追求完美往往结果就会不完美,NVIDIA在GPU架构设计部分做到了近乎完美,但是在芯片制造端掉了链子——由于GPU核心太大,台积电40nm工 艺还不够成熟,导致GF100核心良率低下,没能达到设计预期,最终的产品不仅功耗发热很大,而且规格不完整。所以虽然当时GTX480显卡的评价不是很 高,但GF100核心的架构极其优秀的。等到工艺成熟之后的GF110核心以及GTX580显卡,就毫无疑问的站在了游戏与计算的巅峰!
GF100是“四核心”设计:4个光栅化引擎
GF100/110可以看作是四核心设计
如果我们把Cayman看作是双核心的设计,那GF100就是四核心的设计,它拥有四个GPC(图形处理器集群)模块,每个GPC都有各自的光栅化引擎(Raster Engine),而在以往都是整颗GPU共享一个Raster Engine。
GF100拥有16个多形体引擎
GF100与GT200最大的不同其实就是PolyMorph Engine,译为多形体引擎。每个SM都拥有一个多形体引擎,GF100核心总共有多达16个。那么多形体引擎是干什么用的呢?为什么要设计如此之多? 为什么要这么多的多形体引擎?
之前的GPU架构一直都使用单一的前端控制模块来获取、汇集并对三角形实现光栅化。无论GPU有多少个流处理器,这种固定的流水线所实现的性能都是相同的。但应用程序的工作负荷却是不同的,所以这种流水线通常会导致瓶颈出现,流处理器资源未能得到充分利用。
实现光栅化并行处理的同时还要保持API的顺序是非常困难的,这种难度阻碍了这一领域的重大创新。虽然单个前端控制单元的设计在过去的GPU中曾有过辉煌的历史,但是随着对几何复杂度的需求不断增长,它现在已经变成了一个主要障碍。
Tessellation的使用从根本上改变了GPU图形负荷的平衡,该技术可以将特定帧中的三角形密度增加数十倍,给设置于光栅化单元等串行工作的资源带来了巨大压力。为了保持较高的Tessellation性能,有必要重新平衡图形流水线。 为了便于实现较高的三角形速率,NVIDIA设计了一种叫做“PolyMorph”的可扩展几何引擎。每16个PolyMorph引擎均拥有自己专用的顶 点拾取单元以及镶嵌器,从而极大地提升了几何性能。与之搭配的4个并行光栅化引擎,它们在每个时钟周期内可设置最多4个三角形。同时,它们还能够在三角形获取、Tessellation、以及光栅化等方面实现巨大性能突破。
这是Cayman的图形引擎,是双核心设计
AMD的Cayman核心是不分光栅化引擎和多形体引擎的,都可以算作是双核心设计,GF100与Cayman相比,光栅化引擎是4:1,多形体引擎(包括曲面细分单元)是16:2,GF100的几何图形性能有多么强大已经可以想象。
当NVIDIA的工程师通过计算机模拟测试得知几何引擎将会成为DX11新的瓶颈之后,毫不迟疑的选择了将单个控制模块打散,重新设计了多形体引擎和光栅化引擎,并分散至每组SM或每个GPC之中,从而大幅提升了几何性能,彻底消除了瓶颈。
GF100流处理器部分的改进
每一个CUDA核心都拥有一个完全流水线化的整数算术逻辑单元(ALU)以及浮点运算单元(FPU)。GF100采用了最新的IEEE754-2008浮 点标准,2008标准的主要改进就是支持多种类型的舍入算法。新标准可以只在最终获取数据时进行四舍五入,而以往的标准是每进行一步运算都要四舍五入一次,最后会产生较大的误差。 GF100能够为32bit单精度和64bit双精度运算提供FMA(Fused Multiply-Add,积和熔加)指令,而GT200只在64bit时才能提供。FMA不仅适用于高性能计算领域,事实上在渲染紧密重叠的三角形时, 新的FMA算法能够最大限度的减少渲染误差。
ATI所有的流处理器在执行整数型加、乘指令时仅支持24bit精度,而NVIDIA CUDA核心支持所有整数指令全32位精度,符合标准编程语言的基本要求。整数ALU还经过了优化,可有效支持64位以及更高精度的运算,这一点是对手无法比拟的。 GF100拥有双Warp调度器可选出两个Warp,从每个Warp发出一条指令到16个核心、16个载入/存储单元或4个特殊功能单元。因为Warp是 独立执行的,所以GF100的调度器无需检查指令流内部的依存关系。通过利用这种优秀的双指令执行(Dual-issue)模式,GF100能够实现接近 峰值的硬件性能。
GF100首次引入一级缓存与动态共享缓存
GF100核心拥有很多种类的缓存,他们的用途不尽相同,其中一级缓存、共享缓存和纹理缓存位于SM内部,二级缓存则是独立的一块,与光栅单元及显存控制器相连。 以往的GPU都是没有一级缓存的,只有一级纹理缓存,因为这些缓存无法在通用计算中用于存储计算数据,只能用于在纹理采样时暂存纹理。而在GF100当中,NVIDIA首次引入真正的一级高速缓存,而且还可被动态的划分为共享缓存。
在GF100 GPU中,每个SM除了拥有专用的纹理缓存外,还拥有64KB容量的片上缓存,这部分缓存可配置为16KB的一级缓存+48KB共享缓存,或者是48KB 一级缓存+16KB共享缓存。这种划分方式完全是动态执行的,一个时钟周期之后可自动根据任务需要即时切换而不需要程序主动干预。
一级缓存与共享缓存是互补的,共享缓存能够为明确界定存取数据的算法提升存取速度,而一级缓存则能够为一些不规则的算法提升存储器存取速度。在这些不规则算法中,事先并不知道数据地址。
对于图形渲染来说,重复或者固定的数据比较多,因此一般是划分48KB为共享缓存,当然剩下的16KB一级缓存也不是完全没用,它可以充当寄存器溢出的缓冲区,让寄存器能够实现不俗的性能提升。而在并行计算之中,一级缓存与共享缓存同样重要,它们可以让同一个线程块中的线程能够互相协作,从而促进了片上数 据广泛的重复利用并减少了片外的通信量。共享存储器是使许多高性能CUDA应用程序成为可能的重要促成因素。
GF100拥有一个768KB容量统一的二级高速缓存,该缓存可以为所有载入、存储以及纹理请求提供服务。二级缓存可在整个GPU中提供高效、高速的数据 共享。物理效果、光线追踪以及稀疏数据结构等事先不知道数据地址的算法在硬件高速缓存上的运行优势尤为明显。后期处理过滤器需要多个SM才能读取相同的数 据,该过滤器与存储器之间的距离更短,从而提升了带宽效率。
统一的共享式缓存比单独的缓存效率更高。在独享式缓存设计中,即使同一个缓存被多个指令预订,它也无法使用其它缓存中未贴图的部分。高速缓存的利用率将远低于它的理论带宽。GF100的统一共享式二级高速缓存可在不同请求之间动态地平衡负载,从而充分地利用缓存。二级高速缓存取代了之前GPU中的二级纹理 缓存、ROP缓存以及片上FIFO。
|