并行计算FFT的算法


12

我试图并行化TB级信号文件上FFT的计算。现在,使用开源库进行这样的FFT需要花费数小时,即使在我拥有的最快GPU上通过CUDA运行时也是如此。我正在尝试适应此过程的框架是Hadoop。用非常基本的术语来说,Hadoop通过以下方式将问题分配到任意数量的服务器节点上:

•您将输入文件分成(键,值)对。
•这些对被输入到“映射”算法中,该算法根据您放入映射中的内容将您的(键,值)对转换为其他一些(键,值)对。
•然后,框架从Maps收集所有(键,值)输出,并按键对它们进行排序,并将具有相同键的值聚合为一对,因此最后得到了(键,list(value1,value2, ..))对
•然后,将这些对馈入“ Reduce”算法中,该算法依次输出更多(键,值)对作为您的最终结果(写入文件)。

该模型在诸如处理服务器日志之类的实际应用中有许多应用程序,但是我很难应用该框架将FFT分解为“映射”和“减少”任务,特别是因为我对DSP并不很熟悉。

我不会打扰您,因为这是DSP问题与解答。但是,我对存在哪些并行计算FFT的算法感到困惑;映射和归约任务无法(在技术上)相互交谈,因此必须将FFT分成独立的问题,最后可以以某种方式重新组合结果。

我已经为Cooley-Tukey Radix 2 DIT编写了一个简单的实现,可以在较小的示例上运行,但是将其用于递归计算十亿字节的奇/偶索引DFT将不起作用。我花了几周时间阅读许多论文,包括一篇关于MapReduce FFT算法的文章(由Tsz-Wo Sze作为其关于SSA乘法的论文的一部分撰写,我不能链接两个以上的超链接)和“四步FFT” (这里这里),它们看起来彼此相似,而且与我要完成的任务相似。但是,我在数学上是绝望的,将这些方法中的任何一种手工应用于{1,2,3,4,5,6,7,8}(所有虚部均为0)这样的简单集合,可以得出我非常不正确的结果。谁能用简单的英语(我链接的或其他链接的)向我解释一种有效的并行FFT算法,以便我尝试对其进行编程?

编辑:吉姆·克莱(Jim Clay)和其他可能对我的解释感到困惑的人,我正在尝试对TB文件进行一次FFT。但是我希望能够在多台服务器上同时执行此操作,以加快该过程。


1
您到底想完成什么?您要对TB级信号文件进行单个FFT,还是对每个文件进行多个较小的FFT?
Jim Clay

Answers:


13

ej2πkNN=240

您还将积累大量舍入和截断错误,因为进入单个输出数字的操作数也非常大。由于FFT具有“每个输出都取决于每个输入”的性质,因此误差传播非常普遍。

我不知道解决此问题的简单方法。您的要求是不寻常的。大多数对大型数据集进行频谱分析的应用程序都会在没有问题的情况下进行运行分析。也许,如果您可以描述您的应用程序及其更多限制,我们可以为您提供更合适的解决方案。


相当正确的一点..我将不得不更多地考虑这一点。就像您说的那样,也许最后我将诉诸“运行分析”。
菲利普(Philipp)2012年

我知道我真的来晚了,但是由于您提到可以做到这一点,您是否有机会了解如何做到这一点?
克劳迪奥·布拉瑟

4

除了尝试重新编写FFT之外,您还可以尝试使用现有的FFT实现方式(例如FFTW),并通过重叠加法重叠法沿信号的长度(无论大小)重复应用它。保存方法。通过将FFT表示为卷积可以做到这一点。

这些较短长度的FFT不需要相互通信,并且整个方案与map-reduce步骤匹配。

通常,您的目标是将信号X分成较小的段,这些段也可以重叠(例如X [0:10],X [5:15],X [10:20] ... )。对这些小片段执行FFT,最后将它们重新组合以产生最后一个。这与map-reduce运算符非常吻合。

在“地图”过程中,您可以生成(键,值)对,其中“键”是每个段的顺序ID(0、1、2、3、4、5,....),“值”是信号文件中段的第一个值的INDEX(或文件位置)。因此,例如,如果您的文件充满了INT32,则第二段的索引(上方)为5 * sizeof(INT32)。(或者,如果采用其他任何格式,则可能需要一个lib)

