software和hardware之间总是存在tradeoff:要么是hardware结构复杂,software灵活。要么是hardware结构保持简洁清晰,software干一些脏活累活。VLIW就是属于后一种。

与Superscalar架构不同,VLIW将检查指令依赖关系的工作全部交给了编译器:编译器将没有依赖关系的指令打包成一个bundle,hardware不需要动态调度,只是负责取指、执行。

VLIW创始人Josh Fisher于1983年发表的论文Very Long Instruction Word architectures and the ELI-512提出了VLIW的Trace Scheduling思想,优化代码中最经常执行的路径。不过当时很多科学家对这种方式持怀疑态度,也许从学术角度来看这种思想有点意思,但人们压根不相信,可以建造一台依靠software而不是hardware来提速的计算机。但是Josh Fisher一直相信VLIW架构远远超出了一个学术项目范畴,它有潜力改变所有的科学计算。(Josh Fisher也发明了Instruction-level Parallelism这个术语)

Trace Scheduling

第一个VLIW编译器Bulldog由Josh Fisher和他的研究生John Ellis、Alex Nicolau和John Ruttenberg编写。John Ellis在1984年发表了博士论文Bulldog: A Compiler for VLIW Architectures,这篇论文被评选为ACM年度最佳计算机科学论文。

The Bulldog VLIW Compiler

Multiflow

也是1984年,Josh Fisher离开了耶鲁大学创建了Multiflow公司。他认为,为了追求利润,工业界会比固守计算机理论的学界同行对新技术更感兴趣 。不过生意并没有想象中的好做,这期间,计算机行业正在发生变化,硬件变得更便宜,以乔布斯的NeXT公司为代表生产的个人电脑可以运行许多科学应用,Multiflow公司遇到了严重的资金困难。到1990年公司关门为止,Multiflow一共只卖了125台机器(数据来源:Multiflow),Josh Fishe也加入了惠普实验室。

但是,故事到这里远远没有结束。

Itanium

当时,还有另外一家从事VLIW相关研究的公司Cydrome,在几年的经营后,也发现无以为继。其首席构架师以及联合创始人Bob Rau也加入了惠普。Bob Rau和Josh Fisher两个对处理器发展方向有着相同看法的人碰到了一起。他们依然相信,VLIW将成为未来主流的处理器指令集架构。

当时惠普内部开始觉得自己单独开发生产处理器的成本太高,于是找到了英特尔一起合作。当年英特尔有一个如鲠在喉的对手——AMD,促使英特尔其想跳出自己的X86构架,另辟道路发展。到1994年,英特尔和AMD两家公司一家花费了约2亿美元的法律费用,两家公司已经势如水火。此时惠普提出的新的处理器计划采用了和市场上其他厂商完全不同的方案,当时的英特尔认为找到了新的市场来甩掉这些跟屁虫。

1994年英特尔和惠普签订协议,宣布共同开发面向高性能计算(HPC)的处理器,也就是后来的Itanium,安腾。他们以VLIW指令作为基础,提出了显式并行指令集运算EPIC( Explicitly parallel instruction computing)。

由于这两个企业影响力巨大,他们的联合引起了整个行业的关注,各大软硬件企业纷纷表示此后将支持这个新的构架。除了发起方惠普和英特尔以外,渐渐的包括IBM、Novell、微软、Sun、甲骨文、红帽、DELL等一众企业都纷纷表示将支持新的构架。

至此,Josh Fisher和Bob Rau终于完成了自己创业时未完成的使命,把自己的技术理想打造成了万众瞩目的工业标准。

但,这也是一段噩梦的开始。上面提到,VLIW将复杂的指令调度交给编译器,处理器硬件只要在意性能,但英特尔和惠普忽略了在软件构造上的巨大挑战,这种难度完全超乎了想象。原计划1997年发布的首个安腾版本一直拖到了2001年才发布。

安腾最初的目的是通过降低硬件的复杂度大大提高硬件的效率,但是在实际开发中,发现软件优化实在太难了,实际上安腾最后还是保留了之前希望砍掉的分支预测功能,以保证整个软硬件系统协调运作。2002年,英特尔发布了第二代安腾处理器,有评论认为这是一款批着EPIC外衣的RISC处理器,安腾设计复杂度更高,功耗不降反升。

从1994年到2002年,8年时间,安腾的发展举步维艰,但是科技行业的发展瞬息万变。

2000年,AMD发布了基于X86的64位扩展技术AMD64,这个扩展允许64位和32位程序都可以在同一个处理器上运行。2003年,AMD推出面向服务器的产品Opteron(皓龙)的时候,大家似乎看到了新的希望。因为Opteron良好的性能,对原有32位程序的完美兼容,AMD很快打开了市场。

而英特尔这时候意识到,安腾也许不是一条正确的道路。英特尔在内部搞起了现在互联网公司常用的田忌赛马战术。2004年,英特尔宣布在其另外一条服务器产品线至强旗下引入 x86-64技术(实际上就是AMD64的翻版),以应对AMD的竞争。此时的英特尔,虽然还在履行和惠普的合约,继续更新安腾,但多少已经心不在焉,主要精力都转到主战场至强上去了。

安腾弱势的表现,让主流大厂商都已经停止对安腾的支持。而英特尔凭借强大技的术和生产制造能力,后来居上,最终将AMD再次碾压,安腾对英特尔来说也没有了价值。2010年,英特尔停止在自己新的C++编译器里面添加安腾支持,这基本上是判了安腾的死刑。

从1994年惠普和英特尔宣布启动处理器合作项目开始,到最后一代安腾发布,整整经过了23年时间。这期间英特尔换了4个CEO,惠普换了6任CEO。

