基于GPDSP的大点数FFT向量化汇编代码生成方法与流程

文档序号:15888427发布日期:2018-11-09 19:47阅读:320来源:国知局
基于GPDSP的大点数FFT向量化汇编代码生成方法与流程

本发明涉及gpdsp(general-purposedigitalsignalprocessor,通用计算数字信号处理器)技术领域,尤其涉及一种基于gpdsp的大点数fft向量化汇编代码生成方法。

背景技术

离散傅里叶变换(discretefouriertransform,dft)在现代信号处理系统领域里应用广泛,是典型的计算密集和访存密集型应用,例如n点的dft变换的计算复杂度为o(n2)。1965年cooley和turkey提出一种快速傅立叶变换(fastfouriertransform,fft)计算方法,可显著地减少运算量,计算复杂度由原来的o(n2)降到o(nlog2n)。

现有的数值软件代码的性能在很大程度上取决于平台的存储层次结构、处理器提供的特殊指令(特别是向量指令)的使用等,而这些往往与处理器的微体系结构特性息息相关,更为重要的问题是,不同的平台之间的特性差异很大,使得最优化的代码会严重依赖于平台。因此一个合理的实现和最好的实现之间的性能差距越来越大,如在pentium4上实现的离散傅立叶变换代码,gnu科学库和英特尔供应商的ipp库的运行性能差距达一个数量级以上,后者主要是手工编写和调优的汇编代码,而新平台的发布使得手工编写的代码需要重新实现和优化,这仍然需要耗费大量的工作量,复杂度及成本高。

虽然从理论上来说编译器是实现优化性能最理想的解决方案,因为源代码并不需要重新编写,但是编译器的技术进步赶不上硬件的发展速度,即使是简单的计算问题,使用编译器往往只能产生低效率的代码,存在上述问题主要有两个:其一是缺乏可靠的程序优化技术,当前日益复杂的机器也使这一问题进一步恶化,虽然编译器通常可以采用许多不同的方式转换代码段,但是没有能够保证成功的最优化的方法;其二是很多重要的性能改进都是从算法变换中获得,而这超越了当前编译器所能够达到的能力,大量算法变换依赖于算法的信息,而这些信息很难从一个高层次的语言中提取。

gpdsp作为一种异构多核处理器,它包含cpu核单元和dsp核单元,其中cpu核单元主要用于负责包括存储管理、文件控制、进程调度、中断管理任务在内的通用事务管理以及提供对通用操作系统的完整支持;dsp核单元包含若干具有强大计算能力的64位向量处理阵列,用于支持高密集运算任务的解算,dsp核包含标、向量寄存器文件,标量l1d、向量阵列存储、片内共享存储以及外部ddr存储等复杂的多级存储结构。而复杂的体系结构对高效代码的生成带来巨大的挑战,通过编译器产生的库函数汇编代码很难实现各级存储间的高效数据访问和传递,传统的面向cache结构的分块矩阵乘法方法也不适合gpdsp的非cache的向量阵列存储访存模式和向量处理阵列并发向量处理的体系结构特征,难以发挥gpdsp向量计算优势。

目前对实时性要求高的应用系统所调用的高性能库函数,通常都是用手工汇编精心优化,如何针对gpdsp复杂的体系结构特征快速生成高效的库函数汇编代码是当前面临的一个巨大挑战,而其中基于gpdsp架构实现大点数fft向量化汇编代码生成是亟待解决的问题。



技术实现要素:

本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种具有实现原理简单、操作简便、使用灵活、能够实现代码自动化生成,且生成效率及性能高的基于gpdsp的大点数fft向量化汇编代码生成方法。

为解决上述技术问题,本发明提出的技术方案为:

一种基于gpdsp的大点数fft向量化汇编代码生成方法,步骤包括:

s1.构建用于实现不同任务的多个核心模块,包括用于行fft计算的row_kernel模块、用于列fft计算的column_kernel模块、用于两个矩阵对应元素相乘计算的matrix_coeff模块、用于更新系数矩阵元素计算的update_coeff模块、用于数据传输的dma_translate模块、用于检测数据搬移是否搬移完毕所对应的寄存器标志位的dma_poll模块,以及用于执行循环的loop模块,各模板包括所需参数的参数列表;

s2.构建大点数fft的框架模板,所述框架模板中分别使用所述row_kernel模块、column_kernel模块、matrix_coeff模块、update_coeff模块、所述dma_translate模块、dma_poll模块以及所述loop模块,以实现大点数fft计算;

