在支持超线程的四核CPU上运行的单CPU程序

时间:2012-05-22 20:10:59

标签: hyperthreading

我是统计模式识别的研究员,我经常运行运行很多天的模拟。我正在使用Linux 3.2.0-24-generic运行Ubuntu 12.04,据我所知,它支持多核和超线程。使用带有HTT的英特尔酷睿i7 Sandy Bridge Quadcore,我经常同时运行4次模拟(需要很长时间的程序)。在我提出问题之前,我已经(我想)知道了这些事情。

  • 我的操作系统(Ubuntu 12.04)由于超线程而检测到8个CPU。
  • 我的操作系统中的调度程序非常聪明,从不安排两个程序在属于同一物理内核的两个逻辑(虚拟)内核上运行,因为操作系统支持SMP(同步多线程)。
  • 我已阅读有关超线程的维基百科页面。
  • 我已阅读Sandy Bridge上的HowStuffWorks页面。

好的,我的问题如下。当我在我的计算机上同时运行4个模拟(程序)时,它们每个都运行在一个单独的物理核心上。但是,由于超线程,每个物理核心被分成两个逻辑核心。因此,每个物理内核是否只使用其全部容量的一半来运行我的每个模拟?

非常感谢您提前。如果我的问题的任何部分不清楚,请告诉我。

4 个答案:

答案 0 :(得分:15)

这个答案可能已经很晚了,但是我发现没有人能够准确地描述引擎盖下发生的事情。

要回答你的问题,不,一个线程不会使用半个核心。 一个线程一次可以在内核中工作,但是一个线程可以使整个核心处理能力饱和。

假设线程1和线程2属于核心#0。线程1可以使整个内核的处理能力饱和,而线程2则等待另一个线程结束其执行。这是一个序列化的执行,而不是并行。

乍一看,看起来额外的线程毫无用处。我的意思是核心可以同时处理1个线程吗?

正确,但由于两个重要因素,有些情况下核心实际上是空闲的:

  • 缓存未命中
  • 分支错误预测

缓存未命中

当它收到任务时,CPU在自己的缓存中搜索它需要使用的内存地址。在许多情况下,存储器数据是如此分散,以至于在物理上不可能将所有所需的地址范围保持在高速缓存内(因为高速缓存确实具有有限的容量)。

当CPU在缓存中找不到它需要的内容时,它必须访问RAM。 RAM本身速度很快,但与CPU的片上高速缓存相比却相形见绌。 RAM的延迟是这里的主要问题。

在访问RAM时,核心停滞不前。它没有做任何事情。这是不明显的,因为所有这些组件无论如何都以一种荒谬的速度工作,你不会通过一些CPU加载软件注意到它,但它会叠加堆叠。一个缓存一个接一个地错过,另一个缓存突然阻碍了整体性能。 这是第二个线程发挥作用的地方。当核心停止等待数据时,第二个线程进入以保持核心忙。因此,您主要否定核心档位的性能影响。

我之所以这么说主要是因为如果发生另一次缓存未命中,第二个线程也可以停止核心,但是2个线程连续丢失缓存而不是1个线程的可能性要低得多。

分支机构错误预测

分支预测是指具有多个可能结果的代码路径。最基本的分支代码是if语句。 现代CPU具有嵌入其微码中的分支预测算法,其试图预测一段代码的执行路径。这些预测变量实际上非常复杂,虽然我没有关于预测率的可靠数据,但我记得有一篇文章回顾说英特尔的Sandy Bridge架构平均成功的分支预测率超过90%。

当CPU命中一段分支代码时,它实际上选择一条路径(预测器认为是正确的路径)并执行它。同时,核心的另一部分评估分支表达式以查看分支预测器是否确实正确。这称为推测执行。 这类似于2个不同的线程:一个评估表达式,另一个预先执行一个可能的路径。

从这里我们有两种可能的情况:

  1. 预测器是正确的。执行从正在执行代码路径时已经执行的推测分支继续执行。
  2. 预测器错了。处理错误分支的整个管道必须被刷新并从正确的分支重新开始。 或者,现成的线程可以进入并简单执行,同时解决由错误预测引起的混乱。这是超线程的第二次使用。 平均分支预测可以大大加快执行速度,因为它具有很高的成功率。但是,当预测错误时,性能确实会受到严重影响。
  3. 分支预测不是性能下降的主要因素,因为正如我所说,正确的预测率非常高。 但缓存未命中是一个问题,并且在某些情况下仍将是一个问题。

    根据我的经验,超线程确实有助于3D渲染(我作为业余爱好)。我注意到20-30%的改进取决于场景的大小和所需的材料/纹理。巨大的场景使用大量的RAM使得缓存未命中的可能性更大。超线程有助于克服这些失误。

答案 1 :(得分:4)

由于您在Linux内核上运行,因此您很幸运,因为调度程序足够智能,可以确保您的任务在物理内核之间分配。

Linux在内核2.4.17(参考:http://kerneltrap.org/node/391

中变得过度了解

请注意,引用来自旧的O(1)调度程序。 Linux现在使用内核2.6.23中引入的CFS调度算法,应该更好。

但正如已经建议的那样,您可以通过在BIOS中禁用超线程来进行实验,并查看在启用或不启用超线程的情况下,您的特定工作负载是运行得更快还是更慢。如果您启动8个任务而不是4个任务,您可能会发现8个超线程任务的总执行时间比使用4个任务的两个单独运行要快,但最好的办法是进行实验。祝你好运!

答案 2 :(得分:1)

如果您真的只想要4个专用内核,那么您应该可以在BIOS页面中禁用超线程。此外,这部分我不太清楚,我相信处理器足够聪明,如果第二个逻辑核心空闲,就可以在单个线程上做更多的工作。

答案 3 :(得分:0)

不,这不完全正确。超线程核心不是两个核心。有些东西可以并行运行,但不如两个独立的核心运行。