RFC-0151:针对 CPU 目标的编译器调整标志

RFC-0151:针对 CPU 目标的编译器调整标志
状态已接受
领域
  • 工具链
说明

建议对控制 CPU 目标及其对平台和 SDK build 的影响的编译器标志进行更改。

问题
Gerrit 更改
作者
审核人
提交日期(年-月-日)2022-01-04
审核日期(年-月-日)2022-02-02

摘要

建议对控制 CPU 目标及其影响的编译器标志进行更改 构建容器

设计初衷

Fuchsia 的 build 生成了许多包含可执行机器代码的工件 不同的架构例如:共享的prebuilt 发布供 SDK 使用的库、可执行的 C/C++ 或 平台和产品系统映像中包含的 Rust 二进制文件。时间 在编译器中生成机器代码时,请务必指明以下内容:

目标架构:使用哪种指令集架构?例如 x86-64 或 AArch64 ISA。此外,编译器可能会以 ISA 的修订版本为目标。 修订版本可能会针对现有 指令(如新的浮点或 SIMD 指令)或更宽泛的原子化指令 内存操作,从而显著提高性能。务必 了解目标架构来生成有保证的代码, 目标设备“提高”目标架构可在 与旧硬件向后兼容的代价是。

ARM ISA 进展

上图:ARM ISA 进展(来源

目标微架构:ISA 是如何实现的?这通常是 用于表示是按顺序执行指令还是 无序、解码带宽、缓存加载延迟等。 微架构允许编译器生成机器代码, 在目标硬件上更快地运行,而不会限制硬件兼容性。

Intel Core 2
微架构

上图:Intel Core 2 微架构块图 (来源

编译器允许用户以我们审核的方式指定这些目标 。Fuchsia 的构建系统能够在全局或 进行微调。Fuchsia 中 CPU 定位的现有实现 build 存在多个缺点,此 RFC 旨在解决:

  1. arm64 的基准配置选择以特定的 CPU 为目标 (Cortex-A53),而不是使用的 ISA Plus 功能。这使得 。

  2. 由于缺少先前技术,尚不清楚如何为该基准设置替换项 没有存档的政策或最佳做法。最终,Fucsia 构建了 但会回退到基准,包括以 超出基准值的硬件。

自 2016 年推出 build 以来,这些缺点就一直存在, 之前艺术中的“紫红色”现在的系统是 在第一代设备(恰好也使用相同的微架构)上搭载了 Fuchsia, 作为当今平台 arm64 基准)。

最近的发展表明,是时候进行全面检查了。具体来说,在 除了以 Cortex-A53 为目标平台的 Astro 和 Sherlock 开发板配置外, Fuchsia 现在支持 Nelson 板配置 (Cortex-A55) 和 Versa 3 主板配置 (Intel Amber Lake)。不过,这些构建 目前尚未配置,无法利用 基准和实际目标值。

此外,人们也日渐关注优化 或增加基准。对 基准配置和特定主板配置后,速度会加快 相关工作。另请参见:

为应对当前和未来的挑战,此 RFC 提议立即做出一些调整 对版本中的 CPU 定位以及 管理定位在可预见的未来。

利益相关方

教员cpu@google.com

审核者

  • aaronwood@google.com - 系统组件
  • digit@google.com - 构建
  • mcgrathr@google.com - 内核
  • mvanotti@google.com - 安全
  • maniscalco@google.com - 内核
  • phosek@google.com - 工具链
  • travisg@google.com - 内核

已咨询

由于建议的更改会对平台的大部分方面产生影响,因此各方都会 鼓励他们按照咨询中的建议自行预约。我特别欢迎您提供反馈 开发游戏。

社交化

此提案的要点最初是通过 60 分钟的演示 和公开讨论。

背景

编译时调整标志

Fuchsia 使用 Clang 编译 C/C++,还有 Fuchsia 代码的一些子集 使用 gcc 持续构建和测试。这两种工具都提供以下功能: 标志:

-march:设置目标架构,例如 x86-64-v2(我们的 当前 x64 基准(根据 RFC-0073)或 ARMv8-A。还酌情指定 其他架构功能,例如 +avx2 以指示 Intel Haswell 高于 x64 基准的扩展。

-mtune:设置目标微架构,例如 cortex-a53haswell。如果 -mtune-mcpu 均未使用,则此值会设为 generic,以便在一系列目标 CPU 之间实现平衡。

-mcpu:设置目标 CPU。接受的值与 -mtune 类似。对于 ARM CPU,相当于设置目标架构 (-march) 和目标 微架构 (-mtune) 来匹配目标 CPU。在 x86 上 已弃用,并且给定的值重定向到 -mtune

Rust 编译器提供如下 codegen 选项

target-cpu:与 -mcpu 类似,接受 cortex-a53 等实例。

target-features:与 -march 功能类似,例如 +avx2

当前状态

目前,所有 x64 build 都使用 -march=x86-64-v2 进行编译,并且所有 ARM build 是使用 -mcpu=cortex-a53 编译的。

存在一种通过 GN 参数替换此配置的机制 名为 board_configs,可被 .gni 文件。有些面板(特别是 Astro 和 Sherlock)会手动指定 上述 Cortex-A53 配置,尽管这目前是一个空操作,如 如果没有定义替换项,则相同的配置也会用作后备配置。 大多数板级配置都未设置 board_configs

调整目标和权衡

本部分简要介绍了设置 CPU 时要考虑的不同目标 定位选项以及它们之间的一些取舍。

硬件兼容性:以 ISA 的早期修订版本为目标即可解锁 与旧硬件的兼容性。兼容性越强,代价是 无法使用可带来性能或安全性的新 ISA 功能 优势。

效果:新说明可以提升成效:速度更快或更广泛 原子操作、加速数学(FPU、SIMD 改进)、内置 CRC 和 AES 等常用算法的加速器。调整机器代码 可以生成在目标 CPU 上运行速度更快的代码,尽管 通常以牺牲目标 CPU 上其他 CPU 的性能为代价 参数。

与二进制文件大小的交互:观察到调整会增加二进制文件的大小 在某些情况下(例如在指令调度优化时) 以有序处理器为目标会增加寄存器压力。

二进制文件大小:某些代码生成功能可通过特定 CPU 功能解锁。 例如,SIMD 会启用自动矢量化, 与循环展开类似,它会生成 但体积也会更大针对有序 CPU 微调的指令调度往往 生成更大的代码,因为它增加了更多的调度限制, 可以增加寄存器压力和寄存器溢出。

其他 Codegen 功能可能会减小二进制文件的大小。例如,将 采用特殊指令的 CRC 和 AES 等算法会生成 速度更快且体量更小

易于排查问题(例如二进制多样性):针对不同 CPU 进行调整 意味着随着时间的推移,可生成相同逻辑工件的更多二元变体。 例如,多种口味的是内核映像的 库,每个库针对不同目标进行了优化。这可能会使 问题更为复杂,或者让 Fuchsia 遇到在某些二进制文件中出现的问题 而非其他变体。

公平竞争环境:除了基准 build 之外,Fuchsia 还可能提供 SDK 经过微调的预构建(系统映像、可再分发共享库) 特定 CPU。这样做会给部分硬件选择带来狭小权限 相较于其他数据合理的假设是,创建经过微调的 SDK 变种 将会导致未来提供更完善的 SDK 版本 渠道。

简单性:以上所有都增加了理解 Fuchsia 的复杂性, 开发和维护 Fuchsia。上述权衡因素 用于设置 CPU 定位选项,以便在 构建和分发渠道已可行, 特定硬件,例如针对 OTA 渠道的构建和发布流水线 特定配置。在撰写本文时,根本没有 系统或软件包交付机制,该机制可以提供多种二进制文件 不同的目标硬件,将正确的二进制文件与正确的设备匹配。

提案

您可以在此更改中查看即时建议的修改。 更多说明如下。

新的 arm64 基准硬件目标

arm64 的当前基准定义为以 Cortex-A53 为目标平台,如下所示:

-mcpu=cortex-a53

从技术上讲,这相当于用精确的集合表示 -march Cortex-A53 功能,以及针对 Cortex-A53 的 Codegen 调优代码生成。

-march=<armv8a + Cortex-A53 features>
-mtune=cortex-a53

相反,基准将表达 因此被视为基准,然后进行调参 适用于通用 armv8a CPU 的 codegen。

-march=armv8-a+simd+crc+crypto
-mtune=generic

-march 的影响实际上是一项空操作,因为移除 -march 功能 在 Cortex-A53 中支持但未在代码中运用的功能属于空操作。

-mtune 的影响微乎其微或没有,因为这是通用的调整目标 针对典型的有序 ARMv8-A CPU(例如 Cortex-A53)进行优化。

对现有 x64 基准硬件目标所做的更改

x64 的当前基准为:

-march=x86-64-v2

此主题之前在 RFC-0073:将 x86-64 平台要求提高到 x86-64-v2

这将更改为下面设置的标志:

-march=x86-64-v2
-mtune=generic

这不是一种行为变更,因为在以下情况下,-mtune 默认为 generic 如前所述,既未指定 -mtune,也未指定 -mcpu。不过, 添加 -mtune=generic 会使此行为明确,并与 arm64 基准定义

板级配置

板级 .gni 文件中指定的 board_configs 板级参数 (例如在 //boards/ 中找到的 ID)将会继续用于替换 基准配置。

具体而言,astro.gnisherlock.gni 等板级配置, 使用 Cortex-A53,将继续以 Cortex-A53 为目标平台,并将保持当前 -mcpu=cortex-a53 配置。

从本质上讲,此 RFC 采用现有的 arm64 配置, Cortex-A53 并将其从平台基准提取到板专属 Astro 和 Sherlock 板配置。然后, RFC 通过 ARM ISA 术语重新定义了平台基准,这些术语泛化到许多 而无需考虑单个 ARM CPU。

此外,您还可以添加对针对不同 未来架构变体(例如 ARM Cortex-A73 或 Intel AVX 扩展) 版本的 SDK。这需要进一步讨论,不在讨论范围内。

内核配置

board_configs 参数将不再应用于内核映像。这是 原因如下:

  1. 需要在 Codegen 中了解的新指令或其他 CPU 功能 目前没有为内核带来好处。

  2. 基于微架构的内核代码调整对 以抵消增加二元多样性和复杂性的代价。

内核可以继续提供有关受支持硬件的信息 功能,例如使用 zx_system_get_features 系统调用。

此外,内核仍然可以利用一些较新的硬件 如 64kB 内存页面,无需生成 只在运行时查询这些功能是否存在。如果新的 引入的功能需要板级特定配置 那么就可以轻松引入一个新参数 kernel_board_configs 相关标志。

向后兼容性

此 RFC 中建议的即时更改不会提高 Fuchsia 的最低要求 硬件要求,因此对向后兼容性没有任何影响。未来 确实会提高最低要求的更改可能需要

安全注意事项

Fuchsia 使用或打算使用多种 CPU 功能,以提高安全性或 支持使用排错程序(然后提高安全性)。这些通常是 不受本文讨论的编译器标记控制,因此无需在意。

值得注意的是:

测试

正确性:对 CPU 定位所做的更改绝不会影响正确性。 这通过持续的提交前和提交后测试进行验证。当下 就足以确保这一点

性能:更改 CPU 定位通常会对性能产生影响。 我们将使用 Fuchsia 的 Perfcompare 系统验证所有此类更改, 之前是这样。

二进制文件大小:对 CPU 目标所做的更改通常会对二进制文件大小产生轻微影响 方法。具体来说,Fuchsia 目前正跟踪该天文图像的大小 因为这是目前限制最为严格的目标通过 立即更改不会使此大小回归。未来将会影响 可以审核商品图片并仔细权衡 这些商品定义的所有者。

缺点、替代方案和未知问题

CPU 定位会在工程和业务方面 有时是相互冲突的目标。我们在上面介绍了这些内容。未来会发生 改变这些权衡,未来的调整机会和注意事项 超出此 RFC 范围。