在Java中启用Intel超线程

我有一个在四核Intel i7上运行的multithreading程序。 当我执行Runtime.getRuntime.availableProcessors() ,我得到8,我知道在这个CPU上可以使用超线程。

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

所有现代JVM都使用本机线程,因此实现了超线程,因此这是一个OS / CPU配置设置。

但是,超线程不会为您提供额外的内核,它允许您拥有的四个cpu的细粒度分时。 也就是说,当一个线程停止时,比如等待一页内存飞入缓存,然后另一个线程可以俯冲并利用CPU的一部分。 由于更复杂的调度要求,它增加了大约10%的额外CPU大小,并且不会使所有应用程序受益。

如果你用四个线程最大化了四个cpus,那么打开或关闭超线程就可以了。 它只是意味着那些线程运行热,没有阻塞太多。

Java报告8核CPU而不是4核的原因是因为操作系统告诉Java CPU有8个核心。 操作系统认为,由于操作系统已被告知调度线程就好像它是一个8核CPU,这使得对操作系统的超线程的支持更加简单。 操作系统像以前一样继续管理线程,忽略了超线程的大部分内部工作,并且当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(每个内核的线程数)。 要确定您的处理器是否是超线程,您可以使用Threads per core参数。