s3.使用预先构建的汇编代码生成模块gen_fft将所述框架模板中各核心模块转换为汇编代码,最终生成所需的大点数fft汇编代码。

作为本发明的进一步改进:当gpdsp的dsp核的向量处理单元数量为p,所需计算的一维fft点数为n=2n,gpdsp的向量存储阵列容量n=r*s,即n=r*s,其中r=2r,s=2s,令si=s/p,且si为偶数,所述row_kernel模块具体为s点行fft计算模块,所述column_kernel模块具体为r点列fft计算模块,所述matrix_coeff模块具体为实现两个r*p阶矩阵对应元素相乘计算的模块,所述update_coeff模块具体为实现更新r*p阶系数矩阵元素计算的模块,所述dma_translate模块具体通过dma实现源地址到目的地址的数据传输;所述dma_poll模块具体为实现指定dma逻辑通道号的数据搬移是否搬移完毕所对应寄存器标志位检测任务。

作为本发明的进一步改进,所述步骤s2构建的大点数fft的框架模板具体包括如下步骤:

步骤1:分别使用所述dma_translate模块传输列fft计算的蝶形因子数据、系数矩阵数据、更新系数向量数据、子块数据,以及使用所述dma_poll模块等待数据传输完毕;

步骤2:执行列fft分块循环计算,其中使用所述column_kernel模块对传输的子块数据进行列fft计算、使用matrix_coeff模块对两个系数矩阵数据进行对应元素相乘计算,使用update_coeff模块进行系数矩阵更新计算,使用dma_translate模块传输数据以及使用dma_poll模块等待数据传输完毕;

步骤3:分别使用所述column_kernel模块对传输的一个子块数据进行列fft计算,计算后得到的矩阵和系数矩阵使用所述matrix_coeff模块进行对应元素相乘计算,以及使用所述update_coeff模块对更新系数向量数据和系数矩阵数据进行系数矩阵更新计算;

步骤4:分别使用所述dma_translate模块传输行fft计算的蝶形因子数据、子块数据,以及使用所述dma_poll模块等待数据传输完毕;

步骤5:执行fft分块循环计算,其中使用所述row_kernel模块对传输的子块数据进行行fft计算、使用所述dma_translate模块传输数据以及使用dma_poll模块等待数据传输完毕;

步骤6:分别使用所述row_kernel模块对传输的一个子块数据进行行fft计算、使用所述dma_translate模块传输数据以及使用dma_poll模块等待数据传输完毕,完成fft计算。

作为本发明的进一步改进,所述步骤1的具体步骤为:

步骤1.1:使用所述dma_translate模块传输列fft计算的蝶形因子数据至标量l1d的数据缓冲区cwbuf;

步骤1.2:使用所述dma_poll模块等待cwbuf数据传输完毕;

步骤1.3:使用所述dma_translate模块传输系数矩阵数据至标量l1d的数据缓冲区mbuf;

步骤1.4:使用所述dma_poll模块等待mbuf数据传输完毕;

步骤1.5:使用所述dma_translate模块传输更新系数向量数据至标量l1d的数据缓冲区ubuf;

步骤1.6:使用所述dma_poll模块等待ubuf数据传输完毕;

步骤1.7:使用所述dma_translate模块传输列fft计算的一个子块r*p至向量阵列存储的数据缓冲区bbuf0;

步骤1.8:使用所述dma_translate模块传输列fft计算的一个子块r*p至向量阵列存储的数据缓冲区bbuf1。

作为本发明的进一步改进,所述步骤2的具体步骤为:

步骤2.1:开启列fft分块循环计算,设定计数器寄存器r0,计数器初始值为si-2,每次循环计数器减2,直到计数器值为0;

步骤2.2:使用所述dma_poll模块等待bbuf0,out0数据传输完毕;

步骤2.3:使用所述column_kernel模块对bbuf0的子块数据进行列fft计算;

步骤2.4:使用所述matrix_coeff模块对bbuf0和mbuf的系数矩阵数据进行对应元素相乘计算;

步骤2.5:使用所述update_coeff模块对mbuf的系数矩阵数据和ubuf的更新系数向量进行系数矩阵更新计算;

步骤2.6:使用所述dma_translate模块传输上述计算结果至外部存储区out0;

步骤2.7:使用所述dma_translate模块传输列fft计算的一个子块r*p至向量阵列存储的数据缓冲区bbuf0;

