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

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

建議變更控管 CPU 目標的編譯器旗標,以及這些變更對平台和 SDK 建構的影響。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2022-01-04
審查日期 (年-月-日)2022-02-02

摘要

建議變更控管 CPU 目標的編譯器旗標,以及這些變更對平台和 SDK 建構的影響。

提振精神

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

目標架構:要使用哪種指令集架構?例如 x86-64 或 AArch64 ISA。此外,編譯器可能會以 ISA 的修訂版本為目標。修訂版本可能會提供額外或現有指令的變化版本,例如新的浮點或 SIMD 指令,或是更廣泛的原子記憶體作業,可大幅提升效能。瞭解目標架構至關重要,這樣才能產生保證可在目標裝置上運作的程式碼。「提高」目標架構可解鎖新功能,但會犧牲與舊版硬體的回溯相容性。

ARM ISA 的演進

上方:ARM ISA 的演進 (來源)

目標微架構:ISA 的實作方式為何?這通常會以指令是否依序或亂序執行、解碼頻寬、快取載入延遲等方式表示。指定目標微架構可讓編譯器產生可在目標硬體上更快執行的機器碼,且不會限制硬體相容性。

Intel Core 2
微架構

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

編譯器可讓使用者指定這些目標,我們稍後會進行審查。Fuchsia 的建構系統可針對全域或每個二進位檔設定編譯器。Fuchsia 建構中現有的 CPU 目標指定實作方式有幾項缺點,而這份 RFC 的目標就是要解決這些問題:

  1. 為 arm64 目標選擇基準設定時,目標是特定 CPU (Cortex-A53),而非 ISA 和使用的功能。這會導致平台基準定義不佳。

  2. 由於缺乏先例,且沒有相關政策或最佳做法文件,因此不清楚如何為這個基準設定覆寫。因此,Fuchsia 會建構所有項目,但會回溯至基準,包括以明確超出基準的硬體為目標的建構設定。

這些缺點自 2016 年建構開始就存在,且在 Fuchsia 演進的先前技術中也存在。目前的系統是在第一部裝置上出貨 Fuchsia (該裝置剛好使用與當今平台 arm64 基準相同的微架構)。

最近的發展趨勢顯示,現在是全面翻新的好時機。具體來說,除了以 Cortex-A53 為目標的 Astro 和 Sherlock 板設定外,Fuchsia 現在也支援 Nelson 板設定 (Cortex-A55) 和 Atlas 板設定 (Intel Amber Lake)。不過,這些建構作業目前並未設定為利用基準與實際目標之間的差異。

此外,大家對修正或提高平台硬體基準的定義也越來越感興趣。如果能更清楚定義基準設定和特定主機板設定,就能加快相關工作進度。另請參閱:

為因應當前和未來的挑戰,本 RFC 建議立即對建構中的 CPU 指定目標進行短期變更,並制定機制和政策,以管理可預見未來的指定目標。

利害關係人

協助人員: cpu@google.com

審查者:

  • aaronwood@google.com - 系統組裝
  • digit@google.com - 建構
  • mcgrathr@google.com - Kernel
  • mvanotti@google.com - 安全性
  • maniscalco@google.com - Kernel
  • phosek@google.com - 工具鍊
  • travisg@google.com - Kernel

已諮詢:

由於提議的變更會影響平台的大部分內容,因此建議所有當事人自行指派為諮詢對象。我們特別歡迎 Graphics、Media 和 SDK 等團隊提供意見回饋。

社交:

這項提案的重點首先在 Fuchsia 的 Kernel Evolution 工作群組中,以 60 分鐘的簡報形式進行審查,並開放討論。

背景

編譯時間微調旗標

Fuchsia 會使用 clang 編譯 C/C++,Fuchsia 程式碼的部分子集也會持續建構及測試 gcc。這兩項工具都提供下列旗標:

-march:設定目標架構,例如 x86-64-v2 (目前根據 RFC-0073 的 x64 基準) 或 ARMv8-A。您也可以選擇指定其他架構功能,例如 +avx2,指出大於 x64 基準的 Intel Haswell 擴充功能。

