日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/7/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 定点运算和浮点运算_C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C28x+FPU架構(gòu)的C2000微處理器在原有的C28x定點(diǎn)CPU的基礎(chǔ)上加入了一些寄存器和指令,來支持IEEE 單精度浮點(diǎn)數(shù)的運(yùn)算。對(duì)于在定點(diǎn)微處理器上編寫的程序,浮點(diǎn)C2000也完全兼容,不需要對(duì)程序做出改動(dòng)。浮點(diǎn)處理器相對(duì)于定點(diǎn)處理器有如下好處:

  • 編程更簡(jiǎn)單

  • 性能更優(yōu),比如除法,開方,FFT和IIR濾波等算法運(yùn)算效率更高。

  • 程序魯棒性更強(qiáng)。

  • 一、IEEE754格式的浮點(diǎn)數(shù)

    C28x+FPU的單精度浮點(diǎn)數(shù)遵循IEEE754格式。它包括:

    • 1位符號(hào)位:0表示正數(shù),1表示負(fù)數(shù)。

    • 8位階碼

    • 23位尾數(shù)

    31

    30 ???????????????????????????????????????????????????????????????????????????????????23

    22 ?????????????????????????????????????????????????0

    符號(hào)位

    階碼

    尾數(shù)

    表1:IEEE單精度浮點(diǎn)數(shù)

    符號(hào)位S

    階碼E

    尾數(shù)M

    0

    0

    0

    正0

    1

    0

    0

    負(fù)0

    0或1

    0

    非0

    非規(guī)格化數(shù)(1)

    0

    1-254

    0x00000-0x7FFFF

    正常范圍正數(shù)(2)

    1

    1-254

    0x00000-0x7FFFF

    正常范圍負(fù)數(shù)(2)

    0

    255

    0

    正無窮大

    1

    255

    0

    負(fù)無窮大

    0或1

    255

    非0

    非數(shù)值(NaN)

    (1)非規(guī)格化數(shù)值非常小,計(jì)算公式為(-1)sx2(E-126)x0.M

    (2)正常范圍數(shù)值計(jì)算公式為(-1)sx2(E-127)x1.M

    正常范圍數(shù)值落在± ~1.7 x 10?-38?to ± ~3.4 x 10?+38范圍內(nèi)。從表1可以看出,IEEE754標(biāo)準(zhǔn)包括:

    • 標(biāo)準(zhǔn)數(shù)據(jù)格式和特殊值,比如非數(shù)值(NaN)和無窮大

    • 標(biāo)準(zhǔn)舍入模式和浮點(diǎn)運(yùn)算

    • 多平臺(tái)支持,包括德州儀器C67x系列芯片。

    C2000對(duì)該標(biāo)準(zhǔn)作了一些簡(jiǎn)化:

    • 狀態(tài)標(biāo)志位和比較運(yùn)算不區(qū)分正0和負(fù)0

    • 非規(guī)格化數(shù)值被認(rèn)為是0

    • 對(duì)非數(shù)值(NaN)處理方式和無窮大一樣。

    IEEE754標(biāo)準(zhǔn)有5種舍入模式,C28x+FPU只支持其中兩種:

    --截?cái)?#xff1a;小數(shù)位不管大小全部舍去

    --就近舍入向偶舍入:這種模式下如果小數(shù)位小于5就舍去,大于5就進(jìn)位,如果小數(shù)位為5,則舍入到最近的偶數(shù)。

    表2展示了不同的舍入模式對(duì)數(shù)據(jù)的影響。C28x+FPU編譯器默認(rèn)將微處理器配置為就近舍入向偶舍入模式[1]。

    表2:不同舍入模式示例

    模式?/?實(shí)際值

    +11.5

    +12.5

    ?11.5

    ?12.5

    就近舍入向偶舍入

    +12.0

    +12.0

    ?12.0

    ?12.0

    就近舍入遠(yuǎn)離0舍入

    +12.0

    +13.0

    ?12.0

    ?13.0

    截?cái)?/p>

    +11.0

    +12.0

    ?11.0

    ?12.0

    向上舍入

    +12.0

    +13.0

    ?11.0

    ?12.0

    向下舍入

    +11.0

    +12.0

    ?12.0

    ?13.0

    二、浮點(diǎn)C2000芯片運(yùn)算技巧和注意點(diǎn)

    浮點(diǎn)數(shù)的精度由尾數(shù)位決定,絕大多數(shù)的數(shù)在用浮點(diǎn)數(shù)表示時(shí)都會(huì)有誤差,這些誤差很小,多數(shù)情況下可以忽略,但是在經(jīng)過多次計(jì)算后這個(gè)誤差可能會(huì)大到無法接受。

    下面用實(shí)例來進(jìn)行說明,下面一段代碼定義float類型變量,分別在TI最新的Delfino芯片F(xiàn)28379D的CPU1和CLA1上,將11.7加20001次。

    float?CLATMPDATA=0;

    int?index=20001;

    ???while(index--)

    ?? {

    ??? ?? CLATMPDATA=CLATMPDATA+11.7;

    }

    得到如下結(jié)果:

    其中CLATMPDATA1是在CLA中將11.7加20001次得到的結(jié)果,CLATMPDATA2是在CPU中將11.7加20001次得到的結(jié)果。可以看出兩者所得到的結(jié)果不同,并且都和正確結(jié)果234011.7有較大差距。

  • 為何CPU和CLA計(jì)算結(jié)果不同?

  • CPU和CLA運(yùn)算結(jié)果的不同是由于其對(duì)浮點(diǎn)數(shù)的舍入模式的不同造成的,前文已經(jīng)說過,C28x+FPU 編譯器默認(rèn)將CPU配置為就近舍入向偶舍入模式。而CLA不同,CLA默認(rèn)為截?cái)嗌崛肽J絒2]。在CLA的代碼中,我們可以通過增加下述代碼:

    __asm(" MSETFLG RNDF32=1");//1為就近舍入向偶舍入,0為截?cái)嗌崛?/p>

    將CLA的舍入模式更改為就近舍入向偶舍入模式,然后再運(yùn)行代碼,可以得到和CPU同樣的結(jié)果。

    ?

    ??????? 2. 為何CPU和CLA計(jì)算結(jié)果都有較大誤差?如何解決?

    11.7在用IEEE754格式的浮點(diǎn)數(shù)表示時(shí)為0x413b3333,其對(duì)應(yīng)的實(shí)際值為11.69999980926513671875,可以看出誤差很小,但是經(jīng)過多次累加多次舍入后得到的結(jié)果誤差較大,對(duì)此,我們可以將CLATMPDATA定義為long double型變量(64位),再次運(yùn)行相同的代碼,可以得到如下結(jié)果,可以看到誤差很小可以忽略。

    需要指出的是,現(xiàn)有的C28x CPU只支持單精度(32位)的硬件浮點(diǎn)運(yùn)算,對(duì)于64位雙精度浮點(diǎn)數(shù)的運(yùn)算都是通過軟件實(shí)現(xiàn)的,所以其運(yùn)算速率會(huì)慢很多。另外CLA不支持64位數(shù)。

    在這個(gè)實(shí)例中,我們可以分別觀察float類型變量和long double類型變量的匯編代碼如下:

    C code: CLATMPDATA2=CLATMPDATA2+11.7;

    如果CLATMPDATA2是float型變量,則相應(yīng)的匯編代碼為:

    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型變量,則相應(yīng)的匯編代碼為:

    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(跳轉(zhuǎn)耗時(shí))

    +25cycle(FD$$ADD函數(shù)內(nèi)部需要25cycle)

    可以看出CPU對(duì)float類型數(shù)執(zhí)行一次加法耗時(shí)7個(gè)cycle,對(duì)long double類型數(shù)執(zhí)行一次加法耗時(shí)33個(gè)cycle。

    三、結(jié)論

    1. C2000的CPU和CLA默認(rèn)的舍入模式不同,在計(jì)算浮點(diǎn)數(shù)時(shí)可能會(huì)得到不同的結(jié)果,但是我們可以通過代碼改變其舍入模式得到相同的結(jié)果。

    2. 單精度浮點(diǎn)數(shù)經(jīng)過多次計(jì)算后可能會(huì)有較大誤差,可以通過將變量定義為64位long double型解決精度問題。

    3. C28x CPU只支持單精度(32位)的硬件浮點(diǎn)運(yùn)算,對(duì)于64位雙精度浮點(diǎn)數(shù)的運(yùn)算都是通過軟件實(shí)現(xiàn)的,所以其運(yùn)算速率會(huì)慢很多。在下一代的C2000產(chǎn)品中我們會(huì)實(shí)現(xiàn)對(duì)64位雙精度浮點(diǎn)數(shù)運(yùn)算的硬件支持。

    References

    [1].?TMS320C28x FPU Primer?(SPRAAN9A)

    [2].?TMS320F2837xD Dual-Core Delfino Microcontrollers Technical Reference Manual?(SPRUHM8F)

    總結(jié)

    以上是生活随笔為你收集整理的定点运算和浮点运算_C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。