步骤2.8:使用所述dma_poll模块等待bbuf1,out1数据传输完毕;

步骤2.9:使用所述column_kernel模块对bbuf1的子块数据进行列fft计算;

步骤2.10:使用所述matrix_coeff模块对bbuf1和mbuf的系数矩阵数据进行对应元素相乘计算;

步骤2.11:使用所述update_coeff模块对mbuf的系数矩阵数据和ubuf的更新系数向量进行系数矩阵更新计算;

步骤2.12:使用所述dma_translate模块传输上述计算结果至外部存储区out1;

步骤2.13:使用所述dma_translate模块传输列fft计算的一个子块r*p至向量阵列存储的数据缓冲区bbuf1;

步骤2.14:判断计数器r0是否为0,若不是转步骤2.1。

作为本发明的进一步改进,所述步骤3的具体步骤为:

步骤3.1:使用所述dma_poll模块等待bbuf0,out0数据传输完毕;

步骤3.2:使用所述column_kernel模块对bbuf0的子块数据进行列fft计算;

步骤3.3:使用所述matrix_coeff模块对bbuf0和mbuf的系数矩阵数据进行对应元素相乘计算;

步骤3.4:使用所述update_coeff模块对mbuf的系数矩阵数据和ubuf的更新系数向量进行系数矩阵更新计算;

步骤3.5:使用所述dma_translate模块传输上述计算结果至外部存储区out0;

步骤3.6:使用所述dma_poll模块等待bbuf1,out1数据传输完毕;

步骤3.7:使用所述column_kernel模块对bbuf1的子块数据进行列fft计算;

步骤3.8:使用所述matrix_coeff模块对bbuf1和mbuf的系数矩阵数据进行对应元素相乘计算;

步骤3.9:使用所述dma_translate模块传输上述计算结果至外部存储区out1。

作为本发明的进一步改进,所述步骤4的具体步骤为:

步骤4.1:使用所述dma_translate模块传输行fft计算的蝶形因子数据至向量阵列存储的数据缓冲区rwbuf;

步骤4.2:使用所述dma_poll模块等待rwbuf数据传输完毕;

步骤4.3:使用所述dma_translate模块传输行fft计算的一个子块1*s至向量阵列存储的数据缓冲区bbuf0;

步骤4.4:使用所述dma_translate模块传输行fft计算的一个子块1*s至向量阵列存储的数据缓冲区bbuf1。

作为本发明的进一步改进,所述步骤5的具体步骤为:

步骤5.1:开启行fft分块循环计算,设定计数器寄存器r0,计数器初始值为r-2,每次循环计数器减2,直到计数器值为0;

步骤5.2:使用所述dma_poll模块等待bbuf0,out0数据传输完毕;

步骤5.3:使用所述row_kernel模块对bbuf0的子块数据进行行fft计算;

步骤5.4:使用所述dma_translate模块传输上述计算结果至外部存储区out0;

步骤5.5:使用所述dma_translate模块传输行fft计算的一个子块1*s至向量阵列存储的数据缓冲区bbuf0;

步骤5.6:使用所述dma_poll模块等待bbuf1,out1数据传输完毕;

步骤5.7:使用所述row_kernel模块对bbuf1的子块数据进行行fft计算;

步骤5.8:使用所述dma_translate模块传输上述计算结果至外部存储区out1;

步骤5.9:使用所述dma_translate模块传输行fft计算的一个子块1*s至向量阵列存储的数据缓冲区bbuf1;

步骤5.10:判断计数器r0是否为0,若不是转步骤2.1。

作为本发明的进一步改进,所述步骤6的具体步骤为:

步骤6.1:使用所述dma_poll模块等待bbuf0,out0数据传输完毕;

步骤6.2:使用所述row_kernel模块对bbuf0的子块数据进行行fft计算;

步骤6.3:使用所述dma_translate模块传输上述计算结果至外部存储区out0;

步骤6.4:使用所述dma_poll模块等待bbuf1,out1数据传输完毕;

步骤6.5:使用所述row_kernel模块对bbuf1的子块数据进行行fft计算;

步骤6.6:使用所述dma_translate模块传输上述计算结果至外部存储区out1。

作为本发明的进一步改进:所述汇编代码生成模块gen_fft根据目标核心模块的类型以及对应的参数列表生成目标核心模块的汇编代码。

与现有技术相比,本发明的优点在于:

1、本发明基于gpdsp的体系结构特征,通过构建多个实现不同任务的核心模块,基于各核心模块构建大点数fft计算的框架模板,模板中包含多个核心模块表示和相应的参数列表,由各核心模块实现对应的任务,再基于该模板通过预先构建的汇编代码生成模块gen_ftt进行汇编代码转换,通过汇编代码生成模块gen_ftt根据框架模板中包含的核心模块表示和相应的输入参数列表自动生成对应的汇编代码,最终生成所需的向量化汇编代码,能够实现基于gpdsp架构的大点数fft计算向量化汇编代码自动生成。

2、本发明实现原理简单、操作方便,能够适用于gpdsp架构快速获得高度优化的高性能大点数fft计算库函数汇编代码,实现软件流水、指令并行、向量化等核心汇编优化并参数化,且无需关注底层硬件实现,且便于库函数汇编代码的维护,当需更新时,只需要更新模板中包含的核心模块表示及相应的参数列表,能够避免后续的ip化中涉及向量计算核心数量需要适应不同应用时导致库函数汇编代码全部需要重新向量化和优化

3、本发明既能够快速获得高度优化的高性能大点数fft计算库函数汇编代码,能够充分发挥dsp核的强大向量化计算能力,同时对用户屏蔽底层硬件实现细节,极大减轻了程序员对底层硬件实现技术熟悉要求以及维护库函数汇编代码的负担,当内核更新需实现更新优化核心模块功能或者扩展新的核心模块功能时,仅需更新模板重新生成就能够自动获得新的优化库函数汇编代码,从而能够避免后续的ip化中涉及向量计算核心数量需要适应不同应用而导致的库函数汇编代码全部需要重新向量化和优化等问题。

附图说明

图1是本实施基于gpdsp的大点数fft向量化汇编代码生成方法的实现流程示意图。

图2是本实施例大点数fft向量化汇编代码生成的实现原理示意图。

图3是本实施例大点数fft框架模板实现大点数fft计算(列fft计算)的实现流程示意图。

图4是本实施例大点数fft框架模板实现大点数fft计算(行fft计算)的实现流程示意图。

图5是本发明具体应用实施例中对循环模块生成汇编代码的实现原理示意图。

图6是本发明具体应用实施例中对dma_translate核心模块生成汇编代码的实现原理示意图。

图7为本发明具体应用实施例中对dma_poll核心模块生成汇编代码的实现原理示意图。

图8为本发明具体应用实施例中对row_kernel核心模块生成汇编代码的实现原理示意图。

图9为本发明具体应用实施例中对column_kernel核心模块生成汇编代码的实现原理示意图。

图10是本发明具体应用实施例中对matrix_coeff核心模块生成汇编代码的实现原理示意图;

图11是本发明具体应用实施例中对update_coeff核心模块生成汇编代码的实现原理示意图。

具体实施方式

以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。

如图1、2所示,本实施例基于gpdsp的大点数fft向量化汇编代码生成方法,步骤包括:

s1.构建用于实现不同任务的多个核心模块,包括用于行fft计算的row_kernel模块、用于列fft计算的column_kernel模块、用于两个矩阵对应元素相乘计算的matrix_coeff模块、用于更新系数矩阵元素计算的update_coeff模块、用于数据传输的dma_translate模块、用于检测数据搬移是否搬移完毕所对应的寄存器标志位的dma_poll模块,以及用于执行循环的loop模块,各模板包括所需参数的参数列表;

s2.构建大点数fft的框架模板,框架模板中分别使用row_kernel模块、column_kernel模块、matrix_coeff模块、update_coeff模块、dma_translate模块、dma_poll模块以及loop模块,以实现大点数fft计算;

s3.使用预先构建的汇编代码生成模块gen_fft将框架模板中各核心模块转换为汇编代码,最终生成所需的大点数fft汇编代码。

本实施例基于gpdsp的体系结构特征,通过构建多个实现不同任务的核心模块,基于各核心模块构建稠密矩阵乘法的框架模板,模板中包含多个核心模块表示和相应的参数列表,由各核心模块实现对应的任务,再基于该模板通过预先构建的汇编代码生成模块gen_fft进行汇编代码转换,通过汇编代码生成模块gen_fft根据框架模板中包含的核心模块表示和相应的输入参数列表自动生成对应的汇编代码,最终生成所需的向量化汇编代码,实现基于gpdsp架构的大点数一维fft高效向量化汇编代码自动生成。

