前言:这曾经是一场一个人的长跑,因为最初的狂妄,绝顶高手的它一不留神便步入了无边的迷雾当中。在绵延4年半的漫长时间里,它孤独的在雾中奔跑着,向前看不到方向,左右也没有对手作伴,甚至连来时的路都被迷茫所吞噬。尽管命运在冥冥中以家用机铺就的道路守护了它,一次又一次的让它避开了万丈深渊,但这条路现在正在变得越来越模糊,显然已经走到了尽头。
但是它毕竟是一个绝顶高手,所以不管走多少弯路,不管多少次错过了近在咫尺的光明出路,最终它还是凭借自己的实力拨云见天,重新在迷途中找到属于自己的路。现在,它已经走出了迷雾的包围,重新追上了对手的脚步,甚至已经准备好了全新的探索。
它就是AMD,而它最终拂去迷雾的工具,叫Tahiti。
2011年12月22日,AMD面向全球纸面发布具有颠覆性的全新图形构架——基于GCN体系的Tahiti,对应的产品为全新的HD7900。HD7900显卡已经抵达ZOL显卡频道,由于NDA的限制,我们目前还不能透露Tahiti构架的具体性能测试结果,但我们可以向你保证的是,Tahiti构架拥有好于前代产品很多的DirectX 11性能以及通用计算性能,其构架的革新程度,完全颠覆了AMD固守了5年之久的构架发展方向。
Tahiti构架有着怎样的特点?它为何会颠覆AMD坚持了长达近5年的传统?是什么让它具备了为AMD重新指引方向和道路的能力?它对未来又有着怎样深远的影响呢?通过对本文的阅读,你将可以获得这些问题的答案。
顾杰所写过的技术分析类文章索引(持续更新)
● 这就是Tahiti
Tahiti构架的第一次露面是在半年前,2011年6月15日,AMD在AMD Fusion开发者峰会上向与会的700多名开发者和PC业界高管们展示了其全新GPU架构的诸多细节,这款代号Graphics Core Next的全新图形构架,就是我们今天看到的构成HD7900系列显卡的基础。
除去视频处理、PCI-Express总线管理以及多屏输出等与单纯图形过程关联不大的部分之外,Tahiti构架由三个主要的部分组成:
1、包含了几何引擎、光栅化引擎以及一级线程管理机制的前端ACE( Asynchronous Compute Engine)。
2、负责处理运算任务及Pixel Shader的CU(Compute Unit)集群,负责处理材质以及特种运算任务如卷积、快速傅里叶变换等的Texture Array,二级线程管理机制以及与它们对应的shared+unified cache等缓冲体系。
3,、负责完成fillrate过程以及输出最终画面的ROP阵列,显存控制器MC(Memory Controller)。
Tahiti构架总览
相对于前代的Cayman构架,Tahiti构架的结构有了诸多触及灵魂深处的改动,这些改动不仅为当下的HD7900提升性能做出了贡献,更为AMD未来的GPU构架发展拨开了重重的迷雾,打开了通往正确道路的大门。接下来,就让我们一起看看Tahiti上这些意义深远的构架特性吧。
● 双头蛇:Dual ACE
ACE全称Asynchronous Compute Engine,译为异步计算引擎。作为AMD GPU最前端的组成部分,它的实际作用其实与几何以及光栅化等图形过程并没有直接的联系。ACE的实际工作,在于在整个GPU的最前端管理任务队列,将线程块规整的分发给后面的ALU团簇。ACE是所有GPU任务的起点,它的存在和表现直接关系到了GPU进行图形及通用计算任务是的效率表现。
Tahiti构架Dual ACE细节
由于ACE与几何引擎直接相连,同时也在一定程度上决定了构架的多边形搏出能力,因此我们可以笼统的把它理解成前端/几何引擎与线程管理机制的结合体。Tahiti中的Dual ACE不仅改变了RV870构架几何性能较弱的局面,更为AMD向并行处理构架的进化打开了大门。
Daul ACE首次出现于Cayman构架,区别于传统的AMD构架,Cayman拥有了第二套完整的光栅化-几何处理单元阵列,该阵列拥有Rasterizer、Hierarchical-Z以及Tessellator/Germetry等全部的前端资源体系,与原有的前端部分完全对等,并且与流水线中的线程仲裁器UTDP直接对应。
Cayman构架的Dual ACE
Dual ACE的价值是显而易见的,它让Cayman拥有了双倍于RV870的几何处理能力,这极大地改善了RV870在面对曲面细分等领域时的表现。同时,由于单位周期的三角形搏出能力也从1个提升到了2个,Dual ACE的出现让Crysis这样对于传统多变形输出能力有很大需求的游戏也能获益。最后,更快的光栅化处理能力带来了更快的坐标变换和像素化速度,这降低了后续流水线步骤的等待延迟,从而为最低帧表现的提升提供了帮助。
Tahiti大幅提升的曲面细分性能
Cayman中Dual ACE的表现,让AMD看到了提升体系线程管理能力以及宏观并行度的好处,因此在Tahiti构架中,AMD对ACE进行了进一步的强化。根据AMD公布的数据,Tahiti构架拥有了4倍于Cayman的曲面细分能力,同时通用计算性能也有了长足的进步,这从侧面表明Tahiti构架的线程能力较之Cayman有了更进一步的提升。
● Compute Unit,"Compute" Unit
Tahiti构架最大的改进来自ALU集群部分。与传统AMD构架的VLIW结构ALU团簇不同,Tahiti构架的ALU集群撤消了来自超长字节指令的限定,所有ALU全部以SIMD的形式来完成吞吐,不再需要打包和解包的过程。
在Tahiti构架中,ALU团簇的名称从VLIW SIMD变成了Compute Unit,名称的改变不仅标志着功能及用途的变迁,更暗示了内部结构的方向性变化。Tahiti拥有32个CU单元,CU内部包含4组SIMD CORE,每组SIMD CORE由16个标准Vector ALU构成,所以Tahiti的一个CU单元拥有64个Vector ALU,32个CU单元合计拥有2048个Vector ALU。
Tahiti构架CU结构细节
除了负责浮点吞吐的SIMD CORE之外,Tahiti构架的每个CU单元还拥有在一个Scalar Unit,Scalar单元中包含Int ALU单元,可以用来处理整数指令以及特殊函数。另外,对线程效率至关重要的原子操作(Atomic)也在该单元中执行。
除了运算单元外,Tahiti构架的每个CU还绑定了由Branch和Scheduler构成的二级线程控制机制,以及一个完整的Texture Array,Texture Array的作用与传统AMD构架中的TMU基本相同,包含了完整的Texture Fetch Load/Store Unit以及Texture Filter Unit。
CU进行wavefront吞吐示意
由此不难看出,Tahiti构架CU单元的结构在逻辑层面上已经与Fermi构架的SM单元几乎完全一样了。两者均由浮点吞吐部分(Tahiti的Vector ALU团簇,NVIDIA的SP单元集群),整数、特殊函数及原子操作部分(Tahiti的Scalar Unit,Fermi的SFU),二级线程控制机制(双方的Scheduler等)以及完整的Texture Array组成,甚至双方每一个运算单元(Tahiti的Vector ALU,NVIDIA的SP单元)都拥有完全相同的4K寄存器。一个CU/SM就是一个独立的处理单元,能够面对一个标准的指令集群或者说线程块,也就是AMD的wavefront以及NVIDIA的warp。Tahiti的CU能够在一个周期内处理一个64线程的wavefront,这与Fermi一个周期处理一个32线程的warp是相同的,但AMD目前上不存在类似half warp的线程块子划分机制。
Tahiti支持WinZip最新版带来的Open CL加速
更新之后的CU单元在计算能力和效率方面有了长足的进步,不仅令Compute Shader处理能力大幅提升,进而提升了GPU在DirectX 11环境下的图形性能,而且在通用计算领域也获得了更加广阔的前景和更多样化的发展可能。因此称其为“Compute” Unit,完全在情理之中。
● 不止是统一的缓冲体系
Tahiti另一个巨大的改进,来自缓冲体系的大幅调整。Tahiti构架的缓冲体系不仅对原有的GDS以及LDS等Shared资源进行了调整和重新布置,更引入了非常重要的多级unified cache。
不同于传统的被所有VLIW CORE共享使用的整体GDS,Tahiti构架的每个CU拥有独立的32K GDS(Golbal Data Share),这个尺寸完全符合微软在DirectX 11中的硬性规定。其中可以划分出16K作为L1 Data cache,Tahiti构架的多级cache体系属于包含式结构,L2保存了全部的L1数据且能够允许L1数据进行回写,结合AMD的官方描述,我们认为在宏观范围内Tahiti的Shared存在32K GDS+0K L1 Data cache+16K L2 Data cache或者16K GDS+16K L1 Data cache两种组合方式。
Tahiti构架缓冲体系
除了GDS+L1共享构成的以及缓冲体系,Tahiti构架的每个CU还拥有独享的LDS(Local Data Share),LDS在RV770以后的AMD构架中均有出现并为所有VLIW CORE共享,而此次在Tahiti中,LDS与GDS一样被打散到了每一个CU中,变成了专享的二级补充Shared。
除了一级缓冲和Shared,Tahiti的CU单元还拥有共享的L1 Instruction cache和Kernel cache,每4个CU共享16K的L1 Instruction cache和32K的Kernel cache。
Tahiti构架缓冲体系细节(引自后藤弘茂blog)
最后,Tahiti构架拥有沟通上级缓冲与显存的L2 Data cache,L2 cache与MC一一对应,因此Tahiti共拥有6组合计768K的L2 cache。L2 cache面向所有CU中的单元开放,ALU可以用它缓冲数据,TMU也可以用它充当Texture cache。
Fermi构架缓冲与单元的关系
整体来说,Tahiti的缓冲体系与Fermi存在极大的相似度,无论是可共享/切换的一级Shared/L1机制,还是面向所有单元并可以同时充当Texture cache的L2,Tahiti与Fermi在缓冲体上都已经处在了一致的状态。两者最大的区别,在于Tahiti采用了指令和数据缓存分离的方式,同时在L1与Shared的切换方式及尺寸上与Fermi存在差异。
● 悲喜剧的舞台:单元复用率
继续强化Dual ACE,完全放弃VLIW体系以及引入unified cache,甚至全线开始了向NVIDIA的Fermi构架的靠拢,这些举措让Tahiti构架成了近5年来最具颠覆性的AMD图形构架。Tahiti构架上进行的诸多改进,无论从意义上还是从程度上均超越了自R600以来5代图形构架改进的总和,我们甚至可以用“出色”以及“精彩”来形容我们第一次看到它时的感受。那究竟是什么促成了这种改进的到来呢?
答案很直接——这一切的改进,都是为了提升GPU的单元复用率。
不同的吞吐类型影响着单元的复用率(图片引自后藤弘茂blog)
所谓单元复用率,指的是在单位周期内运算单元可以重复进行第二次动作的平均几率,单元复用率越高,单位周期内单元的平均等待周期也就越短,单元能够进行第二次动作的概率也就越高。
构架的单元复用率由很多要素决定,构架各部件的规模比例、体系并行度、线程管理能力、运算单元的吞吐方式、寄存器总量及延迟、shared的总量和分布方式,甚至是否拥有unified cache等等都会从根本上影响到构架的单元复用率。常规来说,单元的总规模越大,其效率受单元复用率的影响也就越明显。因此很自然的,GPU内部最需要注意单元复用率的部分,就是规模占比最大的ALU集群部分。构架的并行度以及线程管理能力越强,单元获得任务的效率也就越高;吞吐限制越小,单元能够无差别获取指令的机会也就越大;缓冲资源的量以及操作灵活度越丰富,单元越能够从近存近取以及快存快取中获得好处,耗费在中间过程的等待周期也就越短;因此充分强化这三个要素,ALU集群的单元复用率也就会越高。
资源搭配相对合理的Fermi芯片
单元复用率决定着整个GPU构架的执行效率,构架的单元复用率越高,代表它消耗在等待上的平均时间周期越短,单位时间内动作单元的密度也越大,等待的时间短,动作的机会多,单位周期内能够被执行的线程和指令自然也就越多。作为ALU集群部分,更高的单元复用率意味着更快速的Shader处理能力,意味着单位时间内更多的运算能力被有效的利用起来,自然也就意味着更好的图形性能。
Tahiti构架为我们准备了许多惊喜
Tahiti所有的改进,几乎都围绕着单元复用率展开,而AMD长达近5年的孤独长跑、一直拿不出手的通用计算性能还有已经逐渐暴露出来的Compute Shader性能问题,基本上也都与单元复用率有关。究竟是什么让AMD在单元复用率层面上遇到了这样或者那样的问题?AMD在这5年里又经历了怎样曲折艰难的探索和突围之路呢?
这一切的开端,要从非常著名的R600说起。
● 吞吐与DirectX 9
初时,将AMD诱入到重重迷雾中的,其实是强盛所带来的自负。
从Shader结构上来看,DirectX 9.0C为止的Shader Modle 3.0代码基本上都维持了规整的4D形态,即便很多像素的改动和操作并不需要触及全部的RGBA,尽管存在挣脱这种编程格式束缚的需求,但当时的程序员们确实习惯了根据微软设置的限制或者说“保护”,来对所有的Shader代码进行最彻底的几何关联。4D指令虽然灵活度欠佳,但却可以方便当时的硬件进行吞吐,而且因为结构本身以及Shader Modle 3.0编程特色,吞吐量在当时几乎可以等效为当时硬件的Shader性能。在这种环境下,被AMD收购之前的ATI推出的R580很自然的以其强劲的吞吐能力而获得了渴望获得性能的用户和业者的一片好评和赞誉。
强调浮点吞吐,拥有“3:1构架”的R580
AMD在CPU界可谓久经沙场,但在当时还只能算是个图形界新丁。接收了ATI的AMD看到了R580与DirectX 9.0C需求的高契合度,同时也注意到了DirectX 9.0C的广受欢迎以及顽强生命力,再加上长期以来由Athlon64所积累的自负,这些要素都让AMD产生了一个极其危险的错觉——尽管还不知道全新的DirectX 10以及微软未来对图形操作方式的发展方向,但以AMD的影响力,是完全可以影响程序员的编程习惯和需求导向的,所以只需要按照自己的预测或者说期待去制作硬件,只要做的出来就应该不用愁卖不动。
于是,以ILP需求为基础的R600,用一块叫VLIW的糖果,非常轻松的便将AMD诱入了一片深重的迷雾当中……
漫长迷茫的开始——R600构架
R600最大的特点,在于依旧以DirectX 9.0C的Shader Programs或者说浮点指令吞吐量为设计基准,我们甚至可以认为它是一颗仅仅对DirectX 10进行了寄存器及特性需求支持的DirectX 9.0C显卡。VLIW(Very long instruction word,超长字节指令)结构的ALU团簇以及编程需求是R600的灵魂,如果指令之间能够完全无关并且以超长字节的形式进行打包,那么R600将会发挥出令人生畏浮点吞吐能力。而如果程序端真正做到了AMD期待的强烈的ILP倾向,那图形构架根本就不需要太多的线程仲裁机制以及缓冲资源,只需要不停地规律的吞吐即可。所以R600也不具备优势性的线程管理机制以及Shared等缓冲资源。
这世界上的万事万物都是平衡的,当你能够从某个事物中获得好处时,你必定会为此支付相应的代价。我们在先前的多篇文章中都曾经介绍过,VLIW能够带来极高的吞吐能力提升,但代价便是指令的无关性以及单元复用率的负担。事实上现实中的指令,无论是图形还是通用计算方面的,在绝大多数情况下都不可能做到VLIW要求的无关性。进入到以1D及分支逐渐增多的DirectX 10以及通用计算环境之后,R600及其之后的衍生物构架所面临的常见的场景,往往是一个VLIW中包含着两个甚至更多存在条件关联的指令,以前条指令结果作为初始条件的后条指令需要付出更多的周期来等待前条指令的执行完毕,而更多的周期,则被浪费在了这种等待以及相关的打包/解包过程之中。
VLIW吞吐模式
没错,在等待这样一个非运算活动的时间里,以微观的眼光来看,相当多的运算单元实际上是处在闲置状态的。
过分强调ILP,甚至妄图以自己的影响力逼迫程序员们在程序编写端就范,将吞吐和传统Shader能力发挥到了极限而忽略了材质端的表现,甚至为了满足和进一步强化吞吐带宽的需求而不惜使用总延迟远远大于Crossbar的Ringbus总线的R600,最终倒在了自己的狂妄之上,同时也将AMD拉入了浓浓迷雾之中。最终的实际性能表明,R600低落的的单元复用率令其理论运算性能完全无法得到发挥,而VLIW以及吞吐,也在今后成了禁锢和束缚AMD的枷锁。究竟怎样做才能有效的提升构架的整体性能,成了困扰AMD最大的问题。
● 该死的浪费
以宏观角度来看,单元复用率其实可以被等效成单位时间内整个构架的有效动作总次数。当单元数量一定时,复用率越高的构架在单位时间内能够进行的总动作次数也就更高,对应的性能也就更加出色。那对于单元复用率较低的构架来说,就完全没有机会快速的提升性能了么?
有机会,而且实现方式相当简单直接——只要大量增加总单元数,便可以弥补效率方面的不足,在构架的单元复用率无法大幅提升的前提下直接等效的增加单位时间内能够进行的总动作次数。换个通俗的台词,那就是直接释放GPU的规模,用数量弥补质量。
以释放规模来增加构架有效动作总次数的RV770
通过RV670的瘦身,AMD推出了ALU规模放大250%同时以大带宽显存来满足吞吐的RV770。大幅增加的ALU总数让R600衍生物的有效动作总次数第一次有了极大的起色,与此同时,RV770还直面了缓冲资源不足的问题,在构架中引入了LDS这样的二级公用Shared资源作为ALU的释放缓冲。两种手段从总有效动作数和单元复用率两个层面同时下手,最终为RV770带来了相当不错的性能。
RV770构架细节
RV770的成功让AMD恢复了底气,但同时其在通用计算端依旧羸弱的表现也将另一个事实暴露了出来。直接放大运算资源虽然简单有效,甚至不需要对构架深层次的要素进行重塑,但当程序对ALU灵活度的需求有了质的提升的时候,以大幅增加单元总数来换取单位时间内的有效动作总次数的做法将随着单元绝对数量的激增而变得代价巨大,甚至还会因为庞大规模带来的“惯性”而将构架推向更加不灵活的方向。著名的天河一号超级计算机抛弃4870X2的事件,就直接反映了AMD这种以释放规模来应对复用率低下的手段所带来的诸如灵活度极差之类的种种问题。提升总动作次数来变相弥补单元复用率造成的问题并不是万灵药,它不能帮助AMD最终走出迷雾并重新找回前进的方向,只有最终提升构架的单元复用率,才是唯一有效的出路。
因为可用度实在过低而抛弃了4870X2的天河一号
自R600以后,在迷雾中艰难前行,并通过临时手段化解了种种危机的AMD,在等待了3代产品之后终于迎来了拨云见天的契机——DirectX 11来了。以大量直接的常规数学应用来强调单元灵活性,并将通用计算与图形计算完美结合的Compute Shader的出现,为所有参与桌面图形芯片设计的人指明了由微软划定的未来发展方向。这给AMD带来了改良自己构架,重新将单元复用率作为突出重点的机会。
但最终,我们看到的却是RV870。
RV870几乎完全是R600+RV770的翻版,它在RV770的基础上将ALU资源再次提升了100%,并提升了其他诸如材质单元以及ROP单元之类的与图形联系更加紧密的部分的资源总量。而对于DirectX 11特性的支持,仅停留在寄存器达标以及一级Shared扩大到了DirectX 11的硬性规定而已。除此之外,你完全看不到一丝一毫希望提升单元复用率的努力。
RV870构架细节,记住这该死的浪费吧……
RV870就好像浓雾中一条走起来好像很舒适,但实际上却通往无底深渊的道路。虽然通过快速的节奏,RV870让AMD成功抢占了市场的真空期并扩大了自己的短期份额,但同时也让AMD丢失了极为珍贵的转身以及再次拾取方向的机会。作为第一代DirectX 11芯片,RV870并没有在提升单元复用率方面进行任何努力,这不仅令其丧失了重要的收集DirectX 11需求的机会,错过了进入通用计算及HPC市场的第二次时机,还为AMD的整个DirectX 11时代划上了一根过低的D线。RV870对AMD后世芯片的影响是极其恶劣的,本来应该可以冲出阴霾的AMD,在RV870之后却反而在迷雾中越走越深,越来越接近危险的边缘了。
浪费,这简直就是该死的浪费……
● 只要肯改,就是好样的
我们可以肯定AMD并不是不知道单元复用率问题的所在,RV870的失误或者说倒退并非源自技术积累和技术选择方面的失误,否则AMD也不会在RV870取得了看起来相当大的成功的时候选择转身掉头。
我们在前页提到过,以单元的绝对数量激增来换取单位时间内有效动作总次数是一种治标不治本的方法。它虽然能够在短期内弥补单元复用率不足带来的性能需求压力,但也随之带来了单元绝对数量的激增。假定每次都需要提升最少100%的总规模才能弥补单元复用率带来的不足,那么RV870之后如果继续采用这种策略,接下来的AMD构架将需要3200个ALU单元才能够满足需求。更何况实际上随着单位绝对数量的激增,每个单元增加所带来的弥补将会被规模庞大的数量所带来的新的复用率问题所拖累,因此实际上如果要继续维持旺盛的性能增长,所需要的ALU规模增量将肯定要大于100%。无论是互联线长还是晶体管总量,这都已经远远超过了当时乃至现在所能够承受的极限。
RV870愚蠢地坚持VLIW等问题,严重的影响了AMD后续的构架改革
另一方面,靠单元激增来换取性能的方法,在面对Compute Shader的需求时也显得效果极其有限。RV870的确拥有相当不错的DirectX 9及DirectX 10性能,其功耗发热方面更是可圈可点,但在面对DirectX 11需求,尤其是越来越“真实”的DirectX 11需求时,RV870表现出了令人吃惊却又是情理之中的羸弱。以地铁2033以及当时即将出现的寒霜2引擎为代表的新一代DirectX 11应用,将Compute Shader的作用以及对构架数学能力的需求越来越清楚的表现了出来,RV870单元复用率低下所带来的不错的功耗发热表现,在无法满足实际需求的绝对性能面前也显得不再那么有说服力了。
可制造性方面的沉重负担和需求的日渐明显,让AMD意识到了危险的存在,是时候做一些实际的工作来提升构架的单元复用率,进而开始将自己导向正确的道路上了。
做出艰难转身的Cayman构架
09年末到来的Cayman构架,是AMD近年来意义最重大的构架改变。Cayman构架第一次引入了Dual ACE引擎,为整个构架引入了更加充沛的线程管理能力,并在AMD构架中首次引入了宏观并行度这一概念。除此之外,Cayman还将传统的VLIW 5体系修正成了VLIW 4,更加宽松的超长字节指令打包规则以及更小的体积,让新的ALU团簇和程序端同时获得了一定的解放。在此基础上,Cayman还进一步完善了LDS的读写和操作方式。更好的线程管理能力、更小的吞吐限制以及更加灵活充沛的缓冲资源,三个与单元复用率息息相关的要素的改进让Cayman拥有了比过去更好的单元复用率。
对VLIW的改革提升了单元复用率
受限于RV870过低D线带来的恶劣影响,Cayman无法拥有过大的芯片面积,因为种种原因并未彻底抛却VLIW以及并不彻底的宏观并行度改进也最终令Cayman在单元复用率方面没能出现质的飞跃,这些要素在一定程度上都限定了Cayman的图形性能表现。但其在DirectX 11领域,尤其是Compute Shader应用层面的进步,以及通用计算层面的提升还是让所有人都看到了希望的曙光。
我们都清楚万事开头难的道理,不管这一步迈的多么艰难,只要能迈出第一步,就应该获得肯定和喝彩。正是这艰难的第一步,最终造就了我们今天看到的Tahti构架。
● 没错,这就是Tahiti
如果说Cayman的表现为AMD找到了前进的方向,那么Tahiti的出现,就可以被看做是AMD沿着这条路一直走下去的重要标志了。因为Tahiti的诸多改进不仅延续了Cayman的大方向,更第一次相当直接的将所有改进的目的非常明确的集中到了单元复用率的身上。
Tahiti系列构架代号南方群岛
在Tahiti构架中,AMD彻底放弃了简单粗暴的扩充法,改为从构架的逻辑层面着手努力来寻找更优秀的构架设计方案。其最主要的改进,包括前面提到的撅弃VLIW、进一步改进线程能力以及全面引入unified cache,几乎已经让AMD走出了长达五年的迷途。
改进Dual ACE并进一步加强线程管理能力,为Tahiti构架带来了更加强大的线程管理能力,与此同时,每一个CU中增加的二级线程管理机制,也让Tahiti拥有了密度上与Fermi相当,理论总量上甚至超越Fermi的ALU团簇内部任务管理能力。线程能力的大幅加强可以让ALU更快更有效率的获得指令和任务,对单元复用率的提升贡献颇大。
HD7000家族
VLIW 4在Cayman中的表现验证了削减吞吐限制对提升单元复用率的贡献,同时也坚定了AMD彻底抛弃VLIW的决心。较之VLIW繁冗的打包规则以及由条件分支等多种原因导致的单元等待,单纯而且无限制的SIMD吞吐形式显然能够让单元更加畅快的获得指令并进行执行。对ALU团簇结构以及VLIW的最终摒弃不仅让AMD甩掉了禁锢自己4年以上的沉重枷锁,从根本上大幅提升了ALU部分的单元复用率,同时也断绝了再次迷失在吞吐还是效率这个抉择中的可能,让RV870这种恶例再也没有了出现的机会。
Cayman中经过改良的线程模式对提升单元复用率起到了帮助作用
unified cache的引入,为已经获得解放的ALU团簇提供了远比过去灵活和充沛的缓冲资源。相对于只读且延迟必须透明的Shared,可写的unified cache可以为单元提供更好的寄存器溢出缓冲,搭配被进一步强化的线程能力, unified cache可以以极大的带宽和极低的延迟大量减少运算单元等待任务以及释放中间结果造成的周期浪费,减少这部分浪费的直接结果,自然也是单元复用率的提升。
HD7970产品信息
没错,这就是Tahiti,一个在历经错误和彷徨,甚至险些与机会失之交臂之后,终于变得清晰并坚定前进的结果。Tahiti构架的诸多改进不仅环环相扣,而且每一步都是Cayman转身的延续。所有改进的目的性都十分明确,那就是尽一切可能提升运算单元的单元复用率,进而提升整个构架的灵活性以及绝对性能。对于Tahiti构架的三大改进,我们只能用一个词来形容,那就是精彩!
● 维纳斯的双臂
当然,这世界上是不存在100%完美的事物的。尽管Tahiti构架的改进程度和目前的状态较之之前的其他构架有了长足的进步,但构架本身依旧存在着瑕疵,那就是缓冲资源的密度以及可能存在的宏观并行度的问题。
R600的衍生物构架,甚至包括Cayman在内,其内部需要改进的地方实在太多,以一个构架的演进来看,Tahiti几乎做到了能够接受的最大限度的更新,AMD已经没有余力去进一步改变构架的逻辑结构了。在AMD目前公布的数据中,我们没有发现CU集群被Dual ACE泾渭分明的划分成2个独立的部分的证据。所以我们对Tahiti的宏观并行度问题暂时持保留态度,暂且认为Tahiti构架的并行度与Cayman的并行度基本类似,属于“由两组线程管理机制共同管理的单一大型运算集群”的类型。尽管CU结构的巨大改变以及线程管理能力的增强令Tahiti获得了相当不错的效率,但如果宏观并行度确实存在不足,那么这种不足还是会降低该构架的线程平滑度,进而对单元复用率造成一定的影响。
Tahiti构架细节
如果Tahiti构架确实已经被Dual ACE划分成了完全并行的两个对等群组,逻辑结构层面上与Fermi的GPC并行完全相同,那么这就标志着AMD已经完全进入了宏观并行度的时代,其意义同甩掉VLIW是相当的,同时也标志着。对于这方面的信息,我们将会在后续的延展测试以及信息中对其保持持续的重点关注。
宏观并行属于逻辑结构布置的范畴,本身仅对设计者的把握度、对构架的理解力以及统筹能力提出要求,需要添加的单元极少甚至可以忽略不计,并不会导致晶体管负担的增加。所以我们相信在经历并逐渐适应了Tahiti的巨变以后,AMD在下一代构架中一定会进一步着手改进构架的宏观并行度。
Fermi构架单GPC结构(源自后藤弘茂blog)
与构架的宏观并行度相比,缓冲资源的密度问题就要显得棘手一些了。尽管Tahiti构架已经引入了unified cache,其分布形式也比较合理,但受限于RV870造成的过低的D线,AMD无法也不愿意对Tahiti的芯片总面积进行放大,因此也就无法给大量的单元配备充足的unified cache资源。
Tahiti构架的L2总量与Fermi相同,而且在充当数据缓冲及材质缓冲的同时还要充当L1的回写缓冲,而L1 Data和Instruction cache的总量甚至还不如Fermi多。以这个并未超越对手的缓冲资源总量,去应对4倍于对手的运算单元的需求,这种缓冲资源的密度是远远不够的,密度的低落势必会为缓冲操作带来沉重的负担。尽管AMD通过增加LDS等Shared的方式对其进行了一定的弥补,但Shared低下的灵活度以及强烈的针对性均让其无法完全弥补cache密度所带来的影响。较低的缓冲资源密度会导致频繁的缓冲紧张问题,运算单元在无近存资源可用时将不得不转向使用显存来满足缓冲需求,这会让体系不得不将大量的周期用在访存等IO环节,进而影响到单元复用率的提升。
Fermi构架的资源密度(源自后藤弘茂blog)
宏观并行度的缺失以及缓冲资源密度的不足虽然是目前Tahiti构架存在的问题,但它们并非是整个构架的污点或者不可逾越的缺陷,它们就好像维纳斯缺失的双臂一般,让人产生了无尽的遐想,甚至会让今后AMD与NVIDIA在图形领域的竞争变得更加精彩。
● 真正的比赛,现在开始!
常规的SIMD吞吐形式,逐步强调的宏观并行度和多级线程管理机制,几乎完全相同的运算单元结构以及unified cache体系的引入,让Tahiti构架在结构上明显接近了Fermi构架,如果不考虑资源总量等技巧性差异,两者在逻辑层面甚至可以说已经完全一样了。在经历了5年曲折的摸索和前进之后,AMD终于不再一个人孤独地在迷雾中奔跑了。它现在几乎已经冲出了迷茫的包围,并第一次站在了与NVIDIA相同的起跑线上。
HD7970核心照
在Tahiti构架出现之前,AMD一直处在追随者的状态下,迷雾中的它脚下的道路虽然不少,但前进的方向却只有提升单元复用率或者与之宏观等价的构架有效动作总次数。Tahiti构架的出现,让AMD基本完成了在这个方向上的追赶。拥有了Tahiti构架的AMD,已经具备了与NVIDIA一同探索并提出与过去不同的发展方向的资格了。
Fermi构架单元对缓冲的调用过程
因为ALU团簇结构的趋同,Tahiti与Fermi构架之间有了一定的可比性,我们可以近似的将之看做两个运算结构相同,但缓冲比例搭配不同的体系。以各自在当前制程下所能够接受的资源总量来衡量,Fermi在缓冲资源部分投注的比例相对更大,而Tahiti构架则更加倾向于大量运算单元配备少量缓冲,这种倾向,让Tahiti看上去更加接近原教旨的GPU以及GPGPU。
我们在前页提到过,缓冲资源的缺失并不是不可逾越的障碍,它甚至还能像维纳斯缺失的双臂那样令人产生美好的遐想,Tahiti构架因为这种缺失,反倒获得了多样化的前进方向。补足了灵活度所需的结构和缓冲资源基本需求的Tahiti构架如果继续维持原教旨的GPU/GPGPU的发展路线,那么它可以进一步的通过放大运算部分同时维持并适当改进现有的缓冲操作体系来取得性能的提升。如果AMD继续坚持提升单元复用率,向更加灵活的应用能力方向去进行拓展,则可以维持现有运算资源规模或对其进行缓慢放大,同时积极增加缓冲资源的总量以及操作灵活度。跨过了unified cache门槛并甩掉VLIW束缚的AMD,无论选择哪条路都将会比过去走得更加轻松。
Tahiti及其之后的构架表现令人期待
最重要的是,NVIDIA在未来同样会面对一模一样的选择,不论是转向偏重原教旨GPGPU强调的并行吞吐,维持现有的多样化应用要求的更大的灵活性,亦或是在两者之间寻找unified cache资源配置的平衡点,NVIDIA未来与AMD所做的事情将趋于相同。这不仅能够让游戏编程界在思想上获得统一,更能让双方将更多的精力投注到构架逻辑结构的优化方面并为我们带来更多更加精彩的产品,而不是像现在这样将大量资源投放到与研发和技术进步无关的某些……非常特殊的公共关系领域中去。
Tahiti的出现创造和改变了很多东西,它的结构精巧的令人赏心悦目,它扭转了AMD在单元复用率方面的劣势,它的灵活度远超任何一款曾经出现的ATI/AMD图形构架,它拥有比过去好得多的DirectX 11游戏性能,它带来的通用计算性能的巨幅提升为AMD未来进一步拓展HPC市场奠定了基础,它将AMD从长达5年的错误或者说迷茫中拉了出来,并为AMD的未来发展指明了道路。
对于HD7970的实测成绩,请努力遐想吧
有关Tahiti构架的更多特性解析以及相关的性能测试,我们将在北京时间2012年1月9日13点NDA失效的同时准时为你奉上,敬请期待吧。
推荐经销商