0

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

事实上,我可以使用 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。请注意,我更正了示例以使用正确的修饰符“线程”。

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()

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

4

0 回答 0