CN110750249A - 一种快速傅里叶变换代码的生成方法及装置 - Google Patents
一种快速傅里叶变换代码的生成方法及装置 Download PDFInfo
- Publication number
- CN110750249A CN110750249A CN201810823431.6A CN201810823431A CN110750249A CN 110750249 A CN110750249 A CN 110750249A CN 201810823431 A CN201810823431 A CN 201810823431A CN 110750249 A CN110750249 A CN 110750249A
- Authority
- CN
- China
- Prior art keywords
- code
- butterfly
- atom
- template
- fft
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/14—Fourier, Walsh or analogous domain transformations, e.g. Laplace, Hilbert, Karhunen-Loeve, transforms
- G06F17/141—Discrete Fourier transforms
- G06F17/142—Fast Fourier transforms, e.g. using a Cooley-Tukey type algorithm
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Computational Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Algebra (AREA)
- Databases & Information Systems (AREA)
- Discrete Mathematics (AREA)
- Computing Systems (AREA)
- Complex Calculations (AREA)
Abstract
本申请公开了一种快速傅里叶变换代码生成方法及装置,用于生成快速傅里叶变换FFT代码,将FFT代码分解为多个原子模板,便于后续对原子模板进行优化,进一步提高FFT代码的性能。方法包括:获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度;根据数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数;根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码。
Description
技术领域
本申请涉及计算机领域,尤其涉及一种快速傅里叶变换代码的生成方法及装置。
背景技术
快速傅里叶变换(fast Fourier transform,FFT)是用于计算离散傅里叶变换(discrete Fourier transform,DFT)或其逆运算的快速算法,在工程、科学和数学领域的应用非常广泛,例如信号分解、数字滤波、图像处理等。通过傅里叶分析,源数据将会从原始域(通常是时间或空间)被变换到频域的表示或者进行相反的逆变换。为了适应在计算机上进行的数值计算,需要将傅里叶变换离散化,称为离散傅里叶变换DFT,其数学表示为公式(1):
与传统的算法相比,FFT算法能够将计算离散傅里叶变换DFT的算法复杂度从N2降低到NlogN,其中N为输入序列的长度。
目前应用最广泛、最流行的FFT算法为库利-图基(Cooley-Tukey)FFT算法,主流的FFT库如,FFTW、英特尔数学内核库(Intel math kernel library,Intel MKL)、ARM高性能库(ARM performance libraries,ARMPL)等均采用此算法。其核心可归结为蝶形网络的构建,如图1A、图1B所示的长度N=8的基-2(radix-2)FFT蝶形网络,图1B中的蝶形网络由级(stage)-段(section)-蝶形(butterfly)三级组成。该算法将公式(1)中的各项在时域上进行重新分组,并将e-j2πkn/N用进行替换,其中,替换后的被称之为“旋转因子”(twiddle factor),亦称为“蝶形因子”。根据旋转因子在计算过程中出现的不同位置,可以将FFT算法分为频域抽取(decimation-in-frequency,DIF)和时域抽取(decimation-in-time,DIT)两大类。频域抽取DIF的旋转因子出现在计算的输出端,如图1A所示;而时域抽取DIT的旋转因子出现在计算的输入端,如图1B。如果采用时域抽取DIT,数据输入是按照“位元翻转”(bit-reversed order)来进行排列,数据输出则是依序排列;而如果采用频域抽取DIF,那么情况恰好相反,数据输入是依序排列,数据输出则是会按照“位元翻转”(bit-reversed order)来进行排列。
现有的几种方案在生成用于进行FFT变换的代码(下文简FFT代码)过程中,需要通过人工分析,得到FFT不同基的计算及访存特征,结合不同CPU的硬件细节,通过人工预取数据、重排指令等方法,有效地减少访存开销和流水线停顿等问题,进而加速应用程序。但现有的几种方案在实现FFT库时存在以下不足:需人工对不同CPU架构进行具体的高性能代码实现,开发门槛高,生产效率低下,并且需要为不同架构或同一架构但规格不同的CPU实现不同的高性能代码,当硬件平台发生变化时,对生成的FFT代码难以进行优化。
发明内容
本申请实施例提供了一种快速傅里叶变换代码的生成方法及装置,用于生成快速傅里叶变换FFT代码,将FFT代码分解为多个原子模板,便于后续对原子模板进行优化,进一步提高FFT代码的性能。
本申请第一方面提供了一种快速傅里叶变换代码的生成方法,包括:获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度,其中,在获取到数据序列的长度后,再去获取对应该长度的数据序列;根据数据序列的长度确定数据序列的FFT分解方式,其中,该分解方式为数据序列的多种可能的分解方式中任一种,进一步得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基,即得到一种或多种基;根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数,其中,蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码,各个级对应的蝶形的基的种类可以相同也可以不同;根据每一级中的所述蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码。本实施例中,先根据数据序列的长度确定数据序列的FFT分解方式,得到该分解方式对应的蝶形网络的一个或多个级;确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数;再根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码,其中,FFT代码包括一个或多个原子模板,将FFT代码分解为多个原子模板,便于后续对原子模板进行优化,进一步提高FFT代码的性能。
在一种可能的设计中,在本申请实施例第一方面的第一种实现方式中,当蝶形网络的级数为1,相应地,根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的次数逐级生成各个级的代码包括:生成第一级的代码,其中,该第一级的代码包括多次调用第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;或者,蝶形网络的级数为大于1的整数,相应地,根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的次数逐级生成各个级的代码包括:生成第一级的代码,其中,该第一级的代码包括多次调用第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;后续依次针对每个级,生成当前级的代码,其中,当前级的代码包括多次调用当前级的蝶形代码的代码,调用的次数为当前级中的调用次数,当前级的蝶形代码的输入为前一级的输出,当前级为当前需要生成代码的级。细化了逐级生成每一级代码的过程,增加了本申请实施例的实现方式,确保了生成的FFT代码的正确性。
在一种可能的设计中,在本申请实施例第一方面的第二种实现方式中,每一级对应的蝶形的基为2,或者4,或者为不等于2的质数。明确了每一级对应的蝶形的基的取值范围,提高了FFT代码的生成速度。
在一种可能的设计中,在本申请实施例第一方面的第三种实现方式中,一个或多个原子模板包括以下6种原子模板中的任意一个或者任意多个的组合,其中,各个原子模板涉及的各个输入输出都只在各个原子模板内适用,而不适用于其他原子模板,例如,第二原子模板和第四原子模板中都有复数IN1,如果第二模板中提到的“IN1”,只针对于第二模板中的复数IN1,并不影响第四模板中的复数IN1:
第一原子模板:用于对原始输入复数ORI以及累加和复数SUM进行运算,输出的结果跟通过如下方式输出的结果相同:对累加复数SUM乘以2得到新的累加复数;对新的累加复数减去输入复数ORI,得到输出复数OUT;其中,所述新的累加复数以及输出复数OUT作为运算后的输出;
第二原子模板:用于对复数IN1和复数IN2进行运算,输出的结果跟通过如下方式输出的结果相同:对复数IN1和复数IN2的实部、虚部分别进行加运算,得到输出复数OUT1;对复数IN1和复数IN2的实部、虚部分别进行减运算,得到输出复数OUT2;其中,OUT1以及OUT2作为运算后的输出;
第三原子模板:用于对复数A,复数B以及实数S进行运算,输出的结果跟通过如下方式输出的结果相同:将复数B乘以实数S,得到新的复数B’;将A的实部加上B’的虚部以得到复数Z1的实部;将A的虚部减去B’的实部以得到Z1的虚部;将A的实部减法B’的虚部以得到复数Z2的实部;将A的虚部加上B’的实部以得到复数Z2的虚部;其中,Z1以及Z2作为运算后的输出;
第四原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、中间值TMP以及累加复数F进行运算,输出的结果跟通过如下方式输出的结果相同:将IN1的实部乘以TW的实部并加上F的实部得到SUM的实部;将IN1的虚部乘以TW的实部加上F的虚部得到SUM的虚部;将IN2的虚部乘以TW的虚部得到TMP的实部;将IN2的虚实部乘以TW的虚部得到TMP的虚部;将SUM的实部减去TMP的实部得到OUT的实部;将SUM的虚部加上TMP的虚部得到OUT的虚部;其中,SUM以及OUT作为运算后的输出;
第五原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、第一中间值TMP1、第二中间值TMP2、累加和复数SUM以及输出数据OUT进行运算,输出的结果跟通过如下方式输出的结果相同:将复数IN1的实部乘以TWR得到TMP1的实部;将复数IN1的虚部乘以TWR得到TMP1的虚部;将复数IN2的虚部乘以TWI得到TMP2的实部;将复数IN2的实部乘以TWI得到TMP2的虚部;将OUT的实部加上TMP1的实部再减去TMP2的实部得到更新后的输出复数OUT的实部;将OUT的虚部加上TMP1的虚部再加上TMP2的虚部得到更新后的输出复数OUT的虚部;将SUM的实部加上TMP1的实部得到更新后的累加和复数SUM的实部;将SUM的虚部加上TMP1的虚部得到更新后的累加和复数SUM的虚部;其中,更新后的输出复数OUT以及更新后的累加和复数SUM为作为运算后的输出;
第六原子模板:用于对复数A和复数B的实部、虚部进行运算,输出的结果跟通过如下方式输出的结果相同:将复数A的实部加上复数B的实部得到复数C的实部;将复数A的虚部加上复数B的虚部得到复数C的虚部;得到输出复数C;其中,所述复数C作为运算后的输出。本实施例中,提供了6种原子模板,细化了6种原子模板的基本运算过程,每种原子模板的具体功能都不同,可以根据不同种类基的计算需要,将不同的种类或数量的原子模板进行组合,生成FFT代码,实现FFT算法的各种功能。
在一种可能的设计中,在本申请实施例第一方面的第四种实现方式中,蝶形代码具体包括一种或多种混合模板,每种混合模板包括一种或多种原子模板,每种原子模板的个数为一个或多个。将多个原子模板组成具有特定功能的多种混合模板,再将一种或多种混合模板组成蝶形代码,提高了计算效率,减少了生成FFT代码所需的时间,提高了FFT代码的整体性能。
在一种可能的设计中,在本申请实施例第一方面的第五种实现方式中,当基为基-2时,与基-2对应的混合模板对应的代码包括1个第二原子模板;或者,当基为基-4时,与基-4对应的混合模板对应的代码包括3个第二原子模板和1个第三原子模板;或者,当基为质数且不为2时,与值为质数的基对应的第一种混合模板对应的代码包括m个原子模板,其中包括1个第四原子模板、m-2个第五原子模板和1个第一原子模板,其中表示对x/2向上取整,x为基的取值,与值为质数的基对应的第二种混合模板对应的代码包括1个第六原子模板。对每个基对应的混合模板对应的代码中包含的原子模板的数量进行了限定,加快生成混合模板对应的代码的过程,进一步减少了生成混合模板对应的代码所需的时间,提高了FFT代码的整体性能。
在一种可能的设计中,在本申请实施例第一方面的第六种实现方式中,当基为基-2时,第二原子模板单独排列;或者,当基为基-4时,3个第二原子模板和1个第三原子模板依次顺序排列;或者,当基为质数且不为2时,第一种混合模板中1个第四原子模板、m-2个第五原子模板和1个第一原子模板依次顺序排列,第二种混合模板中第六原子模板单独排列。对混合模板对应的代码中包含的各个原子模板之间的排列顺序进行了限定,加快了生成混合模板对应的代码的过程,提高了FFT代码的整体性能。
在一种可能的设计中,在本申请实施例第一方面的第七种实现方式中,根据混合模板对应的代码中各个原子模板相互之间的依赖关系将被依赖的原子模板的顺序排在依赖别人的原子模板的前面;其中,依赖关系包括运算数据的依赖关系,或者跟运算数据相关的硬件资源的依赖关系,硬件资源可以包括寄存器等。对混合模板对应的代码中包含的各个原子模板之间的排列顺序进行了限定,确保了混合模板对应的代码中各个原子模板的组合的正确性,确保了生成的FFT代码的正确性。
在一种可能的设计中,在本申请实施例第一方面的第八种实现方式中,根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数包括:根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码;将数据序列的长度除以每一级对应的蝶形的基,得到每一级的比值;将每一级的比值作为每一级的蝶形代码被调用的调用次数。对确定每一级的蝶形代码以及蝶形代码的调用次数的过程进行细化,提供了具体的实现方式,提高了生成FFT代码的效率。
在一种可能的设计中,在本申请实施例第一方面的第九种实现方式中,混合模板的代码为基于硬件平台优化后得到的代码。对混合模板的代码进行了限定,混合模板的代码为优化后的代码,增加了本申请实施例的实现方式。
在一种可能的设计中,在本申请实施例第一方面的第十种实现方式中,FFT分解方式为在当前硬件平台下经过测试得到的最优的分解方式,其中,最优的分解方式为根据数据序列的长度和当前硬件平台的参数得到的全部分解方式中的一种,最优的分解方式对应的蝶形网络的代码的执行时间最短。本实施例中,将生成的多个FFT代码,通过自适应框架进行性能检测,以得到性能最优的FFT代码,提升了FFT代码的整体性能。
在一种可能的设计中,在本申请实施例第一方面的第十一种实现方式中,数据序列存在多种FFT分解方式,第一分解方式为用于寻找最优的分解方式的其中一种FFT分解方式,最优的分解方式为多种FFT分解方式一一对应的多个FFT代码的执行时间最短的分解方式;其中,多种FFT分解方式对应的FFT代码的生成方法跟通过第一方面至第一方面的第九种实现方式中任一所述的方式中的,根据第一分解方式最终生成FFT代码的生成方法相同。通过这些方式,可以针对特定长度的数据序列找到最优的分解方式对应的执行时间最短的FFT代码。
在一种可能的设计中,在本申请实施例第一方面的第十二种实现方式中,所述方法还包括:缓存针对最优的分解方式对应的FFT代码,当下一次需要在同一个硬件平台下对同样长度的数据序列进行快速傅立叶变换时,使用缓存的FFT代码进行计算。将已经生成的FFT代码进行存储,当下一次输入同样长度的数据序列时可以调用缓存的FFT代码进行计算,节省了生成FFT代码花费的时间,提高了效率。
在一种可能的设计中,在本申请实施例第一方面的第十三种实现方式中,数据序列的长度的值等于多个数的相乘得到的值,其中,多个数中的各个数的种类即为基的种类,各个种类数的数量即为基的数量。将数据序列的长度的值分解为多个数相乘,多个数的种类与对应基的种类相同,各个种类数的数量与对应基的数量相同,加快了确定基的种类和数量的过程。
在一种可能的设计中,在本申请实施例第一方面的第十四种实现方式中,所述基于硬件平台优化包括:根据当前硬件平台的参数将寄存器进行分组得到多个寄存器组,多个寄存器组包括输入寄存器组、旋转寄存器组、中间计算结果寄存器组和输出寄存器组;确定多个寄存器组中的每个寄存器组的最优指令,最优指令为吞吐量最大或执行时钟周期数最少的指令;确定最优指令的执行序列。
在一种可能的设计中,在本申请实施例第一方面的第十五种实现方式中,所述硬件平台包括ARM架构、x86架构或POWER架构。
本申请第二方面提供了一种快速傅里叶变换代码的生成装置,包括:获取单元,用于获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度;第一确定单元,用于根据数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;第二确定单元,用于根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的所述蝶形代码被调用的调用次数,其中,所述蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,所述原子模板是预定义对所述数据序列进行蝶形运算所需的基本的代码;生成单元,用于根据每一级中的所述蝶形代码以及每一级中的所述蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对所述数据序列进行快速傅里叶变换的FFT代码。本实施例中,先根据数据序列的长度确定数据序列的FFT分解方式,得到该分解方式对应的蝶形网络的一个或多个级;确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数;再根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码,其中,FFT代码包括一个或多个原子模板,将FFT代码分解为多个原子模板,便于后续对原子模板进行优化,进一步提高FFT代码的性能。
在一种可能的设计中,在本申请实施例第二方面的第一种实现方式中,蝶形网络的级数为1,相应地,生成单元具体用于:生成第一级的代码,其中,第一级的代码包括多次调用第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;或者,蝶形网络的级数为大于1的整数,相应地,生成单元具体用于:生成第一级的代码,其中,第一级的代码包括多次调用第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;后续依次针对每个级,生成当前级的代码,其中,当前级的代码包括多次调用当前级的蝶形代码的代码,调用的次数为当前级中的调用次数,当前级的蝶形代码的输入为前一级的输出,当前级为当前需要生成代码的级。细化了逐级生成每一级代码的过程,增加了本申请实施例的实现方式,确保了生成的FFT代码的正确性。
在一种可能的设计中,在本申请实施例第二方面的第二种实现方式中,每一级对应的蝶形的基为2,或者4,或者为不等于2的质数。明确了每一级对应的蝶形的基的取值范围,提高了FFT代码的生成速度。
在一种可能的设计中,在本申请实施例第二方面的第三种实现方式中,一个或多个原子模板包括以下6种原子模板中的任意一个或者任意多个的组合,其中,各个原子模板涉及的各个输入输出都只在各个原子模板内适用,而不适用于其他原子模板,例如,第二原子模板和第四原子模板中都有复数IN1,如果第二模板中提到的“IN1”,只针对于第二模板中的复数IN1,并不影响第四模板中的复数IN1:
第一原子模板:用于对原始输入复数ORI以及累加和复数SUM进行运算,输出的结果跟通过如下方式输出的结果相同:对累加复数SUM乘以2得到新的累加复数;对新的累加复数减去输入复数ORI,得到输出复数OUT;其中,新的累加复数以及输出复数OUT作为运算后的输出;
第二原子模板:用于对复数IN1和复数IN2进行运算,输出的结果跟通过如下方式输出的结果相同:对复数IN1和复数IN2的实部、虚部分别进行加运算,得到输出复数OUT1;对复数IN1和复数IN2的实部、虚部分别进行减运算,得到输出复数OUT2;其中,OUT1以及OUT2作为运算后的输出;
第三原子模板:用于对复数A,复数B以及实数S进行运算,输出的结果跟通过如下方式输出的结果相同:将复数B乘以实数S,得到新的复数B’;将A的实部加上B’的虚部以得到复数Z1的实部;将A的虚部减去B’的实部以得到Z1的虚部;将A的实部减法B’的虚部以得到复数Z2的实部;将A的虚部加上B’的实部以得到复数Z2的虚部;其中,Z1以及Z2作为运算后的输出;
第四原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、中间值TMP以及累加复数F进行运算,输出的结果跟通过如下方式输出的结果相同:将IN1的实部乘以TW的实部并加上F的实部得到SUM的实部;将IN1的虚部乘以TW的实部加上F的虚部得到SUM的虚部;将IN2的虚部乘以TW的虚部得到TMP的实部;将IN2的实部乘以TW的虚部得到TMP的虚部;将SUM的实部减去TMP的实部得到OUT的实部;将SUM的虚部加上TMP的虚部得到OUT的虚部;其中,SUM以及OUT作为运算后的输出;
第五原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、第一中间值TMP1、第二中间值TMP2、累加和复数SUM以及输出数据OUT进行运算,输出的结果跟通过如下方式输出的结果相同:将复数IN1的实部乘以TWR得到TMP1的实部;将复数IN1的虚部乘以TWR得到TMP1的虚部;将复数IN2的虚部乘以TWI得到TMP2的实部;将复数IN2的实部乘以TWI得到TMP2的虚部;将OUT的实部加上TMP1的实部再减去TMP2的实部得到更新后的输出复数OUT的实部;将OUT的虚部加上TMP1的虚部再加上TMP2的虚部得到更新后的输出复数OUT的虚部;将SUM的实部加上TMP1的实部得到更新后的累加和复数SUM的实部;将SUM的虚部加上TMP1的虚部得到更新后的累加和复数SUM的虚部;其中,更新后的输出复数OUT以及更新后的累加和复数SUM为作为运算后的输出;
第六原子模板:用于对复数A和复数B的实部、虚部进行运算,输出的结果跟通过如下方式输出的结果相同:将复数A的实部加上复数B的实部得到复数C的实部;将复数A的虚部加上复数B的虚部得到复数C的虚部;得到输出复数C;其中,复数C作为运算后的输出。本实施例中,提供了6种原子模板,细化了6种原子模板的基本运算过程,每种原子模板的具体功能都不同,可以根据不同种类基的计算需要,将不同的种类或数量的原子模板进行组合,生成FFT代码,实现FFT算法的各种功能。
在一种可能的设计中,在本申请实施例第二方面的第四种实现方式中,蝶形代码具体包括一种或多种混合模板,每种混合模板包括一种或多种原子模板,每种原子模板的个数为一个或多个。将多个原子模板组成具有特定功能的多种混合模板,再将一种或多种混合模板组成蝶形代码,提高了计算效率,减少了生成FFT代码所需的时间,提高了FFT代码的整体性能。
在一种可能的设计中,在本申请实施例第二方面的第五种实现方式中,当基为基-2时,与基-2对应的混合模板对应的代码包括1个第二原子模板;或者,当基为基-4时,与基-4对应的混合模板对应的代码包括3个第二原子模板和1个第三原子模板;或者,当基为质数且不为2时,与值为质数的基对应的第一种混合模板对应的代码包括m个原子模板,其中包括1个第四原子模板、m-2个第五原子模板和1个第一原子模板,其中表示对x/2向上取整,x为基的取值,与值为质数的基对应的第二种混合模板对应的代码包括1个第六原子模板。对每个基对应的混合模板对应的代码中包含的原子模板的数量进行了限定,加快生成混合模板对应的代码的过程,进一步减少了生成混合模板对应的代码所需的时间,提高了FFT代码的整体性能。
在一种可能的设计中,在本申请实施例第二方面的第六种实现方式中,当基为基-2时,第二原子模板单独排列;或者,当基为基-4时,3个第二原子模板和1个第三原子模板依次顺序排列;或者,当基为质数且不为2时,第一种混合模板中1个第四原子模板、m-2个第五原子模板和1个第一原子模板依次顺序排列,第二种混合模板中第六原子模板单独排列。对混合模板对应的代码中包含的各个原子模板之间的排列顺序进行了限定,加快了生成混合模板对应的代码的过程,提高了FFT代码的整体性能。
在一种可能的设计中,在本申请实施例第二方面的第七种实现方式中,根据混合模板对应的代码中各个原子模板相互之间的依赖关系将被依赖的原子模板的顺序排在依赖别人的原子模板的前面;其中,依赖关系包括运算数据的依赖关系,或者跟运算数据相关的硬件资源的依赖关系,硬件资源可以包括寄存器等。对混合模板对应的代码中包含的各个原子模板之间的排列顺序进行了限定,确保了混合模板对应的代码中各个原子模板的组合的正确性,确保了生成的FFT代码的正确性。
在一种可能的设计中,在本申请实施例第二方面的第八种实现方式中,第二确定单元具体用于:根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码;将数据序列的长度除以每一级对应的蝶形的基,得到每一级的比值;将每一级的比值作为每一级的蝶形代码被调用的调用次数。对确定每一级的蝶形代码以及蝶形代码的调用次数的过程进行细化,提供了具体的实现方式,提高了生成FFT代码的效率。
在一种可能的设计中,在本申请实施例第二方面的第九种实现方式中,混合模板对应的代码为基于硬件平台优化后得到的代码。对混合模板对应的代码进行了限定,混合模板对应的代码为优化后的代码,增加了本申请实施例的实现方式。
在一种可能的设计中,在本申请实施例第二方面的第十种实现方式中,FFT分解方式为在当前硬件平台下经过测试得到的最优的分解方式,其中,最优的分解方式为根据数据序列的长度结合当前硬件平台得到的全部分解方式中的一种,最优的分解方式对应的蝶形网络的代码的执行时间最短。本实施例中,将生成的多个FFT代码,通过自适应框架进行性能检测,以得到性能最优的FFT代码,提升了FFT代码的整体性能。
在一种可能的设计中,在本申请实施例第二方面的第十一种实现方式中,数据序列存在多种FFT分解方式,第一分解方式为用于寻找最优的分解方式的其中一种FFT分解方式,最优的分解方式为多种FFT分解方式一一对应的多个FFT代码的执行时间最短的分解方式;其中,多种FFT分解方式对应FFT代码的生成装置跟跟通过第一方面至第一方面的第九种实现方式中任一所述的方式中的根据第一分解方式最终生成FFT代码的生成装置相同。通过这些方式,可以针对特定长度的数据序列找到最优的分解方式对应的执行时间最短的FFT代码。
在一种可能的设计中,在本申请实施例第二方面的第十二种实现方式中,生成装置还包括:缓存单元,用于缓存针对最优的分解方式对应的FFT代码,当下一次需要在同一个硬件平台下对同样长度的数据序列进行快速傅立叶变换时,使用缓存的FFT代码进行计算。将已经生成的FFT代码进行存储,当下一次输入同样长度的数据序列时可以调用缓存的FFT代码进行计算,节省了生成FFT代码花费的时间,提高了效率。
在一种可能的设计中,在本申请实施例第二方面的第十三种实现方式中,数据序列的长度的值等于多个数的相乘得到的值,其中,多个数中的各个数的种类即为基的种类,各个种类数的数量即为基的数量。将数据序列的长度的值分解为多个数相乘,多个数的种类与对应基的种类相同,各个种类数的数量与对应基的数量相同,加快了确定基的种类和数量的过程。
在一种可能的设计中,在本申请实施例第二方面的第十四种实现方式中,所述基于硬件平台优化包括:根据当前硬件平台的参数将寄存器进行分组得到多个寄存器组,多个寄存器组包括输入寄存器组、旋转寄存器组、中间计算结果寄存器组和输出寄存器组;确定多个寄存器组中的每个寄存器组的最优指令,最优指令为吞吐量最大或执行时钟周期数最少的指令;确定所述最优指令的执行序列。
在一种可能的设计中,在本申请实施例第二方面的第十五种实现方式中,所述硬件平台包括ARM架构、x86架构或POWER架构。
本申请第三方面提供了一种快速傅里叶变换代码的生成装置,包括:存储器、收发器、处理器以及总线系统;其中,存储器用于存储程序;处理器用于执行存储器中的程序,包括如下步骤:获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度;根据数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数,其中,蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码;根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码;总线系统用于连接存储器以及处理器,以使存储器以及处理器进行通信。
本申请的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述各方面所述的方法。
本申请的第五方面提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述各方面所述的方法。
附图说明
图1A为现有方案中基-2的快速傅里叶变换一个时域抽取示意图;
图1B为现有方案中基-2的快速傅里叶变换一个频域抽取示意图;
图2A为本申请实施例中基-2的快速傅里叶变换的一个蝶形示意图;
图2B为本申请实施例中基-3的快速傅里叶变换的一个蝶形示意图;
图2C为本申请实施例中基-4的快速傅里叶变换的一个蝶形示意图;
图2D为本申请实施例中基-5的快速傅里叶变换的一个蝶形示意图;
图2E为本申请实施例中基-8的快速傅里叶变换的一个蝶形示意图;
图3为本申请实施例中快速傅里叶变换代码的生成方法的一个实施例示意图;
图4A为本申请实施例中快速傅里叶变换代码的生成方法的另一个实施例示意图;
图4B为本申请实施例中原子计算模板的一个优化示意图;
图4C为本申请实施例中原子计算模板的另一个优化示意图;
图4D为本申请实施例中原子计算模板的另一个优化示意图;
图5为本申请实施例中基-7的蝶形网络的代码的结构示意图;
图6为本申请实施例中快速傅里叶变换代码的生成方法的另一个实施例示意图;
图7为本申请实施例中确定性能最优的蝶形网络的代码的流程示意图;
图8A为本申请实施例生成的FFT代码与现有FFT代码性能对比的一个示意图;
图8B为本申请实施例生成的FFT代码与现有FFT代码性能对比的另一个示意图;
图9为本申请实施例中快速傅里叶变换代码的生成装置一个实施例示意图;
图10为本申请实施例中快速傅里叶变换代码的生成装置另一个实施例示意图;
图11A为本申请实施例中快速傅里叶变换代码的生成装置另一个实施例示意图;
图11B为本申请实施例中手机的一个结构示意图;
图12为本申请实施例中服务器的一个结构示意图。
具体实施方式
本申请实施例提供了一种快速傅里叶变换代码的生成方法及装置,用于生成快速傅里叶变换FFT代码,将FFT代码分解为多个原子模板,便于后续对原子模板进行优化,进一步提高FFT代码的性能。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”或“具有”及其任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本申请实施例可以应用在高性能快速傅里叶变换(fast Fourier transform,FFT)代码的自动生成场景,生成的FFT代码可用于各种信号处理场合,包括音视频和图像处理设备,应用于各种终端产品。以数据序列长度N=8的基-2(radix-2)FFT蝶形网络为例,如图1A和图1B所示,图1A为radix-2频域抽取(decimation-in-frequency,DIF)的8点FFT运算流程图,图1B为radix-2时域抽取(decimation-in-time,DIT)的8点FFT运算流程图,通过对比可知,DIF和DIT算法的蝶形网络的级(stage)的顺序恰好相反。图1A和图1B为蝶形组成的完整蝶形网络,蝶形网络可以抽象出三层:级(stage)-段(section)-蝶形(butterfly),例如,从图1B中可以看出,stage1中包含4个section,每一个section中包含一个碟形;stage2中包含2个section,每个section包含2个碟形;stage3中包含1个section,每个section包含4个碟形。此外,也可以将段的概念简化掉,在逻辑上只区分级以及蝶形。基N(radix-N)的蝶形计算公式为公式(2),通过公式(2)可以精简蝶形计算,抽象出共同操作。具体公式如下:
X(0)=x0+x1+x2+…+xN-1
……
根据FFT算法的输入规模和公式(2),FFT算法可以分解为对不同的基进行蝶形计算,例如radix-2,radix-3,radix-4,radix-5,radix-7,radix-11以及radix-13等,不同的基对应着不同的蝶形,不同的蝶形对应着不同的运算方式,也即完成这些运算方式的代码也不相同。例如,图2A、图2B、图2C和图2D分别对应radix-2、radix-3、radix-4和radix-5的蝶形。其中,不同的输入规模得到的基的种类可以相同,也可以不同,例如,数据序列长度为8,其中一种分解方式中只包括基-2,一个基于基-2的蝶形网络的具体结构如图2E所示;当然,在另一种分解方式中,也可以包括基-2和基-4,相关的蝶形网络的具体结构此处不再赘述。
本领域技术人员可以理解,蝶形网络是用于对FFT进行示意的示意图,蝶形网络的每一级的输出为下一级的输入,基的值即为基对应的一种蝶形每次能够处理数据的个数。例如,针对图2E所示的蝶形网络用于对长度为8的数据序列进行处理,每级的基都为2,则每级中的每个蝶形都表示对2个输入数据进行运算,输出2个输出数据;每一级的8个输出都为下一级的8个输入。
实施例一
为便于理解,下面对本申请实施例的具体流程进行描述,请参阅图3,在本申请实施例中快速傅里叶变换代码生成方法的一个实施例包括:
301、获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度。
其中,获取的数据序列的长度N可以是事先确定的,根据该长度N可以获取需要进行快速傅里叶变换FFT的包含N个数据的数据序列,数据序列中的数据通常为离散的数字信号。
302、根据数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基。
FFT分解方式对应着不同的蝶形网络,当确定一种FFT分解方式时,先能确定该对应的蝶形网络的一些信息,包括对应的蝶形网络一个或多个级,以及每一级对应的蝶形的基(以下也简称每一级对应的基)。其中,分解方法是本领域技术人员公知的现有技术,简单地说,可认为将一个数分解成几个数的相乘,多个数中的各个数的种类即为基的种类,例如,可以将8分解成2*4,或者4*2(顺序不同也被认为分解方式),或者分解成2*2*2,当分解成2*4时,表示第一级的基是2,第二级的基是4。
具体的,如果用简单的数据结构表示时,可以用一个数组来表示“一个或多个级”以及每个级对应的基,例如,使用每个数组元素表示一级,每个元素的值表示这一级对应的基。当然,在具体实施时,本实施例也不限定用其他的方式(如结构体、类、单个变量等)来进行表示。
例如,当N为64时,分解方式可以包括:64=2*2*2*2*2*2、64=4*4*4等分解方式,以64=4*4*4为例,可以定义一个数组,stage[3]={4,4,4},用来表示蝶形网络有三级,每个元素表示一级,每个元素的值都是4,表示每一级对应的基都是基-4。同之类似,当使用64=2*2*2*2*2*2分解方式时,可以定义一个数组stage[6]={2,2,2,2,2,2},该数组表示有蝶形网络有六级,每个元素表示一级,每个元素的值都是2,表示每一级对应的基的类型为2(本申请中,为了叙述方便,也使用“基为2”,或者“基的值为2”,或者“基-2”,或者“基2”来表示)。
当一个数据序列长度N有多种分解方式,可以选择其中一种分解方式作为依据完成此次FFT代码的生成过程。在本步骤中,根据预先定义的分解方式的选择规则,确定一种分解方式作为该数据序列的当前分解方式,其中,预先定义的分解方式的选择规则为现有技术(例如,可以先穷举所有的分解方式,然后编个号,按编号顺序来选择),具体此处不做限定。
需要说明的是,本申请中,在分解时,如果多种分解方式中所包括的基的种类相同,但顺序不同,则视为不同的分解方式。例如,针对8=2*4与8=4*2,虽然基的种类都是2和4,但前一种是第一级的基为2,第二级的基为4;而后一种是第一级的基为4,第二级的基为2,顺序并不相同,因此,这两种分解方式属于两种不同的分解方式,生成的代码也不相同。
303、根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及该蝶形代码被调用的调用次数。
其中,蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码。
具体的,可以根据公式:
n=N/radix-x (3)
来确定每一级对应的蝶形的调用次数,其中,n表示每一级需要调用蝶形代码的次数,N表示数据序列的长度,radix-x表示基的值。本领域技术人员可以理解,蝶形代码是对数量为基的值的数据进行处理(输入和输出数据的个数都等于基的值),因此,如果有N个数据,只需要将N除以基的值就可以得到需要调用的蝶形代码的次数。后续生成一级代码时,可以调用该次数的蝶形代码来完成对N个数据的一级运算(即几个蝶形分别完成对N个数据的一部分数据运算,这一部分数据的个数等于基的值)。
同时,本领域技术人员可以理解,在软件中,代码中的运算的执行都通过函数来执行,代码被调用的次数也即函数被调用的次数,对于同一个蝶形代码,多次调用时,只需要传入不同参数,即可完成对不同数据的处理。
例如,对于长度N为8的数据序列,其长度8可分解成8=2*2*2,此时,该分解方式对应的蝶形网络有三级,每一级对应的蝶形的基都是2(用radix-2表示基-2),则每一级需要调用的蝶形代码次数都是8/2=4次。此时,每一级中的每个蝶形的输入以及输出的数据都是2个。
再例如,长度8还可分解成8=2*4,此时,该分解方式对应的蝶形网络有两级,第一级对应的蝶形的基是2,需要调用8/2=4次基-2的蝶形代码,相应地,第二级需要调用2次基-4的蝶形代码。此时,第一级的蝶形的输入以及输出的数据的长度是2,经过8/2=4次调用后,能够完成对8个数据的处理,输出8个数据;第二级蝶形的输入以及输出的数据的长度是4,经过8/4=2次调用后,能够完成对8个输入数据(第一级的输出)的处理。
再例如,长度14还可分解成14=2*7,此时,该分解方式对应的蝶形网络有两级,第一级对应的蝶形的基是2,需要调用14/2=7次基-2的蝶形代码,相应地,第二级需要调用2=(14/7)次基-7的蝶形代码。
本申请中,蝶形代码是用于完成蝶形运算的代码,包括一种或多种原子模板,每种原子模板的个数为一个或多个,其中,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码,通过这些基本的代码,能够组合成用于蝶形运算的蝶形代码。可以理解,代码在执行时,其真正的功能都可通过函数来体现,因此,这些原子模板可认为是一些封装了一些用于蝶形运算的基本功能的函数。需要说明的是,这些函数是用户自定义的,而非系统(如各种编程语言所带的库)提供的例如加、减、乘、除等最基本的函数,也即本申请中,原子模板是基于系统自带的最基本的函数来构建的用于更快地完成蝶形运算的代码。
可选地,蝶形代码具体可以包括一种或多种混合模板,每种混合模板包括一种或多种原子模板,每种原子模板的个数为一个或多个。也即本申请中,可以将一个或多个原子模板再组合混合模板,这样,蝶形代码可以通过调用一个或多个混合模板的形式来调用原子模板,提高了计算效率,减少了生成FFT代码所需的时间,提高了FFT代码的整体性能。
304、根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码。
具体的,每一级的代码由一个或多个蝶形代码组成,每个蝶形代码又由1个或多个混合模板的代码并列构成(即1个或多个混合模板的代码组成的蝶形代码用来完成对一部分输出数据的处理),然后输出数据到下一级;下一级也进行相同的构造(即每个蝶形代码来完成对一部分输入数据的处理)。
例如,若序列长度为12,分解方式为12=3*4,则数据序列包括2级代码,其中,第一级代码的调用12/3=4次基-3的蝶形代码,每个基-3蝶形代码用于对3个输入进行处理,输出3个结果,从而总共输出12个第一级输出数据;第二级代码的调用12/4=3次基-4的蝶形代码,每个基-4的蝶形代码用于对12个第一级输出数据中的4个数据作为第二级输入数据进行处理,输出4个第二级输出数据,从而最终能够输出12个第二级输出数据。
需要说明的是,如果对应FFT分解方式的蝶形网络包含多个级,因为后一级代码的输入数据依赖前一级代码的输出,则后一级的代码包括了调用的前一级的代码。
本实施例中,先根据数据序列的长度确定数据序列的FFT分解方式,得到该分解方式对应的蝶形网络的一个或多个级;确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数;再根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码,其中,FFT代码包括一个或多个原子模板,将FFT代码分解为多个原子模板,便于后续对原子模板进行优化,进一步提高FFT代码的性能。
实施例二
基于上述实施例,本实施例对蝶形代码以及蝶形代码包括的混合模板、原子模板等进行具体介绍。请参阅图4A,在本申请实施例中快速傅里叶变换代码生成方法的另一个实施例包括:
401、获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度。
402、根据数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基。
步骤401至步骤402与步骤301至步骤302类似,具体此处不再赘述。
403、根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及该蝶形代码被调用的调用次数,蝶形代码具体包括一种或多种混合模板,每种混合模板包括一种或多种原子模板,每种原子模板的个数为一个或多个。
404、根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的代码。
步骤404与步骤304类似,具体此处不再赘述。
需要说明的是,原子模板是预定义对数据序列进行FFT时的基本运算的代码,更准确地说,是预定义的用于进行蝶形运算所需的基本的代码,通过这些基本的代码模块,能够组合成各种基的混合模板。采用软件编程时,可以认为这些代码模块是用于组合成混合模板的最基本的自定义的函数,通过这些函数,能够组合成各种基的混合模板的代码。需要说明的是,这些函数是用户自定义,而非系统(如各种编程语言所带的库)提供的例如加、减、乘、除等最基本的函数),也即本申请中,原子模板的代码是一套基于系统自带的最基本的函数来构建的用于组合成各种基的混合模板的最基本的自定义的函数。
下面分别从原子模板的构成、混合模板的构成、混合模板的其他介绍、蝶形代码的构成等方面进行说明。
(一)原子模板的构成
具体的,本申请提供了一种原子模板库,该库包括6种原子模板,分别为第一原子模板,第二原子模板,第三原子模板,第四原子模板、第五原子模板以及第六原子模板,通过本申请中的原子模板库中的各个原子模板,可以通过组合的方式来构建生成各种基的混合模板的代码。
本申请中,6种原子模板的定义分别如下:
1)第一原子模板,用于对原始输入复数ORI以及累加和复数SUM进行运算,输出的结果跟通过如下方式输出的结果相同:
对累加复数SUM乘以2得到新的累加复数;
对新的累加复数减去输入复数ORI,得到输出复数OUT;
其中,新的累加复数以及输出复数OUT作为运算后的输出;
例如,可用如下方式表示:
输入:复数SUM、ORI
输出:复数SUM、OUT
参考代码如下:
其中,代码中的变量SUM既作为输入,又作为输出,当然,也不限定通过两个变量来分别表示一个输入以及一个输出。其他原子模板中也可以使用该方式进行表示。
2)第二原子模板,用于对复数IN1和复数IN2进行运算,输出的结果跟通过如下方式输出的结果相同:
对复数IN1和复数IN2的实部、虚部分别进行加运算,得到输出复数OUT1;
对复数IN1和复数IN2的实部、虚部分别进行减运算,得到输出复数OUT2;
其中,OUT1以及OUT2作为运算后的输出;
例如,可用如下方式表示:
输入:复数IN1,IN2
输出:复数OUT1,OUT2
参考代码如下:
3)第三原子模板,用于对复数A和复数B’(复数B*实数S)的实部、虚部交叉加减(A的实部加减B’虚部;A的虚部加减B’的实部)
例如,可用如下方式表示:
输入:复数A、B;实数S
输出:复数Z1、Z2
参考代码如下:
4)第四原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、中间值TMP以及累加复数F进行运算,输出的结果跟通过如下方式输出的结果相同:
将复数IN1的实部乘以旋转因子TW的实部加上累加复数F的实部得到累加和SUM的实部;
将复数IN1的虚部乘以旋转因子TW的实部加上累加复数F的虚部得到累加和SUM的虚部;
将复数IN2的虚部乘以旋转因子TW的虚部得到中间值TMP的实部;
将复数IN2的实部乘以旋转因子TW的虚部得到中间值TMP的虚部;
将SUM的实部减去中间值TMP的实部得到输出值OUT的实部;
将SUM的虚部加上中间值TMP的虚部得到输出值OUT的虚部;
例如,可用如下方式表示:
输入:复数IN1、IN2;旋转因子TW的实部TWR、旋转因子TW的虚部TWI;中间值TMP;复数F、SUM
输出:复数SUM、OUT
参考代码如下:
5)第五原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、第一中间值TMP1、第二中间值TMP2、累加和复数SUM以及输出数据OUT进行运算,输出的结果跟通过如下方式输出的结果相同:
将复数IN1的实部乘以旋转因子TW的实部得到第一中间值TMP1的实部;
将复数IN1的虚部乘以旋转因子TW的实部得到第一中间值TMP1的虚部;
将复数IN2的虚部乘以旋转因子TW的虚部得到第二中间值TMP2的实部;
将复数IN2的实部乘以旋转因子TW的虚部得到第二中间值TMP2的虚部;
将原来OUT的实部加上第一中间值TMP1的实部再减去第二中间值TMP2的实部得到新OUT的实部;
将原来OUT的虚部加上第一中间值TMP1的虚部再加上第二中间值TMP2的虚部得到新OUT的虚部;
将原来SUM的实部加上第一中间值TMP1的实部得到新后的SUM的实部;
将原来SUM的虚部加上第一中间值TMP1的虚部得到新后的SUM的虚部;
例如,可用如下方式表示:
输入:复数IN1、IN2;旋转因子TW的实部TWR、旋转因子TW的虚部TWI;第一中间值TMP1、第二中间值TMP2;SUM、OUT
输出:复数SUM,OUT
参考代码如下:
6)第六原子模板:用于对复数A和复数B的实部、虚部进行运算,输出的结果跟通过如下方式输出的结果相同:
将复数A的实部加上复数B的实部得到复数C的实部;
将复数A的虚部加上复数B的虚部得到复数C的虚部;
得到输出复数C;
其中,所述复数C作为运算后的输出。
例如,可用如下方式表示:
输入:复数A、B
输出:复数C
参考代码如下:
可以理解的是,以上代码是用C语言简单示意的代码,本领域技术人员可以理解其表示的含义以及了解如何用其他类似的高级语言来实现相同的功能。
(二)混合模板的构成
下面对如何使用原子模板库中的原子模板组合成基于不同基的混合模板的代码进行具体说明,为了描述方案,下文用“基”来简略地表示“基于不同基的混合模板”,也即如果提到“基-2的代码”也即表示“基为2的混合模板的代码”。每一级对应的蝶形的基为2,或者4,或者为不等于2的质数。其中,针对基的不同的取值,需要使用的混合模板的种类也不同,例如,当基为2或4时,需要调用第一种混合模板,当基的值x为质数且不为2时,需要调用第一种混合模板和第二种混合模板。
具体的,当每一级对应的蝶形的基取值(以下简称“基的值”)为2或4时,则需要调用1种混合模板,即第一种混合模板(因只有一种混合模板,也可以直接称为基-2或基-4的混合模板),第一种混合模板用于对数据序列中的元素进行计算,第一种混合模板的数量为1;当基的值x为质数且不为2时,则需要调用2种混合模板,分别为第一种混合模板和第二种混合模板,其中,第一种混合模板用于将x-1个输入数据进行处理,得到x-1个输出结果(不包括第一输出结果),第二种混合模板用于对x个输入数据进行求和,得到第一输出结果,第一种混合模板的数量满足条件: 表示对x/2向下取整,x是基的取值,m表示第一种混合模板的数量;第二种混合模板的数量为1。
例如,基-2的蝶形中包含1个混合模板,基-4的蝶形中包含1个混合模板,基-7的蝶形中包含3个第一种混合模板和1个第二种混合模板,基-11的蝶形中包含5个第一种混合模板和1个第二种混合模板。
需要说明的是,不同蝶形的基对应的第一种混合模板的具体代码不同,本申请中涉及的第一种混合模板和第二种混合模板用于在基的值为质数且不为2时,对代码的功能进行分类。
不同类型的基的代码所使用的原子模板的种类及个数都会不同,本领域技术人员可以根据傅里叶变换公式以及本申请给出的各个原子模板来推导出使用哪些原子模板来组合成基对应的代码。同时,申请人经过实验测试发现,在实际应用中,并不需要为每种基都构造代码,而只需要为基-2、基-4以及基-x(x为不为2的质数)这几种基构成代码即可,任何序列长度在分解时,都可以分解到每一级的基为基-2、基-4以及基-x(x为不为2的质数)这几种中的其中一个,因此,通过这几种基就能够针对任意长序列的完成FFT代码的生成。为了更好地方便理解,下面对使用上述原子模板来构造基-2、基-4、基-x(x为不为2的质数)的代码进行说明。
1)基为2;
因为可得到X0=x0+x1,X1=x0-x1,第二原子模板可以实现上述关系式的运算,因此,可以使用1个第二原子模板来生成基-2的代码。
基-2(radix-2)的第一种混合模板对应的代码包括:
下面对混合模板基于蝶形运算的原理来选相应的原子模板,来实现对某个蝶形运算的处理过程进行说明。
基-2的混合模板的代码的蝶形运算过程如下:
当输入的数据序列的长度为2时,根据2个输入复数x0,x1得到:
x0=scratch_in[0],x1=scratch_in[1]。
通过上述PERF_ATOM_ADDSUB_2代码可得到:
Fout[0]=(x0+x1).r+(x0+x1).i;
Fout[1]=(x0-x1).r+(x0-x1).i。
其中,Fout[0]、Fout[1]为两个输出。若输入序列为{2,3}(即x0为2,x1为3)进行运算后,得到输出数列为{5,-1}(即Fout[0]为5,Fout[1]为1)。
2)基为4;
因为可得到,X0=x0+x1+x2+x3,X1=x0+x1j-x2-x3j,X2=x0-x1+x2-x3,X3=x0-x1j-x2+x3j,因此,可以使用3个第二原子模板和1个第三原子模板来组合生成基-4的代码。
基-4(radix-4)的第一种混合模板对应的代码包括:
R4_MIX_ATOM_TEMPLATE()//基-4的第一种混合模板对应的代码
{
PERF_ATOM_ADDSUB_2(scratch[0],scratch[1],scratch_in[0],scratch_in[2]);
PERF_ATOM_ADDSUB_2(scratch[2],scratch[3],scratch_in[1],scratch_in[3]);
PERF_ATOM_ADDSUB_2(Fout[0],Fout[2],scratch[0],scratch[2]);
PERF_CPX_ADD_NEG_I_3(Fout[1],Fout[3],scratch[1],scratch[3],TW4_I);
}
其中,各个原子模板的代码参考上述6种原子模板的代码,此处不再展开。
基-4的混合模板的代码的蝶形运算过程如下:
当输入的数据序列的长度为4时,根据4个输入复数x0,x1,x2,x3得到:
x0=scratch_in[0],x1=scratch_in[1],x2=scratch_in[2],x3=scratch_in[3]。
先通过第一、二个PERF_ATOM_ADDSUB_2的代码得到:
scratch[0]=(x0+x2).r+(x0+x2).i,
scratch[1]=(x0-x2).r+(x0-x2).i,
scratch[2]=(x1+x3).r+(x1+x3).i,
scratch[3]=(x1-x3).r+(x1-x3).i;
再通过第三个PERF_ATOM_ADDSUB_2的代码计算得到:
Fout[0]=(x0+x2).r+(x1+x3).r+(x0+x2).i+(x1+x3).i
=(x0+x1+x2+x3).r+(x0+x1+x2+x3).i;
Fout[2]=(x0+x2).r-(x1+x3).r+(x0+x2).i-(x1+x3).i
=(x0-x1+x2-x3).r+(x0-x1+x2-x3).i;
再通过PERF_CPX_ADD_NEG_I_3的代码计算得到:
Fout[1]=((x0-x2).r+(x1-x3).i*TW4_I).r+((x0-x2).i-(x1-x3).r*TW4_I).i;
Fout[3]=((x0-x2).r-(x1-x3).i*TW4_I).r+((x0-x2).i+(x1-x3).r*TW4_I).i;
得到4个输出复数Fout[0]、Fout[1]、Fout[2]、Fout[3]。
若输入的序列为{2,3,3,2},根据上述过程计算得到的输出数列为{10,-1-j,0,-1+j}。
需要说明的是,第一、第二个PERF_ATOM_ADDSUB_2的代码之间的顺序不定,两个PERF_ATOM_ADDSUB_2的代码之间的顺序可以进行调整,但必须在第三个PERF_ATOM_ADDSUB_2的代码和PERF_CPX_ADD_NEG_I_3的代码之前,其中,第三个PERF_ATOM_ADDSUB_2的代码和PERF_CPX_ADD_NEG_I_3的代码之间没有依赖关系,顺序可以改变,具体排序规则在后面详细描述,此处不做限定。
3)基为质数且不为2;
假设以基-x(radix-x)表示一个除2以外的质数基,其中,x为质数,x的取值可以为除2以外的例如3、5、7、11、13等质数。根据快速傅里叶变换FFT的定义及公式(2)得到对应的两种混合模板对应的代码,radix-x的第一种混合模板对应的代码可以包括3种原子模板:第四原子模板、第五原子模板和第一原子模板,具体的,可以包括1个第四原子模板、m-2个第五原子模板和1个第一原子模板,其中表示对x/2向上取整,x为基的取值。radix-x的第二种混合模板对应的代码可以包括1种原子模板:1个第六原子模板。
例如,基-3的第一种混合模板对应的代码包括1个第四原子模板、0(即)个第五原子模板和1个第一原子模板,基-3的第二种混合模板对应的代码包括1个第六原子模板。关于基-3的混合模板对应的代码也能从公式(2)和图2B可以看出,基-3的运算为:
(三)混合模板的其他介绍
1)混合模板中原子模板的顺序关系
本领域技术人员可以理解,当一个混合模板由多个原子模板构成时,还需要满足依赖性原则:
1、第一目标原子模板的输出为第二目标原子模板的输入时,第一目标原子模板排列在第二目标原子模板之前,即具有依赖性的原子模板之间具有特定的顺序;
2、不具有依赖性的原子模板相互之间的顺序可以改变。
具体的,根据混合模板对应的代码中各个原子模板之间的依赖关系将被依赖的原子模板的顺序排在依赖别人的原子模板的前面;其中,该依赖关系包括运算数据的依赖关系,或者跟运算数据相关的硬件资源的依赖关系。即混合模板对应的代码中具有依赖性的不同的原子模板通过特定的排列顺序实现特定的计算功能,因此具有依赖性的原子模板相互之间的顺序不能调换。
例如,基-4的混合模板对应的代码需要2种原子模板,分别为第一原子模板和第三原子模板,基-4的混合模板对应的代码具体包括3个第二原子模板和1个第三原子模板,具体代码如下所示:
如上所述的代码,3个第二原子模板、1个第三原子模板依次先后排列,3个第二原子模板排列在1个第三原子模板之前,3个第二原子模板中,前2个第二原子模板的计算结果之间不关联,即排序在后的原子模板的输入不依赖排序在前的原子模板的输出结果,而第3个第二原子模板依赖前2个第二原子模板的计算结果(Fout[0],Fout[2]依赖第1、2个第二原子模板中得到的scratch[0],scratch[2]),因此,前2个第二原子模板之间的顺序可以进行调换,第3个第二原子模板必须在第1、2个第二原子模板之后)。
其中,1个第三原子模板依赖前2个第二原子模板的计算结果,第3个第二原子模板和1个第三原子模板相互之间没有依赖性,因此,1个第三原子模板必须在第1、2个第二原子模板之后,同时,第3个第二原子模板和1个第三原子模板之间的顺序可以改变(因为这两个运算都是针对不同的输入进行运算,相互之间没有依赖性)。
又例如,基-7的第一种混合模板对应的代码需要3种原子模板,分别为第四原子模板、第五原子模板和第一原子模板,基-7的混合模板对应的代码具体包括1个第四原子模板、2个第五原子模板和1个第一原子模板,具体代码如下所示:
其中,1个第四原子模板、2个第五原子模板和1个第一原子模板依次排列。
对于基-7的混合模板对应的代码而言,包含的1个第四原子模板、2个第五原子模板和1个第一原子模板按照从前至后顺序依次排列,其中,排序靠前的第1个第五原子模板和排序靠后的第2个第五原子模板是相互独立的,即第2个第五原子模板的输入不依赖第1个第五原子模板的输出结果,二者之间可调换顺序;1个第一原子模板依赖于前面的2个第五原子模板的输出结果,因此1个第一原子模板不能与前面2个第五原子模板调换顺序。
不为2的质数基的第二种混合模板对应的代码如下:
其中,第三个参数为基的取值radix;
输入:复数数组in[]、实数radix;
输出:复数out[0]。
下面通过具体示例对不为2的质数基中各个原子模板及其计算过程进行说明。
基-7(radix-7)的第一种混合模板对应的代码表示如下:
基-7(radix-7)的第二种混合模板对应的代码表示如下:
其中,各个原子模板的代码参考上述6种原子模板的代码,此处不再展开。
基-7的混合模板(包括第一种混合模板和第二种混合模板)的代码的蝶形运算过程如下:
公式(2)中的输出X[0,…,N-1]=Fout[0,…,N-1],Fout[]有7个元素,与输出的7项对应,公式(2)中的输入x0,…,x6=Fin[0,…,6]=x[0,…,6]。原子模板代码中scratch[0,…,N-1]跟输入(x[])有关系,但不直接对应,具体关系为:
基-7的第一种混合模板对应的代码中的参数与公式(2)的对应关系如下:
scratch[0]=x[1]+x[6];
scratch[1]=x[1]-x[6];
scratch[2]=x[2]+x[5];
scratch[3]=x[2]-x[5];
scratch[4]=x[3]+x[4];
scratch[5]=x[3]-x[4]。
在R7_MIX_ATOM_TEMPLATE()的代码中,要想获得一个最终结果Fout[1],需要Fin[0,1,…,6](即Fin[0],Fin[1],……,Fin[6],下文为描述方便,多个数据的表示方法采用类似x[0,1,…,6]的方式进行表示)共七个元素作为输入进行蝶形计算,因为7是奇数,所以Fin[0]必须是单独处理,对应为第四原子模板PERF_FORMER_ODD_CPX_WITH_F_4()必须在第一位调用,因为这个原子模板把此混合模板对应的代码中第0个复数与第1、第2个复数一并进行了计算,共涉及三个复数的计算;而2个第五原子模板PERF_FORMER_ODD_CPX_TW_5()是进行不同的两组、每组两个复数的计算,这两个模板之间可调换顺序,算法上是相互独立的。最后的1个第一原子模板PERF_ATOM_ODD_ADDSUB_1()是固定的,因为每一个混合模板对应的代码,是会得到一前一后对称的输出(如基-7中的Fout[1]和Fout[6]),但这个第一原子模板之前的操作只得到了一个输出如Fout[1],需要在最后调用本模板PERF_ATOM_ODD_ADDSUB_1()基于Fout[1]和SUM得出另一个输出Fout[6]。
同理,以基-11为例进行说明,基-11的第一种混合模板对应的代码表示如下:
基-11(radix-11)的第二种混合模板对应的代码表示如下:
公式(2)中的输出X[0,…,N-1]=Fout[0,…,N-1],Fout[]有11个元素,与输出的11项对应,公式(2)中的输入x0,…,x10=Fin[0,…,10]=x[0,…,10]。原子模板代码中scratch[0,…,N-1]跟输入(x[])有关系,但不直接对应,具体关系为:
基-11的第一种混合模板对应的代码中的参数与公式(2)的对应关系如下:
scratch[0]=x[1]+x[10];
scratch[1]=x[1]-x[10];
scratch[2]=x[2]+x[9];
scratch[3]=x[2]-x[9];
scratch[4]=x[3]+x[8];
scratch[5]=x[3]-x[8];
scratch[6]=x[4]+x[7];
scratch[7]=x[4]-x[7];
scratch[8]=x[5]+x[6];
scratch[9]=x[5]-x[6]。
需要说明的是,基-11和基-7的运算过程类似,都是x0单列,通过第二种混合模板得到;x1到xN-1的元素一头一尾依次配对,通过第一种混合模板得到,从x[]到X[]的过程对应公式(2)中左侧X(0)至X(N-1)的计算过程。其中,输入都是一头一尾组对,基-7是三对,基-11是五对,都是复数,分实部和虚部。
X[0,…,N-1]=Fout[0,…,N-1]的具体推导过程如下:
以基-11为例进行说明,首先分别计算出X[0,1,…,10]的值:
根据公式(2)可得,X(0)=x0+x1+x2+…+x10。
根据代码推导:
Fout[0]=in_0+scratch[0]+scratch[2]+scratch[4]+scratch[6]+scratch[8]=x[0]+(x[1]+x[10])+(x[2]+x[9])+(x[3]+x[8])+(x[4]+x[7])+(x[5]+x[6]),其中in_0对应公式中的x0。
综上所述,X(0)=Fout[0]。
其他十项X[]元素类似,代码中也是分成了五对(x1-x10,x2-x9,x3-x8,x4-x7,x5-x6),调用了五次基-11的混合模板对应的代码,每次调用中先调1个第四原子模板PERF_FORMER_ODD_CPX_WITH_F_4()和4个第五原子模板PERF_FORMER_ODD_CPX_TW_5()用于计算X[1/2/3/4/5]=Fout[1/2/3/4/5],再通过每个配对与SUM的关系(X[i]+X[N-i]=2SUM),调用1个第一原子模板PERF_ATOM_ODD_ADDSUB_1(),得出其对应的配对项X[6/7/8/9/10]=Fout[6/7/8/9/10]。
通过代码推导Fout[1]如下:
Fout[1]={[x0.r+(x1+x10).r*TWR-(x1-x10).i*TWI]+[x0.i+(x1+x10).i*TWR+(x1-x10).r*TWI]}+
{[(x2+x9).r*TWR-(x2-x9).i*TWI]+[(x2+x9).i*TWR+(x2-x9).r*TWI]}+
{[(x3+x8).r*TWR-(x3-x8).i*TWI]+[(x3+x8).i*TWR+(x3-x8).r*TWI]}+
{[(x4+x7).r*TWR-(x4-x7).i*TWI]+[(x4+x7).i*TWR+(x4-x7).r*TWI]}+
{[(x5+x6).r*TWR-(x5-x6).i*TWI]+[(x5+x6).i*TWR+(x5-x6).r*TWI]}
其中,x0的实部表示为x0.r,x0的虚部表示为x0.i,x1的实部表示为x1.r,x1的虚部表示为x1.i,依次类推,具体此处不再赘述。每行一个大括号{},其内的部分是从一个原子模板调用计算得出的内容,第1次为PERF_FORMER_ODD_CPX_WITH_F_4()第四原子模板,后4次为PERF_FORMER_ODD_CPX_TW_5()第五原子模板;大括号中包括两个中括号[],每个中括号内的部分是某一个原子模板计算的实数和虚数部分,然后每个实数部分是两项相减,虚数部分是两项相加。
通过公式(2)推导如下:
和前面通过代码推出的Fout[1]等价。
类似的,代码推导Fout[10]如下:
Sum={[x0.r+(x1+x10).r*TWR]+[x0.i+(x1+x10).i*TWR]}+{[(x2+x9).r*TWR]+[(x2+x9).i*TWR]}+{[(x3+x8).r*TWR]+[(x3+x8).i*TWR]}+{[(x4+x7).r*TWR]+[(x4+x7).i*TWR]}+{[(x5+x6).r*TWR]+[(x5+x6).i*TWR]}
Fout[10]=sum-Fout[1]={[x0.r+(x1+x10).r*TWR+(x1-x10).i*TWI+[x0.i+(x1+x10).i*TWR-(x1-x10).r*TWI]}+{[(x2+x9).r*TWR+(x2-x9).i*TWI]+[(x2+x9).i*TWR-(x2-x9).r*TWI]}+{[(x3+x8).r*TWR+(x3-x8).i*TWI]+[(x3+x8).i*TWR-(x3-x8).r*TWI]}+{[(x4+x7).r*TWR+(x4-x7).i*TWI]+[(x4+x7).i*TWR-(x4-x7).r*TWI]}+{[(x5+x6).r*TWR+(x5-x6).i*TWI]+[(x5+x6).i*TWR-(x5-x6).r*TWI]}
这里每行一个大括号{},同样是从一个原子模板调用计算得出的内容,包括的两个中括号[]也都是某一原子模板计算的实数和虚数部分,但不同的是实数两项相加,虚数部分两项相减。
也和前面通过代码推出的Fout[10]等价。
从DFT的定义,可知公式(2)中的W项应具有周期等价性(sin和cos函数的组合),从代码推出来的对应公式是互补的也可看出。比如:
{[(x2+x9).r*TWR-(x2-x9).i*TWI]+[(x2+x9).i*TWR+(x2-x9).r*TWI]}
{[(x2+x9).r*TWR+(x2-x9).i*TWI]+[(x2+x9).i*TWR-(x2-x9).r*TWI]}
通过这个特性,可推出X[1]和X[10]的关系,从而实现调用一次混合模板对应的代码得到一对前后对应的2个输出结果。
上述提到通过调用一次混合模板对应的代码可计算一对前后对应的2个输出结果,如基-11中的X[1]和X[10]、基-7中的X[1]和X[6],这样可以加速FFT运算。该特性是根据公式(2)推导出的关系式X[i]+X[x-i]=2*SUM得到。
其中x为radix-x中的x的值,i为第几对的起始值。
对于基-7,是类似X[1]+X[6=7-1]=2*SUM的关系。需要注意的是,这里的SUM并非我们传统意义上的SUM函数,这里的SUM其实就是推导出来的一个中间值,只是为了模版化服务,这种互补关系的引入能填充传统方法的不足,减少部分运算操作。每一对输入变量以及相乘的旋转因子不同,所以每一个混合模版的SUM都是不同的。
现在以基-7的X[1]和X[6]这一对为例,通过公式(2)推导关系式:
当上下两式相加后:
因此,可以实现上述基-11的Fout[1]与Fout[10]的配对关系,实数虚数部分各自两项的加减相反,互补可消的情况。
2)混合模板的代码优化
为了提高生成的FFT代码的性能,混合模板对应的代码还可以根据硬件平台进行优化。例如,混合模板对应的代码一开始可以都基于高级语言(如C语言或者Java等)进行编写,然后可以基于硬件平台不同的汇编指令集进行优化后生成更适用于各个硬件平台的的汇编语言。不同的硬件平台,得到的优化后的混合模板的代码不同。例如,ARM架构、x86架构或POWER架构等硬件平台上得到的优化后的混合模板的代码就不相同。在优化时,可以根据不同的硬件平台所提供的汇编指令集来选择最适合的汇编指令来实现。
例如,以ARMv8架构的硬件平台为例,如图4B、图4C、图4D所示,图4B反映了第一原子模板、第二原子模板和第三原子模板优化前后的代码映射关系,图4C反映了第四原子模板和第五原子模板优化前后的代码映射关系,图4D反映了第六原子模板优化前后的代码映射关系,代码映射关系为将原子模板的C语言代码替换成ARMv8硬件平台上对应的汇编指令。
优化后的混合模板的代码为预先得到的,这里的“预先”是指在运行生成FFT的代码之间(即在步骤401之前)就已经生成,通常是设备(如手机、平板等终端设备)在出厂时,就已经由生产厂家优化完成,并存储在设备上,后续在需要生成FFT代码时可以直接调用优化后的混合模板的代码。可以根据实际情况进行存储,例如,将基-2、基-3、基-4、基-5、基-7、基-11等有限个数的基对应的混合模板的代码进行存储,具体此处不做限定。
具体的优化方式可以包括如下几种方式中的一种或者多种的组合:寄存器分组、选择性能最高的指令以及优化指令流水。下文分别对这几种优化方式进行介绍。
(1)寄存器分组
根据中央处理器(central processing unit,CPU)浮点寄存器数目的不同,定义寄存器分组的策略如下:
根据寄存器的用途对寄存器进行分组,并严格定义各组寄存器的使用规则。在FFT的混合模板对应的代码实现中,将32个浮点寄存器分成了四组:输入寄存器组、旋转(twiddles)寄存器组,中间计算结果寄存器组和输出寄存器组。每组寄存器的使用都有严格的规范:
1、在基的取值(基值)小于基-11的情况下,例如radix-3,radix-4,radix-5等,寄存器足够使用。那么不同分组的寄存器只具有单一功能:输入寄存器组只负责存储输入数据、旋转寄存器组只负责存储各级的旋转因子、中间计算结果寄存器组只负责存储中间计算结果,输出寄存器组只负责存储最终的FFT计算结果。同时,不同的混合模板对应的代码都使用不同的寄存器。
2、在基的取值(基值)大于或等于基-11的情况下,例如radix-13,由于每个混合模板对应的代码中进行FFT变换的输入、输出和计算都增加,导致出现寄存器不够使用的情况。此时,将蝶形网络的每一级中上一个混合模板对应的代码的输入寄存器组复用为下一个混合模板对应的代码的中间计算结果寄存器组,将蝶形网络的每一级中上一个混合模板对应的代码的旋转寄存器组复用为下一个混合模板对应的代码的旋转寄存器组。
(2)选择性能最高的指令
即可以根据不同的硬件平台,选择性能最高的指令,即该处理器架构中吞吐量最大或执行时钟周期数最少的指令。例如,对于ARM架构的硬件平台,做加减法(模板里的常见操作)使用普通指令的性能就不如单指令多数据流(single instruction multiply data,SIMD)的向量化指令高;对于Intel x86架构的硬件平台,它的高级向量扩展(advancedvector extensions,AVX)指令集也比普通指令集的效率高。又例如,复数实部和虚部的载入,使用两组load1指令加上交换(swap)指令调换,就不如使用两条load2指令。使用两条load2指令时,总时钟周期数的消耗少,需要的指令数也降低,因此性能得以提升。因此,可以结合不同的架构选择在各个架构下性能最高的指令。
(3)优化指令流水
可以通过优化指令流水来避免流水线停顿,具体方法如下:
1、减少相邻指令的寄存器依赖,例如,下条指令的输入是上条指令的输出,两者就会存在寄存器依赖,主要解决途径为寄存器分组。
2、降低访存指令对性能的影响,因为访问内存的延时远大于访问处理器内部的寄存器延时。解决途径是在访存指令和使用该访存指令结果的计算指令间插入足够多的无关计算指令,其中,无关计算指令是指不同指令之间,所使用的寄存器逻辑上不相关,最大限度地隐藏访存指令的延时。插入足够多的无关计算指令:看是否使用不同的寄存器。如果有32个寄存器,前10个是加载数据,计算相加得到结果。有些指令使用后面的寄存器,就不会影响加载寄存器,就可以并行地去执行。
对于创建的混合模板对应的代码,根据不同的CPU架构,通过寄存器的最佳使用、采用吞吐量最大、延迟最小、性能最高的指令以及优化了指令流水的指令序列,生成对应的优化后的代码。可以事先针对每一种CPU架构测出这个最优的代码,得到对应该架构的一个最佳的代码,实现计算与优化的分离,降低FFT代码的优化门槛。
(四)蝶形代码的构成
本申请中,可以只提供上述三种情况(基-2、基-4、非2的质数基)的混合模板的代码,相应地,在对长度为N的数据序列进行FFT得到FFT代码时,每一级的代码对应的基为以上三种情况中的一种。下面通过一些示例对蝶形代码的组成进行具体说明。
1)当数据序列的长度N为2的幂次方时;
数据序列的长度为N的代码可以通过调用基-2的蝶形代码和基-4的蝶形代码组成,数据序列的长度为8的代码中的各种原子模板的调用次数为调用的基-2和/或基-4的蝶形代码中的各种原子模板的调用次数之和,数据序列的长度为8的代码中的原子模板的种类与调用的基-2和/或基-4的蝶形代码中的原子模板的种类相同,蝶形代码中调用的原子模板的种类、调用次数以及排列顺序如上述所述,此处不再赘述。
例如,对于长度为8的数据序列而言,分解为8=2*4时,最终的FFT代码中可以包括2级代码,第一级代码调用4次基-2的蝶形代码,第二级代码调用2次基-4的蝶形代码,第一级代码排列在第二级代码之前,第一级代码将8个输入数值转换成8个中间数值,第二级代码将8个中间数值转换成8个输出数值。其中,第一级代码中的每个基-2的代码分别处理2个不同的输入数值,第二级代码中的每个基-4的代码分别处理4个不同的中间数值。因为同一级中每个蝶形的代码相互独立,因此,第一级代码中4个基-2的蝶形代码之间的排列顺序也可以改变,第二级代码中的2个基-4的蝶形代码之间的顺序也可以改变。每一级代码需要调用的蝶形代码的数量可以根据步骤303的公式(3)得到,具体此处不再赘述。每一级代码中每需要调用一次蝶形代码,则需要在每一级中增加相应的一个蝶形代码,按照顺序依次排列。
可以理解的是,在实际应用中,当需要调用多个具有相同功能的蝶形代码时,可以采用循环调用的方式,例如,上述第一级代码中需要调用4次基-2的蝶形代码,实际的代码中只包含一个基-2的蝶形代码,通过函数循环调用该基-2的蝶形代码四次,具体此处不再赘述。
对于长度为8的数据序列,还可以分解为8=2*2*2,此时,最终的FFT代码中可以包括3级代码,第一级代码需要调用4次基-2的蝶形代码,第二级代码需要调用4次基-2的蝶形代码,第三级代码需要调用4次基-2的蝶形代码,第一级代码、第二级代码和第三级代码依次排列,第一级代码将8个输入数值转换成8个第一中间数值,第二级代码将8个第一中间数值转换成8个第二中间数值,第三级代码将8个第二中间数值转换成8个输出数值。其中,第一级代码中的每个基-2的蝶形代码分别处理2个不同的输入数值,第二级代码中的每个基-2的蝶形代码分别处理2个不同的第一中间数值,第三级代码中的每个基-2的蝶形代码分别处理2个不同的第二中间数值。因为同一级中每个蝶形的代码相互独立,因此,第一级代码中4个基-2的蝶形代码之间的排列顺序也可以改变,第二级代码中的4个基-2的蝶形代码之间的顺序也可以改变,第三级代码中的4个基-2的蝶形代码之间的顺序也可以改变。每一级代码需要调用的蝶形代码的调用次数可以根据步骤303的公式(3)得到,具体此处不再赘述。可以理解的是,在实际应用中,每一级中可能只包含一个基2的蝶形代码,参考上述的循环调用的方式,具体此处不再赘述。
当数据序列的长度N为2的幂次方中的其他数值时,可以参照长度为8的数据序列的代码组成方法,将多个基-2的蝶形代码和/或基-4的蝶形代码进行组合,得到相应的代码。
2)当数据序列的长度N不为2的幂次方时。
(1)当数据序列的长度N不为质数时,且N可以分解为多个正整数相乘,每一个正整数对应一种蝶形的基。
例如,长度为6的数据序列的FFT代码可以通过先调用基-2的蝶形代码,后调用基-3的蝶形代码得到,也可以先调用基-3的蝶形代码,后调用基-2的蝶形代码得到,调用的顺序不同,得到的长度为6的数据序列的FFT代码也不同。
长度为6的数据序列的FFT代码中的各种原子模板的调用次数为调用的基-2的蝶形代码和基-3的蝶形代码中的各种原子模板的调用次数之和,数据序列的长度为6的代码中的原子模板的种类与调用的基-2和基-3的蝶形代码中的原子模板的种类相同。其中,调用次数可以根据步骤303的公式(3)得到,具体此处不再赘述。
例如,对于长度为6的数据序列而言,可以通过调用基-2的蝶形代码和基-3的蝶形代码组成。当长度为6的数据序列分解为6=2*3时,FFT代码中可以包括2级代码,第一级代码需要调用3次基-2的蝶形代码,第二级代码需要调用2次基-3的蝶形代码,第一级代码排列在第二级代码之前,第一级代码将6个输入数值转换成6个中间数值,第二级代码将6个中间数值转换成6个输出数值。其中,第一级代码中的每个基-2的蝶形代码分别处理2个不同的输入数值,第二级代码中的每个基-3的蝶形代码分别处理3个不同的中间数值。因为同一级中每个蝶形代码相互独立,因此,第一级代码中3个基-2的蝶形代码之间的排列顺序也可以改变,第二级代码中的2个基-3的蝶形代码之间的顺序也可以改变。每一级代码需要调用的蝶形代码的调用次数可以根据步骤303的公式(3)得到,具体此处不再赘述。
当长度为6的数据序列分解为6=3*2时,长度为6的数据序列中可以包括2级代码,第一级代码需要调用2次基-3的蝶形代码,第二级代码需要调用3次基-2的蝶形代码,第一级代码和第二级代码依次排列,第一级代码将6个输入数值转换成6个中间数值,第二级代码将6个中间数值转换成6个输出数值。其中,第一级代码中的每个基-3的蝶形代码分别处理3个不同的输入数值,第二级代码中的每个基-2的蝶形代码分别处理2个不同的中间数值。因为同一级中每个蝶形代码相互独立,因此,第一级代码中2个基-3的蝶形代码之间的排列顺序也可以改变,第二级代码中的3个基-2的蝶形代码之间的顺序也可以改变。每一级代码需要调用的蝶形代码的调用次数可以根据步骤303的公式(3)得到,具体此处不再赘述。
当数据序列的长度N为其他数值时,可以参照长度为6的数据序列的FFT代码组成方法,将多个质数基的蝶形代码、和/或基-2的蝶形代码,和/或基-4的蝶形代码进行组合,得到相应的FFT代码。
(2)当数据序列的长度N为质数时。
例如,长度为7的数据序列的FFT代码可以通过调用基-7的蝶形代码得到。
长度为7的数据序列的FFT代码中的各种原子模板的调用次数为调用的基-7的蝶形代码中的各种原子模板的调用次数之和,数据序列的长度为7的代码中的原子模板的种类与调用的基-7的蝶形代码中的原子模板的种类相同。
当数据序列的长度N为其他质数时,可以参照长度为7的数据序列的代码组成方法,调用对应质数基的蝶形代码,得到相应的FFT代码。
每一级对应的蝶形的基不同,每一级对应的代码也不同,下面举例说明。
以数据序列的长度为8为例进行说明:
根据步骤301至步骤302确定对应的分解方式,得到对应的级。例如8=2*4,对应2级代码,第一级的代码需要调用4次基-2的蝶形代码,第二级的代码需要调用2次基-4的蝶形代码。
第一级代码需要调用4次基-2的蝶形代码,第一级代码如下:
FFT_R2_KERNEL(…)//基-2的蝶形代码,同上,不再展开
FFT_R2_KERNEL(…)//基-2的蝶形代码,同上,不再展开
FFT_R2_KERNEL(…)//基-2的蝶形代码,同上,不再展开
第二级代码需要调用2次基-4的蝶形代码,第二级代码如下:
FFT_R4_KERNEL(…)//基-4的蝶形代码,同上,不再展开。
以数据序列的长度为14为例进行说明:
长度为14的数据序列的蝶形网络具有两个级,对应分解方式为14=7*2,则第一级的代码需要调用2次基-7的蝶形代码,第二级代码中需要调用7次基-2的蝶形代码,第一级代码如下:
具体代码参考上述基-7的第一种混合模板的代码和基-7的第二种混合模板的代码,此处不再展开。
在蝶形网络的实际应用中,可以将每一级中不交叉的蝶形归属于一段(section),每一级中可以包括一个或多个段,每个段可以包括1个或多个蝶形(butterfly),蝶形由一个或多个混合模板组成,蝶形数量取决于基的取值(蝶形数量等于蝶形的调用次数)。因此,段数(section_num)和每一段的蝶形数(butterfly_num)的乘积相当于通过公式(3)算出来的每一级需要蝶形代码的调用次数。
如图5所示,数据序列的长度N为7时,对应的基为基-7,数据序列对应的蝶形网络包括1个级,且该级中只有一个段,该段只有一个基-7的蝶形,该基-7的蝶形代码即为长度为7的数据序列的FFT代码,其中,基-7的蝶形代码中包括3个基-7的第一种混合模板的代码和1个基-7的第二种混合模板的代码。
可以看出原子模板-混合模板-蝶形-段-级-FFT蝶形网络的层次关系和组装规则。需要说明的是,图5只是从概念上说明了蝶形网络的代码的构成方式,在具体实现中,不同的基对应的级的数量不同,每个不同的级(stage),它们的段数(section_num)可能不一样;对于每个不同的段(section),它们的蝶形数(butterfly_num)也可能不一样,从图1B可以很清楚的看出这个特点。此外,对于不同的stage、section或butterfly,内层的蝶形代码可能也不一样,取决于输入序列的长度和分解方式,它们会影响组成蝶形网络的混合模板的种类、数量和排列顺序。也可以不包括段,直接由蝶形的代码组成级的代码。
需要说明的是,不同的分解方式,最终生成的蝶形网络的FFT代码不同,例如,数据序列的长度为15,则对应的FFT分解方式可以为,15=5*3或15=3*5;先生成3个基-5的蝶形代码、后生成5个基-3的蝶形代码,与先生成5个基-3的蝶形代码、后生成3个基-5的蝶形代码相比,得到的最终代码不同,即生成的蝶形网络的FFT代码不同。
本申请实施例提供了一种快速傅里叶变换代码的生成方法,先获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度,再数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及该蝶形代码被调用的调用次数,其中,蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码;根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码。将快速傅里叶变换代码分解为多个原子模板,便于后续对原子模板进行优化,进一步提高快速傅里叶变换FFT代码的性能。
实施例三
基于上述各实施例,请参阅图6,在本申请实施例中快速傅里叶变换代码生成方法的另一个实施例包括:
601、获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度。
602、根据数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基。
603、根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及该蝶形代码被调用的调用次数。
604、根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码。
步骤601至步骤604与步骤401至步骤404类似,具体此处不再赘述。
605、对生成的蝶形网络的FFT代码进行性能检测,得到蝶形网络的FFT代码对应的性能。
性能检测是指对每一个蝶形网络的代码(即FFT代码)都执行一遍,通过最终的执行时间的长短来判断性能的高低,如果执行时间短,则性能高,反之,性能低。
可以理解的是,一个长度为N的数据序列可以对应不同的分解方式,可以在所有分解方式对应的蝶形网络的代码中确定一个执行时间最短的(即性能最优)的代码。具体步骤可以参照图7所示的流程步骤,输出一个执行时间最短的蝶形网络的代码。具体过程如下:
701、获取各种参数。
获取生成FFT代码需要的各种参数,例如数据序列的长度等。
702、判断是否存在最优分解方式。
若存在最优分解方式,则执行步骤703,若不存在最优分解方式,则执行步骤704。
703、得到最优分解方式对应的FFT代码。
直接调用最优分解方式对应的FFT代码。
704、确定分解方式。
若不存在最优分解方式,则在一个或多个分解方式中选择一个作为此次的分解方式。例如,15=3*5或15=5*3,可以选择15=3*5作为此次的分解方式。
705、生成FFT代码。
根据确定的分解方式生成对应的FFT代码。
706、获取FFT代码的测试性能。
对根据分解方式生成的FFT代码进行性能测试,确定该FFT代码的执行时长。
707、判断是否存在其他分解方式。
进一步判断该数据序列是否存在其他分解方式,若存在,则执行步骤704,若不存在,则执行步骤708。
708、比较各种分解方式对应的FFT代码的测试性能。
比较得到的各种分解方式对应的FFT代码的测试性能,即比较各个FFT代码的执行时长。
709、得到测试性能最优的分解方式对应的FFT代码。
得到执行时长最短的分解方式对应的FFT代码。
710、记录该场景下最优的分解方式对应的FFT代码,供下次直接调用。
记录该场景下执行时长最短的FFT代码,供下次直接调用。
例如,长度为64的数据序列分解方式有例如:64=2*2*2*2*2*2、64=4*4*4等多种,在获取各种参数(701)后,判断该长度为64的数据序列是否存在最优分解方式(702);若存在最优的分解方式,则得到最优分解方式对应的FFT代码(703);若不存在最优的分解方式,则在对个分解方式中确定一个分解方式(704),例如,确定分解方式为64=4*4*4;再根据分解方式64=4*4*4生成第一FFT代码(705),并获取该FFT代码的测试性能,即代码的执行时长(706);再次判断是否存在其他分解方式(707),确定还存在分解方式64=2*2*2*2*2*2,根据该分解方式64=2*2*2*2*2*2生成第二FFT代码(705);并获取第二FFT代码的性能(706);再继续判断还有没有其他的分解方式(707),如果有,再重复执行705到707的过程,直至没有其他的分解方式,此时,比较各种分解方式对应的FFT代码的测试性能(例如,比较第一FFT代码和第二FFT代码的测试性能),并得到测试性能最优的分解方式对应的代码(709),例如,将执行时间短的分解方式64=4*4*4作为该长度为64的数据序列的最优分解方式,得到该最优分解方式对应的FFT代码;此外,还可以记录该场景下的最优分解方式以及该分解方式对应的FFT代码(710),便于下次输入长度为64的数据序列时直接调用,例如,在步骤702时,如果有最优分解方式,则可以直接调用记录的代码。
不同的分解方式,得到的级数(stage_num)、段数(section_num)、蝶形数(butterfly_num)和涉及的基等控制参数都不同,段数(section_num)和每一段的蝶形数(butterfly_num)的乘积相当于通过公式(3)算出来的每一级需要调用的蝶形数量,根据这些参数生成不同的FFT蝶形网络的代码,即生成不同的高性能FFT代码。
需要说明的是,一旦在某硬件平台下针对某个输入长度的FFT序列生成了最优分解方式的FFT代码,以后在该硬件平台下输入了该长度的FFT序列后,则可直接调用存储在该硬件平台上的对应的最优分解方式的FFT代码。例如,在ARMv8架构下,若第一次输入了长度为64的数据序列,并确定了最优分解方式的FFT代码,即确定了该长度为64的数据序列对应的性能最优的FFT代码,当第二次输入的数据序列长度为64时,可以直接调用第一次确定的最优分解方式的FFT代码。
此外,还需要说明的是,最优的代码还可以事先通过测试,即事先针对某种硬件平台下的某个输入长度的FFT序列进行各种分解并测试,得到最优的代码,并将相应的代码与反应硬件场景的参数(如硬件平台、FFT序列长度)存储到设备(如终端等电子设备)当中,当该设备需要生成FFT代码时运行时,首先判断有无在特定应用场景下的最优代码,如果有最优代码,则可以直接调用,从而可以更快速地生成FFT代码。
本申请实施例提供了一种快速傅里叶变换代码的生成方法,先获取需要进行快速傅里叶变换FFT的数据序列以及所述数据序列的长度,再数据序列的长度确定数据序列的FFT分解方式,得到对应所述FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数,其中,蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码;根据每一级中的所述蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码;对生成的FFT代码进行性能检测,得到性能最优的FFT代码。进一步提高了FFT代码的性能。
例如,当数据序列的长度为2的幂次方时,本申请实施例中生成的二维单精度浮点复数到复数傅里叶变换(2-dimensional float complex to complex fast Fouriertransform,2D FLOAT C2C FFT)代码和现有FFTW、ARMPL的性能对比,如图8A所示。图8A为依据本申请实施例提供的方法生成的2D FLOAT C2C FFT代码与依据现有FFTW、ARM PL生成的代码的性能对比,横坐标是不同的图形尺寸,纵坐标是计算性能,单位为每秒10亿的浮点运算次数(giga floating-point operations per second,GFLOPS),可以体现出计算性能与图形尺寸的关系。从曲线图可知,依据本申请实施例提供的方法生成的FFT代码性能明显优于依据FFTW和ARM PL生成的代码性能。
当数据序列的长度不为2的幂次方时,本申请实施例中生成的2D FLOAT C2C FFT代码和现有FFTW、ARMPL的性能对比,如图8B所示。图8B为依据本申请实施例提供的方法生成的2D FLOAT C2C FFT代码与依据现有FFTW、ARM PL生成的代码的性能对比,横坐标是不同的图形尺寸,纵坐标是计算性能,单位为GFLOPS,可以体现出计算性能与图形尺寸的关系。从曲线图可知,依据本申请实施例提供的方法生成的FFT代码性能明显优于依据FFTW和ARM PL生成的代码性能。
实施例四
上面对本申请实施例提供的快速傅里叶变换代码的生成方法进行了描述,基于上述各实施例,请参阅图9,本申请实施例公开了一种快速傅里叶变换代码的生成装置,包括:
获取单元901,用于获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度;
第一确定单元902,用于根据数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;
第二确定单元903,用于根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数,其中,蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码;
生成单元904,用于根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码。
请参阅图10,本申请实施例中快速傅里叶变换代码的生成装置的另一个实施例包括:
获取单元1001,用于获取需要进行快速傅里叶变换FFT的数据序列以及数据序列的长度;
第一确定单元1002,用于根据数据序列的长度确定数据序列的FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;
第二确定单元1003,用于根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数,其中,蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码;
生成单元1004,用于根据每一级中的蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码。
在一种可能的实现方式中,蝶形网络的级数为1,相应地,生成单元1004具体用于:
生成第一级的代码,其中,第一级的代码包括多次调用第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;
或者,蝶形网络的级数为大于1的整数,相应地,生成单元1004具体用于:
生成第一级的代码,其中,第一级的代码包括多次调用第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;后续依次针对每个级,生成当前级的代码,其中,当前级的代码包括多次调用当前级的蝶形代码的代码,调用的次数为当前级中的调用次数,当前级的蝶形代码的输入为前一级的输出,当前级为当前需要生成代码的级。
在一种可能的实现方式中,每一级对应的蝶形的基为2,或者4,或者为不等于2的质数。
在一种可能的实现方式中,一个或多个原子模板包括以下6种原子模板中的任意一个或者任意多个的组合,其中,各个原子模板涉及的各个输入输出都只在各个原子模板内适用,而不适用于其他原子模板:原子模板可以参照上述方法实施例中的描述,此处不再赘述。
在一种可能的实现方式中,蝶形代码具体包括一种或多种混合模板,每种混合模板包括一种或多种原子模板,每种原子模板的个数为一个或多个。
在一种可能的实现方式中,当基为基-2时,与基-2对应的混合模板对应的代码包括1个第二原子模板;或者,
当基为基-4时,与基-4对应的混合模板对应的代码包括3个第二原子模板和1个第三原子模板;或者,
当基为质数且不为2时,与值为质数的基对应的第一种混合模板对应的代码包括m个原子模板,其中包括1个第四原子模板、m-2个第五原子模板和1个第一原子模板,其中表示对x/2向上取整,x为基的取值,与值为质数的基对应的第二种混合模板对应的代码包括1个第六原子模板。
在一种可能的实现方式中,当基为基-2时,第二原子模板单独排列;或者,
当基为基-4时,3个第二原子模板和1个第三原子模板依次顺序排列;或者,
当基为质数且不为2时,第一种混合模板中1个第四原子模板、m-2个第五原子模板和1个第一原子模板依次顺序排列,第二种混合模板中第六原子模板单独排列。
在一种可能的实现方式中,根据混合模板对应的代码中各个原子模板相互之间的依赖关系将被依赖的原子模板的顺序排在依赖别人的原子模板的前面;
其中,依赖关系包括运算数据的依赖关系,或者跟运算数据相关的硬件资源的依赖关系。
在一种可能的实现方式中,第二确定单元1003具体用于:
根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码;
将数据序列的长度除以每一级对应的蝶形的基,得到每一级的比值;
将每一级的比值作为每一级的蝶形代码被调用的调用次数。
在一种可能的实现方式中,混合模板对应的代码为基于硬件平台优化后得到的代码。
在一种可能的实现方式中,FFT分解方式为在当前硬件平台下经过测试得到的最优的分解方式,其中,最优的分解方式为根据数据序列的长度和当前硬件平台的参数得到的全部分解方式中的一种,该最优的分解方式对应的蝶形网络的代码的执行时间最短。
在一种可能的实现方式中,数据序列存在多种FFT分解方式,第一分解方式为用于寻找最优的分解方式的其中一种FFT分解方式,最优的分解方式为所述多种FFT分解方式一一对应的多个FFT代码中的执行时间最短的分解方式;
其中,多种FFT分解方式对应FFT代码的生成装置跟通过上述任一所述的实现方式中的根据第一分解方式最终生成的FFT代码的生成装置相同。
在一种可能的实现方式中,生成装置还包括:
缓存单元1005,用于缓存针对最优的分解方式对应的FFT代码,当下一次需要在同一个硬件平台下对同样长度的数据序列进行快速傅立叶变换时,使用缓存的FFT代码进行计算。
需要说明的是,上述功能模块都是基于通用处理器(如支持ARM指令集或者x86指令集的CPU)和相应的存储器的功能实现,即处理器用于实现上述获取单元、第一确定单元、第二确定单元、生成单元和缓存单元等各种单元的功能、存储器用于存储实现上述各种方法、功能模块的软件的代码以及存储软件运行时所需存储的各种数据。
上面图9至图10从模块化功能实体的角度对本申请实施例中的快速傅里叶变换代码的生成装置进行详细描述,下面从硬件处理的角度对本申请实施例中的快速傅里叶变换代码的生成装置进行详细描述。
基于上述各实施例,本实施例提供了一种快速傅里叶变换代码的生成装置,参阅图11A所示,该快速傅里叶变换代码的生成装置1100包括:处理器1102、收发器1103、存储器1101。其中,所述存储器1101用于存储程序;处理器1102用于执行存储器1101中的程序,包括如下步骤:获取需要进行快速傅里叶变换的数据序列以及数据序列的长度;根据数据序列的长度确定数据序列的快速傅里叶变换FFT分解方式,得到对应FFT分解方式的蝶形网络的一个或多个级,每个级对应一个蝶的基;根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的蝶形代码被调用的调用次数,其中,蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,原子模板是预定义对数据序列进行蝶形运算所需的基本的代码;根据每一级中的所述蝶形代码以及每一级中的蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对数据序列进行快速傅里叶变换的FFT代码。
可选的,快速傅里叶变换的生成装置1100还可以包括总线1104。其中,收发器1103、处理器1102以及存储器1101可以通过总线1104相互连接;总线1104可以是外设部件互连标准(peripheral component interconnect,PCI)总线或扩展工业标准结构(extended industry standard architecture,EISA)总线等。总线1104可以分为地址总线、数据总线、控制总线等。为便于表示,图11A中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
该快速傅里叶变换代码的生成装置可以是终端,例如手机、平板电脑等,以手机为例,手机可以包括:射频(radio frequency,RF)电路1110、存储器1120、其他输入设备1130、显示屏1140、传感器1150、音频电路1160、I/O子系统1170、处理器1180、以及电源1190等部件。下面结合图11B对手机的各个构成部件进行具体的介绍:
其中,处理器1180分别与RF电路1110、存储器1120、音频电路1160、以及电源1190均连接。I/O子系统1170分别与其他输入设备1130、显示屏1140、传感器1150均连接。其中,RF电路1110可用于收发数据序列的长度,特别地,将获取到的数据序列发送给处理器1180处理。存储器1120可用于存储软件程序以及模块。处理器1180通过运行存储在存储器1120的软件程序以及模块,从而执行手机的各种功能应用以及数据处理。其他输入设备1130可用于接收输入的数据序列,以及产生与手机的用户设置以及功能控制有关的键信号输入。显示屏1140可用于显示FFT代码的生成过程,显示屏1140可以包括显示面板1141和触摸面板1142。传感器1150可以为光传感器、运动传感器或者其他传感器。音频电路1160可提供用户与手机之间的音频接口。I/O子系统1170用来控制输入输出的外部设备,外部设备可以包括其他设备输入控制器、传感器控制器、显示控制器。处理器1180是手机的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器1120内的软件程序和/或模块,以及调用存储在存储器1120内的数据,执行手机的各种功能和处理数据,从而对手机进行整体监控。电源1190(比如电池)用于给上述各个部件供电,优选的,电源可以通过电源管理系统与处理器1180逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗等功能。
尽管未示出,手机还可以包括摄像头、蓝牙模块等功能模块或器件,在此不再赘述。本领域技术人员可以理解,图11B中示出的手机结构并不构成对手机的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
处理器1180用于执行图3中的步骤301至步骤304,和/或用于本文所描述的技术的其它过程。
实施例五
基于上述各实施例,本实施例提供了一种电子设备。该电子设备可以是手机、服务器等等,下面以服务器为例进行说明。
图12是本申请实施例提供的一种服务器的结构示意图,该服务器1200可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(central processingunits,CPU)1201(例如,一个或一个以上处理器)和存储器1209,一个或一个以上存储应用程序1207或数据1206的存储介质1208(例如一个或一个以上海量存储设备)。其中,存储器1209和存储介质1208可以是短暂存储或持久存储。存储在存储介质1208的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,处理器1201可以设置为与存储介质1208通信,在服务器1200上执行存储介质1208中的一系列指令操作。
服务器1200还可以包括一个或一个以上电源1202,一个或一个以上有线或无线网络接口1203,一个或一个以上输入输出接口1204,和/或,一个或一个以上操作系统1205,例如Windows Serve,Mac OS X,Unix,Linux,FreeBSD等等。本领域技术人员可以理解,图12中示出的服务器结构并不构成对服务器的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
下面结合图12对服务器的各个构成部件进行具体的介绍:
处理器1201是服务器的控制中心,可以按照设置的快速傅里叶变换代码的生成方法进行处理。处理器1201利用各种接口和线路连接整个服务器的各个部分,通过运行或执行存储在存储器1209内的软件程序和/或模块,以及调用存储在存储器1209内的数据,执行服务器的各种功能和处理数据,从而生成快速傅里叶变换FFT代码。
存储器1209可用于存储软件程序以及模块,处理器1201通过运行存储在存储器1209的软件程序以及模块,从而执行服务器1200的各种功能应用以及数据处理。存储器1209可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如每一级中需要调用的蝶形代码以及每一级中的所述蝶形代码被调用的调用次数等)等;存储数据区可存储根据服务器的使用所创建的数据(比如根据数据序列的长度确定数据序列的FFT分解方式等)等。此外,存储器1209可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。在本申请实施例中提供的快速傅里叶变换代码的生成方法的程序和接收到的数据序列存储在存储器中,当需要使用时,处理器1201从存储器1209中调用。
所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘(solid state disk,SSD))等。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(read-only memory,ROM)、随机存取存储器(random access memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
Claims (29)
1.一种快速傅里叶变换代码的生成方法,其特征在于,包括:
获取需要进行快速傅里叶变换FFT的数据序列以及所述数据序列的长度;
根据所述数据序列的长度确定所述数据序列的FFT分解方式,得到对应所述FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;
根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的所述蝶形代码被调用的调用次数,其中,所述蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,所述原子模板是预定义对所述数据序列进行蝶形运算所需的基本的代码;
根据每一级中的所述蝶形代码以及每一级中的所述蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对所述数据序列进行快速傅里叶变换的FFT代码。
2.根据权利要求1所述的生成方法,其特征在于,
所述蝶形网络的级数为1,相应地,所述根据每一级中的所述蝶形代码以及所述每一级中的蝶形代码被调用的次数逐级生成各个级的代码包括:生成第一级的代码,其中,所述第一级的代码包括多次调用所述第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;
或者,所述蝶形网络的级数为大于1的整数,相应地,所述根据每一级中的所述蝶形代码以及所述每一级中的蝶形代码被调用的次数逐级生成各个级的代码包括:生成第一级的代码,其中,所述第一级的代码包括多次调用所述第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;后续依次针对每个级,生成当前级的代码,其中,所述当前级的代码包括多次调用所述当前级的蝶形代码的代码,调用的次数为所述当前级中的调用次数,所述当前级的蝶形代码的输入为前一级的输出,所述当前级为当前需要生成代码的级。
3.根据权利要求1或2所述的方法,其特征在于,每一级对应的蝶形的基为2,或者4,或者为不等于2的质数。
4.根据权利要求3所述的生成方法,其特征在于,一个或多个原子模板包括以下6种原子模板中的任意一个或者任意多个的组合,其中,各个原子模板涉及的各个输入输出都只在各个原子模板内适用,而不适用于其他原子模板:
第一原子模板:用于对原始输入复数ORI以及累加和复数SUM进行运算,输出的结果跟通过如下方式输出的结果相同:
对所述累加复数SUM乘以2得到新的累加复数;
对所述新的累加复数减去所述输入复数ORI,得到输出复数OUT;
其中,所述新的累加复数以及所述输出复数OUT作为运算后的输出;
第二原子模板:用于对复数IN1和复数IN2进行运算,输出的结果跟通过如下方式输出的结果相同:
对所述复数IN1和所述复数IN2的实部、虚部分别进行加运算,得到输出复数OUT1;
对所述复数IN1和所述复数IN2的实部、虚部分别进行减运算,得到输出复数OUT2;
其中,所述OUT1以及所述OUT2作为运算后的输出;
第三原子模板:用于对复数A,复数B以及实数S进行运算,输出的结果跟通过如下方式输出的结果相同:
将所述复数B乘以所述实数S,得到新的复数B’;
将所述A的实部加上所述B’的虚部以得到复数Z1的实部;
将所述A的虚部减去所述B’的实部以得到所述Z1的虚部;
将所述A的实部减法所述B’的虚部以得到复数Z2的实部;
将所述A的虚部加上所述B’的实部以得到复数Z2的虚部;
其中,所述Z1以及所述Z2作为运算后的输出;
第四原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、中间值TMP以及累加复数F进行运算,输出的结果跟通过如下方式输出的结果相同:
将所述IN1的实部乘以所述TW的实部并加上所述F的实部得到所述SUM的实部;
将所述IN1的虚部乘以所述TW的实部加上所述F的虚部得到所述SUM的虚部;
将所述IN2的虚部乘以所述TW的虚部得到所述TMP的实部;
将所述IN2的实部乘以所述TW的虚部得到所述TMP的虚部;
将所述SUM的实部减去所述TMP的实部得到所述OUT的实部;
将所述SUM的虚部加上所述TMP的虚部得到所述OUT的虚部;
其中,所述SUM以及所述OUT作为运算后的输出;
第五原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、第一中间值TMP1、第二中间值TMP2、累加和复数SUM以及输出数据OUT进行运算,输出的结果跟通过如下方式输出的结果相同:
将复数IN1的实部乘以所述TWR得到所述TMP1的实部;
将复数IN1的虚部乘以所述TWR得到所述TMP1的虚部;
将复数IN2的虚部乘以所述TWI得到所述TMP2的实部;
将复数IN2的实部乘以所述TWI得到所述TMP2的虚部;
将所述OUT的实部加上所述TMP1的实部再减去所述TMP2的实部得到更新后的输出复数OUT的实部;
将所述OUT的虚部加上所述TMP1的虚部再加上所述TMP2的虚部得到所述更新后的输出复数OUT的虚部;
将所述SUM的实部加上所述TMP1的实部得到更新后的累加和复数SUM的实部;
将所述SUM的虚部加上所述TMP1的虚部得到所述更新后的累加和复数SUM的虚部;
其中,所述更新后的输出复数OUT以及所述更新后的累加和复数SUM为作为运算后的输出;
第六原子模板:用于对复数A和复数B的实部、虚部进行运算,输出的结果跟通过如下方式输出的结果相同:
将复数A的实部加上复数B的实部得到复数C的实部;
将复数A的虚部加上复数B的虚部得到复数C的虚部;
得到输出复数C;
其中,所述复数C作为运算后的输出。
5.根据权利要求4所述的生成方法,其特征在于,所述蝶形代码具体包括一种或多种混合模板,每种所述混合模板包括一种或多种原子模板,每种原子模板的个数为一个或多个。
7.根据权利要求6所述的生成方法,其特征在于,
当所述基为基-2时,所述第二原子模板单独排列;或者,
当所述基为基-4时,3个所述第二原子模板和1个所述第三原子模板依次顺序排列;或者,
当所述基为质数且不为2时,所述第一种混合模板中1个所述第四原子模板、m-2个所述第五原子模板和1个所述第一原子模板依次顺序排列,所述第二种混合模板中第六原子模板单独排列。
8.根据权利要求1-7任一所述的生成方法,其特征在于,
根据所述混合模板对应的代码中各个原子模板相互之间的依赖关系将被依赖的原子模板的顺序排在依赖别人的原子模板的前面;
其中,所述依赖关系包括运算数据的依赖关系,或者跟所述运算数据相关的硬件资源的依赖关系。
9.根据权利要求1-8任一所述的生成方法,其特征在于,所述根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的所述蝶形代码被调用的调用次数包括:
根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码;
将数据序列的长度除以每一级对应的蝶形的基,得到每一级的比值;
将所述每一级的比值作为每一级的蝶形代码被调用的调用次数。
10.根据权利要求1-9任一所述的生成方法,其特征在于,
所述混合模板的代码为基于硬件平台优化后得到的代码。
11.根据权利要求1-10任一所述的生成方法,其特征在于,
所述FFT分解方式为在当前硬件平台下经过测试得到的最优的分解方式,其中,所述最优的分解方式为根据数据序列的长度和所述当前硬件平台的参数得到的全部分解方式中的一种,所述最优的分解方式对应的蝶形网络的代码的执行时间最短。
12.根据权利要求1-10任一所述的生成方法,其特征在于,
所述数据序列存在多种FFT分解方式,第一分解方式为用于寻找最优的分解方式的其中一种FFT分解方式,所述最优的分解方式为所述多种FFT分解方式一一对应的多个FFT代码中的执行时间最短的分解方式;
其中,所述多种FFT分解方式对应的FFT代码的生成方法跟通过权利要求1-10任一所述的方式中的根据所述第一分解方式最终生成的FFT代码的生成方法相同。
13.根据权利要求12所述的方法,其特征在于,所述生成方法还包括:
缓存针对最优的分解方式对应的FFT代码,当下一次需要在同一个硬件平台下对同样长度的数据序列进行快速傅立叶变换时,使用缓存的FFT代码进行计算。
14.一种快速傅里叶变换代码的生成装置,其特征在于,包括:
获取单元,用于获取需要进行快速傅里叶变换FFT的数据序列以及所述数据序列的长度;
第一确定单元,用于根据所述数据序列的长度确定所述数据序列的FFT分解方式,得到对应所述FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;
第二确定单元,用于根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的所述蝶形代码被调用的调用次数,其中,所述蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,所述原子模板是预定义对所述数据序列进行蝶形运算所需的基本的代码;
生成单元,用于根据每一级中的所述蝶形代码以及每一级中的所述蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对所述数据序列进行快速傅里叶变换的FFT代码。
15.根据权利要求14所述的生成装置,其特征在于,
所述蝶形网络的级数为1,相应地,所述生成单元具体用于:
生成第一级的代码,其中,所述第一级的代码包括多次调用所述第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;
或者,所述蝶形网络的级数为大于1的整数,相应地,所述生成单元具体用于:
生成第一级的代码,其中,所述第一级的代码包括多次调用所述第一级的蝶形代码的代码,其中,调用的次数为第一级中的调用次数;后续依次针对每个级,生成当前级的代码,其中,所述当前级的代码包括多次调用所述当前级的蝶形代码的代码,调用的次数为所述当前级中的调用次数,所述当前级的蝶形代码的输入为前一级的输出,所述当前级为当前需要生成代码的级。
16.根据权利要求14或15所述的生成装置,其特征在于,每一级对应的蝶形的基为2,或者4,或者为不等于2的质数。
17.根据权利要求16所述的生成装置,其特征在于,一个或多个原子模板包括以下6种原子模板中的任意一个或者任意多个的组合,其中,各个原子模板涉及的各个输入输出都只在各个原子模板内适用,而不适用于其他原子模板:
第一原子模板:用于对原始输入复数ORI以及累加和复数SUM进行运算,输出的结果跟通过如下方式输出的结果相同:
对所述累加复数SUM乘以2得到新的累加复数;
对所述新的累加复数减去所述输入复数ORI,得到输出复数OUT;
其中,所述新的累加复数以及所述输出复数OUT作为运算后的输出;
第二原子模板:用于对复数IN1和复数IN2进行运算,输出的结果跟通过如下方式输出的结果相同:
对所述复数IN1和所述复数IN2的实部、虚部分别进行加运算,得到输出复数OUT1;
对所述复数IN1和所述复数IN2的实部、虚部分别进行减运算,得到输出复数OUT2;
其中,所述OUT1以及所述OUT2作为运算后的输出;
第三原子模板:用于对复数A,复数B以及实数S进行运算,输出的结果跟通过如下方式输出的结果相同:
将所述复数B乘以所述实数S,得到新的复数B’;
将所述A的实部加上所述B’的虚部以得到复数Z1的实部;
将所述A的虚部减去所述B’的实部以得到所述Z1的虚部;
将所述A的实部减法所述B’的虚部以得到复数Z2的实部;
将所述A的虚部加上所述B’的实部以得到复数Z2的虚部;
其中,所述Z1以及所述Z2作为运算后的输出;
第四原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、中间值TMP以及累加复数F进行运算,输出的结果跟通过如下方式输出的结果相同:
将所述IN1的实部乘以所述TW的实部并加上所述F的实部得到所述SUM的实部;
将所述IN1的虚部乘以所述TW的实部加上所述F的虚部得到所述SUM的虚部;
将所述IN2的虚部乘以所述TW的虚部得到所述TMP的实部;
将所述IN2的实部乘以所述TW的虚部得到所述TMP的虚部;
将所述SUM的实部减去所述TMP的实部得到所述OUT的实部;
将所述SUM的虚部加上所述TMP的虚部得到所述OUT的虚部;
其中,所述SUM以及所述OUT作为运算后的输出;
第五原子模板:用于对复数IN1、复数IN2、旋转因子TW的实部TWR、旋转因子TW的虚部TWI、第一中间值TMP1、第二中间值TMP2、累加和复数SUM以及输出数据OUT进行运算,输出的结果跟通过如下方式输出的结果相同:
将复数IN1的实部乘以所述TWR得到所述TMP1的实部;
将复数IN1的虚部乘以所述TWR得到所述TMP1的虚部;
将复数IN2的虚部乘以所述TWI得到所述TMP2的实部;
将复数IN2的实部乘以所述TWI得到所述TMP2的虚部;
将所述OUT的实部加上所述TMP1的实部再减去所述TMP2的实部得到更新后的输出复数OUT的实部;
将所述OUT的虚部加上所述TMP1的虚部再加上所述TMP2的虚部得到所述更新后的输出复数OUT的虚部;
将所述SUM的实部加上所述TMP1的实部得到更新后的累加和复数SUM的实部;
将所述SUM的虚部加上所述TMP1的虚部得到所述更新后的累加和复数SUM的虚部;
其中,所述更新后的输出复数OUT以及所述更新后的累加和复数SUM为作为运算后的输出;
第六原子模板:用于对复数A和复数B的实部、虚部进行运算,输出的结果跟通过如下方式输出的结果相同:
将复数A的实部加上复数B的实部得到复数C的实部;
将复数A的虚部加上复数B的虚部得到复数C的虚部;
得到输出复数C;
其中,所述复数C作为运算后的输出。
18.根据权利要求17所述的生成装置,其特征在于,所述蝶形代码具体包括一种或多种混合模板,每种所述混合模板包括一种或多种原子模板,每种原子模板的个数为一个或多个。
20.根据权利要求19所述的生成装置,其特征在于,
当所述基为基-2时,所述第二原子模板单独排列;或者,
当所述基为基-4时,3个所述第二原子模板和1个所述第三原子模板依次顺序排列;或者,
当所述基为质数且不为2时,所述第一种混合模板中1个所述第四原子模板、m-2个所述第五原子模板和1个所述第一原子模板依次顺序排列,所述第二种混合模板中第六原子模板单独排列。
21.根据权利要求14-20任一所述的生成装置,其特征在于,
根据所述混合模板对应的代码中各个原子模板相互之间的依赖关系将被依赖的原子模板的顺序排在依赖别人的原子模板的前面;
其中,所述依赖关系包括运算数据的依赖关系,或者跟所述运算数据相关的硬件资源的依赖关系。
22.根据权利要求14-21任一所述的生成装置,其特征在于,所述第二确定单元具体用于:
根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码;
将数据序列的长度除以每一级对应的蝶形的基,得到每一级的比值;
将所述每一级的比值作为每一级的蝶形代码被调用的调用次数。
23.根据权利要求14-22任一所述的生成装置,其特征在于,
所述混合模板对应的代码为基于硬件平台优化后得到的代码。
24.根据权利要求14-23任一所述的生成装置,其特征在于,
所述FFT分解方式为在当前硬件平台下经过测试得到的最优的分解方式,其中,所述最优的分解方式为根据数据序列的长度和所述当前硬件平台的参数得到的全部分解方式中的一种,所述最优的分解方式对应的蝶形网络的代码的执行时间最短。
25.根据权利要求14-24中任一所述的生成装置,其特征在于,
所述数据序列存在多种FFT分解方式,第一分解方式为用于寻找最优的分解方式的其中一种FFT分解方式,所述最优的分解方式为所述多种FFT分解方式一一对应的多个FFT代码中的执行时间最短的分解方式;
其中,所述多种FFT分解方式对应的FFT代码的生成装置跟通过权利要求14-23任一所述的方式中的根据所述第一分解方式最终生成的FFT代码的生成装置相同。
26.根据权利要求25所述的生成装置,其特征在于,所述生成装置还包括:
缓存单元,用于缓存针对最优的分解方式对应的FFT代码,当下一次需要在同一个硬件平台下对同样长度的数据序列进行快速傅立叶变换时,使用缓存的FFT代码进行计算。
27.一种快速傅里叶变换代码的生成装置,其特征在于,包括:
存储器、收发器、处理器以及总线系统;
其中,所述存储器用于存储程序;
所述处理器用于执行所述存储器中的程序,包括如下步骤:
获取需要进行快速傅里叶变换FFT的数据序列以及所述数据序列的长度;
根据所述数据序列的长度确定所述数据序列的FFT分解方式,得到对应所述FFT分解方式的蝶形网络的一个或多个级,每个级对应一种蝶形的基;
根据每一级对应的蝶形的基确定每一级中需要调用的蝶形代码以及每一级中的所述蝶形代码被调用的调用次数,其中,所述蝶形代码包括一种或多种原子模板,每种原子模板的个数为一个或多个,所述原子模板是预定义对所述数据序列进行蝶形运算所需的基本的代码;
根据每一级中的所述蝶形代码以及每一级中的所述蝶形代码被调用的调用次数逐级生成各个级的代码,以得到对所述数据序列进行快速傅里叶变换的FFT代码;
所述总线系统用于连接所述存储器以及所述处理器,以使所述存储器以及所述处理器进行通信。
28.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1-13任意一项所述的方法。
29.一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行如权利要求1-13任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810823431.6A CN110750249B (zh) | 2018-07-24 | 2018-07-24 | 一种快速傅里叶变换代码的生成方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810823431.6A CN110750249B (zh) | 2018-07-24 | 2018-07-24 | 一种快速傅里叶变换代码的生成方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110750249A true CN110750249A (zh) | 2020-02-04 |
CN110750249B CN110750249B (zh) | 2021-08-20 |
Family
ID=69275607
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810823431.6A Active CN110750249B (zh) | 2018-07-24 | 2018-07-24 | 一种快速傅里叶变换代码的生成方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110750249B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103699515A (zh) * | 2013-12-27 | 2014-04-02 | 中国科学院计算技术研究所 | 一种fft并行处理装置和方法 |
CN103761074A (zh) * | 2014-01-26 | 2014-04-30 | 北京理工大学 | 一种流水结构定点fft字长配置方法 |
US20170214561A1 (en) * | 2014-07-28 | 2017-07-27 | Lg Electronics Inc. | Transmitting and receiving device and method in wireless communication system |
-
2018
- 2018-07-24 CN CN201810823431.6A patent/CN110750249B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103699515A (zh) * | 2013-12-27 | 2014-04-02 | 中国科学院计算技术研究所 | 一种fft并行处理装置和方法 |
CN103761074A (zh) * | 2014-01-26 | 2014-04-30 | 北京理工大学 | 一种流水结构定点fft字长配置方法 |
US20170214561A1 (en) * | 2014-07-28 | 2017-07-27 | Lg Electronics Inc. | Transmitting and receiving device and method in wireless communication system |
Non-Patent Citations (2)
Title |
---|
RENATO NEUENFELD: "Design of Optimized Radix-2 and Radix-4 Butterflies", 《IEEE》 * |
李橙橙: "基于FPGA的FFT算法设计与实现", 《CNKI》 * |
Also Published As
Publication number | Publication date |
---|---|
CN110750249B (zh) | 2021-08-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110050267B (zh) | 用于数据管理的系统和方法 | |
US20140019500A1 (en) | Methods and apparatus for matrix decompositions in programmable logic devices | |
CN108170639B (zh) | 基于分布式环境的张量cp分解实现方法 | |
WO2019027628A1 (en) | ACCESS TO PROLOGUE AND EPILOGUE DATA | |
US20090313314A1 (en) | Techniques for performing discrete fourier transforms on radix-2 platforms | |
Conte et al. | GPU-acceleration of waveform relaxation methods for large differential systems | |
US7062523B1 (en) | Method for efficiently computing a fast fourier transform | |
JP2008506191A5 (zh) | ||
GB2444811A (en) | Apparatus and method for performing reordering and arithmetic operations on data in a SIMD processor. | |
EP2584460A1 (en) | Vector processing system comprising a replicating subsystem and method | |
Sun et al. | An I/O bandwidth-sensitive sparse matrix-vector multiplication engine on FPGAs | |
Revanna et al. | A scalable FFT processor architecture for OFDM based communication systems | |
US9244886B1 (en) | Minimum resource fast fourier transform | |
US7653676B2 (en) | Efficient mapping of FFT to a reconfigurable parallel and pipeline data flow machine | |
Nechma et al. | Parallel sparse matrix solver for direct circuit simulations on FPGAs | |
US20060075010A1 (en) | Fast fourier transform method and apparatus | |
CN110750249B (zh) | 一种快速傅里叶变换代码的生成方法及装置 | |
US10303736B2 (en) | FFT device and method for performing a fast fourier transform | |
EP1076296A2 (en) | Data storage for fast fourier transforms | |
CN115994565A (zh) | 离散傅立叶相关变换的硬件实施 | |
Meyer-Baese et al. | Fourier transforms | |
JP2009245381A (ja) | 積和演算回路、その設計装置、プログラム | |
GB2567038B (en) | Accessing prologue and epilogue data | |
CN115859003A (zh) | 执行fft的方法、装置及设备 | |
CN114003198A (zh) | 内积处理部件、任意精度计算设备、方法及可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20211222 Address after: 450046 Floor 9, building 1, Zhengshang Boya Plaza, Longzihu wisdom Island, Zhengdong New Area, Zhengzhou City, Henan Province Patentee after: Super fusion Digital Technology Co.,Ltd. Address before: 518129 Bantian HUAWEI headquarters office building, Longgang District, Guangdong, Shenzhen Patentee before: HUAWEI TECHNOLOGIES Co.,Ltd. |
|
TR01 | Transfer of patent right |