今天测试了下STM32F4和TI F28335的浮点性能

2019-12-12 18:22发布

这几天刚拿到STM32F4的评估板,STM32F4这次的卖点就是FPU和DSP指令集,关注了挺长时间,这次就想测试一下STM32F4的浮点性能,如果满足就升级自己飞控的架构。本来用STM32F103+28335双核架构,F28335当浮点处理器用,调试起来比较麻烦,所以一直想换了。

测试代码就是用的我飞控的算法,全部使用浮点运算,包含姿态和位置两个7阶和9阶的卡尔曼滤波器,包含大量的矩阵运算以及部分导航算法和PID控制器等,还有部分IF和SWITCH包含跳转的判定语句,相比纯算法算是一个比较综合的运算。

测试环境:
F28335:CCS V3.3,使用TI优化的数学库,不开优化,程序在RAM里执行。
STM32F4:KEIL V4.7,使用ARM优化的数学库,不开优化。

测试方法:
F28335:在飞控算法入口设置断点,清零CCS的CPU计数器(profile->clock),然后STEP OVER,记录下CPU的计数
STM32F4:在飞控算法入口设置断点,记录下Register窗口内算states计数器,然后STEP OVER,记录下新的计数器数值,与之前的数值相减得到CPU计数

测试结果:
F28335:253359个CPU周期,除以150MHZ,大约是1.69ms
STM32F4:初始值17470 结束值156740,一共139270个周期,除以168MHZ,大约是0.828ms


结论就是,对于包含相对较多跳转的综合浮点算法而言,STM32F4似乎更胜一筹。
大家对于测试过程有什么不足的地方请指出,希望能抛砖引玉,对这两款处理器性能有个更深的体会








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
lxl_lw
1楼-- · 2019-12-16 07:40
 精彩回答 2  元偷偷看……
liu_tianyi
2楼-- · 2019-12-16 10:53
本帖最后由 liu_tianyi 于 2013-5-28 05:08 编辑

我犯了一个严重的错误,误以为KEIL的DEFAULT就是不优化了,其实是Default是高度优化,LEVEL-O1才是不优化。参考这里:
http://www.keil.com/support/man/docs/uv4/uv4_dg_adscc.htm

重新测试了一下STM32F4的成绩:
一共285964个周期,除以168MHZ,大约是1.7ms,比F28335略慢



抛开架构因素,从纯浮点运算方面来看的话。STM32F4的FPU加减乘指令VADD.F32、VSUB.F32、VMUL.F32都是单周期指令,而除法VDIV.F32耗费14个周期。
例如:a = a / b;产生的汇编为:
  1. 0x08000220 ED900A00  VLDR          s0,[r0,#0x00]
  2. 0x08000224 4804          LDR           r0,[pc,#16]  ; @0x08000238
  3. 0x08000226 EDD00A00  VLDR         s1,[r0,#0x00]
  4. 0x0800022A EE801A20  VDIV.F32    s2,s0,s1
  5. 0x0800022E 4803          LDR           r0,[pc,#12]  ; @0x0800023C
  6. 0x08000230 ED801A00  VSTR         s2,[r0,#0x00]
复制代码F28335:  F28335的FPU有加减乘法指令,都是双周期的,由于没有硬件除法指令,F28335这里是用软件模拟的浮点除法,汇编可以看到 LCR  $div_f32.asm字样,需要19个时钟周期。
例如:a = a * b,产生的汇编为:
  1. 0087B2 E203 MOV32      *-SP[4], R0H
  2. 0087B4 E2AF MOV32      R1H, *-SP[6], UNCF
  3. 0087B6 E700 MPYF32     R0H, R1H, R0H
  4. 0087B8 7700 NOP                                               //需要让流水线等待FPU运算完毕,所以需要NOP     
  5. 0087B9 E203 MOV32      *-SP[4], R0H
复制代码除法:
  1. 0087BD E203 MOV32      *-SP[4], R0H
  2. 0087BF E2AF MOV32      R1H, *-SP[6], UNCF
  3. 0087C1 7640 LCR        $div_f32.asm:52:71$
  4. 0087C3 E203 MOV32      *-SP[4], R0H
复制代码结论:
可见单从浮点处理器来说,F28335是不如F4的FPU的。但是由于F28335是哈佛架构,有较长的流水线,可以在一个时钟周期里完成读取,运算和存储,所以程序连续运行的话,就比ARM快上许多许多,比如执行一次a = a + b只需要5个时钟周期,但是缺点就是一旦要跳转,就必须清空流水线,如果是
  1. for(i = 0;i < 1000; i ++)
  2. a = a + b;
复制代码这样的运算,速度反而要比ARM慢(测试下来单次是17周期,ARM是14).所以说这就是ARM和DSP不同的地方了。


jisaowang
3楼-- · 2019-12-16 14:47
liu_tianyi 发表于 2013-5-28 03:23
我犯了一个严重的错误,误以为KEIL的DEFAULT就是不优化了,其实是Default是高度优化,LEVEL-O1才是不优化。 ...

朋友,浮点除法和开方两条指令可是乱序的哦!!虽然要14周期,但是这14周期里只要程序没有浮点指令,是不影响整数指令运算的!所以如果手工汇编,优化的好,除法一样是“单周期”,看你怎么巧妙安排程序的逻辑结构了,顺便好好利用浮点的32个寄存器做为整数寄存器的拓展,又可以玩出很多的优化可能。顺便的,要求不高的运算场合适当使用16bit定点数,利用众多SIMD指令并行化,然后在合适的时候传递到fpu中单周期转化为浮点数运算。。。潜力无穷阿!只有手工写汇编,才能体会到arm设计cortex m4指令集的各种美味,目前的编译器还是不行的!
liu_tianyi
4楼-- · 2019-12-16 16:21
jisaowang 发表于 2013-5-28 04:21
朋友,浮点除法和开方两条指令可是乱序的哦!!虽然要14周期,但是这14周期里只要程序没有浮点指令,是不 ...

这倒是,不过幸好我的算法里基本没有除法和开方,都是一些矩阵运算而已..相当期待ARM出汇编的运算库啊。。。
风见流雅
5楼-- · 2019-12-16 20:54
ahuang227 发表于 2013-5-27 08:50
不知道这个样子对比是不是合理啊。还是硬件IO反转看的比较直观。

很多芯片外设的时钟跟cpu的并不相同吧,如果只看IO翻转的速度会不会没办法客观的评价处理器的运算能力?
tongdayusu
6楼-- · 2019-12-17 00:32
 精彩回答 2  元偷偷看……

一周热门 更多>