<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式系統超標量體系CPU的高效軟件優(yōu)化技術(shù)

嵌入式系統超標量體系CPU的高效軟件優(yōu)化技術(shù)

作者: 時(shí)間:2013-01-23 來(lái)源:網(wǎng)絡(luò ) 收藏

引言

  公司基于結構的某款PowerPC芯片開(kāi)發(fā)出了電力系列自動(dòng)化裝置,它對實(shí)時(shí)性要求很高。但軟件的運行效率低,這就需要我們針對該芯片的結構特點(diǎn)進(jìn)行軟件優(yōu)化。實(shí)踐中,在針對性?xún)?yōu)化后進(jìn)行對比實(shí)驗,裝置軟件運行效率大大提高,實(shí)際效果良好。

1 結構PowerPC芯片特點(diǎn)

1.1 超標量體系結構芯片

  PowerPC芯片屬于超標量體系結構。超標量體系結構是一種微處理器設計模式,它能夠在一個(gè)時(shí)鐘周期內執行多條指令。在超標量體系結構設計中,處理器或指令編譯器判斷指令能否獨立于其他順序指令而執行,或是依賴(lài)于另一指令,必須按順序執行。然后處理器使用多個(gè)執行單元并行執行兩個(gè)或更多獨立指令。

1.2 PowerPC芯片特點(diǎn)

1.2.1 流水線(xiàn)機制

  該芯片一條指令,可簡(jiǎn)單分為取指、譯碼、執行,提交4個(gè)時(shí)鐘周期操作。同一周期,CPU的不同部件可并行執行多條指令的不同操作,從而達到指令并行,提高CPU的吞吐率。

1.2.2 總線(xiàn)頻率

  該芯片的主頻達到400 MHz,但訪(fǎng)問(wèn)內存的總線(xiàn)頻率是100 MHz,只有主頻的1/4。由此可見(jiàn),當訪(fǎng)問(wèn)內存數據時(shí),其運行時(shí)間比執行計算程序慢多了。當系統大量訪(fǎng)問(wèn)內存時(shí),系統運行速度會(huì )明顯下降。

1.2.3 16 KB的指令Cache和16 KB的數據Cache

  PowerPC芯片中指令Cache和數據Cache中訪(fǎng)問(wèn)指令和數據的速度與主頻一樣。同樣,當讀取指令和數據時(shí)在Cache中讀取的速度約是內存中讀取速度的4倍。

(1) 指令Cache運作機制

  每次指令運行時(shí)若指令未在指令Cache中,即指令Cache未命中,則一次從內存中讀出待執行的連續32字節(32字節相當于8個(gè)浮點(diǎn)數)指令到指令Cache。同時(shí)將指令Cache中最久未訪(fǎng)問(wèn)的代碼淘汰出Cache。32字節相當于3~5條普通C語(yǔ)言代碼。

(2) 數據Cache運作機制

  每次訪(fǎng)問(wèn)數據時(shí),若數據未在數據Cache中,即數據Cache未命中,則一次從內存中讀出連續32字節數據到數據Cache。同時(shí)將數據Cache中最久未訪(fǎng)問(wèn)的數據淘汰出Cache。

2 從超標量流水線(xiàn)機制的角度進(jìn)行優(yōu)化

2.1 超標量流水線(xiàn)機制對程序效率的分析

  從前面的流水線(xiàn)機制可以看到,若指令能達到盡可能的并行,程序運行效率會(huì )明顯提高。這就需要優(yōu)化代碼,讓編譯器優(yōu)化成并行指令。

2.2 從提高指令并行和流水線(xiàn)不被打斷的角度進(jìn)行優(yōu)化

  要提高指令并行,主要就要提高代碼并行可能性。防止流水線(xiàn)不被打斷,就是要盡量避免跳轉。

2.2.1 循環(huán)體代碼并行執行的優(yōu)化

  代碼舉例1:
for(i=0;i1000;i++) {
Y[i]=Y[i]+Y[i-1];
}

  該代碼循環(huán)體代碼之間因為存在相關(guān)數據,導致代碼無(wú)法被CPU并行執行,需要避免類(lèi)似代碼。

  代碼舉例2:
for(i=0;i1000;i++) {
Y[i]=X[i]+Z[i];
}

  該代碼循環(huán)體代碼之間不存在相關(guān),能被CPU并行執行。CPU執行時(shí)代碼如下:
Y[0]=X[0]+Z[0],
Y[1]=X[1]+Z[1],
Y[2]=X[2]+Z[2],
Y[3]=X[3]+Z[3],

2.2.2 代碼順序執行避免跳轉的優(yōu)化

  跳轉的語(yǔ)句主要有if_else結構、switch_case結構、循環(huán)結構等。

  if_else結構可以將選擇概率最大的語(yǔ)句放到if語(yǔ)句之后。因為取指時(shí),緊接著(zhù)if語(yǔ)句的指令會(huì )被取到。這樣發(fā)生跳轉的次數降低,流水線(xiàn)被中斷的概率降低。

  盡量降低循環(huán)嵌套層數和循環(huán)次數,這樣發(fā)生跳轉的次數也降低。

2.2.3 避免小段程序代碼循環(huán)的優(yōu)化

  比如2~3句的小循環(huán),可以適當展開(kāi)。
  一是可以提高循環(huán)內指令并行的可能性。
  二是可以減少跳轉次數。
  循環(huán)體代碼超過(guò)10句普通C語(yǔ)言代碼,可以不要展開(kāi)。

3 從指令Cache的角度進(jìn)行優(yōu)化

3.1 指令Cache對程序效率的分析

  從前面分析可知,若程序取指環(huán)節能從指令Cache中讀取,而不是每次都從內存中讀取,則能顯著(zhù)提高程序執行速度。

3.2 從提高指令Cache命中的角度進(jìn)行優(yōu)化

① 盡量使程序順序執行。
② 避免大量相似的代碼重復實(shí)現、分散調用。
③ 盡量將相同的代碼在一個(gè)地方循環(huán)執行,提高指令Cache的命中率。不要分散執行,導致多次讀取同一段代碼到指令Cache中。

3.2.1 多個(gè)相似函數的優(yōu)化

  代碼舉例3:
{
FuncA;//3個(gè)相似函數連續調用
FuncB;
FuncC;
}
優(yōu)化為
for(i=0;i3;i++) {
Func(i);
}

  這樣相同的代碼一次即可從內存讀到Cache中,另外2次指令都是從Cache中讀取。

3.2.2 大函數拆分的優(yōu)化

  由于函數體較大,超出了指令Cache的大小,導致第1次循環(huán)結束、第2次循環(huán)開(kāi)始時(shí),函數體前面內容已經(jīng)被調出Cache。同樣代碼又重新從內存中讀取到Cache中,如此反復,實(shí)際的結果是函數體Func代碼被三次從內存中讀取到Cache中,導致效率大大降低。

  代碼舉例4:
for(i=0;i3;i++) {
Func(i);
}
被優(yōu)化為:
for(i=0;i3;i++) {
Func1(i);
}
for(i=0;i3;i++) {
Func2(i);
}
for(i=0;i3;i++) {
Func3(i);
}

  將函數體Func分成幾個(gè)單獨的子函數:Func1、Func2、Func3,然后分別循環(huán)。這樣Func1循環(huán)時(shí),由于代碼量較小,整個(gè)函數體都在Cache中。Func2、Func3類(lèi)似。這樣的結果是,函數體Func1、Func2、Func3都只從內存被讀一次到Cache中。

4 從數據Cache的角度進(jìn)行優(yōu)化

4.1 數據Cache對程序效率的分析

  從前面分析可知,在程序取操作數環(huán)節,若能從數據Cache中讀取操作數,而不是每次都從內存中讀取則能提高程序執行速度。

4.2 從提高數據Cache命中的角度進(jìn)行優(yōu)化

① 訪(fǎng)問(wèn)數據時(shí),最好是對同一段數據在一個(gè)地方集中訪(fǎng)問(wèn)。
② 訪(fǎng)問(wèn)數據時(shí),最好是根據數據的順序依次訪(fǎng)問(wèn)。比如對數組的訪(fǎng)問(wèn),最好是按數組成員依次訪(fǎng)問(wèn),效率較高。
③ 為了使程序能夠連續訪(fǎng)問(wèn)數據,需要調整數據結構、重構代碼使得數據結構和程序配合,提高數據Cache的命中率。

4.2.1 數組連續訪(fǎng)問(wèn)的優(yōu)化

  代碼舉例5:
float afBuf[1000];
float xBuf[8][24];
Func {
for(i=0;i24;i++) {
xBuf[0][i]=afBuf[0+i];
xBuf[1][i]=afBuf[24+i];
……
xBuf[7][i]=afBuf[168+i];
}
}

  被優(yōu)化為:
Func {
for(i=0;i8;i++) {
m=i*24;
xBuf[i][0]=afBuf[0+m]
xBuf[i][1]=afBuf[1+m];
……
xBuf[i][23]=afBuf[23+m];
}
}

  這樣優(yōu)化后,數據每次訪(fǎng)問(wèn)都是連續的。

4.2.2 將不連續數據訪(fǎng)問(wèn)重構為連續訪(fǎng)問(wèn)的優(yōu)化

  代碼舉例6:
floatafBufA[24];
floatafBufB[24];
floatafBufC[24];
floatxbuf[200];
Func {
xBuf[0]=afBufA[0];
xBuf[1]=afBufB[0];
xBuf[2]=afBufC[0];
……
xBuf[69]=afBufA[23];
xBuf[70]=afBufB[23];
xBuf[71]=afBufC[23];
}

  被優(yōu)化為:
struct {
float fA;
float fB;
float fC;
} aBufABC[24];
floatxbuf[200];
Func {
xBuf[0]=aBufABC[0].fA;
xBuf[1]=aBufABC[0].fB;
xBuf[2]=aBufABC[0].fC;
……
xBuf[69]=aBufABC[23].fA;
xBuf[70]=aBufABC[23].fB;
xBuf[71]=aBufABC[23].fC;
}

5 軟件優(yōu)化實(shí)驗結果

5.1 優(yōu)化對比實(shí)驗

  在自動(dòng)化裝置的主要消耗資源的實(shí)時(shí)掃描任務(wù)中進(jìn)行了代碼分析,并按上述可能優(yōu)化措施進(jìn)行了優(yōu)化。優(yōu)化前實(shí)時(shí)掃描任務(wù)占用資源為系統CPU總資源的52%。代碼優(yōu)化后實(shí)時(shí)掃描任務(wù)占用CPU資源只有系統總資源的31%。

  對比可以看出,系統效率提高了40%,效果是非常明顯的。

結語(yǔ)

  雖然CPU的標稱(chēng)性能指標非常高,但其有專(zhuān)用的體系結構,對一般開(kāi)發(fā)者的編程開(kāi)發(fā)方式而言并不是完全匹配,導致發(fā)揮不出CPU的潛力。所以有針對性的根據CPU的體系結構特點(diǎn)進(jìn)行分析,并采取針對性的優(yōu)化措施,才能真正發(fā)揮其性能,滿(mǎn)足嵌入式強實(shí)時(shí)性要求。

本文引用地址:http://dyxdggzs.com/article/257181.htm


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>