这个问题我想问一下我认识的英特尔专家。物理 CPU 上的两个线程是否受到同等对待?
我们知道,英特尔 CPU 上的超线程是一种系统,其中每个物理核心在操作系统中呈现为 2 个虚拟核心。这两个虚拟核心使处理器能够在操作系统未知的事件(页面错误、其他 CPU 内部事件)上在 2 个执行单元(线程 @ 虚拟核心)之间进行上下文切换,而这些事件通常会使 CPU 浪费周期等待其他 IO 事件。
默认情况下,操作系统不需要考虑超线程。所有核心最终都会完成工作,唯一的区别是现在并非所有可见/虚拟核心都可能以相同的速度处理。为同一物理核心 (VCPU0+1 -> CPU 0) 上的 2 个线程安排的工作不会像在 2 个不同核心 (VCPU0+2 -> CPU 0 + 1) 上安排的工作那样快。
据我研究,支持“超线程”的操作系统会尽量尝试按物理核心安排工作,然后再加倍安排“虚拟核心”的工作。我通常认为“偶数”VCPU 会先得到安排(先填充 VCPU 0+2,然后再填充 1+3)。“偶数”和“奇数”线程是否相等?(实际上没有“超线程”虚拟 CPU)。
换句话说,物理 CPU 是否没有主/次“线程”?如果我仅在 VCPU 1 上安排工作,其执行效果是否会与仅在 VCPU 0 上安排相同?假设,如果在两个线程上安排了相同的工作,那么两个线程完成所需的时间大约是原来的两倍吗?
答案1
物理 CPU 上的两个线程是否受到同等对待?
是的。在将核心的执行资源分配给一个线程或另一个线程时,没有偏好。(什么是“执行资源”?请参阅下面我链接的文章。但示例包括架构寄存器(IP、SP、EAX 等)、实现算术等特定操作的“执行单元”等。)
众所周知,英特尔 CPU 上的超线程是一种系统,其中每个物理核心在操作系统中呈现为 2 个虚拟核心。
它实际上只是表现为两个在操作系统看来是核心的东西 - 或者 Windows 称之为两个“逻辑处理器”。(尽管 Ramhound 声称如此。)如果您关闭了 HT,则每个核心只有一个 LP,因此使用相同的术语。
如果您的操作系统不支持超线程,那么启用超线程的内核看起来就像两个内核,操作系统会枚举并使用这两个内核。事实上,Windows 2000 就是这种情况,它完全不支持超线程。
这两个虚拟核心使处理器能够在操作系统未知的事件(页面错误、其他 CPU 内部事件)上在两个执行单元(线程 @ 虚拟核心)之间进行上下文切换,而这些事件通常会导致 CPU 浪费周期等待其他 IO 事件。
这实际上并不是它的工作原理(我想补充的是,页面错误肯定为操作系统所知!也许您正在考虑内存访问延迟)。启用 HT 的处理器不会执行任何类似于线程之间操作系统级别的上下文切换的操作。请记住,HT 核心实际上枚举为两个不同的(逻辑)处理器,每个处理器都有自己的一组架构寄存器等。在线程上下文切换中,这些寄存器的内容被复制到内存中(在线程对象中),并且寄存器从其他线程的已保存上下文中加载。这不会发生在 HT 中,因为这些寄存器(和许多其他资源)由两个 LP 复制。因此,每个 LP 的状态在 CPU 内持续保持。
但还有其他资源没有被重复。HT 允许处理器固件使用执行资源(如果只有一个 LP 在运行,这些资源将被浪费)来支持第二个 LP 的活动。这里有一个非常好的描述:http://arstechnica.com/features/2002/10/hyperthreading/
默认情况下,操作系统不需要考虑超线程。所有核心最终都会完成工作,唯一的区别是现在并非所有可见/虚拟核心都可能以相同的速度处理。为同一物理核心 (VCPU0+1 -> CPU 0) 上的 2 个线程安排的工作不会像在 2 个不同核心 (VCPU0+2 -> CPU 0 + 1) 上安排的工作那样快。
全部正确。Windows 2000 完全不了解 HT,但当它在启用 HT 的单个 CPU 核心上运行时,它会“看到”两个处理器并使用它们。(由于此类平台的早期固件的枚举顺序,如果您运行的 Win2K 版本仅支持两个 CPU,那么不幸的是,它会在其中一个 CPU 包中使用两个 LP!后来通过固件(“BIOS”)更新修复了这个问题,该更新改变了 LP 在 ACPI 表中的出现顺序。)
根据我的研究,支持“超线程”的操作系统会先尝试按物理核心安排工作,然后再加倍在“虚拟核心”上进行调度。
Windows 确实如此。它们尝试每个核心仅使用一个 LP。例如,在寻找空闲 LP 来运行新就绪线程时,Windows 调度程序首先尝试在核心中找到一个空闲 LP,其中两个都LP 处于闲置状态。
我通常认为“偶数” VCPU 首先得到调度(先填充 VCPU 0+2,再填充 1+3)。“偶数”和“奇数”线程是否相等?
好吧,它们是平等的,因为内核中没有内置的 LP 偏好。可能其中一个比另一个更快地完成工作,因为其中一个上运行的线程需要的执行资源比另一个少。
顺便说一句,启用 HT 的 CPU 并未在两个 LP 之间实现任何优先级概念,这实际上是 HT 的缺陷之一。假设您有两个计算密集型线程,它们对操作系统而言具有不同的优先级。根据操作系统的规则,如果您只有一个逻辑处理器,则优先级较高的线程几乎会获得所有的 CPU 时间。但是,假设我们有两个空闲的 LP,它们恰好位于同一个内核中。内核固件将尝试以大致相同的速度运行它们,即使这并不是操作系统真正想要的。(至少,上次我查看这些详细信息时,情况就是这样。)
(实际上没有“超线程”虚拟 CPU)。换句话说,物理 CPU 是否没有主/次“线程”?
正确。没有。顺便说一句,CPU 和 CPU 核心没有“线程”。逻辑处理器能跑线程。LP 越多,可以同时进行“计算”的线程就越多。
如果我只在 VCPU 1 上安排工作,其性能是否会与在 VCPU 0 上安排工作相同?
是的。
假设如果两个线程都安排了相同的工作,那么两个线程完成所需的时间大约是原来的两倍吗?
嗯,不是。HT 的重点在于,一个核心通常拥有比任何一个线程可以使用的更多执行资源。通过将核心呈现为两个 LP,两个线程可以“同时”运行,并且空闲的执行资源更少。对于大多数线程,您可以预期两个线程的完成时间是其中一个线程所需时间的 1.4 倍到 1.7 倍。
一种极端情况是,如果其中一个线程执行几乎所有整数运算,而另一个线程执行几乎所有浮点运算。尽管如此,由于共享 L3 缓存和内存带宽问题,您不太可能获得与两个线程在两个不同内核上运行相同的性能。但如果两个线程都没有执行太多内存密集型工作,您可能会非常接近。