RFC-0151:CPU 指定目標的編譯器調整旗標 | |
---|---|
狀態 | 已接受 |
領域 |
|
說明 | 提議變更用於管理 CPU 指定目標的編譯器旗標,以及這些標記對平台和 SDK 版本的影響。 |
問題 | |
毛皮變化 | |
作者 | |
審查人員 | |
提交日期 (年-月-日) | 2022-01-04 |
審查日期 (年-月-日) | 2022-02-02 |
摘要
提議變更用於管理 CPU 目標及其影響的編譯器旗標 平台和 SDK 版本
提振精神
Fuchsia 的版本產生許多構件,內含可執行的機器程式碼 適合不同架構的應用範例例如:預先建構共用 發布供 SDK 使用的程式庫,或可執行的 C/C++、 平台和產品系統映像檔包含的 Rust 二進位檔。時間 在編譯器中產生機器碼時,請務必指出下列事項:
目標架構:要使用哪些指令集架構?例如 x86-64 或 AArch64 ISA。此外,編譯器可能會鎖定 ISA 修訂版本。 修訂版本可能會針對現有內容提供額外指示或變化版本 指示,例如新的浮點或 SIMD 指令,或較寬的原子 這些記憶體作業可以大幅改善效能重點在於 瞭解目標架構,生成程式碼保證可運作 指定裝置的 Cookie。「竄升」目標架構就能解鎖新功能 因為與舊版硬體回溯相容性的成本相當低廉
高於:ARM ISA 的進展 (資料來源)
目標微架構目標:如何實作 ISA?這通常 依照指令是依序執行 順序錯誤、解碼頻寬、快取載入延遲時間等 微架構可讓編譯器產生可能會執行的機器程式碼 ,且不影響硬體相容性。
上方:Intel Core 2 微架構區塊圖 (資料來源)
編譯器可讓使用者以待審查的方式指定這些目標 Fuchsia 的建構系統能夠針對 採計Fuchsia 中現有的 CPU 鎖定實作方式 建置了一些缺點,而這個 RFC 旨在解決下列問題:
為 arm64 選擇的基準設定是鎖定特定 CPU (Cortex-A53),而非 ISA 搭配功能。如此一來 。
由於缺少過往藝術品,因此不清楚如何為這個基準設定覆寫值 但沒有明確記錄的政策或最佳做法因此 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-a53
或
haswell
。如果 -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.gni
和 sherlock.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
引數不會再套用至核心映像檔。這是
原因如下:
需要在 codegen 中掌握的新指令或其他 CPU 功能 但時間並未對核心帶來好處。
微調核心程式碼,雖然微架構架構調整,但 減少二進位檔的多元性和複雜度增加的成本。
核心可以繼續提供支援的硬體相關資訊
例如使用
zx_system_get_features
Syscall。
此外,核心仍可使用一些較新的硬體
像是 64 kB 記憶體頁面
,只會在執行階段查詢這些功能是否存在。如果是
這類功能需要主機專屬設定才能使用
就可以輕鬆導入新引數 kernel_board_configs
來定義
以及相關的旗標
回溯相容性
此 RFC 中提議的立即變更並未提高 Fuchsia 的最低 因此不會影響回溯相容性未來 政策規定能提高最低要求 這個 RFC 提倡條件
安全性考量
Fuchsia 使用或打算使用多項 CPU 功能來提高安全性, 支援使用消毒液,進而提高安全性。這些一般都會 由本文所述的編譯器旗標控管,因此不必擔心。
值得注意的是:
- Userspace Top-Byte-Ignore (另請參閱 RFC-0143 是 可全面支援 AArch64 環境
- 為改善消毒液支援的新指示 (例如 ARM MTE) 或防範安全漏洞,只要確保 控制流程完整性 (例如 指標驗證和分支目標識別 或 Intel 控制流程強制執行技術)。 位於 NOP 空間中,因此可以回溯相容 (就如同 是舊版 CPU 會以 NOP 的形式執行因此,使用這些操作說明時 要求提高平台或 SDK 支援的最低 ISA 變種版本
測試
正確性:變更 CPU 指定目標設定不應降低正確性。 方法是持續進行預先提交和提交後測試。現在 就足以確保這件事情已足夠
效能:變更 CPU 指定目標設定通常會影響效能。 並利用 Fuchsia 的 Perfcompare 系統驗證這類變化, 屬於「之前」的案例。
二進位檔大小:CPU 指定目標的變更通常會稍微影響二進位檔的大小 管理基礎架構具體來說,Fuchsia 目前正在追蹤天文圖像大小 因為這是規模最有限的目標 立即變更不會迴歸這個大小影響下列項目的未來變更: 我們可能會審查產品圖片,並仔細評估 專屬 ID
缺點、替代方案和未知
CPU 目標為在工程與業務方面有許多取捨 但有時也會造成衝突的目標以上是上述審查方式。日後推出的變更 這些權衡取捨、未來調整機會和注意事項 不在 RFC 的範圍內