现代硬件算法[2.1]: 指令集体系结构
指令集架构
作为软件工程师,我们绝对喜欢构造和使用抽象。
想象一下当你加载一个URL时会发生多少事情。你在键盘上打字;按键动作被操作系统以某种方式检测到并发送到浏览器;浏览器解析URL并要求操作系统进行网络请求;然后是DNS、路由、TCP、HTTP和所有其他OSI层;浏览器解析HTML;JavaScript发挥其魔力;页面的一些表示被发送到GPU以进行渲染;图像帧被发送到监视器……这每一个步骤中可能还会涉及到做几十件更具体的事情。
抽象有助于我们将所有这些复杂性降低到一个单一接口,该接口描述了某个模块可以做什么事情,而不需要关心具体实现。这提供了双重好处:
-
从事顶层模块开发的工程师只需要知道接口。
-
只要接口固定,从事模块本身开发的工程师就可以自由地优化和重构其实现。
硬件工程师也喜欢抽象。CPU的抽象被称为指令集架构(instruction set architecture,ISA),它从程序员的角度定义了计算机应该如何工作。与软件接口类似,它让计算机工程师有能力改进现有的CPU设计,同时也让用户——我们程序员——相信以前行之有效的东西不会在新的芯片上不适用。
ISA本质上定义了硬件应该如何解释机器语言。除了指令及其二进制编码外,ISA还定义了寄存器的数量、长度和用途,内存模型和输入/输出模型。与软件接口类似,ISAs也可以扩展:事实上,它们经常更新,主要是以向后兼容的方式更新,以添加新的、更专用的指令,从而提高性能。
RISC与CISC
从历史上看,有许多相互竞争的ISAs在使用。但与字符编码和即时消息协议不同,开发和维护一个完全独立的ISA成本高昂,因此主流CPU设计最终收敛到两个系列:
-
Arm芯片,几乎用于所有移动设备,以及其他类计算机的设备,如电视、智能冰箱、微波炉、汽车自动驾驶仪等。它们由一家同名的英国公司(IP授权)以及包括苹果和三星在内的多家电子制造商设计。
-
x86芯片,几乎用于所有的服务器和台式机,只有几个显著的例外,如苹果的M1 MacBook、AWS的Graviton处理器和当前世界上速度最快的超级计算机,所有这些都使用基于Arm的CPU。它们是由形成双头垄断的英特尔和AMD公司设计的。
它们之间的主要区别在于架构的复杂性,这更多的是一种设计哲学,而不是一些严格定义的属性:
- Arm CPUs是精简指令集计算机( reduced instruction set computers,RISC)。它们通过保持指令集的小型化和高度优化来提高性能,但是一些不太常见的操作必须用涉及多条指令的子程序来实现。
- x86 CPUs是复杂指令集计算机(complex instruction set computers,CISC)。它们通过添加许多专用的指令来提高性能,但其中一些指令可能很少在实际程序中使用。
RISC设计的主要优点是,它们可以产生更简单、更小的芯片,从而降低制造成本和功耗。所以毫不奇怪,市场自然地划分成:Arm主载了的以电池供电的通用设备,并将计算神经网络和伽罗瓦域的复杂任务留给了服务器级的高度专业化的x86。