页面加载中,请稍候
来源:IC咖啡发布时间:2020-07-02429浏览
询问 AIRyzen的成功只是完成了AMD多年前本就该完成的壮举,如果当年AMD赌对了,今天的牙膏厂就不是Intel了,推土机有多糟糕,就凸显了现在的Ryzen有多优秀。一晃多年过去了,AMD长大了,我们也跟着长大了,你还记得七年前自己是什么样子吗?坐上AMD农用工程车的你现在还好么?AMD虽然凭借Ryzen冲天,但AMD的未来是否一帆风顺?面对的挑战是什么?
今天全面分析AMD一路走来的那些CPU历史和未来的挑战!

自从2017年AMD准时推出“技术规格看起来稍微正常点”的Zen微架构CPU后,总算脱身逃离了2011年以来推土机家族“4年工地秀”的泥沼,回到跟英特尔正面对决互殴的擂台,而2019年7nm制程的Zen 2,在2015年后就挤牙膏挤到青黄不接的当下,更让AMD“稍微”重现了十多年前K8时代的辉煌。这些各位读者都很熟悉的故事,就无需浪费篇幅锦上添花──即使背后充满看不见的波涛。


俗语说得好,失败乃成功之母,任何成功都建立在一路累积的基础上,AMD亦不能免俗,让Zen成功的一切条件,无不是奠基于过往的遗产与教训。我们就由远到近,一步步抽丝剥茧,重新踏上这条AMD走了25年的漫漫长路。
Zen才是真正的K10
AMD CPU代号的K源自“(Intel Pentium)Killer”,众人皆知的AMD高效能x86 CPU演进如下(不包含小核心Bobcat体系):
K5(1996):由超标量架构大师Mike Johnson亲自操刀的“Pentium Killer”,但英特尔并未开诚布公的公开Pentium新增指令细节,为了确保与100%跟Pentium相容,逆向工程搞了很久,上市日期一再延宕,让痴痴等待的粉丝焦头烂额。
K6(1997):直接购并NexGen,修改现成的Nx686,取消类似Pentium Pro的L2快取专用汇流排,到内建L2快取的K6-2+和K6-III才算大功告成,但已时不我与。
K7(1998):出身DEC Alpha团队的DirkMeyer变成的“x86世界的Alpha21264”,AMD首次能与英特尔全面性较量。
K8(2003):Fred Weber主导的K7强化版+x86-64+服务器等级的RAS+Hyper Transport+整合型记忆体控制器,让AMD一举攻入高获利的企业服务器市场。
K9:英文发音近似“狗”(Caine),太过负面,因此没这个代号。
K10(2007):4~6核K8强化版+整合式L3快取记忆体,AMD开始“包水饺”两颗打一颗,也逐渐无力抵抗英特尔小步快跑的钟摆攻势。
K11(2011):由IBM Power4的总工程师Chuck Moore操刀,接连四代被英特尔钟摆痛扁的“推土机”家族,丛集式同步多线程(CMT)和模组化浮点运算器暗藏了AMD对Fusion大战略的熊熊野心与对未来GPU局势的离谱误判。
K12(预定2017):从头到尾搞笑的“全新高效能64位元ARM处理器”,还没开始就结束了,只活在简报里,无愧当时“简报王”名号。
Zen(2017):深度流水线、追求高频率、同时同步多线程(SMT),根本是Andy Glew原先的K10原案投胎转世。
总之,严格说来,Zen才是“真正的K10”。这句话你可以仔细再看一次,我会等你。