现在,每个工作人员都会收到一个(键,值),打开一个文件,寻找到正确的位置,从中读取M个样本(其中M为10以上),执行FFT并将其保存到名称相同的文件中,例如“ RES_ [INKEY] .dat”,并返回(键,值)对。在这种情况下,“键”将是INDEX(传入(键,值)元组的“值”),“值”将是包含FFT结果的文件的名称。(我们将回到此)

现在,在“ reduce”中,您可以通过接受“ map”步骤中的一个(键,值),打开该文件,加载FFT结果,执行oa或os,然后将其保存到输出文件中正确的INDEX。(请参阅this(或this)中的伪代码,“ map”步骤并行处理“ yt = ...”,而“ reduce”步骤处理“ y(i,k)= ...”部分。)

这里可能需要进行一些文件处理,以减少网络流量或可能包含实际数据文件的服务器的负载。


1
我不确定重叠加法和重叠保存法以组合较小的块以检索较大尺寸的FFT的有效性-据我所知,必须进行第二遍FFT(尺寸为N的DFT = AB可以分解为大小为B的A DFT,应用旋转因子,然后分解为大小为A的B DFT。如果我们希望输出较低的分辨率,可能会奏效...
pichenettes 2012年

大家好,您好,我在我的脑海里想起的是这个(engineeringproductivitytools.com/stuff/T0001/PT11.HTM),我将在答案中包括这些内容。
A_A 2012年

2

2N

2N/2N/22N/2

更明确地说,在整个递归过程中都不需要使用MR,这的确效率很低。您的问题可以分解为百万兆字节的内部和外部FFT,而这些兆字节FFT可以使用FFTW或类似方法完美计算。MR将仅负责监督数据改组和重组,而不是实际的FFT计算。

我的第一个想法将是以下内容,但我怀疑可以在具有智能数据表示的单个MR中完成此操作。

sR=2N/2

第一MR:内部FFT

映射:及时执行抽取,以块为单位对样本进行内部FFT

(k,v)k0..2N1vs[k]

(k%R,(k/R,v))

减少:计算内部FFT

(k,vs)kvs(i,v)

inRin[i]=v

RinoutR

i0..R1(k,(i,out[i]))

第二MR:外部FFT

映射:将外部fft的样本分组并应用旋转因子

(k,(i,v))k(i,v)

(i,(k,v×exp2πjik2N))

减少:执行外部FFT

(k,vs)kvs(i,v)

inRin[i]=v

RinoutR

i0..R1(i×R+k,out[i]))

概念证明python代码在这里。

如您所见,Mapper仅按顺序排列数据,因此在以下假设下:

  • 时间抽取(映射器1)可以在上一步中完成(例如,通过将数据转换为正确的输入格式的程序)。
  • 您的MR框架支持Reducer写入不同于其输入键的键(在Google的实现中,reduces只能将数据输出到与接收到的键相同的键,我认为这是因为SSTable被用作输出格式)。

所有这一切都可以在单个MR中完成,映射器中的内部FFT,缩减器中的外部FFT。这里的概念证明


您的实现似乎很有希望,我现在正在研究它,但是在内部FFT缩减器中,您编写了“执行大小为2 ^ R的FFT以获得大小为2 ^ R的矢量”。如果R为2 ^(N / 2),则此FFT的大小是否为2 ^(2 ^ N / 2),因此不正确吗?您是说R大小的FFT吗?
菲利普

R2Rexp2πjik2N

0

如果您的信号是多维的,则可以很容易地完成FFT的并行化。在MPI过程中保持一个维连续,执行FFT,然后转置(全部)以处理下一维。FFTW执行此操作。

如果数据是一维的,则问题将更加困难。例如,FFTW没有使用MPI编写一维FFT。如果使用基数2的频率抽取算法,则前几个阶段可以作为朴素的DFT执行,从而允许一个节点使用2或4个节点而不会损失任何精度(这是因为,第一阶段是-1或i,可以很好地配合工作)。

顺便说一句,转换数据后,您打算如何处理这些数据?如果人们知道输出发生了什么(即卷积,低通滤波器等),可能会有所作为。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.