非立体网格上的FFT速度

问题描述:

我需要重复进行3d函数的傅里叶变换/逆傅里叶变换以求解微分方程。例如:非立体网格上的FFT速度

import pyfftw.interfaces.numpy_fft as fftw 
for i in range(largeNumber): 
    fFS = fftw.rfftn(f) 
    # Do stuff 
    f = fftw.irfftn(fFS) 

f的形状非常非立体。是否有基于尺寸顺序的性能差异,例如(512,32,128)与(512,128,32)等?

我正在寻找任何可用的加速ups。我已经尝试过玩弄智慧。我认为如果最大尺寸最后一个尺寸变得最大(例如32,128,512),所以fFS.shape =(32,128,257),但这似乎并不是这样。

如果您真的想挤出所有的性能,可以直接使用FFTW对象(最容易通过pyfftw.builders访问)。通过这种方式,您可以仔细控制发生副本的情况以及归一化是否在逆过程中执行。

您的代码原样可能会从使用缓存(通过调用pyfftw.interfaces.cache.enable()启用)中受益,这会尽可能减少一般和安全情况下的设置时间,但不会消除它。

关于尺寸的最佳排列方式,您必须吮吸它并观察。尝试所有各种选项并查看最快的(使用timeit)。确保当你做测试时,你实际上是按照预期使用排列在内存中的数据,而不是仅仅考虑内存中的同一个数组(这可以很好地处理,而不需要拷贝 - 尽管这种调整参数的东西)。

FFTW尝试很多不同的选项(不同的FFT算法在不同的FFT表示方式下)并选择最快的方式,因此最终会出现非明显的实现,这些实现可能会改变为表面上非常相似的不同数据集。

一般提示:

  • 开启多线程以获得最佳性能(设置threads=N如适用)。
  • 请确保您的阵列适当地进行字节对齐 - 这与现代硬件相比具有较小的影响,但可能会有所作为(特别是如果所有较高尺寸的字体都将字节对齐作为因素)。
  • 阅读tutorialapi docs