RFC-0151:CPU 指定目標的編譯器調整標記

RFC-0151:CPU 指定目標的編譯器調整旗標
狀態已接受
領域
  • 工具鏈
說明

提議變更用於管理 CPU 指定目標的編譯器旗標,以及這些標記對平台和 SDK 版本的影響。

問題
毛皮變化
  • 624521
作者
審查人員
提交日期 (年-月-日)2022-01-04
審查日期 (年-月-日)2022-02-02

摘要

提議變更用於管理 CPU 目標及其影響的編譯器旗標 平台和 SDK 版本

提振精神

Fuchsia 的版本產生許多構件,內含可執行的機器程式碼 適合不同架構的應用範例例如:預先建構共用 發布供 SDK 使用的程式庫,或可執行的 C/C++、 平台和產品系統映像檔包含的 Rust 二進位檔。時間 在編譯器中產生機器碼時,請務必指出下列事項:

目標架構:要使用哪些指令集架構?例如 x86-64 或 AArch64 ISA。此外,編譯器可能會鎖定 ISA 修訂版本。 修訂版本可能會針對現有內容提供額外指示或變化版本 指示,例如新的浮點或 SIMD 指令,或較寬的原子 這些記憶體作業可以大幅改善效能重點在於 瞭解目標架構,生成程式碼保證可運作 指定裝置的 Cookie。「竄升」目標架構就能解鎖新功能 因為與舊版硬體回溯相容性的成本相當低廉

ARM ISA 進展

高於:ARM ISA 的進展 (資料來源)

目標微架構目標:如何實作 ISA?這通常 依照指令是依序執行 順序錯誤、解碼頻寬、快取載入延遲時間等 微架構可讓編譯器產生可能會執行的機器程式碼 ,且不影響硬體相容性。

Intel Core 2
微架構

上方:Intel Core 2 微架構區塊圖 (資料來源)

編譯器可讓使用者以待審查的方式指定這些目標 Fuchsia 的建構系統能夠針對 採計Fuchsia 中現有的 CPU 鎖定實作方式 建置了一些缺點,而這個 RFC 旨在解決下列問題:

  1. 為 arm64 選擇的基準設定是鎖定特定 CPU (Cortex-A53),而非 ISA 搭配功能。如此一來 。

  2. 由於缺少過往藝術品,因此不清楚如何為這個基準設定覆寫值 但沒有明確記錄的政策或最佳做法因此 Fuchsia 以此為基礎 但會改回使用基準,包括指定的建構設定 明確排除在基準外的硬體

這些缺點從 2016 年問世以來,至今出現了這些缺點, 。目前的系統是 在第一部裝置上出貨 (剛好採用相同的微型架構) 作為目前平台 arm64 基準)。

近期的開發記錄指出該進行改版。具體而言, 除了以 Cortex-A53 為目標的天文和 Sherlock 主機外, Fuchsia 現在支援 Nelson 主機板設定 (Cortex-A55) 以及 Atlas 板設定(Intel Amber Lake)。不過,這些版本 但目前並未設定使用 GCP 控制台 基準與實際目標

此外,越來越多人使用 進而增加運作更清楚地定義 會加快基準配置和特定主機板的設定 相關工作。另請參閱:

為了滿足現在與未來的挑戰,此 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 - 核心

諮詢:

由於提議的變更會影響平台的大範圍,因此 都鼓勵我按照諮詢的方式思考特別歡迎意見回饋 並提供圖像、媒體和 SDK 等團隊的協助

社交功能:

這份提案的重點在經過 60 分鐘的簡報後首次經過審查 都是由 Fuchsia 的核心演進工作小組 共同討論的議題

背景

編譯時間調整旗標

Fuchsia 使用 clang 編譯 C/C++,搭配部分 Fuchsia 程式碼 持續建構及測試 gcc這兩項工具都提供下列功能: 旗標:

-march:設定目標架構,例如 x86-64-v2 (我們的 。RFC-0073) 或 ARMv8-A。您也可以選擇一併指定 其他架構功能,例如 +avx2 執行個體代表 Intel Haswell 大於 x64 基準的擴充功能

-mtune:設定目標微架構,例如 cortex-a53haswell。如果 -mtune-mcpu 都未使用,此值會設為 generic 可指定在各種目標 CPU 間取得平衡。

-mcpu:設定目標 CPU。接受與 -mtune 類似的值。ARM 專用 這相當於設定目標架構 (-march) 和目標 CPU 用於比對目標 CPU 的微架構 (-mtune)。在 x86 上,系統會將這部分 已淘汰,指定的值會重新導向至 -mtune

Rust 編譯器提供程式碼產生選項,如下所示:

target-cpu:與 -mcpu 類似,接受執行個體 cortex-a53

target-features:與 -march 功能類似,例如 +avx2

目前狀態

目前所有 x64 版本均使用 -march=x86-64-v2 和所有 ARM 編譯而成 是使用 -mcpu=cortex-a53 編譯而成

已有透過 GN 引數覆寫這項設定的機制 名為 board_configs 的命名空間,可遭到 .gni 檔案。某些主機板 (尤其是天文和新星) 會手動指定 上述的 Cortex-A53 設定, 如果未定義覆寫,則相同設定也可做為備用選項。 大部分的主機板設定都未設定 board_configs

調整目標和權衡取捨

本節會簡單複習在設定 CPU 時應考量的不同目標 兩者之間的差異

硬體相容性:鎖定早期版 ISA 解鎖功能 與舊版硬體相容提高相容性,代價是 無法使用具有效能或安全性的新 ISA 功能 好處

