(中船重工(武漢)凌久電子有限責任公司 武漢 430074)
隨著VLSI技術的發展和多核結構模型理論的進一步成熟,2001年IBM公司推出第一個商用的多核處理器POWER4,至此開啟了多核處理器新紀元。經過數十年的發展,多核處理器已被廣泛應用于多媒體計算,嵌入式設備,個人計算機,商用服務器和高性能計算機等眾多領域[1]。多核系統被認為是最能滿足那些對性能要求不斷增加的嵌入式系統和高性能計算領域[2],通過增加處理器核心數目來提高性能。與單核系統相比,多核系統運行在更低的頻率范圍來減少能量的消耗以及降低處理器的發熱量,通過有效管理多指令同步執行提升多核系統整體性能[3]。
多核處理器帶來性能的提升的同時,也有其自身不可避免的缺點。在多核處理器系統中,各核心共用緩存,外部存儲空間,網絡控制器等資源。運行在多核處理器上的應用程序在共享使用這些資源同時,也會有一些信息交互[4],如果各核間不能進行有效的通信,勢必會影響系統整體性能,核間通信成為多核系統的性能瓶頸[5]。
本文選取TI公司的TMS320C6678 DSP平臺為研究對象,該處理器是8核同構處理器,采用TI最新的KeyStone架構。每個C66x內核頻率為1.25GHz,提供每秒高達40GB MAC定點運算和20GB FLOP浮點運算能力[6]。TMS320C6678處理器內部以及處理器與外部間的通信離不開多核導航器、共享存儲器、TeraNet高速互聯總線和Hyper-Link 接口[7~8],這些豐富的功能組件配合中斷機制的使用能為TMS320C6678芯片提供多種靈活的通信方法。中斷機制是現代計算機系統中的基本機制之一,它幫助系統完成對外部各種事件的響應和處理,是實現多道程序設計的必要條件。
TMS320C6678設備有8個C66xCorePac核心,每個CorePac內部集成了一個中斷控制器(INTC),中斷控制器對系統中斷源進行配置,中斷控制器允許最多128個系統事件被路由到12個可屏蔽中斷輸入(INT4~INT15)中去,這128個系統事件可以是內部事件或者外部事件。中斷控制器內部集成有Interrupt Selector和 Event Combiner部件,Interrupt Selector使得編程人員可以將這128個系統事件中的任一事件映射到INT4~INT15中的任何一個,從而完成事件響應。CorePac中總共有128個系統事件,其中4~127號事件是來自芯片內部或者外部的事件,有實際物理意義的。Event Combiner可以將第4~127號系統事件中若干個合成為0~3事件中的任一個,則系統等效有128個事件[9]。CorePac內部中斷路由結構如圖1所示。
在TMS320C6678設備中91號事件默認對應為核間中斷[10](IPC_LOCAL),每個核心通過配置中斷寄存器讓事件控制器產生91號事件中斷。主要配置的寄存器有IPCGRx和IPCARx兩種類型,其中IPCGRx為中斷生成寄存器,IPCARx為中斷確認寄存器,他們共同完成核間中斷。TMS320C6678有8個 IPCGRx(0~7)寄存器和 8 個 IPCARx(0~7)寄存器[11]。當向IPCGRx中的IPCG位寫1時,將向corex發送一個核間中斷,與此同時寄存器將相應的中斷確認寄存器的SRCCx位置1。當中斷被確認后,寄存器將SRCCx和相應的SRCSx位同時置0。通過查詢中斷確認寄存器中對應位值,中斷服務程序可以知道中斷的來源。C6678多核處理器間的核間中斷即完成一次中斷通信過程。此處的核間通信僅能起到同步通知作用,并不能傳輸數據信息。核間中斷實現過程如圖2所示。

圖2 核間中斷實現過程
DSP工作在有許多外部異步事件存在的環境中,當事件發生時他們要求DSP能夠立即去處理該事件。中斷是事件用來停止CPU當前運行的任務轉而去執行該事件的過程。事件的來源可以是芯片內部或者芯片外部,例如時鐘,AD轉換,其他外設等。
在嵌入式系統中,中斷機制可以平衡外部設備與處理器之間的速度差異,實現更友好的人機交互,是所有處理器必須具備的一個能力。在多核系統中,各種通信方式幾乎都離不開中斷機制。如SRIO通信方式[12]中有SRIO中斷,PCIe通信方式有PCIe中斷,EDMA通信方式有EDMA中斷[13]等。
中斷機制在數據通信中起著重要作用,靈活運用中斷機制能夠為系統性能帶來提升。本文基于TMS320C6678提供的共享存儲器,利用多核處理器核間中斷機制,設計并實現了一種簡易的核間通信方法,下面從通信數據結構、核間中斷請求和響應、消息發送、消息接收及消息通信過程五個部分進行詳細介紹。
在進行數據通信時,消息都是以一定的結構存放于系統內存中,稱之為通信數據結構,本文設計的通信數據結構如下:


基于TMS320C6678的存儲體系結構,將用于通信的數據(即sysMsg類型數據)存放于共享內存(如:DDR3)中,以實現多核間的數據通信。由于多核之間可相互進行通信,且多核之間并行運行,如果使用同一塊共享內存,那么多核之間必然存在競爭,可能導致系統死鎖或者數據無效,因此,需要對共享內存空間進行劃分。本文設計的通信方法為每一對通信核單獨劃分一塊固定的共享內存塊,這樣可以避免多核并行運行時系統出現錯誤,如圖3所示,TMS320C6678有8個核,兩兩組成一對通信核,因此,將共享內存劃分為28個固定存儲塊用于存放sysMsg類型數據,并且,通過sysMsg類型中的標志位域進行通信雙方的同步。

