RISC-V 是一種模塊化指令集架構(gòu) (ISA),具有強(qiáng)大的定制能力,在實(shí)現(xiàn)創(chuàng)新和差異化的同時(shí)而不會(huì)出現(xiàn)碎片化現(xiàn)象。在已批準(zhǔn)/標(biāo)準(zhǔn)的 ISA 擴(kuò)展(如整數(shù)指令或浮點(diǎn)指令)的基礎(chǔ)模塊之上,設(shè)計(jì)人員可以通過添加自定義指令而實(shí)現(xiàn)純粹的設(shè)計(jì)自由!
通過添加自定義指令而實(shí)現(xiàn)更好的性能,更小的內(nèi)存占用或者更低的功率,意味著軟件(最終應(yīng)用程序)要針對(duì)特定的 RISC-V ISA 進(jìn)行編譯。軟件開發(fā)工具包(SDK)必須清楚地了解 RISC-V 處理器實(shí)現(xiàn)了哪些 ISA 模塊,這樣才能自動(dòng)利用這些模塊。這些指令包括標(biāo)準(zhǔn)指令和定制指令。
但是如何為特定的 RISC-V ISA 獲取最佳的 SDK 呢?這里不得不提到 SDK 的重要組成部分--C/C++ 編譯器。編譯器必須盡可能能夠自動(dòng)、明智地使用這些自定義指令。
什么是 LLVM C/C++ 編譯器?
LLVM(低級(jí)虛擬機(jī))是一套編譯器和工具,如匯編器、鏈接器或調(diào)試器。我們可以把重點(diǎn)放在編譯器上。
與其他編譯器一樣,LLVM 編譯器可分為三個(gè)部分:前端、優(yōu)化器(也稱中端)和后端,如下圖所示。每一層都有不同的用途。
LLVM 編譯器前端
前端將 C 或 C++ 源代碼作為文本文件輸入。前端會(huì)對(duì)其進(jìn)行解析,并創(chuàng)建一個(gè)中間表達(dá)(IR)。IR 以機(jī)器格式表示輸入內(nèi)容。
LLVM 編譯器優(yōu)化器
優(yōu)化器接收 IR,主要針對(duì)獨(dú)立的優(yōu)化(如循環(huán)展開或常量/變量傳播),并生成經(jīng)過優(yōu)化的 IR。
LLVM 編譯器后端
后端接收優(yōu)化后的 IR,并執(zhí)行與目標(biāo)相關(guān)的優(yōu)化、寄存器分配、堆棧操作等。最后生成處理器的匯編代碼。
對(duì)于可重定位目標(biāo)性而言,后端是最重要的部分,因?yàn)樗仨毩私饽繕?biāo)架構(gòu)、指令等信息。而 Codasip 的解決方案生成的正是編譯器后端。
重定向 LLVM C/C++ 編譯器
對(duì)于這個(gè)問題,Codasip 的做法如下:
以CodAL作為處理器描述的單一來(lái)源
RISC-V ISA(包括自定義指令)是通過 CodAL 語(yǔ)言(一種基于 C 語(yǔ)言的處理器高級(jí)描述語(yǔ)言)捕獲的。該語(yǔ)言捕獲了所有重要信息,包括指令的文本形式、二進(jìn)制編碼以及更重要的指令行為。CodAL 描述還包含以下信息:不同類型的危險(xiǎn)是如何遞交的(它會(huì)影響指令調(diào)度)、指令是如何執(zhí)行的(單周期、多周期)、處理器的應(yīng)用二進(jìn)制接口(例如,哪些寄存器用于堆棧)或其他微體系結(jié)構(gòu)描述等。此外它還包含其它 C/C++ 編譯器功能(例如窺孔優(yōu)化-peephole optimizations)的說明。
下面的示例顯示了一條表示兩個(gè)數(shù)字平均值的簡(jiǎn)單指令。
根據(jù)這一描述可以生成一系列工具。從下圖中可以看到,生成的輸出之一是 LLVM C/C++ 編譯器。
C/C++ 編譯器生成器會(huì)解析所有已描述的指令和微架構(gòu)描述。然后提取指令語(yǔ)義、ABI 或時(shí)序,為前端和優(yōu)化器生成新的后端和配置文件。換句話說,前端和優(yōu)化器經(jīng)過預(yù)編譯和配置,可以快速探索設(shè)計(jì)空間。而后端則需要編譯。生成的后端可以接收到 RISC-V 處理器的每一條指令,且上述指令可以由生成的 C/C++ 編譯器自動(dòng)使用,也可以通過自動(dòng)生成的內(nèi)建函數(shù)或內(nèi)聯(lián)匯編使用。
最獨(dú)特的是,生成的后端向設(shè)計(jì)人員開放。如果設(shè)計(jì)人員想要添加新的 LLVM optimization pass,假設(shè)已經(jīng)用 C++ 編寫了一個(gè)optimization pass,那么就可以隨時(shí)添加新的pass。
Codasip同時(shí)還改進(jìn)了 vanilla LLVM。通過添加針對(duì)性能提升(例如改進(jìn)的跳轉(zhuǎn)線程、超級(jí)塊調(diào)度或循環(huán)折疊/扁平化)、代碼縮減(例如改進(jìn)的-msave-restore、改進(jìn)的多輸出指令支持或機(jī)器大綱器)或 DSP 功能(例如零開銷循環(huán)、雙堆棧架構(gòu)支持或帶后增量/前增量的加載/存儲(chǔ))的高級(jí)optimization pass。
此時(shí)我們了解一下生成的 C/C++ 編譯器在基準(zhǔn)測(cè)試中的表現(xiàn)如何,并重點(diǎn)關(guān)注編譯器的兩個(gè)方面:性能和代碼量。
Coremark 和 Dhrystone 用于測(cè)量性能,Embench-iot 用于測(cè)量代碼大小。我們比較了三種編譯器: GCC、Vanilla LLVM 和 Codasip LLVM。比較是相對(duì)于其他編譯器進(jìn)行的,Vanilla LLVM 是參考編譯器(即在圖表中得分 1)。RISC-V ISA 配置為 RV32IMCB。
測(cè)試性能結(jié)果
性能比較顯示了 Codasip LLVM 的改進(jìn),以及它如何優(yōu)于其他編譯器。請(qǐng)注意,所有編譯器都使用了類似的優(yōu)化標(biāo)志。自定義指令可以明顯改善結(jié)果。
代碼大小結(jié)果
代碼大小比較也顯示了 Codasip LLVM 的優(yōu)勢(shì),盡管差距并不大。在此,自定義指令也能明顯改善結(jié)果。對(duì)于如何縮減RISC-V的代碼大小,大家可通過IP&SoC雜志7/8月版的電子書查閱Codasip的迷你技術(shù)白皮書,鏈接如下:https://ipsoc.yunzhan365.com/books/stka/mobile/index.html
創(chuàng)新自動(dòng)化助理 RISC-V的飛速發(fā)展
RISC-V ISA 仍在不斷發(fā)展,行業(yè)急需一些方法來(lái)輕松探索不同指令及其對(duì)軟件的影響(包括性能、代碼大小或功耗等方面)。自動(dòng)化是非??扇〉?,因?yàn)樽詣?dòng)化流程可以快速高效地探索設(shè)計(jì)空間?;蛘哒f,如果設(shè)計(jì)人員想要?jiǎng)?chuàng)新或與眾不同,那么他們就需要能夠?qū)崿F(xiàn)創(chuàng)新或與眾不同的工具和語(yǔ)言,協(xié)助其達(dá)到目的。
而Codasip Studio 正是實(shí)現(xiàn)這一目標(biāo)的有效方法。Codasip的處理器設(shè)計(jì)自動(dòng)化工具集能從單一的真實(shí)源自動(dòng)生成所有需要的部件。生成的 LLVM C/C++ 編譯器可以自動(dòng)使用新指令(也就是說,除非您愿意,否則無(wú)需更改 C/C++ 代碼)。此外它在性能和代碼大小方面的表現(xiàn)也非常出色。Codasip Studio 可以自動(dòng)生成可執(zhí)行模型、RTL 或驗(yàn)證工具,以完善 IP 工具包,并在最終產(chǎn)品中部署創(chuàng)新的 RISC-V 架構(gòu)。
審核編輯:彭菁
-
C++
+關(guān)注
關(guān)注
22文章
2114瀏覽量
73873 -
編譯器
+關(guān)注
關(guān)注
1文章
1642瀏覽量
49306 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
306瀏覽量
23842 -
SDK
+關(guān)注
關(guān)注
3文章
1045瀏覽量
46300 -
RISC-V
+關(guān)注
關(guān)注
45文章
2325瀏覽量
46653
原文標(biāo)題:編譯器重度愛好者有話說 - 針對(duì) RISC-V 的可重定向 LLVM C/C++ 編譯器
文章出處:【微信號(hào):Codasip 科達(dá)希普,微信公眾號(hào):Codasip 科達(dá)希普】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
C++編譯器數(shù)值性能比較
主流的C語(yǔ)言編譯器詳細(xì)介紹
![主流的<b class='flag-5'>C</b>語(yǔ)言<b class='flag-5'>編譯器</b>詳細(xì)介紹](https://file.elecfans.com/web1/M00/A5/B8/pIYBAF1wb9yANVSmAAC30q2CvdA877.png)
主流C語(yǔ)言編譯器的詳細(xì)資料介紹
![主流<b class='flag-5'>C</b>語(yǔ)言<b class='flag-5'>編譯器</b>的詳細(xì)資料介紹](https://file.elecfans.com/web1/M00/93/23/pIYBAFzlC4SARgd8AAD86P-d8Nw958.png)
MATLAB 64位C語(yǔ)言和C++編譯器應(yīng)用程序免費(fèi)下載
![MATLAB 64位<b class='flag-5'>C</b>語(yǔ)言和<b class='flag-5'>C++</b><b class='flag-5'>編譯器</b>應(yīng)用程序免費(fèi)下載](https://file.elecfans.com/web1/M00/93/0B/pIYBAFzjnMWAQzvQAABpSNUEi1g530.png)
基于C++編譯器的節(jié)點(diǎn)融合優(yōu)化方法
阿里云基礎(chǔ)軟件C/C++編譯器的工作現(xiàn)狀及挑戰(zhàn)
![阿里云基礎(chǔ)軟件<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>編譯器</b>的工作現(xiàn)狀及挑戰(zhàn)](https://file.elecfans.com/web2/M00/02/C6/poYBAGDS4lmAM7lLAAIHZigsBdc462.png)
C/C++編譯器的缺省字節(jié)對(duì)齊方式
C7000優(yōu)化C/C++編譯器
![<b class='flag-5'>C</b>7000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>編譯器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
TMS320C6000優(yōu)化C/C++編譯器v8.3.x
![TMS320<b class='flag-5'>C</b>6000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>編譯器</b>v8.3.x](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
ARM優(yōu)化C/C++編譯器 v20.2.0.LTS
![ARM優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>編譯器</b> v20.2.0.LTS](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
MSP430優(yōu)化C/C++編譯器v21.6.0.LTS
![MSP430優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>編譯器</b>v21.6.0.LTS](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
HighTec C/C++編譯器套件全面支持芯來(lái)RISC-V IP
![HighTec <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>編譯器</b>套件全面支持芯來(lái)RISC-V IP](https://file1.elecfans.com/web3/M00/03/5F/wKgZPGdot_6AdiTyAAAuxvV0qeo970.png)
評(píng)論