◆杨阳朝 吕相文 吕东岳
VLIW DSP处理器下复数乘法单元优化方法
◆杨阳朝 吕相文 吕东岳
(中国电子科技集团公司电子科学研究院 北京 100041)
当今VLIW DSP处理器拥有的指令种类越来越多,它们大多利用单一指令来完成一组复杂的计算,从而提高相关操作的执行效率。复数乘法在数字信号处理程序中占有很大的比例,现在很多DSP处理器并不能自动地利用自身携带的复数乘法模块,不能充分利用复数乘法指令,编译器如何自动高效地识别并合成处理器特有的累加指令就变得尤为重要。此外,乘法结果不经安全性检查的使用,也会带来安全风险。本文提出一种基于BWDSP处理器自动识别合成带有安全特征码的复数乘法指令的算法,实验结果表明,本算法提高系统原有的复数乘法指令的使用效率和可靠度,从而提高相关数字信号处理程序在BWDSP处理器上的性能和安全性。
VLIW;DSP;复数乘法;安全性
DSP处理器程序中有很多复数乘法操作,在一次传统复数乘法中需要4次乘法、1次加法和1次减法运算,共6条指令。BWDSP处理器提供了在单个时间周期内完成一个复数乘法的指令,大大减小了运算时间开销。指令包括了定点复数和浮点复数乘法。浮点复数乘法的指令形式为:
{Macro} QFRm+1:m_n+1:n=CFRm+1:m*CFRn+1:n
表示32位浮点复数CFRm+1:m和32位浮点复数CFRn+1:n相乘,其中FRm+1和FRn+1表示两个实数的实部,FRm和FRn表示两个实数的虚部。F表示是浮点形式,C表示参与操作的是复数。输出四个32位浮点复数相乘的中间四个分量,其中,Rm+1 * Rn+1放Rm+1;Rm+1 * Rn放在Rm;Rm * Rn放在Rn+1;Rm * Rn+1放在Rn。
定点复数的乘法指令形式如下:
{Macro} CRs+1:s=CRm+1:m*CRn+1:n
表示32位定点复数Rm+1:m和定点复数Rn+1:n相乘,结果放在Rs+1:s寄存器上。本文算法包括指令调度、指令识别、指令替换三个模块。
本小节为指令调度模块,将代码进行归整,尽可能将复数相乘的操作集中在一起,利于相关指令的识别操作。算法分为以下两个部分。
第一部分自上而下扫描程序的中间语言,判断所有流程块中的每条指令,如果当前指令是load指令,且与之前计算操作指令没有数据依赖,则在当前cb块中向前移动op以及与op有关的读取指令,直到排在最前端的load指令列最后。
第二部分自下而上扫描程序的中间语言,判断所有流程块中的每条指令,如果当前指令是store指令,且与之后计算操作指令没有数据依赖,则在当前cb块中向后移动op以及与op有关的读取指令,直到排在最后端的store指令列最前。
本小节对集中的计算主体代码进行识别,称这部分代码为主体代码。算法包括逐条结构性寻找、寄存器依赖判断和指令安全特征标注等,流程如下:
(1)主体代码的指令数目是否大于等于6,如果不是,算法返回,提交已识别的指令;如果是,下一步;
(2)自上而下识别每条指令,直到找到两条相连的定点或浮点乘法指令,且后一条加法或减法指令;
(3)从(2)中找到的乘法指令之后的指令自上而下识别,若碰到mov指令,则继续,若找到两条相连的定点或浮点乘法指令,且后一条为加法或减法指令,进入(4)。如果碰到其他计算指令或者除mov指令的特殊指令,则将此步骤中最后一条指令设置为起始指令,转入(10);
(4)找到的4条乘法指令和2条加减法指令是否都是对浮点数或者定点数的操作,如果是,进入(5);否则,设置后面组乘法指令的第一个指令为起始指令,进入(10);
(5)判断两组乘法指令之后的加减法指令是否不同,即一个加法,另一个是减法,如果不同则进入(6),否则设置第二组中加减法指令的下一条指令为起始指令,进入(10);
(6)如果当前两组指令之间存在mov指令,则判断其中的mov指令是否与后一组指令或第一组指令中的乘法指令之间存在数据依赖,如果存在,则设置后一组指令的下一条指令为起始指令,进入(10),如果不存在,则进入(7);
(7)判断每组当中的加减法指令的源操作数是否是当前组之前两条乘法指令的目的操作数,且每组中的两条乘法指令的源操作数各不相同,如果满足条件,则进入(8),否则设置后一组指令的下一条指令为起始指令,进入(10);
(8)判断每组指令中的两条乘法指令的源操作数交叉后产生的4 种不同组合中,是否每个组合都是满足两条乘法指令的源操作数一个相同,另一个不同。若满足,转向(9),否则设置后一组指令的下一条指令为起始指令,进入(10);
(9)识别当前两组6条指令为一次复数乘法指令,并在中间代码增加安全特征码,设置后一组指令的下一条指令为起始指令,进入(10);
(10)判断当前起始指令是否超出当前主体代码,如果是,则算法返回,否则,将起始指令开始到主体代码的最后一条指令设置为新的主体代码,转入(1)。
在对复数乘法指令识别之后,需要将复数乘法计算相关的指令替换成为处理器拥有的单条复数乘法指令。
对于定点复数乘法,BWDSP处理器上定点复数乘法指令可以直接计算出结果,所以将带有标志的复数乘法指令替换后,就完成了复数乘法指令的优化。
对于浮点复数乘法,BWDSP处理器上的浮点单个复数乘法指令只能计算出复数乘法产生的4个中间值,需要一个减法指令来得出复数乘法结果复数的实部,需要一个加法指令来对应的计算结果复数的虚部。因此,先利用浮点复数乘法指令替换原先的乘法指令,然后放在原先的减法和加法指令之前。
替换后的编译器中间代码均带有安全特征码,这样便于用于编译器后端各种安全策略对指令的识别,针对性地开展安全检测和流程判断,从而增强代码的健壮性和安全性。
我们在BWDSP仿真平台上实现本文复数乘法指令优化,利用BWDSP处理器特有的复数乘法指令对程序进行优化。实验证明,利用本文化算法对FFT_radix2进行优化后与优化前在BWDSP上执行的性能结果对比,优化后大约可以获得10%到13%的性能提升。因为FFT中有大量复数乘法,所以复数乘法指令优化算法可以显著提高FFT_radix2的执行效率。这充分说明本文算法可以显著提升复数乘法程序的执行性能,从而提高在BWDSP处理器上对相关数字信号处理应用程序时的处理能力。
[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]刘小明,朱艳.数字信号处理器的指令缓存器设计[J].中国集成电路,2013.