《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 其他 > 入門:FPGA編程三大范例

入門:FPGA編程三大范例

2022-10-25
來源:Hack電子
關鍵詞: 編程語言 Verilog FPGA

  雖然 FPGA 可使用 Verilog 或 VHDL 等低層次硬件描述語言 (HDL) 來編程,但現在已有多種高層次綜合 (HLS) 工具可以采用以 C/C++ 之類的更高層次的語言編寫的算法描述,并將其轉換為 Verilog 或 VHDL 等低層次的硬件描述語言。隨后,下游工具即可對轉換后的語言進行處理,以便對 FPGA 器件進行編程。此類流程的主要優(yōu)勢在于,您可使用諸如 C/C++ 等編程語言來編寫高效代碼,而后將代碼轉換為硬件,但這類編程語言的優(yōu)勢仍能得以完整保留。此外,寫好代碼乃是軟件設計師的專長,比學習新的硬件描述語言更簡單。

  以 C/C++ 編寫的程序本質上是專為馮諾依曼樣式的架構編寫的,此類架構中用戶程序內的每條指令都是按順序執(zhí)行的。為了實現高性能,HLS 工具必須推斷順序代碼中的并行性,并利用它來實現更高的性能。要解決這個問題可并不簡單。此外,優(yōu)秀的軟件程序員按明確定義的規(guī)則和實踐來編寫程序,例如,RTTI、遞歸和動態(tài)存儲器分配。其中諸多技巧在硬件中都無法找到直接等效的對象,故而給 HLS 工具帶來了諸多挑戰(zhàn)。這也意味著任意現成軟件都無法高效轉換為硬件。最低限度,需檢驗此類軟件中是否存在不可綜合的構造,并需要重構代碼,使其可綜合。

  現如今,即使軟件程序可自動轉換(或綜合)為硬件,但要實現可接受的結果質量 (QoR),仍需要額外工作(例如,重寫軟件)以幫助 HLS 工具實現期望的性能目標。為此,您需要了解正確編寫軟件的最佳實踐,以確保在 FPGA 器件上正常執(zhí)行軟件。在接下來的幾個章節(jié)內,將著重探討如何首先識別部分宏觀級別架構最優(yōu)化以明確程序結構,然后聚焦更細化的微觀級別架構最優(yōu)化來實現性能目標。

  生產者使用者范例

  請考慮軟件設計師編寫多線程程序的方式,通常有一個主線程用于執(zhí)行某些初始化步驟,隨后分叉為多個子線程用于執(zhí)行某些并行計算,當所有并行計算都完成后,主線程會整理結果并寫入輸出。程序員必須理清哪些部分可以分叉以供并行計算,哪些部分需要按順序執(zhí)行。這種分叉/連接類型的并行化操作不僅適用于 CPU,也適用于 FPGA,但 FPGA 上的吞吐量的關鍵模式之一是生產者使用者范例。您需要將生產者使用者范例應用于順序程序,并將其轉換為可并行執(zhí)行的抽取功能以便提升性能。

  您可借助一條簡單的問題語句的幫助來更好地理解這個分解進程。假定您有一份數據手冊,可供我們將其中的項導入列表。隨后,您將對列表中的每個項進行處理。處理完每個項需耗時約 2 秒。處理完后,您將把結果寫入另一份數據手冊,此操作將耗時約每項各 1 秒。因此,如果輸入 Excel 工作表中有總計 100 個項,那么將耗時總計 300 秒來生成輸出。這樣做的目的是對此問題進行分解,以便您識別能夠并行執(zhí)行的任務,從而提升系統(tǒng)吞吐量。

