1

我正在尝试运行此处找到的卤化物 FFT 实现,以针对 FTTW 进行基准测试。我能够按原样运行实现,但是在深入挖掘时遇到了一些问题。该例程因 H 和 W 的不同值(随机输入图像的高度和宽度)出现错误而失败。例如,我在 H=W=5 时收到以下错误:

Error at ./fft.cpp:603: Cannot vectorize dimension n0 of function v_S1_R5$6 because the function is scheduled inline. Aborted (core dumped)

我一直在尝试在小图像尺寸(即 5x5)上进行测试以比较算法的结果,但是对于小于 16 的任何值,我都无法完成算法,即使在这一点上也会检查值漫长的任务。FFT 对于大于 32 的值也会失败,似乎不适用于所有非 2 的幂。

有没有人遇到过这个问题?卤化物中是否还有其他适用于不同尺寸图像的 FFT 实现?

作为参考,我正在使用 gcc 4.8.3 在 RHEL7 上运行代码。

4

1 回答 1

2

我认为有几个问题正在发生。首先,对于只使用一次通过的非常小的 FFT,似乎存在一个错误。我认为这就是您在第一个案例中遇到的问题。

第二个问题是 W 和 H 需要是目标向量大小的倍数,不一定 W 和 H 需要是 2 的幂。例如,W = 48,H = 32 似乎对我有用. 还有一个更复杂的情况是,对于真正的 FFT,一个维度在内部被减半(这是实现真正 FFT 的效率),因此如果您使用的是 AVX 机器,则该维度必须是 16 的倍数(向量​​宽度的 2 倍) 8个浮子)。

如果您想在非常小的 FFT 上运行,您可以删除矢量化调度指令,那么它应该可以工作,至少用于学习目的。

然而,我要指出的是,运行 5x5 不会很有趣,因为它只需要一个 radix 5 pass,即只是一个普通的旧 DFT(这似乎也被破坏了,正如你所发现的)。4x4(分解为 2 个基数 2 个通道)将是最小的有趣 FFT。在调试时,我经常使用 8x8 FFT(基数 4,基数 2)。

于 2015-10-28T20:41:08.050 回答