FAE講堂:如何加快處理器的正弦計(jì)算
我們使用一些Slice和乘法器,對(duì)這些硬件模塊中的兩個(gè)進(jìn)行例化。兩個(gè)內(nèi)核都要求4到5個(gè)周期的延遲,以匹配我們?cè)O(shè)計(jì)的時(shí)序要求。延遲在此不是什么問(wèn)題,我們將在下面的步驟中進(jìn)行討論。
本文引用地址:http://www.biyoush.com/article/119301.htm我們將最終的IP以MicroBlaze的快速單工鏈路 (FSL) IP 的形式進(jìn)行實(shí)現(xiàn)。對(duì)時(shí)序的第一次估算結(jié)果表明:
• 將數(shù)據(jù)從MicroBlaze傳輸?shù)紽SL總線需用一個(gè)時(shí)鐘周期
• 將數(shù)據(jù)從FSL總線傳輸至FSL IP(當(dāng)正弦計(jì)算的自變量從FSL總線讀出時(shí),將立即從BRAM讀取數(shù)據(jù),因而無(wú)需時(shí)鐘周期)需用一個(gè)時(shí)鐘周期
• 完成MUL運(yùn)算 (cos(x)*sin(d)) 需用四個(gè)時(shí)鐘周期
• 將方程的結(jié)果存儲(chǔ)到寄存器中需用一個(gè)時(shí)鐘周期
• 完成ADD運(yùn)算需用四個(gè)時(shí)鐘周期
• 將數(shù)據(jù)發(fā)送回FSL總線需用一個(gè)時(shí)鐘周期
• MicroBlaze從FSL IP讀取數(shù)據(jù)需用一個(gè)時(shí)鐘周期。
請(qǐng)注意,在沒(méi)有使用任何額外流水線(我們將在下一步驟中討論這一點(diǎn))的情況下,自變量數(shù)據(jù)在整個(gè)過(guò)程中必須保持穩(wěn)定。這就意味著MicroBlaze僅能請(qǐng)求一次正弦計(jì)算,且必須讀取該值,然后至少要等上13個(gè)時(shí)鐘周期,才能請(qǐng)求下一次計(jì)算。
因此,我們估計(jì)進(jìn)行該實(shí)現(xiàn)需要13個(gè)時(shí)鐘周期。當(dāng)然,要處理軟件上的函數(shù)調(diào)用以及某些其他運(yùn)算,還需要更多的時(shí)鐘周期。
我們簡(jiǎn)單地把一些標(biāo)準(zhǔn)時(shí)鐘組合在一起,不到一天就實(shí)現(xiàn)了該IP,隨即在硬件中對(duì)該算法進(jìn)行測(cè)量。整個(gè)算法(軟硬件混合)耗用了360個(gè)時(shí)鐘周期(包括所有的函數(shù)調(diào)用)。雖然這已是顯著的進(jìn)步,但是仍不足以充分滿足客戶的需求。
在我們的加速器IP處理所有數(shù)據(jù)之前,我們使用一個(gè)SRL16來(lái)延遲信號(hào)的寫(xiě)入。
雖然該算法現(xiàn)在可與我們的MicroBlaze并行運(yùn)行,但它每次只能計(jì)算一個(gè)值。
步驟六:添加流水線和適配客戶代碼
設(shè)計(jì)到了這一步,我們就可以開(kāi)始向我們的內(nèi)核添加流水線。浮點(diǎn)ADD和浮點(diǎn)MUL的CORE Generator模塊已采用流水線實(shí)現(xiàn),因而我們?cè)诖藷o(wú)需再做什么。第一個(gè)版本的算法要求自變量保持恒定,直至計(jì)算完成。在開(kāi)始新計(jì)算之前(自變量數(shù)據(jù)到達(dá)FSL IP內(nèi)部),立刻讀取兩個(gè)BRAM并執(zhí)行浮點(diǎn)MUL。運(yùn)算的結(jié)果在數(shù)個(gè)時(shí)鐘周期后生效。
我們的 sin(xi) 的自變量 xi 是一個(gè)20位寬的整數(shù),它分為 x 和 d 兩個(gè)部分。因此,我們必須對(duì)自變量 xi的MSB部分 x 進(jìn)行幾個(gè)時(shí)鐘周期的延遲,以讀取 BRAM 的內(nèi)容,存儲(chǔ)自變量xi,并將其與MUL運(yùn)算的結(jié)果相匹配。
我們?yōu)槲覀兊?0位寬數(shù)值使用了少量SRL16元件(總共 10 個(gè)),共占用了10個(gè)LUT(但由于Spartan-6具有LUT組合功能,如果采用該器件較寬的LUT6結(jié)構(gòu),則僅需 5 個(gè) LUT 即可)。
最后的工作量相當(dāng)小。在圖4中已對(duì)增加的SRL16x10位用紅圈進(jìn)行了標(biāo)注。
然后我們使用EDK向?qū)?lái)修改我們的FSL總線FIFO,以便存儲(chǔ)多個(gè)值(我們確定能夠存儲(chǔ)8個(gè)值就足以達(dá)到我們的目的,但可根據(jù)需要輕松增加更多)。
這就意味著我們的客戶甚至在請(qǐng)求第一個(gè)結(jié)果之前即能獲得多達(dá)8個(gè)值。這足以滿足我們客戶當(dāng)前的需求,但如果想請(qǐng)求更多正弦值的話,則可以輕松將FIFO緩沖參數(shù)擴(kuò)展為較大的值。
我們?cè)谂c客戶討論這種新的方案時(shí),發(fā)現(xiàn)可將正弦計(jì)算進(jìn)一步劃分為兩個(gè)部分:
1. 請(qǐng)求正弦計(jì)算(fslput 運(yùn)算)
2. 請(qǐng)求正弦計(jì)算的結(jié)果(fslget運(yùn)算)
由于我們?cè)谶\(yùn)算中有一個(gè)固定時(shí)延,所以如果這兩個(gè)運(yùn)算依次銜接、緊密地按順序執(zhí)行,那么MicroBlaze將停頓,并等待FSL IP完成對(duì)請(qǐng)求的處理。如果能夠?qū)⑦@兩組運(yùn)算分開(kāi)(這在客戶的算法中是可以的),那么我們即可進(jìn)一步提
升運(yùn)算的總體速度。通過(guò)增加流水線, 在MicroBlaze上執(zhí)行的最終代碼如下:
putfsl(arg1,fsl1_id);
putfsl(arg2,fsl1_id);
putfsl(arg3,fsl1_id);
putfsl(arg4,fsl1_id);
putfsl(arg5,fsl1_id);
putfsl(arg6,fsl1_id);
putfsl(arg7,fsl1_id);
putfsl(arg8,fsl1_id);
...
getfsl(result1,fsl1_id);
getfsl(result2,fsl1_id);
getfsl(result3,fsl1_id);
getfsl(result4,fsl1_id);
getfsl(result5,fsl1_id);
getfsl(result6,fsl1_id);
getfsl(result7,fsl1_id);
getfsl(result8,fsl1_id);
這給我們帶來(lái)了顯著的優(yōu)勢(shì)。內(nèi)核不僅可完全實(shí)現(xiàn)流水線功能,而且還能夠?qū)⒄矣?jì)算的兩個(gè)調(diào)用分開(kāi)。IP核的時(shí)延依然存在,但不再明顯。MicroBlaze也不再發(fā)生停頓和等待未完成的IP計(jì)算的情況,從而提高了整體性能。
客戶同意對(duì)代碼進(jìn)行相應(yīng)調(diào)整,這對(duì)客戶來(lái)說(shuō)只是小量工作。通過(guò)使用C語(yǔ)言的宏命令取代函數(shù)調(diào)用,我們就能夠把所有要求的調(diào)用插入代碼庫(kù)中。
評(píng)論