109.JPG

  圖 1. 程序工作流程

  第一步是了解程序工作流程,識別獨立的任務或函數。整個工作流程分 4 個步驟,類似上圖所示的程序工作流程(無重疊)。在此示例中,“寫入輸出”(步驟 3)任務獨立于“處理數據”(步驟 2)處理任務。雖然步驟 3 取決于步驟 2 的輸出,但當步驟 2 中的任意項完成處理后,您即可立即將其寫入輸出文件。您無需等待所有數據都完成處理后再開始將數據寫入輸出文件。此類型的交織/重疊任務執(zhí)行方式是非常常見的原則。如上圖所示(例如:含重疊的程序工作流程)。如圖所示,含重疊的工作流程比不含重疊時更快完成。現在,您可將步驟 2 視作為生產者,將步驟 3 視作為使用者。生產者使用者模式對于 CPU 性能的影響有限。您可交織執(zhí)行每個線程的步驟,但這需要謹慎分析,以便充分利用底層多線程和 L1 高速緩存架構,因此較為耗時。但在 FPGA 上,由于可采用定制架構,生產者和使用者線程可以同時執(zhí)行,開銷極低甚至沒有,因此能夠顯著提升吞吐量。

  首先考量的最簡單案例是單一生產者和單一使用者通過大小有限的緩沖器來進行通信。如果緩沖器已滿,那么生產者可以選擇阻塞/停滯或者丟棄數據。當使用者從緩沖器中移除某個項后,它會通知生產者,生產者隨后開始再次填充緩沖器。如果使用者發(fā)現緩沖器已空,則可以同樣方式停滯。當生產者將數據置入緩沖器后,它會喚醒休眠中的使用者。該解決方案可通過進程間通信(通常使用監(jiān)控器或信號量)來實現。不充分的解決方案可能導致死鎖,即兩個進程都停滯并等待喚醒。但在單一生產者和使用者的情況下,通信模式與先入先出 (FIFO) 或乒乓緩沖器 (PIPO) 實現之間存在強映射關系。這種類型的通道無需依賴信號量、互斥體或監(jiān)控器來進行數據傳輸,即可提供高效的數據通信。使用此類鎖定原語對于性能可能開銷較大,并且難以使用和調試。PIPO 和 FIFO 是常用的選擇,因為可以避免端到端的原子同步需求。

  在此類宏觀級別架構最優(yōu)化中,可通過緩沖器封裝通信,使程序員可免于擔心存儲器模型和其它非確定性行為(如爭用條件等)。在此類設計中可達成的網絡類型為純粹的“數據流網絡”,可在輸入側接受串流數據,對此數據串流執(zhí)行一些基本處理,然后將其作為數據串流發(fā)出。并行程序的復雜性完全被抽離。請注意,“導入數據”(步驟 1)和“導出數據”(步驟 4)同樣在最大程度提升可用的并行性方面扮演著相應的角色。為了使計算能夠與 I/O 成功重疊,重要的是第一步對輸入的讀取結果進行封裝,最后一步則是寫入輸出。這樣即可實現 I/O 與計算的最大程度重疊。在計算步驟中間讀取或寫入輸入/輸出端口將會限制設計的可用并發(fā)性。這同樣是在對設計工作流程進行設計時需要牢記的。

  最后,此類“數據流網絡”的性能依賴于設計師能夠持續(xù)向網絡饋送數據,使數據能夠在系統(tǒng)中保持串流。數據流中出現中斷可能導致性能下降。視頻串流應用就是一個很好的例子,比如在線游戲中,實時高清 (HD) 視頻持續(xù)流經系統(tǒng),幀處理率受到持續(xù)監(jiān)控,以確保滿足期望的結果質量。游戲玩家可以在屏幕上立即觀察到幀處理率下降。假想一下,這能為一大群游戲玩家提供持續(xù)性幀率支持,同時功耗相比傳統(tǒng) CPU 或 GPU 架構顯著降低 - 這就是硬件加速的魅力。使數據在生產者與使用者之間持續(xù)保持流動至關重要。下一步,您將深入了解本節(jié)中介紹的這種串流范例。

  串流數據范例

  串流是一種重要的抽象:它表示無限制的連續(xù)更新數據集,其中“無限制”表示“大小未知或者大小無限”。串流可以是一連串數據(標量或緩沖器)在源(生產者)進程與目標(使用者)進程之間單向流動。串流范例會強制您根據數據訪問模式(或序列)來思考。在軟件中,隨機存儲器對數據的訪問幾乎是免費的(忽略高速緩存成本),但在硬件中,執(zhí)行順序訪問實際上是很有利的,此類訪問可轉換為串流。將算法分解為生產者使用者關系并通過網絡串流數據來進行通信具有如下所述幾大優(yōu)勢。它允許程序員以順序方式定義算法,并通過其它方式來提取并行度(例如,通過編譯器)。諸如任務間同步等復雜性會被抽離。它允許生產者和使用者任務同時處理數據,這是提升吞吐量的關鍵。另一個優(yōu)勢是代碼更清潔且更簡單。

  如前文所述,對于生產者和使用者范例,數據傳輸模式與 FIFO 或 PIPO 緩沖器實現之間存在強映射關系。FIFO 緩沖器只是預定義大小/深度的隊列,其中插入隊列的首個元素也會成為可從隊列跳出的首個元素。使用 FIFO 緩沖器的主要優(yōu)勢在于,只要生產者將數據插入緩沖器,使用者進程就可以立即在 FIFO 緩沖器內部開始訪問數據。使用 FIFO 緩沖器的唯一問題在于,由于生產者與使用者之間的生產/使用速率不同,可能導致 FIFO 緩沖器大小錯誤,從而導致死鎖。在具有多個生產者和使用者的設計中,這種情況較為常見。乒乓緩沖器屬于用于加速進程的雙緩沖器,可將 I/O 操作與數據處理操作重疊。其中一個緩沖器用于保存數據塊,以便使用者進程能夠看到完整(舊)版本的數據,而另一個緩沖器中,生產者進程則正在創(chuàng)建新(部分)版本的數據。當新的數據塊完成并有效時,使用者和生產者進程將交換對兩個緩沖器的訪問。由此導致,使用乒乓緩沖器會增加器件的整體吞吐量,并幫助防止出現最終瓶頸。PIPO 的主要優(yōu)勢在于,工具能夠將生產速率與使用速率自動匹配,并創(chuàng)建高性能且無死鎖的通信通道。此處值得注意的是,無論使用的是 FIFO 還是 PIPO,關鍵特性是相同的:生產者將數據塊發(fā)送或者串流至使用者。數據塊可以是單個值,也可以是一組 N 個值。塊越大,所需存儲器資源越多。

  以下是簡單的求和應用,用于展示經典的串流網絡/數據流網絡。在此例中,該應用的目標是成對添加隨機數值串流,然后打印這些數值。前兩個任務(任務 1 和 2)提供了隨機數值串流以供添加。這些數值通過 FIFO 通道發(fā)送到求和任務(任務 3),任務 3 會從 FIFO 通道讀取值。隨后,求和任務將輸出發(fā)送到打印任務(任務 4),以發(fā)布結果。FIFO 通道可在這些獨立的執(zhí)行線程之間提供異步緩沖。

