Windows处理器相似性如何与超线程CPU一起工作?


27

Windows处理器相似性如何与超线程CPU一起工作?让我们使用一个具有四个内核的系统的示例(如图所示),每个内核都有一个超线程虚拟内核。

  1. 哪些内核对应于下面的每个“ CPU”?
  2. 下面的CPU 6和CPU 7是否代表一个内核;HT和真正的核心?
  3. 例如,如果CPU 6代表真实内核,而CPU 7代表HT内核,那么仅分配给CPU7的线程将仅获得真实内核的剩余资源吗?(假设核心正在运行其他任务)
  4. 是否在处理器内完全管理超线程,以便在内部处理线程?如果是这样,那是在CPU范围还是在核心范围?示例:如果CPU 6和7代表一个内核,那么分配给哪个进程没有关系,因为CPU会为正在运行的线程分配适当的资源?
  5. 我注意到,至少根据任务管理器的说法,长时间运行的单线程进程会在内核周围反弹很多。这是否意味着将进程分配给单个内核会稍微提高性能(避免上下文切换和缓存无效等)?如果是这样,我能知道我没有分配给“只是一个虚拟核心”吗?

这一切对我来说都是很模糊和困惑的。HT很棒,但是它肯定会降低资源分配的透明度。

处理器关联菜单


众所周知,您看到的每个CPU内核都是一个“虚拟内核”。每个人都有与CPU的物理连接,由于硬件超线程的实现,术语“虚拟”来自Windows如何在这些CPU上调度进程。请参阅我的答案以获取更多详细信息。
突破

另外,为您提供最后的评论。“超线程很棒,但它肯定会降低资源分配的透明度。” 这是100%真实,但有一点你可以做些什么,也没有太多的理由你做任何事情。所有现代操作系统都知道超线程是什么,大多数操作系统都有高级处理器调度程序来对其进行补偿,除了少数特定情况(我的意思是很少)之外,几乎总会有性能上的好处。
突破

Answers:


18

哪些内核对应于下面的每个“ CPU”?

假设我们有核心1、2、3和4,CPU4和CPU5代表核心3。

下面的CPU 6和CPU 7是否代表一个内核;HT和真正的核心?

两者之间没有区别-它们都具有与CPU的物理硬件接口,逻辑接口是在硬件中实现的(有关更多详细信息请参阅《英特尔核心处理器数据表,第1卷》)。基本上,每个内核都有两个单独的执行单元,但是它们在它们之间共享一些公共资源。这就是为什么在某些情况下超线程实际上会降低性能的原因。

例如,如果CPU 6代表真实内核,而CPU 7代表HT内核,那么仅分配给CPU7的线程将仅获得真实内核的剩余资源吗?(假设核心正在运行其他任务)

往上看。分配给仅CPU6或仅CPU7的线程将以完全相同的速度执行(假定该线程执行相同的工作,并且处理器中的其他内核处于空闲状态)。Windows了解启用HT的处理器,并且进程调度程序将这些因素考虑在内。

超线程是否完全在处理器内部管理,以便内部处理线程?如果是这样,那是在CPU范围还是在核心范围?示例:如果CPU 6和7代表一个内核,那么分配给哪个进程没有关系,因为CPU会为正在运行的线程分配适当的资源?

都。实际的硬件本身并没有计划在哪个内核上运行程序,这是操作系统的工作。但是,CPU本身负责在实际执行单元之间共享资源,并且Intel规定了如何编写代码以使其尽可能高效。

我注意到,至少根据任务管理器的说法,长时间运行的单线程进程会在内核周围反弹很多。这是否意味着将进程分配给单个内核会稍微提高性能(避免上下文切换和缓存无效等)?如果是这样,我能知道我没有分配给“只是一个虚拟核心”吗?

这是正常的行为,不,将其分配给单个内核不会提高性能。就是说,如果出于某种原因要确保仅在单个物理核心上执行单个进程,请将其分配给任何单个逻辑处理器。

