可重構硬件操作系統BORPH是面向可重構計算系統設計的操作系統,目標是增強可重構平臺的易用性,提出硬件進程來抽象硬件功能邏輯。正如軟件進程運行于通用處理器(general purpose processor,GPP)上,硬件進程則在可重構硬件上執行。硬件進程與系統其他部分的通信符合UNIX語義的進程間通信機制實現。應用開發人員只需要開發硬件進程即可完成可重構平臺應用的設計,BORPH將這種模式概括為硬件為中心的執行模型。
當前的BORPH實現中存在以下3個問題:
1)不支持共享存儲平臺,無法支持基于共享存儲的進程通信方式。由于BORPH設計時面向的可重構平臺BEE2為分布式存儲,所以硬件進程與系統其他部分通信基于消息傳遞方式實現,效率較低。
2)軟硬件進程問的數據傳輸仍然需要通用處理器控制,加重了GPP的負擔,并且數據傳輸受限于GPP獲取數據的速度。例如BORPH中提供的文件訪問功能,需要系統軟件負責從磁盤讀取文件,而磁盤讀取速度遠遠小于對系統主存的訪問速度,這決定了該方法難以高效。
3)對硬件進程的系統服務支持是通過硬件模塊的方式提供,不便于使用且難以擴展。
BORPH軟件框架最早在分布式存儲的BEE2平臺上進行了實現,主要是面向海量信息處理等規模較大的并行處理任務。而普通用戶平時使用的通常是基于PCIE總線的可重構處理平臺,即FPGA以板卡形式插入普通PC的PCIE插槽中。由于FPGA可以通過PCIE訪問系統主存,所以本文將該類可重構計算稱為共享存儲可重構計算機。與大規模的海量信息處理相比,該類可重構處理平臺通常面向對進程間數據傳輸和同步的效率進行了優化,優化關鍵是減少GPP和FPGA之間通過中斷機制交互的次數。當FPGA上運行的硬件進程需要進行數據傳輸和同步時,不需要GPP協助進行,而是獨立完成,從而避免了GPP和FPGA之間頻繁的交互。
1.BORPH-N簡介
1.1 系統層次結構
本文首先將BORPH系統移植到由GPP和FPGA組成的可重構計算平臺上,同時調整了FPGA片上邏輯的實現,添加了嵌入式標量處理核。因此硬件進程不僅包含硬件模塊,還包括運行于該嵌入式標量處理核的軟件部分。本文將經過移植和擴展的BORPH系統稱為BORPH—N,圖l為BORPH—N的層次結構圖:
Fig.1 BORPH—N layer.
圖1 BORPH—N系統層次結構圖
在BORPH—N硬件層,GPP通過前端總線(front side bus,FSB)連接到存儲控制集中器(memorycontrol hub,MCH)中,FPGA則通過PCIE連接到存儲控制集中器中,兩者共享系統主存。FPGA內部邏輯采取半定制方式設計,部分邏輯為基礎硬件系統,主要包括嵌入式處理器、On-Chip RAM、片上總線以及PCIE總線接口等,用于支持BORPH—N系統的運行,其余部分為用戶自定義功能模塊,用于具體的功能邏輯實現。
在操作系統層,GPP上運行的系統軟件包括標準的Linux內核以及一個內核的擴展模塊:硬件進程代理。硬件進程代理主要負責管理FPGA,響應來自FPGA的系統服務請求。由于嵌入式微處理核的支持,用戶可以方便地在FPGA上進行軟件設計,所以BORPH—N中硬件進程除了包括硬件模塊外,主要是指FPGA上的嵌入式軟件部分。面向硬件進程的系統服務接口也以軟件形式即微內核(microkernel)提供,而不是硬件形式。
圖1中右側上方為原始BORPH中硬件部分的層次結構,BORPH中硬件進程為一個硬件邏輯模塊通過與一個或多個系統服務模塊IOC相連來與系統交互(硬件進程的設計體現為通過硬件描述語言設計硬件模塊)。在BORPH—N中,硬件進程的主體變為在FPGA內嵌入式處理器上運行的軟件模塊,該軟件模塊通過調用BORPH—N提供的軟件接口與系統進行交互,用戶也改為通過編寫軟件代碼來設計硬件進程。硬件功能邏輯則根據硬件進程的實際需求進行設計,通過標準接口與FPGA片上系統相連,并且也由軟件負責控制。本文認為BORPH—N的結構調整有以下優點:
1)從程序員視角看,為硬件進程提供的系統服務接口是軟件形式的。用戶通過在嵌入式處理核上設計軟件,調用系統服務接口來與系統交互,與硬件接口相比,設計難度明顯下降,并且接口擴展性也更好。
2)從內部實現看,硬件進程中的硬件邏輯部分接口標準。BORPH中硬件邏輯與IOC相連,接口不標準,BORPH—N中硬件邏輯與標準FPGA片上總線相連。標準接口可提高用戶邏輯的通用性,并且FPGA廠商提供的庫可降低用戶設計硬件進程的困難。
1.2基于共享存儲的進程間通信
本文為硬件進程提供了基于共享存儲的進程間通信方法。共享存儲符合System V的標準,軟件進程可直接通過System V IPC訪問共享存儲。進程通過調用shmget()建立一個共享存儲段。其他擁有合適權限的進程可以通過shmctl()對該共享存儲段進行各種控制。進程可通過shmat()將創建后的共享段連接到本進程虛擬地址空間,并進行讀寫操作。每一個共享段都通過一個shmid進行標識。
當多個進程對同一個共享段進行寫操作時,需要同步機制來確保正確訪問。本文使用信號量來避免不一致以及訪問沖突。與System V信號量相比,POSIX信號量實現和使用開銷更低,所以本文采用POSIX信號量。進程通過sem_init()建立和初始化信號量,在訪問共享資源之前通過sem_wait()來獲取控制權,訪問結束后通過sem_post()釋放控制權。
本文為硬件進程提供一組包含上述函數支持訪問System V共享存儲和POSIX信號量的API。為了能夠支持數據在主存和FPGA On—Chip RAM之間傳輸,BORPH-N增加兩個API函數:cpy—from—vm()和cpy—to—vm(),分別用于將數據從虛擬存儲拷貝到FPGA片上存儲器和將FPGA片上存儲器數據拷貝到虛擬存儲。注意由于shmat()得到的虛擬地址,所以這兩個API函數操作的地址都是虛擬地址而不是物理地址。嵌入式軟件的設計基于該組API進行,對于系統中其他部分,硬件進程和軟件進程是一樣的,除非它執行在FPGA上。
硬件進程通常負責進行數據處理,初始化完成后通過一個持續執行的主循環來進行反復多批次的數據處理。在BORPH—N中,典型的程序結構如圖2所示。初始化階段建立共享存儲段和信號量,這兩個調用只會在初始化階段發生一次(如果發生對多個信號量和多個共享存儲段的訪問,則初始化階段也要發生多次)。然后是主循環,對共享存儲的訪問通過信號量進行互斥,其中關于信號量和虛擬存儲的訪問隨著主循環反復執行,需要反復執行以讀寫數據,因而對硬件進程性能至關重要。
Fig.2 Typical program structure of hardware processes.
圖2 硬件進程典型程序結構
2.基本實現
本節介紹BORPH—N系統的基本實現,分別介紹FPGA的硬件片上體系結構和軟件部分的設計。
2.1片上體系結構
FPGA片上體系結構主要部件包括NIOS2,On—Chip RAM,PCIE Compiler,SGDMA(Scatter-Gather Dirdct Memory Access)和用戶功能模塊,這些部件通過Avalon總線相連。下面簡單介紹這些部件的功能和配置。
NIOS2是Altera提供的廣泛用于FPGA的軟核處理器。該軟核處理器的高度靈活性滿足了成本敏感、實時等應用的各方面需求。本文使用的NIOS2為無操作系統支持的標準版本。
PCIE Compiler是Altera提供的PCIE總線與內部Avalon總線的協議轉換器。本文配置的轉換器為PCIE 2.0 1X的端節點,硬核實現,帶Avalon—MM接口。支持Burst傳輸,讀Burst負載最大為256 B,寫Burst負載最大為128 B。
On—Chip RAM直接采用Altera提供的庫實現。主要作為FPGA部分的軟件管理片上存儲器使用,提高應用執行效率。
用戶自定義功能模塊根據硬件線程的功能需求進行設計,必須能夠與Avalon總線相連。用戶通過NIOS2上運行的軟件控制功能模塊運行。
2.2軟件
軟件主要包括兩部分:運行于GPP上的硬件進程代理和運行于FPGA中NIOS2上的微內核,這兩部分協同工作為硬件進程提供系統服務支持。
1)硬件進程代理
操作系統對硬件進程的管理和服務支持以代理方式設計。每一個硬件進程都有一個軟件代理進程與之對應。軟件代理進程啟動后負責配置FPGA并下載嵌入式軟件代碼,申請系統資源供硬件進程使用。最后注冊中斷響應函數,等待響應來自硬件進程的服務請求。對系統其他部分而言,代理進程即是硬件進程。
2)微內核
微內核運行于NIOS2上,負責嵌入式軟件運行環境的初始化并為應用程序提供服務。初始化過程包括初始化C運行時庫,注冊中斷信號處理函數,以處理來自GPP的中斷信號,最后調用硬件進程標準人口點函數進入用戶程序執行。在通用多核處理器上,用戶進程需要請求系統服務時通過trap指令轉入系統內核,系統服務本質上是對內核數據結構的操作。由于性能和數據結構復雜性的緣故,FPGA難以在本地完成硬件進程需要的系統服務,所以在本文基本實現中,所有面向硬件進程的系統調用都是以遠程調用的方式實現,即請求由FPGA發出,GPP響應。GPP和FPGA之間的消息傳遞機制基于PCIE Compiler內的Mailbox實現,該Mailbox支持雙向的數據傳輸和中斷發送。
3.優化
根據1.2節中基于共享存儲的進程通信方式,硬件進程會反復調用cpy—from一vm(),cpy—to一vm(),sem—wait(),sem—post()這4個函數來獲取輸人和寫回輸出。其他管理類函數如建立共享存儲段和建立信號量在進程單次執行中通常都只執行一次,而這4個函數隨著進程主循環的反復執行需要反復調用,所以其執行效率至關重要。本節針對這4個函數,以進程從共享存儲獲取輸人數據進行處理為例,討論本文優化的基本思路。
圖3示出采用3種不同軟硬件協同方式時FPGA獲取輸人數據并進行處理的過程。為避免繁瑣,圖3中省略了數據處理完成后寫回輸出數據的過程。輸入數據通過訪問共享存儲段獲得,使用信號量對共享存儲段訪問進行保護。整個過程分為兩部分:獲取輸入數據和數據處理。圖3中從左向右的箭頭表示數據傳輸過程,折線段表示FPGA的數據處理過程。
Fig.3 Three types of software—hardware CO—operation.
圖3 GPP控制、遠程調用和FPGA控制的流程比較圖
圖3(a)表示以硬件為加速設備的軟件進程的設計方法。該方法針對信號量的操作,與FPG沒有關系,完全由軟件執行。通過系統DMA來控制數據傳輸過程,注意該DMA位于系統總線上。數據傳輸之前軟件需要對FPGA的接口寄存器進行配置,指示將要發生的數據傳輸。待數據傳輸完成后軟件再次向FPGA發出命令,指示數據傳輸完畢。輸入數據傳輸完畢后,軟件向FPGA發出進行數據處理的命令,最后軟件需要等待來自FPGA的執行完畢的信號。
圖3(b)則是采用硬件進程概念的基本實現,表面上看信號量操作和數據傳輸均由NIOS2執行,但實際上所有的操作仍然是由軟件完成,這種方法反而增加了GPP和FPGA之間的交互次數,降低了效率。
對比圖3(a)(b)兩種方法,可以發現它們的軟硬件交互過程是相反的:圖3(a)中需要交互時GPP主動發起請求,圖3(b)中則是FPGA主動發起。圖3(a)中由于主體程序運行在GPP上,關于系統的操作,如信號量等不需要發生交互,而關于FPGA的操作,如數據傳輸、數據處理等則需要發生交互。圖3(b)中主體程序運行于FPGA上,關于FPGA本地的操作不需要發生交互,如數據處理,FPGA在獲取到數據后可自行啟動數據處理過程。其他包括信號量的操作等需要向GPP發出請求,并等待響應。
圖3(c)則是本節將要討論的優化實現,主體程序仍然在FPGA上運行,但信號量操作和數據傳輸都由NIOS2單獨完成。考慮到NIOS2頻率較低,只要保證執行在NIOS2上的代碼非常短,即使相比在GPP上執行開銷略大,但與取消兩者之間的交互帶來的性能提高相比則非常小。該目標的完成有兩個條件:NIOS2能夠獨立地通過虛擬地址進行數據訪問和獨立地完成原子操作,從而實現對信號量的獨立正確訪問。下面分別對這兩方面進行討論。
3.1 獨立虛擬存儲訪問
cpy—from—vm()和cpy—to—vm()類似,本文以cpy—from—wm()為例討論優化方法。優化的cpy—from—um()實現分為地址翻譯和數據傳輸兩個過程。第1個過程將虛擬地址翻譯為Avalon內部總線地址,這一步根據頁表和所需要訪問的虛擬地址對PCIE Compiler進行設置,以保證通過內部Avalon地址對PCIE Compiler的訪問能夠正確地映射到對主存物理地址的訪問。第2步控制數據在on—ChipRAM和PCIE Compiler之間傳輸。
Linux將可用的物理存儲器分割為4 KB的頁面。PGD(page global directory)和PTE(page tableentry)兩級組織的頁表用來描述虛地址與物理地址的映射關系。虛擬地址分為3段,前兩段分別是指向PGD和PTE的指針,最后一段是偏移量。PGD和PTE兩個表格都存儲在內核空間,物理地址是虛擬地址減去0xC0000000,所以FPGA可以通過物理地址直接訪問PGD和PTE,完成虛擬地址到物理地址的翻譯。
圖4示出FPGA進行地址翻譯的過程,該過程將虛擬地址映射為本地Avalon地址,這樣NIOS2或Avalon總線上的其他部件通過訪問該本地地址即可訪問到所需的進程虛擬地址。給定需要訪問的虛擬地址,首先查詢PGD和PTE來得到物理地址,物理地址的高22位即為物理頁的首地址。該起始地址會寫入PCIE Compiler的地址轉換表中。然后,所有來自Avalon訪問PCIE Compiler的訪問都會自動轉換為對物理地址的訪問事務,每次只有4 KB的地址被映射。
Fig.4 Translation of local address to host physic address.
圖4 本地地址向主機物理地址的翻譯
PGD和PTE中的空人口意味著發生頁錯誤。由于處理頁錯誤的過程比較復雜,FPGA難以獨立完成,本文采用與EXOCHI中CEH類似的方式處理頁錯誤。關于該頁錯誤的消息會發送GPP,當頁錯誤發生,GPP會代替FPGA處理該頁錯誤。
第2個過程在PCIE Compiler的支持下較容易完成。PCIE Compiler將讀寫請求自動轉換為對PCIE總線的讀寫請求,就能夠完成數據從On-ChipRAM到主存的傳輸過程。On—Chip RAM和PCIECompiler之間的數據傳輸過程可通過簡單的數據拷貝完成(如memcpy)。但這種方法效率非常低,由于數據傳輸的性能至關重要,所以本文在FPGA內添加了SGDMA組件來提高數據效率。
在傳統多核處理器中,Cache一致性保證了多個處理核具有相同的存儲視圖。當前的MCH通常支持Snoop存儲一致性協議,即保證主存GPP內部Cache的一致性,也保證了FPGA對主存訪問的正確性。但FPGA內部的On—Chip RAM無法與GPP內部Cache保持一致,所以硬件進程必須負責管理On—Chip RAM。
3.2定制同步存儲單元
sem—wait()操作首先判斷信號量是否大于0,若大于0則將其減1,繼續執行,否則等待。sem—post()將信號量加1,并喚醒所有等待該信號量的進程。本文將這兩者統一為1次對信號量的原子訪問,以及可能的堵塞等待或是喚醒操作。如果對信號量的訪問可在本地高效進行,則可極大地減小sem—wait()成功以及進行sem—post()的延遲時間開銷,因為sem—wait()成功時不需要等待,sem—post()時只需向GPP發出信號,不需要等待該信號返回。而如果sem—wait()不成功,則時間開銷是不可避免的,硬件進程將進入等待GPP信號的狀態。
POSIX信號量實際上是1個16B的整型變量,對其訪問必須滿足原子性要求,所以本文優化的關鍵問題就是FPGA如何對1個16 B的整型變量實現原子操作。常見的硬件原語操作支持包括compareand—swap,fetch—and—add等,原語操作的關鍵在于保證讀和寫之間的原子性。例如fetch-and—add,實際是1次讀訪存操作,然后進行加法操作并將結果寫入存儲單元,必須保證讀和寫之間沒有其他指令對該單元進行訪問。多核x86體系結構硬件上對該原子性的支持通過前端總線的鎖定信號FSBLOCK實現,該信號指示一個原子事務需要執行。
而在本文的硬件平臺中,由于FPGA是一個PCIE端設備,不具備鎖定前端總線的能力,所以無法以相似的方法實現對系統存儲單元的原子性操作。本文提出通過FPGA提供一種特殊的存儲單元用于支持原子操作的方法,將該存儲單元稱為MutexRAM。該存儲單元實現于FPGA內部(因為FPGA是整個硬件平臺中設計人員唯一能修改的部分),并且映射到系統存儲空間,保證GPP可以通過PCIE總線訪問。該單元設計的目標是GPP和NIOS2都可以對該單元進行鎖定,從而支持兩者通過該單元進行互斥。
Mutex RAM的設計依賴于MCH對PCIE設備訪問的一種特征。GPP進行鎖定操作時,如果目標地址指向PCIE設備,則MCH會將該請求轉換為讀鎖定(read lock)事務發往PCIE設備。當發生寫操作時自動解鎖,否則會發出單獨的解鎖事務包(completion locked without data)根據這一特征,Mutex RAM設計如圖5所示。RAM中每個32位數增加1位鎖定位,0表示未鎖定,1表示鎖定。雙端口訪問,端口A提供普通的讀寫訪問,寫操作附帶解鎖含義,端口B的讀操作實際為讀鎖定,寫操作為解鎖。當收到來自GPP的讀鎖定請求和解鎖請求時PCIE Compiler訪問Mutex RAM的端口B,否則訪問端口A。兩個端口的訪問會被自動排序以避免沖突。如果讀請求和讀鎖定請求訪問的存儲單元已經被鎖定,則該存儲訪問操作會被堵塞。這樣的設計可保證GPP和FPGA都可以實現對Mutex RAM的原子操作。
Fig.5 Diagram of dual ports mutex RAM.
圖5 雙端口Mutex RAM結構圖
4.性能評測
本文完成了BORPH—N系統的基本實現,并進行了兩項優化工作。建立實驗平臺時采用的通用處理平臺配置為:Intel E5200,4 GB DDR2內存。FPGA主板采用ARRIA II GX芯片,片上系統綜合頻率為50 MHz。FPGA芯片上各部件資源使用情況如表1所示。這些資源的占用分為兩類:一是任意方式使用FPGA都不可以避免的開銷,包括PCIECompiler和On—Chip RAM,因為FPGA必須依靠前者以便于PCIE總線相連,后者則是進行數據處理必須的緩沖;第2類是用于支持BORPH—N運行的部件,包括NIOS2,SGDMA和Mutex RAM,這三者對ARRIA II GX芯片邏輯資源的占用率非常小,由于控制Burst傳輸需要大量緩存,所以使用存儲塊資源較多。
Table 1 Resource Utilization of Hardware Components
表1 FPGA片上各組件資源占用
本文分別對BORPH—N系統的遠程系統調用、虛擬存儲訪問和信號量訪問3個方面進行了詳細的性能測試。主要測試手段是在FPGA內硬件系統中添加性能計數器(performance counter)來統計時間開銷。在分析數據傳輸效率時為了得到更加精確的時間開銷信息,加入SignalTab探針。所有時間單位均為FPGA的時鐘周期。
4.1基本實現的遠程系統服務調用
本文首先對調用遠程系統服務的開銷進行了測試,以shm—get()為例,該過程包括從NIOS2發出請求到GPP得到完成服務請求的信號為止,進行1000次調用遠程系統服務,平均時間開銷為1980時鐘周期。
測試結果如圖6所示,NIOS2通過PCIE Compiler中的Mailbox向GPP發出請求,該請求從被發出到被GPP響應時間開銷大約為600時鐘周期。Mailbox為PCIE Compiler中的一組寄存器,對該組寄存器進行寫操作,PCIE Compiler將會向GPP發出中斷信號。圖6中REG Write即是指該寫操作,IRQ指PCIE Compiler向GPP發出的中斷信號。緊接著為GPP完成實際系統服務的時間,“Real”shm—get是指GPP執行真正的共享存儲段建立工作,只需要大概800時鐘周期。最后GPP也通過向PCIE Compiler內的Mailbox進行寫操作來向N10S2發出請求完成的信號,只是該寫操作通過PCIE進行。這些開銷中通過PCIE總線進行讀寫占了很大比例,由于數據傳輸量非常小,僅僅為7個參數和1個返回值,總線傳輸效率非常低。這表明調用遠程系統服務是比較低效的,所以在實際的應用程序中不應該大量反復使用,而應該只在初始化或是結束時進行調用。但這并不影響通過共享存儲進行進程間通信的實用性,因為一旦進程通過將共享存儲段鏈接到本進程的地址空間后,對這些數據的訪問就不需要再通過遠程調用系統進行服務。
圖6 遠程系統服務調用流程
4.2高性能信號量操作
本文對NIOS2和GPP對Mutex RAM內信號量進行1次fetch—and—add原語操作的時間開銷進行了評估。NIOS2內進行該原子操作時間為10時鐘周期,GPP為60時鐘周期。這表明兩者進行同步的開銷遠遠小于進行1次遠程系統服務調用的開銷。NIOS2和GPP對信號量的訪問均為1次讀操作和1次寫操作,不同的是NIOS2的讀寫操作通過FPGA內Avalon總線進行,而GPP則是通過PCIE總線進行,所以時間開銷相對較大。
4.3虛擬存儲訪問
按照本文設計的虛擬存儲訪問機制,對單個物理頁即4 KB的存儲進行訪問的時間開銷包括3部分:地址翻譯、可能的頁錯誤處理和實際的數據傳輸過程。前兩者的時間開銷在任何時候都基本固定,變化很小。
地址翻譯過程比較簡單,由2次NIOS2通過PCIE對系統存儲的訪問構成,為200時鐘周期。頁錯誤處理過程的開銷與3.1節中1次遠程系統服務調用類似,為1500~2000時鐘周期。通常使用FPGA進行加速的應用,不同模塊之問進行數據交互時有兩個特點:大批量連續的數據傳輸和固定的數據存儲地址。由于每次進行數據交互的物理內存地址固定,頁錯誤只會在第1次發生,后面就不會反復發生。
實際數據傳輸過程為On—Chip RAM與系統存儲之間的數據傳輸,在本文系統中等價于On—Chip RAM與PCIE Compiler之間的數據傳輸。數據傳輸過程可由NIOS2執行簡單的存儲拷貝函數memcpy完成,也可由SGDMA控制完成。表2列出了利用兩種方式在傳輸不同規模數據的時間開銷,單位為時鐘周期,通過進行1000次數據傳輸,對時間開銷取平均值得到。P是指PCIE Compiler,O是指On-Chip RAM,第1行數據是指數據傳輸時每個PCIE事務數據負載的大小,單位為Byte。
Table 2 Two Types of Data Transfer
表2 兩種數據傳輸方式的比較
簡單調用存儲拷貝函數memcpy無法利用PCIE Compiler的Burst傳輸能力。結果顯示在On—Chip RAM和PCIE Compiler之間傳輸4 KB數據速度非常慢,并且讀寫次數也非常多。這是由于對PCIE Compiler的每次讀寫實際上都轉換為對PCIE總線的訪問,也就是形成單個的PCIE事務,而負載卻非常小,通常僅為4B,這使得傳輸效率非常低。
結果表明使用SGDMA后效率獲得大幅度提升。PCIE Compiler支持的Burst讀最大長度為256 B,Burst寫最大長度為128B,結果表明SGDMA充分利用PCIE Compiler的Burst傳輸能力。由于SGDMA可以自行控制多個傳輸的進行,所以當數據量大于4 KB時,多次DMA之間時間開銷非常小,從而能保證數據傳輸率保持不變。
從結果中可以發現讀操作開銷略大于寫操作,讀操作的額外開銷來自存儲一致性協議。在FPGA對主存進行寫操作時不需要等待,總線制器將CPU內Cache置為失效即可。但在FPGA進行讀時如果最新的數據在Cache內,則需要CPU先進行Cache的清空操作,將數據寫回主存,該開銷為300時鐘周期。該開銷實際上為存儲一致性協議的開銷。
4.4性能分析
本文從兩個方面來分析BORPH-N的性能:一方面是數據傳輸通道的帶寬利用率;另一方面是獲取一批次輸入數據的時間開銷。
由于BORPH—N中硬件進程通過FPGA內部的SGDMA控制數據在主存和FPGA的On—ChipRAM之間傳輸,而不是通常的系統DMA,所以考察這種方式是否能夠充分利用數據傳輸通道的帶寬非常重要。
圖7為利用SGDMA部件來控制PCIE Compiler和FPGA的On—Chip RAM之間的數據傳輸的性能。該圖通過SignalTab的探針考察SGDMA的讀寫端口得到,4行信號分別為SGDMA的SGDMA—READ(讀使能信號)'SGDMA—READ—DATA(讀數據信號),SGDMA—WRITE(寫使能信號)和SGDMA—WRITE—DATA(寫數據信號)。
Fig.7 Signals of SGDMA controlling data transfer.
圖7 SGDMA控制數據傳輸讀寫信號
圖7分為左右兩邊,分別測試了雙向數據傳輸的效率。左側部分可以清晰地看出SGDMA首先發出讀使能信號,停頓后(即存儲一致性開銷)有16組讀數據到達,每組為256 B。讀數據到達的同時,SGDMA將數據同時寫入On—Chip RAM。右側也類似,首先發出讀使能信號,由于是讀On—Chip RAM,所以沒有延遲。對On-Chip RAM的讀操作達到了On-Chip RAM的峰值性能。同時SGDMA將數據寫入PCIE Compiler,從圖中可以清晰地看出寫操作分為32組burst數據,每組128B。
圖7表明利用SGDMA控制數據傳輸,已經達到了PCIE Compiler的峰值傳輸性能。在50 MHz的頻率下,讀寫帶寬分別為974 Mbps和1 187 Mbps。PCIE 2.0 lx的峰值帶寬為5 Gbps。該數據表明當前BORPH—N的數據傳輸帶寬利用率是較低的,但要強調的是數據傳輸的瓶頸是PCIE Compile以及FPGA片上系統過低的頻率。優化PCIE Compiler設計和提高片上系統頻率是提高數據傳輸帶寬的兩個途徑。
此外考察獲取一批次輸人數據的時間開銷,為簡單起見假定輸入數據為4 KB,首先考察BORPH—N系統中硬件進程獲取4 KB輸人數據的開銷。開銷包括兩次信號量操作,時間開銷為20時鐘周期,1次地址轉換時間開銷為200時鐘周期。考慮正常運行過程中不會再發生頁錯誤,所以不計人頁錯誤處理開銷。這些開銷加上數據傳輸開銷,綜合的讀寫傳輸率為861 Mbps和1 024 Mbps。
首先與原始BORPH系統中硬件進程獲取輸入數據的速率進行比較。由于原始BORPH僅為硬件進程提供了訪問文件系統的方法,該方法必然受限于磁盤訪問的速率,而普通的磁盤數據讀寫速率僅為560~720 Mbps。該性能是磁盤數據讀寫的峰值,并且還沒有考慮交互的開銷。然后與傳統的加速器方式進行比較。按照圖3(a)所示,進行1次數據傳輸需要1次GPP和FPGA之間的交互。該交互包括GPP訪問1次FPGA,以及FPGA返回1次狀態信息。前者開銷為200時鐘周期。后者可通過GPP輪詢或是中斷信號處理的方式實現,以效率較高的中斷方式為例,參照4.1節實驗數據,時間開銷為600時鐘周期。需要注意的是這些交互開銷的絕對時間并不會隨著FPGA片上系統頻率的提高而減少,因為這些開銷是來自PCIE總線以及GPP方面。實際數據傳輸雖然由系統DMA控制,但根據上述分析,數據傳輸的瓶頸在于PCIECompiler,所以傳輸開銷必然與通過SGDMA控制得相同。因此總的讀寫帶寬為660 Mbps和751 MbpS?梢园l現BORPH—N與之相比讀寫帶寬分別提高30%和36%。并且這里還沒有考慮啟動FPGA進行處理時還需要進行的1次GPP和FPGA之間的交互。
5.相關研究與總結
HThread面向片上多處理系統設計,與BORPH思想較為相近,不同的是HThread擴展了線程概念,麗BORPH擴展了進程概念。HThread將多線程編程模型擴展到可重構計算中,系統將硬件邏輯抽象為硬件線程。HThread基于微內核的概念設計,由一組功能模塊包括線程管理器、鎖管理器、共享存儲管理單元等構成系統內核,這些功能模塊可以實現為通用處理核上的軟件,也可以實現為掛載在系統總線上的硬件邏輯。軟硬件線程通過不同的接口訪問這些功能模塊,也就是訪問系統服務,線程之間通過系統服務實現協同。
Saldana等人介紹了通過MPI進行軟硬件交互的方法。硬件模塊通過系統提供的TMD-MPE模塊來與系統其他部分進行交互。使用MPI來抽象軟硬件之間的交互接口具有非常好的特性,如支持軟硬件模塊的無縫替換。本文介紹的節點內進程間高效率通信方法可以支持TMD-MPI在單節點內不同進程之間的通信。
HybridOS和OpenFPGAE都以加速器方式進行GPP和FPGA之聞協同。該方向的研究新趨勢也是對操作FPGA的編程接口進行規范化。HybridOS的方法是統一FPGA內部邏輯的框架結構,以類似訪問文件的方式訪問FPGA邏輯的緩沖,試圖將對FPGA的操作統一到一般的文件操作方式。OpenFPGA則試圖將FPGA統一為一類標準的設備,設計具有統一接VI的驅動程序,不同類型的FPGA邏輯都實現該接口,保證上層軟件的一致性。
考慮使用新型高級編程模型來開發FPGA應用也一直是學術界的研究熱點。最近的研究包括將CUDA,OpenCL等面向眾核的編程模型引入到FPGA的應用開發中。FCUDA利用CUDA作為FPGA設計的編程模型。FCUDA可將CUDA程序中的粗粒度和細粒度并行高效地映射到可重構邏輯上。FCUDA基于高級綜合工具AutoPilot實現,通過源到源編譯器實現CUDA代碼到AutoPilot代碼的轉換。
國內學術界也有大量研究關注如何簡化可重構計算中的軟硬件協同問題。馬吉軍在其學位論文中討論了將線程概念擴展到可重構計算中的方法,并將軟硬件協同設計轉換為多線程應用開發。與本文不同的是,該工作的底層平臺專注于片上可重構計算系統,以支持硬件線程和軟件線程之間非常緊密的耦合關系。
本文將BORPH移植到普通用戶最易獲得的由FPGA板和通用PC構成的可重構計算乎臺上,并對硬件進程概念進行了擴展,降低了硬件進程設計難度。硬件進程設計難度的降低體現在兩個方面:一方面是與系統交互部分通過軟件接口面不是硬件接口,編寫軟件程序來調用系統接口,顯然比設計硬件邏輯來連接硬件接口更為容易;另一方面是功能邏輯部分,由于接口為標準FPGA片上總線接口,有大量廠商提供的庫支持方便了設計;讵毩绦械幕舅枷,提供了性能優化的軟硬件進程間通信機制。
核心關注:拓步ERP系統平臺是覆蓋了眾多的業務領域、行業應用,蘊涵了豐富的ERP管理思想,集成了ERP軟件業務管理理念,功能涉及供應鏈、成本、制造、CRM、HR等眾多業務領域的管理,全面涵蓋了企業關注ERP管理系統的核心領域,是眾多中小企業信息化建設首選的ERP管理軟件信賴品牌。
轉載請注明出處:拓步ERP資訊網http://www.vmgcyvh.cn/
本文標題:共享存儲可重構計算機軟硬件通信的優化實現