將TestMatrixMultiply.c內(nèi)容改為:[cpp]?
?
#include?
typedef?int?data_type;??
#define?N?5
const?data_type?MatrixA[]?=?{??
#include?"A.h"??
};??
const?data_type?Vector_b[]?=?{??
#include?"b.h"??
};??
const?data_type?MatlabResult_c[]?=?{??
#include?"c.h"??
};
data_type?HLS_Result_c[N]?=?{0};??
void?CheckResult(data_type?*?matlab_result,data_type?*?your_result);??
int?main(void)??
{??
?printf("Checking?Results: ");??
?MatrixMultiply(MatrixA,Vector_b,HLS_Result_c);??
?CheckResult(MatlabResult_c,HLS_Result_c);??
?return?0;??
}??
void?CheckResult(data_type?*?matlab_result,data_type?*?your_result)??
{??
?int?i;??
?for(i?=?0;i
?{??
??printf("Idx?%d:?Error?=?%d?
",i,matlab_result[i]-your_result[i]);??
?}??
}??
?
首先進(jìn)行C語言仿真驗(yàn)證,點(diǎn)這個按鈕:
結(jié)果如下:
從C仿真輸出看到,仿真結(jié)果與matlab計(jì)算結(jié)果一致,說明我們編寫的C程序MatrixMultiply是正確的。接下來進(jìn)行綜合,按C仿真后面那個三角形按鈕,得到結(jié)果如下:
注意到,計(jì)算延遲為186個時鐘周期。這是未經(jīng)過優(yōu)化的版本,記為版本1。為了提高FPGA并行計(jì)算性能,我們接下來對它進(jìn)行優(yōu)化。打開MatrixMultiply.c,點(diǎn)Directives頁面,可以看到我們可以優(yōu)化的對象。
注意到矩陣和向量相乘是雙層for循環(huán)結(jié)構(gòu)。我們先展開最內(nèi)層for循環(huán),步驟如下:右鍵點(diǎn)擊最內(nèi)側(cè)循環(huán),右鍵,然后Insert Directive...
彈出對話框如下,Directives選擇UNROLL,OK即可,后面所有都保持默認(rèn)。
再次綜合后,結(jié)果如下
可見效果非常明顯,延遲縮短到51個時鐘周期。用同樣方法,展開外層循環(huán),綜合后結(jié)果如下:
計(jì)算延遲又降低了1/3?。?!可是代價呢?細(xì)心的你可能發(fā)現(xiàn)占用資源情況發(fā)生了較大變化,DSP48E1由最初的4個變?yōu)?個后來又成為76個?。?!FPGA設(shè)計(jì)中,延遲的降低,即速度提高,必然會導(dǎo)致面積的增大!循環(huán)展開是優(yōu)化的一個角度,另一個角度是從資源出發(fā)進(jìn)行優(yōu)化。我們打開Analysis視圖,如下所示:
從分析視圖可以看出各個模塊的運(yùn)行順序,從而為優(yōu)化提供更為明確的指引。我們發(fā)現(xiàn)AA_load導(dǎo)致了延遲,如果所有AA的值都能一次性并行取出,勢必會加快計(jì)算效率!回到Synthetic視圖,為AA增加Directives:
選擇Resources,再點(diǎn)Cores后面的方框,進(jìn)入Vivado HLS core選擇對話框
按上圖進(jìn)行選擇。使用ROM是因?yàn)樵谟?jì)算矩陣和向量相乘時,AA為常數(shù)。確認(rèn)。仍然選擇AA,增加Directives,如下圖:
選擇數(shù)組分解,mode選擇完全complete,綜合后結(jié)果如下圖:
延遲進(jìn)一步降低,已經(jīng)降到11個時鐘周期了?。?!是否已經(jīng)達(dá)到極限了呢???答案是否定的。我們進(jìn)入Analysis視圖,看一下還有哪些地方可以優(yōu)化的。經(jīng)過對比發(fā)現(xiàn)bb也需要分解,于是按照上面的方法對bb進(jìn)行資源優(yōu)化,也用ROM-2P類型,也做全分解,再次綜合,結(jié)果如下:
發(fā)現(xiàn)延遲進(jìn)一步降低到8個時鐘周期了?。?!老師,能不能再給力點(diǎn)?可以的?。。。∥覀冞M(jìn)入分析視圖,發(fā)現(xiàn)cc這個回寫的步驟阻塞了整體流程,于是我們將cc也進(jìn)行上述資源優(yōu)化,只不過資源類型要變?yōu)?a href="http://www.brongaenegriffin.com/tags/ram/" target="_blank">RAM_2P,因?yàn)樗切枰獙懭氲?。綜合結(jié)果:
整體延遲已經(jīng)降低到6個clk周期了?。?!再看Analysis視圖:
延遲已經(jīng)被壓縮到極限了。。。。老師,還能再給力點(diǎn)嘛?答案是可以的?。。。∥覀兦懊娴乃羞\(yùn)算都是基于整形數(shù)int,如果將數(shù)值精度降低,將大大節(jié)省資源。注意現(xiàn)在DSP48E1需要100個!看我們?nèi)绾螌①Y源再降下來。這就需要借助“任意精度”數(shù)據(jù)類型了。HLS中除了C中定義的char,shrot,int,long,long long 之外,還有任意bit長度的int類型。我們將代碼開頭的data_type定義改為:[cpp]?
?
#include?
typedef?uint15?data_type; ?
?
評論