5

多数の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.outputaself.fftself.inputbself.outputbself.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プランを使用するにはどうすればよいですか?

乾杯、アレックス。

4

1 に答える 1

1

Thread Local Storage ( threading.local()) を使用して PyFFTW を初期化し、結果を記憶する関数で convolver 呼び出しをラップできます。

于 2011-08-30T09:35:25.807 に答える