英特尔的安腾 (Itanium) 架构处理器是怎么失败的?

时间:2021-09-11 23:30:32
作者:邢富
链接:https://www.zhihu.com/question/22666196/answer/22657517
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

《程序员》2013-2期《MAC OS背后的故事——向Intel迁移!(中)》说的很明白。以下是摘自其内容:
Itanium的诞生

有了Marklar团队的成果,接下去只是何时转换到x86架构平台的问题。但这时,Intel却持续走低,苹果似乎有了一个除Intel以外的选择——AMD。

在1989年,HP认为RISC架构将来会遇到每周期只能执行一个指令的瓶颈。所以想搞一套名为EPIC的新架构。但由于HP不具备研发处理器的资本,所以在1994年拉拢Intel跟它以EPIC为基础,合搞一套叫IA-64的处理器。

先前提到,为了使代码高效地执行,当时Intel已经做出了超纯量乱序执行的Pentium Pro架构。整个框架的原理是读入一系列的指令,把每个指令分解成RISC分格的微指令,使用暂存器重命名等算法来计算并移除指令的依赖关系,然后并发执 行多条语句,达到一个时钟频率能够执行多个指令的目的。

但HP的忽悠能力比较强,它对Intel说:“为什么我们需要由硬件实现乱序执行 呢?你们的处理器为了把x86指令解成微指令,需要一个比RISC架构复杂得多的解码器。而为了达到乱序执行,你们设计了一整套复杂得多的逻辑去判断执 行,这是计算机在运行中所需要付出的代价!

现代的编译器早就足够高级了,完全能在编译时判断语句的依赖关系,并且自动进行暂存器命名等一系列的算法,所以在程序编译时就能给出一个个指令包,每个指令包包含了一系列能同时并发执行的RISC指令。

我 们完全可以设计一个新指令集,称为超长指令字架构(VLIW,Very Long Instruction Word),一个指令包中的所有指令都会转化成一个VLIW语句。这样,当VLIW语句通往芯处理器时,处理器就无需进行复杂的解码(因为指令本身是 RISC风格的)、逻辑判断(因为编译时己判断好了)、暂存器重命名、乱序执行算法,只要解开一个VLIW指令让分配器并发执行就行了。

因此,我们的编译器就能决定让这些小指令同时执行于单一周期,处理器能够简单地执行这些指令而不需要很复杂的架构去决定哪些指令能够并行执行。”

Intel被这么一忽悠觉得IA-64大有前途,如果搞出来,会被多数的企业系统制造业采用,所以开始下血本开发。由于1998年正值电影泰坦尼克号热映,Intel在1999年10月4日发布该处理器的官方名称为Itanium。

Intel 认为,Itanium将会是个终级架构,可以解决一切问题,将会是未来的发展方向。虽然指令集和x86完全不兼容,但随着服务器领域和将来的桌面领域从 32位迁移到64位,指令集肯定是需要做出重大改变的,利用这个机会,Intel自然可以*采用一种新指令集和过去划清界限。于是索性就不用开发64位 的x86了,逼着大家都用Itanium就可以了。

正当Intel做着天上降下黄金雨的美梦时,它完全没有意识到灾难己经临近。Itanium的设计看似完美无缺,但他们没有意识到其中两个重大的问题——指令宽度和Cache。

“短板”原理在Itanium上应验

x86的好处是,虽然这是一个CISC的指令集,但这个指令集对程序执行的逻辑没有额外的限制,所以只要Intel保证产生的运算结果是一致的,就可以以任何方式实现这个指令集,例如解成RISC、增加超纯量模块、调度成乱序并行执行,Intel想怎么做都可以。

但Itanium让编译器决定一切,编译器自动判别依赖关系并产生一个个指令包,每个包内的指令不存在依赖关系,所以指令集一公布,要想改就困难了。例如每 个VLIW指令包是包着三个RISC指令的,如果若干年后做出了能并行执行六个指令的芯片,那它能一起执行两个VLIW指令吗?

醒醒吧,因为这两个VLIW指令很可能有依赖关系!那可以重新让处理器判断依赖关系后再执行吗?该吃药了——Itanium花那么多血本就是想让编译器搞定一切而不用处理器判断!

那怎么办呢?只有两个办法:其一是一次运行三条指令(即使我的机器有能力执行六个宽度),所以程序执行效率只有一半;其二是要求每有新一代的芯片出现,所有 程序都要重新编译才能完全发挥芯片设计的理论效能。这是让人无法忍受的一件事——难道今后软件发布出来,要为各个指令宽度的Itanium各做一个版本吗?

更麻烦的问题是Cache。Cache是处理器上用于减少处理器访问记忆体所需平均时间的部件。其容量远小于内存,但速度却可以接近处 理器的频率。当处理器发出内存访问请求时,会先查看Cache内是否有请求资料。如果命中,则不经访问记忆体直接返回该资料;如果不存在,则要先把记忆体中的相应资料载入Cache,再将其返回处理器。

与前面那种情况相比,这需要更长的等待时间。至于什么资料是在Cache内的,完全是由计算机程序运行时决定。编译器在编译时是无法预测程序在执行时所使用Cache的情况的——这一切完全是随机的。对于一个可以乱序执行的处理器而言,如果某 条数据的结果不在Cache里,可以动态调度,先执行别的语句,从内存里取出,再执行这条语句。

像Itanium把可以并发的程序指令捆在一个包中,如果这个包中所需要的变量还在内存里,那处理器就什么都干不了,只能等从内存数据搬到Cache中。所以,Itanium的执行效率不会好于乱序执行的处理器。

正当Intel一步步坚定不移地在死路上越走越远时,Intel的竞争对手AMD却没闲着。

Intel不做x86架构的64位版(处理器架构称作x86_64,注意安腾的称作IA64,IA32指Intel 32bit处理器架构)?我们做(2003年AMD抢先于Intel发布了Athlon 64,随后又推出了面向主流消费市场的Athlon 64 X2)!Intel不做x86架构的多核处理器?我们做(2005年4月22日,AMD领先于Intel率先发布了拥有双核的Opteron处理器)!

跑分测试下来,AMD技术在许多方面远胜Intel,其中尤其以浮点运快著称。同时,AMD允许用户选择比Intel高的频率来跑运算(当然用户自己要承担CPU高频烧毁的风险),所以很多计算机爱好者更青睐AMD。
作者王越,美国宾夕法尼亚大学计算机系研究生,中国著名TeX开发者,非著名OpenFOAM开发者。