【发布时间】:2011-08-25 14:42:46
【问题描述】:
我正在尝试使用 PyFFTW 进行线程卷积,以便计算大量 同时进行 2D 卷积。 (不需要单独的进程,因为 GIL 已发布 用于 Numpy 操作)。 现在这里是这样做的规范模型: http://code.activestate.com/recipes/577187-python-thread-pool/
(Py)FFTW 之所以如此之快,是因为它重用了计划。这些必须为每个线程单独设置,以避免访问冲突错误,如下所示:
class Worker(Thread):
"""Thread executing tasks from a given tasks queue"""
def __init__(self, tasks):
Thread.__init__(self)
self.tasks = tasks
self.daemon = True
# Make separate fftw plans for each thread.
flag_for_fftw='patient'
self.inputa = np.zeros(someshape, dtype='float32')
self.outputa = np.zeros(someshape_semi, dtype='complex64')
# create a forward plan.
self.fft = fftw3.Plan(self.inputa,self.outputa, direction='forward', flags=[flag_for_fftw],nthreads=1)
# Initialize the arrays for the inverse fft.
self.inputb = np.zeros(someshape_semi, dtype='complex64')
self.outputb = np.zeros(someshape, dtype='float32')
# Create the backward plan.
self.ifft = fftw3.Plan(self.inputb,self.outputb, direction='backward', flags=[flag_for_fftw],nthreads=1)
self.start()
通过这种方式,可以将参数self.inputa、self.outputa、self.fft、self.inputb、self.outputb、self.ifft 传递给 Worker 类的 run 方法中的实际卷积器。
这一切都很好,但我们不妨导入 ThreadPool 类:
from multiprocessing.pool import ThreadPool
但是我应该如何在 ThreadPool 中定义初始化程序以获得相同的结果? 根据文档 http://docs.python.org/library/multiprocessing.html “每个工作进程在启动时都会调用初始化程序(*initargs)”。 您可以在 Python 源代码中轻松检查这一点。
但是,当您设置线程池时,例如使用 2 个线程:
po = ThreadPool(2,initializer=tobedetermined)
然后你运行它,也许在某个循环中
po.apply_async(convolver,(some_input,))
你如何让卷积器由初始化器设置?你怎么能让它单独使用 每个线程中的 FFTW 计划,无需为每个卷积重新计算 FFTW 计划?
干杯, 亚历克斯。
【问题讨论】:
标签: python multithreading fftw convolution