動(dòng)態(tài)參數(shù)指標(biāo):這些參數(shù)本質(zhì)上是動(dòng)態(tài)的,取決于系統(tǒng)。例如,與 DDR/HBM 的通信效率在C綜合編譯時(shí)是未知的。 本文給大家提供利用axi_master接口指令端的幾個(gè)靜態(tài)參數(shù)的優(yōu)化技巧,從擴(kuò)展總線接口數(shù)量,擴(kuò)展總線位寬,循環(huán)展開等角度入手。最核心的優(yōu)化思想就是以資源面積換取高帶寬的以便并行計(jì)算。
熟記這本文幾個(gè)關(guān)鍵的設(shè)計(jì)點(diǎn),讓你的HLS內(nèi)核接口效率不再成為設(shè)計(jì)的瓶頸!
?
以上代碼在進(jìn)行了c綜合后,我們所有的指針變量都會(huì)依據(jù)指令的設(shè)置映射到axi-master上,但是因?yàn)楦鶕?jù)指令中所有的端口都綁定到了一條總線gmem上。所以在綜合的警告里面會(huì)提示:?
?WARNING: [HLS 200-885] The II Violation in module 'example_Pipeline_VITIS_LOOP_55_1' (loop 'VITIS_LOOP_55_1'):Unable to schedule bus request operation ('gmem_load_1_req', example.cpp:56) on port 'gmem' (example.cpp:56) due to limited memory ports(II = 1). Please consider using a memory core with more ports or partitioning the array.
因?yàn)樵赼xi-master總線上最高只能支持一個(gè)讀入和一個(gè)寫出同時(shí)進(jìn)行,如果綁定到一條總線則無(wú)法同時(shí)從總線讀入兩個(gè)數(shù)據(jù),所以最終的循環(huán)的II=2。解決這個(gè)問題的方法就是用面積換速度,我們實(shí)例化兩條axi總線gmem和gmem0,最終達(dá)到II=1。
?
當(dāng)總線數(shù)量滿足了我們并行讀入的要求后,讀取數(shù)據(jù)的位寬就成為了我們優(yōu)化的方向:?
因?yàn)樽x取的數(shù)據(jù)格式是int類型,所以這里的數(shù)據(jù)位寬就是32bit。
?
?
為了能夠轉(zhuǎn)移數(shù)據(jù)傳輸瓶頸,在Vitis kernel target flow中,數(shù)據(jù)位寬在512bit的時(shí)候能夠達(dá)到最高的數(shù)據(jù)吞吐效率。在Vitis HLS 中的新增了 max_widen_bitwidth 選項(xiàng)來(lái)自動(dòng)將較短的數(shù)據(jù)位寬拼接到設(shè)定的較長(zhǎng)的數(shù)據(jù)位寬選項(xiàng)。在這里我們可以將位寬設(shè)置到512bit的位寬,但是同時(shí)要向編譯器說明,原數(shù)據(jù)位寬和指定的擴(kuò)展位寬成整數(shù)倍關(guān)系。這個(gè)操作很簡(jiǎn)單,在數(shù)據(jù)讀取的循環(huán)邊界上,用(size/16)*16示意編譯器即可。
?
?
擴(kuò)展位寬后的結(jié)果可以在綜合報(bào)告的接口部分看到數(shù)據(jù)位寬已經(jīng)從32位擴(kuò)展到512位。?
?
?
優(yōu)化到這一步我們的設(shè)計(jì)可以進(jìn)行大位寬的同步讀寫,但是發(fā)現(xiàn)循環(huán)的trip count還是執(zhí)行了1024次, 也就是說雖然位寬拓展到512后,還是一個(gè)循環(huán)周期計(jì)算一次32bit的累加。實(shí)際上512bit的數(shù)據(jù)位寬可以允許16個(gè)累加計(jì)算并行執(zhí)行。?
?
?
為了完成并行度的優(yōu)化,我們需要在循環(huán)中添加系數(shù)為16的unroll 指令,這樣就可以生成16個(gè)并行執(zhí)行累加計(jì)算的硬件模塊以及線程。?
?
?
在循環(huán)中并行執(zhí)行的累加操作,我們可以從schedule viewer中觀察到并行度,可以從bind_op窗口中觀察到operation實(shí)現(xiàn)所使用的硬件資源,可以從循環(huán)的trip_count 降低到了1024/16=64個(gè)周期,以及大大縮小的模塊的整個(gè)latency中得以證明。?
?
?
?
最后我們比較了一下并行執(zhí)行16個(gè)累加計(jì)算前后的綜合結(jié)果,可以發(fā)現(xiàn)由于有數(shù)據(jù)的按位讀寫拆分拼接等操作,整個(gè)模塊的延遲雖然沒有縮短為16分之一,但是縮短為5分之一也是性能的極大提升了。?
?
?
最后的最后,RTL級(jí)別的co-sim仿真才讓我們更加確信了數(shù)據(jù)的從兩個(gè)并行讀寫,循環(huán)執(zhí)行的周期減小至了64個(gè)時(shí)鐘周期。?
?
?
以上內(nèi)容是設(shè)計(jì)者在AXI總線接口中使用傳統(tǒng)的數(shù)據(jù)類型時(shí),提升數(shù)據(jù)傳輸效率和帶寬的一攬子有效方法:
?第一,擴(kuò)展總線接口數(shù)量,以便并行讀寫。第二,擴(kuò)展總線位寬,增加讀寫帶寬。第三,循環(huán)展開,例化更多計(jì)算資源以便并行計(jì)算。
本文的優(yōu)化方式還是基于內(nèi)核設(shè)計(jì)本身的,下一篇文章,我們將使用Alveo板卡做一些突發(fā)傳輸?shù)膶?shí)驗(yàn),深度定制傳輸需求,以真實(shí)仿真波形和測(cè)得的傳輸速度,從系統(tǒng)級(jí)別強(qiáng)化我們對(duì)于突發(fā)讀寫效率的認(rèn)知。
審核編輯 :李倩-
接口
+關(guān)注
關(guān)注
33文章
9521瀏覽量
157045 -
靜態(tài)
+關(guān)注
關(guān)注
1文章
30瀏覽量
14840 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73985
原文標(biāo)題:開發(fā)者分享 | HLS, 巧用AXI_master總線接口指令的定制并提升數(shù)據(jù)帶寬-面積換速度
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
利用開源uart2axi4實(shí)現(xiàn)串口訪問axi總線
使用AXI4接口IP核進(jìn)行DDR讀寫測(cè)試
利用蜂鳥E203搭建SoC【1】——AXI總線的配置與板級(jí)驗(yàn)證
將e203 例化AXI總線接口
蜂鳥E203內(nèi)核優(yōu)化方法
利用拼多多 API 接口,實(shí)現(xiàn)拼多多店鋪物流時(shí)效優(yōu)化
利用Arm i8mm指令優(yōu)化llama.cpp
RDMA簡(jiǎn)介9之AXI 總線協(xié)議分析2
NVMe IP之AXI4總線分析
VirtualLab 應(yīng)用:傾斜光柵的參數(shù)優(yōu)化及公差分析
NVMe協(xié)議簡(jiǎn)介之AXI總線
一文詳解AXI DMA技術(shù)
AXI 接口設(shè)計(jì)避坑指南:AXI接口筆記
利用axi_master接口指令端的幾個(gè)靜態(tài)參數(shù)的優(yōu)化技巧
評(píng)論