私は python を使用して理想的なガス シミュレーターを作成しています。現在、衝突検出はプログラムの中で最も集中的な部分です。ただし、現時点では、8 つのコアのうちの 1 つしか使用していません。(i7 3770 @ 3.4GHz を使用しています)
最小限のグーグル検索の後、python(2.7.4)のマルチプロセッシングモジュールが見つかりました。そして、私はそれを試しました。少し考えてみると、実際に並行して実行できるのはここだけであることがわかりました。ここでは、すべてのパーティクルをループして衝突を検出します。
for ball in self.Objects:
if not foo == ball:
foo.CollideBall(ball, self.InternalTimestep)
ここで foo は、他のすべての粒子に対してテストしている粒子です。だから私はこれをやってみました:
for ball in self.Objects:
if not foo == ball:
p = multiprocessing.Process(target=foo.CollideBall, args=(ball, self.InternalTimestep))
p.start()
プログラムの実行速度は少し速くなりましたが、まだ 1.5 コアしか使用していません。残りはアイドル状態であり、衝突も検出されていません。一度に作成するプロセスが多すぎると (コアの数よりも多く)、バックログが発生する (これは 196 個のパーティクルのループです) と読んだことがあります。まだすべてのコアを使用していないという事実を説明していません!
とにかく遅すぎる!!!では、8 つのプロセスを作成し、すでに実行中のプロセスが 8 つ未満の場合にのみ新しいプロセスを作成する方法はありますか? それは私の問題を解決しますか?すべてのコアを使用するにはどうすればよいですか / このコードがまだないのはなぜですか?
昨日、Python でのマルチプロセッシングについて知ったばかりなので、答えを詳しく説明する必要があるのではないかと心配しています。
助けてくれてありがとう!
- -編集 - -
Carson に応えて、p.start の直後に p.join を追加しようとしたところ、プログラムの速度が低下しました。サイクルごとに0.2秒かかる代わりに、サイクルごとに24秒かかります!