打印

RISC-V代码密度相比Cortex-M差距明显

[复制链接]
5032|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
imdx|  楼主 | 2021-6-22 17:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己的Xboot工程,在ARM的M0/M3/M4/M23/M33平台下面,全部可以在7kB闪存以内实现,几个架构差异不大,7kB闪存普遍剩余一两百个字节。
最近把它移植到RISC-V上,芯片型号GD32VF103CBT6,同样的一套代码,使用gcc编译,-Os面积优化,固件尺寸11520字节。超过11kB了,速度优化代码尺寸超过16kB。
ARM算7kB,两者对比,7*1024/11520*100%=62.2%,也就是说,同样的功能,Cortex-M只需要RISC-V六成多一点的代码就能实现。
当然还有一个变量要考虑,ARM使用AC6编译,RISC-V使用gcc编译,编译器的效率也会有一定差异。
调试方面RISC-V只能用JTAG(GDLink可以支持),相比之下Cortex-M的SWD调试用起来更方便一些。
至此GD32家的M3/M4/M23/M33/RISC-V五种核心全部盘完了。


使用特权

评论回复
沙发
sonicll| | 2021-6-23 08:52 | 只看该作者
本帖最后由 sonicll 于 2021-6-23 09:05 编辑

其实主要还是编译器的问题,你可以试试用GCC编译ARM的工程,代码尺寸也比用ARMCC大很多。或者你可以试试用IAR,GD32VF103是支持IAR的,效果估计会比GCC好点。RISCV调试用不了SWD,这个好像是因为SWD是ARM的专利。

使用特权

评论回复
板凳
imdx|  楼主 | 2021-6-23 09:07 | 只看该作者
sonicll 发表于 2021-6-23 08:52
其实主要还是编译器的问题,你可以试试用GCC编译ARM的工程,代码尺寸也比用ARMCC大很多。或者你可以试试用I ...

编译器会是一个因素,我在文中也提到了。以后有时间了我用GCC编译一下ARM的工程试试。
IAR也提到过它的编译器代码密度比其它工具(GCC)强。
不过本身RISC-V代码密度不如ARM的Thumb-2指令集这也是事实,至于差多少,还需要进一步验证。

使用特权

评论回复
地板
pq113_6| | 2021-6-24 13:16 | 只看该作者
GCC编译没这么差吧,用STM32F103,MDK和GCC编译对比。
MDK:
Program Size: Code=9108 RO-data=1120 RW-data=92 ZI-data=1932  
GCC:
Program Size:
     Ram Size: 0x5000(20KB), used: 3000(14.64844%)
     Rom Size: 0x10000(64KB), used: 9156(13.97095%)

使用特权

评论回复
评论
imdx 2021-6-24 17:21 回复TA
通常ARMCC编译结果会比GCC好一些,这很正常,要不ARMCC怎么卖钱呢。 
5
imdx|  楼主 | 2021-6-24 17:22 | 只看该作者
另外一个RISC-V与Cortex-M代码密度对比实例,这次是一个稍微复杂一点的工程,使用了USBFS,仍然是同一套代码,编译器
AC6 vs GCC,都是面积优化。
Cortex-M型号为GD32E103C8T6,固件尺寸0x3930=14640字节
RISC-V型号为GD32VF103CBT6,固件尺寸0x5B93=23443字节
14640/23443*100%=62.4%,和之前的测试结果一致,ARM只需要RISC-V的六成多一点的代
码。
如果以Cortex-M为基准,那么是23443/14640*100%=160.1%,同样的功能RISC-V要多占用
6成的FLASH空间。选器件的时候RISC-V的FLASH要选大一个规格的。

使用特权

评论回复
6
jcdzxh| | 2021-6-24 17:54 | 只看该作者
RV汇编时钟数也比cortexm差距明显,测试方法是翻IO看逻辑分析

使用特权

评论回复
7
imdx|  楼主 | 2021-6-24 18:17 | 只看该作者
jcdzxh 发表于 2021-6-24 17:54
RV汇编时钟数也比cortexm差距明显,测试方法是翻IO看逻辑分析

是否有定量数据?

使用特权

评论回复
8
pq113_6| | 2021-6-25 08:40 | 只看该作者
imdx 发表于 2021-6-24 17:22
另外一个RISC-V与Cortex-M代码密度对比实例,这次是一个稍微复杂一点的工程,使用了USBFS,仍然是同一套代 ...

是不是RISC-V没有类似ARM的Thumb,所以代码密度比较高

使用特权

评论回复
9
xdqfc| | 2021-6-25 09:31 | 只看该作者
咱感觉测试的方法有待商榷,咱认为应该先编写一个main()空程序,看看编译后的初始代码是多少,,然后再此基础上,编一套相同的程序,看看增加的代码是多少,最后比较两种核的增加的代码量。是比较增加的代码量,因为初始的汇编起动代码肯定是不相同的,大小肯定不一样,比较这个是没有意义的。

使用特权

评论回复
10
xxo21| | 2021-6-25 14:07 | 只看该作者
大概率是库的问题,你把printf sprintf scan之类的函数都注释掉,然后编译release版本试试,