1990年代初期创造英特尔革命性P6微架构5位总工程师之一的Andy Glew,对英特尔内部提议代号“Yamhill”的64位元x86指令集被拒绝,2002年跳槽到AMD参与x86-64指令集的制定工作,并短暂担任K10总工程师。为何说“短暂”?他老兄原本提案的K10是类似英特尔Net Burst的设计:深度流水线、追求高频率、未牺牲执行单元宽度、同步多线程,然后就又被打枪了,只是这次动手的换成了AMD高层。
他老兄一不爽,又在2005年跳回前东家英特尔,但恐怕运气一直不太好,加入因太过“史诗级灾难”(单核心晶粒面积213mm²几乎是Prescott两倍,TDP又超过150W上看166W)而惨遭腰斩的Tejas开发案。2009年再度离开英特尔,历经MIPS和nVidia。瞧瞧Linked In的个人介绍,现在正待搞RISC-V的SiFive。

为何真正的K10会沉寂这么久才浮上台面?这跟AMD研发能量明显远不及英特尔、难以承担精密复杂的微架构有很大关系,一颗当两颗用的SMT并不是好开发验证的东西。据AMD在1998年申请的几份专利文件,原始K8有两版,共同点只有一个:两个简单的“外宽内窄”小核心,明眼人脑中应该马上浮现推土机的雏型了。

但AMD大概是靠K7和K8日子过太爽了,遑论K8让AMD大举入侵高利润、市场动量又很持久(意思是产品暂时输入,也不会很快被赶出来)的服务器市场,“先讲求不伤身体,再讲求效果”的维稳心态作祟,或在2006年7月耗费54亿美元购并ATI这件事,烧了太多钱,不得不节约研发经费,迟迟不见全新后继接班人。
此外,AMD融合CPU和GPU的“Fusion大战略”也影响了CPU发展策略。AMD过度乐观预期GPU的泛用化进程,认定假以时日GPU将可取代CPU的浮点或部分SIMD整数运算,让推土机变成依附Fusion的附庸,摆明当“天时、地利、人和”三者兼备时,直接用GPU换掉两个简单整数运算核心共用的浮点运算器。

不过推土机在商业竞争失败,并不代表对之后Zen的成功毫无贡献,除了让AMD得到足够“不能乱搞管线前端”的教训,让分支预测与指令管线脱钩的解耦式分支预测器(Decoupled Branch Predicator)是支撑Zen效能竞争力的一大功臣,甚至是Zen 2可实做“机械学习分支预测器”的地基。各位别急,后面会提到。
反过来利用晶圆代工商业模式来提高电晶体密度与生产良率
AMD创办人Jerry Sanders有一句名言“有晶圆厂才是真男人”(Real men have fabs),在今日真是莫大的讽刺。
虽然像英特尔和昔日AMD的高度垂直整合IDM(Integrated Designand Manufacture)的商业模式,可确保设计和制程彼此最佳化,但在追求Time To Market的世界,专业的无晶圆厂IC设计公司、IP授权提供者、电子辅助设计工具(EDA Tool)与晶圆代工企业(Foundry)的高度分工,却更能有成熟的“研发供应链”互通有无,沿用早被诸多客户千锤百炼的晶圆厂制程参数、现有IP功能模组,迅速完成产品的开发与验证,并缩短时间降低成本。
这件事也发生在放弃自有晶圆厂的AMD。K11时代,AMD反过来利用晶圆代工生产GPU的高密度和自动化设计工具,砍掉多达30%的CPU晶片面积与耗电量,特别是过往“动用大量人力手工布线才能电路最佳化”的功能单元,如复杂的浮点运算器。“GPU的电路设计最佳化程度优于CPU”这档事,在21世纪初期的AMD连想都不敢想。

这些经验和努力,对Zen的成功绝对举足轻重。就商业角度来看,这也让AMD未来保有开发新型商业模式的弹性,中国中科海光的X86 CPU就是采用授权的Zen核心,当然美国政府愿意“乐观其成”那又是另一回事了。
“RISC86”与4道x86指令解码的先行者
将指令格式与定址模式复杂到让人头痛的x86指令,在指令解码阶段“转译”成一至数个固定长度、格式简洁的“类RISC”微指令,以简化处理器执行单元与数据路径的设计,有利于提升频率,并“将电晶体预算砸在最值得被加速的简单指令,不常用到的复杂指令,就用微码ROM产生ROP微程序慢慢跑”,已是20年来x86 CPU的共同特色,超纯量架构大师Mike Johnson领衔的K5则是先驱,将非固定长度的x86指令解码成平均59Bits长的ROP。

