1月16日,玄鐵高級技術(shù)專家-郭任受邀參加2024東京RISC-V冬季會議,進(jìn)行了主題名為《rv64ilp32: The future of 32-bit Linux》的演講。在計(jì)算機(jī)科學(xué)領(lǐng)域,選擇合適的指針位寬和指令架構(gòu)對系統(tǒng)的性能和資源利用至關(guān)重要。本文將探討:
為何選擇 32位指針
為何選擇 64位指令架構(gòu)
介紹玄鐵在RISC-V 64ilp32 ABI上的工作
為何選擇32位指針?
計(jì)算機(jī)科學(xué)巨擘、圖靈獎得主唐納德在2008年的博客中曾發(fā)表過一段著名的言論,他抱怨道:在編譯內(nèi)存需求不足4GB的程序時(shí),使用64位指針是非常不明智的。因?yàn)楫?dāng)這些指針值出現(xiàn)在結(jié)構(gòu)體中時(shí),它們不僅浪費(fèi)了一半的內(nèi)存,而且還導(dǎo)致一半的緩存被浪費(fèi)。這表明,在不需64位尋址的情境中,使用64位指針不僅增加了內(nèi)存消耗,還降低了緩存的使用效率。相比之下,使用32位指針可以更有效地利用內(nèi)存和緩存資源,提高程序的性能。因此,唐納德的觀點(diǎn)強(qiáng)調(diào)了在不需要64位尋址的場景中,應(yīng)優(yōu)先選擇使用32位指針。
唐納德指出,不當(dāng)?shù)厥褂?4位指針會導(dǎo)致內(nèi)存的浪費(fèi)。為了驗(yàn)證這一觀點(diǎn),我們進(jìn)行了一項(xiàng)實(shí)驗(yàn),對比了rv64ilp32和rv64lp64 Linux內(nèi)核的內(nèi)存開銷。實(shí)驗(yàn)環(huán)境基于Linux tinyconfig,并且啟動日志已進(jìn)行逐行對齊,以確保兩種配置在軟件層面完全一致:
實(shí)驗(yàn)結(jié)果顯示,64位指針相比32位指針浪費(fèi)了高達(dá)25%的內(nèi)存!對于許多嵌入式工程師而言,幾百KB的內(nèi)存都是寶貴的資源,他們無法容忍這種浪費(fèi)。因此,在不需要64位尋址的場景中,使用32位指針是更為明智的選擇,可以有效降低內(nèi)存開銷。
唐納德還指出,不合理使用64位指針會導(dǎo)致緩存效率降低,進(jìn)而影響性能。為了驗(yàn)證這一觀點(diǎn),我們對64ilp32和64lp64 SPEC2006的性能進(jìn)行了對比。實(shí)驗(yàn)結(jié)果如下:
黃色柱狀圖表示在Sifive Unmatched開發(fā)板上的測量結(jié)果。柱狀體向上表示32位指針相比64位指針的性能提升幅度,柱體向下表示性能下降幅度。
藍(lán)色柱狀圖表示在Allwinner D1開發(fā)板上的測量結(jié)果。
需要注意的是,由于rv64ilp32的編譯器仍處于開發(fā)階段,優(yōu)化尚不完美,因此在456.hmmer測試用例中性能有所下降。經(jīng)過分析,這是一個(gè)編譯器性能問題,未來將會得到解決。總體結(jié)果顯示,在相同的rv64指令架構(gòu)的硬件上,使用32位指針相比64位指針可以顯著提升性能。這一結(jié)果進(jìn)一步支持了唐納德的觀點(diǎn),即在不需要64位尋址的場景中,使用32位指針是更明智的選擇,可以有效提升緩存利用率達(dá)到提升性能的目的。
在SPEC 2017測試中,我們進(jìn)一步驗(yàn)證了32位指針相比64位指針在性能上的優(yōu)勢。實(shí)驗(yàn)結(jié)果顯示,使用32位指針在多個(gè)測試用例中都獲得了顯著的性能提升。
32位指針在嵌入式系統(tǒng)中至關(guān)重要,通常人們會選擇傳統(tǒng)的32位指令架構(gòu)。然而,近期情況發(fā)生了變化,許多嵌入式芯片制造商由 arm32 轉(zhuǎn)向了RISC-V 64位指令架構(gòu)(Allwinner D1s, SOPHGO CV1800B 和 Bouffalo Lab BL808 ...)。
為什么會發(fā)生這樣的轉(zhuǎn)變?讓我們進(jìn)入下一個(gè)主題:
為何選擇64位指令架構(gòu)?
Gary Explains 在 YouTube 上發(fā)布了一段熱門的視頻,標(biāo)題為“32-bits is DEAD!”。確實(shí),從幾個(gè)關(guān)鍵現(xiàn)象中我們可以觀察到,32位指令架構(gòu)正在從應(yīng)用處理器中消失。
RISC-V 的應(yīng)用處理器 profiles 自從 RVA20、RVA22 到 RVA23,包括 RVB23,都未曾采納過32位指令架構(gòu)
Arm-v9 的應(yīng)用處理器規(guī)范已移除了32位指令架構(gòu)
x86-s 規(guī)范同樣也剔除了32位指令架構(gòu)
以上現(xiàn)象揭示了一個(gè)趨勢,新一代應(yīng)用處理器正在逐步淘汰32位指令架構(gòu)。那么,究竟是什么原因?qū)е铝诉@一趨勢呢?我嘗試著尋找答案:
無論是基于Arm-v8還是x86架構(gòu)的64位處理器,都保留了32位指令架構(gòu)模式。這種模式將64位寄存器壓縮至32位使用,導(dǎo)致丟棄了寄存器的高32位。唐納德認(rèn)為,浪費(fèi)一半緩存和內(nèi)存的行為是“absolutely idiotic”。那么,浪費(fèi)一半的寄存器的行為又該如何評價(jià)呢?
寄存器作為計(jì)算機(jī)系統(tǒng)中寶貴的存儲部件,直接參與處理器流水線的執(zhí)行單元運(yùn)作,對性能起到關(guān)鍵作用。然而,為了兼容性,過去十幾年間,我們浪費(fèi)了一半的寄存器資源。這一現(xiàn)象的根本原因是,無論是Arm還是x86都已建立了根深蒂固的傳統(tǒng)32位軟件生態(tài),導(dǎo)致他們繼續(xù)沿用傳統(tǒng)32位。與這些傳統(tǒng)架構(gòu)不同,RISC-V沒有32位歷史包袱,它的32位軟件生態(tài)還處于萌芽期,這恰好為矯正和優(yōu)化提供了絕佳時(shí)機(jī)。rv64ilp32 ABI 正是瞄準(zhǔn)這一機(jī)遇,旨在規(guī)避過去架構(gòu)中出現(xiàn)的謬誤,為嵌入式RISC-V應(yīng)用處理器提供更卓越的新32位解決方案,以替代已顯老舊的傳統(tǒng)32位架構(gòu),實(shí)現(xiàn)性能與成本的雙贏。
那么,扔掉一半寄存器究竟會有什么樣的后果?
我們在相同 RISC-V 64位架構(gòu)的硬件上,對比 rv64ilp32 和 rv32ilp32 的 Linux 內(nèi)核 memcpy/memload/memset 函數(shù)的性能。藍(lán)色柱狀圖代表 Allwinner D1硬件平臺,而橘色柱狀圖代表算能 sg2042 硬件平臺。rv64ilp32 相比 rv32ilp32 在所有測試用例上,都獲得了性能提升,尤其是在 sg2042 硬件平臺上,平均獲得了接近翻倍的性能提升,這得益于其內(nèi)存控制器提供了充足的帶寬,而 D1 硬件平臺受限于內(nèi)存帶寬,性能提升幅度雖不如 sg2042,但也非常顯著。測試結(jié)果告訴我們,64位指令架構(gòu)相比32位在性能上有巨大優(yōu)勢,因?yàn)樗行嵘魉€的吞吐帶寬,就如同大炮的口徑,口徑越大威力越大。那么,用純32位指令架構(gòu)設(shè)計(jì)芯片,能否降低芯片面積?
我們的同行 ARM 已經(jīng)做過嘗試,Cortex-A32 就是從 Cortex-A35 裁剪64位模式僅保留32位模式而來,單核面積下降了 13%,乍聽起來不錯(cuò),但這 13%并不簡單,它還包含了調(diào)整位寬之外的其他變更:
AArch64 有 31 個(gè)寄存器,但 AArch32 只有 15 個(gè),剔除了16個(gè)通用寄存器,這項(xiàng)修改所涉及的 bit 總數(shù)和改變通用寄存器位寬(從64位到32位)是一樣多的。
AArch64 有 32 個(gè)128位 SIMD 寄存器,但 AArch32 只有 16 個(gè),又剔除16個(gè) SIMD 寄存器,這項(xiàng)修改所涉及的 bit 總數(shù)是改變通用寄存器位寬的 4 倍。
Cortex-A35 是 AArch32 + AArch64 的結(jié)合體,并不是純 64位指令架構(gòu)的處理器,但 Cortex-A32 只支持 AArch32,是純32位指令架構(gòu)的處理器,所以這不是 AArch64 v.s. AArch32。
所以當(dāng)我們將 13%換算到 RISC-V 上時(shí),結(jié)合以上3個(gè)因素打一個(gè)折扣,13%/4=3.25%,而這僅僅是從單核的視角去思考。如果再從整個(gè)應(yīng)用處理器 SoC 的維度看,當(dāng)加上 L2 緩存、系統(tǒng)總線和各種 IP后,CPU核面積在整個(gè)應(yīng)用處理器芯片的占比,不會超過 10%(一般小于5%)。綜上所述,使用 32 位指令架構(gòu)能為整個(gè) SoC 芯片面積帶來的收益,實(shí)在太小了!讓我們再回顧下這些小內(nèi)存應(yīng)用處理器芯片:
這些廠商選擇 RISC-V 64位指令架構(gòu)替換 arm32 是有遠(yuǎn)見且明智的,他們在用真金白銀的行動告訴我們,RISC-V 64位指令架構(gòu)才是 32位Linux 的未來!而我們的工作就是實(shí)現(xiàn) rv64ilp32 ABI,在 RISC-V 64位指令架構(gòu)上完美運(yùn)行 32位 Linux:
玄鐵在RISC-V 64ilp32 ABI上的工作
實(shí)現(xiàn) rv64ilp32 意味著引入了一個(gè)全新的ABI,這是一個(gè)龐大的工程,需要大量的投入來推動整個(gè)軟件生態(tài)的發(fā)展。盡管有人因?yàn)槲窇痔魬?zhàn)而猶豫不前,甚至將這種情緒蔓延到整個(gè)Linux世界,認(rèn)為x86-x32、mips-n32和arm64-ilp32都失敗了,憑什么RISC-V會成功。但我對此不以為然。這些架構(gòu)之所以失敗,是因?yàn)樗鼈兊?2位ABI根深蒂固,難以改變。如果人們想要使用32位指針,只需讓硬件在32位模式下運(yùn)行現(xiàn)有的軟件即可。然而,RISC-V的32位軟件生態(tài)尚處于萌芽階段,沒有歷史包袱。
我們汲取了前人的經(jīng)驗(yàn),并在此基礎(chǔ)上進(jìn)行了創(chuàng)新。在實(shí)現(xiàn)了用戶態(tài)u64ilp32 ABI的基礎(chǔ)上,我們首次實(shí)現(xiàn)了s64ilp32 Linux內(nèi)核,并以嵌入式小內(nèi)存場景為切入點(diǎn),使其更貼近實(shí)際應(yīng)用場景(而非x86-x32的科學(xué)計(jì)算和基準(zhǔn)測試場景)。
我們?yōu)長inux內(nèi)核實(shí)現(xiàn)了36個(gè)補(bǔ)丁:
前11個(gè)補(bǔ)丁是 u64ilp32 用戶態(tài)支持,而X86、MIPS和ARM也僅實(shí)現(xiàn)了這一步。
后25個(gè)補(bǔ)丁是 s64ilp32 Linux內(nèi)核,即讓32位Linux完美運(yùn)行在64位指令架構(gòu)的硬件上,是世界上第一個(gè) 64ilp32 ABI 的 Linux 內(nèi)核。
上圖中展示:該補(bǔ)丁集為Linux引入了新的內(nèi)核模式s64ilp32,該模式同時(shí)支持u64ilp32和u32ilp32兩種用戶態(tài)ABI。
此外,該補(bǔ)丁集還為s64lp64內(nèi)核模式增加了對u64ilp32用戶態(tài)ABI的支持。
相較于傳統(tǒng)的s32ilp32內(nèi)核,新的s64ilp32內(nèi)核具有以下優(yōu)勢:
內(nèi)核的內(nèi)存拷貝函數(shù)性能大幅提升。
ebpf JIT性能大幅領(lǐng)先。
支持原生64位原子指令。
支持原生64位算術(shù)指令。
目前,我們已初步完成Fedora 38的移植工作:
由于構(gòu)建u64ilp32用戶態(tài)的道路漫長,我們決定先采用s64ilp32+u32ilp32的混合模式,以快速交付完整的32位Linux解決方案。該方案可在配備玄鐵c908和c907的芯片上運(yùn)行,這些處理器都支持sxl=64 uxl=32的混合模式。此項(xiàng)工作由三個(gè)團(tuán)隊(duì)共同完成:
PLCT團(tuán)隊(duì)負(fù)責(zé)編譯器和工具鏈的開發(fā)。
玄鐵處理器團(tuán)隊(duì)負(fù)責(zé)Linux內(nèi)核和CPU的適配工作。
Fedora團(tuán)隊(duì)則負(fù)責(zé)Linux發(fā)行版的構(gòu)建與維護(hù)。
由于RISC-V的32位軟件生態(tài)相對薄弱,我們開創(chuàng)性地引入了兼容u64lp64的模式:
使64位應(yīng)用程序得以在32位Linux內(nèi)核上運(yùn)行。我們已經(jīng)完成了原型驗(yàn)證,成功將64位地址空間壓縮至2GB,并順利啟動了整個(gè)64位根文件系統(tǒng)。這一創(chuàng)新特性將作為下一版本[RFC PATCH V3]的重要組成部分,旨在彌補(bǔ)RISC-V在32位軟件生態(tài)方面的不足。在完成“s64ilp32 + u64lp64”特性后,我們進(jìn)一步統(tǒng)一了s64ilp32和s64lp64支持的用戶態(tài)模式,實(shí)現(xiàn)了根文件系統(tǒng)的二進(jìn)制兼容性:
這意味著在這兩種模式下,應(yīng)用程序和操作系統(tǒng)可以無縫地運(yùn)行,無需進(jìn)行額外的修改或適配。這一改進(jìn)不僅簡化了軟件開發(fā)和部署過程,還增強(qiáng)了RISC-V架構(gòu)的靈活性和可擴(kuò)展性。我們的最終目標(biāo)是,通過實(shí)現(xiàn)“s64ilp32 + u64ilp32”的組合取代傳統(tǒng)32位,并復(fù)用64位的系統(tǒng)調(diào)用接口,刪除老32位,實(shí)現(xiàn)Linux用戶ABI的統(tǒng)一:
這將有助于簡化軟件的開發(fā)、部署和維護(hù)過程,提高系統(tǒng)的穩(wěn)定性和兼容性。RISC-V 64ilp32 ABI 也將進(jìn)一步推動RISC-V架構(gòu)的發(fā)展和普及,使其成為更多應(yīng)用領(lǐng)域的理想選擇。
Linux CPU子系統(tǒng)的維護(hù)者 Arnd Bergmann 曾寫過一篇同名文章 "The future of 32-bit Linux",文中他詳細(xì)分析了當(dāng)前32位Linux的歷史和現(xiàn)狀,給出了一個(gè)不幸的結(jié)論:等 arm32 退出歷史舞臺,32位Linux就會消亡。然而,我們認(rèn)為rv64ilp32 ABI 將進(jìn)一步推動玄鐵 RISC-V 在嵌入式 Linux 領(lǐng)域的商業(yè)化進(jìn)程,并有望取代 Arm32 架構(gòu),為32位Linux開創(chuàng)一個(gè)光明的未來。
-
Linux
+關(guān)注
關(guān)注
87文章
11508瀏覽量
213530 -
編譯器
+關(guān)注
關(guān)注
1文章
1661瀏覽量
50142 -
RISC-V
+關(guān)注
關(guān)注
46文章
2544瀏覽量
48665
原文標(biāo)題:玄鐵的rv64ilp32之路 - 32位Linux的未來
文章出處:【微信號:芯片開放社區(qū),微信公眾號:芯片開放社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
RT-Thread BSP全面支持玄鐵全系列RISC-V 處理器 | 技術(shù)集結(jié)

玄鐵加入RT-Thread 高級會員合作伙伴 | 戰(zhàn)略新篇

思爾芯與玄鐵合作IP評測,加速RISC-V生態(tài)發(fā)展

西門子EDA亮相2025玄鐵RISC-V生態(tài)大會
速顯微電子亮相2025玄鐵RISC-V生態(tài)大會
酷芯AR8032S入選2025玄鐵優(yōu)選芯片
愛芯元智亮相2025玄鐵RISC-V生態(tài)大會
云知聲亮相2025玄鐵RISC-V生態(tài)大會
“開放·連接 ”2025玄鐵 RISC-V 生態(tài)大會議程公布!
預(yù)告|思爾芯邀您共聚2025玄鐵RISC-V生態(tài)大會

評論