使用MKL计算多个一维R2C FFT的最快方法

时间:2019-07-14 14:53:33

标签: parallel-processing fft simd intel-mkl

我需要尽快计算双精度实数输入数据的多个非常大的一维FFT(FFT的数量是4的整数倍)。硬件将是配备咖啡或更新版本的Intel(可用AVX 2,但不一定是AVX 512),并且该库应免费用于商业用途,而无需提供调用FFT库的软件源代码。 AFAIK FFTW需要后者,因此MKL似乎是首选的库。 输入数据位于n x 4的数组中,因此如果不转换数据,我将不得不使用4的DFTI_INPUT_STRIDES,这可能会降低性能,因为SIMD(AVX)无法使用,对吗? 使用n x 2数组时,我可以使用C2C变换并将每第二个实际数据向量视为交织的虚数数据,并从组合的复数输出中检索两个变换的结果,但仍然必须使用输入步幅2。 是否有可能使库对四次交错的输入数据进行四个并行的r2C转换? 内存中连续的所有4个双精度数(R2C1(i),R2C2(i),R2C3(i),R2C4(i))应放入AVX-2寄存器,因此计算应与单个非SIMD R2C转换,但仅使用AVX-2寄存器即可一次计算四个转换。 还是有可能使库对输入数据加倍交错进行两个并行的C2C转换?就像将向量1当作第一变换的实数据,将向量2当作第一变换的虚数据,将向量3当作第二变换的实数据,将向量4当作第二变换的虚数据一样? 内存中连续的所有4个双精度数(r1,i1,r2和i2)都应放入AVX-2寄存器中,因此计算效率应很高。 当然,如果将所有可用的内核用于加速计算,那将是一个加号。 如果无法进行此类转换,建议仅将DFTI_INPUT_STRIDES设置为4,还是通过处理不连续的数据而导致的性能损失比先转置数组然后进行FFT而不必使用跨步大吗? 关于非常大的变换,我们正在谈论n从大约1E6到1E8。 如果有人可以将我指向带有基准的站点,该基准可以比较在列主数组和行主数组上完成的多个一维FFT,那么也将不胜感激。

0 个答案:

没有答案