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.mzph.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五层协议 -> 应用层 : 传输的数据在应用程序中如何使用 -> 传输层 : 关注的是通信的起点终点 -> 网络层 : 关注的是通信中的路线规划 -> 数据链路层 : 关注的是相邻节点之间的通信细节 -> 物理层 : 网络通信的基础设施 说是五层,实际上下面…