很快,Radeon HD 6000的时代就将过去,因为AMD下一代图形产品即将到来。请注意,这次不是如Radeon HD 6000和Radeon HD 5000一般,在上一代架构基础上小修小补。我们能明显发现新产品的设计理念,在向并行计算的方向靠拢。
本刊在8月上《打左灯,向右转? AMD Radeon HD 6000时代产品发展策略分析》一文中曾明确指出,AMD目前的图形产品的架构设计已经遇到了瓶颈,不适应风生水起的GPU并行计算。而AMD也充分意识到了这个问题,6月16日在美国华盛顿州Bellevue举行的首届AMD Fusion开发者高峰会上,AMD就向我们透露了下一代图形核心的有关情况(AMD Graphics Core Next,简称GCN)。GCN是AMD未来GPU的基石,包括传统的独立显卡,和APU集成的GPU核心。借助GCN,AMD将对沿用多年的GPU架构进行一次大变革,以满足GPU并行计算的要求。
GCN的设计指导思想是让GPU的并行计算性能和图形处理性能一样出色。采用VLIW设计的传统AMD图形产品并不太适合进行并行计算, AMD有必要和老旧的GPU架构划清界限,构建性能更好的GPU产品,以满足软件开发者需求。由于GCN的许多设计思路和Fermi类似,因此有人评论:“GCN本质上就是AMD版费米,全新架构加上大刀阔斧地改革,打造出怪兽级的并行计算和图形渲染性能!”
能温故而知新 AMD现有架构回顾
在了解GCN之前,我们先来简单回顾下AMD现有图形产品的架构设计。与NVIDIA图形产品采用MIMID(多指令多数据流)不同的是,AMD采用的是SIMD(单指令多数据流)架构。AMD图形芯片的最基本单位是流处理算术逻辑单元,简称SPU。除了采用Cayman核心的Radeon HD 6900系列以外(采用VLIW4设计,每4个SPU组成一个SP),AMD一直以来都沿用的是“超长指令字5”设计,即VLIW5,5个SPU组成一个SP(流处理器单元)。这种设计的主要特点是以并行方式,在尽可能多的时钟周期内,执行单独指令。由于它可以比较容易进行编译和安排着色,因此擅长图形处理。SPU加上寄存器,一个分支单元,以及一个特殊功能(超越指令)单元,即构建成为1个SP。以采用传统VLIW5设计的Radeon HD 6850来说,每80个SP构成1组SIMD引擎,每7组SIMD引擎构成一个SIMD引擎阵列,Radeon HD 6850的Barts核心共计两个SIMD引擎阵列。
AMD的VLIW5设计示意图
采用VLIW设计的AMD显卡擅长把相同的任务分解成更小的分组,以并行方式执行许多操作,这种更小的分组即所谓的“波前“(Wavef ront)。就AMD来说,波前是64个像素/或者数值,以及相对应的执行指令列表构成的组。理想情况下,1个波前有4或5个完全独立的指令。当遇到互相依存的指令时,1个波前将包含更少的完全独立指令;最坏的情况下,一个SP(包含4个或者5个SPU)在1个时钟周期内只能处理1个指令,有3个或者4个SPU完全闲置。
传统VLIW设计的指令执行示意图
随着DirectX 11游戏和GPGPU方案问世,根据AMD自己的内部研究显示,在Cayman发布之时,采用VLIW5设计的AMD显卡在当下的应用环境下,平均只利用到5个SPU核心当中的3~4个。从VLIW5收缩到VLIW4,就是为了应对这种变化,不过SPU核心的利用率始终是个问题。
GCN中的SIMD向量处理器结构图
最后,不得不说的是安排这些操作的调度单元。在CPU的世界里,我们让CPU执行程序,CPU自己会进行必要的调度安排,甚至可以在一个线程当中进行乱序执行。而在VLIW设计当中,编译器负责一切调度工作。编译器需要了解全部程序,并智能地预先安排一些操作。但同时它也有无法预知的地方,必须等程序运行之后并且提供数据给自己才行。因此,编译器在VLIW设计当中是所谓“静态”运行,它在编译之前就设定一切,并且编译过程当中不能发生变化。而且每一个编译器都要非常出色才行,不然在支持扩大语言的时候就会遇到问题,甚至在中间语言抽取过程当中都会遇到问题,比如着色编译器无法处理某个编译器产生的中间代码等。
此外,VLIW指令集的复杂性也会妨碍程序优化和手工优化调整,这在进行并行计算时都容易遇到问题。VLIW的复杂性使得它难以拆卸和调试,很难预测性能,并发现和修复代码的关键部分。理想情况下,程序员不应该使用汇编进行工作,但高性能计算和其他并行计算的用途却恰恰相反,通过汇编工作,同时对单指令进行优化,可以获得更高性能。
AMD迎来全新设计的“GCN”
那么GCN和传统的VLIM设计又有何不同呢?从原理上讲,这两个类型的SIMD架构有类似之处,都采用并行运行方式,但两者在执行方式上却截然不同。采用VLIW设计的产品,使用的是提取指令级(ILP)的并行方式;GCN则采用线程级并行(TLP)方式。
为此,GCN将采用SIMD向量处理器来取代VLIW体系下的SP流处理器。在这里,不要将SIMD向量处理器和Cayman当中的SIMD引擎混淆。Cayman当中数十个SP构成1个SIMD引擎,而GCN当中的SIMD向量处理器,是和SP相当的图形处理单元。
SIMD向量处理器采用真16位宽设计,即包含16个ALU算数处理单元,可以在1个时钟周期内处理1个指令和最多16个数据元素。16个ALU算数处理单元搭配1个64kB文件寄存器,则构成一个SIMD向量处理器。
和Cayman的SP类似,SIMD向量处理器可以进行一系列整数和浮点操作。AMD还没有公布这些操作的细节,但是笔者认为除了超越指令,其中部分操作都和Cayman类似。值得一提的是,GCN彻底改善了FP64(双精度)的计算性能。它的FP64性能最高已经可以达到FP32性能的一半。对于家庭用户来说,这种改善不会马上产生重大影响,但是将帮助AMD进入需要高精度计算的HPC高性能计算市场。
SIMD构建CU计算单元
在GCN当中,SIMD向量处理器之上的结构就是CU(Compute Unit,计算单元)。1个CU由多个SIMD向量处理器和其他单元构成,是进行并行计算的基本单位。SIMD向量处理器的向量操作和其他单元提供的其他功能,让CU可以完成全部的计算任务。CU将取代Cayman当中的SIMD引擎,能完成的工作将远远超过Cayman的SIMD引擎。
GCN的CU结构图
Cayman的SIMD引擎由多个S P构成,而GCN当中的CU则由多个SIMD向量处理器构成。4个SIMD向量处理器构成1个CU,因此CU在一个时钟周期,同时可以执行4个指令。CU设有前端读取、解码电路和分支单元,负责读取、解码和调度波前以及它们的指令,添加了1个64kB本地数据存储和16kB L1数据+纹理缓存,这和Fermi比较类似。在GCN当中,数据和纹理L1缓存合二为一,并且现在L1缓存只存储压缩后的纹理,以减轻纹理对L1缓存的压力。
VLIW设计下的理想情况:所有波前都相互独立。
和AMD现有架构的产品相比,GCN的调度工作由专门的硬件来执行,即CU当中的前端读取和解码硬件电路来负责调度指令,可以实现动态调度。好处是可以中途调整依赖指令,来调整和分配1个CU当中的所有64个ALU单元的工作,但这会占用芯片面积。
VLIW设计下效率低下的情况:1个或者多个相关波前。
可以看出,CU的动态调度和SIMD向量处理器能完成Cayman的SIMD引擎无法完成的工作,比如解决互相依赖的波前指令和进行调度工作。GCN尽管还不是一个乱序执行架构,在1个波前当中,指令仍然需要按顺序执行。但CU和SIMD向量处理器,可以选择相同任务产生的不同波前进行工作,也可以选择完全不同的任务产生的波前工作。
Cayman一次处理多个任务的能力十分有限,虽然它可以消耗相同任务的多个波前,执行并发任务能力,但需要依赖API支持,即受制于OpenCL扩展情况。而GCN则可以相对轻松地处理多个任务,它的每个SIMD向量处理器有10个可供选择的波前,每个CU共有40个波前可供选择。简而言之,这就是为什么AMD抛弃采用VLIW设计的架构,转而投入GCN的原因:和VLIW设计下的SPU核心因为依赖指令出现闲置情况相反,独立的SIMD向量处理器可以处理完全不同的波前。
随着编译器从调度任务中解脱出来,编译也可以用一个比较标准的的方式进行。不过,编写编译器仍然不容易,但是,在优化程序执行时,编译器可以专注于其他事项,使其更容易处理针对GCN的其他语言。
下面我们来看看CU当中另一个重要部分:标量运算单元(Scalar ALU)。标量运算单元旨在进一步将效率低下的操作逐出SIMD向量处理器,让SIMD向量处理器当中的向量ALU可以大规模并行执行指令。标量运算单元由一个单一的标量ALU和一个8kB的文件寄存器组成。标量运算单元在CU中主要负责“一次性”数学操作,当像素/值组通过向量单元时,其中的一次性数学操作就由标量运算单元来完成。
总的来说,标量单元在单个时钟周期内,可以执行一条指令。这意味着它可以在CU处理波前这段时间内,完成4个指令操作。标量运算单元模糊了标量GPU和向量GPU之间的界线,但同时拥有标量和矢量运算单元,意味着每个单位都可以完成最合适它们的工作。相比之下,Cayman在这方面有44个周期的延迟。
CU计算单元构建GPU
在GCN架构当中,多个CU以4的倍数构成更大的配置模块,再由这些配置模块和其他功能单位和模块,来构成1个GPU,以方便AMD设计成不同档次的产品。
GCN的整体架构
GCN的二级缓存支持回写,并且数据完全一致,使所有CU获得相同数据。CPU /GPU的同步也将在L2高速缓存上实现,它将保持两者之间的一致性,以便有效地分割CPU和GPU之间的任务。对于APU来说,CPU核心和GPU核心之间还有1个专用的高速数据传输总线。
在计算方面,新的异步计算引擎(ACE)将成为GCN计算操作的命令处理器。ACE的主要目的是接受工作,将工作分派给CU处理(GCN可以同时处理多个任务)。一个GCN GPU上可以有多个ACE来决定资源配置、上下文切换和任务的优先级。AMD还没有透露ACE和可同时执行的任务之间的数量关系。不过,ACE已经显著弥补GCN在乱序执行任务上的不足。上文提过,GCN是一个有序的体系结构,1个波前上的指令流不能重新定序。但是ACE可以排定任务的优先次序和重新安排任务,允许以不同的顺序完成任务。这就要求GCN需要尽快释放这些任务占用的资源,而不是让这些任务在接近完成状态下持续消耗资源。这种设计思路和目前采用有序执行的CPU(Atom,ARM A8等),在处理多任务时的思路非常类似。
GCN的3D功能架构
在图形处理部分,GCP(图形命令处理器)位于堆栈的顶部,将图形工作分配给图形子系统的各个组成部分,例如几何和固定功能,和Cayman比较类似。不同的是,GCN的图元管线具有高度的伸缩性,曲面细分性能将有大幅提升。
当图形数据经过CU之后,就到达像素管线和ROP单元。按照惯例,GPU都内建一定数量的ROP单元。
笔者推测,像素管线的数量将和内存控制器的数量密切相关,形成紧密的ROP/L2/Memory一体化的设计,这对达到较高的ROP性能至关重要。
此外,GCN还加入了“部分常驻纹理”(PRT)功能。它允许纹理的一部分载入内存,让开发者在保持性能无损的情况下使用大尺寸纹理,这样GCN的整体架构图纹理当中不使用的部分就无需载入内存。著名的John Carmack已经在id Tech4和Tech5引擎当中,以软件执行方式使用类似技术。PRT基本上就是这个技术的硬件加速版本。
不过对于GCN图形架构和功能的其他信息,AMD并没有透露。目前透露的信息大多和GCN的并行计算能力相关,而不是图形功能。
新架构更有新功能
在前文当中,笔者详述了GCN的工作原理,并分析了它较Cayman的优势所在。当然,仅仅只是靠一些图形架构上的转变还不足以使GCN进入高性能计算市场,它还需要具备一些新功能,进一步提升了并行计算的能力和精准性。
GCN实现了CPU和GPU统一寻址
首先,GCN支持C++和其他高级语言的基本功能,例如指针,虚函数,异常,甚至支持递归等。这些基本功能意味着,软件开发者无需从高级语言下降到C语言,来编写GPU代码,使他们能更容易地在同一应用程序当中为GPU和CPU编程。
其次,在GCN当中,内存子系统也不断在发展,以便可以服务上述新加入的基本功能。这里的主要变化是硬件支持使用统一内存的ISA,让程序员能够编写同时针对CPU和GPU的代码,程序可以在任何位置访问内存,无需将内存从一个设备复制到另外1个设备。而现在访问GPU外存储器时,性能仍有明显损失,特别在GPU板载内存速度比系统内存快很多的情况下。不仅如此,开发人员和编译器还得复制数据,让其接近于将要使用这些数据CPU。
另外,GCN将使用统一的x86-64寻址空间。所有发送到GCN的指令,都将和x86-64寻址空间相关。它将内建1个I/O存储器映射单元(IOMMU),负责将地址转换到本地内存地址,而以前IOMMU只在虚拟机环境中用来共享外设。 值得一提的是,GCN甚至可以适当地拖延页面错误,直到内存存取完成,不过目前还不知道什么操作系统可以配合这种功能。因为目前大多数操作系统都需要对IOMMU进行寻址。因此,在Windows 7系统下,GCN这方面的功能可能无法充分利用。
在内存方面,AMD使用了EDC功能,来保证现有产品GDDR5内存总线上的数据传输的完整性。在GCN上,AMD将加入适当的ECC支持,以补充其现有的EDC(错误检测和校正)功能。ECC功能同时支持SRAM和VRAM内存。笔者认为,AMD将使用和NVIDIA类似的虚拟ECC方案,即ECC数据分布在整个VRAM当中,而不是使用额外的内存芯片/控制器。
前文当中已经提到GCN将支持FP64计算,具体支持形式也是多样的。例如不同档次的GCN产品将支持1/2速率的FP64、1/4速率的FP64和1/16速率FP64。低端GCN产品甚至不具备FP64功能,就像Fermi那样。毕竟FP64性能对消费者来说用处不大。
如今,调试GPU工具的便利性和功能性,已经远远落后于调试CPU的工具。因此GCN还改进了程序员的debug调试功能,GCN在硬件上作出一些变化,允许调试工具来调试以前无法调试到的GPU部分或者位置。另外,全新为GCN研发的ISA,也使调试更加容易。
写在最后
在GCN上,AMD沿用多年的VLIM设计终于走到了尽头。仅从AMD在Fusion峰会上所展示的有关GCN的信息来看,它的图形处理和并行计算能力将达到一个新的高峰,也为AMD敲开了并行计算的大门。
另外,AMD高层在Fusion高峰会上已经表示,采用GCN的下一代GPU产品会在年内上市。并且计划在2012年推出”推土机“版的APUTrinity,现在确定Trinity的GPU部分将继续延用Cayman的VLIW4设计的架构。这种细分化的市场策略表明,AMD很可能在中低端桌面GPU上也继续沿用VLIW4设计的架构,好让这些产品和”推土机“版APU进行混合交火。即使是采用GCN架构的产品出来之后,采用VLIW4设计的产品也不会消亡,甚至将持续到2013年,一直到GCN从高端到低端全面取代VLIW4设计的产品为止。
另外,GCN的设计理念也在很大程度上肯定了NVIDIA的Fermi在架构上做出的积极变化和调整。GCN的目标是兼得图形处理和并行计算,并引入统一寻址,支持C++等高级语言,加入ECC内存校正,这些都是Fermi已经具备的功能和特色。显然,AMD也看到了GPU计算蓬勃发展的时机已经到来。
最后笔者想强调的是,本文有关GCN的资料主要来源于AMD在Fusion峰会上透露的信息。该产品最终上市时,可能部分规格和参数会有一些调整,请以最终的产品为准。
大幅革新 AMD下一代图形产品前瞻
本文刊登于《微型计算机》2011年8月下