2011-01-04 6 views
5

私はscipy.optimize.leastsqを使用して機能を最適化するいくつかのリサーチコードに取り組んでいます。これは反復ごとに約18回実行されるので、実行時間を短縮するためにleastsqを並行して呼び出すことを希望します。これは、最適化がほぼ完全に独立しているため、ほとんど同期が必要ないため、問題ではありません。私は最近、明示的に共有メモリを設定することなくこれを行うことを可能にするmultiprocessing.pool.ThreadPoolについて知りました。私のデータのほとんどはNumPy配列になっているので、痛みです。だから私はコードが動作することを期待して少し書き直しましたが、奇妙なエラーが発生します:SystemError: null argument to internal routineSciPy.optimizeとの平行性

次は私のコードを簡略化したものである:

def optfunc(id): 
    def errfunc(x): 
     return somedata[id] - somefunc(x) 

    lock.acquire() 
    x0 = numpy.copy(currentx[id]) 
    lock.release() 

    result = scipy.optimize.leastsq(errfunc, x0) 

    lock.acquire() 
    currentx[id] = result 
    lock.release() 

ThreadPool(processes=8).map(optfunc, range(idcount)) 

scipy.optimize.leastsqがスレッドセーフでない場合を除きこれは、正常に動作する必要があります。だから私はロックを入れてみたscipy.optimize.leastsq;それを見てください。しかし、プロセッサ使用率は100%で止まっているので、これは私には役に立たない。

ここで私の質問ができますか?私は私のオプションがあると思います:(?多分levmar、)

  1. LMのスレッドセーフな実装を探す
  2. プロセスではなく、スレッドを使用してみてください(私はこれが違いを生むだろうとは思わない)

ご意見やご提案をいただければ幸いです。

+2

Windowsを使用していますか? Windowsの場合、optimize.leastsqのスレッディングに関する既知の問題があります。http://projects.scipy.org/scipy/ticket/1117 –

+0

うーん、面白かったのは、私が検索したときに出てこなかった。私はUbuntuを使用していますが、おそらく両方のオペレーティングシステムに影響します。 – Steve

答えて

-1

いくつのCPU /コアですか?あなたが持っているものがスレッディングなしで100%稼働しているなら、何も得られません。 leastq()がスレッドセーフではなく、使用しているコンピュータの100%を使用していない場合は、コアごとに1つのプログラムインスタンスを実行し、インスタンスをファイルシステムに同期させることができます。

+0

リサーチマシンには8つのCPUがあります。私が100%で動いていると何も得られないと言う理由は分かりません。上記の例を試したところ、コードはSystemErrorを投げる前に少し動いていましたが、その間にCPU使用率は約400%でした。提案したソリューションを使用することを考えていましたが、現時点では価値があるよりも面倒かもしれません。あなたの投稿をありがとう。 – Steve

2

スレッドの代わりにプロセスを使用すると、プログラムがスレッドセーフであるかどうかにかかわらず効果があります。もちろん、それが速いかどうかは、問題を解決するのにかかった時間がオーバーヘッドよりも大きいかどうかによって決まります。

プロセスを使用すると、必要なすべてのデータを設定する際にいくつかの追加の手間が必要になる場合があります。しかし、multiprocessingモジュールはほとんどの作業を処理するので、あまりにも困難ではありません。

関連する問題