gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:30:32 26 4
gpt4 key购买 nike

我是一名统计模式识别的研究人员,我经常运行运行很多天的模拟。我正在运行带有 Linux 3.2.0-24-generic 的 Ubuntu 12.04,据我所知,它支持多核和超线程。使用带 HTT 的 Intel Core i7 Sandy Bridge Quadcore,我经常同时运行 4 个模拟(需要很长时间的程序)。在我提出问题之前,以下是我已经(认为我)知道的事情。

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

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

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

    最佳答案

    这个答案可能晚了,但我看到没有人准确描述幕后发生的事情。

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

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

    乍一看,那额外的线程似乎没有用。我的意思是核心可以一次处理 1 个线程,对吗?

    正确,但在某些情况下,由于 2 个重要因素,内核实际上处于空闲状态:

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

  • 缓存未命中

    当它接收到一个任务时,CPU 在它自己的缓存中搜索它需要使用的内存地址。在许多情况下,内存数据非常分散,以至于在物理上不可能将所有必需的地址范围保存在缓存中(因为缓存的容量确实有限)。

    当 CPU 在缓存中找不到它需要的东西时,它必须访问 RAM。 RAM 本身速度很快,但与 CPU 的片上缓存相比,它显得苍白无力。 RAM 的延迟是这里的主要问题。

    在访问 RAM 时,内核停止。它什么都不做。这并不明显,因为无论如何所有这些组件都以荒谬的速度工作,并且您不会通过某些 CPU 负载软件注意到它,但它会叠加。一个接一个的缓存未命中,另一个非常明显地阻碍了整体性能。
    这是第二个线程发挥作用的地方。当内核停止等待数据时,第二个线程进入以保持内核忙碌。因此,您基本上否定了核心停顿对性能的影响。

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

    分支预测错误

    分支预测是指您的代码路径具有多个可能的结果。最基本的分支代码是 if陈述。
    现代 CPU 的微代码中嵌入了分支预测算法,这些算法试图预测一段代码的执行路径。这些预测器实际上非常复杂,虽然我没有关于预测率的可靠数据,但我确实记得前一段时间读过一些文章,指出英特尔的 Sandy Bridge 架构的平均成功分支预测率超过 90%。

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

    从这里我们有两种可能的情况:
  • 预测是正确的。执行通常从在决定代码路径时已经被执行的推测分支继续。
  • 预言家错了。处理错误分支的整个管道必须刷新并从正确的分支重新开始。
    或者,当由错误预测引起的困惑得到解决时,随时可用的线程可以进入并简单地执行。这是超线程的第二次使用。
    平均而言,分支预测可以大大加快执行速度,因为它具有非常高的成功率。但是当预测错误时,性能确实会受到相当大的影响。

  • 分支预测不是性能下降的主要因素,因为正如我所说,正确预测率非常高。
    但是缓存未命中是一个问题,并且在某些情况下仍将是一个问题。

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

    关于hyperthreading - 在支持超线程的四核 CPU 上运行的单 CPU 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10709442/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com