我注意到对于任何长时间运行的单线程任务,我的家用 PC 将全部使用分配给整个进程的单个逻辑核心。但是,对于完全相同的进程,我的工作 PC 在所有内核之间共享负载(每个内核轮流运行单线程进程)。
两台电脑都运行 Windows 10。我的家用电脑有不同的 CPU 和不同的主板(华硕 ROG 第 11 版)。
这似乎适用于任何进程,但我刚刚对其进行测试的示例是我编写的 R 脚本。运行完全相同的 R 脚本、相同版本的 R 的两台 PC 具有不同的 CPU 负载共享方法。更糟糕的是,我的家用电脑似乎总是使用 CPU0 来处理这类事情。
我希望有一个 BIOS 设置可以在我的家用 PC 上应用,以使其平均分担负载。在那儿?
将线程调度到内核是一门艺术,而且非常困难。这与现代多核 CPU 管理其散热曲线的方式有关。根据具体型号,CPU 可能会或多或少地执行以下一项或多项操作:
这意味着,对于单线程工作负载(如
R
脚本),最佳策略差异很大:无论调度程序选择什么,您都应该相信它会比任何人都做得更好。
不会。计算机的 BIOS 可能能够控制启用或禁用哪些 CPU 内核以及内核的速度,但它无法控制在其上执行的内容。程序及其线程的执行由操作系统控制。
现在至于为什么您的两台计算机的行为不同,那是一个完全不同的问题。它可能是您的操作系统设置或 R 配置。这需要在另一个问题中提出,并且需要有关您的硬件和软件配置的更多详细信息。
我还想指出,它仅在一个内核上运行并没有错。运行程序是它的设计目的。或许,您的工作计算机正在同时运行更多任务,并且必须兼顾 CPU 使用率。可能是您的家用计算机具有更快的内核,并且无需将线程交换到其他内核。
我认为最可能的罪魁祸首是您的家用计算机正在使用 Windows 10 调度程序中的一项功能,即广为人知的“首选核心”支持,该功能将高性能核心优先于低性能核心。在 2018 年之前,通常可以信任桌面 CPU 以相同的速度运行线程,无论您将其放在哪个内核上。即使一个内核理论上能够在给定电压下以比另一个内核更高的频率运行,CPU 也并非旨在允许它运行。
直到 2018 年 AMD 的 Zen+ Ryzen CPU 出现,这种情况才发生了广泛的变化。借助这些型号,AMD 开始允许具有混合质量内核的 CPU 根据负载下的内核提升到不同的时钟频率。当调度程序将线程交换到每个内核而不考虑性能配置文件时,这在很大程度上是无效的。AMD 将核心分成称为“CCX”的组的架构加剧了性能损失。在 CCX 中将线程从一个核心转移到另一个核心比在不同 CCX 之间传播它要快。
英特尔的“至尊版”CPU 也有这种明确的混合性能支持。他们将其称为Intel Turbo Boost Max Technology 3.0。英特尔表示,最早支持此功能的 Windows 10 版本是“RS5”,似乎是 1809。
直到 2019 年,所有版本的 Windows 都对这些事实一无所知,并且在 AMD CPU 的所有物理内核上平等地调度线程。Windows 10 版本 1903 包括一个更新的调度程序,它知道 AMD 的 CCX 单元并尝试将线程保持在同一个单元内。关联
Windows 10 版本 1909 对调度程序进行了进一步改进,现在使其能够了解混合性能内核的情况,该功能称为“首选 CPU 内核优化”。关联
我承认,我对这个时间线的理解并不是 100% 确定的,并且在早期版本中可能会使用偏爱的内核,但是很难找到关于此的具体信息。大多数新闻帖子似乎都同意“优先核心”支持对于 1909 来说是全新的,尽管语言暗示它存在于早期版本中。
自2011 年以来,ARM 架构实际上已经明确支持像这种称为“big.LITTLE”的混合性能配置。在 ARM 上运行的 Windows 10 版本于2017年发布,并且从一开始或至少到2018 年就包含了对 big.LITTLE 的支持。这似乎与增加对我们现代 Intel 和 AMD 情况的支持非常吻合。
顺便说一句,逻辑核心仅在需要时才被排除,因为它们已停放,而不是因为调度程序本身了解它们的任何信息。关联