2017-02-09 8 views
2

これは、私が念頭に置いている特定の実装に関する一般的な質問です。共有メモリ環境でGIL内部で使用するように設計されたPythonルーチンを使用するのが安全かどうかについてです。具体的には、cython関数内の大きな配列にscipy.optimize.curve_fitを使用します。GIL以外のscipyルーチンの使用

データは、2d numpyの配列(例えば、float)で表され、軸はフィットし、もう一方はパラレル化されます。次に、GILをリリースして、cython.parallel.prangeというデータをループしてみたいと思います(私のすべてのコアが一度に合うようにすることができます)。

私が予見できる主な問題は、curve_fitが「適切な位置」で動作しないことです。パラメータの適合値(およびオプションでそれらの共分散行列)を返し、ある時点でそのメモリを割り当てる必要があります。 (もちろん、私はルーチンが実行する中間メモリ割り当てについても全く知りません)。これがGILの外でどのように同時に動作するかについては心配しています。

答えが「それはうまくいっているはずです」と思うかもしれませんが、私は何を目にするべきかを知りたいと思っています。私はこの質問が他のルーチンと同様のものであることを認識していますが、/numpyルーティンがありますが、これはPythonのC環境のcythonスコープ内にある点で異なっています。

ご協力いただきありがとうございます。

+2

いくつかのコンパイル 'numpy'と' scipy'コードは 'なしgil'マクロでマークされたコードブロックを持っています。 'curve_fit'コードを調べることをお勧めします。 Pythonとコンパイルされたコードが混在しているかもしれません。おそらく外部のライブラリへの呼び出しさえあります。 – hpaulj

+0

@ hpauljのコメントに追加するには:scipyコードがGILを内部的にリリースする場合、GILを自分でリリースしなくても、並列ループからいくらか利益が得られます。 _However_それがPythonオブジェクトを返すなら、それはCythonがスレッドローカルではないことが判明しているので注意してください。 – DavidW

+0

もう1つのコメント: 'curve_fit'は、ユーザ提供関数(GILが必要)を呼び出すためにほとんどの時間を費やす可能性が高いので、利益はおそらく小さくなるでしょう – DavidW

答えて

3

安全ではありません。 CPythonがGILなしでこの種のコードを安全に実行できるならば、最初はGILを持っていないでしょう。

2

Parallel Programming in SciPyで興味のある議論を見つけることができます。

[私はこれを、単にコメントを掲載しているだろうが、私は必要な評判を欠いている。]

関連する問題