当前位置:无忧公文网 >范文大全 > 征文 > 使用面向FPGA的OpenCL设计两百万点频域滤波器

使用面向FPGA的OpenCL设计两百万点频域滤波器

时间:2022-03-24 09:10:54 浏览次数:


打开文本图片集

摘要:快速傅里叶变换(FFT)是信号处理应用的基础。FPGA供应商一直以来提供了运行良好的FFT库,处理适配到FPCJA片内存储器中的大量数据。但是,如果数据规模太大,应该如何应对?为解决这一问题,FPGA设计人员现在必须要做出设计决定,这些决定互相纠缠在一起,例如,片内FFT内核的配置选择,其数量,它们怎样连接并访问外部存储器,多个内核之间的同步等。分析所有这类设计决定就是要能够很好的结合现有产品,在HDL中编程,这会非常耗时,而且带来了性能问题。采用OpenCL等高级编程语言,能够很快的完成系统设计分析。本文将研究在目前FPGA体系结构上实现1M和16M点数的频域滤波器,支持从每秒120到240百万采样的不同采样率。本文研究一个2M点数单精度频域滤波器的示例,该示例选择OpenCL作为其设计决定。假设读者熟悉FPGA设计,掌握OpenCL的基本概念。本文网络版地址:http://.cn/article/281882.htm

关键词:FPGA;频域滤波器;OpenCL

DOI:10.3969/j.issn.1005-5517.2015.10.006

引言

本文介绍构建一个百万点数单精度频域滤波器。这类滤波器使用百万点数1D FFT,将每一个频率和相位分量与用户提供的数值相乘,使其输入转换到频域,并通过FFT反变换,再把结果转换回时域。在目前一代FPGA和两个DDR3外部存储器块平台上,对于两百万点采样,整个系统的性能总要求是每秒处理1.50亿点(MSPS)。输入和输出通过万兆以太网直接传送给FPGA。

对于这一设计,本文选择使用Altera OpenCL SDK,在安装了StratixV GSD8 FPGA的BittWare S5-PCIe-HQ电路板上运行FPGA编译器。出于两个原因,选用OpenCL而不是更底层的语言。第一个原因是设计几百万点数的滤波器需要构建复杂而且非常高效的外部存储器系统。采用底层设计工具,建立片内FFT或者进行对角旋转的独立模块相对简单(特别是因为所有FPGA供应商已经提供了含有这类模块的库)。但是,建立外部存储器系统通常需要付出大量的HDL工作。由于在开始时并不知道整个系统的配置,因此这特别难,在后面会看到。选择OpenCL的第二个原因是通过主机控制FPGA逻辑。从开始时就清楚两个完整的几百万点的FFT内核副本无法适配到一个器件中,因此,在获得最终输出之前,一组数据至少要通过FPGA逻辑两次。协调这类共享同时还要实现动态修改数据规模、乘法系数,甚至完全修改FPGA功能等,这些工作最好留给CPU。为FPGA提供的OpenCL编译器解决了所有这些难题——它开发可定制的高效的外部存储器系统,能够精确地控制FPGA逻辑。

1.片内FFT

假设已经有一个FFT内核,处理的数据长度完全能够适配到FPGA中(将其称之为“片内FFT”),每一家FPGA供应商都会提供此类内核。至少可以采用以下方式对这些内核配置参数:

1.数据类型f定点或者单精度浮点);2.要处理的点数,N;3.要并行处理的点数,POINTS;4.动态支持修改要处理的点数。

有了这类片内FFT内核后,需要两个步骤来构建整个系统:开发一个能够处理几百万点数的FFT内核,然后,把两个这类内核连接在一起,它们之间是复数乘法,从而建立完整的系统。

2.几百万点FFT

采用外部存储来实现FFT的传统方法是六步算法[1],把一个一维数组当做两维来处理(2M= 2KxlK),如图1所示。

图1画出了六步算法,显示了单独的计算内核以及外部存储器缓冲。“获取”内核读取来自外部存储器的数据,以选择对其进行转置,将其输出至通道(在OpenCL 2.0术语中,也称之为“管道”)。在硬件中,以FIFO来实现通道,其深度由编译器计算。“片内1D FFT”是未经修改的供应商的FFT内核,接收输入,使用通道产生比特反转输出。“转置”是将从输入通道读取的数据转置,可以选择将其与特殊的旋转因子相乘,以自然顺序把输出写入到外部存储器。

正如您从图1中所看到的,数据两次通过获取→1D FFT→转置(FIT)流水线,产生最终输出。留给第一个最重要的设计选择采用一个FIT流水线副本以节省面积,或者两个副本以尽可能的提高吞吐量。

