超线程如何影响并行化?

8

我在使用一台支持超线程的CPU上运行一个OpenMP代码。

如果其他条件相同,那么在不支持超线程的CPU上性能会如何变化?

我注意到无论我运行多少个线程,处理器利用率都达到了100%,但是改变线程数确实可以提高性能。这是怎么回事?

对于非英特尔的多线程CPU,情况是否相同?

1个回答

6
从超线程中获得的性能改进(如果有的话)很难预测。
超线程意味着如果一个线程因为任何原因而停顿,CPU将有另一个线程的指令池可以(尝试)执行。即使没有实际的停顿,如果调度使用不同执行资源的两个线程,那么两者的指令可以同时在同一个内核上执行。因此,例如,如果代码严重依赖于主存储器延迟(例如,无法预测的读取模式没有预取),超线程可能会大大提高性能。
另一方面,如果代码通过仔细使用缓存、预取等方式来覆盖延迟,则可能对超线程几乎没有任何收益。特别是对于不尝试在其线程调度中考虑超线程的老操作系统,额外的线程实际上可能会导致额外的上下文切换,从而降低整体执行速度。
假设您从完全单线程的代码开始,然后添加一些OpenMP指令,根据我自己的经验,超线程通常可以将性能提高约10%左右。如果代码几乎不进行任何预取或类似的尝试,则大多数(如果不是全部)优势几乎立即消失。

我刚刚发现你可以在BIOS中禁用超线程。这是你确定改进的方式吗? - roro
@roro:我已经进行了测试,通过在BIOS中禁用超线程,并手动限制线程数为我知道的可用物理核心数,并手动调整线程亲和性。 - Jerry Coffin
我同意HT的性能提升很难预测。然而,在出现停顿之前,并不会使用所有执行资源。相反,执行资源(端口、缓存等)在超线程之间共享。因此,在同一时钟周期内,HT 1的add μop可以在Haswell端口0上执行,而HT 2的lea μop可以在端口5上执行。引用英特尔的话,“从微架构的角度来看,这意味着两个逻辑处理器的指令将同时持续执行并共享执行资源。” http://www.cs.virginia.edu/~mc2zk/cs451/vol6iss1_art01.pdf - Olsonist
我认为HT的目的是在执行资源级别上增加资源利用率。 - Olsonist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接