在科學(xué)計(jì)算中,需要大量的矩陣運(yùn)算,而矩陣運(yùn)算中乘法運(yùn)算是其他運(yùn)算的基礎(chǔ),如能提高嵌入式系統(tǒng)中浮點(diǎn)矩陣乘法運(yùn)算的速度,則可加快其他類型的矩陣運(yùn)算速度。
目前實(shí)現(xiàn)浮點(diǎn)矩陣運(yùn)算的方法,有直接使用VHDL語言編寫的浮點(diǎn)矩陣相乘處理單元[1],關(guān)鍵技術(shù)是乘累加單元的設(shè)計(jì),通常依據(jù)設(shè)計(jì)者的編程水平?jīng)Q定硬件性能。同樣,FPGA廠商也推出了一定規(guī)模的浮點(diǎn)矩陣運(yùn)算IP核[2],其應(yīng)用針對本廠家器件,且經(jīng)過專業(yè)調(diào)試和硬件實(shí)測,性能穩(wěn)定且優(yōu)于手寫代碼,但還有一些可改進(jìn)的地方。
本文基于Altera的算法IP核,采用數(shù)選方式對矩陣運(yùn)算中的單精度浮點(diǎn)矩陣相乘進(jìn)行改進(jìn),可推廣到階數(shù)更高的矩陣運(yùn)算和雙精度浮點(diǎn)、復(fù)數(shù)單精度浮點(diǎn)運(yùn)算中。
1 浮點(diǎn)矩陣相乘的IP核原理
Altera公司推出的浮點(diǎn)矩陣相乘IP核ALTFP_MATRIX_MULT,適用于Quartus10.1版本以上的軟件環(huán)境,能夠進(jìn)行一定規(guī)模的浮點(diǎn)矩陣計(jì)算,原理圖如圖1所示。
?
圖1的矩陣相乘結(jié)合流水線方式控制數(shù)據(jù)流動,關(guān)鍵部分為核心PE(Processing Element)單元實(shí)現(xiàn)兩浮點(diǎn)數(shù)的相乘。輸入數(shù)據(jù)在控制器的引導(dǎo)下分為AA矩陣和BB矩陣,分別存于M144K或M9K存儲器中,在計(jì)算指令的控制下做浮點(diǎn)相乘運(yùn)算,接著并行地浮點(diǎn)相加完成輸出。分析整個(gè)計(jì)算結(jié)構(gòu),要達(dá)到較好的性能就需要耗費(fèi)多個(gè)存儲器和多個(gè)浮點(diǎn)相乘單元。列出矩陣相乘的基本時(shí)序圖如圖2所示。
?
從時(shí)序圖可見,整個(gè)IP核有7個(gè)輸入、4個(gè)輸出,分為數(shù)據(jù)加載、數(shù)據(jù)處理、數(shù)據(jù)輸出三個(gè)階段。在系統(tǒng)同步時(shí)鐘sysclk的驅(qū)動下,loadaa、loadbb對數(shù)據(jù)loaddata進(jìn)行乘數(shù)矩陣、被乘數(shù)矩陣使能,將數(shù)據(jù)加載到存儲器中。當(dāng)calcimatrix上升沿到來時(shí),進(jìn)行矩陣乘法運(yùn)算并輸出數(shù)據(jù)outdata,且在outvalid為高電平時(shí)有效。在整個(gè)數(shù)據(jù)輸出有效階段,完成信號done處于低電平,其余階段為高電平。
浮點(diǎn)矩陣運(yùn)算IP核的運(yùn)算方式分為單精度、雙精度、復(fù)數(shù)單精度三種方式,矩陣運(yùn)算階數(shù)有8、16、32、64、96、128階6種,并不能實(shí)現(xiàn)任意階矩陣的相乘,隨著矩陣階數(shù)的增大,最高時(shí)鐘頻率在下降,同時(shí)占用器件資源在增加,耗用最多的是存儲器資源,呈幾何倍數(shù)增長。
2 數(shù)選實(shí)矩陣相乘設(shè)計(jì)
在矩陣相乘運(yùn)算中最基礎(chǔ)的是2階矩陣的相乘,核心部分為乘累加器[3],通過適當(dāng)數(shù)選控制,可使整個(gè)矩陣運(yùn)算具有高時(shí)鐘頻率。如圖3為2階矩陣相乘電路。
整個(gè)矩陣相乘模塊的設(shè)計(jì),結(jié)合數(shù)據(jù)選擇的控制方式,分為流水線數(shù)據(jù)輸入、數(shù)據(jù)相乘、數(shù)據(jù)輸出三部分。在流水線數(shù)據(jù)輸入模塊,采用流水線的方式輸入乘矩陣數(shù)據(jù)KA、KB,被乘數(shù)矩陣數(shù)據(jù)A、B,以同步系統(tǒng)時(shí)鐘啟動兩個(gè)數(shù)據(jù)選擇器,由cntr0控制兩個(gè)數(shù)選器選擇數(shù)據(jù)輸出到乘法器兩端;將乘法器的輸入數(shù)據(jù)相乘并存于寄存器中;最后在數(shù)據(jù)輸出部分cntr1模塊的控制下,累加輸出矩陣數(shù)據(jù)X、Y,完成矩陣運(yùn)算。以Altera器件EP2C35F672C6為映射器件,其時(shí)鐘頻率為250 MHz。在Quartus7.2軟件編程下,運(yùn)行此2階乘法器,可獲得248.69 MHz的最高時(shí)鐘頻率。占用資源為172個(gè)邏輯單元、152個(gè)寄存器、2個(gè)9位乘法器,且在輸入數(shù)據(jù)之后2個(gè)時(shí)鐘輸出運(yùn)算結(jié)果,如圖4所示。設(shè)計(jì)具有較高的計(jì)算性能,關(guān)鍵點(diǎn)在于數(shù)據(jù)選擇器在電路運(yùn)算過程中的作用,取代了存儲器單一存儲的目的,可進(jìn)行乒乓式實(shí)時(shí)數(shù)據(jù)流動,提高系統(tǒng)運(yùn)算效率,節(jié)省了一半存儲器。
圖4中乘矩陣[KA KB]在Matlab中的表示為[5 3;2 4],被乘矩陣[A B]表示為[2 2;3 4],得到的輸出結(jié)果為[16 27;12 22],可見FPGA運(yùn)算結(jié)果與Matlab結(jié)果一致。
?
3 浮點(diǎn)矩陣相乘運(yùn)算的改進(jìn)
本文以16×16階浮點(diǎn)矩陣相乘為例,采用單精度浮點(diǎn)計(jì)算方式,結(jié)合2階高速矩陣運(yùn)算電路對16階矩陣運(yùn)算進(jìn)行改進(jìn),其他高階矩陣運(yùn)算可采用類推的方式完成。
3.1 高階矩陣運(yùn)算分解
高階矩陣分解運(yùn)算是通過分解大規(guī)模矩陣為許多子矩陣進(jìn)行計(jì)算的方式,所以可將16×16階矩陣劃分為4個(gè)8×8階矩陣,實(shí)現(xiàn)2階矩陣相乘。16×16階矩陣相乘運(yùn)算,可表達(dá)為式(1):
?
從式(1)的16階矩陣相乘運(yùn)算,可知其需要8次8階浮點(diǎn)矩陣相乘和4次8階浮點(diǎn)矩陣相加運(yùn)算。分析可得,在數(shù)據(jù)并行輸入輸出的情況下,相比較于16階矩陣IP核的運(yùn)行方式,此種分解方式性能要高。主要由于IP核運(yùn)行方式跨度長,在數(shù)據(jù)輸入時(shí),需要經(jīng)過16×16級存儲器,而本文設(shè)計(jì)的方式只需要8×8級存儲和4次并行的浮點(diǎn)相加運(yùn)算,同時(shí)相比較于16階IP耗用存儲資源和浮點(diǎn)乘法單元數(shù)較少。
3.2 矩陣相乘硬件實(shí)現(xiàn)
采用Quartus10.1軟件設(shè)計(jì)16階單精度浮點(diǎn)矩陣相乘電路,使用VHDL語言[4]編寫,模塊由流水線數(shù)據(jù)輸入、矩陣相乘、鎖存器、浮點(diǎn)加法數(shù)選模塊4部分組成,設(shè)計(jì)框圖如圖5所示。
在流水線數(shù)據(jù)輸入部分,對數(shù)據(jù)data進(jìn)行分割,當(dāng)信號load為高電平時(shí)使能,同時(shí)進(jìn)行數(shù)據(jù)的緩存和生成控制位,輸出的三位控制位(calcimatrix、loadaa、loadbb)控制著下一步矩陣相乘的運(yùn)算,在loadaa與loadbb高電平交互之間的數(shù)據(jù)值取0,具有數(shù)據(jù)緩存和分割的作用。最后一個(gè)模塊需要進(jìn)行8×8階矩陣的32位浮點(diǎn)加法運(yùn)算,同時(shí)輸出數(shù)據(jù)有效電平,使用Altera altfp_add_sub IP 核實(shí)現(xiàn)單精度浮點(diǎn)加法器,可根據(jù)用戶的定制完成。對圖5的模塊加入幾個(gè)輸出結(jié)果,使用modelsim6.5進(jìn)行仿真,可得16階矩陣運(yùn)算仿真結(jié)果如圖6所示。
?
從圖6可見loadaa、loadbb、calcimatrix三者的時(shí)序滿足浮點(diǎn)矩陣運(yùn)算的時(shí)序圖,在前兩者數(shù)據(jù)加載后,即可獲得calcimatrix上升沿,進(jìn)行矩陣相乘。輸出結(jié)果分為4個(gè)大組,各大組有8小組,每一小組由8個(gè)數(shù)據(jù)組成,具有較好的計(jì)算結(jié)果。
4 性能比較分析
4.1 性能比較
將第3節(jié)設(shè)計(jì)的16階矩陣相乘電路與Altera自身提供的IP核進(jìn)行比較。同時(shí)以8階矩陣相乘為基,以第2節(jié)的方式設(shè)計(jì)4×4階數(shù)選實(shí)矩陣電路,套用于32×32階矩陣運(yùn)算中,與Altera的IP核比較。IP核使用最高性能運(yùn)行,同時(shí)以資源消耗、浮點(diǎn)操作數(shù)[5]、最高時(shí)鐘頻率、吞吐量作為比較準(zhǔn)則,其中浮點(diǎn)操作數(shù)的計(jì)算表達(dá)式為:
?
依據(jù)以上浮點(diǎn)操作數(shù)計(jì)算方式,使用Quartus10.1軟件進(jìn)行編程,映射到Stratix III系列的器件中,可獲得相應(yīng)的對比表如表1所示。
?
從表1結(jié)果可見改進(jìn)的浮點(diǎn)運(yùn)算電路在ALM的資源占用減少了許多。原因?yàn)樵诰仃囈?guī)模增大時(shí),只使用了8階浮點(diǎn)矩陣運(yùn)算,浮點(diǎn)IP核中的乘加核數(shù)量不變,所以消耗的浮點(diǎn)相乘單元不變,同樣增添的浮點(diǎn)加法器也只消耗了不多的ALM資源。而對于改進(jìn)的兩類矩陣相乘都只使用8階矩陣乘法,所以在乘法器和M9K存儲器這兩類邏輯單元的消耗不變。為了達(dá)到較好的性能,需要少量外圍存儲器處理數(shù)據(jù)的流動和浮點(diǎn)相加運(yùn)算,但整體存儲器消耗降低。觀察吞吐量可知,套用的數(shù)選式矩陣相乘模塊,當(dāng)階數(shù)增大時(shí)吞吐量降低,幅度明顯,而選擇2階數(shù)選矩陣具有乒乓結(jié)構(gòu),性能有所提升。同理適用于浮點(diǎn)操作數(shù)的情況。最后整個(gè)運(yùn)算電路的最高時(shí)鐘頻率始終是提升的。與Altera公司的IP核比較,改進(jìn)的16階浮點(diǎn)矩陣運(yùn)算電路性能較好,而32階運(yùn)算電路性能卻未達(dá)到要求。
對高階矩陣進(jìn)一步分析,在32階運(yùn)算電路的設(shè)計(jì)中,使用16階浮點(diǎn)矩陣為乘法運(yùn)算部分,以2×2實(shí)矩陣運(yùn)算電路為核心,能夠提升32階電路的運(yùn)算性能。
4.2 精度分析
以16階矩陣的運(yùn)算進(jìn)行精度分析,取乘矩陣與被乘矩陣各16個(gè)數(shù)據(jù)進(jìn)行計(jì)算分析,列出表2數(shù)據(jù),其中B矩陣為現(xiàn)有數(shù)據(jù)的轉(zhuǎn)置,以Matlab和FPGA運(yùn)算結(jié)果進(jìn)行對比。
?
從Matlab與FPGA計(jì)算結(jié)果可見,計(jì)算輸出近乎完全相同,相差的數(shù)據(jù)值也是由于Matlab在計(jì)算中需要先轉(zhuǎn)化為雙精度運(yùn)算后才轉(zhuǎn)化為單精度數(shù),從而得出FPGA計(jì)算具有較高的精度。
本設(shè)計(jì)降低存儲器和計(jì)算資源消耗,提升了系統(tǒng)吞吐量、浮點(diǎn)運(yùn)算性能和運(yùn)行最高時(shí)鐘頻率。這種改進(jìn)的浮點(diǎn)矩陣乘法器對降低資源消耗、提升系統(tǒng)性能具有重大意義。同時(shí),利用VHDL語言編寫,具有模塊化設(shè)計(jì)思想,使得本設(shè)計(jì)可移植性強(qiáng)、通用性好,只需要在現(xiàn)有IP核的基礎(chǔ)上進(jìn)行小規(guī)模改進(jìn),即可擁有較高性能,具有一定的工程實(shí)際意義和應(yīng)用前景。
評論
查看更多