流程“反弹”的原因是由于流程计划程序。这是正常的行为,并且由于进程调度程序现在必须更加努力地使所有事情都在您施加的限制下工作,因此您很可能会通过限制进程可以在哪些内核上执行(无论进程具有多少线程)来降低性能。是的,这种惩罚在大多数情况下可以忽略不计,但底线是除非您有理由这样做,否则不要


5

应该组织CPU布局,以便无法识别所有CPU的操作系统获得最大的性能。这意味着将列出每个物理核心中的一个虚拟核心,然后列出任何物理核心中的第二个虚拟核心。

例如,假设您有四个超线程内核,分别称为A,B,C和D。如果假设A和B共享一个L2缓存,而C和D共享一个L2缓存,则顺序应为:
0 = A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

这样,仅占用两个CPU的操作系统就可以使用所有L2缓存。另外,仅占用四个CPU的操作系统即可使用所有执行单元。

同样,这就是应该的样子。

当然,如果您使用的是能够理解您的CPU拓扑的操作系统,那就没关系了。BIOS填写了一张表,该表解释了哪些内核共享执行单元,哪些共享缓存等。您可能会使用的,完全支持CPU的每个现代操作系统都了解完整的CPU拓扑。


1
  1. 它们如何对应取决于您的CPU和主板如何枚举和识别内核。应该发生的事情是首先枚举物理套接字,其次是逻辑核心,最后是虚拟核心。在您的情况下,核心0-3应该是物理核心,而4-7应该是虚拟HT核心。这样做的主要原因是,如果您运行的操作系统无法处理所有可用的执行单元,则最有可能在共享单元之前首先获得最独立的单元。如果假设的仅2 CPU的操作系统在系统中找到HT对而不是2个不同的内核,那将不是一件好事。(对于某些早期的HT系统而言,这是一个实际的问题,在可以为新CPU更新内核调度程序之前。)
  2. 否。请参阅1。
  3. 不会。HT比这更复杂。请记住,两个虚拟内核通常共享一些资源,而其他位则分开,但是一次只能执行一个或另一个。
  4. 有点。您的示例(基于假设)通常是正确的。但是,如果应用程序知道其运行的工作负载类型,则可以帮助OS适当地调度线程。
  5. 进行核心跳变有一个很好的理由:分散散热工作量。考虑到在许多情况下,无论如何,所有内核之间都会共享更高级别的缓存(L2,L3),因此内核跳变不会对性能产生重大影响,但是热影响将非常重要,因为您不会在其中遇到“热点”一个核心不断运行,而其他核心则处于闲置状态。现在,在多插座系统(尤其是NUMA系统)中交叉插座会产生很大的性能影响。大多数调度程序都知道这一点,并已将其考虑在内。

归根结底,这可以归结为:(确保最终用户)除了确保您正在运行的最新OS能够了解线程中的各个方面之外,您几乎没有什么可以利用线程亲和力来显着影响性能。你的系统。

如果发现手动分配亲和力有重大影响的任何工作负载,请将其作为错误报告给应用程序开发人员,以便可以修复程序。


4
“核心0-3应该是物理核心,而4-7应该是虚拟HT核心”实际上,核心0和核心1对应于相同的(单个)物理核心。每个“超线程核心”都具有与CPU的两个物理连接,因此Windows实际上可以看到8个物理核心。它只知道CPU具有超线程。如果您有兴趣的话,请参阅英特尔酷睿数据表以获取有关此信息的更多详细信息。
突破

@Breakthrough这不是一个好的拓扑,因为那意味着仅支持4个内核的朴素OS仅会使用一半的物理内核。每个物理核心中的一个虚拟核心应出现在虚拟核心列表中,然后再列出任何物理核心中的第二个虚拟核心。
David Schwartz

@DavidSchwartz是否具有良好的拓扑,这就是逻辑处理器的枚举方式。因此,广泛建议在不能正确枚举LP,内核,物理CPU包的早期OS(例如Windows 2000和更早版本)上禁用超线程。
Jamie Hanrahan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.