AMD K5还有个值得纪念之处:x86史上首款单一核心最多可同时解码4个x86指令的CPU,下一款是相隔近十年的英特尔Merom了,不提尴尬的K11,毕竟AMD Zen更晚了自家“前辈”超过20年。
强化非循序指令执行效率的两段式微指令转译与“类VLIW”的微指令派发
在这就非得岔题谈一谈“首款双核心服务器CPU”的IBM Power 4了,为缩减指令控制逻辑的复杂度,Power 4一次将5个解码后的指令“打包”成一个“一个萝卜一个坑、每个指令垂直对应一个执行单元”的超长指令(VLIW)包(一时脑筋转不过来,可想一下AMD GPU以前的VLIW5),里面5个指令全部执行完毕才能退返,控制逻辑单元只需管控相当于100个指令的20个指令包,这让Power 4这部分电路规模只有前代Power3的一半,且更便于拉抬CPU频率。

AMD则是从K7开始两段式微指令转译,指令解码器先将x86指令解码一至两个微指令,到了内部要在指令保留站 “派发”到执行单元前,再拆成更小的微指令,接着才“真枪实弹上阵”,避免一开始就把微指令拆光光,淹没指令管理单元,也变相将指令解码器的复杂度分散到“大后方”。
关于无法直接用“Fast Path”指令解码器处理成微指令的复杂指令,由“Vector Path”的微码ROM产生一系列微指令程序。前面就提过,所谓“RISC86”真正的精神就如同RISC:把经常用到的情况尽可能加速,将最佳资源集中在最常碰到的刀口。

寻寻觅觅千百度才秾纤合度的分支预测
“电脑”(Computer)和“计算器”(Calculator)的不同点在于:电脑具备“条件判断”的能力,依据不同条件,执行不同指令流。各位可将电脑程序的运作流程,想象成一个“棋盘”,以一个角落为起点,对角线的角落当终点,在棋盘上反复移动,不限制前进或后退。如发生条件判断的分支(Branch,必须先等待条件判断的执行结果,才能判定该分支“发生”),或无条件判断的跳跃(Jump),就会变更指令流,并中断指令管线运作,尤其前者伤害指令管线化的CPU效能,才需要“以古鉴今”的分支预测(Branch Prediction)技术。
“过犹不及”的“分支预测”一向公认是AMD落后英特尔的技术弱点,到了Zen才改观。贾谊〈过秦论〉那句意谓秦始皇继承六代功业的“奋六世之余烈”,套用到Zen看似突破性的分支预测技术,实在再适合不过了,在Zen之前,刚刚好也是6代:K5、K6、K7、K8、K10、K11,真够巧。
因K11的分支预测技术和前代相比简直彻头彻尾大相径庭,故不列于下表。

一般我们谈到的是“动态”分支预测,通过小型化快取记忆体,记录分支行为的历史,并随时搜集各类参考信息,动态的修正预测的结果。近年来拜“CPU安全漏洞”所赐,“预测执行”(Speculative Execution)、“非循序执行”(Out-Of-OrderExecution)和“分支预测”等技术名词,变得非常热门也经常混淆。
各位只要记得,对近代高效能CPU,“预测执行=分支预测+非循序执行”,CPU根据分支预测的结果,先斩后奏“赌博”性执行指令流,再由非循序执行引擎维护指令执行顺序的一致性,以及当预测错误时,回复该分支前的处理器状态。

