C28x+FPU架构的C2000微处理器在原有的C28x定点CPU的基础上加入了一些寄存器和指令,来支持IEEE 单精度浮点数的运算。对于在定点微处理器上编写的程序,浮点C2000也完全兼容,不需要对程序做出改动。浮点处理器相对于定点处理器有如下好处:

  1. 编程更简单

  2. 性能更优,比如除法,开方,FFT和IIR滤波等算法运算效率更高。

  3. 程序鲁棒性更强。

一、IEEE754格式的浮点数

C28x+FPU的单精度浮点数遵循IEEE754格式。它包括:

  • 1位符号位:0表示正数,1表示负数。

  • 8位阶码

  • 23位尾数

31

30                                                                                    23

22                                                  0

符号位

阶码

尾数

表1:IEEE单精度浮点数

符号位S

阶码E

尾数M

0

0

0

正0

1

0

0

负0

0或1

0

非0

非规格化数(1)

0

1-254

0x00000-0x7FFFF

正常范围正数(2)

1

1-254

0x00000-0x7FFFF

正常范围负数(2)

0

255

0

正无穷大

1

255

0

负无穷大

0或1

255

非0

非数值(NaN)

(1)非规格化数值非常小,计算公式为(-1)sx2(E-126)x0.M

(2)正常范围数值计算公式为(-1)sx2(E-127)x1.M

正常范围数值落在± ~1.7 x 10 -38 to ± ~3.4 x 10 +38范围内。从表1可以看出,IEEE754标准包括:

  • 标准数据格式和特殊值,比如非数值(NaN)和无穷大

  • 标准舍入模式和浮点运算

  • 多平台支持,包括德州仪器C67x系列芯片。

C2000对该标准作了一些简化:

  • 状态标志位和比较运算不区分正0和负0

  • 非规格化数值被认为是0

  • 对非数值(NaN)处理方式和无穷大一样。

IEEE754标准有5种舍入模式,C28x+FPU只支持其中两种:

--截断:小数位不管大小全部舍去

--就近舍入向偶舍入:这种模式下如果小数位小于5就舍去,大于5就进位,如果小数位为5,则舍入到最近的偶数。

表2展示了不同的舍入模式对数据的影响。C28x+FPU编译器默认将微处理器配置为就近舍入向偶舍入模式[1]。

表2:不同舍入模式示例

模式 / 实际值

+11.5

+12.5

−11.5

−12.5

就近舍入向偶舍入

+12.0

+12.0

−12.0

−12.0

就近舍入远离0舍入

+12.0

+13.0

−12.0

−13.0

截断

+11.0

+12.0

−11.0

−12.0

向上舍入

+12.0

+13.0

−11.0

−12.0

向下舍入

+11.0

+12.0

−12.0

−13.0

二、浮点C2000芯片运算技巧和注意点

浮点数的精度由尾数位决定,绝大多数的数在用浮点数表示时都会有误差,这些误差很小,多数情况下可以忽略,但是在经过多次计算后这个误差可能会大到无法接受。

下面用实例来进行说明,下面一段代码定义float类型变量,分别在TI最新的Delfino芯片F28379D的CPU1和CLA1上,将11.7加20001次。

float CLATMPDATA=0;

int index=20001;

while(index--)

{

CLATMPDATA=CLATMPDATA+11.7;

}

得到如下结果:

其中CLATMPDATA1是在CLA中将11.7加20001次得到的结果,CLATMPDATA2是在CPU中将11.7加20001次得到的结果。可以看出两者所得到的结果不同,并且都和正确结果234011.7有较大差距。

  1. 为何CPU和CLA计算结果不同?

CPU和CLA运算结果的不同是由于其对浮点数的舍入模式的不同造成的,前文已经说过,C28x+FPU 编译器默认将CPU配置为就近舍入向偶舍入模式。而CLA不同,CLA默认为截断舍入模式[2]。在CLA的代码中,我们可以通过增加下述代码:

__asm(" MSETFLG RNDF32=1");//1为就近舍入向偶舍入,0为截断舍入

