【发布时间】:2011-04-26 22:26:22
【问题描述】:
我目前正在使用 opencl 为实际输入数据实现二维 FFT(更具体地说,是使用 FFT 的快速 2D 卷积,因此我只需要行为相似的东西即可应用卷积)。 2D FFT 是在行上使用 1D FFT 实现的,然后在列上使用 1D FFT。
为了提高效率,我尝试使用具有实际输入的 FFT 的对称性,以便能够计算更小的 FFT。我发现我可以将两行合并为一个,使用第一行作为实部,第二行作为虚部,对结果行进行第一个 1D FFT,然后使用对称属性来构造个体的 1D FFT 的结果行。所以我在做的基本上是这样的:
让f 和g 成为矩阵中的行。
- 构造
x = f + i * g - 转换得到
F(x) = F(f) + i * F(g) - 使用对称性从
F(x)中提取F(f)和F(g)
但是,我不能直接将结果输入到第二个 1D FFT,因为在这种情况下,我不会转换整个矩阵,而是转换两个子矩阵。然而,在转换之间提取数据意味着要么存储更多数据(n/2+1 条目需要在实际输入上表达一维 FFT 的结果),要么将索引 0 和索引 n/2 处的元素组合成一个元素(组合使用相同的技巧,因为这两个数字都保证是真实的)并使用相同的存储量,但必须在我的卷积中为此做一个特殊的案例。
由于我尝试尽可能多地重用缓冲区(由于 gpu 上可用的 RAM 有限),因此使用更多存储空间并不是一个好的解决方案。此外,我的算法不适用于不是 2 的幂/16 的倍数的矩阵大小(因内核而异)。我也宁愿避免引入特殊情况,因为这会使我的内核变得更加复杂,从而影响效率(我已经很难最小化每个内核使用的寄存器数量)。
所以我的问题是,是否有一种优雅的方法来解决这个问题,这意味着一种无需使用更多内存或某些元素的特殊情况就可以工作的方法?
理想情况下,我希望能够在不在 FFT 中间拆分我的组合数据的情况下进行整个 FFT,但我不确定这是否可行。
【问题讨论】:
-
这本书会很快出平装本吗?
-
你真的需要做一个复杂的 FFT 吗?可能不会。
-
好问题,我在做 fft 检测隐写术时遇到了几乎同样的问题。但我当时并没有意识到...存在stackoverflow;/
-
@phkahler:你是什么意思?我要做的是具有真实输入和(显然)复杂输出的fft。所以我试图将两个实际输入组合成一个复杂的输入,以避免额外的(冗余)计算。
-
我猜你已经知道下面的论文了,但是它和你做的一样。也许它有帮助。 cs.unm.edu/~kmorel/documents/fftgpu/fftgpu.pdf