【问题标题】:plans and subset of rows in pyfftwpyfftw 中的计划和行子集
【发布时间】:2017-04-17 21:00:30
【问题描述】:

我想使用pyfft 重复计算二维数组行子集的离散傅里叶变换。我事先不知道我需要转换哪些行,这取决于上一轮的输出。我知道对所有行都这样做是浪费。

据我了解,FFTW3 中的“计划”与变换类型(c2c、r2c 等)和输入/输出长度相关,在 1D 情况下,输入/输出长度始终是向量。在pyfftw 中,看起来“计划”与变换类型和输入/输出形状相关联,所以我的解释是它对每一行都使用相同的FFTW3 计划。

我的问题是:是否可以为 一些 行使用相同的 FFTW3 计划,而无需为所有可能的行组合创建单独的 pyfftw.FFTW 对象?

另一方面,我想知道pyfftw 如何使用多个核心:它是否为每一行使用多个核心(这在FFTW3 文档中看起来很自然)还是将不同的行分配给不同的核心(这是我最初的假设)?

【问题讨论】:

    标签: pyfftw


    【解决方案1】:

    如果您可以从视图创建 numpy 数组,则可以使用 pyFFTW 进行规划 - 所有有效的 numpy 数组应该都可以正常工作。

    这意味着几件事:

    1. 您的数组需要有规律的步幅,但这些步幅可以是任意的。
    2. ND 数组计划为 ND 变换,使用选定的轴。
    3. 您可能会通过跨步技巧做一些狡猾的事情,并且可能会奏效(但如果您做了一些过于邪恶的事情,例如重叠行然后使用线程,则可能无法达到您的预期)。

    我经常使用的一个解决方案是将要转换的行复制到临时数组中,然后对其进行转换。您可能会发现这是最快的选择(尤其是当您允许正确获取字节偏移时)。

    显然,如果您总是有不同的行数,这将不起作用。您可能仍然会发现,如果您计划转换的行数最多,然后复制到一个子集中,您仍然会比其他方式更快。

    即使您降到 C 级别,您也会遇到的问题是,如果您经常更改变换大小,那么规划开销很可能占主导地位。

    您也可以尝试pyfftw.interfaces.numpy_fft,它通常比 numpy 更快,并且能够缓存重复的变换大小。

    【讨论】:

    • Henry,感谢 pyfftw 和您的快速回复!您能否澄清第二个项目符号?如果您只为 2D 数组选择轴“-1”,那么计划是否仅针对单行(例如,第一行)进行?我已经尝试过 pyfftw.interfaces.numpy_fft 并且效果很好,但我正试图从我的机器中挤出更多的汁液。另外,如果你能对我的第二个问题说点什么,我将不胜感激。
    • 不,axes 参数告诉 pyFFTW 使用哪个轴,而不是使用哪个特定切片。如果要对数组进行切片,则需要先执行此操作。
    • 在详细研究了您的 pyfftw 代码以及 FFTW 手册之后,我意识到我的问题更多是关于 FFTW 而不是 pyfftw。详情为here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2012-05-21
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多