将CLA的舍入模式更改为就近舍入向偶舍入模式,然后再运行代码,可以得到和CPU同样的结果。

2. 为何CPU和CLA计算结果都有较大误差?如何解决?

11.7在用IEEE754格式的浮点数表示时为0x413b3333,其对应的实际值为11.69999980926513671875,可以看出误差很小,但是经过多次累加多次舍入后得到的结果误差较大,对此,我们可以将CLATMPDATA定义为long double型变量(64位),再次运行相同的代码,可以得到如下结果,可以看到误差很小可以忽略。

需要指出的是,现有的C28x CPU只支持单精度(32位)的硬件浮点运算,对于64位双精度浮点数的运算都是通过软件实现的,所以其运算速率会慢很多。另外CLA不支持64位数。

在这个实例中,我们可以分别观察float类型变量和long double类型变量的汇编代码如下:

C code: CLATMPDATA2=CLATMPDATA2+11.7;

如果CLATMPDATA2是float型变量,则相应的汇编代码为:

00c08d:   E80209D8    MOVIZ        R0, #0x413b                                1cycle

00c08f:   E2AF0112    MOV32        R1H, @0x12, UNCF  1cycle

00c091:   E8099998    MOVXI        R0H, #0x3333                              1cycle

00c093:   E7100040    ADDF32       R0H, R0H, R1H                            2cycle

00c095:   7700        NOP                                                           1cycle

00c096:   E2030012    MOV32        @0x12, R0H                                1cycle

如果CLATMPDATA2是long double型变量,则相应的汇编代码为:

00c08b:   7680005A    MOVL         XAR6, #0x00005a      1cycle

00c08d:   8F00005A    MOVL         XAR4, #0x00005a      1cycle

00c08f:   8F40C26A    MOVL         XAR5, #0x00c26a       1cycle

00c091:   FF69        SPM          #0                                            1cycle

00c092:   7640C0C9    LCR          FD$$ADD                          4cycle(跳转耗时)

+25cycle(FD$$ADD函数内部需要25cycle)

可以看出CPU对float类型数执行一次加法耗时7个cycle,对long double类型数执行一次加法耗时33个cycle。

 

三、结论

1. C2000的CPU和CLA默认的舍入模式不同,在计算浮点数时可能会得到不同的结果,但是我们可以通过代码改变其舍入模式得到相同的结果。

2. 单精度浮点数经过多次计算后可能会有较大误差,可以通过将变量定义为64位long double型解决精度问题。

3. C28x CPU只支持单精度(32位)的硬件浮点运算,对于64位双精度浮点数的运算都是通过软件实现的,所以其运算速率会慢很多。在下一代的C2000产品中我们会实现对64位双精度浮点数运算的硬件支持。

请关注公众号【C2000小百科】,更多内容将会在公众号中发布。

