向Intel迁移!(中)

来源:互联网 发布:液态金属机器人 知乎 编辑:程序博客网 时间:2024/06/05 07:41

文/王越

苹果暗中计划放弃PowerPC芯片后,组成了秘密团队希望使每个版本的Mac OS X都能在Intel的x86平台上无缝运行,与此同时,在HP的说服下,Intel在1999年开发出了Itanium处理器,但这款处理器却存在着两个致命的缺陷,这给竞争对手AMD留下了可乘之机。

暗度陈仓,苹果系统向Intel迁移

在Steve Jobs暗中决定抛弃PowerPC芯片转投Intel时,PowerPC在技术上并非没有优势,如果Mac OS X还没成型就对底层架构作如此大的变动,会得罪所有仅存的苹果用户,让苹果面临崩溃。当时的苹果己经弱得经不起什么折腾了,同时也需要IBM和 Motorola的支持去跟Microsoft竞争。

此外,如果在这时选择倒戈,很容易会使苹果沦为一家PC软件公司——之前 NeXTSTEP就是这个下场,软件数千份地卖出去,机器却卖不动,结果只能把硬件部门彻底关闭。而苹果现在的利润全在硬件上,如果宣称支持Intel, 很容易把自己逼上绝路。因此,Steve Jobs决定忍耐。

在产品上,苹果从之前跨架构的Rhapsody砍掉对x86的支持,转为只支持PowerPC一种硬件。你想用我家的Mac OS X系统?那么你只能买我的机器。

每 年的MacWorld或WWDC都会有环节不遗余力地嘲笑Wintel联盟。例如1999年他和Phil Schiller同学卖力地介绍PowerPC的AltiVec可以实现数据层面的并行,而且比Intel芯片快得多,在2001年7月18日的 MacWorld上,Steve Jobs请主管硬件的副总裁Jon Rubinstein介绍The Megahertz Myth,通过举例、列数字、作比较等各种技巧,论证虽然Intel芯片的主频比PowerPC高一倍,但Intel那群白痴使用比PowerPC长几倍 的流水,因此我们PowerPC芯片依然比Intel芯片快一倍。这次讲话通俗易懂地解释了流水、分支预测等高深的术语,简直可以称为计算机处理器知识的 科普视频。

在广告上,苹果除了之前的一些对比广告外,还推出了一系列好玩的嘲讽短片,例如Toasted Commercial,现在看来好像正好说明了PowerPC系列芯片的高功耗。

在产品介绍上,甚至很多PowerPC的缺陷都被包装成亮点,例如Power Mac G5的介绍短片,金牌设计师Jonathan Ive还专门出镜,说PowerPC太强大了发热量好高,所以我们得给它设计了一个很拉风的风扇云云……

但这只是外在的表现。这段时期,Steve Jobs在严格规划每个版本的Mac OS X时,专门秘密组织了一小班人马,这组人有个秘密代号——Marklar,最早于2002年被媒体披露,并在2005年被更多的媒体报道。这组人做的事, 就是——只要Steve Jobs一声令下,x86版的Mac OS X光盘就能送到开发者或用户手上。

先前讲到,NeXTSTEP具有 良好的移植性。但Mac OS X中,有大量源于Mac OS的代码,如Carbon等,都是存在一定的PowerPC架构依赖的(如Quick-Time、iTunes、Quartz等)。使用了大量 PowerPC特有的AltiVec功能来实现数据并行。因此移植仍具难度,需要改写至Intel的SSE指令。

在2012年的一个Quora回帖上,Kim Scheinberg介绍了苹果如何做到严格的保密措施,其中提到了Marklar的诞生。

2000 年她丈夫John为了和亲人团圆主动请缨要做Intel版本的Mac OS X。十八个月后,他回到组里报告成果,老板Joe看后大为满意,立刻拉来了分管技术的高级副总裁Bertrand Serlet。Bertrand问“如果我买个索尼的Vaio,你多长时间能把Mac OS X移植上去?”John回答“不用很长时间。” “两周还是三周?”“两三小时吧”。Bertrand Serlet遂让人买了台索尼机器,果然数小时后Mac OS X就在机器上跑起来了。于是,John的工作成为Marklar团队的起始点。

从PowerPC往Intel移植最困难的地方在于 PowerPC提供单指令多数据并行的功能AltiVec(后称为Velocity Engine)来实现高维向量、矩阵运算的硬件加速,这有点像Intel的SSE,但需要在代码里用特别的语句调用,这在QuickTime、 Quartz中常常用到。因此苹果把AltiVec包装成一个名为Accelerate的库,分别在两个架构上映射到AltiVec指令和SSE指令。这 个库提供了所有的BLAS、LAPACK功能并提供了非常高效的实现,做数值计算的同学不妨关注一下。

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位版?我们做(2003年AMD抢先于Intel发布了Athlon 64,随后又推出了面向主流消费市场的Athlon 64 X2)!Intel不做x86架构的多核处理器?我们做(2005年4月22日,AMD领先于Intel率先发布了拥有双核的Opteron处理器)!

跑分测试下来,AMD技术在许多方面远胜Intel,其中尤其以浮点运快著称。同时,AMD允许用户选择比Intel高的频率来跑运算(当然用户自己要承担CPU高频烧毁的风险),所以很多计算机爱好者更青睐AMD。

 

原创粉丝点击