| RFC-0073:將 x86-64 平台需求提升至 x86-64-v2 | |
|---|---|
| 狀態 | 社會化 |
| 區域 |
|
| 說明 | 將最低 x86-64 平台從 v1 + 擴充功能提升至 v2 |
| Gerrit 變更 | |
| 作者 | |
| 審查人員 | |
摘要
建議將 x86-64 平台下限從「x86-64-v1」擴充功能提高至「x86-64-v2」。
Fuchsia 目前在 x86-64 CPU 上執行,並採用基本 64 位元 ISA 和 CMPXCHG16B 擴充功能。這項 RFC 建議將最低需求提升至 x86-64-v2 ISA,並新增 LAHF-SAHF、POPCNT、SSE3、SSE4.1、SSE4.2 和 SSSE3 擴充功能。提高最低平台需求,並允許編譯器使用這些擴充功能產生程式碼,可顯著提升系統效能,同時只會稍微減少 Fuchsia 執行的系統數量。
設計
目前編譯的 Fuchsia 核心和系統,是以具備 CMPXCHG16B 擴充功能的「一般」x86-64 CPU 為目標。
這涵蓋自 K8 修訂版 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-v3,會加入 AVX、AVX2、BMI1、BMI2、F16C、FMA、LZCNT、MOVBE 和 XSAVE,但這樣會排除 Intel Sandy Bridge、Intel Ivy Bridge、AMD Bulldozer/Piledriver/Steamroller 和所有 Intel Atom CPU,這並不可行。
實作
這項變更可在單一 CR (484898) 中實作。CR 會將「-march=x86-64-v2」傳遞至 Fuchsia 建構的編譯器,讓編譯器使用新的基準功能產生程式碼。
當 x86_64-fuchsia 做為目標傳遞時,我們也會變更編譯器/工具鍊中的預設值,讓以 Fuchsia 為目標並使用工具鍊建構的任何第三方程式碼,都能受益於 ABI。
效能
這項提案可望提升 x86-64 平台所有已編譯 C/C++ 程式碼的效能。perfcompare 中的初始 Microbenchmark 證實了這一點:
- 2914 個測試案例中有 716 個速度變快,其中部分重要案例的速度大幅提升
- 值得注意的是,100 位元組物件的 free() / delete 速度提升了 30 奈秒 (基準為 83 奈秒);這主要是因為 malloc 中使用的 CRC32C 指令現在假設為可用。
- 大多數 FIDL HLCPP 和 LLCPP 編碼/解碼微基準測試都變快了;有些甚至大幅提升 (舉例來說,HLCPP/Builder/OptionalStructTree/Depth8/Steps.Build/WallTime 節省了約 4 毫秒 (基準為 15 毫秒))。
安全性考量
這項提案沒有任何安全性考量。
隱私權注意事項
這項提案沒有隱私權考量。
測試
這項變更會透過 Fuchsia CI/CQ 測試執行,並在本機測試核心測試。此外,我們也會在功能定義邊緣附近的各種處理器系列上啟動/測試 Fuchsia,包括 AMD Piledriver、Intel Apollo Lake Atoms 和其他可用的處理器。
說明文件
我們需要在 Fuchsia 平台支援文件中的「設定 Fuchsia 硬體」一節 (位於 fuchsia.dev) 中,記錄新的功能基準。目前列出的 x86-64 裝置不多,但未指定功能基準。
缺點、替代方案和未知事項
- 實施這項提案的成本為何?
這項變更會導致部分較舊的 x86-64 處理器無法執行 Fuchsia,目前可執行 Fuchsia 的處理器包括: ** Intel Pentium 4 / Pentium D 64 位元處理器 ** Intel Core 2 Duo / Quad 處理器 ** Intel「Bonnell」Atom 處理器 ** AMD K8 NPT (rev F) 處理器 ** AMD K10 處理器
如果 KVM 或其他管理程序未模擬缺少的指令,這些處理器也無法在這些管理程序下執行 Fuchsia。
這些處理器系列中,最新的是在 2008 年發布。這些系列最後一款新處理器是在 2013 年推出。
- 還有哪些策略可以解決相同問題?
動態列舉這些功能,以及手寫組語/內建函式,可能可以擷取部分/大部分的效能提升,但需要對程式碼庫進行手動分析,且無法像假設特定功能可用並產生無分支程式碼來使用這些功能一樣,擷取那麼多的效能。