我在统计模式识别的研究员,我经常运行多日运行模拟。 我运行Ubuntu 12.04使用Linux 3.2.0-24泛型,其中,按照我的理解,支持多核和超线程技术。 随着我的英特尔酷睿i7 Sandy Bridge的四核与HTT,我经常运行在同一时间4个模拟(即需要很长的时间程序)。 之前,我问我的问题,这里是我已经(我想)知道的事情。
- 我的OS(12.04的Ubuntu)检测到8个CPU,由于超线程。
- 在我的OS调度程序是足够聪明从未安排两个方案对属于同一个物理内核的两个逻辑(虚拟)内核上运行,因为操作系统支持SMP(同步多线程)。
- 我已阅读超线程的维基百科页面。
- 我已阅读的Sandy Bridge博闻网的页面。
OK,我的问题如下。 当我在同一时间运行在我的电脑上模拟4(程序),它们分别位于不同的物理内核上运行。 然而,由于超线程,每个物理芯被分成两个逻辑核心。 所以,这是真的,每个物理内核只使用其满负荷运行我的每一个模拟的一半?
预先感谢您非常多。 如果我的问题的任何一部分不清晰,请让我知道。
这个答案可能是晚了,但我看到没有人提供什么引擎盖下事情的准确描述。
要回答你的问题,没有,一个线程不会使用半个核心。 一个线程可以同时为核心的内部工作,但一个线程可以饱和芯整体处理能力。
假设线程1和线程2属于核心#0。 线程1可以饱和整个核心的处理能力,而线程2等待另一个线程来结束它的运行。 这是一个串行执行,不平行。
一目了然,它看起来像额外的线程是没用的。 我的意思是核心可以同时处理权1个线程?
正确的,但也有其核心实际上是空转,因为2个重要因素的情况:
高速缓存未命中
当它收到一个任务,其自己的高速缓存内存在CPU内部的搜索解决它需要的工作。 在许多情况下存储数据是如此分散,这在物理上是不可能使所有需要的地址范围的缓存中(由于高速缓存确实有能力有限)。
当CPU没有找到它所需要的缓存中,它具有访问RAM。 该RAM本身是快,但相比相形见绌到CPU的片上高速缓存。 该内存的延迟时间是在这里的主要问题。
虽然被访问的RAM,核心是停滞不前。 它没有做任何事情。 这不是明显的,因为所有这些组件在一个荒谬的速度工作,无论如何,你不会通过一些CPU的负载软件注意到它,但它相加栈。 接连而另一个缓存缺失阻碍了整体性能相当明显。 这是第二个线程开始发挥作用。 而核心是停止以等待数据,第二个线程中移动以保持核心忙碌。 因此,你大多是否定的核心摊位的性能影响。
我说主要是因为第二个线程也可以搪塞的核心,如果另一个高速缓存未命中发生,但2个线程缺少连续的,而不是1个线程缓存的可能性要低得多。
分支预测错误
分支预测是当你有一个以上的可能结果的代码路径。 最基本的分支代码将是一个if
语句。 现代CPU具有嵌入到其微码分支预测算法,该算法试图预测的一段代码的执行路径。 这些预测实际上是相当复杂的,虽然我没有在预测率的可靠数据,我记得读一些文章而回,指出英特尔的Sandy Bridge架构拥有超过90%的平均成功的分支预测率。
当CPU击中一块分支代码的,它实际上选择一个路径并执行它(其中,所述预测认为是正确的路径)。 同时,核心的另一部分评估分支表现,看是否分支预测确实是正确与否。 这就是所谓的推测执行。 此工作方式类似于2个不同线程:一个计算表达式,并且执行其他的预先可能路径之一。
从这里我们有2种可能的方案:
- 该预测是正确的。 执行从其中同时代码路径正在定夺已经正在执行的推测转移正常继续。
- 该预测是错误的。 整个管道这是处理错误的分支必须被刷新,从正确的分支开始。 或者,一应俱全线程可以进来,简单地执行而造成的错误预测的混乱得到解决。 这是第二次使用超线程。 平均速度高达执行显着,因为它的成功率非常高分支预测。 但是性能确实相当招致点球时的预测是错误的。
分支预测是没有性能下降的一个主要因素,因为,就像我说的,正确的预测率是相当高的。 但是,高速缓存未命中的问题,将继续在某些情况下的一个问题。
从我的经验超线程确实帮助与3D渲染相当多的(我做的业余爱好)。 我注意到根据场景和材料/所需的纹理大小的20-30%提高。 巨大的场景中使用RAM缓存制作大量的漏检可能性更大。 超线程技术有很大帮助克服这些失误。
因为你是在Linux内核上运行你很幸运,因为调度程序是足够聪明,以确保您的任务是你的物理内核之间的分歧。
Linux的成为hyperthredding知道在内核2.4.17(参考: http://kerneltrap.org/node/391 )
注意,基准是从旧O(1)调度器。 Linux现在使用这是在内核2.6.23引入,应该会更好的CFS调度算法。
但是,正如已经建议您可以通过禁用BIOS中的超线程技术试验,看看你的特定工作负载带或不带超线程运行速度更快或更慢。 如果你开始8级的任务,而不是4,你可能会发现执行时间上的超线程8个任务总量是4个任务的速度比两个独立运行,但再次做的最好的事情就是进行实验。 祝好运!
If you are really want just 4 dedicated cores, you should be able to disable hyperthreading in your BIOS page. Also, and this part I'm less clear on, I believe that the processor is smart enough to do more work on a single thread if its second logical core is idle.
不,这是不完全正确。 在超线程核心不是两个核心。 有些东西可以并行运行,但不如在两个独立的内核。