我注意到,对于任何长时间运行的单线程任务,我的家用电脑会将整个过程的全部使用权分配给单个逻辑核心。但是,对于完全相同的过程,我的工作电脑会在所有核心之间分担负载(每个核心轮流运行单线程过程)。
两台电脑都运行 Windows 10。我家用的电脑有不同的 CPU 和不同的主板(华硕 ROG 第 11 版)。
对于任何进程来说似乎都是这种情况,但我刚刚测试的示例是我编写的 R 脚本。两台 PC 运行完全相同的 R 脚本,相同版本的 R,对 CPU 负载共享的方法不同。更糟糕的是,我的家用 PC 似乎总是使用 CPU0 来做这种事情。
我希望有一个 BIOS 设置可以应用于我的家用电脑,以使其均匀分担负载。有吗?
答案1
我认为最有可能的罪魁祸首是您的家用计算机正在使用 Windows 10 调度程序中的一项功能,该功能被广泛称为“优先核心”支持,该功能优先考虑高性能核心而不是低性能核心。在 2018 年之前,无论将线程放在哪个核心上,通常都可以信任台式机 CPU 以相同的速度运行线程。即使一个核心在理论上能够在给定电压下以比另一个核心更高的频率运行,但 CPU 的设计不允许它这样做。
直到 2018 年 AMD 的 Zen+ Ryzen CPU 问世,这种情况才开始普遍改变。有了这些型号,AMD 开始允许具有混合质量内核的 CPU 根据哪些内核处于负载状态而提升到不同的时钟频率。当调度程序将线程交换到每个内核而不管性能配置文件如何时,这在很大程度上变得无效。性能损失因 AMD 的架构而加剧,该架构将内核分成称为“CCX”的组;在 CCX 内将线程从一个内核转移到另一个内核比将其分散到不同的 CCX 中更快。
英特尔的“至尊版”CPU 也具有这种明确的混合性能支持。他们称之为英特尔 Turbo Boost Max 技术 3.0Intel 表示支持此功能的 Windows 10 最早版本是“RS5”,具体版本号好像是 1809。
借助英特尔® Turbo Boost Max 技术 3.0,可以通过识别处理器最快的内核并将最关键的工作负载引导至这些内核来优化轻线程性能。
直到 2019 年,所有版本的 Windows 都不知道这些事实,并在 AMD CPU 的所有物理核心上平等地调度线程。Windows 10 版本 1903 包含一个更新的调度程序,它可以识别 AMD 的 CCX 单元并尝试将线程保留在同一单元内。关联
这些改进旨在对仅使用少数核心的任务产生特殊影响。线程现在在各个 CCX 之间来回切换的次数会减少。
Windows 10 版本 1909 对调度程序进行了进一步的改进,现在使其能够意识到混合性能核心的情况,该功能称为“优先 CPU 核心优化”。关联
微软在最近的 Windows Insider 博客文章中表示,Windows 10 19H2 将对如何将指令分配到这些受青睐的核心进行优化。
我承认,我对这个时间线的理解并不是 100% 确定,而且优先核心可能在早期版本中被使用,但找到关于这方面的具体信息却出奇地困难。大多数新闻帖子似乎都认为“优先核心”支持是 1909 的全新功能,尽管语言暗示它在早期版本中存在。
ARM 架构实际上明确支持这种称为“big.LITTLE”的混合性能配置,因为2011. 运行在 ARM 上的 Windows 10 版本于2017并且从一开始就包含对 big.LITTLE 的支持,或者至少2018。这似乎与增加对我们现代 Intel 和 AMD 情况的支持完美契合。
顺便说一句,逻辑核心只有在需要时才会被排除,因为它们处于停放状态,而不是因为调度程序本身对它们有所了解。关联
Core Parking 仅在 Windows Server 2008 R2 上受支持。但是,Core Parking 算法和基础结构还用于平衡 Windows 7 客户端系统上逻辑处理器之间的处理器性能,这些处理器包含 Intel 超线程技术。
答案2
将线程调度到核心是一门艺术,而且非常困难。这与现代多核 CPU 管理其热量分布的方式有关。取决于具体型号CPU 可能会执行或多或少以下一项或多项操作:
- 如果有热回旋余地,则提高一个或多个内核的时钟频率
- 关闭未使用的组件(包括核心),以便在热配置文件中腾出更多空间
- 限制一些核心以允许提升热包层内的其他核心
- 多得多
这意味着,对于单线程工作负载(如脚本R
),最佳策略差异很大:
- 如果 CPU 可以以牺牲其他核心为代价来提升一个核心的性能,那么最好将该线程“固定”到那个提升的核心上
- 如果热范围较小,则有必要将任务不时分配给最冷的核心
无论调度程序选择什么,你都应该相信它能比任何人做得更好。
答案3
不可以。计算机的 BIOS 可以控制启用或禁用哪些 CPU 内核以及内核的速度,但无法控制在其上执行的内容。程序及其线程的执行由操作系统控制。
至于为什么你的两台电脑表现不同,那完全是另一个问题了。可能是你的操作系统设置或 R 配置。这需要在另一个问题中提出,并且需要更多关于你的硬件和软件配置的详细信息。
我还想指出,它只在一个核心上运行并没有错。运行程序是它被设计用来做的。也许,你的工作电脑正在运行更多的同时性任务,并且必须兼顾 CPU 使用率。也许你的家用电脑有更快的核心,不需要将线程交换到其他核心。