簡介
Intel PXA25x
Intel PXA26X
PXA
PXA25x
PXA250 (已停產) PXA255
PXA26X
PXA26X
PXA27X
PXA27x系列(內部代號Bulverde)包括了
PXA270和PXA271-PXA272幾款處理器。這次升級是XScale系列處理器的一次巨大提升。PXA270 有以下幾種運行
頻率: 312 MHz, 416 MHz, 520 MHz 。對於
封裝內沒有內置記憶體的單獨
CPU版本,還可以運行在624 MHz的高
頻率。PXA271 可以運行在 312 MHz 或 416 MHz,在同一個封裝內還集成了32 MiB 的 16位 stacked StrataFlash
快閃記憶體和32 MiB 的 16位
SDRAM記憶體。 PXA272可以運行在312 MHz, 416 MHz 或 520 MHz,並內置 64 MiB 的 32位 stacked StrataFlash
快閃記憶體。
Intel 還在 PXA27x 系列中加入了如下的新技術:
移動版
SpeedStep: 作業系統可以根據運行需要調節CPU
頻率以節能。移動
MMX: 43 條新的 SIMD 指令 包含了 完整的 MMX
指令集和一些SSE 指令集中的整數指令。 移動 MMX 提供了16 條額外的 64位
暫存器,並可以被當成雙重32位的來處理,像四個16位halfwords 或八個 8位 位元組。 這項能力可以加速晶片的編碼和解碼速度,提高多媒體和遊戲的性能。
附加的外部設計: 例如USB-Host界面和攝像頭界面。
集成 256KB
SRAM快取,降低功耗和延遲。PXA27x系列於2004年4月發布。此外Intel還發布了2700G嵌入式圖形協處理器 。
PXA3xx
2005年8月,Intel發布了PXA27X的下一代產品,代號為Monahans的
CPU。
2006年11月,Marvell公司發表了PXA300、PXA310、PXA320。
AutoCad
體系結構
XScale體系結構按照嵌入式套用要求,採用
Pentium系列
微處理器設計技術和工藝設計一款性能突出ARM兼容
嵌入式微處理器。XScale體系結構引入了多種硬體特性增強處理器性能,但也給應用程式最佳化帶來了挑戰。XScale微架構引入了Pentium處理器工藝和
系統結構技術,實現了Pentium微處理器體系結構一系列高性能技術,達到了高性能、低功耗和小體積等
嵌入式系統要求特性。
存儲體系
XScale實現了一個高效
存儲器體系結構,為其
超流水線高效運行提供數據資源。XScale存儲體系功能主要包括32KB D-Cache、32KB I-Cache、2KB Mini Dcache、Fill Buffers、ending Buffers以及4.8GB/s頻寬
存儲匯流排,使處理器可以高效訪問
存儲器。
超流水線
Xscale超流水線(SuperPipeline)技術,如圖1所示,由整數處理(integer)、乘加(MAC)和存儲(memory)3條流水線組成。3條流水線長度是6到9段,前4到5段共享,後面分支部分並行工作可有效提高處理器性能。
邏輯功能
為了節省處理器晶片體積和降低運行功耗,XScale體系結構沒有實現昂貴
浮點運算部件和除法部件。這些是嵌入式套用中不常用運算。當需要這類運算時,可以通過軟體方法實現。
分支預測
XScale實現了基於統計分析分支預測功能部件,減少由於分支轉移沖刷
指令流水線次數,也有效地提高了處理器性能。
指令集
針對ARM數據處理能力不足,XScale對ARM乘加邏輯進行了增強,增加了8條DSP指令。
XScale處理器還可集成Flash
快閃記憶體和無線MMX邏輯功能。這些特性有效地提高了XScale數據處理能力。帶有無線MMXPXA27X在312MHz
主頻運行處理多媒體套用時,其性能與520MHz ARM處理器相當。
高主頻
採用Pentium工藝技術,XScale
主頻可以超出普通ARM微處理器主頻數倍,在保持較低能量消耗前提下,高達600MHz以上。如PXA27X
主頻可高達724MHz。
XScale
體系結構是採用Intel Pentium技術實現ARM兼容
嵌入式微處理器架構,並對ARM體系結構進行了增強,具有業界領先高性能和低功耗特性被廣泛套用於消費電子、無線通信、
多媒體和
網路交換等嵌入式套用領域。XScale引入了一系列高性能
微處理器設計技術,總體性能顯著地超出同
主頻ARM微處理器。然而,由於受功耗、成本和體積等因素制約,嵌入式微處理器處理能力與桌面系統相比仍存在較大差距。
性能最佳化
XScale處理器性能的發揮很大程度上依賴於應用程式的最佳化技術。XScale
嵌入式套用系統的性能最佳化可以下幾個方面考慮。
算法結構
實現某種套用功能通常可採用多種算法或方法,不同算法的複雜度和效率差別很大。選擇一種高效的算法或對算法進行最佳化,可以使應用程式獲得最大的最佳化性能。常用的最佳化技術有以下幾種。
(1)選擇高效算法
如果算法效率低下,再快的處理器也會顯得不夠有,而一個高效的算法卻可以彌補處理器性能的不足。
考慮從已排序好的n個元素a[0:n-1]中找出某一特定元素x。如果採用順序搜尋方式,從a[0]到a[n-1]逐個比較這n個元素,需要O(n)次比較。而如果採用二分搜尋方法,則僅需O(logn)次比較。當n為2 31時,前一算法平均需要比較2 31次,後一算法平均僅需比較31次。兩者所需時間相差達10 8倍。
採用
遞歸過程實現算法具有結構清晰、程式簡練易讀、正確性容易證明的特點;但
遞歸算法通常需要執行大量的過程調用,並在
堆疊中保存所有返回過程的
局部變數,效率往往較低。當應用程式存在性能問題時,使用循不
疊代方法將
遞歸算法轉換成非遞歸算法往往可以使程式性能提高數倍。文獻對
八皇后問題和Fibonacci數列的
遞歸算法與非遞歸算法進行了性能比較試驗,結果如表1所列。
問題遞歸算法時間/s非遞歸算法時間/s加速比/倍八皇后問題(最大棧深度為12)100205Fibonacci數列(n=40)50150 |
算法最佳化是首選的最佳化技術。
編譯最佳化
多數
編譯器都可基於
數據流分析實現別名分析、常數拆疊、常數傳播、公共子表達式消除、冗餘代碼和死碼刪除、循環不
變數的移動、循環逆轉、循環展開、函式嵌入等與
體系結構無關的最佳化。
GNU gcc、WindRiverdiab、Intl XScale Compiler等常見編譯器都針對XScale
體系結構進行了最佳化設計,可以有效地利用XScale/ARM指令的條件執行、條件設定和
運算元移位等功能,使一條指令完成多個操作,縮短指令序列的長度;減少跳轉指令的數目,減少沖刷流水線的次數;按照XScale
超流水線要求,利用3地址指令、多字傳送指令、DSP乘加指令和MMX指令等,生成高效的指令序列,提高應用程式的性能。
一些最佳化編譯器可借用
並行程式設計技術,進行相關性分析,獲得
源程式的語義信息,採用軟體流水線、數據規劃、循環重構等技術,使應用程式呈現更好的局部性,提高Cache命中率,從而提高計算密集型應用程式的性能。對於矩陣計算等計算密集型程式,一些高性能最佳化編譯器生成的代碼可以高出普通編譯器產生的代碼十倍之多。
應用程式開發過程中應該充分利用
編譯器的
代碼最佳化功能,在編碼時將主要精力集中在業務邏輯算法流程的設計上,提高編程效率和代碼可讀性。
編程最佳化
編譯最佳化是靜態最佳化。最佳化
編譯器可以自動完成
程式段和代碼塊範圍內的最佳化問題,但編譯器很難獲取程式語義信息、算法流程和程式運行狀態信息。很多情況下也需要編譯人員以某種方式將程式運行狀態信息傳遞給
編譯器,或進行手工最佳化。以下是常用的編譯最佳化技術。
(1)使用inline函式
多數
編譯器支持inline
關鍵字。如果一個函式被設計成一個inline函式,那么在調用它們的地方將會用
函式體來替代
函式調用語句,這樣將會徹底省去函式調用的開銷。使用inline的最大缺點是函式在被多處調用時,代碼量將增大。
根據ARM過程調用規範,4個以下的
形參通過
暫存器傳遞,第5個以上的
形參通過
存儲器棧傳遞。顯然,通過
存儲器棧傳送參數的開銷較大。
函式調用形參限制在4個以內,可以降低函式調用的開銷。
(3)在Switch是一種使用普通的編程技術。編譯器為之產生if-else-if嵌套代碼,並按照順序進行比較,發現匹配則跳到滿足條件的語句執行。編程時,根據發生的相對
頻率排序,將最可能發生的情況放在第一位,最不可能的情況放在最後一位,可以提高Switch語句塊的執行速度。
實際上,程式中if條件的處理也有類似的特性。
(4)避免使用C++的昂貴功耗
C++在支持
軟體工程、
面向對象程式設計、結構化對C進行卓有成效的改進,但在代碼尺寸、執行速度等方面比C語言差一些。C++的類機制與C語言的結構差別不大,但C++的
多重繼承、虛擬基類、模板和運行類型識別等特性對代碼尺寸和運行效率有負面影響。對這些功能要慎重使用,可以通過試驗測試其影響的大小。
(5)減少或避免執行耗時的操作
應用程式的主要執行時間通常花費在關鍵路徑
代碼段或
程式模組,關鍵路徑程式模組往往包含循環或嵌套循環。減少循環或內層循環中昂貴操作的執行
頻率可以顯著地提高應用程式的效率。常見的耗時操作有:I/O操作、檔案訪問、圖形界面操作和系統調用等。
表2列出了XScale常見的I/O處理、系統調用和檔案訪問等昂貴操作的代價。
操作類型代價(時鐘周期/個)sprintf828fprintf540fread552fwrite864write216Read216除法112atoi596 |
對於檔案訪問等操作,每次讀入和寫出一個較大的
數據塊,或使用記憶體映射技術訪問檔案,可以減少相關係統調用執行的次數,從而提高程式執行的性能。下面是一個使用這種最佳化技術的示例。
最佳化前代碼:
int data_in,int data_out;
int file_in,file_out;
…
for(;;){
read(file_in,data_in,1);
data_out=decode(&data_in);
write(file_out,&data_out,1);
}
最佳化後代碼:
int data_in[1024],
int data_out[1024];
int file_in,file_out;
…
for(;;){
read(file_in,data_in,1024);
}
(6)用查表代替計算
在處理器資源緊張和
存儲器資源相對富餘的情況下,可以用犧牲
存儲空間換取速度的方法。例如需要頻繁計算正弦和餘弦等函式數值時,可預先將函式值計算出來,置於記憶體,供以後查找。
4.高性能開發工具
選擇一種最佳化能力強的
編譯器和開發工具可以生成更加高效的代碼。WindRiver Diab、GNU gcc、GNUpro和Intel XScale Compiler都針對XScale體系結構進行了最佳化。
嵌入式應用程式通常包含大量的系統函式調用。在XScale平台上的測試結果表明:MediaBench的應用程式大約有50%的執行時間花費在系統
庫函式,選用高效的系統
運行庫(runtime library)也可使應用程式的運行效率獲得提升。如glibc庫的緩衝區的大小是
newlib的數十倍,所以在處理輸入輸出操作方面具有更高的效率。
結構最佳化
(1)避免除法
XScale沒有除法部件和整數除法指令,除法是由軟體實現的。軟體實現的除法效率很低,應該儘可能避免除法和計算餘數等運算。有時可以將除法轉變為乘法。下面兩側是除法操作最佳化的示例。
最佳化前:if((x/y)>z)
最佳化後:if(x>(y*z))
②將除法轉換為乘常數和移位操作
最佳化前:v.x=(v1.x+v2.x+v3.x)/3
最佳化後:使用常數乘數0x5555轉換成
v.x=(int)(((_int64)(v1.x+v2.x+v3.x)*
(_int64)0x55555)>>16);
XScale沒有實現浮點部件。
浮點運算是通過系統庫實現的,代價很高,通常也應該避免,有時可以轉換成整數運算。包含
浮點運算的庫例程有格式化輸入輸出(scanf/printf)等。XScale中常見
浮點運算的代價如表3所列。
表3 XScale常見浮點運算的代價
運算類型代價(時鐘周期/個)加法+400乘法*400除法/560 |
(3)使用GPP和IPP庫
XScale的很多硬體特性是針對多媒體
嵌入式套用的特點而設計的,很難在
編譯器中支持這些特性。為此,Intel公司對
多媒體處理、圖形處理和數值運算的一些典型操作和算法進行了手工最佳化,設計成
程式庫,分別稱為GPP/IPP庫。這些庫例程可以很好地發揮XScale硬體的計算潛能,達到很高的執行效率。
最佳化策略
應用程式的性能最佳化與縮短開發周期、
軟體工程和OOP的目標之間通常存在矛盾。
嵌入式系統需要性能優,但性能最佳化需要人力物力投入,會增加開發時間,降低程式的可讀性,排斥使用新的開發工具和程式語言。而
軟體工程的目標是使用高效的開發工具。程式語言和編程規範提高程式的可讀性、可靠性,縮短開發周期,降低項目成本。為此應該在二者之間尋找一種平衡。通常可以採取以下策略和原則;
①將算法結構最佳化作為首選最佳化技術,設計高效的應用程式流程和算法;
②根據功能、性能差異和投資預算選擇高效的
編譯器、系統運行庫、圖形庫、
中間件等;
③使用性能監測工具識別占主要執行時間的關鍵路徑
程式模組,採用一切最佳化手段對關鍵路徑代碼和程式模組進行最佳化,挖掘應用程式性能;
④非關鍵路徑的流程控制代碼按照
軟體工程的要求,採用高效率程式語言和開發工具實現,提高設計開發效率。使用
編譯器進行最佳化。