分支预测究竟有多重要?假如有一颗CPU没有任何分支预测机制(或说有,但总是预测错误),当执行分支指令时,直到目标指令被撷取,所需要的频率周期数“分支伤害”(BranchPenalty)是3个频率周期,分支占了程序码五分之一,那会损失多少效能?
3*⅕=0.6
1/(1+0.6)=0.625
我们就可简单推算出,平均执行每个指令都会多出0.6个频率周期,等于增加60%执行时间,执行效能仅剩下62.5%。
很不幸的,这个简单的案例还真的有倒霉的苦主:AMD K5的初版“SSA/5”(PR75到PR100),因不明原因,分支预测功能被关闭,还“附赠”奇怪的CPU闲置状态,“完全体”5K86(PR120到PR200)的同频率效能就硬是多了整整30%。让人极度好奇,假如Compaq知道他们死撑着不用Pentium,只为了等待这样的产品,会做何感想。
K5的分支预测准确率仅75%。当连续执行分支指令时,等于每道指令平均多0.75个频率周期,沿用上面“分支占五分之一”的算法是0.15,效能仅剩87%,怎么看分数都不及格。但这时各位也应心知肚明,后期K5多出来的30%效能大致上是怎么来的,分支预测的确发挥了关键性作用。
(75%*0)+(25%*3)=0.75
0.75*⅕=0.15
1/(1+0.15)=0.87

购并NexGen而来的K6却是AMD史上罕见的“过渡投资”,和K5同为六阶管线、但最多只能解码两个x86指令的K6,在分支预测暴力到过头,足以傲视AMD历代CPU架构,但这是天大的浪费,况且分支预测越复杂,发生错误的回复时间也就越长,K6的错误代价就硬比K5多出一到两个频率周期(3vs.4或5)。
K6的分支预测准确率号称高达95%,我们可推算出执行每个分支指令只会多出0.2到0.25个频率周期,“分支占五分之一”就0.04到0.05,效能维持在95%到96%,远胜过K5。
(95%*0)+(5%*4)=0.2
(95%*0)+(5%*5)=0.25
1/(1+0.04)=0.96
1/(1+0.05)=0.95

不知道是不是针对K6“过度投资”的反动,或是觉得过于复杂的分支预测只会带来反效果,AMD在1998年Microprocessor Forum揭露K7的神秘面纱时,最让人意外的不是和DEC Alpha 21264如出一辙的“体格”,而是“Long Pipeline,ButSimple Branch Predictor”。

面对外界种种质疑,AMD坚持“更精确的分支预测器只会带来更复杂的设计、更多的预测频率周期与回复效能损失”,还更大胆的将标准的2位元Smith演算法4种状态,砍成只剩下3种(将Stronglynottaken和Weaklynottake合为一种nottaken)。对照K7压倒性的庞大执行单元,在这种小地方偷工减料,真的是莫大讽刺,但更扯的还在后头。

演进自K7的K8与“压榨K8剩余价值”的K10,指令管线更深,没有摆烂装死的借口,乍看之下“知耻近乎勇”亡羊补牢,但却很精明的利用“L1/L2互斥性快取(Exclusive Cache)”的特性,趁着资料从L1指令快取“被驱逐”(Evicted)写入L2快取时,将分支选择器“偷放”在L2快取记忆体包含指令的快取区块之ECC栏位,“节俭”至此,堪称一绝。
受制于不佳的分支预测精准度与“连如此简单的整数核心都喂不饱”的L1指令快取记忆体,甚少有人注意到指令管线深达20阶的K11,解耦式分支预测器早已默默为Zen 2的“机械学习分支预测器”TAGE分支预测器预先埋好了路基。

