多数の2D畳み込みを同時に計算するために、PyFFTWを使用してねじ山畳み込みを実行しようとしています。(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()
このようにして、Workerクラスのrunメソッド内の実際のコンボルバーに引数、、、、、を渡すことがself.inputa
できます。self.outputa
self.fft
self.inputb
self.outputb
self.ifft
これはすべて素晴らしいですが、ThreadPoolクラスをインポートすることもできます。
from multiprocessing.pool import ThreadPool
しかし、同じ結果を得るには、ThreadPoolでイニシャライザーをどのように定義する必要がありますか?ドキュメントhttp://docs.python.org/library/multiprocessing.htmlによると、 「各ワーカープロセスは、起動時にinitializer(* initargs)を呼び出します」。これはPythonソースコードで簡単に確認できます。
ただし、たとえば2つのスレッドを使用してスレッドプールを設定する場合は、次のようになります。
po = ThreadPool(2,initializer=tobedetermined)
そして、おそらくいくつかのループでそれを実行します
po.apply_async(convolver,(some_input,))
初期化子によってコンボルバーをセットアップするにはどうすればよいですか?畳み込みごとにFFTWプランを再計算せずに、スレッドごとに個別のFFTWプランを使用するにはどうすればよいですか?
乾杯、アレックス。