为了在3D NumPy阵列上计算不同内核的卷积/互相关,我希望并行计算许多较小的FFT。我发现NUMBA的@njit(parallel = True)
标签并不支持SciPy或NumPy的FFT / IFFT函数。
有没有可能用NUMBA多线程计算几个3DFFT,而不必自己实现FFT算法?或者在没有@njit
标签的情况下,NUMBA parallel = True
标签可以工作吗?我不太关心代码编译,我真正感兴趣的是多线程部分。
我知道我总是可以使用Python的内置模块进行多线程/多处理--但我想知道是否有更优雅的解决方案使用NUMBA来实现这一目的?
为了你的帮助和万事如意,
Valentin
发布于 2021-08-12 18:00:46
由于GIL (全局解释器锁),您不能并行化使用任何纯Python类型的代码(像Numba那样使用多线程)。重写你自己的FFT算法可能会非常低效。实际上,FFT库(通常由Python库使用)通常是非常优化的。
最著名和最快的是FFTW。它通过汇编关于算法参数的一小部分代码来生成算法(可能在运行时或提前)。它比几乎所有经过精心优化的人工实现都要好很多。FFTW支持并行多维FFT的计算。希望有你可以使用的库的Python wrappers。
或者,如果没有Python包装器是正确的,您可以编写一个简单的C/C++函数,在内部调用FFTW,该函数本身从Python调用。Cython可以很容易地做到这一点。请注意,Numba @njit
函数似乎是can be mixed with Cython code。如果你的快速傅立叶变换是在一个复杂的Numba @njit
代码中间计算的,这是很有用的。
https://stackoverflow.com/questions/68755160
复制相似问题