成效:提供新的操作說明,可使成效提升至更快或更寬 內建原子運算、加速數學 (FPU、SIMD 改善)、內建 常見演算法 (如 CRC 和 AES) 的加速器。調整機器碼 特定 CPU 可能產生在目標 CPU 上執行速度更快的程式碼 費用通常不至目標之外的其他 CPU 效能下降 參數。

與二進位檔大小互動:經觀察到調整,可以增加二進位檔大小 在某些情況下,例如指示排程最佳化時 鎖定訂單處理端處理器會增加登錄壓力

二進位檔大小:部分 Codegen 功能是透過特定 CPU 功能解鎖。 舉例來說,SIMD 可以啟用自動向量化功能, 和循環釋放類似,其實可以產生 但規模更大按照順序 CPU 調整的指示排程往往 會產生更大的程式碼,因為這樣會提供更多排程限制 提高機箱壓力,並防止機殼溢出

其他 Codegen 功能可以縮減二進位檔的大小。例如將 像是 CRC 與 AES 等具有特殊指示的演算法,就會產生 既快速又小

輕鬆進行疑難排解,即二進位檔多樣性:針對不同 CPU 調整 意味著隨著時間的推移,產生更多相同邏輯構件的二進位檔變化版本。 例如使用多個「變種版本」一個核心映像檔,或預先建構的共用儲存空間 程式庫,每個程式庫都針對不同的目標進行最佳化。這可能會導致問題 或公開 Fuchsia 更容易發生在某些二進位檔中 而非其他變化版本

等級競爭:除了基準版本之外,Fchsia 也可以提供 SDK 預先建構 (系統映像檔、可轉散發的共用資料庫) 調整到 以及特定 CPU這會授予您有限權限,僅為部分硬體選擇 。合理假設建立的是經過調整的 SDK 變種版本 會導致未來預期能夠提供更調整過的 SDK 版本 頻道。

簡單易用:以上所有功能都會讓開發人員更難瞭解 Fuchsia, 以及維護 Fuchsia 的成功關鍵上述的優缺點 用於設定 CPU 指定目標選項,在其所屬區域導入二進位檔多樣性 建立和發布 例如針對 OTA 版本的建構和發布管道 特定使用者硬體的憑證在撰寫本文時 能夠提供多個二進位檔的系統或套件提交機制 不同的目標硬體,將正確的二進位檔與裝置配對。

提案

您可以在這項變更中查看立即提議的修改。 詳情請參閱下方說明。

新增 arm64 基準硬體目標

arm64 目前的基準定義為 Cortex-A53 指定,如下所示:

-mcpu=cortex-a53

這在技術上等同於以精確組合的形式表示 -march ,以及為 Cortex-A53 調整 Codegen。

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

而是會顯示 ARMv8-A ISA 特徵 因此被認定為基準,接著調整 一般 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 基準的定義

主機專屬設定

board_configs 主面板引數,在主面板專用的 .gni 檔案中指定 (例如在 //boards/ 中找到的事件),會繼續用來覆寫 以及主機專屬設定。

具體來說,主機板設定,例如 astro.gnisherlock.gni 使用 Cortex-A53,會繼續指定 Cortex-A53 並保留 -mcpu=cortex-a53 設定。

此 RFC 基本上會採用目標為 Cortex-A53 從平台基準中擷取資料,並擷取至特定主機平台 配置這類 CPU 的 太空與 Sherlock 電路板接著, RFC 根據 ARM ISA 的術語重新定義了平台基準, 硬體選擇,而不是單一 ARM CPU

此外,您可以為最佳化指定目標對象 未來的架構變化版本 (例如 ARM Cortex-A73 或 Intel AVX 擴充功能) SDK 的後續版本這有利於進一步討論,且不在測試範圍內。

核心設定

board_configs 引數不會再套用至核心映像檔。這是 原因如下:

  1. 需要在 codegen 中掌握的新指令或其他 CPU 功能 但時間並未對核心帶來好處。

  2. 微調核心程式碼,雖然微架構架構調整,但 減少二進位檔的多元性和複雜度增加的成本。

核心可以繼續提供支援的硬體相關資訊 例如使用 zx_system_get_features Syscall。

此外,核心仍可使用一些較新的硬體 像是 64 kB 記憶體頁面 ,只會在執行階段查詢這些功能是否存在。如果是 這類功能需要主機專屬設定才能使用 就可以輕鬆導入新引數 kernel_board_configs 來定義 以及相關的旗標

回溯相容性

此 RFC 中提議的立即變更並未提高 Fuchsia 的最低 因此不會影響回溯相容性未來 政策規定能提高最低要求 這個 RFC 提倡條件

安全性考量

Fuchsia 使用或打算使用多項 CPU 功能來提高安全性, 支援使用消毒液,進而提高安全性。這些一般都會 由本文所述的編譯器旗標控管,因此不必擔心。

值得注意的是:

測試

正確性:變更 CPU 指定目標設定不應降低正確性。 方法是持續進行預先提交和提交後測試。現在 就足以確保這件事情已足夠

效能:變更 CPU 指定目標設定通常會影響效能。 並利用 Fuchsia 的 Perfcompare 系統驗證這類變化, 屬於「之前」的案例。

二進位檔大小:CPU 指定目標的變更通常會稍微影響二進位檔的大小 管理基礎架構具體來說,Fuchsia 目前正在追蹤天文圖像大小 因為這是規模最有限的目標 立即變更不會迴歸這個大小影響下列項目的未來變更: 我們可能會審查產品圖片,並仔細評估 專屬 ID

缺點、替代方案和未知

CPU 目標為在工程與業務方面有許多取捨 但有時也會造成衝突的目標以上是上述審查方式。日後推出的變更 這些權衡取捨、未來調整機會和注意事項 不在 RFC 的範圍內