| RFC-0073:将 x86-64 平台要求提升至 x86-64-v2 | |
|---|---|
| 状态 | 社会化 |
| 区域 |
|
| 说明 | 将最低 x86-64 平台从 v1 + 扩展功能提升到 v2 |
| Gerrit 更改 | |
| 作者 | |
| 审核人 | |
摘要
建议将最低 x86-64 平台从具有扩展功能的“x86-64-v1”提升到“x86-64-v2”。
Fuchsia 目前在 x86-64 CPU 上运行,具有基准 64 位 ISA 和 CMPXCHG16B 扩展。此 RFC 建议将最低要求提高到 x86-64-v2 ISA,并添加 LAHF-SAHF、POPCNT、SSE3、SSE4.1、SSE4.2 和 SSSE3 扩展。提高最低平台版本并允许编译器使用这些扩展程序生成代码,可显著提高系统性能,同时仅略微减少 Fuchsia 可运行的系统数量。
设计
Fuchsia 内核和系统目前编译时以具有 CMPXCHG16B 扩展的“通用”x86-64 CPU 为目标。
这涵盖了自 K8 rev F (2006) 以来所有 Intel x86-64 CPU 和所有 AMD64 CPU;虽然具有广泛的兼容性,但这确实意味着许多非常有用的 ISA 扩展无法在没有运行时测试和调度的情况下假设或使用。
将基准 ISA 提升到“x86-64-v2”(在最近对 ELF ABI 的更新中定义)可让编译器假定存在 LAHF/SAHF、POPCNT、SSE3、SSE4.1、SSE4.2 和 SSSE3。此功能集最初在 Intel Nehalem 处理器系列(发布于 2008 年)、Intel Silvermont Atom 处理器系列(发布于 2013 年)、AMD Bulldozer 处理器系列(发布于 2011 年)和 AMD Bobcat 处理器系列(发布于 2011 年)中推出。在初始测试中,这显著提高了关键系统构建块(FIDL HLCPP/LLCPP、malloc/free)的性能,这可能是因为基准包含 CRC32C 指令(由我们的内存分配器 Scudo 使用)。
将基准从 x86-64-v2 提高到 -v3 会添加 AVX、AVX2、BMI1、BMI2、F16C、FMA、LZCNT、MOVBE 和 XSAVE;这会排除 Intel Sandy Bridge、Intel Ivy Bridge、AMD Bulldozer/Piledriver/Steamroller 和所有 Intel Atom CPU,这是不可行的。
实现
此更改可在单个 CR(484898)中实现。CR 会将“-march=x86-64-v2”传递给 Fuchsia build 的编译器,从而允许编译器使用新的基准功能生成代码。
我们还将在编译器/工具链中更改默认设置,以便在将 x86_64-fuchsia 作为目标传递时,以该工具链为目标平台构建的任何第三方代码都能受益于该 ABI。
性能
此提案有望提升 x86-64 平台上所有已编译 C/C++ 代码的性能。perfcompare 中的初始微基准测试证实了这一点:
- 2914 个测试用例中有 716 个运行速度更快;其中一些关键测试用例的运行速度大幅提升
- 值得注意的是,100 字节对象的 free() / delete 速度提高了 30 纳秒(基准为 83 纳秒);这主要是因为 malloc 中使用的 CRC32C 指令现在被假定为可用。
- 大多数 FIDL HLCPP 和 LLCPP 编码/解码微基准测试的速度都有所提升;部分测试的速度大幅提升(例如,HLCPP/Builder/OptionalStructTree/Depth8/Steps.Build/WallTime 节省了约 4 毫秒(基准为 15 毫秒))。
安全注意事项
此提案没有安全注意事项。
隐私注意事项
此提案不涉及任何隐私权注意事项。
测试
此更改将通过在 Fuchsia CI/CQ 测试中运行它以及通过对核心测试进行本地测试来测试。此外,我们还将在各种处理器系列(包括 AMD Piledriver、Intel Apollo Lake Atoms 和其他可用处理器)上启动/测试 Fuchsia,这些处理器系列接近功能定义边缘。
文档
我们需要在 fuchsia.dev 的“设置 Fuchsia 硬件”部分下的 Fuchsia 平台支持文档中记录新的功能基准。目前,文档中列出了少数特定的 x86-64 设备,但未指定任何功能基准。
缺点、替代方案和未知因素
- 实施此提案的费用是多少?
此项变更将阻止某些较旧的 x86-64 处理器运行 Fuchsia,而这些处理器目前可以运行 Fuchsia: ** Intel Pentium 4 / Pentium D 64 位处理器 ** Intel Core 2 Duo / Quad 处理器 ** Intel“Bonnell”Atom 处理器 ** AMD K8 NPT (rev F) 处理器 ** AMD K10 处理器
这些处理器也无法在 KVM 或其他不提供缺失指令仿真的虚拟机监控程序下运行 Fuchsia。
这些处理器系列中最晚的发布于 2008 年。这些系列中的最后一个新处理器于 2013 年发布。
- 还有哪些策略可以解决相同的问题?
动态枚举这些功能和手写汇编/内在函数可以捕获部分/大部分性能提升,但需要在整个代码库中进行人工分析,并且无法像假设某些功能可用并生成无分支代码来使用它们那样捕获尽可能多的性能。