簡介
基於Xscale核心的處理器主要包括:
Intel PXA25x
Intel PXA26X
Intel PXA27X
2006年,被出售給Marvell。
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界面和攝像頭界面。
集成 256KBSRAM快取,降低功耗和延遲。PXA27x系列於2004年4月發布。此外Intel還發布了2700G嵌入式圖形協處理器 。
PXA3xx
2005年8月,Intel發布了PXA27X的下一代產品,代號為Monahans的CPU。
2006年11月,Marvell公司發表了PXA300、PXA310、PXA320。
AutoCad
在AutoDesk公司的產品AutoCad中,scale為縮放命令,該命令下的選項“xscale”表示在X軸方向的縮放。
體系結構
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到a[n-1]逐個比較這n個元素,需要O(n)次比較。而如果採用二分搜尋方法,則僅需O(logn)次比較。當n為2 31時,前一算法平均需要比較2 31次,後一算法平均僅需比較31次。兩者所需時間相差達10 8倍。
(2)遞歸算法非遞歸化
採用遞歸過程實現算法具有結構清晰、程式簡練易讀、正確性容易證明的特點;但遞歸算法通常需要執行大量的過程調用,並在堆疊中保存所有返回過程的局部變數,效率往往較低。當應用程式存在性能問題時,使用循不疊代方法將遞歸算法轉換成非遞歸算法往往可以使程式性能提高數倍。文獻對八皇后問題和Fibonacci數列的遞歸算法與非遞歸算法進行了性能比較試驗,結果如表1所列。
表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的最大缺點是函式在被多處調用時,代碼量將增大。
(2)減少函式調用參數
根據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,
int data_out;
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);
(2)避免浮點運算
XScale沒有實現浮點部件。浮點運算是通過系統庫實現的,代價很高,通常也應該避免,有時可以轉換成整數運算。包含浮點運算的庫例程有格式化輸入輸出(scanf/printf)等。XScale中常見浮點運算的代價如表3所列。
表3 XScale常見浮點運算的代價
運算類型代價(時鐘周期/個)加法+400乘法*400除法/560 |
(3)使用GPP和IPP庫
XScale的很多硬體特性是針對多媒體嵌入式套用的特點而設計的,很難在編譯器中支持這些特性。為此,Intel公司對多媒體處理、圖形處理和數值運算的一些典型操作和算法進行了手工最佳化,設計成程式庫,分別稱為GPP/IPP庫。這些庫例程可以很好地發揮XScale硬體的計算潛能,達到很高的執行效率。
最佳化策略
應用程式的性能最佳化與縮短開發周期、軟體工程和OOP的目標之間通常存在矛盾。嵌入式系統需要性能優,但性能最佳化需要人力物力投入,會增加開發時間,降低程式的可讀性,排斥使用新的開發工具和程式語言。而軟體工程的目標是使用高效的開發工具。程式語言和編程規範提高程式的可讀性、可靠性,縮短開發周期,降低項目成本。為此應該在二者之間尋找一種平衡。通常可以採取以下策略和原則;
①將算法結構最佳化作為首選最佳化技術,設計高效的應用程式流程和算法;
②根據功能、性能差異和投資預算選擇高效的編譯器、系統運行庫、圖形庫、中間件等;
③使用性能監測工具識別占主要執行時間的關鍵路徑程式模組,採用一切最佳化手段對關鍵路徑代碼和程式模組進行最佳化,挖掘應用程式性能;
④非關鍵路徑的流程控制代碼按照軟體工程的要求,採用高效率程式語言和開發工具實現,提高設計開發效率。使用編譯器進行最佳化。