圖3 共享內存空間劃分
當消息發送方完成數據發送后,本文設計的通信方法通過核間中斷喚醒接收方進行數據接收,避免了查詢,提高了處理器利用率和通信效率。
核間中斷主要包括中斷請求(即觸發中斷)和中斷響應(即運行中斷服務程序)。其中,發送方可以通過配置核間中斷寄存器產生核間中斷,同時將發送方所在核(源核)信息保存在中斷確認寄存器中,詳細方法參見本文第二章。當接收方所在的核(目的核)響應該核間中斷時,將從中斷確認寄存器中獲取源核信息,同時處理消息數據。由于同一個核可能同時接收來自不同核發送的消息數據,因此,本文設計了一個全局中斷服務函數表gFunc,用于存放源核x對應的中斷服務函數。當目標核收到源核發送的核間中斷后,立即響應該中斷跳轉到中斷服務程序,調用中斷服務函數表中的函數進行消息數據處理。中斷處理過程如圖4所示。

圖4 中斷處理過程
完成通信數據結構定義、共享內存空間劃分和中斷服務函數設置后,通過消息發送函數進行核間通信。在消息發送過程中,首先,指定發送目的核號;其次,根據通信雙方核號查找對應的共享內存塊;然后,獲取共享資源互斥鎖,循環檢查標志位狀態信息,直到共享內存塊可寫(即標志位為0);接著,向共享內存塊中寫入消息數據,設置共享內存塊不可寫(即標志位置為1),釋放共享資源互斥鎖;最后,向目的核發送核間中斷,通知目的核接收消息。其發送流程如圖5所示。

圖5 消息發送流程圖
當源核消息發送完成后,通過核間中斷通知目的核進行消息接收,即源核將消息寫入共享內存塊后,向目的核發送核間中斷,目的核收到該中斷后,立即響應并執行中斷服務程序,并根據源核號跳轉到對應的中斷服務函數中進行消息接收處理。在消息接收過程中,首先,根據源核號與目的核號查找存放消息的共享內存塊;然后,獲取共享資源互斥鎖,循環檢查標志位狀態信息,直到共享內存塊可讀(即標志位為1);接著,從共享內存塊中讀出消息數據,設置共享內存塊可寫(即標志位置為0),釋放共享資源互斥鎖;最后,對消息數據進行處理。消息接收流程如圖6所示。

圖6 消息接收流程圖
結合消息發送流程和消息接收流程,一次完整的核間消息通信過程如圖7所示。

圖7 消息通信過程圖
消息塊結構體包含兩個成員,標志位和消息體。標志位用于監控當前傳輸狀態,當標志位為0時,發送方才能向消息體寫入數據,當標志位為1時接收方才能從消息體中讀取數據。標志位可以保證頻繁發送時,前一次發送的數據不被覆蓋。下面以核0向核1發送消息為例對傳輸過程進行說明:
1)核0查看0核和1核這一對通信核對應的共享內存塊標志位是否為0,若為0,則轉入步驟2);若不為0,則表明上一次傳輸的消息還沒處理,核0向核1發送核間中斷,并轉入步驟1)。
2)核0向共享內存塊的消息體寫入數據,并更改共享內存塊的標志位為1。
3)核0向核1發送核間中斷,通知核1進行處理消息。
4)核1收到核0的核間中斷后,進入中斷服務程序函數,對共享內存塊中的消息體數據進行處理,處理完成后更改共享內存塊中的標志位為0。
本文選擇TI的TMS320C6678開發板卡作為實驗平臺,對本文設計的核間通信方法進行壓力測試和性能測試。
壓力測試通過選取DSP任意一個核作為主核向其他從核連續發送消息,從核收到消息后立即回發給主核一個應答消息,主核收到所有的從核應答消息后進行下一輪測試,該過程持續測試4h,檢查系統是否正常運行。
性能測試通過選取任意兩個核進行通信,發送核循環向目標核發送100萬次消息,目標核收到消息后立即處理,統計發送100萬次所耗時間,并計算發送速率,其測試結果如表1所示。

表1 核間通信測試結果
經測試,該核間通信方法可以完成核間消息傳輸;在進行4h的一對多核傳輸壓力測試過程中,消息無丟失且數據傳輸正確,該方法可保證消息傳輸的有效性;在一對一傳輸速率測試中,測試100萬次,其發送速率可達到33.3萬次/s。
采用多核處理器是提高嵌入式系統性能的一個重要途徑,雖然多核系統能較大地提高系統的運算能力,但同時也給應用開發人員帶來了一些困難。嵌入式多核系統應用開發所面臨的難題之一是多核之間的通信,只有保證通信數據的有效性和實時性,運行在多核處理器上的任務才能高效并行運行,多核處理器的性能才能得到充分發揮。
本文在研究了嵌入式多核處理器架構的基礎上,充分利用多核處理器核間中斷機制,將共享內存塊作為消息載體,設計并實現了一種包含消息發送與接收的多核處理器間消息通信方法。經過測試驗證,該方法可以滿足多核處理器之間的高效、穩定通信。在后續的研究工作中,可對本方法進行功能擴展與優化,以滿足日益復雜的應用場景需求。