1

为了求解微分方程,我需要反复进行 3d 函数的傅里叶变换/傅里叶逆变换。就像是:

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) vs (512, 128, 32) 等?

我正在寻找任何可用的加速。我已经尝试过玩弄智慧。我认为如果最大尺寸最后出现(例如 32、128、512)这样 fFS.shape = (32, 128, 257) 可能是最快的,但情况似乎并非如此。

4

1 回答 1

0

如果您真的想尽可能地发挥所有性能,请直接使用 FFTW 对象(最容易通过 访问pyfftw.builders)。通过这种方式,您可以仔细控制确切发生的副本以及是否在逆向执行规范化。

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

关于尺寸的最佳排列,您必须吸吮它并看看。尝试所有各种选项,看看什么是最快的(使用timeit)。确保在进行测试时,您实际上是在使用按预期排列在内存中的数据,而不仅仅是查看内存中的同一个数组(pyfftw如果没有副本,它可以很好地处理 - 尽管有这种类型的调整参数事物)。

FFTW尝试了许多不同的选项(针对不同 FFT 表示的不同算法)并选择最快的,因此您最终会得到不明显的实现,这些实现可能会因表面上非常相似的不同数据集而改变。

一般提示:

  • 打开多线程以获得最大性能(threads=N在适当的地方设置)。
  • 确保您的数组是适当的字节对齐的 - 这比现代硬件的影响要小,但可能会有所作为(特别是如果所有更高维度的大小都将字节对齐作为一个因素)。
  • 阅读教程api 文档
于 2016-09-30T10:45:09.003 回答