|
在指定的建置技術下,要將個別處理器性能發揮到極限非但不容易,也沒有效率。更快的時脈、更深的管線和更大的緩衝記憶體會佔用更大的晶片面積同時增加功耗成本,削弱了原本可提升10%性能的效益。有時候在沒有選擇的情況下,不得不將時脈速度提高並將電源和冷卻子系統升級;倘若使用將負載劃分到多個處理器的方式,不但可以增加最大整體性能限制,亦可簡化處理器設計使其更有效率。
' i. N! ? `( W) L8 {- [8 N$ s |2 r8 _) k( d* N
目前有許多系統級晶片(SoC)設計利用多處理器的優勢,但它們均針對特定應用或採用鬆散耦合方式。直到最近,針對軟體多處理方案的SoC設計選項依然受到限制。但MIPS32 1004K同步處理系統(CPS) SoC元件的推出,意味著可在單一作業系統環境下實現晶片上對稱式多重處理(SMP)。1 v% `$ w1 G, d3 x' `$ k
, O% j! ~) ~. y: y9 ?
6 \ q4 M5 P l2 E( ?) j n雖然平行編程很容易讓軟體工程師理解,但並非所有現今的程式碼都是針對平行處理平台所編寫,業界已有許多針對平行軟體的範例,其中有一些對軟體設計人員來說也相當熟悉。
, u4 y8 ^9 ?5 q! X. M6 N0 K# C! r3 L- E6 w
0 ^$ g8 J- j% ~3 {$ F+ j數據平行演算法
& Q4 e% D2 k y, m
' }( c; H# S8 ]7 u* p) s" V. e# [0 f! k5 J) q- Z0 K% f
數據平行演算法(Data-parallel algorithm)將數據組劃分到多處理器,甚至到若干個CPU中。在教科書中,可將大型資料組看作一個大量輸入檔或數據陣列;但在嵌入式系統中,它可能意味著高I/O和事件服務頻寬。在某些SoC架構中,多個輸入數據來源(如網路介面埠)可以被靜態地分配到針對自然平行數據、執行相同驅動程式/路由程式碼的多個處理器中。4 N$ T% ?- U+ C6 R! @9 d9 b
0 ^& [2 k- |8 v" d' R1 M
5 H8 G( w0 P; `- E: ]3 L當在單一資料陣列或輸入流中利用多處理器性能時,用於分割並管理資料的平行演算法就很常見。這種演算法對於單處理器來說通常不是最理想的,但由於具備了更靈活的頻寬運算特性,因此可提供效率補償。這些針對平行運算演算法均具備靈活性,但要是將一個工作程序轉換成一個平行資料演算法也許不具任何意義,甚至是相當困難或是不可能實現的,而這完全取決於程式相依性這類因素。如果絕大部分的應用程式運算都僅採用很少的常規運算迴圈來實現,那麼,為提高性能,系統設計師也許要明確地建置資料平行演算法。
' w9 n) Y+ e5 l `$ e; ]; Y
# j. y! V, ~+ c3 I; |% z+ @8 \" `7 m& Q$ Y
隨著用於PC、工作站和伺服器的多核心X86晶片問世,新的資料庫和工具套件應運而生,使得平行演算法得以輕易地在少量的處理器上實現。許多用於嵌入式架構的資料庫和工具套件都是開放且可攜的,如MIPS為GCC所做的C/C++以及Fortran擴展,也正逐漸成為標準GNU編譯器的一部分。
) q0 S0 x: t3 l5 H6 _* p2 ^1 h) n) {/ E; X& Z
4 T {) P4 d# |
平行控制編程
1 y* D. t9 s0 O" I" `% u' d, K! o8 E) _( o" q; A" o1 ]
8 f0 O; b, i# x平行控制編程(Control-parallel programming)並非根據輸入,而是根據任務分割工作。若將一個以100人製造一台汽車為單位的汽車製造工廠比喻為一個100通道平行數據演算法,並將平行控制程式比喻為一個具有100人的組裝線工作站,各工作站負責百分之一的工作量,通常組裝線的效率會比較高,但組裝一台車的工作量就只有這麼多,這樣的限制在科學程式碼擴充到幾千個處理器時非常顯著,然而對於平行SoC架構而言這並不是個問題。
! \& E4 Y1 m, D
! r3 e- `6 r! t) b" L/ ]& J7 |% `! A' \" x6 @6 s
軟體工程師通常將程式劃分成若干個階段以易於編碼、除錯和維護,並減少指令記憶體和快取的工作量。通常,平行控制分解早已設在可見的作業系統(OS)任務層。在類似於Unix的系統中,單一命令‘cc’會依序呼叫C語言前置處理器、編譯器、組譯器和連結程式。它們之中的幾個可以同時執行,每個連續程式利用前一個階段的輸出作為輸入,在類似於Unix這樣的OS內使用檔案或軟體管線。
8 G+ i5 ~- q" o5 h8 w7 c
( H. X" w! U; a+ B8 h* Z* M( b; G- Y/ `! k# l
當獨立分解的執行任務尚未完成時,需進行一些軟體工程,使應用程式在OS和底層硬體上是可見的,並能在任務間明確地傳遞資料。但是不應該需要對階段演算法進行重寫。粗粒度的任務分解可透過檔案、網路應用程式(socket)或管線的進程通訊來實現。而針對細粒度的控制,如Posix執行緒API——pthreads,可由許多OS支援,包括Linux、Windows以及許多即時作業系統。
! W6 X% Y( h1 ]" d: L7 @% r
8 y4 J+ H# [& S% z1 |- l
1 U$ a5 Q5 w4 f- [* A' w複雜的、模組化的多工嵌入式軟體系統時常會展現出意外的同步。整體系統任務很可能涉及到對應不同輸入的不同責任等多項任務。若沒有一個時間共用的OS,各任務就必須在個別處理器上執行。在一個時間共用的單處理器上,它們在輪流時間中執行;在一個具有SMP作業系統的多核心處理器上,它們能在可利用的處理器上同步執行。
1 ]1 U8 _6 l4 L# g$ t% {7 ^1 k
- V) Q3 f7 r) @6 k4 d; h: O/ {圖1a:複雜的模組化多工嵌入式軟體系統時常會展現出意外的同步。有了一個時間共用的OS,各任務就必須在個別處理器上執行。在一個時間共用的單處理器上,它們在輪流時間中執行;在具有SMP作業系統的多處理器上,它們在可利用的處理器上同步執行。圖1b:在SMP作業系統中,所有的處理器都面對相同的記憶體、I/O元件和全域OS狀態。在單CPU上利用時間分段執行的多任務程式,將能同時在一個SMP系統中的CPU上執行。- O) n! b) }5 g' X' T1 _
N+ C" _' u6 R& I2 Z
' ?0 }' M# _$ X分散式處理- J$ A( M' N$ b" X' `& \7 e8 \4 s# @
: z( Q8 e3 V' v( U8 b
3 H/ M) ]7 x* `, R% C; P/ `; y4 D$ `分散式典型運算在網路用戶端伺服器模式中很常見,它在某些時候不被認為是‘平行’的。用戶端伺服器程式設計基本上是一種控制流程分解的形式。程式任務並不是獨自執行所有的運算,而是將工作請求發送到針對特定工作設計的特殊系統任務。用戶端伺服器程式設計大多都在LAN和WAN上完成,但SMP SoC也遵循相同的範例。未作修改的用戶端伺服器二進位資料可透過晶片上的TCP/IP或空迴繞網路(loopback network)介面進行通訊,或者使用更有效率的方法,利用區域通訊協議在記憶體中傳遞緩衝資料。 ^9 X1 L8 z6 ?' ]/ u* B" \
1 u) c. C% z& G( U) [這些方法可能會被單獨或組合使用,以藉助SMP的性能優勢。有人甚至可能會建構一個分散式SMP伺服器的平行數據陣列,且各陣列均建置一個控制流程管線。
7 P2 D0 |/ A _5 g6 W j
Y$ H+ F* s% `; T, g" j1 A
; e- ^# ^6 K& T( p在SoC系統中,可以對處理器的靜態實體分解任務進行平行處理,處理器的平行任務可於硬體中完成,這可以減少軟體開銷和實體尺寸,但卻不能提供靈活性。
* {8 N: C) R( n% }3 z2 ?
( x% [5 }( T+ ?! B0 g% k5 j1 G, Q; C& N
如果可以將一個嵌入式應用靜態地分解成用戶端和伺服器,並透過晶片互連進行通訊,那麼只需要使用訊息傳遞程式碼建置一個共用協議,以便將系統互相連繫。訊息傳遞協議可提供一個抽象層,使或多或少的處理器配置都能執行一般的應用程式碼,但無論任何配置,處理器的負載平衡就如同硬體分割一樣是靜態的。要達到更靈活的平行系統程式設計,可利用具有共享資源多核心處理器系統上的軟體任務分配來實現。
a1 r9 L3 U6 B( V, q0 v+ @7 B0 q. g8 ?1 e" k' u
1 t* L% N. W: X$ G. a0 k! ?
在SMP作業系統中,所有的處理器都面對相同的記憶體、I/O元件和全域OS狀態,這使得處理器間的程式移轉更簡單、更有效率,也更容易平衡負載。不需要額外的編程或系統管理,在單CPU上利用時間分段執行的多任務程式,將能同時在一個SMP系統中的CPU上執行。如同Linux,一個SMP的排程器可切換處理器的程式。
* z* c# }/ r. \0 m9 H) e/ m) r; X$ o% G' V8 u, l
* l9 l, }2 F, x; D U
執行多個處理程序的Linux應用程式不需要修改,就可以利用SMP平行特性,而且通常不需要進行重新編譯。SMP Linux環境為可用處理器之間的調整提供了許多工具,如提高/降低任務的優先順序,或是對於在處理器子集上執行任意任務加以限制。要使用不同的即時排程體制,必須要有適當的核心支援。
$ G6 F5 ~& s# z. g4 ^: u r1 {6 o" g4 b2 Q7 a# H! S
0 K, k& ?1 O$ W' @& B3 P* p( ?
類似Unix的OS能為應用程式提供一些針對相關任務優先順序排程的控制,甚至在單核心處理器時間共用系統中也是如此。傳統的外部命令和系統呼叫指令在Linux系統中被強化,藉由更精緻的機制排定任務優先順序、任務組或特定系統使用者。另外,在多核心處理器配置中,任一Linux任務都具有一個參數,用來指定那一組處理器可排定任務。預設參數即為整個系統處理器組,但這種具有類似於CPU的系統處理器組卻是可控制的。/ ]2 |' [; D, _+ _) ~0 K: y
' W9 k9 Z% ]& k/ P: e# c& L. C: W) e& j' @4 j/ b
SMP範例要求所有處理器找尋所有相同位址下的記憶體;對於低性能的處理器,必須透過將所有處理器的指令預取和載入/儲存流通量,置放在一個共用的記憶體和I/O匯流排上來達成。然而這種模式隨著處理器的增加而失去效用,因為匯流排會成為瓶頸。即使在單核心處理器系統中,高性能嵌入式核心的指令和數據頻寬需求亦支配了主記憶體和處理器間的緩衝記憶體。
1 B, x, C( S* ~5 z% n- r5 B. P
. M4 j5 f& K6 ^# H8 D3 k
/ m" B2 c8 |% [ p8 Z- }, `在一個每顆處理器均具備獨立快取的系統中,其本質上已不屬於SMP,當一個處理器的快取保存了記憶體中唯一一個最近位置值的複製數據時,這時不對稱就產生了,必須加入快取一致性協議來恢復對稱。
J! c' d t; k4 d6 I% b+ X) f' I: v9 r! ?+ {
, N0 ^8 J2 R$ H# x8 h
在一個所有處理器都連接到一個公共匯流排的簡單系統中,快取控制器可監控匯流排,以得知哪一個快取記憶體保存了指定記憶體位置的最新版本。在更先進的系統中,是利用交換結構的點對點的連接將處理器連接到記憶體,因此快取一致性需要更高度的支援。一致性管理單元應該對記憶體執行施加全域指令,產生干涉訊號來維護處理器核心間的快取記憶體一致性。; i( g# r" L+ [. |- d7 ?2 `
( i7 a0 t6 @' k" ^: y
6 N5 g9 o& C, L; D! n像Linux這樣的SMP OS可自由地轉移任務,動態地均衡處理器負載。在嵌入式SoC中,絕大部份的整體運算可以在中斷服務中執行。好的負載均衡和性能調整必須對發生中斷服務的地方進行控制。Linux OS具有一個類似於IRQ的控制介面,可讓使用者和程式確認哪一個處理器負責指定的中斷服務。
9 Z# t4 o( S7 \$ P' _
, ^" }. @% Z1 o1 M- C) X
' d& t5 L" J) L* f6 g; T快取憶體一致性基礎架構很實用,不僅在SMP的處理器間,在處理器和I/O DMA通道之間也相當有用。若是使用軟體的方式,便需要在每個I/O DMA作業之前或之後利用CPU來處理DMA緩衝器,對於I/O密集的應用而言,性能將大受影響;而使用I/O一致性硬體將I/O DMA連接到記憶體的方式,可以對DMA串流進行排序,並與一致的載入/儲存流程整合在一起,免除了軟體的開銷。# w- J9 T* x4 G6 [- ?/ q
5 r& `0 w" m7 } @
/ r% R5 Q3 N; N" k L& `4 j Y快取一致性管理單元應該對處理器、I/O和記憶體間的記憶體串流施加命令,這可增加處理器記憶體存取時間的週期,透過管線停滯產生處理器週期損失的結果。然而,一些如在單一核心上使用硬體多執行緒的方法,可允許單核心執行並行的指令串流,以增加管線的效率。4 z: `% Q5 ]0 ]
9 G/ Q% q+ _5 u1 O' D
. J$ @- z% P, X. A: }5 U9 P
各核心的執行緒看起來就如同OS軟體中完善的CPU,包括具有獨立的中斷輸入。執行緒共用相同的緩衝記憶體和功能單元並插入到它們的管線執行中。若一個執行緒停滯了,另一個可以繼續執行,讓一致性記憶體子系統延遲週期循環下去,否則將會遺失。管理多核心的相同SMP OS可以管理它們的硬體執行緒,針對SMP編寫的軟體可運用多執行緒處理,反之亦然。2 X: `# N. w" S2 }9 b& `& Y+ T) r
, c3 h4 f, C2 Z# [1 ^: D2 l# s% G- \7 Y2 `$ Z3 b/ D
若兩個執行緒同時爭取一個管線,其性能相較於在許多獨立核心上兩個執行緒來得更低,應該對SMP Linux核心進行負載均衡最佳化。對於功耗最佳化,排程器可以將工作一次一個載入到一個核心的虛擬處理器上,使其他的處理器處於低功耗狀態。在性能最佳化方面,可以將工作分配到許多核心上,然後將多執行緒載入到每個核心中,直到所有的核心都有一個進展中的任務為止。
! U( E' L! S$ _; E% Z; j3 t3 L
# u& {$ d6 g! @4 ^, E7 u
" c" f, N/ j# Z- W- x" o利用晶片上多處理功能可實現高SoC性能。SMP平台和軟體提供了一個具有靈活性的高性能運算平台,能大幅提升單一處理器的速度,而這通常只需要稍微、或者根本不需要修改應用程式碼。( d& C8 p% F# {9 r4 v; \
1 P, r: `+ J/ h- d% E! n4 ~
. n8 v) n, x, g
, r3 {0 w% V9 y$ q( ^4 |
作者:Mark Throndson
( E# ^( O9 \" i% K7 s: W9 i# R! w S8 z! R8 t) }% B1 Y
處理器事業部產品行銷總監. o/ ~% Z; J6 r+ P0 N
' t+ z5 V- w- F- D+ t
MIPS公司
+ H+ x% ?$ U1 ^/ e+ c
$ ?+ {: e' Z. |1 n[ 本帖最後由 masonchung 於 2008-10-11 09:41 PM 編輯 ] |
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號?申請會員
x
|