奧推網

選單
科技

華為程式碼加速 Linux 核心功能 715 倍!

整理 | 王啟隆

作為送給全球開發者的聖誕禮物,Linux 在前日釋出了 Linux 6。1 核心的穩定版,並開啟了 Linux 6。2 的合併視窗。這次更新不僅為廣大使用者帶來了不少新功能與改進,還讓許多人開始期盼 Linux 6。2 將會合並哪些令人興奮雀躍的內容。那麼,Linux 6。2 的合併視窗現在都有什麼新動向呢?

合併華為程式碼,平均查詢效能再提升

12 月 14 日,Linux 6。2 合併了一段來源於華為的程式碼,這段程式碼將 Linux 6。2 核心函式的速度提高了 715 倍。程式碼的註釋寫道:

透過華為 Zhen Lei 的貢獻,Tux(Linux 的吉祥物小企鵝,全稱為tuxedo,此處代指 Linux)在聖誕節期間將 kallsyms_lookup_name() 的平均查詢效能提高了 715 倍。這份程式碼將我們那個 O(n) 的舊實現升級到了 O(log(n)),同時還支援以前 /proc/kallsyms 上的舊實現。

唯一的不足是,這麼做將會讓記憶體的佔用量增加 3 * kallsyms_num_syms。

文中,kallsyms_lookup_name() 是一個函式,用於根據名稱查詢符號的地址,並可用於查詢核心符號表中的任何符號。這段程式碼將另一個包含索引的陣列新增到原始陣列,從線性查詢變為二分查詢,從 O(n) 變為 O(log(n)),以便可以在不影響原始陣列順序的情況下對其進行排序,並提供顯著的加速。

Zhen Lei 在此前較早的補丁版本釋出時,也描述了 kallsyms_lookup_name 是如何最佳化的:

從前,如果我們要搜尋一個符號,就需要將 ‘kallsyms_names’ 函式中的符號一個一個展開,然後使用展開後的字串進行比較。這種線性查詢,就是 O(n)。但是,如果我們像地址一樣按升序對名稱進行排序,就可以換成二分查詢,既 O(log(n))。隨後,為了不改變 “/proc/kallsyms” 的實現,表 kallsyms_names[] 仍需按照升序,與地址一一對應地進行儲存。

接下來,我添加了陣列 kallsyms_seqs_of_names[],以排序後的姓名序號為索引,對應的內容為排序後的地址序號。舉個例子:假設 NameX 在陣列 kallsyms_seqs_of_names[] 中的索引為‘i’,kallsyms_seqs_of_names[i] 的內容為 ‘k’ ,則 NameX 對應的地址為 kallsyms_addresses[k]。kallsyms_names[] 中的偏移量是 get_symbol_offset(k)。

最後,請注意這個最佳化會讓記憶體的使用量增加 (4 * kallsyms_num_syms) 位元組。近期將會發布兩個補丁,以減少 (1 * kallsyms_num_syms) 位元組並正確處理發生 CONFIG_LTO_CLANG=y 時的情況。

透過在 X86 平臺上的效能測試,可以得出 kallsyms_lookup_name() 的平均查詢效能確實提高了 715 倍:

以前:

Min =234, max=10364402, avg=5206926

Min =267, max=11168517, avg=5207587

現在:

Min =1016, max=90894, avg=7272

Min =1014, max=93470, avg=7293

擴充套件 ARMSoC 支援,面向更多使用者

同樣在 12 月 14 日,Linux 6。2 的合併視窗新增了 Arm SoC 支援和 DeviceTree 的更新。6。2 核心將會支援多達 7 種高通驍龍 SoC,甚至還在 Mainline 裡提供了對 Apple M1 Pro/Ultra/Max SoC 的初步支援。

在假期合併視窗期間,Linux 核心開發者 Arnd Bergmann 為 Linux 6。2 完成了這次 SoC 更新,而 Linux 之父 Linus Torvalds 已經接受了這些合併請求。

本次更新將加入的七種高通驍龍 SoC 分別是:

MSM8996 Pro(驍龍 821)

SM6115(驍龍 662)

SM4250(驍龍 460)

SM6375(驍龍 695)

SDM670(驍龍 670)

MSM8976(驍龍 652)

MSM8956(驍龍 650)

這些驍龍 SoC 和 Linux 核心目前已支援的高通硬體都有著不少共同之處。與此同時,一些使用這些 SoC 的新裝置也成功得到了上游化。包括:

索尼的 Xperia 10 IV、5 IV、X 和 X Compact;一加的 OnePlus One、OnePlus 3、OnePlus 3T 和 OnePlus Nord N100;小米的 Mi6;華為手錶;谷歌的 Pixel 3a。

另外,Linux 6。2 Mainline 終於開始了對 蘋果 M1 Pro、M1 Max 和 M1 Ultra SoC 的初步支援。研究 Linux for Apple Silicon macs 的組織群體 Asahi Linux 團隊正在開發相關的核心程式碼,該團體的目標便是將 Linux 移植到更新的 Apple Silicon 驅動的 Mac。

如今,更多的程式碼被上游化至 Linux 6。2,而 Linux 上對蘋果 M1 / M2 裝置的最佳硬體支援也是來自於 Asahi Linux。

圖形驅動改進,擁抱 RTX 30 系顯示卡

還是在 12 月 14 日,Linux 6。2 合併了開源核心圖形/顯示驅動程式 Direct Rendering Manager(DRM)。英特爾的銳炫系列顯示卡(DG2/Alchemist)所使用的 Arc Graphics 驅動也終於不再是“實驗性”了。

以前的 Linux 核心如果想支援銳炫 Arc 系列顯示卡,那就必須透過選項 i915。force_probe= 來強制啟用“實驗性”硬體支援。但是,在 Linux 6。2 及以後版本中,銳炫 的離散圖形處理器被認為足夠穩定,可以在預設情況下啟用。

從此以後,執行 Linux 6。2+ 和 Mesa 22。3+ 時也可以享受 Arc Graphics 驅動帶來的圖形優化了。

另一個重大更新自然就是 Linux 6。2 開始初步支援英偉達 RTX 30 “Ampere” 的加速,將其進行了上游化。雖然 RTX 40 早已釋出,但還有不少人仍持有著 30 系顯示卡;使用 Nouveau 的 RTX 30 系列依賴於英偉達幾個月前釋出的純二進位制韌體進行加速,並且 Nouveau Gallium3D 還在 Mesa 中支援 OpenGL。

這是 Linux 6。2 為廣大開發者準備的聖誕禮物。值得一提的是,Linux 6。2 的模組程式碼還包含一個次要的引導最佳化,可以減少大約 30 毫秒的引導時間。

參考連結:

https://www。phoronix。com/forums/forum/phoronix/latest-phoronix-articles/1362114-linux-6-2-speeds-up-a-function-by-715x-kallsyms_lookup_name

https://www。phoronix。com/news/Linux-6。2-Arm-SoC-Updates

https://www。phoronix。com/news/Linux-6。2-DRM

☞☞