RFC-0073:将 x86-64 平台要求提高到 x86-64-v2

RFC-0073:将 x86-64 平台要求提升到 x86-64-v2
状态社交
领域
  • 内核
说明

将最低 x86-64 平台从 v1 + 扩展提升到 v2

Gerrit 更改
  • 484898
作者
审核人

总结

提议将最低 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 内核和系统目前针对“通用”x86-64 CPU 进行编译,采用 CMPXCHG16B 扩展。

这包括自 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/Steam。

实现

此更改可以在单个预设回复(即 484898)中实施。CR 会将“-march=x86-64-v2”传递给 Fuchsia build 的编译器,以允许编译器使用新的基准功能生成代码。

我们还将在 x86_64-fuchsia 作为目标传递时更改编译器/工具链中的默认值,以便针对 Fuchsia 且使用工具链构建的所有第三方代码均可从 ABI 中受益。

性能

此方案预计可提升 x86-64 平台上所有已编译的 C/C++ 代码的性能。Perfcompare 中的初始 Microbenchmark 可以体现这一点:

  • 在 2914 个测试用例中,有 716 个测试用例的速度加快;还有一些关键用例相差甚远
  • 值得注意的是,100 字节对象的 free() / delete 操作提高了 30 纳秒(基准 83ns);这主要是因为 malloc 中使用的 CRC32C 指令现在被假定可用。
  • 大多数 FIDL HLCPP 和 LLCPP 的编码/解码 Microbenchmark 的编码/解码速度都得到了提升;例如,HLCPP/Builder/OptionalStructTree/Depth8/Steps.Build/WallTime 节省了约 4 毫秒(基准为 15 ms)。

perfcompare

安全注意事项

此方案没有任何安全注意事项。

隐私注意事项

此方案没有任何隐私权注意事项。

测试

此变更将通过 Fuchsia CI/CQ 测试和核心测试的本地测试进行测试。此外,我们将在功能定义边缘附近的各种处理器系列上启动/测试 Fuchsia,这些处理器系列包括 AMD Piledriver、Intel Apollo Lake Atoms 及其他可用的处理器。

文档

我们需要在 Fuchsia 平台支持文档(位于 fuchsia.dev 的“设置 Fuchsia 硬件”部分下)记录新功能基准。目前列出了一些特定的 x86-64 设备,但没有指定功能基准。

缺点、替代方案和未知情况

  • 实施此方案的费用是多少?

这项变更将阻止某些较旧的 x86-64 处理器运行 Fuchsia,而这些处理器目前支持的处理器包括: ** Intel Pentium 4 / Pentium D 64 位处理器 ** Intel Core 2 Duo / Quad 处理器 ** Intel 'Bonnell' Atom 处理器 **Intel 'Bonnell' Atom 处理器 ** Intel 'Bonnell' Atom processors**

这些处理器也无法在 KVM 或其他无法提供缺失指令模拟的 Hypervisor 下运行 Fuchsia。

最新的处理器系列已于 2008 年发布。所有这些系列中的最后一个新处理器发布于 2013 年。

  • 还有哪些策略可以解决同样的问题?

对这些功能和手写汇编/内建函数的动态枚举可以捕获这种性能提升的一部分/大部分,但需要在整个代码库中进行手动分析,并且不会像假定某些功能可用并生成无分支代码来使用它们那样捕获性能。

早期技术和参考资料