◆楊陽朝 呂相文 呂東岳
VLIW DSP處理器下復數(shù)乘法單元優(yōu)化方法
◆楊陽朝 呂相文 呂東岳
(中國電子科技集團公司電子科學研究院 北京 100041)
當今VLIW DSP處理器擁有的指令種類越來越多,它們大多利用單一指令來完成一組復雜的計算,從而提高相關操作的執(zhí)行效率。復數(shù)乘法在數(shù)字信號處理程序中占有很大的比例,現(xiàn)在很多DSP處理器并不能自動地利用自身攜帶的復數(shù)乘法模塊,不能充分利用復數(shù)乘法指令,編譯器如何自動高效地識別并合成處理器特有的累加指令就變得尤為重要。此外,乘法結果不經(jīng)安全性檢查的使用,也會帶來安全風險。本文提出一種基于BWDSP處理器自動識別合成帶有安全特征碼的復數(shù)乘法指令的算法,實驗結果表明,本算法提高系統(tǒng)原有的復數(shù)乘法指令的使用效率和可靠度,從而提高相關數(shù)字信號處理程序在BWDSP處理器上的性能和安全性。
VLIW;DSP;復數(shù)乘法;安全性
DSP處理器程序中有很多復數(shù)乘法操作,在一次傳統(tǒng)復數(shù)乘法中需要4次乘法、1次加法和1次減法運算,共6條指令。BWDSP處理器提供了在單個時間周期內(nèi)完成一個復數(shù)乘法的指令,大大減小了運算時間開銷。指令包括了定點復數(shù)和浮點復數(shù)乘法。浮點復數(shù)乘法的指令形式為:
{Macro} QFRm+1:m_n+1:n=CFRm+1:m*CFRn+1:n
表示32位浮點復數(shù)CFRm+1:m和32位浮點復數(shù)CFRn+1:n相乘,其中FRm+1和FRn+1表示兩個實數(shù)的實部,F(xiàn)Rm和FRn表示兩個實數(shù)的虛部。F表示是浮點形式,C表示參與操作的是復數(shù)。輸出四個32位浮點復數(shù)相乘的中間四個分量,其中,Rm+1 * Rn+1放Rm+1;Rm+1 * Rn放在Rm;Rm * Rn放在Rn+1;Rm * Rn+1放在Rn。
定點復數(shù)的乘法指令形式如下:
{Macro} CRs+1:s=CRm+1:m*CRn+1:n
表示32位定點復數(shù)Rm+1:m和定點復數(shù)Rn+1:n相乘,結果放在Rs+1:s寄存器上。本文算法包括指令調(diào)度、指令識別、指令替換三個模塊。
本小節(jié)為指令調(diào)度模塊,將代碼進行歸整,盡可能將復數(shù)相乘的操作集中在一起,利于相關指令的識別操作。算法分為以下兩個部分。
第一部分自上而下掃描程序的中間語言,判斷所有流程塊中的每條指令,如果當前指令是load指令,且與之前計算操作指令沒有數(shù)據(jù)依賴,則在當前cb塊中向前移動op以及與op有關的讀取指令,直到排在最前端的load指令列最后。
第二部分自下而上掃描程序的中間語言,判斷所有流程塊中的每條指令,如果當前指令是store指令,且與之后計算操作指令沒有數(shù)據(jù)依賴,則在當前cb塊中向后移動op以及與op有關的讀取指令,直到排在最后端的store指令列最前。
本小節(jié)對集中的計算主體代碼進行識別,稱這部分代碼為主體代碼。算法包括逐條結構性尋找、寄存器依賴判斷和指令安全特征標注等,流程如下:
(1)主體代碼的指令數(shù)目是否大于等于6,如果不是,算法返回,提交已識別的指令;如果是,下一步;
(2)自上而下識別每條指令,直到找到兩條相連的定點或浮點乘法指令,且后一條加法或減法指令;
(3)從(2)中找到的乘法指令之后的指令自上而下識別,若碰到mov指令,則繼續(xù),若找到兩條相連的定點或浮點乘法指令,且后一條為加法或減法指令,進入(4)。如果碰到其他計算指令或者除mov指令的特殊指令,則將此步驟中最后一條指令設置為起始指令,轉(zhuǎn)入(10);
(4)找到的4條乘法指令和2條加減法指令是否都是對浮點數(shù)或者定點數(shù)的操作,如果是,進入(5);否則,設置后面組乘法指令的第一個指令為起始指令,進入(10);
(5)判斷兩組乘法指令之后的加減法指令是否不同,即一個加法,另一個是減法,如果不同則進入(6),否則設置第二組中加減法指令的下一條指令為起始指令,進入(10);
(6)如果當前兩組指令之間存在mov指令,則判斷其中的mov指令是否與后一組指令或第一組指令中的乘法指令之間存在數(shù)據(jù)依賴,如果存在,則設置后一組指令的下一條指令為起始指令,進入(10),如果不存在,則進入(7);
(7)判斷每組當中的加減法指令的源操作數(shù)是否是當前組之前兩條乘法指令的目的操作數(shù),且每組中的兩條乘法指令的源操作數(shù)各不相同,如果滿足條件,則進入(8),否則設置后一組指令的下一條指令為起始指令,進入(10);
(8)判斷每組指令中的兩條乘法指令的源操作數(shù)交叉后產(chǎn)生的4 種不同組合中,是否每個組合都是滿足兩條乘法指令的源操作數(shù)一個相同,另一個不同。若滿足,轉(zhuǎn)向(9),否則設置后一組指令的下一條指令為起始指令,進入(10);
(9)識別當前兩組6條指令為一次復數(shù)乘法指令,并在中間代碼增加安全特征碼,設置后一組指令的下一條指令為起始指令,進入(10);
(10)判斷當前起始指令是否超出當前主體代碼,如果是,則算法返回,否則,將起始指令開始到主體代碼的最后一條指令設置為新的主體代碼,轉(zhuǎn)入(1)。
在對復數(shù)乘法指令識別之后,需要將復數(shù)乘法計算相關的指令替換成為處理器擁有的單條復數(shù)乘法指令。
對于定點復數(shù)乘法,BWDSP處理器上定點復數(shù)乘法指令可以直接計算出結果,所以將帶有標志的復數(shù)乘法指令替換后,就完成了復數(shù)乘法指令的優(yōu)化。
對于浮點復數(shù)乘法,BWDSP處理器上的浮點單個復數(shù)乘法指令只能計算出復數(shù)乘法產(chǎn)生的4個中間值,需要一個減法指令來得出復數(shù)乘法結果復數(shù)的實部,需要一個加法指令來對應的計算結果復數(shù)的虛部。因此,先利用浮點復數(shù)乘法指令替換原先的乘法指令,然后放在原先的減法和加法指令之前。
替換后的編譯器中間代碼均帶有安全特征碼,這樣便于用于編譯器后端各種安全策略對指令的識別,針對性地開展安全檢測和流程判斷,從而增強代碼的健壯性和安全性。
我們在BWDSP仿真平臺上實現(xiàn)本文復數(shù)乘法指令優(yōu)化,利用BWDSP處理器特有的復數(shù)乘法指令對程序進行優(yōu)化。實驗證明,利用本文化算法對FFT_radix2進行優(yōu)化后與優(yōu)化前在BWDSP上執(zhí)行的性能結果對比,優(yōu)化后大約可以獲得10%到13%的性能提升。因為FFT中有大量復數(shù)乘法,所以復數(shù)乘法指令優(yōu)化算法可以顯著提高FFT_radix2的執(zhí)行效率。這充分說明本文算法可以顯著提升復數(shù)乘法程序的執(zhí)行性能,從而提高在BWDSP處理器上對相關數(shù)字信號處理應用程序時的處理能力。
[1]CETC38.BWDSP100軟件用戶手冊[M],2011.
[2]J.A.Fisher.Trace Scheduling: A Technique for Global Microcode Compaction,IEEE Transactions on Computers, vol. C-30, no. 7,1981.
[3]J.A.Fisher.Very Long Instruction Word Architectures and the ELI-512,Proceedings of the 10th Annual International Symposium on Computer Architecture, vol. 11,1983.
[4]J.A.Fisher,P.Faraboschi,and C.Young.Embedded Computing:A VLIW Approachto Architecture, Compilers and Tools. Morgan Kaufmann,2004.
[5]M. S. Schlansker and B. R. Rau.“EPIC: Explicititly Parallel Instruction Computing,” IEEE Computer, vol. 33. 2000.
[6]劉小明,朱艷.數(shù)字信號處理器的指令緩存器設計[J].中國集成電路,2013.