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