108.JPG

  圖 2. 串流網絡/數據流網絡

  連接每項“任務”的串流通常是作為 FIFO 隊列來實現的。FIFO 能夠抽離程序員的并行行為,使其專注于推理任務活動(調度)的“快照”時間。FIFO 能夠使并行化更易于實現。這主要得益于它減少了程序員實現并行化框架或容錯解決方案時,必須應付的可變空間。獨立內核之間的 FIFO 展現出經典的排隊行為。對于純串流系統(tǒng),可使用排隊或網絡流模型來對此行為進行建模。這種數據流類型網絡和串流最優(yōu)化的另一個主要優(yōu)勢在于它可按不同粒度級別來應用。程序員可以在每項任務內部設計此類網絡,也可以為任務或內核系統(tǒng)設計此類網絡。實際上,您可以通過串流網絡來以分層方式例化并連接多個串流網絡或任務。支持更細粒度的并行化的另一項最優(yōu)化措施是流水打拍。

  流水線范例

  流水線是您日常生活中常用的概念。造車廠生產線就是一個典型的例子,其中每一項具體任務通常都是由一個獨立且唯一的工作站來完成的,如安裝引擎、安裝車門和安裝車輪。各工作站各自對一輛不同的車并行執(zhí)行自己的任務。當某一輛車執(zhí)行完某一項任務后,它就會移至下一個工作站。完成各項任務的時間差可通過“緩沖”(將一輛或多輛車暫存在各工作站之間的空間內)和/或“停滯”(暫時中止上游工作站的操作)來加以調整,直至下一個工作站變?yōu)榭捎脼橹埂?/p>

  假設組裝一輛車需要執(zhí)行 3 項任務 A、B 和 C,這 3 項任務分別需要 20、10 和 30 分鐘。那么,如果全部 3 項任務均由單個工作站來執(zhí)行,工廠每 60 分鐘才能輸出一輛車。通過使用 3 個工作站組成的流水線,該工廠 60 分鐘即可輸出第一輛車,隨后每 30 分鐘再輸出一輛新車。正如此示例所示,流水線并不會降低時延,即單個項穿越整個系統(tǒng)的總時間。但它會增加系統(tǒng)吞吐量,即,第一個項完成后處理新的項的速率。

  由于流水線的吞吐量不可能優(yōu)于其最慢的元素,因此程序員應嘗試在各階段間拆分工作和資源,以使各階段耗用相同時間來完成自己的任務。在上述車輛組裝線示例中,如果 3 項任務 A、B 和 C 各自耗時 20 分鐘,而不是分別耗時 20、10 和 30 分鐘,那么時延將仍為 60 分鐘,但每隔 20 分鐘(而不是 30 分鐘)即可完成一輛新車。下圖顯示了承擔制造 3 輛車任務的假想生產線示例。假定任務 A、B 和 C 各耗時 20 分鐘,那么順序生產線將需要 180 分鐘才能生產 3 輛車。而流水線式生產線只需 100 分鐘即可生產 3 輛車。

  生產第一輛車所耗費的時間為 60 分鐘,稱為流水線的迭代時延。生產完第一輛車后,后兩輛車各自只需 20 分鐘,這稱為流水線的啟動時間間隔 (II)。生產三輛車所耗費的總時間為 100 分鐘,稱為流水線的總時延,即,總時延 = 迭代時延 + II * (項數 - 1)。因此,改善 II 即可改善總時延,但不影響迭代時延。從程序員視角來看,流水線范例可適用于設計中的函數和循環(huán)。確定初始建立時間成本后,要實現理想吞吐量目標,II 應為 1,即初始建立時間延遲過后,在流水線的每個周期都將有輸出可用。在以上示例中,初始建立時間延遲 60 分鐘過后,每隔 20 分鐘就有一輛車可用。

