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)两个以上指令,势必带来资源冲突的状况,像资料相依性(某个指令需要后面指令的资料)、控制相依性(指令需等待条件判断的结果)、结构相依性(两个指令同时使用某个执行单元或暂存器档案),为了处理这些问题,处理器微架构只会更精密复杂,也增加产品跑出臭虫的概率。
RISC 指令集崛起固然纾解这方面的困难,但仍难斩草除根,为了持续提高效能以因应商业竞争,近代高效能 RISC 处理器还是稳定恐龙化,更不用讲 CISC 的 x86 体系了。
当年英特尔 Pentium 的浮点除法臭虫事件,就告诉世人残酷的真相:如同软件,处理器也是会出问题的(尤其偏偏又是难搞的 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)
延伸阅读:
- 充满传奇色彩且对后世影响深远的 Alpha 处理器
- 处处无所不在、但几乎无往不失败的英特尔 Atom“原子小金刚”
- 从历史脉络理解 AMD 为何要双轨化 GPU 发展路线