RISC-V壓縮指令擴展測試

概述

RISC-V定義了壓縮指令擴展(compressed instruction-set extension ),命名為“C”擴展。壓縮指令使用16位寬指令替換32位寬指令,從而減少代碼量。這個C擴展可運用在RV32、RV64和RV128指令集上,通常使用“RVC”來表示支持該擴展指令集。一個程序通常有50%的指令可以使用RVC指令替代,可以減少25%~30%的代碼量。

RISC-V還定義了另外一組壓縮指令擴展“Zc*”,擴展現有的C擴展,并新增了一些16位擴展,包括Zca、Zcd、Zcf和Zcb、Zcmp、Zcmt。

RISC-V定義了B擴展(bit-manipulation extension),用于位操作,包括Zba、Zbb和Zbs。B擴展可以減少代碼量,提升性能和降低功耗。

CSiBE

CSiBE是用于代碼大小測試的benchmark。

環境準備

下載CSiBE,如下:

$ git clone https://github.com/szeged/csibe.git

工具鏈下載芯來的Nuclei RISC-V Toolchain,這里下載2024.02版本,下載完成解壓即可。

編譯

CSiBE是采用cmake的方式進行構建的,cmake文件在toolchain-files目錄,我們參考已有的模板編寫,命名為gcc-risc-v.cmake,內容如下:

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR RISCV32)set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)set(CMAKE_C_COMPILER /toolchain/gcc/bin/riscv64-unknown-elf-gcc)
set(CMAKE_CXX_COMPILER /toolchain/gcc/bin/riscv64-unknown-elf-g++)# 1. 無c和b擴展
set(RISCV_FLAGS "-Os -march=rv32imaf -mabi=ilp32f -D__GLIBC_HAVE_LONG_LONG")
# 2. 基礎c擴展
# set(RISCV_FLAGS "-Os -march=rv32imafc -mabi=ilp32f -D__GLIBC_HAVE_LONG_LONG")
# 3. zc和b擴展
# set(RISCV_FLAGS "-Os -march=rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs -mabi=ilp32f -D__GLIBC_HAVE_LONG_LONG")
# 4. zc、b和芯來Xxlcz擴展
# set(RISCV_FLAGS "-Os -march=rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs_xxlcz -mabi=ilp32f -D__GLIBC_HAVE_LONG_LONG")
set(CMAKE_C_FLAGS "${RISCV_FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "${RISCV_FLAGS}" CACHE STRING "" FORCE)
  • CMAKE_C_COMPILER和CMAKE_C_COMPILER:配置risc-v的c和c++編譯器
  • RISCV_FLAGS:指定-march參數,這里測試c和b擴展、基礎c擴展以及zc和b擴展三種情況

在頂級目錄新建一個build目錄,編譯如下:

$ ./csibe.py --build-dir=build/ --toolchain gcc-risc-v CSiBE-v2.1.1
  • build-dir:指定編譯目錄
  • toolchain:制定工具鏈文件,即上面的gcc-risc-v.cmake

編譯的結果在build目錄下。

CSiBE

結果分析

CSiBE的測試結果列出所有的程序文件編譯大小,這里我們采用所有文件的平均值進行對比。

選項擴展代碼量均值對比
rv32imaf無壓縮擴展4370100%
rv32imafc基礎c擴展357182%
rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbszc新擴展+b擴展335876.9%
rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs_xxlczzc新擴展+b擴展+芯來Xxlcz擴展334976.6%

可以看出,采用基礎c擴展代碼量量縮減18%,而采用zc新擴展和b擴展縮減23%。

Embench-IoT

Embench-IoT是嵌入式的性能測試工具,嵌入式系統的特點是:沒有OS,最小C庫支持,沒有輸出流。Embench-IoT運行結束后會打印19個測試程序的尺寸大小,類似如下:

Benchmark            size
---------            ----
aha-mont64          1,388
crc32                 588
cubic              35,018
edn                 1,870
huffbench           5,958
matmult-int         1,040
md5sum              5,168
minver              4,332
nbody               8,868
nettle-aes          2,874
nettle-sha256       4,358
nsichneu           16,292
picojpeg            7,774
primecount            624
qrduino            10,044
sglib-combined      6,784
slre                2,646
st                  8,930
statemate           3,958
tarfind             4,752
ud                  3,336
wikisort           12,576
---------           -----
Geometric mean      4,292
Geometric SD            2.72
Geometric range  10,072.17910752827
All benchmarks sized successfully

環境準備

下載Embench-IoT,如下:

$ git clone https://github.com/embench/embench-iot.git

工具鏈下載芯來的Nuclei RISC-V Toolchain,這里下載2024.02版本,下載完成解壓即可。

另外需要安裝python3.6或以后版本,還需要python包pyelftools:

$ pip3 install pyelftools

編譯

Embench-IoT使用build_all.py腳本編譯,編譯完成后使用benchmark_size.py腳本查看代碼大小,還可以使用benchmark_speed.py腳本測試速度性能。

無壓縮

$ ./build_all.py --clean --arch riscv32 --chip generic --board ri5cyverilator --cc /toolchains/gcc/bin/riscv64-unknown-elf-gcc '--cflags=-c -Os -march=rv32imaf -mabi=ilp32f -ffunction-sections' '--ldflags=-march=rv32imafc -mabi=ilp32f -specs=nosys.specs -specs=nano.specs -Wl,-gc-sections' --user-libs=-lm --dummy-libs=
$ ./benchmark_size.py --absolute
Geometric mean      5,595
Geometric SD            2.60
Geometric range  12,379.939559115413
All benchmarks sized successfully

基礎C擴展

$ ./build_all.py --clean --arch riscv32 --chip generic --board ri5cyverilator --cc /toolchains/gcc/bin/riscv64-unknown-elf-gcc '--cflags=-c -Os -march=rv32imafc -mabi=ilp32f -ffunction-sections' '--ldflags=-march=rv32imafc -mabi=ilp32f -specs=nosys.specs -specs=nano.specs -Wl,-gc-sections' --user-libs=-lm --dummy-libs=
$ ./benchmark_size.py --absolute
Geometric mean      4,795
Geometric SD            2.70
Geometric range  11,148.051624219981
All benchmarks sized successfully

Zc和B擴展

$ ./build_all.py --clean --arch riscv32 --chip generic --board ri5cyverilator --cc /toolchains/gcc/bin/riscv64-unknown-elf-gcc '--cflags=-c -Os -march=rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs -mabi=ilp32f -ffunction-sections' '--ldflags=-march=rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs -mabi=ilp32f -mabi=ilp32f -specs=nosys.specs -specs=nano.specs -Wl,-gc-sections' --user-libs=-lm --dummy-libs=
$ ./benchmark_size.py --absolute
Geometric mean      4,301
Geometric SD            2.72
Geometric range  10,099.132824302542
All benchmarks sized successfully

Zc、B和Xxlcz擴展

$ ./build_all.py --clean --arch riscv32 --chip generic --board ri5cyverilator --cc /toolchains/gcc/bin/riscv64-unknown-elf-gcc '--cflags=-c -Os -march=rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs_xxlcz -mabi=ilp32f -ffunction-sections' '--ldflags=-march=rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs_xxlcz -mabi=ilp32f -mabi=ilp32f -specs=nosys.specs -specs=nano.specs -Wl,-gc-sections' --user-libs=-lm --dummy-libs=
$ ./benchmark_size.py --absolute
Geometric mean      4,290
Geometric SD            2.72
Geometric range  10,069.520004018736
All benchmarks sized successfully

結果分析

Embench-IoT的測試結果會打印輸出代碼量的幾何平均值、方差等,這里我們采用幾何平均值進行對比。

選項擴展代碼量均值對比
rv32imaf無壓縮擴展5595100%
rv32imafc基礎c擴展479586%
rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbszc新擴展+b擴展430176.9%
rv32imaf_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs_xxlczzc新擴展+b擴展+芯來自研的代碼縮減Xxlcz擴展429076.7%

可以看出,采用基礎c擴展代碼量量縮減14%,而采用zc新擴展和b擴展縮減33%。

參考

  1. RISC-V C擴展和Zce擴展Code Size實測
  2. Embench的介紹和在RISCV32模擬器上的運行
  3. nuclei sdk documentation

歡迎關注“安全有理”微信公眾號。

安全有理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14248.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Double 4 VR情景實訓教學系統在商務洽談課堂上的應用

隨著科技的不斷發展,VR(虛擬現實)技術已經逐漸滲透到各個領域。在商務洽談課堂上,Double 4 VR情景實訓教學系統不僅可以為學生提供身臨其境的模擬環境,還可以通過互動和交互式學習方式,增強學生的學習體驗和…

貝銳向日葵打造農機設備遠程運維支持方案

當物聯網“萬物互聯”的概念向第一產業賦能,農機設備的智能化程度也越來越高。 所謂農業物聯網,即在應用層將大量的傳感器節點構成監控網絡,通過各種傳感器采集信息,以幫助農民及時發現問題,并準確地判定發生問題的位…

QT 使用QZipReader 進行文件解壓縮

目錄 1、QZipReader 概述 2、解壓示例 3、說明 1、QZipReader 概述 QZipReader 是一個方便的工具,用于在 Qt 應用程序中解壓 ZIP 壓縮包。它提供了讀取 ZIP 文件的接口,并能提取其中的內容。以下是如何使用 QZipReader 解壓 ZIP 文件的示例代碼&#…

List、IList、ArrayList 和 Dictionary

List 類型: 泛型類命名空間: System.Collections.Generic作用: List<T> 表示一個強類型的對象列表&#xff0c;可以通過索引訪問。提供了搜索、排序和操作列表的方法。特點: 類型安全&#xff0c;性能較好&#xff0c;適用于需要強類型和高效操作的場景。例子: List<…

每日一練 - BGP Keepalive 報文詳解

01 真題題目 關于 BGP 的 Keepalive 報文消息的描述,錯誤的是&#xff1a; A.Keepalive 周期性的在兩個 BGP 鄰居之間發送 B.缺省情況下,Keepalive 的時間間隔是 180s C.Keepalive 報文主要用于對等路由器間的運行狀態和鏈路的可用性確認 D.Keepalive 報文的組成只包含一個…

Web安全:SQL注入之時間盲注原理+步驟+實戰操作

「作者簡介」&#xff1a;2022年北京冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎對安全知識體系進行總結與歸納&#xff0c;著作適用于快速入門的 《網絡安全自學教程》&#xff0c;內容涵蓋系統安全、信息收集等…

ICML2024高分論文!大模型計算效率暴漲至200%,來自中國AI公司

前段時間&#xff0c;KAN突然爆火&#xff0c;成為可以替代MLP的一種全新神經網絡架構&#xff0c;200個參數頂30萬參數&#xff1b;而且&#xff0c;GPT-4o的生成速度也是驚艷了一眾大模型愛好者。 大家開始意識到—— 大模型的計算效率很重要&#xff0c;提升大模型的token…

前端加載excel文件數據 XLSX插件的使用

npm i xlsx import axios from axios; axios //這里用自己封裝的http是不行的&#xff0c;踩過坑.get(url,{ responseType: "arraybuffer" }).then((re) > {console.log(re)let res re.datavar XLSX require("xlsx");let wb XLSX.read(r…

黑龍江大學文學院古代文學教研室安家琪副教授

女&#xff0c;生于1990年。蘭州大學文學學士、碩士&#xff0c;上海交通大學文學博士&#xff0c;曾赴臺灣東華大學交流&#xff0c;研究方向為明清詩文與唐代文學。 在《文藝理論研究》、《蘇州大學學報》、《唐史論叢》、《中國社會科學報》等期刊發表論文20余篇&#xff0…

2024年 電工杯 (A題)大學生數學建模挑戰賽 | 園區微電網風光儲協調優化配置 | 數學建模完整代碼解析

DeepVisionary 每日深度學習前沿科技推送&頂會論文&數學建模與科技信息前沿資訊分享&#xff0c;與你一起了解前沿科技知識&#xff01; 本次DeepVisionary帶來的是電工杯的詳細解讀&#xff1a; 完整內容可以在文章末尾全文免費領取&閱讀&#xff01; 問題重述…

干就對了!

成年人的世界哪有那么容易&#xff0c;不過都在負重前行&#xff0c;誰不是一邊抱怨著&#xff0c;一邊咬牙堅持&#xff0c;一邊崩潰&#xff0c;一邊還要自我安慰。 想改變&#xff0c;想更好&#xff0c;我們都有很多想法。 想再多不如動手做一次。一旦開始做了&#xff0…

前端手寫文件上傳;使用input實現文件拖動上傳

使用input實現文件拖動上傳 vue2代碼&#xff1a; <template><div><div class"drop-area" dragenter"highlight" dragover"highlight" dragleave"unhighlight" drop"handleDrop"click"handleClick&quo…

聽說京東618裁員沒?上午還在趕需求,下午就開會通知被裁了~

文末還有最新面經共享群&#xff0c;沒準能讓你刷到意向公司的面試真題呢。 京東也要向市場輸送人才了? 在群里看到不少群友轉發京東裁員相關的內容&#xff1a; 我特地去網上搜索了相關資料&#xff0c;看看網友的分享&#xff1a; 想不到馬上就618了&#xff0c;東哥竟然搶…

Python 機器學習 基礎 之 模型評估與改進 【模型評估與改進 / 交叉驗證】的簡單說明

Python 機器學習 基礎 之 模型評估與改進 【模型評估與改進 / 交叉驗證】的簡單說明 目錄 Python 機器學習 基礎 之 模型評估與改進 【模型評估與改進 / 交叉驗證】的簡單說明 一、簡單介紹 二、模型評估與改進 三、交叉驗證 1、scikit-learn 中的交叉驗證 2、交叉驗證的…

stm32工程綜合實驗_延時及中斷優先級

待下載綜合實驗 ![在這里插入圖片描述](https://img-blog.csdnimg.cn/161fa4e200bb4022bf384e80a3af8797.jpg 很好的編程思想模式及資料(富萊xx電子)

【repo系列】repo常用命令的使用

前言 repo是一種代碼版本管理工具&#xff0c;它是由一系列的Python腳本組成&#xff0c;封裝了一系列的Git命令&#xff0c;用來統一管理多個Git倉庫。 本文章描述repo常用命令的使用。 常用命令 初始化 repo init 初始化代碼倉 repo init [options]常用options: -u URL…

JDBC——API詳解

一、DriverManager 1、用于注冊驅動程序&#xff1a;registerDriver(Driver driver)。 更常用的是Class.forName("com.mysql.jdbc.Driver")是由于Driver中包含了registerDriver(Driver driver)&#xff0c;值得注意的是&#xff0c;是mysql5之后的版本中&#xff0…

1.每日設計模式-理論

目錄 一、什么是設計模式 二、設計原則 三、設計模式的種類 代碼地址&#xff1a;patterns: 每日設計模式 一、什么是設計模式 軟件設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結&#xff0c;使用設計模式是為了可重用代碼…

AI大模型的口語練習APP

開發一個使用第三方大模型的口語練習APP涉及多個步驟&#xff0c;從需求分析到部署上線。以下是詳細的開發流程和關鍵步驟&#xff0c;通過系統化的流程和合適的技術選型&#xff0c;可以有效地開發出一個功能豐富、用戶體驗良好的口語練習APP。北京木奇移動技術有限公司&#…

網絡初識 二

一、TCP/IP五層協議 -> 應用層 : 傳輸的數據在應用程序中如何使用 -> 傳輸層 : 關注的是通信的起點終點 -> 網絡層 : 關注的是通信中的路線規劃 -> 數據鏈路層 : 關注的是相鄰節點之間的通信細節 -> 物理層 : 網絡通信的基礎設施 說是五層,實際上下面…