对于今日少人知悉的RisemP6,K11不等发生指令快取误失才去抓取目标指令,推土机的分支预测机制与指令撷取“脱钩”,主动标定分支预测目标的相对位址,如不存在于指令快取内,就“主动出击”预先撷取,可掩盖发生快取误失时的延迟,并替更耗时的机械学习分支预测器“争取训练的时间”。
依照AMD的说法,Zen 2的分支错误率比Zen减少了30%,意味着Zen从97%的精确度提升到Zen 2的98%。但不论解耦式分支预测器还是机械学习分支预测器TAGE,都是英特尔研究多年并发表过学术论文的产物,很可能早就导入产品了,但没刻意拿出来说嘴。不过花了这么长的时间,AMD总算在分支预测赶上英特尔的水准,仍值得可喜可贺。
激增有效实质容量的互斥性快取架构
各位有没有想过:Ryzen Threadripper 3990X的“288MB” 快取记忆体总容量究竟是怎么算出来的?
答案是“64核心×512kB第二阶快取”加上“8个CCD×2个CCX×16MB第三阶快取”,因两边的内容是“互斥”的,而第二阶快取完全包含了第一阶快取的内容,所以有效容量是32MB+256MB=288MB,这也是AMD CPU从K7后期至今,一个持之以恒的共同特征,而英特尔则从Nehalem开始,走上另一条彻底相反的路线。

互斥性快取架构的发生背景是K7从Thunderbird开始,CPU直接整合256kB或64kB第二阶快取记忆体,但K7的第一阶快取总容量多达128kB,不让两者“油水分离”,将会浪费大量的有效容量,如Duron的L1竟然还是L2两倍的蠢事(128kBvs.64kB)。从K7到K10是L1/L2互换,K11到Zen则调整成L2/L3轮转。
K8/K10利用这点,趁L1指令快取的资料搬到L2时,将分支选择器随着预先解码(Pre-decoded)和奇偶校验(Parity)栏位,一并写入确定存放指令的L2快取区块之ECC栏位,但互斥性快取架构也是AMDCPU最末阶快取延迟过长的元凶。

服务器等级的记忆体自动侦测容错机制
服务器要的是RAS:可靠性(Reliability)、可用性(Availability)、可服务性(Serviceability),而最大的潜在威胁,莫过于构成地球低强度背景辐射的带电粒子,所引起位元翻转的记忆体软错误(SoftError),动辄偶发的多位元错误更是一大挑战。K8之所以能替AMD敲开服务器天堂的大门,被侦错容错机制高度保护的快取记忆体与主记忆体,以及检测硬体错误并回报软件进行复原处理的硬体检查架构(Machine Check Architecture,MCA),统统功不可没。
从K8到Zen,ECC(Error-Correcting Code)越来越强悍,L1数据快取记忆体可“修复单位元错误,侦测双位元错误”,L2/L3快取记忆体更“修复双位元错误,侦测三位元错误”,但“数据损坏了顶多重抓”的L1指令快取“不太需要完善保护,只须奇偶校验”的原则毫无改变的迹象,事实上也没必要,起码节约成本。

K8整合式记忆体控制器支持防止记忆体多位元错误的Chipkill技术,如何做到?下面这张图阐述得非常清晰。
既然记忆体模组使用的ECC演算法无法纠正超过单位元的错误,那么我们就“分而治之”,让超过单位元的错误,不会出现在单一记忆体模组。假设有4条记忆体模组,而记忆体模组颗粒资料汇流排的宽度为4位元,我们各自分开存放ECC侦错码的额外颗粒的4条主句线,和另外3条模组的数据线组成4位元宽度,即可预防单一记忆体模组发生超过1位元的错误。

论服务器可靠性RAS,英特尔、AMD是半斤八两,像在Nehalem-EX(Xeon7500系列)时期,英特尔硬把Itanium一整套搬到x86平台变成“MCA Recovery”,可在记忆体区块标示硬件无法修复的错误,通知操作系统或虚拟机器管理员不再使用这些单元,关闭标示错误的数据并重新启动程序,AMD也从来没有缺席(软件支持性就见仁见智了),但AMD在21世纪初期曾短暂从英特尔手上夺过服务器的技术优势,依然值得大书特书。
经过千锤百炼的快取数据一致性协定
快取数据一致性协定(Cache Coherence Protocol)对多核心与多处理器平台的效能的重大影响,无论怎么说都是“着毋庸议”的,不只服务器RAS,x86 CPU在AMD K7问世的MOESI协定,相较于行之有年的MESI,Owner状态允许尚未更新主记忆体的内容前,不同CPU之间可提前共享、并交换修改后的快取区块,可大幅减轻系统汇流排的压力,这因K8整合记忆体控制器,而在多处理器环境,让主记忆体分散在四处的NUMA(Non-Uniform Memory Access)架构,更是决定效能的关键。
AMD或多或少有英特尔的MESIF协定殷鉴在前,Zen进一步扩充成MDOEFSI。

