化到原生執(zhí)行,加速程序運(yùn)行速度)
引言2026 年 7 月 26 日的文章探討了在非 RISC - V 機(jī)器上RISC - V 程序性能接近裸機(jī)性能的方法關(guān)鍵是使用提前編譯器通過尾調(diào)用連接基本塊采用 Clang 的 preserve_none 調(diào)用約定保留熱點(diǎn)來賓狀態(tài)。作者參與 [OpenVM](https://github.com/openvm - org/openvm) 開發(fā)這是在 [Axiom](https://axiom.xyz) 構(gòu)建的 RISC - V 虛擬機(jī)能運(yùn)行程序并生成加密證明。在 Axiom 工作時(shí)證明生成從單 CPU 擴(kuò)展到 [GPU 集群](https://ethproofs.org/provers)但執(zhí)行速度成瓶頸。在 M3 MacBook 上原生 arm64 程序約 100 毫秒完成通過解釋器運(yùn)行相同程序需三到四秒。解釋器基準(zhǔn)運(yùn)行 RISC - V 代碼的直接方法是用解釋器執(zhí)行取指 - 解碼 - 執(zhí)行周期。但來賓指令短小解釋器管理指令時(shí)間可能超執(zhí)行時(shí)間。提前預(yù)解碼可對(duì)指令預(yù)解碼存儲(chǔ)操作、操作數(shù)和處理程序指針解碼不再是熱點(diǎn)循環(huán)部分執(zhí)行時(shí)通過間接調(diào)用處理程序指針分發(fā)。通過計(jì)算跳轉(zhuǎn)進(jìn)行分發(fā)預(yù)解碼后間接分發(fā)成瓶頸可用“計(jì)算跳轉(zhuǎn)”每個(gè)處理程序查找下一個(gè)操作碼標(biāo)簽并跳轉(zhuǎn)執(zhí)行過程通過間接跳轉(zhuǎn)轉(zhuǎn)移控制權(quán)。尾調(diào)用線程化尾調(diào)用可連接處理程序處理程序尾調(diào)用下一個(gè)處理程序。編譯器可將調(diào)用轉(zhuǎn)換為普通跳轉(zhuǎn)Clang 的 musttail 屬性強(qiáng)制轉(zhuǎn)換。將狀態(tài)保留在寄存器中處理程序通過 State * 訪問 pc可將其作為函數(shù)參數(shù)傳遞讓編譯器將頻繁使用的值保留在宿主機(jī)寄存器中。實(shí)現(xiàn)原生執(zhí)行手動(dòng)編寫的匯編后端簡(jiǎn)單的提前AOT翻譯器逐指令翻譯 RISC - V 指令生成匯編代碼代價(jià)是可移植性差。寄存器映射翻譯器可將頻繁使用的來賓寄存器映射到宿主機(jī)寄存器減少內(nèi)存和寄存器間的移動(dòng)。讓 Clang 作為后端一個(gè)巨型函數(shù)可將整個(gè)程序作為一個(gè)函數(shù)轉(zhuǎn)換為 C 代碼讓編譯器優(yōu)化。但程序規(guī)模大時(shí)此方法失效。逐基本塊重新編譯基本塊是順序指令序列重新編譯器將每個(gè)基本塊作為單獨(dú) C 函數(shù)生成讓 Clang 優(yōu)化。識(shí)別基本塊重新編譯器通過識(shí)別基本塊和連接成控制流圖確定生成函數(shù)的起始和結(jié)束位置。示例展示了如何應(yīng)用規(guī)則處理對(duì)數(shù)組求和的函數(shù)。