以下文章来源于电子工程专辑 ,作者黄烨锋
《电子工程专辑》中国版创建于1993年,致力于为中国的设计、研发、测试工程师及技术管理社群提供资讯服务。
苹果M1芯片发布之际,在大众间普及了一个叫UMA(Unified Memory Architecture)的概念——这个词主要用以形容,M1平台之上的RAM内存,面向CPU和GPU等不同的处理器时,采用统一可访问的内存池:如此一来M1的各组成部分不需要像传统方案那样,在多个内存池之间来回复制数据。
这里UMA的基本假设是,传统的CPU和GPU虽然位于同一个SoC芯片上,但它们对于内存的不同访问习惯、数据结构,导致它们虽然使用相同的内存RAM,但其存取空间仍然是分开的。而M1则打破了这种界限,提升了带宽、延迟和性能表现。当然这种“打破”是苹果和媒体的宣传。
事实上,UMA这个词也有挺久的历史了,英伟达、AMD等都做过宣传。而且似乎在不同语境下,其含义是不一样的(比如维基百科将UMA等同于集成GPU;且UMA似有各种不同实现方式)。这也给苹果M1的UMA是否真的领先,打了个问号。我们不打算去追溯UMA究竟表示什么——不过无论如何,UMA都基于异构计算。所谓异构计算,也就是把CPU、GPU、NPU、FPGA等通用、专用处理器集成到一起,大家协同计算、各司其职。
异构计算是后摩尔时代的基本趋势。现在异构计算已经不新鲜了,因为如今遍地都是异构计算芯片,手机、PC的处理器普遍如此。不过十多年前,异构计算还是相当新潮的。而AMD是提异构计算比较早且积极的选手。
对PC处理器熟悉的同学应该知道AMD有个产品线叫APU:我们现在对APU的大致理解,应该是把CPU、GPU集成到同一颗芯片上的处理器产品。在这个时代,这种思路也太过稀松平常了。Intel、苹果、高通、Arm还有谁不是这么做的?但在AMD提出Fusion项目的2006年,这可是个比较有趣的思路——当年即便是所谓的“集成显卡”也还都是在主板上单独的芯片。
APU是早践行了异构计算的处理器产品,而且也比苹果早很多年尝试去实现UMA——至于是否成功那是另一回事。现在的APU可能早就没了当初的使命。本文分成上下篇来谈谈AMD当年提出的APU架构理念,以及到如今的苹果M1,世界又发生了怎样的变化;并尝试粗看看苹果M1的UMA有多大价值。
AMD早年提出APU这个概念是有其历史原因的。我们在《PC处理器市场在变天:Intel的王者宝座还能坐多久?》一文中曾详细谈到过AMD过去十多年,在技术上走过一条长长的弯路。在Zen架构出现以前,AMD一直在做一种叫Bulldozer推土机的处理器架构。
这种架构的一大特点是,每两个处理器核心共享一个浮点运算单元(每两个核心组成一个模块-module)。也就是说每一个推土机模块(module),对整数运算来说是2个核心,而对浮点运算而言有时是1个核心,有时又可以算2个核心。
1个推土机模块
AMD当年表示,之所以采用这样的核心设计,是因为大部分操作系统工作都是基于整数运算;而浮点运算日常没那么重要——真正需要浮点性能的时候,让GPU来干就行了。(好像和早年高通Kryo的思路完全相反)
我们现在当然知道,AMD推土机架构是彻彻底底地失败了。不过如果顺着AMD当年的这个思路去想,AMD收购了ATI之后手握CPU、GPU两大资源。那么搞个CPU、GPU融合的架构出来,矢量、浮点这些计算就可以欢乐地交给GPU去完成了。完全不难想象当年的推土机CPU架构,可能就是为APU Fusion这个概念而生的。
事实上,AMD Fusion项目是2006年就提出的——AMD也是在这一年收购的ATI。当时AMD表示要开发一种SoC芯片,将CPU和GPU集成到一颗die上。不过要把CPU、GPU以当年的45nm工艺放在一起,难度还是相当大的。所以第一颗APU问世已经是2011年的事情了。推土机CPU也是2011年发布的。
这套技术逻辑,感觉还是相当的圆满——至少从理论上来看是如此。当年亦有分析师提出,“APU”这个概念恰是因为AMD在CPU市场上表现越来越差,推土机性能也远远落后于Intel同时代产品,所造出来的一个东西。AMD期望藉由APU的新概念,来实现市场的突破。这个观点可能也是有道理的,但实际上推土机的问世,比APU概念的诞生至少晚了5年。所以我们更倾向于认为,APU是AMD一早就预备推广的一种技术。
AMD在2010年发布的一份APU技术白皮书中,大肆夸赞了APU在技术上的独到之处。现在看来CPU+GPU的设定并没有什么可吹的,但这在当年也算是个壮举。而且APU也不只是把CPU和GPU放在一起这么单纯,毕竟前文提到了AMD是期望让GPU在日常工作中也发挥作用的,而不只是充当图形计算加速器。
来源:APU 101: All about AMD Fusion Accelerated Processing Units
在理念宣传上,AMD画过一张图。AMD认为,处理器设计造成的性能提升,历史上分成了三个阶段,如上图所示。这三个阶段分别是单核时期、多核时期,以及异构系统时期。这种划分也算比较前瞻地谈到了未来各种专用处理器或单元对于行业的变革:我们现在身处的时代的确践行了这个理念。
AMD最初提APU一词的时候就谈到GPU之类的矢量处理器,对于大型数据集以及密集型数值计算任务是非常适用的;但对于很多问题来说,CPU也是不可或缺的。异构计算融合CPU、CPU以及更多处理器的长处,实现更优的性能和效率表现。
当年的确还没有“核显”的概念,顶多就是“集显”IGP。而且PC历史上的IGP性能孱弱,只用于解决最基本的图形计算问题。IGP是独立存在于PCB板上的芯片,与内存通讯要通过CPU和PCIe总线,也存在高延迟、低效的问题。AMD在早期APU宣传中也会特别提APU架构的速度比PCIe 2.0快4倍(如下图)。另外AMD自然也不忘说独立显卡对于某些场景的通用计算(GPGPU)不够高效,尤其表现在CPU到GPU的PCIe数据搬迁上。
不过很显然,GPGPU这类思路是需要开发生态配合的:CPU不会平白无故地把任务分给GPU去做,远不是“上帝说要有光便有了光”这么简单的过程。英伟达的CUDA生态也搞了很久。AMD自然需要配套打造各种工具,并维护标准和生态:一个可以跨不同处理器,做统一开发的生态;也需要更多合作伙伴的加入和开发者的响应。
AMD最初提过没有一家处理器厂商用真正可编程的GPU,来做CPU和GPU的融合,所以APU生态“用高层级行业标准工具如OpenCL、DirectCompute和DirectX 11让GPU可编程。”AMD雄心壮志地说要让软件开发者能够将高性能矢量算法融入到自己的应用中,不再受制于标量处理器(CPU)的传统计算限制。
2012年,AMD牵头成立了HSA Foundation(Heterogeneous System Architecture,异构系统架构)。这个组织当时还拉进了Arm、Imagination、联发科、高通、三星、德州仪器等。AMD就是期望HSA架构能够真正推广开来,并推进APU这类形态处理器的软件生态建设。另外,这一年AMD也把APU的“Fusion”平台改名为“HSA”。
不过虽然异构计算现在变得越来越流行,但在个人计算市场,HSA可没能如AMD预期般繁盛兴盛。AMD还是高估了自己在行业内的号召力。这是后话了。
从当年AMD的形容来看,APU这类芯片的终极理想,或许更靠近于此前索尼PS3游戏机的CELL处理器,或者富士通近年推的A64FX超算芯片——它们在硬件架构层面算是部分融合了CPU和GPU,而不只是把CPU、GPU做到一颗芯片上。不过APU显然是无法这么激进的,毕竟它不像CELL、A64FX那样只面向某一个专门的市场。
Jim Keller还在AMD的时候也是HSA的重要倡导者。Jim Keller多年前说过:“图形计算需要真正的高带宽内存系统。以前图形单元有其专门的内存系统,而CPU和GPU对话,需借助于PCIe。在HSA架构下,CPU与GPU共享内存,图形单元看得到内存,CPU也看得到内存,我们在两者间传递指针,两者有共同的地址空间。”(貌似Lisa Su更是HSA的倡导者,CELL处理器时代,Lisa Su还在IBM)
来源:Wikipedia
这听起来是不是和苹果M1的UMA已经十分类似了?不过HSA的实现,在AMD的APU上也不是一蹴而就的。至少我们在AMD 2010年发布的白皮书中还没有看到AMD大谈UMA。从维基百科的资料来看,HSA特性包括很多分项,比如说共享电源管理、HSA-aware MMU(内存管理单元)、GPU Compute C++支持等。
Jim Keller口中提到的“共同地址空间”这一项,在实现上可能至晚是2014年PS4游戏机中的Kaveri APU——这项特性名为Heterogeneous Memory Management,CPU的MMU和GPU的IOMMU共享相同的地址空间。不过2012年的Trinity APU上,也已经实现了HSA-aware MMU,即GPU可以通过HSA MMU的转译服务和页面错误管理,来访问整个系统内存…(在2013年以前,APU可能均未从硬件层面实现“共同地址空间”,但可能已经实现了对开发者而言CPU与GPU都看到“共同的数据”,并由中间层实现数据的同步)
2014年所推的APU另外也实现了CPU与GPU的所谓“完全一致存储”(fully coherent memory),以及GPU可以通过CPU pointer来使用可分页(pageable)的系统内存等等。2015年的Carrizo APU又加入了GPU计算上下文切换、QoS等特性……
实际上,2013年AMD市场宣传中提出了一个名为hUMA(Heterogeneous Unified Memory Access)的概念,其本质应当也没有脱离广义上的UMA。我们的理解,hUMA应该是AMD期望在APU上实现CPU、GPU(以及更多类型处理器)融合计算的完整特性的集合,包括“共享地址空间”“完全一致存储”这些特性。从硬件层面实现存储一致性,相较于由程序标注数据修改,也更符合AMD构建HSA的初衷,对开发者也会更友好。
当年AMD还强调了hUMA的一项重要特性,即在内存资源仍然比较紧俏的时代,虚拟内存交换是很常见的——即将一部分内存数据放到硬盘上。CPU如果要访问硬盘上的这些虚拟内存数据,则需要通过操作系统来获取数据。
前面提到一般CPU和GPU内存区域分开,两者间是要执行复制数据操作的,这个过程是由CPU独立进行的。如此,CPU也就无法处理写入硬盘的虚拟内存部分,复制的数据只能放在RAM上,且要确保不会被写进硬盘的虚拟内存交换区。hUMA当年也着力于解决这个问题,GPU不仅可以用CPU的地址,而且可以用按需分页的虚拟内存。AMD说除了GPGPU编程以外,这对图形计算中,用到大型纹理的场景是很有价值的。
好了,花在HSA特性介绍上的笔墨有些过多了,这里就不再多做介绍了。其实谈这么多,都为了说明,APU原本在设定上绝对不只是单纯地将CPU和GPU放到同一个die上,硬件和生态层面其实还是作了比较大的努力,以期实现CPU、GPU协作的高效性的。
苹果几乎没有公开多少有关M1芯片UMA架构的信息,但AMD对类似思路的践行应该早了很多年,只是不知道苹果是否在实现上应用了什么独特技术。
来源:Wikipedia
另外值得一提的是,AMD的APU、HSA、hUMA并不只是针对CPU和GPU,还包括其他处理器,AMD预想中的如加密加速器、FPGA等;HSA在架构设计上也扩展到了(有VRAM的)独立显卡,其实现主要是通过PCIe传递指针(而不是完整复制数据)实现unified virtual memory(如上图)。
完整践行了AMD APU这套思路的,应该就是游戏主机了,比如PS4开始对上述特性就有相对完整的实践。或许APU的完美适配领域,就在游戏机市场上——这也是AMD的主场。
不过在PC领域,像HSA这样的方案,说到底还是需要开发者响应的。除了硬件支持之外,还需要在生态方面多做投入。为了实现互通性、简化开发,对于CPU和其他处理器而言,HSA实现是ISA无关的,同时要对高级语言实现支持。所以HSA生态上实际包含了什么HSAIL(中间层)、内存模型、dispatcher和运行时之类的组成部分。HSA特性也需要受到操作系统内核、设备驱动的支持等等。
来源:Wikipedia
目前PC平台的HSA生态基本处在荒废状态,表明APU with HSA在PC平台是名存实亡的。现在的APU,其本质大概也就是带GPU核显的AMD处理器产品。其实即便只看今年AMD所推APU产品的GPU性能(Ryzen 7 5700G - RX Vega 8),也已经被隔壁Intel Xe核显超过,早就不复AMD开辟APU形态产品之初,要让高性能GPU与CPU协同工作的心思了。
APU现如今在PC市场上的角色,可能与带核显的面向笔记本一类低功耗移动市场的芯片产品并没有本质区别,这显然与AMD当初宣称APU/HSA是第三次性能革命的誓言背道而驰。
AMD对HSA生态的疏于维护,一方面是对这个方向的不再看好;以及鉴于AMD在PC市场上的号召力不足,开发者对AMD的这套方案始终也真的没有太大的兴趣。而另一方面,AMD如今的Zen架构处理器,在性能和效率上早不再是当年推土机的模样,也对Intel酷睿处理器实现了超越,自然也不再需要藉由APU这样一个概念去为竞争找补。
不过说到生态,除了像游戏机这类AMD的固有主场,在PC市场上,苹果的号召力和AMD可不在一个次元。苹果作为芯片设计商、操作系统开发商、PC设备OEM厂商多重角色,对生态的牢牢把控,以M1为硬件基础推行自己的异构计算和UMA架构,难度大概会小得多。苹果在此的主要成就,大概就是超强的生态掌控力了吧。
不过这则故事还没完,UMA在AMD/Intel的处理器上真的已经不复存在了吗?APU的传奇是否就此结束?是否只有苹果才能机会将UMA贯彻到底?这些将在本文的下篇中做解读。或许UMA只是以另一种方式存在于x86和Arm世界,只是它不叫HSA而已。
作者:黄烨锋
EET电子工程专辑原创