1

並列 Java プログラムを作成しました。通常は次のように機能します。

  • 入力String inputとして を受け取ります。
  • 次に、均等にinputカットされます。String inputs[numThreads]
  • それぞれinputs[i]が処理に割り当てられthread_i、生成されresults[i]ます。
  • すべての作業スレッドが終了すると、mainスレッドは を にマージresults[i]resultます。

10 コア (物理コア) マシンでのパフォーマンス データは次のとおりです。

Threads#    1 thread    2 threads   4 threads   8 threads   10 threads
Time(ms)       78           41          28          21           21

ノート:

  • JVM のウォームアップ時間がなくなりました (最初の 50 回の実行)。
  • 時間には、スレッドの開始/参加時間は含まれません。

スレッド数が 8 を超えると、メモリ帯域幅がボトルネックになるようです。

この場合、パフォーマンスをさらに向上させるにはどうすればよいでしょうか。並列 Java プログラムに設計上の問題はありますか?

このスケーラビリティの問題の原因を調べるために、(無意味な計算) ループをprocess(inputs[i])メソッドに挿入しました。新しいデータは次のとおりです。

Threads#    1 thread      10 threads
Time(ms)     41000          4330

新しいデータは、10 スレッドの優れたスケーラビリティを示しています。これは、元の (無意味なループのない) にはメモリの問題があることを示しているため、そのスケーラビリティは 8 スレッドに制限されています。

しかし、とにかくこの問題を回避するには、データを各コアのローカル キャッシュに事前にロードするか、バッチでロードしますか?

4

3 に答える 3

6

ここでメモリ帯域幅の問題が発生する可能性は低いと思います。ランタイムが非常に短い可能性が高いため、0 に近づくと、ほとんどの場合、スレッドの起動/シャットダウンまたはホットスワップ コンパイラの最適化サイクルのタイミングを計っているだけです。非常に短時間実行される Java タスクから関連するタイミング情報を取得することは、ほとんど無意味です。最初に実行される hotswap コンパイラやその他の最適化は、多くの場合、クラスの初期段階で CPU 使用率を支配します。当社の本番アプリケーションは、数分間のライブ サービス操作の後にのみ安定します。

より多くの入力データを追加するか、同じ結果を何度も計算することで実行時間を大幅に増やすことができれば、最適なスレッド数についてより良いアイデアを得ることができます。

編集:

1 スレッドと 10 スレッドのタイミングを長期間にわたって追加したので、タイミングがかなり直線的であるように見えるため、何にも拘束されていないように見えますが、スレッドのオーバーヘッドがいくらかあります。41000/10 = 4100 対 10 スレッドの 4330。

CPU バウンドのアプリケーションに対してスレッド化ができることのかなり良いデモンストレーションです。:-)

于 2012-08-29T22:18:13.537 に答える
2

論理コアはいくつありますか?

考えてみてください - 1 つのコアと 100 のスレッドがあるとします。実行する作業は同じで、複数のコアに分散することはできませんが、スレッド切り替えのオーバーヘッドが非常に大きくなります。

ここで、4 つのコアと 4 つのスレッドがあるとします。他のボトルネックがないと仮定すると、計算時間は 4 分の 1 になります。

ここで、4 つのコアと 8 つのスレッドがあるとします。計算時間は約 4 分の 1 になりますが、スレッド スワップのオーバーヘッドがいくらか追加されます。

ハイパースレッディングに注意してください。コンピューティング タスクの性質に応じて、ハイパースレッディングが役立つ場合と妨げになる場合があります。

于 2012-08-29T22:39:07.603 に答える
0

あなたの損失は、スレッドの切り替えにかかっていると思います。コアよりも多くのスレッドがあり、遅いプロセスをブロックする必要はありません。そのため、それらはスイッチインされ、少しの作業を行ってから、別のスレッドをスイッチインするためにスイッチアウトされます。あなたがしているように見えることは、私は本能的にスレッドの数を 8 に制限していたでしょう (OS 用に 2 つのコアを残してください)。パフォーマンスの数値は私を裏付けているようです。

于 2012-08-29T22:34:33.573 に答える