通过BIOS还是内核来关闭HyperThread?

这些禁用超线程的情况之间是否有性能差异?哪种是最好的,为什么?

  • 在BIOS中禁用超线程
  • 使用noht内核参数

启用超线程时,高度优化的并行应用程序运行较慢。
https://www.percona.com/blog/2015/01/15/hyper-threading-double-cpu-throughput/
我们的应用程序在4个核心上比4个核心+4个超线程快13%。

硬件信息:

  • 主板:Supermicro X9SPU-F
  • CPU:Intel(R) Xeon(R) CPU E3-1275 V2

这真是一个意想不到的结果。一个常见的错误是,在启用超线程时,将作业调度为例如4个核心而不是8个。确保你不要陷入这个陷阱。 - Michael Hampton
@MichaelHampton 如果我只使用4个线程,内核将在所有核心上调度这4个作业。另一方面,这也会发生在非实验条件下(例如16个线程),所以我认为线程限制不是一个好的解决方案。 - andras.tim
如果您有8个CPU线程,并安排了16个工作线程,那么您肯定会看到性能下降! - Michael Hampton
要澄清的是,优化的代码通常使用每个核心只有一个可用流水线的指令(如AVX系列)。当进程在这些指令上阻塞时,性能就会下降。请参考https://stackoverflow.com/questions/30330013/does-hyperthreading-have-trouble-with-avx - Paul
1个回答

首先,显而易见的区别是在现代Linux系统上,noht实际上不起作用。这个内核引导选项早已过时,并被maxcpus=所取代。 设置maxcpus=m,其中m是物理(非超线程)核心的数量,现在可以达到同样的效果。 在系统运行时,也可以通过sysfs启用或禁用单个CPU核心/超线程。 除此之外... 在BIOS中禁用超线程或在操作系统中禁用它对性能没有任何区别。 唯一的真正区别是,如果你在操作系统中禁用了核心/线程,那么你可以在以后重新启用它们而无需重新启动。如果你运行不同的计算任务,其中一些受益于超线程,而另一些则不受益,你可能会想这样做。