本实施例上述代码生成方法,原理简单、操作方便,能够适用于gpdsp架构,快速获得高度优化的大点数一维fft高效向量化汇编代码,无需关注底层硬件实现,且便于库函数汇编代码的维护,当需更新时,只需要更新模板中包含的核心模块表示及相应的参数列表,能够避免后续的ip化中涉及向量计算核心数量需要适应不同应用时导致的库函数汇编代码全部需要重新向量化和优化等问题。

本实施例中,当gpdsp的dsp核的向量处理单元数量为p,所需计算的一维fft点数为n=2n,gpdsp的向量存储阵列容量n=r*s,即n=r*s,其中r=2r,s=2s,令si=s/p,且si为偶数,row_kernel模块具体为s点行fft计算模块,column_kernel模块具体为r点列fft计算模块,matrix_coeff模块具体为实现两个r*p阶矩阵对应元素相乘计算的模块,update_coeff模块具体为实现更新r*p阶系数矩阵元素计算的模块,dma_translate模块具体通过dma实现源地址到目的地址的数据传输;dma_poll模块具体为实现指定dma逻辑通道号的数据搬移是否搬移完毕所对应寄存器标志位检测任务。

本实施例首先构建s点行fft计算核心模块,用row_kernel表示,即row_kernel模块,row_kernel核心模块包含3个输入参数:第1参数为调用结束的返回地址,第2参数为计算数据地址,第3参数为蝶形因子数据地址。构建row_kernel核心模块时,具体根据gpdsp体系结构特征,以上述参数为输入设置汇编代码,实现s点行fft的向量化计算,计算完成后跳转到第1参数传递的程序地址,实现的row_kernel核心模块汇编代码保存为独立的文件row_kernel.s。

构建r点列fft计算核心模块,用column_kernel表示,即column_kernel模块,column_kernel核心模块包含3个输入参数:第1参数为调用结束的返回地址,第2参数为计算数据地址,第3参数为蝶形因子数据地址。构建column_kernel核心模块时,根据gpdsp体系结构特征,以上述参数为输入设置汇编代码,同时实现p个r点列fft的向量化计算,计算完成后跳转到第1参数传递的程序地址,实现的column_kernel核心模块汇编代码保存为独立的文件column_kernel.s;

构建两个r*p阶矩阵对应元素相乘计算的核心模块,用matrix_coeff表示,即matrix_coeff,matrix_coeff核心模块包含3个输入参数:第1参数为调用结束的返回地址,第2参数为r*p阶计算矩阵数据地址,第3参数为r*p阶系数矩阵数据地址。构建matrix_coeff核心模块时,根据gpdsp体系结构特征,以上述参数为输入设置汇编代码,实现第2和3参数的两个r*p阶矩阵对应元素相乘的向量化计算,计算完成后跳转到第1参数传递的程序地址,实现的matrix_coeff核心模块汇编代码保存为独立的文件matrix_coeff.s;

构建更新r*p阶系数矩阵元素计算的核心模块,用update_coeff表示,即update_coeff模块,update_coeff核心模块包含3个输入参数:第1参数为调用结束的返回地址,第2参数为需要更新的r*p阶矩阵数据地址,第3参数为更新系数r阶向量数据地址。构建update_coeff核心模块时,根据gpdsp体系结构特征,以上述参数为输入设置汇编代码,实现r*p阶矩阵元素更新的向量化计算,其中r*p阶矩阵每一行元素与第3参数更新系数r阶向量对应元素进行乘法运算更新矩阵元素值,计算完成后跳转到第1参数传递的程序地址,实现的update_coeff核心模块汇编代码保存为独立的文件update_coeff.s;

构建数据传输核心模块,用dma_translate表示,即dma_translate模块,dma_translate核心模块包含11个输入参数:第1参数为调用结束的返回地址,第2参数为dma逻辑通道号,第3参数为逻辑通道优先级,第4参数为传输模式控制参数字1,第5参数为传输模式控制参数字2,第6参数为源地址,第7参数为源计数,第8参数为目的地址,第9参数为目的计数,第10参数为源/目的索引,第11参数为块索引。构建dma_translate核心模块时,根据gpdsp体系结构特征,以上述参数为输入设置汇编代码,通过dma实现源地址到目的地址的数据传输,任务完成后跳转到第1参数传递的程序地址,实现的dma_translate核心模块汇编代码保存为独立的文件dma_translate.s;

