Halide FFT实现错误?

时间:2015-10-28 19:45:33

标签: c++ fft fftw halide

我正在尝试运行发现here的卤化物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的值,即使在那一点上也会检查价值观是一项长期任务。对于大于32的值,FFT也会失败,似乎不适用于2的所有非幂。

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

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

1 个答案:

答案 0 :(得分:2)

我认为有一些问题正在发生。首先,对于只使用一次传递的非常小的FFT,看起来存在一个错误。我认为这就是你在第一种情况下所遇到的情况。

第二个问题是W和H需要是目标矢量大小的倍数,不一定W和H需要是2的幂。例如,W = 48,H = 32似乎为我工作。还有一个复杂的问题是,对于实际FFT,一维内部切成两半(这是实现FFT的有效效率),因此如果你在AVX机器上,那个维度必须是16的倍数(矢量宽度的2倍) 8个花车)。

如果你想在非常小的FFT上运行,你可以删除矢量化调度指令,然后它应该工作,至少是为了学习目的。

但是,我会指出运行5x5不会很有趣,因为它只需要一个基数5传递,即只是一个普通的旧DFT(这也似乎被打破了,因为你发现)。 4x4(2个基数2次通过)将是最小的有趣FFT。调试时,我经常使用8x8 FFT(基数4,基数2)。