Col*_*sey 3 cpu scheduled-tasks intel-core-i7 multi-core
这个问题向我所知道的英特尔专家提出。物理 CPU 上的两个线程是否平等对待?
众所周知,英特尔 CPU 上的超线程是一个系统,其中每个物理内核都作为 2 个虚拟内核呈现给操作系统。这 2 个虚拟内核使处理器能够在操作系统未知的事件(页面错误、其他 CPU 内部事件)上在 2 个执行单元(线程@虚拟内核)之间进行上下文切换,这些事件通常会使 CPU 浪费等待的周期其他 IO 事件。
默认情况下,操作系统不需要考虑超线程。所有内核最终都会完成工作,唯一的区别是现在并非所有可见/虚拟内核都可以以相同的速度处理。为同一物理内核 (VCPU0+1 -> CPU 0) 上的 2 个线程调度的工作将不如在 2 个不同内核 (VCPU0+2 -> CPU 0 + 1) 上调度的工作快。
根据我的研究,“超线程”感知操作系统将尝试在每个物理内核上安排工作,然后再将“虚拟内核”上的调度加倍。我通常认为这是“偶数”VCPU 首先被调度(在 1+3 之前填充 VCPU 0+2)。“偶数”和“奇数”线程是否相等?(实际上没有“超线程”虚拟 CPU)。
换句话说,是否没有用于物理 CPU 的主要/次要“线程”?如果我只在 VCPU 1 上安排工作,它的表现是否与我只是在 VCPU 0 上安排的一样?假设,如果在两个线程上都安排了相同的工作,那么两个线程完成所需的时间大约是原来的两倍吗?
物理 CPU 上的两个线程是否平等对待?
是的。内核的执行资源分配给一个线程或另一个线程没有任何偏好。(什么是“执行资源”?请参阅我在下面链接的文章。但示例包括架构寄存器(IP、SP、EAX 等)、实现算术等特定操作的“执行单元”。)
众所周知,英特尔 CPU 上的超线程是一个系统,其中每个物理内核都作为 2 个虚拟内核呈现给操作系统。
它实际上只是呈现为两个看起来像是操作系统要成为核心的东西,或者是 Windows 所称的两个“逻辑处理器”。(尽管 Ramhound 声称如此。)如果您关闭了 HT,那么每个核心只有一个 LP,因此使用相同的术语。
如果您有一个不支持 HT 的操作系统,那么启用了 HT 的内核看起来就像两个内核,并且操作系统会以这种方式枚举和使用。事实上,Windows 2000 就是这种情况,它对 HT 一无所知。
这 2 个虚拟内核使处理器能够在操作系统未知的事件(页面错误、其他 CPU 内部事件)上在 2 个执行单元(线程@虚拟内核)之间进行上下文切换,这些事件通常会使 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 内核上运行时,它“看到”了两个处理器并使用它们。(由于此类平台早期固件的枚举顺序,如果您运行的是仅支持两个 CPU 的 Win2K 版本,则不幸的是,它会在一个 CPU 包中使用两个 LP!后来通过固件(“BIOS ") 更改了 LP 在 ACPI 表中出现的顺序的更新。)
根据我的研究,“超线程”感知操作系统将尝试在每个物理内核上安排工作,然后再将“虚拟内核”上的调度加倍。
Windows当然可以。他们尝试每个内核仅使用一个 LP。例如,在寻找空闲 LP 以在其上运行新就绪线程时,Windows 调度程序首先尝试查找位于两个LP 都空闲的核心中的空闲 LP 。
我通常认为这是“偶数”VCPU 首先被调度(在 1+3 之前填充 VCPU 0+2)。“偶数”和“奇数”线程是否相等?
嗯,它们是相等的,因为一个 LP 的核心内没有内置偏差。可能一个碰巧比另一个更快地完成工作,因为在一个上运行的线程需要比另一个更少的执行资源。
顺便说一下,启用HT的CPU没有在两个LP之间实现任何优先级概念,这实际上是HT的一个缺陷。假设您有两个对操作系统具有不同优先级的计算绑定线程。根据操作系统的规则,如果您只有一个逻辑处理器,则更高优先级的线程实际上将获得所有 CPU 时间。但是,假设我们有两个恰好在同一个核心中的空闲 LP。核心固件将尝试大致相同地运行它们,即使这不是操作系统真正想要的。(至少,上次我看这些细节的时候,是这样的。)
(实际上没有“超线程”虚拟 CPU)。换句话说,是否没有用于物理 CPU 的主要/次要“线程”?
正确的。那没有。顺便说一句,CPU 和 CPU 内核没有“线程”。一个逻辑处理器可以运行一个线程。您拥有的 LP 越多,可以同时“计算”的线程就越多。
如果我只在 VCPU 1 上安排工作,它的表现是否与我只是在 VCPU 0 上安排的一样?
是的。
假设,如果在两个线程上都安排了相同的工作,那么两个线程完成所需的时间大约是原来的两倍吗?
嗯,不。HT 的全部意义在于一个内核通常具有比任何一个线程可以使用的更多的执行资源。通过将内核呈现为两个 LP,两个线程可以“同时”运行,并且空闲的执行资源更少。对于大多数线程,您可以期望两个线程完成的时间是其中一个线程花费的时间的 1.4 倍到 1.7 倍。
一个极端的情况是,如果一个线程执行几乎所有整数运算,而另一个线程几乎执行所有浮点运算。尽管如此,由于共享 L3 缓存和内存带宽问题,您不太可能获得与两个线程在两个不同内核上运行时相同的性能。但是,如果两个线程都没有进行大量内存密集型工作,那么您可能会非常接近。