在Java中启用Intel超线程
-
21-12-2019 - |
题
我在四核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(每个核心的线程)。要确定您的处理器是否是超线程,或者您可以使用每个核心参数的线程。
不隶属于 StackOverflow