Cha*_*rns 29 windows scheduling hyper-threading affinity
Windows 处理器关联如何与超线程 CPU 配合使用?让我们使用具有四个内核的系统的示例(如图),每个内核都有一个超线程虚拟内核。
这对我来说都是非常模糊和混乱的。HT 很棒,但它似乎确实降低了资源分配的透明度。
Bre*_*ugh 18
下面的每个“CPU”对应哪些核心?
假设我们有核心 1、2、3 和 4,CPU4 和 CPU5 代表核心 3。
是否(例如)下面的 CPU 6 和 CPU 7 代表一个内核;HT和真正的核心?
两者之间没有区别——它们都有与 CPU 的物理硬件接口,逻辑接口是在硬件中实现的(更多详细信息,请参阅英特尔酷睿处理器数据表,第 1 卷)。基本上,每个内核都有两个独立的执行单元,但它们之间共享一些公共资源。这就是为什么在某些情况下超线程实际上会降低性能的原因。
例如,如果 CPU 6 代表一个真正的核心,而 CPU 7 代表一个 HT 核心,那么只分配给 CPU7 的线程是否只能获得真正核心的剩余资源?(假设核心正在运行其他任务)
看上面。分配给 ONLY CPU6 或 ONLY CPU7 的线程将以完全相同的速度执行(假设线程执行相同的工作,并且处理器中的其他内核处于空闲状态)。Windows 知道启用 HT 的处理器,并且进程调度程序会将这些事情考虑在内。
超线程是否完全在处理器内进行管理,以便线程在内部进行处理?如果是,那是在 CPU 范围内还是在核心范围内?示例:如果 CPU 6 和 7 代表一个核心,那么分配给哪个进程无关紧要,因为 CPU 会为正在运行的线程分配适当的资源?
两个都。实际的硬件本身并没有安排运行程序的内核,这是操作系统的工作。然而,CPU 本身负责在实际执行单元之间共享资源,英特尔规定了如何编写代码以使其尽可能高效。
我注意到长时间运行的单线程进程在核心周围反弹了很多,至少根据任务管理器。这是否意味着将进程分配给单个内核会稍微提高性能(通过避免上下文切换和缓存失效等)?如果是这样,我可以知道我没有分配给“只是一个虚拟核心”吗?
这是正常行为,不,将其分配给单个核心不会提高性能。话虽如此,如果出于某种原因您想确保单个进程仅在单个物理内核上执行,请将其分配给任何单个逻辑处理器。
进程“反弹”的原因是进程调度程序。这是正常行为,您很可能会通过限制进程可以在哪些内核上执行(无论它有多少线程)而导致性能降低,因为进程调度程序现在必须更加努力地工作,以使一切都在您施加的限制下工作。是的,在大多数情况下,这种惩罚可以忽略不计,但最重要的是,除非您有理由这样做,否则不要这样做!
应该对 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 拓扑。
归档时间: |
|
查看次数: |
16811 次 |
最近记录: |