RISC-V压缩指令扩展测试

news2024/11/25 7:13:55

概述

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.coloradmin.cn/o/1689419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

继承初级入门复习

注意:保护和私有在类中没有区别,但是在继承中有区别,private在继承的子类不可见,protect在继承的子类可见 记忆方法:先看基类的修饰符是private,那都是不可见的。如果不是,那就用继承的修饰和基…

变量命名的艺术:让你的代码更具可读性

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:为何变量命名如此重要? 二、变量命名的基本规则 1. 避免数…

NL6621 实现获取天气情况

一、主要完成的工作 1、建立TASK INT32 main(VOID) {/* system Init */SystemInit();OSTaskCreate(TestAppMain, NULL, &sAppStartTaskStack[NST_APP_START_TASK_STK_SIZE -1], NST_APP_TASK_START_PRIO); OSStart();return 1; } 2、application test task VOID TestAp…

弱监督语义分割-对CAM的生成过程进行改进3

三、擦除图像高响应部分以获取更多的分割领域 ECS-Net: Improving Weakly Supervised Semantic Segmentation by Using Connections Between Class Activation Maps(ICCV,2021) 1.引言 我们首先从图像中擦除高响应区域,并生成这些擦除图像…

数据防泄露解决方案分享

在当今高度数字化和互联的商业环境中,数据防泄密已成为企业保护财产、维护客户隐私和遵守合规要求的重要一环。数据防泄密不仅关乎企业的经济利益,更涉及用户个人信息安全、商业机密保护以及国家安全等核心问题。能做好数据防泄露,对于提升企…

【简单介绍下爬山算法】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

AIGC:AI整活!万物皆可建筑设计

在过去的一年里 AI设计爆火 各行业纷纷将之用于工作中 同时不少网友也在借助它整活 万物皆可设计 甲方骂我方案像屎一样 于是我就回馈他屎一样的方案 他有点惊喜,但是没话 不是吧,随便找了个充电头图片 也能生成建筑设计!这都能行 鸟…

【EasyX】快速入门——消息处理,音频

1.消息处理 我们先看看什么是消息 1.1.获取消息 想要获取消息,就必须学会getmessage函数 1.1.1.getmessage函数 有两个重载版本,它们的作用是一样的 参数filter可以筛选我们需要的消息类型 我们看看参数filter的取值 当然我们可以使用位运算组合这些值 例如,我们…

React-router 最佳实践

使用的是 BrowserRouter,Routes 和 Route,这是 react-router-dom v5 和 v6 都支持的 API。这种方式的优点是路由配置和应用的其它部分是紧密集成的,这使得路由配置更加直观和易于理解 // router/index.js import { BrowserRouter as Router,…

使用 Docker 部署 Jenkins 并设置初始管理员密码

使用 Docker 部署 Jenkins 并设置初始管理员密码 每一次开始,我都特别的认真与胆怯,是因为我期待结局,也能够不会那么粗糙,不会让我失望,所以,就多了些思考,多了些拘束,所以&#xf…

基于YOLO系列算法(YOLOv5、YOLOv6、YOLOv8以及YOLOv9)和Streamlit框架的行人头盔检测系统

摘要 本文基于最新的基于深度学习的目标检测算法 (YOLOv5、YOLOv6、YOLOv8)以及YOLOv9) 对头盔数据集进行训练与验证,得到了最好的模型权重文件。使用Streamlit框架来搭建交互式Web应用界面,可以在网页端实现模型对图像、视频和实时摄像头的目标检测功能…

Error:(6, 43) java: 程序包org.springframework.data.redis.core不存在

目录 一、在做SpringBoot整合Redis的项目时,报错: 二、尝试 三、解决办法 一、在做SpringBoot整合Redis的项目时,报错: 二、尝试 给依赖加版本号,并且把版本换了个遍,也不行,也去update过ma…

基于springboot+vue的在线考试系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

web自动化之PO模式

PO模式 1、为什么需要PO思想? 首先我们观察和思考一下,目前我们写的作业脚本的问题: 元素定位和操作动 作写到一起了,这就就会用导致一个问题: UI的页面元素比较容易变化的,所以元素定位和脚本操作写到一…

【Sync FIFO介绍及基于Verilog的实现】

Sync FIFO介绍及实现 1 Intro2 Achieve2.1 DFD2.2 Intf2.3 Module 本篇博客介绍无论是编码过程中经常用到的逻辑–FIFO;该FIFO是基于单时钟下的同步FIFO; FiFO分类:同步FiFO VS 异步FiFO; 1 Intro FIFO可以自己实现,但…

如何安全地进行隔离网数据导出,提升文件流转效率?

隔离网(也称为隔离区或DMZ,即Demilitarized Zone)是一种网络安全措施,用于将内部网络与外部网络(如互联网)隔离开来,以减少安全风险。隔离网数据导出通常需要采取一些特殊的安全措施来确保数据的…

pod介绍之 容器分类与重启策略

目录 一 pod 基础概念介绍 1,pod 是什么 2,Pod使用方式 3,如何解决一个pod 多容器通信 4,pod 组成 5, k8s 中的 pod 二 pause容器 1,pause容器 是什么 2,pause容器作用 3&#xff…

【嵌入式Linux】Cmake、makefile、Cmakelist

记录嵌入式 linux环境下的编译方式 测试之前确保你的 Ubuntu 机器上安装了Gcc和cmake 1. 编译有以下几种方式 在 Linux系统下,编译一个 .c文件可以有以下几种方式: 直接用 Gcc 编译器编译为可执行文件编写Makefile文件,使用 make 指令&…

[LEECODE每日一题]找出最具竞争力的子序列

好久没有更新CSDN了,这段时间学业压力比较忙所以没有时间写,今天有时间来看看LEECODE的每日一题,碰巧刷到了这样一道题; 题目给的很清楚,既输入一个序列要求给定一个子序列长度,让其输出为一个最有"竞争力"的序列,说白了就是在所有子序列比较中,处于靠前位置的元素要…

Kafka之【生产消息】

消息(Record) 在kafka中传递的数据我们称之为消息(message)或记录(record),所以Kafka发送数据前,需要将待发送的数据封装为指定的数据模型: 相关属性必须在构建数据模型时指定,其中…