跳转到主要内容

A.1 引言

本附录集中讨论指令集体系结构,也就是程序员或编译器作者能够看到的计算机部分。对本书读者而言,这些内容大多应当是复习;将其收录于此,是为了提供背景知识。

本附录介绍指令集设计者可选择的多种设计方案,重点讨论四个方面。首先,对指令集的不同方案进行分类,并定性评价各种方法的优缺点。其次,给出并分析一些基本不依赖特定指令集的测量结果。再次,讨论语言与编译器,以及它们对指令集体系结构的影响。最后,“融会贯通”一节展示这些思想如何体现在典型的 RISC 体系结构——RISC-V 指令集中。附录以指令集设计中的谬误与陷阱收尾。

为进一步说明这些原理,并与 RISC-V 对照,附录 K 还介绍四种其他通用 RISC 体系结构(MIPS、Power ISA、SPARC 和 Armv8)、四种嵌入式 RISC 处理器(ARM Thumb2、RISC-V Compressed、microMIPS),以及三种较早的体系结构(80x86、IBM 360/370 和 VAX)。1 在讨论体系结构分类之前,需要先说明指令集测量的一些问题。

本附录将考察多种体系结构测量结果。显然,结果取决于所测量的程序和使用的编译器。不能将这些结果视为绝对值;换用不同编译器或另一组程序,可能得到不同数据。我们认为,本附录中的测量能够合理地反映一类典型应用的情况。许多结果只使用少量基准程序,以便清楚展示数据和程序之间的差异。设计新计算机的体系结构时,应当在决策前分析规模大得多的程序集合。这里给出的通常是动态测量:某个事件的频率,按它在被测程序执行过程中实际发生的次数加权。

开始讨论一般原理之前,先回顾第 1 章的三类应用。桌面计算强调整数和浮点数据类型程序的性能,很少关注程序大小。例如,五代 SPEC 基准测试都从未报告代码大小。当今服务器主要用于数据库、文件服务、Web 应用,以及面向大量用户的一些分时应用。因此,浮点性能的重要性远低于整数和字符串性能;但几乎每一种服务器处理器仍然包含浮点指令。个人移动设备和嵌入式应用重视成本与能耗,因而代码大小非常重要:更少的存储器既更便宜,也更省电。为降低芯片成本,某些指令类别(例如浮点指令)可能是可选的;还可能采用专为节省存储空间而设计的压缩指令集版本。

尽管如此,这三类应用的指令集仍非常相似。事实上,与这里重点介绍的 RISC-V 类似的体系结构,已经成功用于桌面、服务器和嵌入式应用。

一种与 RISC 十分不同、却同样成功的体系结构是 80x86(见附录 K)。令人意外的是,它的成功未必否定 RISC 指令集的优点。与 PC 软件保持二进制兼容的商业重要性,加上Moore 定律提供的大量晶体管,促使 Intel 在外部支持 80x86 指令集,同时在内部采用 RISC 指令集。近期的 80x86 微处理器,包括过去十年制造的全部 Intel Core 微处理器,都通过硬件将 80x86 指令转换成类似 RISC 的指令,然后在芯片内部执行转换后的操作。这样既向程序员维持了 80x86 体系结构的表象,又允许计算机设计者实现具有高性能的 RISC 风格处理器。不过,80x86 这样的复杂指令集仍存在严重缺点;我们将在结束语中进一步讨论。

有了这些背景,下面开始探讨指令集体系结构的分类。


  1. 译注:原文称“四种”,但括号内实际只列出三个名称。 ↩︎