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