艰辛的路
在上期的ZOL显卡频道探索与发现节目中,我们已经讨论了AMD的CPU/GPU融合之路。作为前ATI以及现在的AMD在图形领域最老牌的竞争对手,NVIDIA的CPU/GPU统一之路又是怎样的呢?本期的探索与发现节目,就让我们从一个还未到来的产品,也就是Maxwell构架出发,重新审视一下NVIDIA,ARM以及CPU/GPU统一之路的发展吧。
● 艰辛的路
自G80开始,NVIDIA就选择了一条艰辛的道路。由于微软在DirectX 10中对GPU中ALU的开放,更加灵活的shader以及更加多样性的ALU应用就成了NVIDIA未来发展的基本路线。在G80中,NVIDIA选择了为ALU配备尽可能多的周边资源,减小传统的纹理和材质单元所占比例以及逐步将这些单元融入到SM中去的方案,并将这种方案在GT200中进一步进行了强化。在G80/GT200中,我们可以看到大量shared,Atomic等等与传统图形过程貌似关系不大的单元,他们挤占了相当多的晶体管资源。人们一度无法理解NVIDIA这么做究竟是为了什么。
我们在之前的探索与发现节目中曾经多次讨论过,图形操作中使用预制纹理虽然简便高效,但受限于开发者本身的水平界限,这种方式几乎永远不可能表达全部正确的效果。而使用shader对颜色和光线关系进行实时的运算则可以在最大限度上满足高互动性和高自由度的游戏环境下对图形真实性表达的需求,同时大幅降低预制烘焙材质的数量要求。所以,NVIDIA选择了shader而不是纹理作为未来的方向,力求配合业界在最大限度上保证用户能够拥有正确而又真实的游戏体验。
但是,由于来自PC游戏界、家用机平台,甚至是金融环境和命运的阻力,NVIDIA不得不正面面对图形业界停滞不前带来的冲击。这种停滞不前险些让NVIDIA为了自己致命的先进构架理想付出惨痛的代价。毕竟游戏中表现不出构架级的优势,然后又为了构架级的优势而背负沉重的功耗和晶体管负担,这种投入产出严重不符极易为浮躁的人们所诟病。
顾杰所写过的技术分析类文章索引(持续更新) | |
2、忠实微软是否有用 A/N统一构架细节分析 | |
CPU还是GPU,这是个问题
● CPU还是GPU,这是个问题
尽管困难重重,但NVIDIA还是选择了坚持,于是在GT200之后,我们看到了更加翻天覆地,同时也是将G80以来的构架路线最终引向明确方向的新构架——GF100。
代号Fermi的GF100构架最显著的特点,就是他的并行化模块设计以及过去只有CPU才有的诸多单元和功能,如多级Cache体系、统一定址、基于CTA(线程块)级别的Branch Predication(分支论断)和乱序执行等。
4组完全对等的GPC单元将整个GPU划分成了4个独立的可执行区域,GPC内部具备完整的warp scheduler、Instruction Dispatch Unit以及可以与shared和Tex Cache实时互换的L1 cache,GPC间可以通过L2 Cache进行通讯和协作,并统一通过最外围的GigaThread Engine进行平行调配。
这种大并行度的结构在动作方面颇像CPU的行事风格。当游戏中的像素等通过程序以kernel的形式出现时,GF100可以将不同的kernel同时分发给不同的GPC,GPC通过L2 Cache进行缓冲以及涉及分支或CS任务的数据共享,再辅以分支论断和乱序执行,整个GF100看上去就像一个经过了充分优化的4核CPU一样。
同样采用大并行度设计的I7处理器
这样的Fermi,到底是GPU还是CPU啊?难道说Fermi已经是一颗CPU级别的GPU了么?
码头工人与工厂蓝领
要搞清楚Fermi究竟还算不算是GPU,我们首先要从CPU和GPU的区别谈起。
GPU的动作方式从根本上来讲更像是一座码头,程序就是一个个在从货轮上卸下来的散件集装箱,集装箱进入码头物流之后会被放置在一片区域中等待吞吐,此时码头管理部门会根据需要指派装卸工人前往集装箱处将箱内的货物搬运出来。
尽管方式可能不尽相同,而且效率也未必一样,但每位工人每次只能搬运一件货物,而对于整个码头而言,它的在集散区所进行的功能也只有一个,那就是搬运和装卸。
相比来说,CPU则更像是一座完整的装备厂,每条流水线上的工人根据生产线需要完成单步任务,但整个工厂的功能却从组装到加工不一而足。
为了方便阅读,我在这里抹去了一些更加深入的定义,因此以上描述并不精确,但它依旧足够形象。CPU的深度流水线以及完整的配套资源保证了执行过程的足够丰富以及对自然代码的最大消化能力,单级流水线的GPU在这方面存在明显的欠缺。
Fermi看上去感觉和其他GPU存在很大区别,但本质上也依旧是个码头物流系统。4组GPC相当于把集散地划分成了完全独立的4块操作区域,在这些区域内有专门的物流管理员负责调配区域内的码头工人更加有效地进行组织,他们会根据工人的实际动作状况直接将任务进行分派。与此同时这些区域又统一受码头的统筹领导,码头会根据不同区域的繁忙程度决定下一批抵达集散地的货物的分派方式,空闲的区域将得到更多的货物,繁忙的区域得到相对少的货物。
尽管工作效率更高,但GPU依旧是一大群的码头工人,所做的简单工作在目前仍然无法与工厂蓝领进行直接的比较。
晶体管?晶体管!晶体管……
● 晶体管?晶体管!晶体管……
传统的GPU对任务的管理,就好像在集散地外面的大门口设立一个办公室,里面的管理者只根据货单上货物进港的前后顺序来机械的决定搬运工得最基本调配,位子就那么多,谁抢上就是谁的。搬运工进入集散地之后也没有区域性和组织性可言,谁跑到了地方谁就搬。这种管理模式显然效率低下,不仅货物得不到及时装卸,工人们也是怨声载道。
相比于低效粗放的其他构架,Fermi这种多层管理体系能够最大限度的提高单元的利用率。但这种设计也有其很大的缺陷——伴随着规模的放大,被用于管理的单元的复杂度将直线上升。
随着码头的不断扩大,要维持高效率的运作方式,码头管理方必须进一步将扩大的码头划分成更多区域,随着区域的增多,区域内的物流管理员也越来越多,码头对这些物流管理员的统筹安排也会变得日益复杂。尽管现在线程仲裁单元所耗费的晶体管并不多,但随着管理机制的多级化过程,被用来管理不同区域不同级别的晶体管将越来越多,如果维持现在的比例这么增长下去,迟早有一天线程仲裁管理机制所占用的晶体管将变得不可忽视,同时管理机制本身也会因为自身规模的膨胀而变得效率低下。
相对于使用多少晶体管,如何更有效率的使用晶体管才是现代计算机业界所应该注意的问题。单纯的堆砌资源不仅会导致结构的庞大臃肿,还会带来一连串诸如周边资源跟进困难等问题,最终导致单位效率的下降。因此,如何更高效率的使用晶体管,用更少的资源办更多的事情才是硬件发展的正确道路。
如果是码头的话,我们可以成立一间管理公司,把所有物流管理业务全部独立到公司旗下,以专业的管理手段更加高效的进行运作。这样不仅能够在进一步提升码头物流的管理效率,还可以通过新公司的引进为码头带来更多的业务拓展的可能。码头可以如此,GPU也可以么?
模拟地球?这不是开玩笑
● 模拟地球?这不是开玩笑
把GPU的管理机制独立成单独的专门结构,究竟要怎么做才能既不浪费晶体管又能提高效率,最好还能保留拓展一下GPU业务范围的可能呢?答案其实早在几年前就已经有了,他就是号称能够模拟地球的夸张CPU——Cell。
Cell构架的异构管理模式曾经在业界引起轰动。其构架由1枚负责管理的PPE和8个负责运算的SPE组成,PPE为一颗常规的64bit CPU,专门负责线程的发放和任务的管理,同时负责相对简单的整数操作处理。8个对等独立的SPE则几乎完全是向量浮点处理单元,除大量寄存器之外每个SPE还独享256K Cache。Cell的这种通过将管理单元和运算单元剥离开来的做法既让管理过程统一在了PPE旗下,提高效率的同时又解开了SPE单元的束缚,使其能够尽可能专一的从事更大规模的浮点和向量运算及操作。
独立管理机制以及全力强化执行部分的异构式设计让Cell拥有了恐怖的运算能力和实际表现,Cell的理论吞吐能力不仅大幅领先于当时一切CPU,甚至在面对今天的各种多核处理器时也依旧保持了一定的优势。
2009年度全球最快的超级计算机Roadrunner就是使用Cell搭建起来的,凭借Cell的恐怖运算能力,Roadrunner成为世界上第一台运算能力突破1P flops的超级计算机。
Cell在民用领域也大放异彩,由于使用了Cell处理器,PS3甚至具备了执行更高级特效的条件,尽管它的显卡相对于对手并不先进,但Cell具备的恐怖执行能力让其拥有了Deferred Shading和其他更加先进的shader的条件,这让它在与竞争对手的博弈中取得了面向未来的先机。
说Cell能够渲染地球,其实一点都没错。
向左还是向右
● 向左还是向右
既然有了Cell的成功范例,那我们直接在构架中引入一颗威武的CPU,全权负责起整个体系的任务分派管理不就好了。别废话了,快动手干吧。
诚然,GPU里到处都是浮点能力强劲的ALU团簇,引入一颗CPU来取代现有的管理机制确实能够让GPU在最大限度上达到Cell相同的效果。但这事情却没办法说干就干,因为与CELL不同的是,GPU本身的ALU团簇规模太过巨大。单颗Cell的具备8个SPE单元,理论运算能力仅仅2.300G flops,而一颗Fermi内部集成了512个全功能ALU,总浮点运算能力超过1.5T flops。如此庞然大物,管理机制所要应对的负担可不是Cell里面那8个SPE单元能够比拟的。同时,由于巨大的规模,GPU拥有了远高于常规CPU的发热和功耗,如果动用一颗常规的CPU,在动辄300W的功耗怪物里再塞上一个哪怕只有6、70W的集成电路,对整颗芯片的可制造性以及可使用性来说都将是一场空前的灾难。
另外,如果使用常规CPU,NVIDIA还要面对另一个异常棘手的问题——X86授权。融入到GPU构架中的这枚CPU显然不可能通过采购的方式从INTEL或者AMD手中直接购买,而如果要自己在构架中添加,就必须要获得X86协议的授权。联想到INTEL与AMD在X86授权问题上长达几十年的风风雨雨,NVIDIA显然不会贸然去趟这潭浑水。
NVIDIA并非研究通用处理器起家的企业,手里并没有任何现成的通用处理器或者构架体系,所以摆在面前的最合理选择就是寻找一个能够在低功耗下表现出优异,同时又可以绕开X86授权问题,最后还要可以跟已有的GPU方便融合的成熟构架。
NVIDIA最终的选择,是ARM。
ARM全称Advanced RISC Machine,由同名公司开发。顾名思义,ARM是一个基于RISC的构架体系,多用于嵌入式系统以及对功耗敏感的移动场合,它的最大特点是采用精简指令集体系。 精简指令集的设计思路基于一条重要的实验结果,即计算机中80%的操作被20%的指令集执行着。随着编译器功能的日趋强大以及应用的日益广泛,原先针对汇编语言存在的大量CISC中的指令,比如正交寻址或者index等的应用现在已经几近绝迹,砍掉这部分指令显然有助于处理器的减肥。另外,伴随着处理器与内存频率的分道扬镳,处理器内部需要更多的寄存器和缓存来应对延迟差异,精简指令集有助于为这些缓存和寄存器腾出更多的空间。 RISC的影响力是如此之大,以至于基于CISC结构的X86 CPU内核在Pentium Pro之后也实现了RISC化,仅在外部维持CISC结构以保证对传统指令的接受度,并通过专门的译码机构完成指令的翻译。大名鼎鼎的出现在CORE上的PARROT结构,即冷热指令分开的设计理念,也是受RISC影响而产生的。 作为一家研发公司,ARM公司在传统的RISC指令集的基础上扩展了Thumb、Thumb-2、ThumbEE以及NEON等全新指令集,进一步提升了ARM构架的处理能力和效率。于此同时,ARM并没有采取与INTEL类似的近乎于全封闭式的指令集管理体制。ARM构架的授权方式多种多样,任何公司都可以通过小到某项特定技术内核(IP core)大到整个核心的授权来进行对应的开发、生产以及采购。如果某公司希望能够将ARM构架纳入到自己本来已有的构架,ARM公司还能够提供一切必要的技术支持,比如编译器、开发平台以及开发者工具等。 简单地说,ARM的授权形式类似生产合作社,任何公司都可以通过购买授权来获得ARM的使用或者开发权,ARM公司保有对整个构架的权力,新开发的对ARM构架的改进产品原则上归双方同时所有。这是一种比较昂贵但同时开放而且自由度极高的授权模式。ARM的前世今生
带宽?带宽!带宽……
● 带宽?带宽!带宽……
为什么是ARM?ARM构架的CPU有什么吸引NVIDIA的地方呢?除了获取方便以外,ARM构架本身的一个重要特性也成了NVIDIA选择他的一大重要原因,那就是对内存带宽和内存并联度的极高要求。
长期以来RISC构架都面临着一个问题,当要处理的任务相对简单重复时,RISC由于精简所导致的重复指令增多会使得处理器需要频繁访问内存,这导致了RISC对内存带宽的敏感问题。如果不能提供充足的内存带宽,由这些指令拥塞所导致的巨大延迟对性能的影响甚至是致命的。
与此同时,在进化到V7核心之后,为了取得更好的性能功耗比,ARM构架抛弃了冯诺依曼结构,全面转向了哈佛结构。哈佛结构的数据和指令总线是分开的,分开的总线使得一些在冯诺依曼结构中必须串行执行的操作,比如load/write可以并行执行,这虽然提高了系统的执行效率,但也使得ARM构架对内存带宽变得更为敏感,甚至还对内存并联度提出了新的苛刻的要求。
可以说,内存带宽已经成了制约ARM前进的一个重要因素。虽然MMU的出现以及更多内存使用途径的出现在一定程度上缓解了问题,同时ARM针对的嵌入式及移动设备应用对性能的要求也不是非常敏感,但这些都无法掩盖内存对ARM构架发展的影响。如果无法突破内存带宽瓶颈,ARM将注定只能在低性能低功耗的场合出现。
带宽成了限制ARM性能的制约因素,这与NVIDIA以及GPU又有什么关系呢?打开现代GPU的构架图,你就会轻易的找到答案了。
以Fermi构架为例,NVIDIA为Fermi构架提供了384bit的MC,由板卡上本地显存提供的显存带宽高达近200G/S,这远远领先于一般CPU或嵌入式系统所能够提供的几G到十几G不等的内存带宽水平。与此同时,Fermi的MC分为6路,这是天然的并行内存管理形态。如果NVIDIA在未来提供8路64bit MC以及更高速显存的方案,其GPU所能够提供的内存带宽将突破300G/S,这是任何CPU都无法想象的天国状态。
GF110提供了192.4GB/s的恐怖带宽
将ARM构架的CPU挂在GPU构架中,通过共享GPU的MC可以轻易获得让任何CPU都羡慕不已的巨大内存带宽,从而释放长期以来一直处在压抑状态的ARM构架的性能。这就是NVIDIA很早之前就开始了ARM构架的相关研究,并最终选择将其纳入到图形构架中的原因。
图形还是计算,这又是个问题
好了,我们现在已经知道了事情的起因以及经过,对于结果也应该有所了解了。NVIDIA公布的路线图中,其Maxwell构架会正式将代号Denver的ARM处理器纳入其中,随后NVIDIA更公布了Denver处理器的先期核心照,从照片中我们可以清楚地看到一款典型的ARM构架的处理器,不论是整体布局还是那招牌一般的MMU单元,Denver处理器在想我们诉说着它ARM构架的身世。
既然Maxwell集成ARM的处理器,下面这个问题就是我们不得不面对的了——集成一颗具备完整执行能力的CPU,究竟是为了什么?
也许很多人一看到这个命题就会很自然而然的向通用计算方向去联想,一颗完整执行能力而且功耗很低的CPU,肯定会帮助NVIDIA进一步打开通用计算市场,同时一般桌面用户也将非常无奈的再次背负与自己毫无干系的通用计算能力所带来的成本。NVIDIA,你太没有道德了。
事实确实如此吗?
我们在之前的文章,如《曝你不知道的DX11 解析GPU通用计算妙用》等之中已经多次进行过讨论了——随着DirectX 11的登场,GPU通用计算能力与图形能力之间的界限已经极其模糊了,Compute Shader这种灵活的纯数学型应用对图形构架的通用计算能力有了极高的要求,通过Compute Shader所带来的近乎于无限的可能性,透过通用计算提升的画面质量以及执行效率将成为用户对游戏新体验的开始。与此同时,比较传统的shader一样可以从更加强劲的线程调度和任务发放管理体系中获得很大的好处。
换句话说,图形还是计算,这在DirectX 11应用日趋广泛的今天以及未来已经不再是一个问题了。计算就是图形,图形就是计算。
一颗?两颗?
● 一颗?两颗?
接下来的问题将更加本质也更加的“危险”——将ARM或者说通用处理器纳入到GPU体系中,会不会意味着NVIDIA动了进入通用处理器市场,瓜分INTEL,AMD甚至IBM一杯羹的念头呢?
其实通过前面的分析我们不难发现,ARM构架的引进从根源上来讲还是为了提升图形构架的执行能力。尽管对通用计算端来说,Denver的引入无疑会极大的强化整个体系的表现,进而加强GPU在HPC领域的影响力。但从根源上来说,Maxwell仍然是一颗GPU,图形处理才是它的本职工作。Denver的加入,完全可以看作是对DirectX 11以及Compute Shader的一种积极的回应。
尽管有不少现象似乎都将事情指向了NVIDIA希望进入通用处理器领域,比如Windows8中加入了对ARM构架的支持等。但请诸位相信,在可以预期的未来,或者说截止到Maxwell这一代,NVIDIA还不会大举进入桌面通用处理器领域,我们的电脑不会出现得既能够提供图形加速又能够保证你完美运行一切软件的NVIDIA牌超级处理器。
NVIDIA依旧在专心做显卡,而未来统治我们电脑的,也还会是两颗芯片。
他们如何看待NVIDIA的野望
● 他们如何看待NVIDIA的野望
尽管从NVIDIA的角度来说,在Maxwell之前还不会有任何进入通用处理器领域,,甚至通过GPU取而代之的可能。但它的竞争对手们会不会跟着这么想呢?
作为统一的一种表现形式,NVIDIA将ARM处理器纳入到GPU中,本身就意味着近乎于无限的可能。如果NVIDIA真的打算在未来的某一天进军通用处理器市场,那他只需要强化当时可能已经十分强大的ARM核心,然后充分发挥原有的ALU团簇的浮点处理能力,将GPU变成一颗野兽级的Cell型处理器。毕竟从来没有人为带宽饥渴型的ARM构架提供过如此夸张的内存带宽,Denver进入GPU之后能够产生多么恐怖的效应目前除了NVIDIA之外还没人知晓。这种危险的可能性不可能不引起老牌通用处理器供应商,也就是INTEL和AMD的注意。
我们在前一期探索与发现节目中已经介绍了AMD的融合之路,不难看出AMD正在通过对GPU及其中ALU的应用,为未来自家通用处理器的性能发展和应用领域的拓展铺平道路。AMD有所准备,那INTEL呢?INTEL在CPU与GPU的统一之路上都进行了哪些努力,INTEL、AMD以及NVIDIA三家的CPU/GPU统一之路有何异同,彼此之间又会产生怎样的影响呢?在下期的探索与发现节目中我们将会继续为您揭晓。