使用特权

评论回复
11
imdx|  楼主 | 2021-6-25 18:42 | 只看该作者
之前对比了RISC-V和Cortex-M的代码密度,结论是同样功能,RISC-V要多用大约6成的FLASH空间,追求面积优化的应用器件选型时需要注意,那么性能如何呢?本文对比了一下。
测试方法使用Dhrystone 2.1源代码,RISC-V分别和M4,M3核心对比,测试结果如下:
RISC-V芯片,GD32VF103,RV32IMAC核心,8M主频,GCC编译器
  • -O3优化,实测时间54.39ms
  • -Os优化,实测时间94.09ms
  • -Ofast优化,实测时间54.39ms,与-O3完全一样
ARM芯片,GD32F330,Cortex-M4核心,8M主频,AC6编译器
  • -O3优化,实测时间38.40ms
  • -Os优化,实测时间39.15ms
  • -Ofast优化,实测时间38.40ms,与-O3完全一样
  • -Oz优化,实测时间57.09ms
GD32F103,Cortex-M3核心,8M主频,AC6编译器
  • -O3优化,实测时间45.92ms
  • -Os优化,实测时间46.68ms
  • -Ofast优化,实测时间45.92ms,与-O3完全一样
  • -Oz优化,实测时间64.88ms
结论:
最大速度优化情况下,RISC-V执行时间是M4的54.39/38.40*100%=141.64%,是M3的54.39/45.92*100%=118.45%。
粗略来看,RISC-V同频性能比M4慢大约4成,比M3大约慢2成。当然这里面肯定有编译器的差距,GCC肯定是要比AC6弱的,这点毋庸置疑。
ARM也有GCC编译器可用,不过大多数ARM用户都是使用ARM的编译器,对比两者在GCC编译器下的表现意义并不大。
还有一点是GD没有提供GCC编译器的startup文件,我也懒得再去自己写了。

使用特权

评论回复
12
imdx|  楼主 | 2021-6-25 18:44 | 只看该作者
xxo21 发表于 2021-6-25 14:07
大概率是库的问题,你把printf sprintf scan之类的函数都注释掉,然后编译release版本试试, ...

我要是告诉你Debug版本可以比Release版本代码小你会不会很吃惊?

使用特权

评论回复
13
xdqfc| | 2021-6-26 08:56 | 只看该作者
ARM的是很好,但是,那是人家的东西,关系不好的时候,随时断货,RISC_V,起码自主可控,而且正在不断的发展中,像楼主说的情况,感觉跟指令集无关,否则在开始比较的时候就会有人说明的,估计跟编译器有关系,后期肯定会有提高的,总之,慢慢来吧,起码自主可控。

使用特权

评论回复
14
K_O_Carnivist| | 2021-6-26 19:10 | 只看该作者
这个是不是可以看map文件,对比一下具体哪里差的比较大?另外楼主开LTO了吗?

使用特权

评论回复
15
yklstudent| | 2021-6-28 09:08 | 只看该作者
请教你们都是如何在线烧录和调试的?

使用特权

评论回复
16
imdx|  楼主 | 2021-6-28 14:18 | 只看该作者
yklstudent 发表于 2021-6-28 09:08
请教你们都是如何在线烧录和调试的?

方法很多,GDLink,DFU,ISP都可以。

使用特权

评论回复
17
yklstudent| | 2021-6-29 21:14 | 只看该作者
imdx 发表于 2021-6-28 14:18
方法很多,GDLink,DFU,ISP都可以。

都只是可以烧录,没法在线调试

使用特权

评论回复
18
zyw123456789| | 2021-7-1 17:42 | 只看该作者
楼主编译时有没有开启 "Compressed extension(RVC)" 和“Small prologue/epilogue(-msave-restore)” 这两个编译选项?按道理代码密度差不了这么大。特别是-msave-restore选项,对代码量的影响很大。

使用特权

评论回复
19
imdx|  楼主 | 2021-7-1 18:10 | 只看该作者
zyw123456789 发表于 2021-7-1 17:42
楼主编译时有没有开启 "Compressed extension(RVC)" 和“Small prologue/epilogue(-msave-restore)” 这两 ...

主贴的测试代码中:RVC是开了的,没有开-msave-restore选项。
打开-msave-restore,同时打开-flto开启链接时优化,代码体积从12352字节降低到12064字节,降低了2个点多一点。本身代码加了一些功能,从11520字节增加到了12352字节,开启-msave-restore和-flto选项后降低到了12064字节。12064/12352*100%=97.67%。
整体上,RISC-V和ARM Cortex-M代码密度差距还是十分明显,并不影响主贴的结论。

使用特权

评论回复
20
imdx|  楼主 | 2021-7-1 18:13 | 只看该作者
zyw123456789 发表于 2021-7-1 17:42
楼主编译时有没有开启 "Compressed extension(RVC)" 和“Small prologue/epilogue(-msave-restore)” 这两 ...

RISC-V的用户,大部分同时都是Cortex-M用户,想验证这个结论并不难,找一个工程分别在Cortex-M和RISC-V下编译下就知道了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

120

主题

901

帖子

8

粉丝