构建数据搬移标志位检测核心模块,用dma_poll表示,即dma_poll模块,dma_poll核心模块包含2个输入参数:第1参数为调用结束的返回地址,第2参数为dma逻辑通道号。构建dma_poll核心模块时,根据gpdsp体系结构特征,以上述参数为输入设置汇编代码,实现dma逻辑通道号为第2参数的数据搬移是否搬移完毕的相应寄存器标志位检测任务,任务完成后跳转到第1参数传递的程序地址,实现的dma_poll核心模块汇编代码保存为独立的文件dma_poll.s;

构建循环模块,用配对的loop,end表示,其中loop表示循环开始,end表示配对的循环结束,即loop模块。loop模块包含3个输入参数:第1参数为循环计数所用寄存器,第2参数为循环计数初始值,第3参数为每次循环的计数变化值。

本实施例根据gpdsp的多级存储体系结构特征,步骤s2按照大点数一维fft计算的执行流程组合多个核心模块构成大点数一维fft计算计算框架模板,模板中包括多个核心模块功能表示和参数列表,以实现高效的大点数一维fft计算;步骤s3再利用汇编代码生成模块gen_ftt根据模板中包含的核心模块表示、相应的输入参数列表和核心模块汇编代码文件自动生成大点数一维fft计算汇编代码,完成大点数一维fft计算的向量化代码自动生成。

如图3、4所示,本实施例中步骤s2构建的大点数fft框架模板具体包括如下步骤:

步骤1:分别使用dma_translate模块传输列fft计算的蝶形因子数据、系数矩阵数据、更新系数向量数据、子块数据,以及使用dma_poll模块等待数据传输完毕;

步骤2:执行列fft分块循环计算,其中使用column_kernel模块对传输的子块数据进行列fft计算、使用matrix_coeff模块对两个系数矩阵数据进行对应元素相乘计算,使用update_coeff模块进行系数矩阵更新计算,使用dma_translate模块传输数据以及使用dma_poll模块等待数据传输完毕;

步骤3:分别使用column_kernel模块对传输的一个子块数据进行列fft计算,计算后得到的矩阵和系数矩阵使用matrix_coeff模块进行对应元素相乘计算,以及使用update_coeff模块对更新系数向量数据和系数矩阵数据进行系数矩阵更新计算;

步骤4:分别使用dma_translate模块传输行fft计算的蝶形因子数据、子块数据,以及使用dma_poll模块等待数据传输完毕;

步骤5:执行fft分块循环计算,其中使用row_kernel模块对传输的子块数据进行行fft计算、使用dma_translate模块传输数据以及使用dma_poll模块等待数据传输完毕;

步骤6:分别使用row_kernel模块对传输的一个子块数据进行行fft计算、使用dma_translate模块传输数据以及使用dma_poll模块等待数据传输完毕,完成fft计算。

如图3所示,本实施例步骤1的具体步骤为:

步骤1.1:使用dma_translate模块传输列fft计算的蝶形因子数据至标量l1d的数据缓冲区cwbuf;

步骤1.2:使用dma_poll模块等待cwbuf数据传输完毕;

步骤1.3:使用dma_translate模块传输系数矩阵数据至标量l1d的数据缓冲区mbuf;

步骤1.4:使用dma_poll模块等待mbuf数据传输完毕;

步骤1.5:使用dma_translate模块传输更新系数向量数据至标量l1d的数据缓冲区ubuf;

步骤1.6:使用dma_poll模块等待ubuf数据传输完毕;

步骤1.7:使用dma_translate模块传输列fft计算的一个子块r*p至向量阵列存储的数据缓冲区bbuf0;

步骤1.8:使用dma_translate模块传输列fft计算的一个子块r*p至向量阵列存储的数据缓冲区bbuf1。

如图3所示,本实施例步骤2的具体步骤为:

步骤2.1:开启列fft分块循环计算,设定计数器寄存器r0,计数器初始值为si-2,每次循环计数器减2,直到计数器值为0;

步骤2.2:使用dma_poll模块等待bbuf0,out0数据传输完毕;

步骤2.3:使用column_kernel模块对bbuf0的子块数据进行列fft计算;

步骤2.4:使用matrix_coeff模块对bbuf0和mbuf的系数矩阵数据进行对应元素相乘计算;

步骤2.5:使用update_coeff模块对mbuf的系数矩阵数据和ubuf的更新系数向量进行系数矩阵更新计算;

步骤2.6:使用dma_translate模块传输上述计算结果至外部存储区out0;

