非三次网格上的FFT速度

2024-09-28 23:28:50 发布

您现在位置:Python中文网/ 问答频道 /正文

为了解一个微分方程,我需要反复进行三维函数的傅里叶变换/逆傅里叶变换。比如:

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)等。?你知道吗

我正在寻找任何可用的加速。我已经试过玩弄智慧了。我认为如果最大的维度最后一个(例如32、128、512),那么它可能是最快的fFS.形状=(32、128、257),但情况似乎并非如此。你知道吗


Tags: 函数inimportfftnumpyforasrange
1条回答
网友
1楼 · 发布于 2024-09-28 23:28:50

如果您真的想尽可能地压缩所有性能,可以直接使用FFTW对象(最容易通过pyfftw.builders访问)。通过这种方式,您可以精确地控制发生了哪些拷贝,以及是否对反向执行规范化。你知道吗

使用缓存(通过调用pyfftw.interfaces.cache.enable()来启用)可能会使您的代码受益匪浅,因为缓存可以最大限度地减少一般情况和安全情况的设置时间,但不会消除它。你知道吗

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

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

一般提示:

  • 启用多线程以获得最佳性能(适当时设置threads=N)。你知道吗
  • 确保你的数组是适当的字节对齐-这比现代硬件的影响要小,但可能会有所不同(特别是如果你所有的高维大小都有字节对齐作为一个因素)。你知道吗
  • 阅读tutorialapi docs。你知道吗

相关问题 更多 >