これは、私が念頭に置いている特定の実装に関する一般的な質問です。共有メモリ環境でGIL内部で使用するように設計されたPythonルーチンを使用するのが安全かどうかについてです。具体的には、cython
関数内の大きな配列にscipy.optimize.curve_fit
を使用します。GIL以外のscipyルーチンの使用
データは、2d numpy
の配列(例えば、float)で表され、軸はフィットし、もう一方はパラレル化されます。次に、GILをリリースして、cython.parallel.prange
というデータをループしてみたいと思います(私のすべてのコアが一度に合うようにすることができます)。
私が予見できる主な問題は、curve_fit
が「適切な位置」で動作しないことです。パラメータの適合値(およびオプションでそれらの共分散行列)を返し、ある時点でそのメモリを割り当てる必要があります。 (もちろん、私はルーチンが実行する中間メモリ割り当てについても全く知りません)。これがGILの外でどのように同時に動作するかについては心配しています。
答えが「それはうまくいっているはずです」と思うかもしれませんが、私は何を目にするべきかを知りたいと思っています。私はこの質問が他のルーチンと同様のものであることを認識していますが、/numpy
ルーティンがありますが、これはPythonのC環境のcython
スコープ内にある点で異なっています。
ご協力いただきありがとうございます。
いくつかのコンパイル 'numpy'と' scipy'コードは 'なしgil'マクロでマークされたコードブロックを持っています。 'curve_fit'コードを調べることをお勧めします。 Pythonとコンパイルされたコードが混在しているかもしれません。おそらく外部のライブラリへの呼び出しさえあります。 – hpaulj
@ hpauljのコメントに追加するには:scipyコードがGILを内部的にリリースする場合、GILを自分でリリースしなくても、並列ループからいくらか利益が得られます。 _However_それがPythonオブジェクトを返すなら、それはCythonがスレッドローカルではないことが判明しているので注意してください。 – DavidW
もう1つのコメント: 'curve_fit'は、ユーザ提供関数(GILが必要)を呼び出すためにほとんどの時間を費やす可能性が高いので、利益はおそらく小さくなるでしょう – DavidW