RFC-0073:将 x86-64 平台要求提高到 x86-64-v2 | |
---|---|
状态 | 社交 |
区域 |
|
说明 | 将最低 x86-64 平台从 v1 + 扩展程序提高到 v2 |
Gerrit 更改 | |
作者 | |
审核人 |
摘要
建议将 x86-64 最低平台从“x86-64-v1”提高到“x86-64-v2”。
Fuchsia 目前在具有基准 64 位 ISA 和 CMPXCHG16B 扩展的 x86-64 CPU 上运行。此 RFC 提议将最低要求提高到 x86-64-v2 ISA,并添加 LAHF-SAHF、POPCNT、SSE3、SSE4.1、SSE4.2 和 SSSE3 扩展。提高最低平台要求并允许编译器使用这些扩展生成代码,可显著提升系统性能,同时仅略微减少 Fuchsia 可在其上运行的系统数量。
设计
Fuchsia 内核和系统目前是针对具有 CMPXCHG16B 扩展的“通用”x86-64 CPU 进行编译的。
这涵盖了自 K8 修订版 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 将向 Fuchsia build 的编译器传递“-march=x86-64-v2”,以便编译器使用新的基准功能生成代码。
当 x86_64-fuchsia 作为目标传递时,我们还将更改编译器/工具链中的默认值,以便以 Fuchsia 为目标平台并使用该工具链构建的任何第三方代码都能受益于该 ABI。
性能
此提案有望提升 x86-64 平台上所有已编译 C/C++ 代码的性能。perfcompare 中的初始 Microbenchmark 测试证明了这一点:
- 2914 个测试用例中有 716 个测试用例的速度加快;其中一些关键测试用例的速度加快幅度很大
- 值得注意的是,100 字节对象的 free() / delete 速度提高了 30 纳秒(基准为 83 纳秒);这主要是因为现在假定 malloc 中使用的 CRC32C 指令可用。
- 大多数 FIDL HLCPP 和 LLCPP 编码/解码微基准测试的速度都加快了;其中一些速度大幅加快(例如,HLCPP/Builder/OptionalStructTree/Depth8/Steps.Build/WallTime 节省了约 4 毫秒 [基准为 15 毫秒])。
安全注意事项
此提案没有安全注意事项。
隐私注意事项
此提案没有隐私权注意事项。
测试
我们将通过 Fuchsia CI/CQ 测试和 core-tests 本地测试来测试此更改。此外,我们还将在各种处于功能定义边缘的处理器系列(AMD Piledriver、Intel Apollo Lake Atoms 和其他可用的处理器)上启动/测试 Fuchsia。
文档
我们需要在 Fuchsia 平台支持文档的 fuchsia.dev 的“设置 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 或不提供缺失指令模拟的其他 Hypervisor 下运行 Fuchsia。
其中最新的处理器系列于 2008 年发布。这三个系列中最近一次发布的新处理器是在 2013 年。
- 还有哪些策略可以解决同一问题?
对这些功能和手写汇编/内建函数进行动态枚举可以捕获部分/大部分性能提升,但需要对整个代码库进行手动分析,并且捕获的性能提升不会像假定某些功能可用并生成无分支代码来使用它们那样多。