在仿真器中对这一算法进行原型设计,以便能够正确的处理转置地址以及旋转因子。仿真器将OpenCL内核编译至x86-64二进制文件,可以运行在没有FPGA的开发板上。从仿真器到硬件编译是比较简单的步骤——仿真器中功能正确的代码在硬件中也是正确的,不需要仿真。出于性能和面积的原因,唯一要修改的是获取和转置内核所使用的本地存储器系统。高效的转置需要在本地存储器中对数据POINTS列/行进行缓冲。OpenCL编译器分析您OpenCL代码中对本地存储器的所有访问,并通过创建一个定制的片内存储系统来优化你的代码。对于POINTS=4的情况,最初的转置内核有四次写和四次读操作。一个双泵的片内RAM模块最多可以服务四个独立的申请,其中最多两次写操作。为支持四次写和四次读操作,需要复制片内存储器,含有申请仲裁逻辑,导致面积增大,性能下降。当认识到可以通过修改写模式,来连续进行所有四次写操作后,这四次写操作被OpenCL编译器分成一组,成为一次宽写操作,这样,只需要对本地存储器系统访问五次:一次写操作,四次读操作。进行了这一修改后,编译器自动为构建一个小很多的五端口存储器系统,在每一时钟周期可以服务所有五个申请,不会出现停顿。

设计被编译到硬件中后,可以进行性能测量。在FPGA上有一个FIT流水线副本,对于四百万点FFT,测得了POINTS=4时,217MSPS,POINTS=8时,457 MSPS[2]。POINTS=8版本使用了两次,因为这一配置中大量的片内模块RAM和两个副本无法适配。这就是要研究的第一个设计范围——要并行处理的点数和面积。

3.全滤波器设计

现在,有了一个几百万点的FFT,准备好将整个设计合在一起。把两个片外FFT连接在一起,得到图2所示的流水线逻辑视图。

除了复制一个片外FFT计算流水线,还将以下部件加入到系统中:

1.频域的复数乘法被加入到第三个FIT模块中。coef缓冲保存了两百万复数乘法系数。

2.增加了I/O输入和I/O输出内核,对万兆以太网通道上的外部存储器负载进行逼真的建模。采用这些内核,能够继续纯软件开发,在内核计算流水线完全优化好之后,再集成以太网通道。I/O输入内核在每一时钟周期产生一个采样,I/O输出每一时钟周期占用一个采样。

正如片外FFT试验所示,只能适配两个FIT模块,采用POINTS=4。因此,要完成全部计算,数据要通过硬件两次。对于2M点数,系统总吞吐量只有120 MSPS,低于目标150MSPS。通过把数据长度减小到1M点,能够适配POINTS=8版本,吞吐量达到198 MSPS。这表明,只要能够让POINTS=8版本适配2M点数,就还能提高性能!

在图2中,找出全流水线的优化结构是整个设计过程的下一步。首先能够提高的是去掉tmp3缓冲。两边都以同样的方式访问它(转置写和读操作)。因此,可以通过通道把第二和第三个FIT模块直接连接起来。这要求转置内核将其输出写入到外部存储器中,或者通道中,获取内核也是相似的修改。这类修改是由主机动态控制的,因此,可以使用获取内核的一个物理例化。注意,这改变了与外部存储器的连接。但是,根本不用对此担心——OpenCL编译器已经为系统生成了高效的定制外部存储器互联。

进一步的改进是,把第二个转置“T”从写到tmpl改为从tmpl读(tmpl中的数据以不同的方式存储,但是效果一样)。这样,转置就不需要本地存储器缓冲了。

原来是通过两级来实现转置的:第一,所需的数据被装入到本地存储器中,然后,使用转置地址从本地存储器读取。为高效的使用这类流水线,OpenCL编译器自动将本地存储器系统的缓冲加倍。以这种方式,流水线的装入部分能够将数据装入到一个副本中,而读部分能够从另一副本读取以前的数组。自动双缓冲非常适合的转置算法,但是太昂贵了。相反,重新编写转置内核。这一内核只需要一个缓冲,支持同时读写多个数据点。对这一转置内核的介绍已经超出了本文的范围。

经过以上修改后,能够采用POINTS=8配置适配2M点的FFT,吞吐量达到164 MSPS。

4.调度

只能适配FIT的两个副本。图3显示了怎样调度数据流,以便完全利用流水线。注意,在稳定状态下,流水线交替处理第二和第三组数据,不需要额外的缓冲。由CPU上运行的主程序控制这种调度,使用动态分析工具进行验证。

5.缓冲分配

在OpenCL系统中,主程序控制了包含那个缓冲区的DDR块。DDR块只要不是同时读写,在读操作或者写操作时的效率最高,因此,在两个DDR块之间按以下原则来分配5个缓冲:

DDR块#O分配input和tmp2。

DDR块#1分配tmpl、coef和out。

给DDR块分配一个缓冲就是在OpenCL主程序中修改一行代码。编译器和底层平台完成其他任务。能够自动完成这一过程,在2-DDR和4-DDR电路板上进行了试验,为每一块电路板找到缓冲到存储器块的最佳映射。

6.结论

在本文中,介绍了怎样使用为FPGA提供的Altera OpenCL SDK,设计2M点数频域滤波器。使用软件类型的仿真对所有功能进行了验证。每一个硬件编译都能够正确工作。并没有打开硬件仿真器,也不用担心时序收敛问题。

参考文献:

[1]D.H.Bailey.FFTs in external of hierarchical memory Proc. of ACM/IEEE Conf. on Supercomputing" 89 (SC89), 1989, 234-242

[2]FFT (1D) Off-Chip Design Example.[EB/OR] https://wwwaItera.com/support/support-resources/design-exaples/design-software/opencl/fft-1d-offchip.html

推荐访问: 滤波器 面向 设计 OpenCL FPGA