QuickPlay 的高級工作流程讓軟件開發(fā)人員迅速構(gòu)建基于 FPGA 的高效應(yīng)用。
隨著物聯(lián)網(wǎng)和大數(shù)據(jù)處理的崛起,人們對數(shù)據(jù)傳輸和處理的需求急劇增長,僅靠 CPU 再也不能滿足這一指數(shù)級增長需求。添加更多處理器和更多虛擬機(jī)來運(yùn)行給定應(yīng)用并不能徹底解決這一問題,因?yàn)閷o定應(yīng)用而言,能夠在多個(gè) CPU 上并行處理的應(yīng)用有限。另一方面,現(xiàn)場可編程門陣列 (FPGA)具有所需的 I/O 帶寬和處理能力,這一點(diǎn)無論是從純粹的處理角度考慮,還是從功耗的角度考慮都非常重要。FPGA 對數(shù)據(jù)中心設(shè)備制造商而言,長期以來一直頗具吸引力。英特爾近期收購了第二大FPGA 廠商,這一舉措是純 CPU 解決方案再也不能滿足應(yīng)用需求的又一力證。
FPGA 實(shí)現(xiàn)相當(dāng)復(fù)雜,這也是阻礙其廣泛采用的主要障礙。到目前為止,在基于 FPGA 的平臺上開發(fā)應(yīng)用的唯一途徑仍是采用一些最底層的硬件實(shí)現(xiàn)方案。這不僅讓軟件開發(fā)人員這一龐大的潛在客戶群無法使用 FPGA 器件,還讓傳統(tǒng) FPGA 設(shè)計(jì)人員的日子越來越不好過。
近期涌現(xiàn)的 FPGA 設(shè)計(jì)方法以高層次綜合(HLS)工具為中心,充分利用 OpenCL ?、C 和C++ 等軟件編程語言的優(yōu)勢,為軟件開發(fā)人員提供了沙盒效應(yīng),在大量應(yīng)用中能從基于 FPGA 的硬件加速中大受裨益。但這些方法往往存在一個(gè)關(guān)鍵的不足,即無法讓軟件開發(fā)人員定義并配置最適合其應(yīng)用的硬件基礎(chǔ)架構(gòu)。業(yè)界一直都在追尋高級工作流程的圣杯,從而無需 FPGA 專業(yè)技術(shù)即可在基于FPGA 的平臺上實(shí)現(xiàn)應(yīng)用。
PLDA 在過去五年中已經(jīng)開發(fā)出一種這樣的工作流程。稱作 QuickPlay 的工作流程能夠高效解決實(shí)現(xiàn)復(fù)雜性問題,為 FPGA 開發(fā)提供多種使用模式。但其價(jià)值的核心源頭之一是它讓軟件開發(fā)人員將原本用于 CPU 的應(yīng)用部分或全部地實(shí)現(xiàn)在 FPGA硬件上的方式。QuickPlay 能夠全面發(fā)揮 FPGA 資源的作用,將這些功能強(qiáng)大而復(fù)雜的器件轉(zhuǎn)化為軟件定義平臺,無需艱苦的硬件設(shè)計(jì)即能獲得 FPGA 帶來的優(yōu)勢。
試想一種可以細(xì)分為兩項(xiàng)功能的軟件算法: 其中一項(xiàng)功能用于數(shù)據(jù)處理,然后另一項(xiàng)功能用于數(shù)據(jù)的進(jìn)一步處理。從軟件角度看,這種實(shí)現(xiàn)方案相當(dāng)簡單,就是先調(diào)用 Function1(),接著再單獨(dú)調(diào)用Function2(),使用指針來定位待處理數(shù)據(jù)的位置。
如果沒有合適的硬件抽象工具流程輔助,在基于 FPGA 的硬件平臺上實(shí)現(xiàn)這種算法需要軟件開發(fā)人員處理圖 1 所示的硬件設(shè)計(jì)(其中內(nèi)核 1 和內(nèi)核2 分別是 Function 1 和 Function 2 的硬件實(shí)現(xiàn))。該硬件設(shè)計(jì)需要包含兩個(gè)元素:控制層面和數(shù)據(jù)層面。
控制層面起著執(zhí)行引擎的作用,用于生成時(shí)鐘與復(fù)位、管理系統(tǒng)啟動(dòng)、編排數(shù)據(jù)層面運(yùn)行以及執(zhí)行所有維護(hù)功能。數(shù)據(jù)層面例化并連接處理元件元、內(nèi)核 1 和內(nèi)核 2 以及用于讀入數(shù)據(jù)和寫出處理后數(shù)據(jù)所需的必備 I/O 接口。雖然不同的應(yīng)用會要求使用不同的 I/O 接口,不過在我們的實(shí)例中使用的是以太網(wǎng)和 PCI Express(PCIe)這些接口,如圖1 所示。
?
圖 1 — 使用傳統(tǒng) FPGA 工具實(shí)現(xiàn)兩功能算法的詳細(xì)硬件實(shí)現(xiàn)
無需硬件專業(yè)知識,軟件開發(fā)人員使用編譯軟件功能 Function1() 和Function2()(一般用 C 或 C++語言編寫)的 HLS 工具就可以輕松地生成內(nèi)核 1 和內(nèi)核 2 到采用 VHDL 或 Verilog 等的 FPGA 硬件描述中。但是設(shè)計(jì)中每一個(gè)從性質(zhì)上不屬于算法的其他元素(接口、控制、時(shí)鐘及復(fù)位)都不能用 HLS工具生成,硬件設(shè)計(jì)人員必須將它們設(shè)計(jì)為自定義硬件描述語言功能或 IP。獲得這些元素并將它們連接起來構(gòu)成了另一個(gè)難題,因?yàn)椴糠衷乜赡懿⒎鞘乾F(xiàn)成的,或是具有不同的接口(類型和大小)、時(shí)鐘要求以及專門的啟動(dòng)順序等。
QuickPlay 能夠充分利用 FPGA 資源,將這些功能強(qiáng)大而復(fù)雜的器件轉(zhuǎn)化為軟件定義平臺,無需艱苦的硬件設(shè)計(jì)即能獲得由FPGA 帶來的優(yōu)勢。
除了設(shè)計(jì)工作,同樣具有難度的是實(shí)現(xiàn)工作。這包括將設(shè)計(jì)映射到選定 FPGA 平臺上的資源、生成適當(dāng)?shù)募s束以及確認(rèn)在 FPGA 硬件上完成邏輯綜合與實(shí)現(xiàn)后滿足這些約束要求。在新的 FPGA 硬件上實(shí)現(xiàn)有效設(shè)計(jì)也需要耗費(fèi)一名經(jīng)驗(yàn)豐富的硬件設(shè)計(jì)人員數(shù)星期的時(shí)間。
因此,任何旨在使用自定義硬件幫助軟件開發(fā)人員來增強(qiáng)其應(yīng)用的工具必須能夠:
?從純軟件代碼中創(chuàng)建功能硬件;
?根據(jù)需要采用現(xiàn)有的硬件 IP 模塊;
?調(diào)用并創(chuàng)建所有的支持硬件(接口、控制、時(shí)鐘等);
?支持使用現(xiàn)成商用開發(fā)板以及自定義平臺;
?確保生成的硬件能自動(dòng)建構(gòu)校正,這樣無需進(jìn)硬件調(diào)試;
?且支持僅使用標(biāo)準(zhǔn)軟件調(diào)試工具即可調(diào)試功能模塊。
PLDA 重新設(shè)計(jì) QuickPlay 以滿足所有各項(xiàng)要求,讓純軟件開發(fā)人員以極小工作量就能指定、構(gòu)建和集成 FPGA 到自己的軟件架構(gòu)中。
以軟件為中心的方法
使用 QuickPlay 實(shí)現(xiàn)整個(gè)設(shè)計(jì)流程相當(dāng)簡單直觀:
1. 開發(fā)硬件引擎的 C/C++ 語言功能模型。
2. 使用標(biāo)準(zhǔn)的 C/C++ 語言調(diào)試工具來驗(yàn)證功能模型。
3. 指定目標(biāo) FPGA 平臺和 I/O 接口(PCIe、以太網(wǎng)、DDR、QDR 等)。
4. 編譯并構(gòu)建硬件引擎。
該流程看似簡單,但如果要無縫地工作,關(guān)鍵在于保證生成的硬件引擎在功能上與初始軟件模型完全相同。換言之,功能模型必須具有確定性,這樣無論硬件實(shí)現(xiàn)方案的運(yùn)行速度有多快,軟硬件執(zhí)行的結(jié)果都是完全一致的。
但令人遺憾的是大多數(shù)并行系統(tǒng)都屬于非確定性執(zhí)行。例如多線程軟件執(zhí)行取決于 CPU、操作系統(tǒng)以及運(yùn)行在同一主機(jī)上的無關(guān)進(jìn)程。多次運(yùn)行相同的多線程程序可能會得到不同的行為。硬件中這樣的非確定性將會是一場災(zāi)難,因?yàn)檫@樣會要求在電氣波形層面調(diào)試硬件引擎本身,從而妨礙工具為軟件開發(fā)人員抽象硬件的目的。
QuickPlay 使用直觀的數(shù)據(jù)流模型,能從數(shù)學(xué)角度保證可確定性執(zhí)行,與執(zhí)行引擎無關(guān)。該模型由稱之為內(nèi)核的并行功能組成,負(fù)責(zé)與流通道進(jìn)行通信。因此它與軟件開發(fā)人員在白板上勾勒應(yīng)用草圖關(guān)聯(lián)緊密。為確保行為的確定性,這些內(nèi)核必須彼此進(jìn)行通信,以防發(fā)生競態(tài)條件和死鎖等數(shù)據(jù)沖突。實(shí)現(xiàn)這一要求的方法是使用具備下列特點(diǎn)的流通道:(1)基于 FIFO,(2)阻塞式讀取和阻塞式寫入,以及(3)點(diǎn)對點(diǎn)。
這些就是 PLDA 據(jù)以構(gòu)建 QuickPlay 的計(jì)算模型—— 卡恩進(jìn)程網(wǎng)絡(luò)(KPN)的特點(diǎn)。圖 2 的QuickPlay 設(shè)計(jì)實(shí)例描述了 KPN 模型。
?
圖2 — QuickPlay 中的設(shè)計(jì)實(shí)例
任何內(nèi)核的內(nèi)容都可以是任意 C/C++ 語言代碼、第三方 IP,甚至是 HDL 代碼(對硬件設(shè)計(jì)人員而言)。QuickPlay 采用相當(dāng)簡單直觀的設(shè)計(jì)流程(圖 3)。
?
圖 3 — QuickPlay 采用簡單直觀的設(shè)計(jì)流。
當(dāng)您完成軟件調(diào)試階段,并且糾正了所有的功能問題,就無需在硬件層面上進(jìn)一步開展調(diào)試。
下面詳細(xì)介紹 QuickPlay 設(shè)計(jì)流程的每一個(gè)步驟。
步驟 1 : 純軟件設(shè)計(jì)。在這個(gè)階段,您可以用C 語言添加并連接處理內(nèi)核,創(chuàng)建自己的FPGA 設(shè)計(jì),然后使用自己的主機(jī)軟件來指定通信通道。QuickPlay 基于 Eclipse 的集成開發(fā)環(huán)境(IDE)通過簡單的 API 提供 C/C++ 語言庫,用于創(chuàng)建內(nèi)核、流、流端口和存儲器端口,以及從流端口和存儲器端口讀取/ 寫入。
此外,QuickPlay IDE 還提供直觀的圖形編輯器,便于您拖放內(nèi)核與其他設(shè)計(jì)元素并繪制流。
步驟 2 :功能驗(yàn)證。這一步的重點(diǎn)是確保步驟 1編寫的軟件模型能正確工作。實(shí)現(xiàn)的方法是先在桌面上編譯軟件模型,然后使用測試程序發(fā)送數(shù)據(jù)到輸入以執(zhí)行軟件模型,最后驗(yàn)證輸出的正確性。并行執(zhí)行 FPGA 設(shè)計(jì)的軟件模型,為每個(gè)內(nèi)核提供獨(dú)立的線程,以模擬實(shí)際硬件實(shí)現(xiàn)的并行性。
然后您可以使用標(biāo)準(zhǔn)軟件調(diào)試方法和工具,如斷點(diǎn)、檢測點(diǎn)、分步執(zhí)行以及格式化輸出函數(shù)來調(diào)試軟件模型。(在實(shí)現(xiàn)到硬件中之后您可能還想運(yùn)行更多測試。我們將對此做簡要描述。)從設(shè)計(jì)流程來看,這是您完成全部驗(yàn)證工作的步驟。一旦您完成這個(gè)調(diào)試步驟,您完成這個(gè)調(diào)試步驟,并且糾正了所有的功能問題,您就無需在硬件層面上進(jìn)一步開展調(diào)試。
需要提醒的是: 功能模型完全不涉及任何硬件基礎(chǔ)架構(gòu)元素。上述實(shí)例的重點(diǎn)是簡單的兩功能模型。圖1 中添加的系統(tǒng)構(gòu)成(如通信組件、控制層面、時(shí)鐘及復(fù)位)在這個(gè)建模和驗(yàn)證階段完全不涉及。
步驟 3 : 硬件生成。這一步用于從用戶的軟件模型生成 FPGA 硬件。它涉及三個(gè)簡單的操作:
1. 在 QuickPlay GUI 的下拉菜單中選擇您想要實(shí)現(xiàn)到自己的設(shè)計(jì)中的 FPGA 硬件。QuickPlay 能夠使用品種不斷豐富的現(xiàn)成開發(fā)板來實(shí)現(xiàn)設(shè)計(jì)。這些開發(fā)板采用先進(jìn)的賽靈思All Programmable FPGA、PCIe 3.0、10 Gb 以太網(wǎng)、DDR3 SDRAM、QDR2+SRAM 等。
2. 選擇需要映射到設(shè)計(jì)輸入及輸出端口的物理接口(以及協(xié)議)。這些通過菜單都能方便選擇。具體選擇取決于用戶選定的 FPGA 板件上提供的接口,例如 PCIe、10 Gb 以太網(wǎng) TCP/IP 和 10 Gb 以太網(wǎng) UDP。選擇通信協(xié)議即自動(dòng)調(diào)用實(shí)現(xiàn)連接所需的硬件 IP 模塊以及其上分層的任何軟件協(xié)議棧,從而完成整個(gè)系統(tǒng)的創(chuàng)建。
3. 啟動(dòng)構(gòu)建流程這個(gè)過程包括運(yùn)行 HLS 引擎(從 C 語言代碼創(chuàng)建硬件),創(chuàng)建所需的系統(tǒng)硬件功能(我們原始實(shí)例中的控制層邏輯)和運(yùn)行構(gòu)建板件要求的硬件鏡像所需的其他工具(例如賽靈思Vivado? 集成設(shè)計(jì)環(huán)境)。完成這個(gè)過程無需手動(dòng)干預(yù)。
步驟 4 : 系統(tǒng)執(zhí)行。這個(gè)步驟與步驟 2 中的功能模型執(zhí)行(功能驗(yàn)證)相似,除了現(xiàn)在雖然主機(jī)應(yīng)用仍然運(yùn)行在軟件中,但 FPGA 設(shè)計(jì)運(yùn)行在選定的 FPGA 板件上。這意味著您可以從 FPGA 板件輸入輸出真實(shí)數(shù)據(jù),從而進(jìn)一步驗(yàn)證其功能的完整性。由于這樣可以顯著加快運(yùn)行速度,而且因?yàn)槟梢允褂脤?shí)時(shí)數(shù)據(jù)資源,您在這個(gè)階段與在功能驗(yàn)證階段相比可以運(yùn)行數(shù)量多得多的測試。
步驟 5 : 系統(tǒng)調(diào)試。因?yàn)榕c功能驗(yàn)證階段相比現(xiàn)在您可以運(yùn)行數(shù)量多得多的測試,您可以發(fā)現(xiàn)在步驟 2 中未能發(fā)現(xiàn)的功能缺陷。那么您現(xiàn)在該如何調(diào)試呢?
如前文所述,您永遠(yuǎn)不必在硬件層面進(jìn)行調(diào)試,即便缺陷是在在硬件中運(yùn)行功能后發(fā)現(xiàn)的。由于 QuickPlay 保證軟件模型和硬件實(shí)現(xiàn)之間的功能等效性,因此任何硬件版本中發(fā)生的缺陷也必然存在于軟件版本中。這就是您無需在硬件中進(jìn)行調(diào)試的原因;您只需要在軟件域中調(diào)試就足夠了。
作為由 QuickPlay 提供的抽象結(jié)果,算法保持純粹性,著重處理數(shù)據(jù)操作,獨(dú)立于底層通信細(xì)節(jié)。
只要您發(fā)現(xiàn)測試序列在硬件中失敗,QuickPlay就能采集在設(shè)計(jì)輸入端造成錯(cuò)誤操作的事件序列,然后在軟件環(huán)境中將其回放,以便您使用 Eclipse 調(diào)試器進(jìn)行調(diào)試,從而找出缺陷的源頭。
由于 QuickPlay 能自動(dòng)為基礎(chǔ)架構(gòu)配置硬件,以便觀察設(shè)計(jì)中的所有關(guān)鍵點(diǎn),因此這樣做的是可行的。您還可以禁用該基礎(chǔ)架構(gòu)以釋放寶貴的硬件資源。圖 4 所示即為添加了調(diào)試電路的實(shí)例系統(tǒng)。如果沒有 QuickPlay,就必須插入某種調(diào)試基礎(chǔ)架構(gòu)并進(jìn)行手動(dòng)管理。而在使用 QuickPlay 的 情況下,這一切對軟件開發(fā)人員來說都是自動(dòng)化和透明化的。
?
圖 4 — 自動(dòng)創(chuàng)建調(diào)試基礎(chǔ)架構(gòu)
整個(gè)流程就是先在軟件中建模,然后在硬件中構(gòu)建并測試系統(tǒng)。如果存在缺陷,將失敗的測試序列導(dǎo)回軟件環(huán)境中,在軟件環(huán)境中調(diào)試,修改源代碼,然后重復(fù)這一過程。與傳統(tǒng)流程相比這能顯著提高生產(chǎn)力。
步驟 6(可選): 系統(tǒng)優(yōu)化。在您完成調(diào)試階段后,就會擁有一個(gè)能夠在 FPGA 開發(fā)板上正確運(yùn)行的功能設(shè)計(jì)。不過您可能想要進(jìn)行一些性能優(yōu)化,而且這也是性能優(yōu)化的合適時(shí)間,因?yàn)槟呀?jīng)知道自己的系統(tǒng)能正確運(yùn)行。
首先應(yīng)該考慮的優(yōu)化是優(yōu)化功能模型。有可能存在更多并行的機(jī)會。例如您可以嘗試使用不同的辦法來分解或重構(gòu)各項(xiàng)功能。在這個(gè)層面優(yōu)化可以帶來顯著的性能提升。勿庸置疑,使用 VHDL 或Verilog 設(shè)計(jì)來開展優(yōu)化工作需要占用大量的時(shí)間,而在 C 語言中進(jìn)行調(diào)整則非常迅速與簡捷。
其次您可以嘗試使用其他速度更快的 FPGA 開發(fā)板。因?yàn)閺墓δ苣P陀成涞介_發(fā)板十分容易,嘗試各種不同開發(fā)板并從中選優(yōu)是件簡單的事情。
第三項(xiàng)需要優(yōu)化的對象是 QuickPlay 使用高級綜合創(chuàng)建的硬件內(nèi)核。雖然得到的硬件能保證正確高效地運(yùn)行,不過其運(yùn)行效率未必有硬件工程人員手動(dòng)編制的硬件高。在這個(gè)階段您有多種選擇: 您可以優(yōu)化代碼和 HLS 設(shè)置來改善生成的硬件;可以使用 Vivado HLS 來生成更高效的硬件;或是讓硬件工程人員手動(dòng)編制 HDL 中最關(guān)鍵的模塊。
這些優(yōu)化步驟并非是強(qiáng)制要求,不過在可用的硬件資源有限、而您又需要提升硬件性能時(shí)不妨一試。硬件工程師可可協(xié)助開展這些優(yōu)化工作。當(dāng)您完成任何此類調(diào)整后,只需重復(fù)構(gòu)建流程。
通用流通道
QuickPlay 提供的通用流 API 完全抽象并獨(dú)立于底層物理通信協(xié)議。流數(shù)據(jù)通過 ReadStream() 函數(shù)接收,使用WriteStream() 函數(shù)。這些函數(shù)可用于在內(nèi)核之間、向嵌入式或板級存儲器、向嵌入式或外部主機(jī) CPU 發(fā)送與接收數(shù)據(jù),從而無需開發(fā)人員理解或管理底層低級協(xié)議即可提供開發(fā)板架構(gòu)靈活性。
選擇的協(xié)議決定了通過什么硬件接收與發(fā)送數(shù)據(jù)。目前 QuickPlay 支持 ARM?AMBA? AXI4-Stream、DDR3、PCIe( 具備 DMA 功能) 以及 TCP/IP ; 更多協(xié)議正在添加中,也可根據(jù)需求添加協(xié)議。選擇所需的協(xié)議不僅是設(shè)置實(shí)現(xiàn)協(xié)議所需的硬件,也是支持較高級協(xié)議層所需的軟件協(xié)議棧,如圖 5 所示。
?
圖5 — 選擇所需的協(xié)議對所要求的硬件與軟件棧進(jìn)行設(shè)置。
QuickPlay 負(fù)責(zé)管理這些讀寫的具體實(shí)現(xiàn)(大小、對齊、封送處理等)。ReadStream() 和 WriteStream()語句最重要的特征是它們是阻塞式的: 如果遇到這兩種語句之一,在所有預(yù)期的數(shù)據(jù)讀或?qū)懲瓿汕埃粫M(jìn)入到下一語句。這對實(shí)現(xiàn)算法的確定性有重要意義。
通用的 ReadStream() 和 WriteStream() 語句與實(shí)際底層協(xié)議硬件的“綁定”借助 QuickPlay 庫發(fā)生在運(yùn)行時(shí)間中。這不僅能防止通信細(xì)節(jié)讓軟件程序雜亂無章,還能夠提供模塊化和可移植性。改變通信協(xié)議無需對實(shí)際內(nèi)核代碼或主機(jī)軟件做任何改動(dòng)。Read-Stream() 和WriteStream() 語句會自動(dòng)綁定到任何已選定的協(xié)議,不會給程序語義造成影響。
在由 QuickPlay 提供抽象的影響下,軟件算法能保持純粹性,著重處理數(shù)據(jù)操作,完全獨(dú)立于底層的通信細(xì)節(jié)。
量產(chǎn)質(zhì)量級輸出
根據(jù)使用的 HLS 工具,通過學(xué)習(xí)編碼方式,提高硬件生成效率,結(jié)果質(zhì)量可得以進(jìn)一步提高,不過這只是一種選擇。
雖然在其他情況下您使用的硬件平臺可能被簡單地視為一種原型設(shè)計(jì)平臺,但是您使用 QuickPlay創(chuàng)建的系統(tǒng)具有生產(chǎn)價(jià)值。在過去,從純粹的軟件設(shè)計(jì)到硬件輔助或純硬件設(shè)計(jì)一般需要數(shù)月時(shí)間。QuickPlay 將其縮短為數(shù)天時(shí)間。
QuickPlay 方法實(shí)現(xiàn)了長期以來尋求的讓軟件開發(fā)人員為其全部或部分應(yīng)用開發(fā)硬件設(shè)計(jì)的目標(biāo)。通過在自己熟悉的領(lǐng)域中開展工作,軟件工程師能夠根據(jù)需要來使用定制硬件,自動(dòng)生成工作效率更高的硬件強(qiáng)化應(yīng)用,而且與手動(dòng)設(shè)計(jì)相比能提前數(shù)月實(shí)現(xiàn)量產(chǎn)。
評論
查看更多