一種基于fpga的脈動(dòng)結(jié)構(gòu)矩陣乘法器及其實(shí)現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及FPGA技術(shù)及高性能計(jì)算技術(shù)領(lǐng)域,具體來說是一種基于FPGA的脈動(dòng) 結(jié)構(gòu)矩陣乘法器及其實(shí)現(xiàn)方法。
【背景技術(shù)】
[0002] 矩陣乘法運(yùn)算作為科學(xué)計(jì)算、數(shù)字信號(hào)處理等方面的一個(gè)基本運(yùn)算而得到廣泛應(yīng) 用,并且其計(jì)算性能直接影響到系統(tǒng)的整體性能,隨著計(jì)算數(shù)據(jù)量日益龐大與要求精度水 平的不斷提高,矩陣乘法逐漸成為系統(tǒng)計(jì)算性能的瓶頸。
[0003] 以前的矩陣乘法運(yùn)算通常采用硬件為通用處理器,軟件實(shí)現(xiàn)矩陣乘法的方法或者 是采用硬件為專用的數(shù)字信號(hào)處理器(Digital Signal Process, DSP)實(shí)現(xiàn)。該類處理方 法技術(shù)較為成熟,實(shí)現(xiàn)工具完善,編程簡單的特點(diǎn),但是由于其內(nèi)部結(jié)構(gòu)和平臺(tái)的限制,不 適合對(duì)實(shí)時(shí)性可靠性要求比較高的場合,也不適合應(yīng)用在小型的嵌入式系統(tǒng)中。采用通用 處理器或DSP技術(shù)通常受器件的主頻等因素影響,無法達(dá)到很高的計(jì)算性能。
[0004] 近年來FPGA技術(shù)及其工藝水平的不斷提高,F(xiàn)PGA已能夠應(yīng)用在復(fù)雜密集型的計(jì) 算的場合,而且FPGA特有的可編程性使其能靈活應(yīng)對(duì)各種不同需求的場合,實(shí)現(xiàn)各種不同 邏輯功能,使系統(tǒng)具有良好的可擴(kuò)展性。FPGA固有的細(xì)粒度并行能力,高性能低功耗比,使 其成為嵌入式系統(tǒng)性能加速的最好的選擇之一。
[0005] 如圖1所示的脈動(dòng)結(jié)構(gòu)是一種本身就具備流水線功能的線性結(jié)構(gòu),不同方向數(shù)量 不等的線性結(jié)構(gòu)并行操作,可以得到相當(dāng)高的系統(tǒng)數(shù)據(jù)吞吐量和時(shí)鐘頻率,而且脈動(dòng)結(jié)構(gòu) 具有簡單、規(guī)整、模塊性好的特點(diǎn),只有少量的節(jié)點(diǎn)與外部有10操作,這能使系統(tǒng)保持較好 的處理速度,同時(shí)也可與外部10帶寬之間的平衡,非常適合FPGA實(shí)現(xiàn)。
[0006] 目前使用FPGA實(shí)現(xiàn)并行矩陣乘法方面,大部分將一行和一列的一個(gè)數(shù)據(jù)輸出到N 個(gè)節(jié)點(diǎn),出現(xiàn)輸入模塊扇出過大,布線延遲增加,不具備流水線結(jié)構(gòu),容易出現(xiàn)錯(cuò)誤的問題, 導(dǎo)致整體矩陣乘法器難以達(dá)到較高性能且不可靠,難以滿足計(jì)算實(shí)時(shí)性的要求。除此之外 還出現(xiàn)數(shù)據(jù)輸入控制復(fù)雜,計(jì)算后的結(jié)果讀取困難,而且整體不具有模塊性,移植后需要大 部分修改的缺點(diǎn)。
【發(fā)明內(nèi)容】
[0007] 針對(duì)現(xiàn)有技術(shù)中存在的上述不足之處,本發(fā)明要解決的技術(shù)問題是提供一種能夠 解決現(xiàn)有矩陣乘法器輸入模塊扇出過高,難以達(dá)到較高整體性能,數(shù)據(jù)輸入控制復(fù)雜,計(jì) 算后的結(jié)果讀取困難,而且整體不具有模塊性,移植后需要大部分修改等問題的一種基于 FPGA的脈動(dòng)結(jié)構(gòu)矩陣乘法器及其實(shí)現(xiàn)方法。
[0008] 本發(fā)明為實(shí)現(xiàn)上述目的所采用的技術(shù)方案是:一種基于FPGA的脈動(dòng)結(jié)構(gòu)矩陣乘 法器及其實(shí)現(xiàn)方法,包括:乘法器陣列、時(shí)鐘控制模塊、數(shù)據(jù)輸入控制模塊、數(shù)據(jù)輸出控制模 塊;
[0009] 所述乘法器陣列為Μ行R列的二維網(wǎng)孔陣列結(jié)構(gòu),由MXR個(gè)節(jié)點(diǎn)單元構(gòu)成,并且 相鄰節(jié)點(diǎn)單元之間互聯(lián),用于實(shí)現(xiàn)輸入矩陣A和矩陣B的乘積運(yùn)算;
[0010] 所述時(shí)鐘控制模塊,用于輸出兩路時(shí)鐘,分別提供給數(shù)據(jù)輸入控制模塊和數(shù)據(jù)輸 出控制模塊;
[0011] 所述數(shù)據(jù)輸入控制模塊,用于在時(shí)鐘控制模塊的控制下并行輸入矩陣A和矩陣B, 其中矩陣A為Μ行N歹(J,矩陣B為N行R列;
[0012] 所述數(shù)據(jù)輸出控制模塊,用于輸出矩陣C,其中矩陣C為Μ行R列。
[0013] 所述節(jié)點(diǎn)單元由一個(gè)乘法器,一個(gè)加法器和一個(gè)用于存儲(chǔ)計(jì)算結(jié)果的寄存器組 成;所述乘法器接收該節(jié)點(diǎn)單元的輸入數(shù)據(jù),將乘積結(jié)果發(fā)送給加法器;所述寄存器用于 存儲(chǔ)上一時(shí)鐘周期的數(shù)據(jù)累加和;所述加法器用于將乘法器的乘積結(jié)果和寄存器中上一時(shí) 鐘周期的的數(shù)據(jù)累加和做加法運(yùn)算,并將加法運(yùn)算的結(jié)果發(fā)送給寄存器更新存儲(chǔ)。
[0014] 所述節(jié)點(diǎn)單元內(nèi)部的乘法器采用FPGA內(nèi)部的專用乘法硬核。
[0015] 所述數(shù)據(jù)輸入控制模塊在時(shí)鐘控制模塊的控制下按行輸入矩陣Α、按列輸入矩陣 Β,直至矩陣Α、矩陣Β所有數(shù)據(jù)穿越乘法器陣列的全部節(jié)點(diǎn)單元的整行和整列。
[0016] 所述數(shù)據(jù)輸出控制模塊在時(shí)鐘控制模塊的控制下按行或列進(jìn)行輸出。
[0017] -種基于FPGA的脈動(dòng)結(jié)構(gòu)矩陣乘法器的實(shí)現(xiàn)方法,包括以下步驟:
[0018] 數(shù)據(jù)輸入控制模塊將Μ行Ν列的矩陣Α和Ν行R列的矩陣Β,在時(shí)鐘控制模塊的控 制下并行輸入到乘法器陣列中;
[0019] 輸入數(shù)據(jù)在乘法器陣列中的各個(gè)節(jié)點(diǎn)單元中進(jìn)行乘法運(yùn)算并累加,在時(shí)鐘控制模 塊的控制下,完成所有節(jié)點(diǎn)單元計(jì)算,直到?jīng)]有數(shù)據(jù)輸入;
[0020] 數(shù)據(jù)輸出控制模塊在時(shí)鐘控制模塊的控制下輸出Μ行R列的矩陣C作為矩陣乘法 結(jié)果。
[0021 ] 所述數(shù)據(jù)輸入控制模塊將Μ行Ν列的矩陣Α和Ν行R列的矩陣Β,在時(shí)鐘控制模塊 的控制下并行輸入到乘法器陣列中,使用如下規(guī)則:
[0022] 矩陣A為Μ行N列,Alik是矩陣A的元素 ,i = 1,2,……M,k=l,2……N ;矩陣B 為N行R列,Bt j是矩陣B的元素,k= 1,2……N;j = 1,2,……R。
[0023] 矩陣A的行向量按行號(hào)從小到大的順序依次進(jìn)入到乘法器陣列對(duì)應(yīng)的行,并且相 鄰行向量進(jìn)入乘法器陣列在時(shí)間上相差1個(gè)時(shí)鐘周期,即矩陣A的第i行k列的數(shù)據(jù)\,與 矩陣A的第i-Ι行k-Ι列的數(shù)據(jù)~ lik i同時(shí)進(jìn)入乘法器陣列;
[0024] 矩陣B的列向量按列號(hào)從小到大的順序依次進(jìn)入到乘法器陣列對(duì)應(yīng)的列,并且相 鄰列向量進(jìn)入乘法器陣列在時(shí)間上相差1個(gè)時(shí)鐘周期,即矩陣B的第k行j列的數(shù)據(jù)\ ,與 矩陣B的第k-Ι行j-Ι列的數(shù)據(jù)Bk i, i同時(shí)進(jìn)入乘法器陣列;
[0025] 并且,矩陣A按行進(jìn)入到乘法器陣列與矩陣B按列進(jìn)入到乘法器陣列在時(shí)間上并 行,即A lik和\ ,是在同一時(shí)鐘周期下進(jìn)入乘法器陣列,直至矩陣A和矩陣B的所有元素全 部穿越MXR個(gè)節(jié)點(diǎn)單元組成的乘法器陣列的整行和整列,使數(shù)據(jù)到達(dá)各個(gè)節(jié)點(diǎn)單元的輸 入控制滿足時(shí)間對(duì)準(zhǔn)的輸入規(guī)則。
[0026] 所述輸入數(shù)據(jù)在乘法器陣列中的各個(gè)節(jié)點(diǎn)單元中進(jìn)行乘法運(yùn)算并累加,在單個(gè)節(jié) 點(diǎn)單元中,執(zhí)行以下步驟:
[0027] 1)接收脈動(dòng)方向的行和列的上一個(gè)節(jié)點(diǎn)的數(shù)據(jù);
[0028] 2)計(jì)算兩個(gè)數(shù)據(jù)的乘積,并與原來寄存的結(jié)果進(jìn)行累加;
[0029] 3)保存累加后的值,將接受的行輸入數(shù)據(jù)輸出到下一個(gè)行節(jié)點(diǎn),接受的列輸入數(shù) 據(jù)輸出到下一個(gè)列節(jié)點(diǎn)。
[0030] 與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:
[0031] 1.本發(fā)明采用脈動(dòng)結(jié)構(gòu)的矩陣陣列結(jié)構(gòu),具有完全的流水線特點(diǎn),對(duì)輸入方的扇 出要求很低,能達(dá)到很高的計(jì)算性能,經(jīng)測試,使用Altera DE2開發(fā)板實(shí)現(xiàn)可以達(dá)到將近 200M的最大時(shí)鐘頻率,而且在矩陣規(guī)模變大時(shí),仍然能保持較高的時(shí)鐘頻率。
[0032] 2.本發(fā)明采用雙時(shí)鐘控制整個(gè)矩陣乘法器的方法,使輸入計(jì)算過程和輸出過程使 用獨(dú)立的時(shí)鐘,易操作性好,能避免誤操作,而且能適用計(jì)算方與讀取方時(shí)鐘不同的場合。
[0033] 3.本發(fā)明具有很好的模塊性,特別適合作為一個(gè)模塊應(yīng)用在嵌入式系統(tǒng)中,對(duì)于 不同的計(jì)算規(guī)模,因?yàn)殛嚵兄械墓?jié)點(diǎn)都是相同的,只要將陣列重新排列即可,方便重配置。
[0034] 4.本發(fā)明具有良好的低功耗性能,使用了雙時(shí)鐘控制計(jì)算過程,在沒有計(jì)算工作 的情況下,關(guān)閉時(shí)鐘,大大降低了矩陣乘法器的總體功耗,適合在嵌入式系統(tǒng)中使用。
【附圖說明】
[0035] 圖1為本發(fā)明方法中脈動(dòng)陣列原理圖;
[0036] 圖2為本發(fā)明方法中矩陣乘法器的內(nèi)部結(jié)構(gòu)示意圖;
[0037] 圖3為本發(fā)明方法中矩陣乘法器時(shí)鐘控制模塊示意圖;
[0038] 圖4為本發(fā)明方法中節(jié)點(diǎn)單元內(nèi)部結(jié)構(gòu)圖;
[0039] 圖5為本發(fā)明方法中矩陣乘法器輸入實(shí)例圖;
[0040] 圖6為本發(fā)明方法中矩陣乘法器在不同輸入計(jì)算時(shí)鐘下的數(shù)據(jù)輸入計(jì)算狀態(tài)圖。
【具體實(shí)施方式】
[0041] 下面結(jié)合附圖及實(shí)施例對(duì)本發(fā)明做進(jìn)一步的詳細(xì)說明。
[0042] 如圖2所示,一種基于FPGA的脈動(dòng)結(jié)構(gòu)矩陣乘法器包括:乘法器陣列、時(shí)鐘控制模 塊、數(shù)據(jù)輸入控制模塊、數(shù)據(jù)輸出控制模塊;所述乘法器陣列為Μ行R列的二維網(wǎng)孔陣列結(jié) 構(gòu),由MXR個(gè)節(jié)點(diǎn)單元構(gòu)成,并且相鄰節(jié)點(diǎn)單元之間互聯(lián),用于實(shí)現(xiàn)輸入矩陣Α和矩陣Β的 乘積運(yùn)算;所述時(shí)鐘控制模塊,用于輸出兩路時(shí)鐘,分別提供給數(shù)據(jù)輸入控制模塊和數(shù)據(jù)輸 出控制模塊;所述數(shù)據(jù)輸入控制模塊,用于在時(shí)鐘控制模塊的控制下并行輸入矩陣A和矩 陣B,其中矩陣A為Μ行N列,矩陣B為N行R列;所述數(shù)據(jù)輸出控制模塊,用于輸出矩陣C, 其中矩陣C為Μ行R列。所述數(shù)據(jù)輸入控制模塊在時(shí)鐘控制模塊的控制下按行輸入矩陣Α、 按列輸入矩陣Β,直至矩陣Α、矩陣Β所有數(shù)據(jù)穿越乘法器陣列的全部節(jié)點(diǎn)單元的整行和整 列。所述數(shù)據(jù)輸出控制模塊在時(shí)鐘控制模塊的控制下按行或列進(jìn)行輸出。其中C矩陣為Μ 行R列,并且C = ΑΧΒ。
[0043] 如圖3所示,為本發(fā)明方法中矩陣乘法器時(shí)鐘控制模塊示意圖,矩陣乘法器使用 輸入計(jì)算時(shí)鐘CLK1和輸出時(shí)鐘CLK2兩個(gè)時(shí)鐘,輸入計(jì)算時(shí)鐘來自計(jì)算方,圖中用黑線表 示;輸出時(shí)鐘來自讀取方,圖中用虛線表示。輸入計(jì)算時(shí)鐘主要用作輸入控制模塊和節(jié)點(diǎn) 的CLK1時(shí)鐘;輸出時(shí)鐘主要用作數(shù)據(jù)輸出模塊的時(shí)鐘和節(jié)點(diǎn)的CLK2時(shí)鐘。時(shí)鐘控制模塊 控制整個(gè)矩陣計(jì)算流程,計(jì)算方使用Reql請(qǐng)求計(jì)算,模塊根據(jù)自身狀態(tài)以Ackl回復(fù)給計(jì)算 方;讀取方,使用Req2請(qǐng)求讀取結(jié)果,模塊根據(jù)自身狀態(tài)以Ack2回復(fù)給讀取方。輸入和計(jì) 算狀態(tài)時(shí),輸入計(jì)算時(shí)鐘CLK1使能,輸出時(shí)鐘CLK2關(guān)閉;當(dāng)處于輸出狀態(tài)時(shí),輸入計(jì)算時(shí)鐘 CLK1關(guān)閉,輸出時(shí)鐘CLK2使能。
[0044] 如圖4所示,節(jié)點(diǎn)單元是構(gòu)成乘法器陣列的基本單元,由一個(gè)乘法器,一個(gè)加法器 和一個(gè)用于存儲(chǔ)計(jì)算結(jié)果的寄存器構(gòu)成。所述乘法器接收該節(jié)點(diǎn)單元的輸入數(shù)據(jù),將乘積 結(jié)果發(fā)送給加法器;所述寄存器用于存儲(chǔ)上一時(shí)鐘周期的數(shù)據(jù)累加和;所述加法器用于將 乘法器的乘積結(jié)果和寄存器中上一時(shí)鐘周期的的數(shù)據(jù)累加和做加法