【问题标题】:FFT Speed on Noncubic meshes非立方网格上的 FFT 速度
【发布时间】:2016-09-29 15:57:10
【问题描述】:

为了求解微分方程,我需要反复进行 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) 可能会最快,但事实并非如此。

【问题讨论】:

    标签: python performance fft fftw pyfftw


    【解决方案1】:

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

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

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

    一般提示:

    • 打开多线程以获得最佳性能(在适当的地方设置threads=N)。
    • 确保您的数组进行了适当的字节对齐 - 这对现代硬件的影响较小,但可能会有所作为(特别是如果您的所有更高维度的大小都将字节对齐作为一个因素)。
    • 阅读tutorialapi docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多