超线程技术与超标量执行

8

想象一下一个CPU(或核心)是超标量的(具有多个执行单元),并且也支持超线程(SMT)。

为什么CPU实际可以并行执行的软件线程数量通常由它拥有的逻辑核数(即所谓的硬件线程)而不是它拥有的全部执行单元的数量来确定?
如果我理解正确,SMT实际上并没有使真正的并行执行成为可能,而是通过复制某些部分的CPU(存储体系结构状态但不包括主要执行资源的部分)使上下文切换变得更快/更高效。另一方面,超标量架构允许在每个时钟周期内真正同时执行多条指令,因为CPU具有多个执行单元,即多个并行流水线,每个流水线可以以真正并行的方式处理一个单独的线程。

因此,例如,如果一个CPU有2个核心,并且每个核心有2个执行单元,那么它的硬件并发性(它可以真正并行执行的线程数)不应该是4吗?为什么它的硬件并发性取决于逻辑核心的数量,而SMT实际上并没有使真正的并行执行成为可能呢?

1个回答

2
您不能只是将指令猛烈地塞进执行单元中。
如果想要一个2路SMT,您需要保持两个架构状态并提取两个指令流。
如果一家公司有100名开发人员但只有两个项目经理,则只能并行开发两个项目(但如果让项目经理每天或每隔一段时间切换项目,则可以同时开发更多项目)。
如果CPU只能从两个指令流中提取(仅保留两个线程上下文),则只能分配两个线程以并行执行。
但是,您可以进行时间分配并同时执行更多线程。
软件无法访问执行单元,这会导致循环论证(软件需要EU来执行,但EU需要软件来执行)。
CPU将尝试尽可能利用EU,利用乱序和假设任何可能的东西。
实际上,超线程只是一种使所有资源保持繁忙的方法(就像在项目经理很闲时与另一个项目经理共享开发人员一样)。
但是,如果所有尝试都失败了,EU未被使用,那么这个可能的工作单元就浪费了。

谢谢您的快速回答。您是否意味着EU不是完整的、独立的CPU执行流水线?遗憾的是,我一直没有找到一个清晰的解释,关于EU的确切含义,我阅读的来源说它既可以是单个内部单元(如ALU或FPU),也可以是一组内部组件(例如内部控制序列单元、寄存器、ALU + FPU等)。换句话说,是一个完整的流水线,可以将指令插入其中。你对此有什么看法?再次感谢。 - AdmiralAdama
@AdmiralAdama 两个定义在本质上是等价的。EU 是一个电路,它接受输入(操作数)并产生结果。在这两种情况下,EU 的输入都是操作数(常量、架构寄存器),而不是指令,这就是为什么你仍然需要 EU 周围的所有其他东西。EU 没有精确的定义,实际上将输入转换为输出的 CPU 部分称为 EU。作为门的同步网络,EU 可以具有内部(不可见)寄存器、稀疏控制逻辑等,并且通常是流水线处理的。但它不能获取、解码和执行指令。 - Margaret Bloom
1
@AdmiralAdama 实际上是这样的。SMT 的定义可以是并行执行或整个并行管线。在英特尔 CPU 上,仅前端的第一阶段(可能只有获取和预解码)不是真正的并行(细粒度垂直线程和粗粒度线程的混合)。后续阶段会同时处理两个线程的指令。这要归功于管道中的各种队列(例如前端的 IQ 和 IDQ)。发生的情况是单个 4/6/7 路管道独立地处理两个线程的指令,无论源如何。 - Margaret Bloom
1
啊,好的,我误解了你的评论。我认为我现在理解正确了。使用SMT,单个流水线可以“看到”并从两个线程中选择(由于具有两个架构状态),当将指令塞入其中时,这使得超标量CPU更加高效,因为这允许CPU每个周期执行更多操作。换句话说,几乎所有CPU的内部部件/资源都可以在没有SMT的情况下利用每个周期。 - AdmiralAdama
感谢您的回答。最重要的部分消除了我所有的困惑:“在英特尔的CPU上,只有前端的前几个阶段不是真正的并行处理……后面的阶段会同时处理两个线程的指令。” - Vladimir Gordeev
显示剩余4条评论

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