Time 时频分布优化——OpenCL。小FFT序列

Time 时频分布优化——OpenCL。小FFT序列,time,opencl,fft,frequency,analysis,Time,Opencl,Fft,Frequency,Analysis,目前,我正在尝试在ATI GPU设备上实现时频分析。基本上,我需要的是在穿过初始数组的小窗口内运行FFT,并将每次计算的结果存储在矩阵[window\u size,analysis\u size]中 我使用的是clFFT库,具有以下缓冲区结构: data_buffer ~ complex<float>[analysis_size] out_buffer ~ complex<float>[window_size * (analysis_size-window_size)]

目前,我正在尝试在ATI GPU设备上实现时频分析。基本上,我需要的是在穿过初始数组的小窗口内运行FFT,并将每次计算的结果存储在矩阵[window\u size,analysis\u size]中

我使用的是clFFT库,具有以下缓冲区结构:

data_buffer ~ complex<float>[analysis_size]

out_buffer ~ complex<float>[window_size * (analysis_size-window_size)]

in_buffers ~ overlapped window_size subbuffers within data_buffer, for each calculation

out_buffers ~ window_size subbuffers within out_buffer, for each calculation. No overlapping.
在将DataCleQueueWriteBuffer写入in_缓冲区后,当所有in_缓冲区都应填满时,我只需在一个周期内运行所需数量的clfftEnqueueTransforms,in_缓冲区[I],out_缓冲区[I]作为参数。之后,我用一个clEnqueueReadBuffer读取out_缓冲区中的所有内容

所有这些子缓冲区的麻烦应该是减少数据传输开销,但仍然

IPP对FFT的实现使同样的事情快了两倍,这有点令人困惑。我做错了什么?是否存在任何可能的优化,或者根本性的错误?谢谢你的帮助


我的代码可以通过link获得。

在非阻塞模式下启动clfftEnqueueTransform。如果每次启动花费的时间很短,且启动的次数很大,则阻塞操作可能会产生很大的开销。正如CLFFTENQUEUETERTRANSFORM描述中所述,将FFT转换操作排队,并立即返回非阻塞。它被设计成非阻塞的,并且没有通常的方法来改变这种行为。小型FFT并不真正适合GPU。也许这导致了经济放缓?另外:由于FFT的循环特性,我认为必须有更有效的方法来做你正在做的事情。每一个新的FFT相对于前一个只改变一个样本。因此,如果你能在CPU上找到一种巧妙的方法,也许会更好。谢谢你的评论,现在我将尝试在数学上使它更有效。Idk,如果它会工作,但完全值得一试。