-mtune:設定目標微架構,例如 cortex-a53haswell。如果未使用 -mtune-mcpu,這個值會設為 generic,以在目標 CPU 範圍內達到平衡。

-mcpu:設定目標 CPU。可接受與 -mtune 類似的值。如果是 ARM CPU,這相當於設定目標架構 (-march) 和目標微架構 (-mtune),以符合目標 CPU。在 x86 上,這項功能視為已淘汰,系統會將指定的值重新導向至 -mtune

Rust 編譯器提供下列程式碼產生選項

target-cpu:與 -mcpu 類似,例如接受 cortex-a53

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

目前狀態

目前所有 x64 版本都是使用 -march=x86-64-v2 編譯,所有 ARM 版本都是使用 -mcpu=cortex-a53 編譯。

您可以透過名為 board_configs 的 GN 引數覆寫這項設定,而該引數可由 .gni 檔案中的主機板設定覆寫。部分開發板 (特別是 Astro 和 Sherlock) 會手動指定上述 Cortex-A53 設定,但目前這項作業不會產生任何作用,因為如果未定義任何覆寫,系統也會使用相同的設定做為備援。大多數主機板設定不會設定 board_configs

調整目標和取捨

本節將簡要回顧設定 CPU 目標選項時可考慮的不同目標,以及這些目標之間的一些取捨。

硬體相容性:指定較早的 ISA 修訂版本,即可與舊版硬體相容。相容性提升的代價是無法使用新的 ISA 功能,這可能會影響效能或安全性。

效能:新指令可提升效能:加快或擴大原子作業、加速數學運算 (FPU、SIMD 改良)、常見演算法的內建加速器 (例如 CRC 和 AES)。針對特定 CPU 調整機器碼,可產生在目標 CPU 上執行速度更快的程式碼,但通常會犧牲目標參數以外其他 CPU 的效能。

與二進位大小的互動:在某些情況下,調整可能會增加二進位大小,例如以依序處理器為目標的指令排程最佳化作業,會增加暫存器壓力。

二進位檔大小:某些 CPU 功能會解鎖部分程式碼產生功能。 舉例來說,SIMD 可啟用自動向量化,這與迴圈展開有類似效果,都會產生速度較快但較大的程式碼。針對依序 CPU 調整的指令排程往往會產生較大的程式碼,因為這類排程會增加更多排程限制,並可能增加暫存器壓力及暫存器溢出。

其他程式碼產生功能可以減少二進位檔大小。舉例來說,以專用指令取代 CRC 和 AES 等演算法,可產生速度更快且更小的程式碼。

方便進行疑難排解,也就是二進位檔多樣性:針對不同 CPU 進行調整,表示隨著時間推移,會產生更多相同邏輯構件的二進位檔變體。舉例來說,核心映像檔或預先建構的共用程式庫可能有多種「風味」,每種都針對不同目標進行最佳化。這可能會使問題重現變得更加複雜,或讓 Fuchsia 暴露於某些二進位變體中出現的問題,但其他變體則不會。

公平競爭環境:除了基準建構版本,Fuchsia 也可能提供針對特定 CPU 調整的 SDK 預先建構版本 (系統映像檔、可重新發布的共用程式庫)。這樣做會讓某些硬體選項比其他選項享有較窄的權限。如果為某些 CPU 建立調整過的 SDK 變種版本,日後使用者可能會期望我們提供更多調整過的 SDK 發布管道。

簡單:上述所有內容都會增加瞭解、開發及維護 Fuchsia 的複雜度。上述取捨適用於設定 CPU 目標選項,在已可行的情況下,於建構和發布管道中導入二進位多樣性,這些管道適用於特定硬體,例如針對特定使用者硬體的 OTA 管道。撰寫本文時,系統或套件傳送機制還無法為不同目標硬體提供多個二進位檔,並為正確裝置提供正確的二進位檔。

提案

您可以在這項變更中,查看立即建議的修改內容。 詳情請參閱下文。

新的 arm64 基準硬體目標

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

-mcpu=cortex-a53

從技術上來說,這等同於以一組精確的 Cortex-A53 功能表示 -march,並調整 Cortex-A53 的程式碼產生。

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

