最新文章
Vivado HLS生成高效的處理流水線
在重構(gòu)內(nèi)核并生成解耦處理流水線的過程中,用來在不同階段移動(dòng)數(shù)據(jù)的FIFO會(huì)形成很大開銷。通過復(fù)制少量計(jì)算指令可以去除一些FIFO,這樣通常很有好處,因?yàn)榧词故亲钚∩疃鹊腇IFO也會(huì)占用不少FPGA資源。
一般而言,在權(quán)衡利弊以探究最佳設(shè)計(jì)點(diǎn)的過程中,您可以使用成本模型和規(guī)范的優(yōu)化技術(shù)。但在大多數(shù)基準(zhǔn)測(cè)試中,僅僅為它的每個(gè)用戶復(fù)制簡(jiǎn)單的循環(huán)計(jì)數(shù)器就可以節(jié)省很多面積,這也正是我們所做的。在這個(gè)引導(dǎo)性實(shí)例中, 該優(yōu)化是指復(fù)制i的整數(shù)加法器,因此存儲(chǔ)結(jié)果 [i]時(shí)不需要從其它模塊獲得索引。
內(nèi)存的突發(fā)訪問
第三項(xiàng)優(yōu)化是內(nèi)存的突發(fā)訪問(burst-memory access)。為了更高效地利用內(nèi)存帶寬,我們希望通過一次內(nèi)存事務(wù)處理攜帶多個(gè)數(shù)據(jù)字。
AXI總線協(xié)議允許您指定突發(fā)長(zhǎng)度;而且,通過對(duì)解耦C函數(shù)進(jìn)行一些小的修改,并利用流水線化的內(nèi)存訪問模塊,我們就可利用該功能。
除了生成地址以外,解耦C函數(shù)中每個(gè)內(nèi)存操作符還要在連續(xù)存儲(chǔ)塊被訪問時(shí)計(jì)算突發(fā)長(zhǎng)度。循環(huán)計(jì)數(shù)器的復(fù)制還有助于突發(fā)訪問的生成,因?yàn)楸辉L問的字?jǐn)?shù)量可以在每個(gè)解耦函數(shù)中本地確定。
實(shí)驗(yàn)評(píng)估
我們應(yīng)用上述方案做了幾個(gè)案例研究。 為評(píng)估這種方法的優(yōu)勢(shì),我們將使用該方案生成的解耦處理流水線 (DPP)與單純使用HLS生成的加速器進(jìn)行比較。當(dāng)為單純或DPP實(shí)現(xiàn)方案調(diào)用Vivado HLS時(shí),我們將目標(biāo)時(shí)鐘頻率設(shè)置到150MHz,并在布局布線后使用所能達(dá)到的最高時(shí)鐘速率。此外,我們針對(duì)加速器和內(nèi)存子系統(tǒng)之間的交互嘗試了不同的機(jī)制。所用的端口為ACP和HP。我們?yōu)槊總€(gè)端口在可重配置陣列上實(shí)例化一個(gè)64KB高速緩存。
本實(shí)驗(yàn)所用的物理器件是賽靈思的Zynq?-7000 XC7Z020全可編程SoC,安裝在ZedBoard評(píng)估平臺(tái)上。
我們還在Zynq SoC 的ARM?處理器上運(yùn)行應(yīng)用的軟件版本,并將其性能作為實(shí)驗(yàn)的基準(zhǔn)。生成的所有加速器功能齊全,無需任何DMA機(jī)制將數(shù)據(jù)移入和移出可重配置架構(gòu)。
案例研究1:
背包問題
眾所周知,背包問題是一個(gè)組合問題,可以通過動(dòng)態(tài)編程來求解。內(nèi)核的結(jié)構(gòu)如圖4所示。其中黑體字的變量都是在運(yùn)行時(shí)間從內(nèi)存讀取。
圖4 – 背包問題
圖4代碼:
for (w = 1; w <= W; w++) {
int option1 = opt[n-1][ w];
int option2 = -999999;
int opt_without = opt[n-1][ w-cur_weight];
if (cur_weight <= w)
option2 = cur_profit + opt_without;
opt[n][w] = option1> option2? option1:option2;
sol [n][ w] = option2> oprion1? 1:0;
}
因此,無法確切知道從哪個(gè)位置加載的變量opt_without。當(dāng)w和n 比較大時(shí),我們無法在片上緩沖整個(gè)opt陣列。
我們只能讓計(jì)算引擎取回所需的部分。
圖5給出了運(yùn)行時(shí)間對(duì)比情況,將使用我們的方案(DPP)生成的加速器與單純通過HLS推送函數(shù)而生成的加速器進(jìn)行比較。圖中還顯示了在ARM處理器上運(yùn)行函數(shù)時(shí)的性能。
圖5 – 針對(duì)背包問題的運(yùn)行時(shí)間比較
我們將n(項(xiàng)數(shù))固定為40,使w (背包的總重量)在100至3,200之間變化。
從對(duì)比中很容易看出,通過單純使用Vivado HLS來映射軟件內(nèi)核這種方法得到的加速器性能比基準(zhǔn)要求慢很多。
Zynq SoC 上的超標(biāo)量無序式ARM內(nèi)核能很大程度開拓指令級(jí)并行性,而且具有一個(gè)高性能片上高速緩存。Vivado HLS工具提取的附加并行性顯然不足以補(bǔ)償硬處理器內(nèi)核對(duì)于可編程邏輯的時(shí)鐘頻率優(yōu)勢(shì)以及來自可重配置陣列的更長(zhǎng)的數(shù)據(jù)訪問時(shí)延。
不過,當(dāng)內(nèi)核被解耦,分成多個(gè)處理階段時(shí),性能就會(huì)明顯比ARM處理器性能高出約4.5倍。另外,當(dāng)使用DPP時(shí),各種內(nèi)存訪問機(jī)制之間的差別相當(dāng)小——使用我們的方案時(shí),受內(nèi)存訪問時(shí)延的影響要小很多。
案例研究2:稀疏矩陣向量乘法
稀疏矩陣向量(SpMV)乘法是一個(gè)計(jì)算內(nèi)核,已經(jīng)在各種研究項(xiàng)目中以很多不同方法進(jìn)行過研究、變換和基準(zhǔn)確定。這里,我們的目的不是使用特殊數(shù)據(jù)結(jié)構(gòu)和存儲(chǔ)分配方式構(gòu)建最佳性能的SpMV乘法,而是想根據(jù)最基本的算法描述看看在使用Vivado HLS時(shí)重構(gòu)傳遞能提供多少優(yōu)勢(shì)。
如圖6所示,在我們的實(shí)驗(yàn)中,稀疏矩陣以壓縮稀疏行(CSR)格式存儲(chǔ)。在取回?cái)?shù)字以進(jìn)行實(shí)際的浮點(diǎn)乘法之前,需要先執(zhí)行來自索引數(shù)組的負(fù)載。用來決定訪問哪個(gè)控制流程和內(nèi)存位置的數(shù)值只有在運(yùn)行時(shí)間才知道。
圖6 – 稀疏矩陣向量乘法
圖6代碼:
for(s =0; s<dim; s++)
{
int kend = ptr[s];
int k;
float curY = y[s];
for(k = kbegin; k<kend; k++){
int curlnd = indArray[k];
curY = curY +valArray[k] * xvec[curlnd];
}
Y[s] = curY;
kbegin = kend;
}
在圖7所示的運(yùn)行時(shí)間對(duì)比中,矩陣的平均密度為1/16,尺寸在32和2,048之間變化。
圖7 – 針對(duì)稀疏矩陣向量乘法的運(yùn)行時(shí)間對(duì)比
此處,單純的映射法在性能上再次落后于軟件版。當(dāng)不使用FPGA上的高速緩存時(shí),用我們的方法生成的解耦處理流水線在性能上幾乎與基準(zhǔn)性能相同。
當(dāng)在可重配置陣列上實(shí)例化一個(gè)64KB高速緩存時(shí),DPP的性能接近基準(zhǔn)的兩倍。與之前的基準(zhǔn)相比,高速緩存的增加對(duì)DPP的性能具有更顯著的影響。
案例研究3:FLOYD-WARSHALL 算法
Floyd-Warshall是一種圖形算法,用來找到任意一對(duì)頂點(diǎn)之間成對(duì)的最短路徑。內(nèi)存訪問模式比之前的基準(zhǔn)要簡(jiǎn)單。因此,有可能存在一種方法可以設(shè)計(jì)出DMA+加速器結(jié)構(gòu),以獲得很好的計(jì)算重疊和片外通信。我們的方案能試著自動(dòng)實(shí)現(xiàn)這種重疊,但是我們尚未進(jìn)行相關(guān)的研究,以表明絕對(duì)最佳與實(shí)際所得之間的差距。
圖8 –Floyd-Warshall算法
圖8代碼:
for(k=0; k<V; k++)
for(i=0; i<V; i++)
if(i!=k) {
int dik = dis[i][k];
for(j=0; j<V; j++)
if(j!=k) {
int dkj = dist[k][j];
int dij = dist[i][j];
if(dik + dkj < dij )
dist[i][j] = dik + dkj;
}
}
不過,與之前的基準(zhǔn)一樣,我也進(jìn)行了運(yùn)行時(shí)間對(duì)比。這里,我們使圖形的大小在40個(gè)節(jié)點(diǎn)至160個(gè)節(jié)點(diǎn)之間變化。每個(gè)節(jié)點(diǎn)平均有全部節(jié)點(diǎn)的1/3作為其鄰點(diǎn)。
得到的結(jié)果與背包問題中的十分類似。
圖9 – 針對(duì)Floyd-Warshall算法的運(yùn)行時(shí)間比較
解耦處理流水線所實(shí)現(xiàn)的性能約為軟件基準(zhǔn)的3倍,吞吐量達(dá)到任何單純映射法的兩倍多。當(dāng)使用DPP時(shí),對(duì)FPGA高速緩存的影響也很小,展示出了對(duì)于內(nèi)存訪問時(shí)延的容限。
我們這種簡(jiǎn)單的技術(shù)構(gòu)建出的處理流水線可以更好地使用內(nèi)存帶寬,而且對(duì)內(nèi)存時(shí)延有更好的容限,因此能夠改善Vivado HLS的性能。所描述的方法可對(duì)控制數(shù)據(jù)流圖中的內(nèi)存訪問和較長(zhǎng)的依賴循環(huán)解耦,這樣高速緩存缺失就不會(huì)拖延加速器的其它部分。