L3快取“海纳”L2快取标签的巧思,使其摇身一变,成为可过滤快取一致性协定广播的ProbeFilter(或称之为Snoop Filter,AMD的行销名称是HT Assist),不必像K10切割部分L3快取容量,或在系统芯片组塞一大块SRAM当成记录所有快取区块状态的目录,仅付出低成本实现高效率的快取一致性。

将MDOEFSI协定的细节束之高阁,目前看来在实体CPU芯片(CPU Complex)数量极多的EPYC和Threadripper运行还不错,长期大型单一晶粒共用L3快取的英特尔却没有这样的特殊考虑,也许当英特尔哪天基于成本因素,被迫和AMD一起“包水饺”,那时才是考验英特尔快取一致性协定的最佳时机。
支持大量处理器延展性的系统连结架构
最近AMD在财务分析师大会发表名为“Infinity Architecture”的Infinity Fabric3.0,不仅可连接多颗CPU和多颗GPU,更可当成CPU和GPU之间的桥梁。

但这对AMD来说并非新颖的概念,AMD早在十几年前K8的Hyper Transport就打算这样干了,而Infinity Fabric就是从Hyper Transpor延展出来的“超集合”,拥有更完整的功能,从定义AMD内部SoC IP区块的通用控制方式,到解决异构资料一致性的互连方案,都是持续进化中的InfinityFabric可大展身手的领域。

AMD未来面对的挑战依旧严峻
本文标题并不表示AMD这家公司就此功德圆满。回顾25年的AMD K系列CPU迢迢来时路,想必各位可渐渐感受到身为硕果仅存英特尔唯一x86竞争者(好吧,勉强还有中国台湾省VIA的Centaur和俄罗斯的Elbrus),面对资源数倍于己的超级强敌,身处毫无犯错余裕、如履薄冰、步步为营的艰困处境,研制产品时的取舍与挣扎,更是AMD困境的缩影。

至于时下的AMD是否“已经”成功,也是个巨大的问号,服务器市场市占率、营收与获利仍远远不及K8核心Opteron全盛期水准,另一边的GPU战场,还是被英伟达压着打,实际上只能算勉强站稳脚步,离“成功”两字仍有一段相当长的距离。AMD另一个比较大的潜在危机在于“未来性”,这和公司能真正“发大财”互为表里。
从量子电脑、人工智能到自动驾驶等新兴应用,AMD统统沾不上边,连在高效能运算市场要反攻Top500席次都还颇有难度,唯有巩固并扩张数据中心的获利与营收,才有足够银弹投资未来。偏偏这里又是英特尔重兵集结、拼死防御、明枪暗箭明招暗招毫无保留的“现金母牛”(Cash Cow),绝不会平白拱手让人。

AMD能否守住得来不易的战果,唯有寄望晶圆代工商业模式有机会让英特尔的制程霸权从此一去不复返,或英特尔再度犯下重大战略失策,但笔者对此的态度并不乐观,2020年第三季的Zen3与第三代EPYC“Milan”对AMD将是极为重要的命运转折点。从光鲜亮丽简报溢出来的满满忧虑,其实都早写在AMD高层和无数员工的脸上,只是你没看出来。
好戏即将上演,就让我们拭目以待。
来源:木易ai科技(头条号)
新闻来源:IC咖啡,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!

2026-06-25