質問

クアッドコア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(コアごとのスレッド)です。プロセッサがハイパースレッドかどうかを判断するか、コアパラメータごとにスレッドを使用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top