让我们记住,CPU 的主要任务是执行程序。同意 CPU 内部的工作方式对我们来说并不重要,重要的是它执行我们传递给它的程序。不仅执行,而且完全按照我们的预期执行!问题是某个处理器可以执行哪些程序以及这些程序的语义是什么。这正是ISA所定义的——CPU 可以执行哪些程序以及这些程序可以做什么,但微架构决定了 CPU 从内部如何排列。
现在多一点。
ISA 是 CPU 和在该 CPU 上运行的程序之间的接口。ISA 定义了程序员可见的寄存器数量、可用指令、对齐规则等。如果你想为特定的 CPU 编写程序,你可以拿着它的 ISA 手册,一一写下指令。此类参考的一个示例是Intel® 64 和 IA-32 架构软件开发人员手册- 它描述了 Intel 64 和 IA-32 架构(这些是大多数现代台式计算机中使用的 x86 系列架构)的编程模型。
反过来,微架构决定了 CPU 在内部的排列方式。它由哪些功能节点组成,缓存的层次结构,指令如何解码,流水线中有多少阶段,等等。
微架构不影响程序执行的语义和结果,但会影响它们的执行速度。我们可以在旧的 Pentim IV 和新的 Threadripper 上运行 Doom 3 - 它可以在那里和那里工作,只有在最新 CPU 上的工作速度会更高。
除了性能之外,微架构还会影响处理器的功耗。例如,有一次,英特尔推出了一系列针对移动设备的 Atom 处理器。这些 CPU 实现了相同的 x86 架构,但它们的内部设计允许它们节省功耗,这使得它们适用于便携式设备。
程序员看不到微架构†,程序员在 ISA 级别工作。如果两个不同的处理器实现相同的 ISA,那么它们可以执行相同的程序。例如,AMD 和 Intel 生产 x86 系列架构的处理器,这就是我们可以在 Intel 和 AMD 处理器上运行相同程序的原因。
重要的是要理解 ISA 并不反映 CPU 中的实际进程,而只是程序员/编译器的抽象。例如,ISA x86 向程序员承诺,他编写的所有指令都将按顺序执行,一个接一个‡。但实际上,现代处理器并行执行大多数指令,而不是按照程序员编写它们的顺序(参见指令级并行性)。那么,如果指令以随机顺序执行,程序如何工作呢?事实是,通过随意执行指令,处理器确保在程序员看来指令是按顺序执行的*。
原则上,这个我们可以聊很久,但总的来说,ISA 和微架构是不同层次的抽象。如果我们把 CPU 看成一个黑盒子,那么 ISA 就是它的接口,而微架构就是它的内部设备。
通常,“架构”是指指令集架构 (ISA) 级别的架构。
让我们记住,CPU 的主要任务是执行程序。同意 CPU 内部的工作方式对我们来说并不重要,重要的是它执行我们传递给它的程序。不仅执行,而且完全按照我们的预期执行!问题是某个处理器可以执行哪些程序以及这些程序的语义是什么。这正是ISA所定义的——CPU 可以执行哪些程序以及这些程序可以做什么,但微架构决定了 CPU 从内部如何排列。
现在多一点。
ISA 是 CPU 和在该 CPU 上运行的程序之间的接口。ISA 定义了程序员可见的寄存器数量、可用指令、对齐规则等。如果你想为特定的 CPU 编写程序,你可以拿着它的 ISA 手册,一一写下指令。此类参考的一个示例是Intel® 64 和 IA-32 架构软件开发人员手册- 它描述了 Intel 64 和 IA-32 架构(这些是大多数现代台式计算机中使用的 x86 系列架构)的编程模型。
反过来,微架构决定了 CPU 在内部的排列方式。它由哪些功能节点组成,缓存的层次结构,指令如何解码,流水线中有多少阶段,等等。
微架构不影响程序执行的语义和结果,但会影响它们的执行速度。我们可以在旧的 Pentim IV 和新的 Threadripper 上运行 Doom 3 - 它可以在那里和那里工作,只有在最新 CPU 上的工作速度会更高。
除了性能之外,微架构还会影响处理器的功耗。例如,有一次,英特尔推出了一系列针对移动设备的 Atom 处理器。这些 CPU 实现了相同的 x86 架构,但它们的内部设计允许它们节省功耗,这使得它们适用于便携式设备。
程序员看不到微架构†,程序员在 ISA 级别工作。如果两个不同的处理器实现相同的 ISA,那么它们可以执行相同的程序。例如,AMD 和 Intel 生产 x86 系列架构的处理器,这就是我们可以在 Intel 和 AMD 处理器上运行相同程序的原因。
重要的是要理解 ISA 并不反映 CPU 中的实际进程,而只是程序员/编译器的抽象。例如,ISA x86 向程序员承诺,他编写的所有指令都将按顺序执行,一个接一个‡。但实际上,现代处理器并行执行大多数指令,而不是按照程序员编写它们的顺序(参见指令级并行性)。那么,如果指令以随机顺序执行,程序如何工作呢?事实是,通过随意执行指令,处理器确保在程序员看来指令是按顺序执行的*。
原则上,这个我们可以聊很久,但总的来说,ISA 和微架构是不同层次的抽象。如果我们把 CPU 看成一个黑盒子,那么 ISA 就是它的接口,而微架构就是它的内部设备。
† 当然,这并不完全正确。程序员和编译器可以利用他们对特定处理器微架构的了解来应用某些低级优化:知道缓存的大小可以放置代码和数据,以便它们适合缓存行,知道特定处理器支持延迟槽,编译器可以使用此信息来例如调整分支延迟等。
‡ 一个强有力且不完全正确的简化。虽然,当然,有时你不得不担心内存障碍,但总的来说,程序确实为程序员按顺序执行。
* 如果有人熟悉 C++,就好像规则一样。