Python / NUMBA的多线程多FFT操作?



为了在3D NumPy数组上实现不同内核的卷积/相互关联,我想并行计算许多较小的fft。我发现NUMBA的@njit(parallel = True)标签不支持SciPy或NumPy的FFT/IFFT功能。

是否有机会计算几个3D FFT多线程与NUMBA而不必实现FFT算法自己?或者NUMBAparallel = True标签工作没有@njit标签?我不太关心代码编译,多线程部分是我真正感兴趣的。

我知道我总是可以使用Python的内置模块进行多线程/多处理-但我想知道是否有一个更优雅的解决方案使用NUMBA用于该目的?

提前感谢您的帮助,祝一切顺利,

Valentin

由于GIL(全局解释器锁)的原因,您不能并行化使用任何纯python类型的代码(使用像Numba那样的多个线程)。重写您自己的FFT算法可能会非常低效。事实上,FFT库(通常由Python库使用)通常是非常优化的。

最著名和最快的是FFTW。它通过组装关于算法参数的一小部分代码来生成算法(可能在运行时或提前)。它比几乎所有精心优化的人类实现都要好得多。FFTW支持并行多维fft的计算。希望您可以使用库的Python包装器。

或者,如果没有正确的Python包装器,您可以编写一个简单的C/c++函数,在内部调用FFTW,它本身是从Python调用的。Cython可以很容易地帮助实现这一点。注意,Numba@njit函数似乎可以与Cython代码混合使用。如果您的FFT是在复杂的Numba@njit代码中计算的,这将非常有用。

最新更新