回过头来看,安腾有几个比较严重的问题:

  • 不兼容。如果你想让你的应用在IA64的安腾服务器上运行,你需要重新编译一份IA64的应用。早期的安腾虽然兼容IA-32,但是性能很低。
  • 当处理器的执行宽度(execution width),指令执行延迟时间,执行单元个数(function unit)改变时,需要重新编译程序来适应。但是Superscalar却不需要。
  • 安腾缓慢的发展期间,AMD64的崛起,让英特尔不得不调整方向。

但是VLIW真的无药可救吗?现在可能无法下出定论。VLIW在DSP以及ATI GPU都有应用。后续如果有新的应用场景、其他技术的发展,说不定会重新带动VLIW。Google的TPU也用到了VLIW,而且它用到的systolic array技术在1979年被H. T. Kung和Charles E. Leiserson在论文Introduction to VLSI Systems中描述,而早在1944年的Colossus Mark II就采取了类似的技术。

CPU长指令(VLIW)失败的主要原因是什么,VLIW真的无药可救吗?的更多相关文章

  1. 单片机、CPU、指令集和操作系统的关系

    郑重声明:转载自http://blog.csdn.net/zhongjin616/article/details/18765301 1> 首先讨论各种单片机与操作系统的关系 说到单片机,大家第一 ...

  2. dede数据库文件导入失败的可能原因是数据表前缀不同,这里的失败指的是mysql添加了数据,但后台不显示

    利用dede提供的数据备份还原功能,还原数据,出现失败的可能原因是数据表前缀不同,改过来就可以了

  3. javascript小数相减会出现一长串的小数位数的原因

    javascript小数相减会出现一长串的小数位数的原因 <script> var a='38.8'; var b='6.8'; alert(parseFloat(a)-parseFloa ...

  4. cpu读取指令时读取的长度

    CPU读取指令时,如果单字节指令,一次访存即可完成读取操作:如果是多字节指令,会根据第一次读取指令的操作码与寻址标志位,判断指令的后续长度,进而完成整个指令的读取,同时指令指针IP会自动进行修改,指向 ...

  5. “一键制作启动u盘失败”的主要原因是什么?

    一键制作启动u盘失败的主要原因是什么?今天u启动小编就和大家一起来分析原因并寻求答案吧!     原因分析:   1.u盘内有文件正在运行或者是打开:   2.u盘自身的质量问题:   3.最主要的原 ...

  6. java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)

    今天,我们来学习另一个重要的概念. CPU内存指令重排序(Memory Reordering) 什么叫重排序? 重排序的背景 我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多.当CP ...

  7. malloc函数分配内存失败的常见原因

    malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存 ...

  8. 经典变长指令ModR/M

    变长指令 不是所有的指令都是,看到opcode就知道有多长(定长指令),当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M. 该字节的8个位被分成 ...

  9. CPU 多核指令 —— WFE 原理【原创】

    转自:http://tinylab.org/arm-wfe/ Zhang Binghua 创作于 2020/05/19 打赏 微信公众号   知识星球 关注 @泰晓科技 与数千位一线 Linux 工程 ...

随机推荐

  1. alpakka-kafka(9)-kafka在分布式运算中的应用

    kafka具备的分布式.高吞吐.高可用特性,以及所提供的各种消息消费模式可以保证在一个多节点集群环境里消息被消费的安全性:即防止每条消息遗漏处理或重复消费.特别是exactly-once消费策略:可以 ...

  2. 如何将EDI报文转换为CSV格式文件?

    如果您对EDI项目实施有一定的了解,想必您一定知道,在正式开始EDI项目实施之前,都会有EDI顾问与您接洽,沟通EDI项目需求.其中,会包含EDI通信双方使用哪种传输协议,传输的报文是符合什么标准的, ...

  3. DESUtil

    package com.tebon.ams.util;import sun.misc.BASE64Decoder;import javax.crypto.Cipher;import javax.cry ...

  4. Java线程--Callable使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871727.html Java线程--Callable使用 Callable和Runnabl ...

  5. VUE3 之 ref、provide、inject 的使用 - 这个系列的教程通俗易懂,适合新手

    1. 概述 首因效应告诉我们: 在日常交往中,第一印象是非常重要的,好的第一印象能让我们在与人相处时事半功倍. 但也从另一面告诉我们,不能仅凭第一印象去判断一个人,有时虚假的第一印象,也有可能蒙蔽我们 ...

  6. 编译安装http2.4

    编译安装http2.4 1.安装相关依赖包 [root@centos7 ~]yum -y install gcc make 2.下载http2.4包,并解压 [root@centos7 ~]#tar ...

  7. Intellij IDEA出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver处理办法

    菜单-->File-->project structure-->Modules-->Dependencies-->添加MySQL的驱动包:mysql-connector- ...

  8. JVM学习——内存空间(学习过程)

    JVM--内存空间 关于内存的内容,内存的划分.JVM1.7 -> 1.8的变化比较大 JVM指令执行的时候,是基于栈的操作.每一个方法执行的时候,都会有一个属于自己的栈帧的数据结构.栈的深度, ...

  9. 多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识

    昨日内容回顾 外键字段 # 就是用来建立表与表之间的关系的字段 表关系判断 # 一对一 # 一对多 # 多对多 """通过换位思考判断""" ...

  10. 轩辕展览-VR虚拟展厅设计如何实现全景漫游功能

    什么是在线3d漫游?如何在VR虚拟展厅设计之中实现3d漫游功能?让我们来分享3dVR虚拟展厅的在线漫游. 实际上,在线3d漫游就是通过3d仿真场景,使用鼠标和键盘在虚拟空间之中自由漫游,它可以从高空俯 ...