而是會以平台實際執行的 ARMv8-A ISA 功能做為基準,因此會假設為基準,然後針對一般 armv8a CPU 調整程式碼生成。

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

由於移除 Cortex-A53 支援但程式碼中未使用的 -march 功能是無作業,因此對 -march 的影響實際上是無作業。

由於一般調整目標會針對典型的依序 ARMv8-A CPU (例如 Cortex-A53) 進行最佳化,因此對 -mtune 的影響很小或沒有影響。

現有 x64 基準硬體目標異動

x64 目前的基準如下:

-march=x86-64-v2

上述RFC-0073:將 x86-64 平台需求提升至 x86-64-v2 中已涵蓋這個主題。

這會變更為下列旗標集:

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

如先前所述,如果未指定 -mtune-mcpu-mtune 預設為 generic,因此這項異動不會改變行為。不過,新增 -mtune=generic 可明確指出這項行為,且與 arm64 基準的定義一致。

開發板專屬設定

系統會繼續使用主機板專屬 .gni 檔案 (例如 //boards/ 中的檔案) 中指定的 board_configs 主機板引數,以主機板專屬設定覆寫基準設定。

具體來說,Cortex-A53 的主機板設定 (例如 astro.gnisherlock.gni) 會繼續以 Cortex-A53 為目標,並保留目前的 -mcpu=cortex-a53 設定。

基本上,這項 RFC 會採用以 Cortex-A53 為目標的現有 arm64 設定,並從平台基準中擷取該設定,然後用於搭載這類 CPU 的 Astro 和 Sherlock 主機板專屬設定。然後,這份 RFC 會以 ARM ISA 條款重新定義平台基準,適用於許多硬體選項,而非單一 ARM CPU。

此外,在 SDK 的未來版本中,您可能會新增支援,針對不同的架構變體 (例如 ARM Cortex-A73 或 Intel AVX 擴充功能) 進行最佳化。這值得進一步討論,但超出本課程範圍。

核心設定

board_configs 引數將不再適用於核心映像檔。原因如下:

  1. 目前,在程式碼產生時間需要瞭解的較新指令或其他 CPU 功能,對核心沒有好處。

  2. 以微架構為基礎調整核心程式碼,無法抵銷二進位檔多樣性和複雜度增加所帶來的成本。

核心可以繼續提供支援的硬體功能相關資訊,例如使用 zx_system_get_features 系統呼叫。

此外,核心仍可運用部分較新的硬體功能,例如 64kB 的記憶體頁面,這類功能不需要產生不同的程式碼,只要在執行階段查詢這些功能是否存在即可。如果導入這類需要主機板專屬設定的新功能,可以輕鬆導入新引數 kernel_board_configs,定義相關聯的旗標。

回溯相容性

本 RFC 建議的立即變更不會提高 Fuchsia 的最低硬體需求,因此不會影響回溯相容性。如果日後變更會提高最低需求,本 RFC 提倡的政策或許能派上用場。

安全性考量

Fuchsia 使用或打算使用多項 CPU 功能,以提升安全性或支援使用清除器 (進而提升安全性)。這些指令通常不受本文討論的編譯器旗標控制,因此不必擔心。

注意事項:

測試

正確性:變更 CPU 目標時,絕不應影響正確性。 這項作業會透過持續的預先提交和提交後測試進行驗證。目前的系統足以確保這一點。

成效:變更 CPU 目標通常會影響成效。 Fuchsia 的 Perfcompare 系統會用來驗證這類變更,與先前相同。

二進位檔大小:CPU 指定目標的變更通常會以細微的方式影響二進位檔大小。具體來說,Fuchsia 目前最密切追蹤的是 Astro 映像檔的大小,因為這是我們擁有的限制最多的目標。即時變更不會導致大小回歸。如果日後有異動會影響特定產品圖片,這些產品定義的擁有者可以審查並仔細考慮相關取捨。

缺點、替代方案和未知事項

CPU 指定目標會導致工程和業務之間出現許多取捨,有時目標還會互相衝突。詳情請參閱上文。日後若有變更導致這些取捨有所轉移,以及日後調整的機會和考量,都不在本 RFC 的範圍內。