简介
近期有一篇文章声称:“x86架构需要退出历史舞台”。这个观点引发了广泛的讨论。在ThePrimeagen的直播节目中,一位资深专栏作家对这个观点进行了深入的探讨。本文将基于参考文献,以通俗易懂的方式详细解读这一观点,并举例说明。
内存寻址的问题
在这篇文章中,有人认为CPU在实模式下的“直接访问内存”的能力给现代x86架构带来了很多遗留问题。但实际上,这些问题与直接内存访问关系不大。问题主要源于早期8086实模式的一些兼容性要求,其中涉及更多的16位段寄存器用于内存地址计算。而要解决的问题是如何正确计算和维护这些寄存器的地址。
然而,不必完全相信我的观点。因为Intel公司已经提出了一份详细的架构改进方案,他们清楚地列出了x64架构中可以简化的部分,包括旧式分段寻址。此外,Intel还提出了其他一些改进,比如移除未使用的特权级等。这些都可以在他们的提案《Envisioning A Simplified Intel Architecture》中找到。
指令编码的问题
另一个问题是x64指令编码的复杂性,这使得同时解码大量指令变得不够高效。我们可以认为这是x64架构需要改进的主要方面,需要重新排列一些位模式,使得同时解码多条指令更加简单。
举个例子,许多指令都会影响标志位,而条件指令通常会根据这些标志位进行操作。这种设计导致了很多“不必要的依赖性”,即使你可能并不关心某些指令对标志位的修改,CPU仍然需要跟踪这些标志位的变化,而且你(或者更常见的是编译器)也需要小心地避免在你关心的标志位变化和随后依赖它的条件指令之间使用会覆盖标志位的指令。
因此,一个可能的改进是在x64架构中引入一些不影响标志位的指令,比如用于移位操作的指令。这样,当程序员不打算修改标志位时,可以使用保留标志位的移位指令。
同样,不必完全相信我的观点。Intel已经提出了一项指令集扩展方案,称为Advanced Performance Extensions(APX),它解决了这些问题并引入了许多性能改进。该方案允许许多常见指令不写入标志位,并包含许多其他面向性能的功能。
x86是否需要退出历史舞台?
如果我们将目光转向RISC-V这样的新兴架构,我们会发现它在某些方面并不如x86。举例如,最新的RISC-V V扩展是为了在计算密集型工作负载中提供向量支持而设计的,但其指令集设计在第一个版本中存在一些问题。这部分原因在于他们决定不使用可变长度的指令编码。结果,尽管现代的SIMD/向量指令集(如AVX-512、ARM SVE和GPU的自定义指令集)可以根据你选择的掩码寄存器执行指令,但RISC-V V只能在打开或关闭掩码时进行操作,并且只能从v0寄存器读取掩码,没有其他可用的掩码寄存器。
为什么会这样呢?因为他们在32位指令编码中无法腾出足够的位数来引用更多的掩码寄存器!相比之下,当AVX-512引入掩码功能时,它支持从8个掩码寄存器中选择。正如往常一样,x64架构的设计者们选择了支持更复杂的指令解码,而忽略了成本的增加。
因此,我们不应该将问题看作是“固定长度指令好,可变长度指令坏”,而应该将其视为一种权衡。紧凑一致的指令编码需要付出代价,使得在应对行业和计算环境的变化时变得更加困难。这也使得硬件和软件更难以及时提供满足新兴高性能软件领域需求的新指令。你要么牺牲指令质量(如RISC-V所做的),要么像x86/x64一样选择更复杂的解码逻辑。
我们强烈怀疑RISC-V的未来修订版本将会选择后者。RISC-V支持可变长度编码,而且我不会感到意外的是,一旦它的存在时间达到x86的一小部分寿命,为了在高性能类别中保持竞争力,它将需要更多地利用可变长度编码方案。
总的来说,我不认为x86(x64)架构需要退出历史舞台。尽管它有缺点,但在过去的四十年中,x86架构在软件开发领域发挥了巨大作用,为我们提供了稳定性和灵活性。虽然x64有改进的空间,但ARM和RISC-V等架构并不一定比x64更好,它们也有各自的局限性和权衡。此外,x64的未来可能更多地受到商业因素的影响,如许多公司提供ARM和RISC-V处理器的原因是ARM可以被任何人授权,而RISC-V则是免费的。
总而言之,x64架构在技术上并不需要退出历史舞台。虽然有改进的空间,但它仍然在软件开发中发挥着重要的作用。如果将来x64架构被逐渐淘汰,更可能是出于商业原因,而不是技术上的限制。
参考文献:
Intel的Advanced Performance Extensions(APX)是一项指令集扩展方案,旨在提高Intel架构的性能。该方案通过扩展x86指令集,增加寄存器数量和引入新的功能,以提供高效的性能提升,而不会显著增加核心的硅面积或功耗。
以下是APX的一些关键特点和优势:
- 增加通用寄存器数量:APX将通用寄存器(GPRs)的数量从16个增加到32个。这使得编译器可以将更多的值保存在寄存器中,从而减少了加载和存储操作的次数。与基于Intel 64基线编译的代码相比,APX编译的代码中的加载操作减少了10%,存储操作减少了20%以上[1]。
- 快速且低功耗的寄存器访问:APX中的寄存器访问不仅更快,而且消耗的动态功耗也比复杂的加载和存储操作要少得多。
- 简化的编译器支持:编译器支持APX非常简单。新的REX2前缀提供了对新寄存器的统一访问,而Intel AVX指令则通过现有的EVEX前缀中定义的新位来实现访问。此外,传统的整数指令现在也可以使用EVEX来编码专用目标寄存器操作数,将其转换为三操作数指令,从而减少了额外的寄存器移动指令的需求。
- 扩展的条件指令集:为了解决大量条件分支预测错误对性能的影响,APX显著扩展了x86的条件指令集。这些扩展包括条件形式的加载、存储、比较和测试指令,以及编译器可以禁止常见指令的状态标志位写入的选项。这些改进扩展了if-conversion的适用范围,减少了可能导致预测错误的分支数量。
- 简化的应用开发:应用开发人员可以通过简单的重新编译来利用APX的优势,无需对源代码进行更改。使用动态语言编写的工作负载在底层运行时系统启用后将自动受益。
总的来说,Intel的APX通过增加寄存器数量、优化寄存器访问和扩展条件指令集等方式,提供了显著的性能提升,同时保持了与现有代码的兼容性。
Learn more:
- Advanced Performance Extensions (APX)
- Advanced Performance Extensions (APX)
- Intel® Advanced Performance Extensions (Intel® APX) Assembly Syntax Recommendations
简化英特尔架构:探索64位纯模式架构
本文基于参考文献[1],采用通俗易懂的语言,详细介绍了英特尔公司正在研究的架构简化方案,重点关注64位纯模式架构(x86S)。我们将从以下几个方面展开讨论:
- 64位纯模式架构的工作原理
- 64位纯模式架构的好处
- 64位纯模式架构上的传统操作系统
- 64位纯模式架构的详细方案
64位纯模式架构的工作原理
当前的英特尔64位架构中,处理器需要经过一系列代码转换才能进入64位模式。然而,这些模式在现代应用程序和操作系统中并不常用。在64位纯模式架构中,一些当前在实模式或保护模式下运行的技术需要具备64位的等效替代方案。
举个例子,引导处理器(SIPI)目前从实地址模式开始,但在64位纯模式架构中需要一个64位的替代方案。此外,目前使用5级分页需要禁用分页,回到非分页的传统模式。而在提出的架构中,可以在分页模式下切换到5级分页,无需回到非分页的传统模式。
这些修改可以通过对系统架构进行简单的增强来实现,只会影响操作系统本身。
64位纯模式架构的好处
64位纯模式架构通过移除一些较旧的架构附属物件,降低了软件和硬件架构的整体复杂性。通过探索64位纯模式架构,可以实现与现代软件部署相一致的其他变化。
一些潜在的好处包括:
- 使用64位简化分段模型来支持32位应用程序的分段,与现代操作系统的使用方式相匹配。
- 移除不再使用的第1和第2特权级(现代软件中未使用)以及过时的分段特性。
- 移除16位寻址支持。
- 取消对第3特权级I/O端口访问的支持。
- 取消支持基于字符串端口的过时CPU驱动I/O模型。
- 仅使用X2APIC限定本地中断控制器(APIC),移除传统的8259支持。
- 移除一些未使用的操作系统模式位。
64位纯模式架构上的传统操作系统
尽管64位纯模式架构上运行传统的64位操作系统并不是该方案的明确目标,但英特尔架构软件生态系统已经发展成熟,并提供了虚拟化产品。这使得可以使用虚拟化硬件(VMX)来模拟启动传统操作系统所需的功能,从而实现在64位纯模式架构上运行这些操作系统的解决方案。
例如,可以通过虚拟化技术在64位纯模式架构上创建虚拟机,利用虚拟化硬件来模拟传统操作系统所需的功能,以达到在该架构上运行传统操作系统的目的。
64位纯模式架构的详细方案
英特尔提供了一份64位纯模式架构详细方案的规范,其中包含了本文所述的想法。英特尔发布此规范,以便生态系统评估对软件可能产生的潜在影响。
该规范包括以下内容:
- 对分段状态进行了简化,详细说明了VMX、SMX和复位等内容。
- 提供了版本为1.1的X86S外部架构规范,包括许多澄清和简化的内容。
英特尔欢迎生态系统就这一架构提出反馈意见,可以通过电子邮件与他们联系。
结论
英特尔正在探索一种简化的架构方案,即64位纯模式架构(x86S)。通过移除不再使用的传统模式和附属物件,这种架构可以简化软件和硬件的复杂性,同时实现与现代软件部署相一致的变化。
尽管64位纯模式架构并非专门用于运行传统操作系统,但通过虚拟化技术可以实现在该架构上运行这些操作系统的解决方案。
参考文献:
x86s是Intel于2023年公布的一个处理器架构,经由改进及简化x86-64而来。它的目标是降低当代软件和硬件体系结构的整体复杂性,通过移除不常用的部分和遗留概念来提高处理器的性能和能效[1]。
下面是对x86s架构的详细介绍:
- 简化的64位模式:x86s仅实现了64位模式,放弃了对16位和32位操作系统的支持。这使得处理器更加专注于现代软件和硬件的需求,提高了性能和能效。
- 精简化的内存寻址模型:x86s使用简化的64位内存段寻址模型来支持32位应用程序中的段寻址。这与现代操作系统中使用的做法一致,提高了兼容性和效率。
- 移除不常用的保护环和特性:x86s移除了不常用的保护环(ring 1和ring 2)以及过时的特性(如gate)。这减少了处理器的复杂性,提高了性能和能效。
- 简化的I/O接口:x86s终止了对从第三个保护环访问I/O端口的支持,并移除了输入/输出端口(INS/OUTS)字符串操作。这使得处理器更加专注于核心任务,提高了性能和能效。
- 改进的中断控制器:x86s终止了对8259中断控制器的支持,并仅使用X2APIC可编程控制器。这简化了中断处理,提高了性能和能效。
下面是x86和x86s架构的比较:
- 支持的操作系统:x86支持16位、32位和64位操作系统,而x86s仅支持64位操作系统。
- 内存寻址模型:x86使用复杂的内存寻址模型,包括16位、32位和64位寻址。而x86s使用简化的64位内存段寻址模型,提高了兼容性和效率。
- 保护环和特性:x86支持多个保护环(ring 0到ring 3)和一些过时的特性(如gate)。而x86s移除了不常用的保护环和过时特性,简化了架构。
- I/O接口和中断控制器:x86支持从第三个保护环访问I/O端口,并使用传统的8259中断控制器。而x86s终止了对这些特性的支持,使用更简化的I/O接口和X2APIC可编程控制器。
综上所述,x86s架构通过简化和精简化的设计,提高了处理器的性能和能效,同时降低了整体复杂性。它放弃了对16位和32位操作系统的支持,专注于64位模式,并移除了不常用的保护环、特性和接口。这使得x86s成为适用于现代软件和硬件需求的处理器架构。
参考文献:
- x86s - 维基百科,自由的百科全书 [1]
- x86S,英特尔的新架构,消除了16位和32位的遗留概念| Desde Linux
Learn more: