我在四核Intel i7上运行了一个多线程程序。当我执行生成的icodetagcode时,我得到8,我知道这个CPU上有超线程。

但是,当我创建线程时,4个线程的CPU级别为100%(即非零),这意味着未使用4个线程。有没有办法在Java中启用超线程?

有帮助吗?

解决方案

超线程是通过所有现代JVM使用本机线程的事实使能,因此这是OS / CPU配置设置。

然而,超线程不给您额外的核心,它允许您拥有的四个CPU的细粒度计时器。也就是说,虽然一个线程被停滞,但是,请等待将存储器的页面捕获到缓存中,然后另一个线程可以俯冲并使用CPU的部分。由于更复杂的调度要求,它为CPU内核的大小增加了大约10%的额外额外额外的10%,并且不喜欢所有应用程序。

如果您已使用四个线程最多为四个CPU,则可以使用超线程打开或关闭。这只是意味着这些线程运行很热,而不会堵塞。

Java报告8核心CPU的原因,而不是4是因为OS告诉Java CPU有8个核心。操作系统认为,由于操作系统已被告知要安排线程,因为它是一个8个核心CPU,这使得支持超线程到iSS更简单。操作系统携带以前的管理线程,忘记了超线程的大部分内部工作,并允许CPU管理程序集的低级调度,以及当CPU的某些部分可用时。

更详细的讨论,使用基准可以读取这里 < / p>

其他提示

使用以下命令

$ 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