发明名称 一种基于龙芯3B的FFTW3优化方法
摘要 本发明公开了一种基于龙芯3B的FFTW3优化方法,其特征是:在计算规模为合数的复数离散傅里叶变换中利用所述向量指令方法和Cooley‑Tukey算法进行优化;在计算实数离散傅里叶变换中利用所述向量指令方法和实部和虚部单独计算处理方法进行优化。本发明能有效提高FFTW3在龙芯3B处理器上的运行性能,从而达到在龙芯3B处理器上FFTW3的高效实现。
申请公布号 CN103902506B 申请公布日期 2017.02.15
申请号 CN201410153672.6 申请日期 2014.04.16
申请人 中国科学技术大学先进技术研究院 发明人 顾乃杰;王小乐;张明;任开新
分类号 G06F17/14(2006.01)I 主分类号 G06F17/14(2006.01)I
代理机构 安徽省合肥新安专利代理有限责任公司 34101 代理人 何梅生
主权项 一种基于龙芯3B的FFTW3优化方法,其特征在于:所述优化方法是利用向量指令方法、Cooley‑Tukey算法以及实部和虚部单独计算处理方法,分别按如下情况对离散傅里叶变换函数进行优化;情况一:在计算规模为合数的复数离散傅里叶变换中利用所述向量指令方法和Cooley‑Tukey算法进行优化;情况二:在计算实数离散傅里叶变换中利用所述向量指令方法和实部和虚部单独计算处理方法进行优化;所述向量指令方法是指使用所定义的128位访存指令和计算指令对所述离散傅里叶变换函数中的输入参数分别进行访存和2点FFT计算:所述128位访存指令定义为:读取指令VLDC1 vd,addr,用于读取寻址地址寄存器addr中的128位数据到向量寄存器vd中;存放指令VLSC1 vd,addr,用于将寄存器vd中低128位数据存放到地址寄存器addr中;所述计算指令定义为:低128位2点FFT计算指令对VMULADD vd,vs,vt,vr和VMULADDL vd,vs,vt,vr,用于共同完成向量双精度FFT运算低128位数据计算;高128位2点FFT计算指令对VMULADDH vd,vs,vt,vr和VMULADDLH vd,vs,vt,vr,用于共同完成向量双精度FFT运算高128位数据计算;所述Cooley‑Tukey算法是按如下步骤进行:步骤1:利用式(1)和式(2)对所述离散傅里叶变换函数中计算规模N进行索引变换:n=N<sub>2</sub>×n<sub>1</sub>+n<sub>2</sub>   式(1)K=k<sub>1</sub>+N<sub>1</sub>×k<sub>2</sub>   式(2)式(1)和式(2)中,N<sub>1</sub>和N<sub>2</sub>为所述计算规模N的因子,且满足N<sub>1</sub>×N<sub>2</sub>=N;参数n的值域为[0,N‑1],参数K的值域为[0,N‑1],参数n<sub>1</sub>和参数k<sub>1</sub>的值域都为[0,N<sub>1</sub>‑1],参数n<sub>2</sub>和参数k<sub>2</sub>的值域都为[0,N<sub>2</sub>‑1];步骤2:利用式(3)进行离散傅里叶变换获得离散傅里叶变换的输出值X(k<sub>1</sub>+N<sub>1</sub>k<sub>2</sub>):<img file="FDA0001075788730000011.GIF" wi="1494" he="158" />式(3)中,<img file="FDA0001075788730000012.GIF" wi="99" he="68" />为所述计算规模N的第n<sub>2</sub>k<sub>1</sub>个旋转因子;<img file="FDA0001075788730000013.GIF" wi="101" he="71" />为所述因子N<sub>2</sub>的第n<sub>2</sub>k<sub>2</sub>个旋转因子;<img file="FDA0001075788730000014.GIF" wi="93" he="71" />为所述因子N<sub>1</sub>的第n<sub>1</sub>k<sub>1</sub>个旋转因子;由此,将所述计算规模为N的离散傅里叶变换优化成规模为因子N<sub>1</sub>和因子N<sub>2</sub>的离散傅里叶变换;所述实部和虚部单独计算处理方法按如下步骤进行:步骤a:判断所述离散傅里叶变换中的计算规模N的奇偶性,若计算规模N为偶数,则执行步骤b后结束;若计算规模N为奇数,则跳转到步骤c,执行步骤c后结束;步骤b:利用式(4)、式(5)和式(6)获得所述离散傅里叶变换在偶数点时输出序列的实部X<sub>real</sub>(k):<img file="FDA0001075788730000021.GIF" wi="1478" he="108" /><img file="FDA0001075788730000022.GIF" wi="1550" he="157" /><img file="FDA0001075788730000023.GIF" wi="1846" he="103" />利用式(7)获得所述离散傅里叶变换在偶数点时输出序列的虚部X<sub>image</sub>(k):<img file="FDA0001075788730000024.GIF" wi="1509" he="159" />式(4)、式(5)、式(6)和式(7)中,x(0),x(1),…x(n)为离散傅里叶变换序列;X<sub>real</sub>(0)为所述输出序列第1个位置的实部值,X<sub>real</sub>(k)表示所述输出序列第k个位置的实部值,参数k的值域为<img file="FDA0001075788730000025.GIF" wi="185" he="103" /><img file="FDA0001075788730000026.GIF" wi="165" he="103" />为所述输出序列第<img file="FDA0001075788730000027.GIF" wi="39" he="103" />个位置的实部值;X<sub>image</sub>(k)为所述输出序列第个k位置的虚部值,参数i的值域为<img file="FDA0001075788730000028.GIF" wi="188" he="103" /><img file="FDA0001075788730000029.GIF" wi="68" he="69" />表示计算规模N的第ik个旋转因子;步骤c:利用式(8)和式(9)获得所述离散傅里叶变换在奇数点时输出序列的实部X<sub>real</sub>(k):<img file="FDA00010757887300000210.GIF" wi="1686" he="111" /><img file="FDA00010757887300000211.GIF" wi="980" he="157" />利用式(10)获得所述离散傅里叶变换在奇数点时输出序列的虚部X<sub>image</sub>(k):<img file="FDA00010757887300000212.GIF" wi="937" he="159" />式(8)、式(9)和式(10)中,X<sub>real</sub>(0)为所述输出序列第1个位置的实部值,X<sub>real</sub>(k)为所述 输出序列第k个位置的实部值,参数k的值域为<img file="FDA0001075788730000031.GIF" wi="189" he="102" /><img file="FDA0001075788730000032.GIF" wi="171" he="103" />为所述输出序列第<img file="FDA0001075788730000033.GIF" wi="42" he="102" />个位置的实部值;X<sub>image</sub>(k)为所述输出序列第个k位置的虚部值,参数i的值域为<img file="FDA0001075788730000034.GIF" wi="187" he="102" /><img file="FDA0001075788730000035.GIF" wi="71" he="70" />表示计算规模N的第ik个旋转因子。
地址 230088 安徽省合肥市高新区望江西路5089号