非立体网格上的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表示方式下)并选择最快的方式,因此最终会出现非明显的实现,这些实现可能会改变为表面上非常相似的不同数据集。
一般提示: