|
多核心的風行無疑對嵌入式網路市場形成了巨大衝擊,但人們已開始清醒地認識到,在做出如何對多核心進行應用劃分的決策之前,還需要對許多重要的架構細節進行仔細檢查。& x) i! d$ F$ M. ^) z/ A3 V
0 F8 m; w+ T& I. K
目前用於網路設備的多核心處理器通常瞄準的是企業級接取路由器,不過即將上市的新型多核心處理器可以提供比2層和3層路由更多的功能。許多網路公司將加入如4-7層的高層業務,目的是在過去已部署到網路中的一些設備中增加一些特殊功能,以實現產品的差異化,因而降低網路方案多樣化所增加的營運成本。目前市場上的許多系統都是在單核心處理器上執行它們的控制平面和數據平面以及所有的附加業務。然而,單核心已經達到系統功率預算所確定的頻率極限,這是一個利用電晶體技術不易解決的問題。於是,下一代系統對更高性能和更廣泛差異化業務的需求,使得這些系統成為多核心設備的理想選擇,能在不超過由系統所在地和最終用戶經濟實力所確定的功率預算條件下,幫助系統供應商提高系統性能並增加新服務。多核心處理器只需透過簡單地降低核心頻率,以便使用更一般的電晶體技術,即可提供優異的每瓦性能,進而節省晶片面積、降低靜態和動態功耗。# W' B4 c4 }7 q1 d7 r) n: c$ K1 u# U
m6 S" \1 f+ R6 L# {$ }
3 }! M4 L) c( m" k劃分控制和數據平面. m- X9 g% U! E
# Q. l2 H. |; V& p% C
* n: Z8 d) U% m8 N' V8 @
在設計一個完整方案時,首先需要做出的應用決策之一就是如何在多核心之間劃分控制平面、數據平面和業務。目前的多核心元件工作頻率可從600MHz到2GHz,核心的數量從2個到16個,而某些特殊處理器的核心數量甚至更多。必須確定一個特定應用的控制平面是否可以執行在多個核心上,如果可以,需要多少核心才能提供所需的控制平面性能。如果控制平面是不友好的,以至於無法在多核心上執行,那麼這些核心的速度將由應用控制平面所需的性能水準來決定,這是一個迅速消除一些低速多核心處理器的標準。
1 _ i/ I, P) |! X8 C5 c! e( e7 b6 w5 S9 R( q# D( ^/ A
7 `6 I% o* ^$ ?8 m
另外,如果控制平面軟體可擴展到多核心,那麼在未能從應用程式本身擷取核心數量的底層作業系統條件下能這樣做嗎?由於許多控制平面的任務不能擴展到不對稱多處理(AMP模式)工作的多核心上,這種擷取工作通常只能由支援對稱多處理(SMP)的作業系統來實現。但事實證明,當核心數量超過2個後,性能的提高就不怎麼令人滿意了:寶貴的CPU週期被浪費在SMP協調任務上,而效率隨著核心數量的增加變得更低。高出很多倍的控制平面處理需求可以促進應用程式在具有更高速度的多核心元件上執行,允許控制平面保持在單核心上,或者(最多)是雙核心上,同時滿足應用控制平面的性能需求。& P; N: k+ Y3 F+ A i+ ]9 I w
. e' }! @/ K/ n3 A3 e$ H* O4 o7 R5 {9 e7 h: c+ C4 O8 K/ e p' Z
數據平面的程式碼就是封包處理程式碼,很容易在平行工作的多核心上執行。這種程式碼在多核心上的劃分比較容易,因為多核心執行封包處理數據路徑程式碼的同一例程,封包數據可以平行處理。有兩種主要應用模式適用於多核心上的封包處理。第一種模式採用了嚴格的流關係,可確保處理彼此之間沒有直接關聯、因此沒有共享狀態的封包數據的多核心之間具有有限的甚至是零同步。為了能夠同時使用多個核心,並讓預處理器執行算術運算,這種方案要求作出相對低等級的決策。
6 ^6 E# b' z/ }% R7 A0 ~% A, y3 M5 V [) H" u0 L. p
( ? |: r% a( C2 G2 u$ N6 F在第二種模式中採用了一個比較簡單的調度演算法,這意味著可以採用多個核心來同時處理同一數據串流中的封包數據。封包排序和共享數據結構的鎖定必須在硬體或軟體層實現,以確保封包排序得到保護,共享內容得到至少少許的更新(有時還要按正確的順序)。因為共享數據結構上的等待將產生空閒核心週期,因此最佳化這些程式碼(以及某些類型的硬體卸載)有助於減少更新共享數據結構時的性能損失。透過將核心移至下一個封包同時讓硬體保持排好的佇列,次序恢復的目標硬體卸載功能還可以釋放一些核心週期。1 ~" G4 O% |6 e+ m
8 @* X% k! [' p/ e
圖1:IP業務路由器實例(混合的控制和數據平面)。
3 Q' p6 ~- i6 Z( |* E; M; p8 r3 b, z4 u, l( G7 z! F- H
5 \! Z1 I' `' ^9 B1 z9 Q- z5 W5 ?4 U6 m7 D多核心劃分和I/O連接$ |+ T) F) H" M
) a- |3 Y" k- t/ ~7 a
* S: p( c0 X7 M% M5 C這些新型的多核心在I/O方面提出了有趣的挑戰。許多時候,將特定的I/O介面靜態連接到特定的核心是無法接受的。對多核心上資源共享的需求會影響到具體的應用劃分。在接取路由器應用中,許多I/O將接收封包數據並提供給核心進行處理,這就像目前的許多方式一樣,將數據智慧地分配到想往公共I/O發送數據的多核心上。目前許多方案都包含一些有助於封包數據分配的硬體加速封包解析和準入分類功能,但即便是一個很簡單的方法都需要採用一個或更多的核心來執行程式碼,以確定將輸入進來的數據發往何處。有時候,當某個核心被作為分配機制時,軟體在處理器之間的移植可能更加容易,但這個核心可能成為不僅是元件本身、甚至是整個系統的性能瓶頸(設想一下用於服務10Gb/s乙太網路鏈路的單核心,卻只能進行分類以及向其他核心分配數據,其結果可想而知!)
3 y" H H" g8 a5 y3 J3 _$ j; i3 o: U8 J0 Z0 u7 g
) ?5 F/ L' _9 j) a1 f+ u( G如上所述,核心頻率將不斷下降而低於處理需求(還可能伴隨著I/O速度的不斷增加),因此重要的是要確保封包數據分發機制不能成為瓶頸,而且要有足夠的靈活性來確定每個封包的初始目的地。輸出核心需要能夠將封包下傳給I/O,並繼續向前傳送,而不必去協調多工封包分割機制中的I/O使用。這需要一定水準的I/O虛擬化功能,且這些功能必須用硬體實現。+ z( m) n2 J: `* @6 s: P; T
9 L: q. m4 X, l+ M+ C+ g Z
圖2:飛思卡爾的多核心平台架構技術。4 y8 Y/ h3 H+ D; \! o W
% L; k# u, B; w多核心之間的資源共享# A" O% M% J; E( A
! V% G4 ]$ f5 w
; ^2 j1 F/ g! ]) `( ^. G2 _9 G/ h0 s3 H多核心之間的應用劃分也意味著所有共享資源的劃分,例如外部記憶體和晶片上快取記憶體等。隨著單顆晶片上核心數量的增加,外部記憶體頻寬和晶片上二級快取記憶體卻沒有增加,這是由於接腳數量和晶片尺寸所限。由於控制平面、數據平面和業務程式碼都具有不同大小的指令、進程狀態和共享數據,因此多核心處理器必須能夠高效地劃分記憶體資源。晶片上的快取記憶體分配機制和快取記憶體層次越靈活,性能就越好。當多核心共享快取記憶體這些資源(如快取記憶體)時,快取記憶體‘垃圾’將越來越多,因為每個核心上的應用程式都會驅逐出其他核心上的應用程式正使用的數據,因而引起SoC上的性能衝突,並造成一些核心完全耗盡外部的DRAM。/ P# q- ^) j( {7 [" i
) k, j0 ?1 \* B
; ?) f6 ?! F) I! z
在絕大多數應用中,理想的解決方案是專用快取記憶體和共享快取記憶體相結合,也就是說為一些核心配置中等大小的專用快取記憶體(針對非共享狀態),同時配置一些較大的共享快取記憶體(針對共享狀態和非共享溢出)。這些共享快取記憶體能以這種方式靈活分配,即一個核心上的進程和應用程式不會影響其他核心上執行的應用程式所使用的快取記憶體數據。其重要性不僅在於性能因素,還因為必須提供用於存取保護的硬體機制。這樣做的結果是,在某些核心上執行的某些軟體應該與執行在其他核心上的其他軟體相互隔離。這將允許在一個整合平台上同時包含信任軟體和非信任軟體,並且無需擔心不良程式碼影響關鍵程式碼的執行,這還有助於確定僅對與特定功能相關核心造成影響的軟體缺陷。% V8 J8 r8 x/ ]; |/ E2 H
1 D+ w* w7 R$ I' C. K5 D0 k. j
% y: b: D$ Q) I7 k/ A9 V+ E另外一個需要解決的問題是核心對共享資源的使用,如硬體加速器(它包含了圖案匹配和加解密引擎等功能)。這些硬體資源需要支援更高層的功能,像防止入侵、虛擬專網以及目前企業市場需要的更高性能等級狀態防火牆等。如何控制這些資源,並使每個核心能夠得到分配給它的共享資源呢?可以用專用指令的方式在每顆核心中增加硬體加速功能,或者增加許多核心共享的後備加速器。為了更好地利用硬體加速功能,必須對封包處理程式碼進行特別設計。如果在核心中增加處理功能,加速可由所有核心均等使用,這樣做最容易編程,使用也最容易,但很少能實現最佳性能。因為如果任一核心在執行並不需要特殊加速資源的程式碼,其他核心便無法使用這些資源,於是便出現這種分散式加速中常見的低效率。不過,為多核心劃分軟體時,出現所有核心都需要相同的加速資源這種可能性是很小的。$ \0 d1 X) \& C
1 T" p7 i+ |+ H. U! m+ o1 L4 _8 L# e6 b$ n
該方案的另一種低效率表現,是為不提供卸載功能的特殊任務最佳化指令而出現加速。一個很好的例子就是,一顆核心若非在做正常的封包數據處理,就是在使用執行單元執行加速任務。當該核心在執行這些最佳化的指令時,將不能轉去處理其他的封包數據。後備加速的封包處理程式碼可用於處理封包,它會將一個封包傳給加速器處理並開始處理另一個封包,非常像‘管線’的處理方式。加速器在完成它的任務後將封包數據返回給核心做進一步處理。這種類型的加速允許核心充分發揮加速器的性能。儘管向加速器發送指令或接收來自加速器的指令將產生一些開銷,但由於加速器在處理封包的同時,核心被釋放去做其他的處理任務(即加速和卸載),因此整體上增加了核心的每週期指令數。這種方法還需要一個硬體虛擬化服務,以便核心可以發送任務到加速器或者從加速器接受任務,而不依賴軟體從中協調。
5 u4 L5 L, t( f( a
8 [! O( q0 J9 J4 F, `$ w* @* Z8 D6 R @2 W+ j) k" T( f3 J
單核心元件已經跟不上網路設備用戶的性能需求。隨著網路頻寬及對高層服務需求的增加,多核心產品將是滿足目前封包處理需求的唯一解決方案。目前的多核心處理器包括了許多共享資源,像I/O、快取記憶體和外部記憶體等。為了保證高度先進的網路實現所需的性能等級,加速器也越來越重要。對於從事先進的網路設備設計軟體工程師和系統工程師來說,所有這些因素都使得在多核心之間劃分控制平面和數據平面程式碼成為特別重要的問題。
5 k) [( U t' D: V4 I8 m$ A) x. j% V1 q
( x/ l. }2 f- m4 {) Z
# W6 g6 {3 L. `/ |% |/ K( x3 @$ s對於在相同元件上同時支援控制和數據平台程式碼的應用程式而言,在多核心處理器上劃分接取路由器用的軟體可以提供很大的靈活性。& S0 V0 f0 q8 R
* O% L' y4 H/ {* f1 l. K" r
9 @. l" |2 p( l: W- E+ K$ J2 W3 ^: _# B' u) m; n$ h
9 [2 R, }1 U" ]7 e4 c, c% r7 E
) g' u1 H, @# p9 F! n4 l' R' h& m2 W
作者:
0 q0 }6 _5 s9 A, [# M9 K" i( H/ c4 n9 M0 [' C. s' R
David Kramer9 V9 A2 G1 C5 O
7 M. w- a& e+ d2 gIP開發部門首席架構師. \0 c7 R4 t" i4 E$ C- ]3 ^
2 j* R3 ^5 R4 v2 a; t$ k0 u" [6 b$ Y! o
Steve Cole( @# h3 \" U0 z
6 _/ I- z/ V( r1 y8 r7 v網路與多媒體部門資深系統架構師' R- \+ J$ ^5 s( h! y
, L; C" Z% }1 m4 E
飛思卡爾半導體公司 |
本帖子中包含更多資源
您需要 登錄 才可以下載或查看,沒有帳號?申請會員
x
|