2011-10-24 6 views
1

私は、ループ内で数百万回以上呼び出した計算機能を持つモンテカルロシミュレータを使用しています。これを高速化するために、私はシミュレータへの複数の並列スレッド呼び出しに分割したいと思います。すなわち、もし私がそれを100万回実行したいのであれば、それを4〜25万回の並列実行に分割してください。各スレッドが同じ変数名を使用しているので、どのようにこれを処理して衝突がないのでしょうか?異なる名前の変数を持つシミュレータの4つの別バージョンを作成する必要がありますか?Pythonでの並列起動による関数の変数の扱い

私はPythonスレッドモジュールを使用してバージョンを書き始めましたが、まだ変数に問題があることは確実です。

提案がありますか?

お時間をいただきありがとうございます。

カイル

+0

私はシミュレーションが何であるか本当に分かりませんが、各反復で1つのリスト項目を使用している場合、オフセットを使用して分割することができます。たとえば、スレッド1:f(m [x])、スレッドスレッドx:= n 'の数だけ「x」をインクリメントする。また、[cython](http://cython.org/)の使用を検討してください。 – rplnt

答えて

2

あなたのコードでは、純粋なPythonのです、あなたはおそらく原因global interpreter lockにあなたのコードをスピードアップしませんスレッド、CPythonのを使用している場合。おそらくあなたが探しているのはmultiprocessing module、具体的にはPool.map() methodです。

mulitprocessingを使用するということは、別々のスレッドではなく、別々のプロセスを使用することを意味するので、ロックのようなものはそれほど問題になりません。

NumPyを使用してコードをベクトル化するか、内部ループをCやCythonなどの効率的なコンパイル言語で記述すると、4つのコアに並列化するよりもはるかに高速化できます。

+0

NumPyに変換するとスピードアップが得られることに同意します。しかし、並列化を追加すると、スピードアップも大幅に向上するはずです。両方を使用しない理由はありません! –

+0

私は標準の純粋なPythonを使用しているので、CPythonとも呼ばれていると思います。 私はNumPyをいつでも使用できるように準備していますが、ベクトル化について少しは読んでいますが、まだ完全に理解していません。私のシミュレーションは基本的に、物理的にはかなり直線的(すなわち、次の方程式は前のものに依存している)な計算を15回行っているので、これらの依存関係を全て解くことができるとは思いません。 私はCythonについて聞いたことがありませんが、それとPool.mapを読み始めるでしょう。 アドバイスをいただきありがとうございます。私はそれがどのように機能するかお知らせいたします。 –

+0

私はそれを得た! 私はpool.map()メソッドを使用しませんでしたが、私の解決策は提案されているようにマルチプロセッシングを使用していました。ロードアップしたいコアの数に基づいて、マルチプロセッシングの修正バージョンであるクラスへの呼び出しを行うだけで、私が望むものを得ることができます。私は完全なマルチスレッド版を書くことによって、そしてマルチプロセッシングがそれをどのように解決するかによって、GILの不幸を完全に学びました。 アドバイスありがとうございます! –

関連する問題