步骤2.7:使用dma_translate模块传输列fft计算的一个子块r*p至向量阵列存储的数据缓冲区bbuf0;

步骤2.8:使用dma_poll模块等待bbuf1,out1数据传输完毕;

步骤2.9:使用column_kernel模块对bbuf1的子块数据进行列fft计算;

步骤2.10:使用matrix_coeff模块对bbuf1和mbuf的系数矩阵数据进行对应元素相乘计算;

步骤2.11:使用update_coeff模块对mbuf的系数矩阵数据和ubuf的更新系数向量进行系数矩阵更新计算;

步骤2.12:使用dma_translate模块传输上述计算结果至外部存储区out1

步骤2.13:使用dma_translate模块传输列fft计算的一个子块r*p至向量阵列存储的数据缓冲区bbuf1;

步骤2.14:判断计数器r0是否为0,若不是转步骤2.1。

如图3所示,本实施例步骤3的具体步骤为:

步骤3.1:使用dma_poll模块等待bbuf0,out0数据传输完毕;

步骤3.2:使用column_kernel模块对bbuf0的子块数据进行列fft计算;

步骤3.3:使用matrix_coeff模块对bbuf0和mbuf的系数矩阵数据进行对应元素相乘计算;

步骤3.4:使用update_coeff模块对mbuf的系数矩阵数据和ubuf的更新系数向量进行系数矩阵更新计算;

步骤3.5:使用dma_translate模块传输上述计算结果至外部存储区out0;

步骤3.6:使用dma_poll模块等待bbuf1,out1数据传输完毕;

步骤3.7:使用column_kernel模块对bbuf1的子块数据进行列fft计算;

步骤3.8:使用matrix_coeff模块对bbuf1和mbuf的系数矩阵数据进行对应元素相乘计算;

步骤3.9:使用dma_translate模块传输上述计算结果至外部存储区out1

如图4所示,本实施例步骤4的具体步骤为:

步骤4.1:使用dma_translate模块传输行fft计算的蝶形因子数据至向量阵列存储的数据缓冲区rwbuf;

步骤4.2:使用dma_poll模块等待rwbuf数据传输完毕;

步骤4.3:使用dma_translate模块传输行fft计算的一个子块1*s至向量阵列存储的数据缓冲区bbuf0;

步骤4.4:使用dma_translate模块传输行fft计算的一个子块1*s至向量阵列存储的数据缓冲区bbuf1。

如图4所示,本实施例步骤5的具体步骤为:

步骤5.1:开启行fft分块循环计算,设定计数器寄存器r0,计数器初始值为r-2,每次循环计数器减2,直到计数器值为0;

步骤5.2:使用dma_poll模块等待bbuf0,out0数据传输完毕;

步骤5.3:使用row_kernel模块对bbuf0的子块数据进行行fft计算;

步骤5.4:使用dma_translate模块传输上述计算结果至外部存储区out0;

步骤5.5:使用dma_translate模块传输行fft计算的一个子块1*s至向量阵列存储的数据缓冲区bbuf0;

步骤5.6:使用dma_poll模块等待bbuf1,out1数据传输完毕;

步骤5.7:使用row_kernel模块对bbuf1的子块数据进行行fft计算;

步骤5.8:使用dma_translate模块传输上述计算结果至外部存储区out1

步骤5.9:使用dma_translate模块传输行fft计算的一个子块1*s至向量阵列存储的数据缓冲区bbuf1;

步骤5.10:判断计数器r0是否为0,若不是转步骤2.1。

如图4所示,本实施例步骤6的具体步骤为:

步骤6.1:使用dma_poll模块等待bbuf0,out0数据传输完毕;

步骤6.2:使用row_kernel模块对bbuf0的子块数据进行行fft计算;

步骤6.3:使用dma_translate模块传输上述计算结果至外部存储区out0;

步骤6.4:使用dma_poll模块等待bbuf1,out1数据传输完毕;

步骤6.5:使用row_kernel模块对bbuf1的子块数据进行行fft计算;

步骤6.6:使用dma_translate模块传输上述计算结果至外部存储区out1。

通过上述大点数一维fft计算的框架模板,能够结合gpdsp的结构体系特征实现高效的大点数一维fft计算,且模板中通过使用构建的各核心模块实现不同任务,后续结合汇编代码生成模块gen_ftt即可快速获得高度优化的大点数一维fft库函数汇编代码,无需关注底层硬件实现细节,当需要更新优化或扩展时,仅需更新模板就能够自动获得更新的优化库函数汇编代码。

