2016-05-11 6 views
-3

Javaでマルチスレッド(並列処理)に関する質問があります。実際に、私は2つのマンデルブロ集合を計算するプログラムを実現:Javaでのマルチスレッド計算

  1. 最初の起動Nスレッドを、各スレッドは、マンデルブロ(例:https://www.logre.eu/mediawiki/images/4/49/Mandelbrot_h_block.png)の高さの一部を計算します。

  2. 2番目のスレッドは、各スレッドがマンデルブロのピクセル行を計算するn個のスレッドのプールを起動します(例:https://www.logre.eu/mediawiki/images/f/f2/Mandelbrot_horizontal.png)。

私は2つのコアのマシン上の別のプロファイリングを行い、スレッドの数(n)は、コア数よりも大きい場合、最初のプログラムは、第二よりも高速である理由を私は理解していません。スレッドの数がコアの数よりも少ない場合、これは逆です。

誰でも手伝ってもらえますか?

注:このプログラムを計算するスレッドにも制限がありますか?

+2

これには必要なすべての詳細がありません。コードを見たり、それをどのようにプロファイルしたりすることなく、私たちはあなたが正しく正確にそれをしたことを知りません。タイミングを見ることなく、我々は違いがどれほど重要であるかを知らない。私達は 'n 'を知らない。 – weston

答えて

0

あなたはリンゴとオレンジを比較しています。 2つの異なる実装と、異なる数のスレッド。

マシンに搭載されているCPUコアより多くのスレッドを使用しないでください。 n >>個のCPUコアの場合、CPU使用率の大部分はスレッド間のコンテキスト切り替えに費やされます。

1

プール内のスレッドは、個々のスレッドと同じ量のメモリを消費しているため、ctx切り替えと、スレッドプールがアクティブなスレッドを作成/削除する方法が利点です。 コアを実行するよりもスレッド数が多い場合、プログラムはコンテキスト切り替えに時間がかかりすぎます。

2コアで1000スレッドと言えば(あたかもそうだが)、コンテキスト切り替えが多すぎると、スレッドプールのパフォーマンスが向上する。

私は、両方のケースで非常に多くのスレッドを作成しているわけではないと思います。その違いは注目に値しません。

違いが目立つ場合は、多少の情報を提供するためにコードを表示してみてください。

計算可能なスレッドの数は、別のpostで確認してください。

0

私は二つの理由

    のために、あなただけのデュアルコアマシン上でこれをテストする場合、コア数よりも小さいか大きいスレッドの数についていかなる主張をしようとしなければならないとは思いません
  • 第1に、2つのコアのみでは、ほぼすべてのマルチスレッドシステムがコアを持つスレッドよりも多くのスレッドを使用するため、このメトリックは無意味になります。

  • さらに重要なことに、コア数が異なるマシンでテストをしないと、コア数よりもスレッド数が多いか、2スレッドより多いか少ないか分かりません。

あなたは2つの全く異なるアルゴリズムを使用しています。1つは他のスレッドよりも多くのスレッドでスケーリングされ、クロスオーバーポイントは2つのスレッドで発生するようです。アルゴリズムの詳細を知らなければ、なぜこれが当てはまるかについては何も言えません。