1

マンデルブロ画像を描画するJavaプログラムを作成しました。面白くするために、各ピクセルの色を計算するforループを2つに分割しました。各半分はスレッドとして実行されるため、タスクが並列化されます。2コア1CPUシステムでは、2スレッドアプローチを使用した場合と1つのメインスレッドのみを使用した場合のパフォーマンスはほぼ2倍になります。私の質問は、2つのデュアルコアプロセッサシステムに関するものですが、並列化されたタスクは、1つのプロセッサで2つのコアを利用するだけでなく、異なるプロセッサ間で分割されますか?前者のシナリオは、マザーボードのワイヤを介した2つのCPU間の通信の遅延のために、後者のシナリオよりも遅くなると思います。

何か案は?

ありがとう

4

2 に答える 2

2

スレッドが実行されているプロセッサ(またはコア)は、オペレーティングシステムに依存するものです。OSは一般的にマルチCPUシステムとマルチコアシステムを大きく区別しないと思います。そのため、4コアのシングルプロシージャシステムのプログラムは、2つのデュアルコアプロセッサを搭載したシステムと同じようにスケジュールされます。

一般的に、私の経験では、スレッドは使用可能なすべてのプロセッサにほぼ均等に分散されます。したがって、4コアのシステムで実行されているプログラムのCPUグラフを見ると、各コアで約25%の使用率が見られます。ほとんどのオペレーティングシステムで特定のCPU/コアにスレッドアフィニティを設定できますが、その機能がJavaで利用できるかどうかはわかりません。

于 2010-12-22T18:00:28.063 に答える
1

私があなたの説明を正しく理解していれば、あなたは2つのスレッドしか持っていません。2つのスレッドで同時に4つのコアを利用することはできません。理想的には、少なくともシステム内のコアと同じ数のスレッドが必要です。マンデルブロ集合のコスト分布が不均一である場合(セット内のポイントの計算は、セット外のポイントよりもコストが高くなります)、最適なスレッド数が多くなる可能性があります(コア数の4倍を試してみます)。

各ピクセルの色を計算するforループを2つに分割しました

ここで何を意味するのかわかりませんが、おそらく最も外側のループ(Y座標を繰り返す)をスレッド間で分割する必要があります。これにより、2つ以上のCPUが同じキャッシュラインをめぐって競合する可能性が低くなります(画像が行優先の順序でレンダリングされると仮定します)。


注:Runtime.getRuntime().availableProcessorsシステムに搭載されているコアの数がわかります。

于 2010-12-22T19:40:17.023 に答える