2011-07-05 4 views
0

私は個々の基本モデルを開発しています。あなたが知る必要があるのは、個人が生まれ、再生し、死ぬことだけです。私はこれらのプロセスが起こっているのを見ることができるGUIを持っています。java並列化の問題 - 並列化は直列化と同じくらい遅い

私は8コアと16GB RAMを搭載したMac Proを持っています。

エラーバーなどを取得するためにシミュレーションを数回繰り返す必要があることを考慮して、メインクラスを実行して別のコアで別々のシミュレーションを実行することができました。シンプル。各並列シミュレーションは、他のシミュレーションの知識を持たないため、同期ブロックを必要としません。

mainメソッドを実行すると、メインクラスのコンストラクタが呼び出されます。これにより、他のオブジェクトが作成され、シミュレーションが開始されます。したがって、並列化するために、私はすべてメインクラスのコンストラクタと複数(よく8つのコア数)のシミュレーションを別々に呼び出す固定スレッドプールを作成しました。

ただし、シミュレーションを連続して実行しているかのように動作が遅いです。各シミュレーションのGUIのアニメーションは、同時に更新されるのではなく、順番に更新されます。

実際に、私がコマンドラインから同時に8回プログラムを実行した場合(そして、バックグラウンドに '&'を置くと)、はるかに速くなり、期待したように動作します。どちらが刺激的です!

シミュレーションの開始時に、個人に関するデータを読み込むためにいくつかのIO操作が実行されますが、開始時にのみ実行されます。

興味深いことに、「並列」プロセスによって作成される最初のオブジェクトは同じメモリアドレスで作成されましたが、それは問題ではないと思います。

java並行性ツールのパフォーマンスが不十分であるという洞察がある人は、なぜプログラムがシリアルで実行されているように見えるのですか?コマンドラインからmainメソッドを8回実行するだけでは、最も役に立ちます。

私は、Javaの並列化機能を信用していないと思っています。

乾杯

ジェームズ

 noOfProcessors = (byte)Runtime.getRuntime().availableProcessors(); 
     ExecutorService eservice = Executors.newFixedThreadPool(noOfProcessors); 

     List<Future> futuresList = new ArrayList<Future>(); 

     for(int i = 0; i < noOfProcessors; i++){ 
      futuresList.add(eservice.submit(new simulation())); 

     }//end for 

     for(Future future : futuresList){ 

      try{ 

       future.get(); 

      }catch(InterruptedException ex){ 
       Logger.getLogger(simPanel.class.getName()).log(Level.SEVERE, null, ex); 
       System.exit(1); 
      }catch(ExecutionException ex){ 
       Logger.getLogger(simPanel.class.getName()).log(Level.SEVERE, null, ex); 
       System.exit(1); 
      }//end try-catch 

     }//end for loop 
+0

私は考えることができる唯一のものは、各スレッドへのメモリ割り当てです - 私は最小と最大のヒープサイズを指定しますが、おそらくそれでは不十分です - おそらく各スレッドに制限されたメモリはシステムのボトルネックですか? –

+0

GUIの何かが同期を引き起こしている可能性はありますか?つまり、Swingイベントのディスパッチスレッドや何か不思議な部分でシミュレーション全体が実行されていますか?アプリのGUI部分を無効にして、それを排除できますか? – overthink

答えて

0

Javaのエグゼキュークラスとあまり慣れていない一方で、シリアルの行動は、あなたのスレッドプールは、同じプロセッサ上のすべてのスレッドを実行していることを示していると思われます。おそらく、JVMがスレッドをどのように扱うのかと関係がありますか?とにかく、Javaで別々のプロセスを作成して、違いがあるかどうかを確認してください。