本实施例中,汇编代码生成模块gen_fft根据目标核心模块的类型以及对应的参数列表生成目标核心模块的汇编代码,即构建一个汇编代码生成工具gen_fft,由gen_fft根据模板中包含的核心模块表示、相应的输入参数列表和核心模块汇编代码文件自动生成大点数一维fft汇编代码。

如图5所示,本发明在具体应用实施例中汇编代码生成模块gen_fft对循环模块生成汇编代码具体为:

模板中的循环模块和输入参数列表表示如下:

loop(ri,count,len)

……

end

则gen_fft将上述循环模块生成如下汇编代码:

loop_ri:

smovicount,ri

……

[ri]sbrloop_ri

[ri]ssub1en,ri,ri

snop4

如图6所示,本发明在具体应用实施例中汇编代码生成模块gen_fft对dma_translate核心模块生成汇编代码具体为:

模板中的dma_translate模块和输入参数列表表示如下:

dma_translate(para1,para2,para3,para4,para5,para6,para7,para8,para9,para10,para11)

则gen_fft将上述dma_translate模块生成如下汇编代码:

sbrdma_translate

smovipara1,r63

|smovi.m1para2,r62

|smovi.m2para3,r61

smovipara4,r60

|smovi.m1para5,r59

|smovi.m2para6,r58

smovipara7,r67

|smovi.m1para8,r56

|smovi.m2para9,r55

smovipara10,r54

smovi.m1para11,r53

若dma_translate表示是在模板中首次出现,则将dma_translate.s文件的代码插入到待生成汇编文件尾部。

如图7所示,本发明在具体应用实施例中汇编代码生成模块gen_fft对dma_poll核心模块生成汇编代码具体为:

例如,模板中的dma_poll模块和输入参数列表表示如下:

dma_poll(para1,para2)

则gen_fft将上述dma_poll模块生成如下汇编代码:

sbrdma_poll

smovipara1,r63

smovipara2,r62

snop4

并且,若dma_poll表示是在模板中首次出现,则将dma_poll.s文件的代码插入到待生成汇编文件尾部。

如图8所示,本发明在具体应用实施例中汇编代码生成模块gen_fft对row_kernel核心模块生成汇编代码具体为:

模板中的row_kernel模块和输入参数列表表示如下:

row_kernel(para1,para2,para3)

则gen_fft将上述row_kernel模块生成如下汇编代码:

sbrrow_kernel

smovipara1,r63

smovipara2,r62

smovipara3,r61

snop3

若row_kernel表示是在模板中首次出现,则将row_kernel.s文件的代码插入到待生成汇编文件尾部。

如图9所示,本发明在具体应用实施例中汇编代码生成模块gen_fft对column_kernel核心模块生成汇编代码具体为:

模板中的column_kernel模块和输入参数列表表示如下:

column_kernel(para1,para2,para3)

则gen_fft将上述column_kernel模块生成如下汇编代码:

sbrcolumn_kernel

smovipara1,r63

smovipara2,r62

smovipara3,r61

snop3

若column_kernel表示是在模板中首次出现,则将column_kernel.s文件的代码插入到待生成汇编文件尾部。

如图10所示,本发明在具体应用实施例中汇编代码生成模块gen_fft对matrix_coeff核心模块生成汇编代码具体为:

模板中的matrix_coeff模块和输入参数列表表示如下:

matrix_coeff(para1,para2,para3)

则gen_fft将上述matrix_coeff模块生成如下汇编代码:

sbrmatrix_coeff

smovipara1,r63

smovipara2,r62

smovipara3,r61

snop3

若matrix_coeff表示是在模板中首次出现,则将matrix_coeff.s文件的代码插入到待生成汇编文件尾部。

如图11所示,本发明在具体应用实施例中汇编代码生成模块gen_fft对update_coeff核心模块生成汇编代码具体为:

模板中的update_coeff模块和输入参数列表表示如下:

update_coeff(para1,para2,para3)

则gen_fft将上述update_coeff模块生成如下汇编代码:

sbrupdate_coeff

smovipara1,r63

smovipara2,r62

smovipara3,r61

snop3

若update_coeff表示是在模板中首次出现,则将update_coeff.s文件的代码插入到待生成汇编文件尾部。

上述只是本发明的较佳实施例,并非对本发明作任何形式上的限制。虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明。因此,凡是未脱离本发明技术方案的内容,依据本发明技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均应落在本发明技术方案保护的范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1