5

クアッドコア Intel i7 でマルチスレッド プログラムを実行しています。を実行するRuntime.getRuntime.availableProcessors()と 8 になり、この CPU でハイパースレッディングが利用できることがわかります。

しかし、スレッドを作成すると、CPU レベルが 4 つのスレッドで 100% (ゼロ以外) になり、4 つのスレッドが使用されていません。Java でハイパースレッディングを有効にする方法はありますか?

4

2 に答える 2

8

ハイパースレッディングは、最新のすべての JVM がネイティブ スレッドを使用するという事実によって有効になります。したがって、これは OS/CPU 構成設定です。

ただし、ハイパースレッディングは追加のコアを提供しません。使用している 4 つの CPU のきめ細かなタイムシェアを許可します。つまり、1 つのスレッドが停止している間、たとえばメモリのページがキャッシュに読み込まれるのを待っている間に、別のスレッドが急襲して CPU の一部を利用することができます。より複雑なスケジューリング要件により、CPU コアのサイズが約 10% 増加し、すべてのアプリケーションにメリットがあるわけではありません。

4 つのスレッドで 4 つの CPU を使い果たした場合は、ハイパースレッディングをオンまたはオフにすることで可能です。これは、これらのスレッドがあまりブロックされずに熱くなっていることを意味します。

Java が 4 コアではなく 8 コアの CPU を報告する理由は、OS が Java に CPU に 8 コアがあることを伝えるためです。OS は、OS が 8 コア CPU であるかのようにスレッドをスケジュールするように指示されているため、OS へのハイパースレッディングのサポートの追加がはるかに簡単になったと考えています。OS は以前と同じようにスレッドを管理し続け、ハイパースレッディングの内部動作の多くを無視し、CPU の一部が使用可能になったときにアセンブリの低レベルのスケジューリングを CPU に管理させます。

ベンチマークを使用したより詳細な議論は、ここで読むことができます

于 2014-07-30T16:06:18.610 に答える