超线程CPU实现并行还是仅实现并发?

13

超线程CPU是否实现并行性,还是只有并发性(上下文切换)?

我猜测是没有并行性,只有通过上下文切换的并发性。


有什么区别? - Software Engineer
1
@EngineerDollery,确实有很大的区别。 - Swastik Padhi
是的,但它是什么呢?或者,我应该说,实际上它们完全是相同的东西,但知道你为什么认为它们不同会很有趣。 - Software Engineer
@EngineerDollery 请看下面的回答。你可能会找到你想要的东西。 :) - Swastik Padhi
@EngineerDollery。但是,在我第一条评论中,当我说“确实存在很大的差异”时,我真正意思是因为并行性通过上下文切换的并发之间存在差异(这些术语来自OP),因为即使单词并行性并发性具有相同的字典含义,通过上下文切换的并发不等同于并行性。上下文切换似乎是并发的,但实际上并不是。这就是我想要在这里强调的重点。希望你现在能理解它。 - Swastik Padhi
显示剩余4条评论
2个回答

11
一颗带有超线程技术的物理CPU核心在操作系统中被看作是两个逻辑CPU。虽然操作系统会为每个核心看到两个CPU,但实际上只有一个CPU硬件,每个核心只有一个执行资源集,因此CPU有点“欺骗”了系统。CPU 假装自己有更多的核心,并利用自己的逻辑来加速程序执行。超线程允许两个逻辑CPU内核共享物理执行资源。这可以略微加快速度 - 例如,如果一个虚拟CPU停滞不前并且等待,另一个虚拟CPU可以借用其执行资源。同时,空闲资源可用于同时执行其他任务。 超线程可以帮助加快系统速度,但与具有额外核心相比,效果远远不及。除非考虑超标量体系结构(GPGPU体系结构或多个物理核心中的独立执行),否则无法在单核处理器上实现真正意义上的并行性。
超标量处理器与多核处理器不同之处在于,多个执行单元不是整个处理器。单个处理器由更细粒度的执行单元组成,例如ALU、整数乘法器、整数移位器、FPU等。可能会有多个版本的每个执行单元,以便并行执行多个指令。这与并发处理多个线程的多核处理器不同,每个处理单元对应一个线程(称为“内核”)。它还不同于流水线处理器,其中多个指令可以并行处于各个执行阶段,类似于装配线。
来源: https://en.wikipedia.org/wiki/Superscalar_processor

来自: http://www.cslab.ece.ntua.gr/courses/advcomparch/2007/material/readings/HYPERTHREADING%20TECHNOLOGY%20IN%20THE%20NETBURST%20MICROARCHITECTURE.pdf

enter image description here

超线程技术(Hyper Threading technology)使单个物理处理器看起来像是多个逻辑处理器。每个逻辑处理器都有一份体系结构状态,这些处理器共享单个物理执行资源。从软件或架构角度来看,这意味着操作系统和用户程序可以将进程或线程调度到逻辑处理器上,就像在多处理器系统中的传统物理处理器上一样。从微架构角度来看,这意味着来自逻辑处理器的指令将持久存在并同时在共享执行资源上执行,这可以极大地提高处理器资源利用率。Netburst 微架构上的超线程技术实现每个物理处理器上拥有两个逻辑处理器。图1展示了具有超线程技术功能的处理器的概念视图。每个逻辑处理器都维护着一套完整的体系结构状态,这些状态包括通用寄存器、控制寄存器、高级可编程中断控制器(APIC)和一些用于机器状态的寄存器。从软件角度来看,重复的体系结构状态使每个物理处理器看起来像是两个处理器。每个逻辑处理器都有自己的中断控制器或 APIC,只处理发送到其特定逻辑处理器的中断。

注意:对于使用超标量核(即每个周期可以发出多个操作)的同时多线程处理,执行过程会有显著不同。


5
同时多线程不需要一个线程停顿以使另一个线程处于活动状态(即使是精细的多线程也没有这个要求)。SMT需要超标量核心(即可以每个周期发射多于一个操作的核心),因为线程可以同时执行操作。FGMT允许在管道内并发执行(即多个线程可以同时使用管道的不同阶段)。 (顺便提一下,超线程还涉及到Itanium的事件开关多线程;对于x86架构,它只用于SMT。) - user2467198
@CrakC 这样说核心只有“单一的执行资源集”是误导性的。实际上,许多硬件单元被复制以实现SMT,只是没有为多个核心所需的那么多。 - hayesti
@hayesti 你有没有任何后续链接证明相同的事情? - Swastik Padhi
2
@CrakC Netburst微架构中的超线程技术。请查看图1和图2。除了几个微架构单元外,每个逻辑核心都需要复制一个体系结构状态。许多结构可以在线程之间共享,但并非所有结构都可以共享(否则SMT将与上下文切换相同)。 - hayesti
1
@CrakC 我现在明白你的意思了。我想当英特尔提到“执行资源”时,他们实际上是指发布队列和功能单元。有时候用他们自己的术语来解释他们的意思可能会让人感到非常困惑。 - hayesti
显示剩余6条评论

3
  • 并发是一种任务执行的方式,其替代方案是顺序执行。
  • 并行是一种设计任务的方式,其替代方案是串行。
  • 超线程是一种硬件辅助的执行机制,在其中处理器的某些部分(即硬件)被复制以允许更快的执行1。它的替代方案可以是90年代的任何旧硬件(因为超线程最早出现在2002年2月2)。

没有超线程硬件,我们可以有并发,只要确实有多个可以同时执行的任务。如何做到?采取可以安全并发执行的进程P1和P2,并取一个核心(称为C)。P1在C上运行1个时间量子,然后P2在C上运行另一个时间量子,接着P1在C上运行下一个时间量子,依此类推。

只有一个核心C - 没有超线程 - 我们就有了P1和P2的并发执行。


没有超线程硬件,我们可以有并行,如果有一个可以并行执行的任务,并且我们有多个核心来确实并行运行该任务。以Mapreduce的映射部分为例。

假设您有两个文本文件要读取,已经启动了两个映射器,并且有两个非超线程物理核心。在这种情况下,您可以(而且可能会)在没有任何超线程的情况下并行运行映射器。每个映射器将从自己的文本文件中读取,将在自己的核心上运行,并生成自己的映射输出。

有2个核心 - 没有超线程 - 我们就有了一个任务的并行执行。


结论:超线程是一种硬件改进,可以成功地与并行和并发分离。



1通过减少需要复制的数据量以有效执行上下文切换。

2 它最初于2002年2月出现在Xeon服务器处理器上,并于2002年11月在Pentium 4台式机CPU上出现

*一篇关于并行和并发的好回答指出,"并发"就像一个杂耍者在玩许多球。不论看上去怎样,杂耍者每次只能接住/扔出一个球。"并行"是指多个杂耍者同时玩多个球。


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