107.JPG

  圖 3. 流水打拍

  流水打拍是經典的微觀級別架構最優(yōu)化,可應用于多個抽象層。在前文中,我們通過生產者使用者范例解釋了任務級別流水打拍。這一概念同樣適用于指令級別。這實際上是使生產者使用者流水線(和串流)保持填滿并繁忙的關鍵。僅當每個任務都高速率生產/使用數據,故而需要指令級流水打拍 (ILP) 時,生產者使用者流水線才能保持高效。

  由于流水打拍長期使用相同資源來執(zhí)行相同功能,因此需要有關每項任務時延的完整信息,故而被視作為靜態(tài)最優(yōu)化。有鑒于此,低級指令流水打拍方法無法應用于數據流類型的網絡,因為在此類網絡中任務的時延是輸入數據的函數,故而可能未知。下一章節(jié)中將詳解如何利用介紹的這三種基本范例來對不同類型的任務并行度進行建模。

  組合三種范例

  用戶程序中,大部分最優(yōu)化的主要焦點是函數和循環(huán)。現如今的最優(yōu)化工具通常在函數/過程級別工作。每個函數都能轉換為特定硬件組件。每個此類硬件組件都與類定義相似,該組件的許多對象(或實例)均可在最終硬件設計中創(chuàng)建和例化。每個硬件組件都將由許多更小的預定義組件組成,這些預定義組件通常用于實現基本函數(例如,加法、減法和乘法)。雖然不支持遞歸,但是函數可以調用其它函數。較小且調用次數較少的函數通常還可以內聯(lián)到其調用方函數中,正如軟件函數內聯(lián)方式一樣。在此情況下,實現函數所需的資源將匯總到調用方函數的組件中,這樣能更好地共享公用資源。將設計構造為一組通信函數有助于在執(zhí)行這些函數時提升推斷并行度。

  循環(huán)是程序中最重要的構造之一。由于循環(huán)主體多次迭代,因此可輕松利用該屬性來提升并行度。可通過多種方式來對循環(huán)和循環(huán)嵌套進行變換(例如,流水打拍和展開),從而提升并行執(zhí)行的效率。這些變換使存儲器系統(tǒng)最優(yōu)化以及映射到多核和 SIMD 執(zhí)行資源成為可能。科學與工程應用中的許多程序都表現為對大型數據結構進行各種運算。這些運算包括對陣列或矩陣進行簡單的逐元素運算,或者也可能是具有循環(huán)進位依賴關系的更復雜的循環(huán)嵌套運算,如跨循環(huán)迭代的數據依賴關系。此類數據依賴關系會影響循環(huán)內可達成的并行度。在諸多此類情況下,必須對代碼進行重構,才能在現代化的并行平臺上有效執(zhí)行并行循環(huán)迭代。

  下圖顯示了 4 個連續(xù)任務(即,C/C++ 函數)A、B、C 和 D 的不同重疊執(zhí)行的簡單示例,其中,A 在 2 個不同陣列內分別為 B 和 C 生成數據,D 則使用來自 B 和 C 所生成的 2 個不同陣列的數據。假定這種“菱形”通信模式將運行 2 次,且 2 次運行彼此獨立。

  void diamond(data_t vecIn[N], data_t vecOut[N]) { data_t c1[N], c2[N], c3[N], c4[N]; #pragma HLS dataflow A(vecIn, c1, c2); B(c1, c3); C(c2, c4); D(c3, c4, vecOut); }

  以上代碼示例所示 C/C++ 源代碼片段顯示了這些函數的調用方式。請注意,任務 B 和 C 相互之間不存在數據依賴關系。下圖對應完全順序執(zhí)行方式,其中黑色圓圈表示用于實現串行的某種同步形式。

106.JPG

  圖 4. 順序執(zhí)行 - 運行 2 輪

  在菱形示例中,B 與 C 完全彼此獨立。兩者既不相互通信也不訪問任何共享存儲器資源,因此如果無需共享計算資源,那么兩者可并行執(zhí)行。由此可得結果如下圖所示,一輪運行內形成了某種形式的分叉式連接并行運行。當 A 任務結束后,B 和 C 并行執(zhí)行,而 D 則等待 B 和 C,但下一輪仍按順序連續(xù)執(zhí)行。

105.JPG

  圖 5. 一輪運行中的任務并行

  此類執(zhí)行方式可總結為 (A; (B || C); D); (A; (B || C); D),其中“;”表示串行連續(xù),“||”則表示完全并行。這種形式的嵌套分叉連接并行運行對應于一種從屬任務子類,稱為串并行任務圖。一般來說,任何從屬任務的有向無環(huán)圖 (DAG) 均可通過獨立的分叉并連接類型同步來實現。此外同樣值得注意的是,這正是在具有多個線程并使用共享存儲器的 CPU 上運行多線程程序的方式。

  在 FPGA 上,您可以探索其它可用的并行形式。先前的執(zhí)行模式利用的是在單次調用內執(zhí)行任務級別并行操作。那么重疊連續(xù)運行又會如何呢?如果每次運行之間真正彼此獨立,但每個函數(即,A、B、C 或 D)復用前一輪的相同計算硬件,那么我們仍可能想要將 A 的第二次調用與 B 和 C 的第一次調用并行執(zhí)行。這是一種跨調用的任務級流水線形式,由此可得結果如下圖所示。現在,由于吞吐量受到所有任務間的最大時延的限制,而非所有任務時延總和的限制,因而吞吐量明顯改善。雖然每輪運行的時延不變,但多輪運行的總時延得以縮短。

104.JPG

  圖 6. 利用流水打拍實現任務并行

  但現在,當 B 首次運行從存儲器中執(zhí)行讀取時,A 則已得到其首輪運行的結果,A 的第二輪操作可能已在相同存儲器內執(zhí)行寫入。為避免在使用數據之前寫入數據,您可以依靠某種形式的存儲器擴展(即所謂的雙重緩沖或 PIPO)來達成此交織操作。這種交織操作以任務間的黑色圓圈來表示。

  有一種有效的方法可用于提升吞吐量和復用計算資源,即對運算符、循環(huán)和/或函數進行流水打拍。如果每個任務現在都能與自身重疊,您即可在一輪運行內實現任務并行操作,同時跨多輪運行實現任務流水打拍,這兩者都屬于宏觀級別并行度的例證。多任務內流水打拍則是微觀級別并行度的例證。現在,由于每一輪運行依賴于任務間的最小吞吐量而不是任務的最大吞吐量,因此每一輪的總體吞吐量得以進一步提升。最后,根據通信數據的同步方式,僅當生成全部數據 (PIPO) 或者以逐元素方式 (FIFO) 生成全部數據后,才有可能在一輪運行內出現某種程度的額外重疊。例如,在下圖中,B 和 C 都比 A 更早啟動并以流水打拍方式執(zhí)行,而 D 則假定仍必須等待 B 和 C 完成。這是最后一種類型的單輪運行內重疊,當 A 通過 FIFO 串流訪問(表現為不含圓圈的直線)來與 B 和 C 通信時,才能實現這種方式的重疊。同樣,D 也能與 B 和 C 重疊,前提是采用的通道為 FIFO 而不是 PIPO。但不同于前幾種執(zhí)行模式,使用 FIFO 可能導致死鎖,因此需要正確設置這些串流 FIFO 的大小。

103.JPG

  圖 7. 單輪運行內的任務并行和流水打拍、多輪運行的流水打拍以及單一任務內的流水打拍

  總之,本節(jié)中所演示的三種范例為您展示了如何在避免多線程和/或并行編程語言的復雜操作的同時下,仍能在設計中實現并行操作。生產者使用者范例搭配串流通道即可輕松組合小型系統(tǒng)與大型系統(tǒng)在內的各種系統(tǒng)。如上文所述,串流接口支持輕松耦合并行任務,亦或是分層數據流網絡也不在話下。這其中部分原因是由于編程語言 (C/C++) 能夠靈活支持此類規(guī)范,并且還有各種工具可用于在當今 FPGA 器件上可用的異構計算平臺上實現這些規(guī)范。

  結論 - 性能良方

  本文檔中所演示的設計概念具有一個主要的核心原則,即并行計算模型傾向于通過狀態(tài)封裝和模塊化單元或任務內的順序執(zhí)行來為并行編程提供更簡單的編程模型。隨后,任務將與串流相連(以執(zhí)行同步和通信)。每個串流均可包含不同類型的通道,例如,FIFO 或 PIPO。您不妨思考下為什么這種范例未能推而廣之。現如今的變化在于,每個人手中所使用的并行硬件數量發(fā)生了巨大變化。即使手機都是多核的,并擁有異構加速器(GPU 等)。利用大部分現有編程工具對這些器件進行編程都無疑是一場夢魘。將 OpenCL 、C、Java 和/或 C++ 的位相結合來打造一致的系統(tǒng)極為耗時。而基于串流的處理方式則可為此提供一種解決方案。狀態(tài)/邏輯區(qū)隔化使工具(例如編譯器和調度器)能夠更加輕松地理清何時何地需要運行應用的哪些部分。基于串流的處理方式日漸流行的另一個原因是,它打破了傳統(tǒng)多線程“分叉/連接”模型基于并行執(zhí)行的觀點。通過啟用任務級流水打拍和指令級流水打拍,運行時間可執(zhí)行的并發(fā)操作數量遠遠超過了分叉/連接模型現今所能執(zhí)行的操作數量。這種附加的并行性對于充分利用現今 FPGA 器件上可用的硬件而言至關重要。與啟用流水線并行性如出一轍的是,串流同樣支持設計師構建并行應用,而無需擔心鎖定、爭用條件等可能導致并行編程無從著手的問題。

  最后,建議您依據以下高層次操作檢查表為標準,在可重配置 FPGA 平臺上實現所期望的性能。

  專為 CPU 編寫的軟件與專為 FPGA 編寫的軟件有著本質上的不同。要想編寫可在 CPU 平臺與 FPGA 平臺之間進行移植的代碼,性能犧牲是不可避免的。因此,FPGA 軟件與 CPU 軟件的編寫方式差異巨大,與其抗拒這個事實,不如坦然接受。

  從工程伊始,就應該建立起能夠對源代碼更改進行功能性驗證的流程。基于參考模型或者使用黃金矢量來測試軟件是極為常用的實踐。

  首先專注于設計的宏架構。并考慮使用生產者使用者范例來對解決方案進行建模。

  明確設計的宏架構后,即可繪制出期望的活動時間線,其中以橫軸表示時間,并顯示您期望在多次迭代(或調用)過程中執(zhí)行每一項功能相對于其它功能的時間。這樣您將能夠對設計中期望的并行性了然于胸,后續(xù)即可用于與最終達成的結果進行比較。HLS GUI 通常可用于直觀顯示所達成的并行度。

  僅當您已掌握宏架構并確立活動時間線之后,再開始進行程序編碼或重構。

  一般,HLS 編譯器僅根據函數調用來推斷任務級別并行度。因此,需要在硬件中并發(fā)運行的順序代碼塊(例如循環(huán))應置于專用函數內。

  將原始算法分解/分區(qū)為較小的組件,這些組件可通過串流來彼此進行通信。這樣您就能在一定程度上掌握數據在設計中流動的方式。

  較小的模塊化組件的優(yōu)勢在于,可以按需進行賦值,從而提升并行性。

  請避免通信通道的位寬過寬。將此類寬通道分解為較窄些的通道,這樣有助于在 FPGA 器件上實現。

  大型函數(手寫或通過內聯(lián)較小的函數生成)可能包含重要路徑,工具可能難以處理此類路徑。具有更簡單的控制路徑的小型函數有助于 FPGA 器件上的實現。

  目標是在每個函數內包含單個循環(huán)嵌套(可采用 HLS 工具可推斷的固定循環(huán)邊界,或者手動向 HLS 工具提供循環(huán)次數信息)。這樣可以顯著促進吞吐量的測量和最優(yōu)化。此方法雖然可能不適用于所有設計,但對于大部分案例都很有效。

  吞吐量 - 縱觀全局,掌握設計每個階段期間所需的處理速率,這一點至關重要。這將影響您為 FPGA 編寫應用的方式。

  思考設計中的關鍵路徑(即,關鍵任務級別路徑,如,ABD 或 ACD),調查此關鍵路徑中哪個部分可能成為瓶頸。通過設計仿真,觀察哪幾個任務采用流水打拍,以及任一路徑的不同分支是否在吞吐量方面存在不一致。隨后,可使用 HLS GUI 工具和/或仿真波形查看器來直觀顯示此類吞吐量問題。

  基于串流的通信允許使用者在生產者開始生產時立即開始處理,由此即可支持重疊執(zhí)行(從而提升并行性和吞吐量)。

  為了使生產者和使用者任務保持持續(xù)不間斷運行,請使用流水打拍和調整串流的相應大小等方法來對每項任務的執(zhí)行進行最優(yōu)化,使其能盡快運行。

  請思考串流通道的同步粒度(和開銷)。您可使用 PIPO 通道來重疊任務執(zhí)行,而無需擔心死鎖,顯式手動串流 FIFO 通道支持您(比 PIPO)更快開始重疊執(zhí)行,但請謹慎處理 FIFO 大小調整,以避免死鎖。

  了解有關可綜合的 C/C++ 編碼樣式的更多信息。

  使用 HLS 編譯器生成的報告作為指導來完成最優(yōu)化進程。

  請將上述檢查表放在附近,以便隨時參考。它總結了構建能滿足您的性能目標的設計所需的整個設計活動。

  設計的另一個需要考量的重要方面在于您的加速函數或內核。內核連接外部的接口是最終系統(tǒng)設計的重要要素。您的內核可能需要插入更大的設計或者與更大的內核系統(tǒng)中的其它內核進行通信,或者與系統(tǒng)外部的存儲器或器件進行通信。設計高效內核 提供了另一份檢查表,以供您在設計加速內核的外部接口時考量其中所列出的各項內容。



更多信息可以來這里獲取==>>電子技術應用-AET<<

mmexport1621241704608.jpg

本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯(lián)系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
你懂的国产精品| 欧美国产日韩一区二区| 久久伊人亚洲| 亚洲视频大全| 一区二区三区 在线观看视| 亚洲人成人77777线观看| 亚洲一区二区在线免费观看视频| 亚洲高清视频一区二区| 校园激情久久| 先锋影音久久| 校园春色国产精品| 午夜视频一区二区| 亚洲视频一区二区免费在线观看| 99精品久久久| 一本色道久久88综合日韩精品 | 黄色精品一区二区| 国产性色一区二区| 国产一区二区精品在线观看| 国产一区二区精品| 国内久久精品视频| 在线播放日韩欧美| 亚洲欧洲免费视频| 99www免费人成精品| 亚洲午夜视频在线| 亚洲欧美日韩精品久久久| 午夜精品久久久久久久99樱桃| 久久不射2019中文字幕| 亚洲欧洲免费视频| 一区二区冒白浆视频| 亚洲男人的天堂在线| 欧美主播一区二区三区| 久久综合给合久久狠狠狠97色69| 女生裸体视频一区二区三区| 欧美另类videos死尸| 国产精品久久久久久久久果冻传媒 | 国产日韩欧美另类| 黑人巨大精品欧美一区二区| 亚洲国产一区在线| 一区二区免费看| 欧美一级播放| 亚洲精品视频在线观看免费| 亚洲一区二区三区在线播放| 久久精品一二三| 欧美精品粉嫩高潮一区二区 | 午夜精彩视频在线观看不卡| 亚洲高清免费| 一区二区三区视频在线 | 黄色成人av网站| 亚洲精品综合在线| 亚洲在线成人精品| 亚洲国产日韩一区二区| 中文亚洲字幕| 久久一区国产| 国产精品av一区二区| 狠狠88综合久久久久综合网| 亚洲啪啪91| 欧美一乱一性一交一视频| 亚洲精品裸体| 欧美一区二区三区免费看| 欧美+日本+国产+在线a∨观看| 国产精品国产三级欧美二区 | 欧美二区在线| 国产美女一区二区| 亚洲国产成人精品女人久久久 | 亚洲午夜小视频| 久久久久久久综合狠狠综合| 欧美日韩第一区| 国产夜色精品一区二区av| 亚洲美洲欧洲综合国产一区| 欧美在线播放一区二区| 中文av一区特黄| 麻豆精品视频在线| 国产精品色午夜在线观看| 91久久精品国产91久久| 欧美一区在线视频| 亚洲免费视频在线观看| 男男成人高潮片免费网站| 国产欧美成人| 99re66热这里只有精品4| 久久精品国产免费| 小黄鸭视频精品导航| 欧美片在线观看| 黄色日韩网站| 亚洲一区二区三区乱码aⅴ| 日韩亚洲一区在线播放| 久久亚洲影院| 国产欧美一区二区三区在线老狼| 99精品国产福利在线观看免费 | 亚洲精品中文字幕在线| 久久久久欧美精品| 国产欧美日韩免费| 亚洲视频在线播放| 在线亚洲精品| 欧美激情一区二区三区在线视频观看 | 国产一区二区三区四区| 亚洲先锋成人| 亚洲性视频网址| 欧美日韩国产在线播放网站| 1000部精品久久久久久久久| 欧美亚洲一区在线| 欧美一区二区在线免费播放| 国产精品国产a级| 日韩视频国产视频| 亚洲美女av网站| 蘑菇福利视频一区播放| 樱桃国产成人精品视频| 久久精品国产综合| 久久精品亚洲国产奇米99| 国产毛片精品国产一区二区三区| 中文日韩欧美| 亚洲性感美女99在线| 欧美视频网站| 99www免费人成精品| 一本久久知道综合久久| 欧美乱大交xxxxx| 亚洲精品久久久久中文字幕欢迎你| 亚洲日韩视频| 欧美激情女人20p| 91久久精品国产91性色| 亚洲久色影视| 欧美剧在线观看| 99成人在线| 亚洲女性喷水在线观看一区| 国产精品护士白丝一区av| 一区二区三区免费观看| 亚洲欧美激情四射在线日 | 国产欧美短视频| 欧美一级视频精品观看| 久久久久久久久久看片| 国内揄拍国内精品少妇国语| 久久精品视频一| 欧美fxxxxxx另类| 亚洲精品日韩欧美| 在线视频欧美日韩| 国产精品狼人久久影院观看方式| 亚洲在线黄色| 久久久久久久综合色一本| 狠狠久久亚洲欧美专区| 亚洲欧洲综合| 欧美日韩国产一区| 亚洲一二三区在线观看| 欧美综合国产精品久久丁香| 极品尤物久久久av免费看| 亚洲精品乱码视频| 欧美性天天影院| 性亚洲最疯狂xxxx高清| 免费久久99精品国产| 亚洲精选91| 久久爱www久久做| 亚洲第一视频网站| 亚洲午夜av| 国产综合色产| 99pao成人国产永久免费视频| 国产精品激情| 久久国产加勒比精品无码| 欧美激情va永久在线播放| 亚洲最新在线视频| 久久久精品欧美丰满| 亚洲欧洲在线播放| 先锋影院在线亚洲| 亚洲成色精品| 亚洲欧美国产高清| 精品1区2区| 亚洲在线日韩| 永久免费精品影视网站| 亚洲小视频在线观看| 黄色日韩网站视频| 亚洲午夜国产一区99re久久| 国产综合自拍| 国产精品99久久久久久有的能看| 国产深夜精品| 亚洲最新中文字幕| 国产一区二区三区黄视频| 一本色道久久综合亚洲精品不 | 久久精品亚洲一区二区| 欧美日韩伦理在线免费| 性欧美18~19sex高清播放| 欧美激情影院| 午夜精品久久久久久久男人的天堂| 欧美不卡激情三级在线观看| 亚洲一区日韩| 欧美国产另类| 校园春色综合网| 欧美日韩网站| 久久激情婷婷| 国产精品a级| 亚洲卡通欧美制服中文| 国产农村妇女精品一区二区 | 亚洲无线一线二线三线区别av| 激情久久久久久久久久久久久久久久| 亚洲网站在线| 亚洲国产精品传媒在线观看| 欧美伊人久久大香线蕉综合69| 亚洲人体偷拍| 浪潮色综合久久天堂| 亚洲视频精品| 欧美理论在线播放| 91久久线看在观草草青青| 国产午夜亚洲精品理论片色戒| 亚洲电影在线观看|