C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧相关推荐

  1. 定点运算和浮点运算_C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧...

    C28x+FPU架构的C2000微处理器在原有的C28x定点CPU的基础上加入了一些寄存器和指令,来支持IEEE 单精度浮点数的运算.对于在定点微处理器上编写的程序,浮点C2000也完全兼容,不需要对 ...

  2. 前端面试技巧和注意事项_前端面试百分之九十九过的技巧

    2020最全的前端面试指南,一个多月 1.8w 字的面试经验积累,凭借它最终成功入职大厂-- 今年的金三银四刚好赶上疫情,很多大公司都停止招聘甚至裁员,想跳槽的小伙伴被打的措手不及. 需求减少要求肯定 ...

  3. t480s控制面板打开触摸板_Thinkpad T480 T480S CPU温度主板温度过高的问题解决技巧...

    1. 自从我开始使用T480以来已经快一个月了. 这是第一次使用联想的计算机. 所有许多问题都需要研究,思考和解决. T480到货后,新的Toshiba RC100 240GB固态硬盘的温度过高,大宝 ...

  4. TMS320F280049C 学习笔记10 控制率加速器 Control Law Accelerator (CLA) 入门

    索引 简介 转载[6] 我的浮点心 - CLA简介(上) 什么时候需要用CLA? 什么时候不适合使用CLA? CLA的有什么不足? 翻译[2] CLA受限的C语法编译器 存储器模型 从C28x向CLA ...

  5. TMS320F280049C 学习笔记31 控制率加速器 CLA 学习随笔

    文章目录 前言 文献阅读记录 整数比较时的注意点 参考文献 前言 去年在入门DSP的时候曾对控制率加速器(Control Law Accelerator, CLA)做过初步的学习[1][2],但后来的 ...

  6. 计算机系统变更注意事项,电脑更换cpu注意事项

    电脑更换cpu注意事项 CPU它是计算机的核心部件,在微型计算机中又称微处理器,计算机的所有操作都受CPU控制,CPU的性能指标直接决定了微机系统的性能指标.接下来,小编为您介绍了电脑更换cpu注意事 ...

  7. Linux下查看CPU信息并且计算机器的浮点运算能力

    输入 cat /proc/cpuinfo 物理CPU个数:        cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc - ...

  8. 计算机软件的安装注意事项,安装电脑CPU有什么注意事项

    安装电脑CPU有什么注意事项 CPU它的功能主要是解释计算机指令以及处理计算机软件中的数据.接下来,小编为您介绍了安装电脑CPU有什么注意事项,一起来关注吧! 1.正确使用导热硅脂 安装散热风扇时最好 ...

  9. 浮点运算单元FPU能给电机控制带来什么?

    编者按:在计算领域,例如三角函数以及时域频域变换通常会用到浮点运算.当CPU执行一个需要浮点数运算的程序时,有三种方式可以执行:软件仿真器(浮点运算函数库).附加浮点运算器和集成浮点运算单元.在控制应 ...

  10. fpu测试_浮点运算单元FPU能给电机控制带来什么?

    编者按:在计算领域,例如三角函数以及时域频域变换通常会用到浮点运算.当CPU执行一个需要浮点数运算的程序时,有三种方式可以执行:软件仿真器(浮点运算函数库).附加浮点运算器和集成浮点运算单元.在控制应 ...

最新文章

  1. 图解最常用的10个机器学习算法!
  2. RStudio中,出现中文乱码问题的解决方案
  3. SpringCloud(一):深入理解Eureka
  4. Juniper ex4200 端口镜像问题
  5. 数据挖掘应用的一些场景和对应算法
  6. Technical User Stories – What, When, and How?
  7. OSI模型和TCP/IP协议族
  8. 海量数据处理 (一)
  9. Spring Boot+Maven将配置文件打包到Jar包外方便运维修改配置
  10. java String.intern();
  11. NotePad++ 配置lua语法检查
  12. 组态王曲线控件读取access_组态王,历史趋势曲线控件例程说明文档
  13. oracle首先创建三个表,oracle一个创建用户、创建表空间、授权、建表的完整过程...
  14. 实习成长之路——Spring Bean 二:如何注册BeanDefinition?
  15. 基于SSM的教学质量系统
  16. mysql数据库安全吗_mysql数据库的安全
  17. 百度干净云(无广告不限速的绿色百度云客户端)
  18. 图书租赁管理系统 图书馆借书还书 计算机毕设项目
  19. kafka系列文章四(Consumer Group)
  20. remote access between two linuxs

热门文章

  1. 隐藏在Windows XP中的28个秘密武器
  2. ZYNQ PL 添加IP 串口UART AXI UART16550
  3. light动名词_—Thelightintheofficeisstillon.—Oh,Iforgot_____.[ ]A.tur
  4. 计算机专业毕业祝福语,大学毕业生祝福语
  5. C# MVC 过滤器
  6. TP6.0 一对一模型关联 hasOne
  7. 为什么学计算机容易秃顶,为什么程序员更容易脱发?知道答案惊呆了!
  8. k8s pod删不掉
  9. uni-app银行卡卡号验证
  10. 如何给微信公众号自动回复消息上文字加超链接