PyFFTW只使用一个核心 - 为什么以及如何改变它?

时间:2017-02-15 13:18:20

标签: python multithreading numpy fftw pyfftw

我在使用pyFFTW时遇到了困难。我正在使用macOS 10.12并使用pip3使用自制软件和afterfwards安装pyFFTW安装了python3,numpy和fftw。

事实上,我可以使用pyFFTW和文档中的示例:但它总是只使用一个核心,从活动监视器可以看出。

我将这两个例子用于我的测试:这个例子来自https://hgomersall.github.io/pyFFTW/sphinx/tutorial.html。我还将这个例子放大到长度为2 ^ 14的向量,以便看到效果,遗憾的是没有。

import pyfftw
import scipy.signal
import numpy
from timeit import Timer

a = pyfftw.empty_aligned((128, 64), dtype='complex128')
b = pyfftw.empty_aligned((128, 64), dtype='complex128')

a[:] = numpy.random.randn(128, 64) + 1j*numpy.random.randn(128, 64)
b[:] = numpy.random.randn(128, 64) + 1j*numpy.random.randn(128, 64)

t = Timer(lambda: scipy.signal.fftconvolve(a, b))

print('Time with scipy.fftpack: %1.3f seconds' % t.timeit(number=100))

# Monkey patch fftpack with pyfftw.interfaces.scipy_fftpack
scipy.fftpack = pyfftw.interfaces.scipy_fftpack
scipy.signal.fftconvolve(a, b) # We cheat a bit by doing the planning first

# Turn on the cache for optimum performance
pyfftw.interfaces.cache.enable()

print('Time with monkey patched scipy_fftpack: %1.3f seconds' %
       t.timeit(number=100))

这是来自PyFFTW multithreading not working。请注意,我更正了示例以使用正确的修饰符“threads”。

import pyfftw
n_cpu = 4
flags = ('FFTW_MEASURE','FFTW_DESTROY_INPUT')
x_buffer = pyfftw.n_byte_align_empty((8192,8192,), 16, 'complex128')
f_buffer = pyfftw.n_byte_align_empty((8192,8192,), 16, 'complex128')
fftObj  = pyfftw.FFTW(x_buffer, f_buffer,  axes=(-2,-1), direction='FFTW_FORWARD',  flags=flags, threads=n_cpu)
fftObj()

我很感激任何提示如何有意义地调试我的安装并使多线程工作。

0 个答案:

没有答案