2014年俄罗斯的MCST(Moscow Center for SPARC Technologies)发布四核心国产处理器Elbrus-4C,其中两个核心转译x86指令集,两个核心当一般用途,后来有人发布在Elbrus处理器平台,执行2002年游戏《上古卷轴III:魔卷晨风》的画面。

目前Elbrus产品线已发展到16核、时脉2GHz的Elbrus-16S。前苏联与俄罗斯体系的高性能处理器是非常值得特别介绍的精彩主题,之后有机会再与读者分享。

扣除标题(Header),Elbrus E2K的单一举令最多可包含1~15个指令,指令编码长度介于64到512位元(一般RISC都固定32位元),说这个不叫“超长指令”,那还真的很难找出更长的例子了。

由“苏联的超级计算机之父”Boris Babaian领衔开发的Elbrus系列处理器,技术基础E2K早在1999年就披露技术细节(虽然那时只是处于Verilog硬件描述语言阶段,尚无实物),Elbrus E2K也是采用超长指令集架构(Very Long Instruction Word,VLIW)的处理器。
如同1990年代VLIW曾流行一阵的趋势,从数字信号处理器到泛用处理器,从Philips的TriMedia、斯洛伐克的创业公司DanSoft、ADI / Lucent / Motorola / TI的诸多数字信号处理器(DSP)、英特尔i860、Fujitsu FR-V、Linus Torvalds曾参过的Transmeta Crusoe、Sun的MAJC、与英特尔Itanium等族繁不及备载的案例。
特别一提,1980年代的VLIW先驱者:Multiflow(Trace 7/300)与Cydrome(Cydra 5),先后被惠普(HP)购并,催生了VLIW化的PA-RISC处理器计划,演变成后人熟知的IA-64指令集与英特尔Itanium处理器。
究竟VLIW有什么神奇的魅力,吸引这么多厂商共襄盛举?为何又在今日主流泛用处理器几乎消失无踪?让我们继续看下去。
当超纯量处理器越来越复杂
1980年代末期,随着超管线(Superpipeline)、超纯量(Superscalar)、非循序指令执行(Out- Of-Order Execution)、与预测执行(Speculative Execution)的普及化,激增了处理器同时执行的指令数,电路复杂度也随之水涨船高。
超纯量架构每个时脉周期需截取(Fetch)、解码(Decode)、执行(Execute)并写回(Write Back)两个以上指令,势必带来资源冲突的状况,像资料依赖性(某个指令需要后面指令的资料)、控制依赖性(指令需等待条件判断的结果)、结构依赖性(两个指令同时使用某个执行单元或托管器文件),为了处理这些问题,处理器微架构只会更精密复杂,也增加产品跑出bug的几率。
RISC指令集崛起固然纾解这方面的困难,但仍难斩草除根,为了持续提高性能以因应商业竞争,近代高性能RISC处理器还是稳定恐龙化,更不用讲CISC的x86体系了。
当年英特尔Pentium的浮点除法bug事件,就告诉世人残酷的真相:如同软件,处理器也是会出问题的(尤其偏偏又是难搞的x86指令集),今日常见的主流处理器,“Errata Sheets”无不是长长一串,还不少是永远不会修正的陈年宿疾。
但已生产出货的硬件,出了问题难以修正是一回事,假如我们将处理器的复杂度“转嫁”到软件呢?甚至将指令平行化“绑定”在指令集架构呢?这就是VLIW会在1990年代短暂流行的时代背景了。
概念起源于大型主机的水平微码
VLIW的概念起源非常古老,早在1946年,伟大的计算机科学与人工智能之父Alan Turing(艾伦‧图灵,电影《模仿游戏》的主角)就已经提出水平式微码(Horizontal Microcode,每个字段水平对应电路动作,相对于还需要额外解码的垂直式微码)的想法,细节由微码一词的创造者Maurice Wilkes补完,在首创“计算机结构(象征可回溯兼容的指令集架构)”的IBM S/360大型主机(Mainframe)诞生过程中,发挥了关键性影响力。
在IBM的S/360问世前,每台计算机的指令集都是针对特殊应用量身订做,互不兼容,这对今天习惯同时在英特尔AMD VIA的x86处理器,执行相同操作系统与应用程序的我们来说,的确是很难想象的场景。
当然微码不等于指令,只是用来实做指令的某种手段,如通过微码组成的微程序产生控制信号。但之后1970年代,某些使用水平式微码实例控制单元的特殊应用计算机,如Floating Point Systems的产品,就导入了可写入(不再只读)的微码内存,使其摇身一变,成为可程序化的VLIW计算机,接着就是1980年代,像Multiflow、Cydrome和Culler这些规模较小的计算机公司,企图打造泛用VLIW架构迷你超级计算机的故事了。
将指令平行化直接绑在指令集内
VLIW的核心精神就在于“将指令平行化直接绑在指令集架构内”,一个指令就“包”了一堆不同性质的运算,一次喂给处理器。以一个简单的双算子加法为例,CISC、RISC和VLIW的面貌就如下图,相当简单易懂。

最理想化的VLIW,就是“一个萝卜一个坑”,每个不同运算性质的指令字段直接对应专属的执行单元,无需硬件进行指令调度与分配,统统软件搞定。这也意味着编译器(Compiler)产出的二进制执行码,能否“塞好塞满”的优化调度指令,将决定VLIW的实用性。如果优化程度不足,只会代表指令内充满了大量什么都不做的NOP(No Operation),不仅浪费执行单元,并伤害执行性能。
软件回溯兼容性是VLIW的大麻烦
程序代码过肥是VLIW的首要麻烦。同样出自英特尔之手,VLIW的IA-64,程序代码体积高达x86的3.7~4.8倍,这冲击充分反映在更大型化的缓存内存容量与更高效率的内存子系统。
二进制执行码兼容性也是VLIW的主要限制,如未来处理器增加更多执行单元,降低了执行指令的时间延迟,就必须修改指令集格式与指令调度,也意味着不同版本的程序代码,造成在“不同时代或不同指令派发宽度”的VLIW处理器之间移植程序,会比硬件分派指令的超纯量架构困难许多。
虽然这并不代表超纯量架构不需要软件优化(像英特尔自家编译器就有对应自家x86处理器的参数,如QxP就专属于90纳米Pentium 4“Prescott”并尽量使用添加的SSE3指令,以此类推),但起码确保兼容于过去的程序代码,却是无法否认的重大优势,这也是今日超纯量架构依旧是高性能泛用处理器主流的关键因素。
企图让VLIW通用化的最后努力:英特尔IA-64
但VLIW也并非铁板一块、非得“遵循古法”不可,英特尔和惠普(HP)合作的IA -64指令集就企图打造更有弹性、不将指令格式跟执行管线绑死的VLIW指令集。
IA-64将3个41位元长的指令,与标定内部指令顺序的样板位元(Template),包成一个128位元长的指令包。当指令包送进处理器内部的执行单元前,只要借由读采样板位元,即可事先得知“后面该做什么事”,分配需要的执行单元,指令就“顺顺的”被循序执行,整个指令包被处理完毕后再退返(Retire),依然享有VLIW的大部分优点,只是硬件就可能比纯VLIW稍微复杂一些。

不过绑了一堆运算的VLIW,会对条件判断流程引发的管线停滞(Stall)特别的感冒,从指令集层面设法减少分支指令,也是IA-64(与众多VLIW指令集)的努力方向。
IA-64配置了64个由软件控制的引述码(Predicate)托管器,假若可在分支发生之前,确认分支条件的结果,编译器可经由引述码来控制指令执行流程,不必去赌分支预测是否中奖,并承担“赌输”的代价。讲的更玄一点,引述执行(Predicated Execution)将“控制流”转换成“资料流”,换一个说法则是“控制依赖性”转化成“资料依赖性”。

如果各位觉得看程序代码很烦,那看这张图就对了。
谈到引述执行,顺便一提,其实以nVidia G80(Tesla)为首的GPGPU,SIMT(单指令多线程)架构也是靠这一千零一招,控制庞大线程的执行流程,这也是和SIMD(单指令多重资料)最大的不同点。
结束“泛用VLIW”的Itanium 9500“Poulson”
现在看似“泛用VLIW”IA-64如此美好,兼顾VLIW的简洁性与超纯量的兼容性,但天底下没有白吃的午餐。英特尔前三个时代的Itanium核心(Merced、McKinley、Tukwila),都是简单的静态指令调度,单线程最多同时执行两个指令包(6条指令),为了尽快“完成指令并驱赶之”,必须准备足够的内部资源,以匹配6个指令的组合,固然简化了处理器内部的资料路径,但却也浪费了庞大的内部执行单元,导致Itanium核心肥大化,并且让Itanium的单线程性能追不上同期的x86处理器。


日后由DEC Alpha团队操刀的Itanium 9500“Poulson”,走上一条彻底否定VLIW核心价值的回头路,直接做成类似超纯量的动态指令调度,管线前端就拆光指令包,不同类型的指令有专属的指令调度队列,并将同时可发派的指令包倍增成4个,实现更高的处理器利用率,相较前代激增25%~40%性能。
但这也变相宣布“General Purpose VLIW is Dead”。
2000年,当英特尔和惠普意气风发发布Itanium处理器与IA-64指令集,并宣称“非循序指令执行已经过时了”(Out-Of-Order is Out-Of-Date),时任IBM院士、曾为RISC早期研究案IBM 801计划设计者的Martin Hopkins,对英特尔和惠普发动的反击与批评,以及两位RISC大师合着的教科书,将Itanium描述为“平庸的整数运算处理器”,事后看来统统一语成谶,令人不胜唏嘘。
VLIW还会再起吗?
CISC的出现,RISC的反动,到x86至今仍稳坐服务器和个人计算机的主流地位,我们可清楚理解一个简单的事实:在不同的时代背景,基于不同的技术限制和应用考量,哪些工作该让硬件处理,哪些事该丢给软件搞定,这条软件和硬件之间的界线,从来就不是固定的,也没有绝对标准。但从1964年IBM S/360大型主机创建的回溯兼容性观念,重要性却深植人心,仍为重中之重,更是VLIW迟迟难以跨越的门槛。
在超纯量动态调度处理器仍为主流的当下,自从英特尔Itanium后,除了GPU(AMD第三代绘图架构TeraScale)、嵌入式应用或数字信号处理(DSP),几乎不见VLIW在泛用处理器的身影,俄系血统且身为x86兼容处理器的Elbrus,变成濒临绝种的珍通用兽,这也是笔者下一篇专文介绍的主角,敬请拭目以待。
(首图为示意图;来源:shutterstock)