JavaでIntel HyperThreadingを有効にします
-
21-12-2019 - |
質問
クアッドコアIntel i7で実行されているマルチスレッドプログラムを持っています。Runtime.getRuntime.availableProcessors()
を実行すると8が得られ、私はこのCPUでハイパースレッドが利用可能であることを知っています。
しかしながら、スレッドを作成するとき、私のCPUレベルは4個のスレッドに対して100%(すなわちゼロ以外)であり、4個のスレッドは未使用であることを意味します。Javaでハイパースレッディングを有効にする方法はありますか?
解決
HyperThreadingは、最近のすべてのJVMがネイティブスレッドを使用するという事実によって有効になり、これはOS / CPU設定の設定です。
しかしながら、ハイパースレッドはあなたに追加のコアを与えないので、あなたが持っている4つのCPUの細かいタイムシェアを許可します。つまり、1つのスレッドが失速されている間に、メモリのページがキャッシュに飛行するのを待つこと、その後、他のスレッドが急降下してCPUの一部を利用することができます。それはより複雑なスケジューリング要件のためにCPUコアのサイズに約10%の余分な追加を追加し、すべてのアプリケーションに利益をもたらしません。
4つのスレッドで4つのCPUを最大限に引き出す場合は、ハイパースレッドがオンまたはオフになっています。それはただそれらのスレッドがブロックせずに、それらのスレッドが熱いていることを意味します。
Javaが4ではなく、Javaが8のコアCPUを報告する理由は、CPUが8コアにあることをJavaに指示するためです。 OSは、OSが8つのコアCPUであるかのようにスレッドをスケジュールするように言われているため、これはOSESへのハイパースレッドのサポートをはるかに簡単にしました。 OSは、スレッドの管理を実行することを実行し、HyperTheadingの内部動作の多くを忘れず、CPUはCPUの一部が利用可能になったときのアセンブリの低レベルスケジューリングを管理できます。
ベンチマークを使用することができるより詳細な議論
他のヒント
次のコマンドを使用してください
$ lscpu
.
出力を使用して、実際のコア数を決定し、ハイパースレッドが有効になっているかどうかを確認できます。
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 45
Stepping: 7
CPU MHz: 2399.995
BogoMIPS: 4799.35
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
.
実現できる実際の並列処理は(ソケット数)X(ソケットごとのコア)X(コアごとのスレッド)です。プロセッサがハイパースレッドかどうかを判断するか、コアパラメータごとにスレッドを使用できます。