找回密码
 注册
关于网站域名变更的通知
查看: 180|回复: 2
打印 上一主题 下一主题

RISC-V生态全景解析3——RISC-V代码密度详解

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-5-23 10:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

5 W% n3 ^5 ]: s0 X% _芯片开放社区(OCC)面向开发者推出RISC-V系列内容,通过多角度、全方位解读RISC-V,系统性梳理总结相关理论知识,构建RISC-V知识图谱,促进开发者对RISC-V生态全貌的了解。本期内容将通过阐述代码密度的决定因素,带大家了解RISC-V架构代码密度的现状,并简单介绍平头哥对RISC-V代码密度的优化成果。! W5 j* U. i7 Q0 {' s6 u

7 l% c/ f/ q) u2 H6 m) z对于内存受限的嵌入式芯片(包括mcu和成本要求的AP类芯片)来说,代码密度非常重要。同样功能的程序,如果代码密度过大,就可能导致因ROM空间装载不下而无法使用。所以,在嵌入式领域中,代码密度是最重要的指标之一。那么,代码密度由什么决定?如何提高代码密度呢?RISC-V的代码密度现状又如何?通过本文,我们将为大家一一解答。8 _( [% \" K- m. x* V

5 b1 N- j0 s  ?/ m, ?1、代码密度的决定因素6 z# F2 n' u* f0 m0 l
9 {3 U5 X. M4 P  o
如上面的倒金字塔所示,代码密度主要由指令集、ABI、编译器、Runtime库、程序代码五个部分决定。处在金字塔的越底端,说明该因素越底层,更新的频率越小,但辐射和影响的范围却越广。
5 t6 \) v: V4 Z- Y' Z- y% R/ [+ p  V  L% d$ u
2、指令集
# r3 [4 P- ~& P% b指令集是代码密度最根本的决定性因素,它决定了一个操作在最优的情况下需要编译成多少位宽的编码。1 Z; Y2 ]! X9 t& ^7 s
很多体系结构比如ARM、RISC-V、C-SKY都是16位指令、32位指令混编的,同样的一条指令,如果能够被编译成16位指令,那么它显然比编译成32位指令占用更小的空间;再比如,一个乘累加的操作,如果指令集中存在乘累加指令,那么它只需要一条指令来实现乘累加操作,如果没有则需要至少两条指令来完成相同的操作,假设指令都是32位的,显然一条指令将占用更少的空间。4 h& H+ c4 @( [* \$ a. T
由于指令集的编码空间是有限的,所以指令集设计的核心是将哪些指令(包括指令操作数的范围)放到编码空间当中,就像一个商场的店面是有限的,当我们把需求最广的商家引进来时,商场的销量就会达到最高。
" [+ }6 _% L& X# ~& s2 F
# k& W  ]% ]! Q- j3、ABI
! v+ L& u' Z5 S; C3 X5 E; i; cABI的全称是APPlication Binary InteRFace,是二进制级别的协议,它指导着编译器如何生成代码和二进制程序,同样也指导着用户如何写汇编代码。它主要包含函数调用约定(calling convention)、数据的对齐方式等内容。& r" J4 @3 b9 O9 t
其中对代码密度影响最大的就是函数调用约定,它规定了堆栈寄存器、链接寄存器、哪些寄存器需要在函数头尾保存和恢复、哪些寄存器可以作为参数寄存器等,还有一些特殊用途的寄存器。大部分特殊寄存器都是会被高频使用的,配合指令集设计可以降低代码密度;需要保存和恢复的寄存器个数同样也会影响代码密度。
9 Y* h' i6 @. W( P0 J0 A' ?( n1 J+ e  S' Q! e! h
4、编译器
" q( ^: Z# ]9 j& }7 Z# M编译器是开发者最直接接触的工具,也是给开发者体感最强的代码密度影响因素。它对代码密度的影响主要体现在两方面:5 R+ \/ N1 v+ h5 E4 A# B$ G
① 编译器本身的优化能力,优化能力的强弱是影响编译器产品竞争力的最主要的因素。
: Z% @5 {; l' `' k0 r② 编译器的使用方法,比如GCC,除了添加-Os之外,还可以添加-ffunction-sections -fdata-sections -Wl,--gc-sections来删除没有用到的函数。
- H6 ^$ Q" b5 y+ u1 R8 r: [6 H2 U( ]  N5 y0 u* B+ O! u/ r: r
5、Runtime库
4 @. k" W6 ^( b& D" iRuntime库是指程序运行所需的一些基本的函数库,它们一般都是预先编译好,和编译器一起打包发布,是工具链的一部分。由于这些函数的使用频率较高,一般程序都会用到一部分Runtime库的函数,对这些函数做针对性地优化会有比较好的收益。
' f. D5 M" A! T* {4 m9 o( i
7 J0 j1 @0 f1 n  v3 e9 P6 N6、程序代码
1 {3 w# y8 X- T1 J# p) K( [# @2 M开发者书写的代码质量也会影响程序的代码密度,虽然编译器能够优化一部分冗余代码,但是并不能保证百分之百的优化,所以开发者也要注意代码的质量。
6 e4 F+ t# k8 w9 F: T7 u+ e
4 E5 P4 A2 L$ w: Y' A% R' I7、RISC-V架构的代码密度现状/ N) \$ o6 d2 ~' ?8 C
RISC-V的代码密度表现一直被人诟病,那么,它的现状真的这么不值一提吗?
% h- p7 o# X$ Z! U首先,RISC-V对代码密度做过一些专门的优化:
/ B! G( G; j4 |0 ~1 z  f% N! N在指令集方面,它通过量化分析的方法测试了SPEC等benchmark,找到高频指令并将它们放到16位指令的编码当中,这就是目前的compress指令集;
1 c+ U* y& E/ \' b1 N# |在ABI方面,rv32e通过限制16个寄存器,使代码可以生产更多的16位指令;
  Y5 V; U# V$ V5 Z在编译器和Runtime中,它支持-msave-restore功能通过库函数调用的方式弥补了由于没有push/pop指令造成的一部分代码密度损失。

该用户从未签到

2#
发表于 2022-5-23 14:12 | 只看该作者
编译器很熟悉。
1 |) I; W3 O. T) q4 m/ Q

点评

不错呀!||ヽ(* ̄▽ ̄*)ノミ|Ю  详情 回复 发表于 2022-5-23 14:49

该用户从未签到

3#
发表于 2022-5-23 14:49 | 只看该作者
messed 发表于 2022-5-23 14:12
  \7 x8 }1 x% N% t; a/ |( m编译器很熟悉。

' P/ z' u7 q" ^% @& P不错呀!||ヽ(* ̄▽ ̄*)ノミ|Ю
% U& a! r1 W% `2 v2 @) ^0 o( Y5 J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-20 16:38 , Processed in 0.125000 second(s), 31 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表