对于任何 Win 操作系统上的大多数多线程应用程序,CPU 最大利用率限制为 1/N CPU:为什么?

对于任何 Win 操作系统上的大多数多线程应用程序,CPU 最大利用率限制为 1/N CPU:为什么?

我在某种程度上了解多线程和任务,但知道在操作系统之外,大多数 Windows 应用程序仅限于使用 1/N CPU 来实现平均最大利用率。

对于双核来说,这是 50%,对于 4 个 CPU 来说,这是 25%,对于所有 8 个 CPU 来说,这是 12.5%。如果使用 Procexp.exe 释放 CPU 或选择偶数或奇数 CPU,这不会改变结果。

我的问题

有没有办法将利用率提高到超出此操作系统限制的水平。我理解如果将某个应用程序的利用率设为 100%。操作系统可能会在预期或要求的超时期限内因硬件 I/O 无响应而出现蓝屏,但即使 50% 或 75% 也会改善我的结果。

然而,在执行大型任务时,操作系统中的 explorer.exe 等有时可以达到 50% 或更多(?)。

  • 通常情况下,仅打开浏览器并打开 10 个标签页时,CPU 的空闲率为 98~99.5%(Brave)

我在 Win7 i7-4770S Haswell 3.1GHz 上安装了 16GB RAM 的 LibreOffice SCALC.exe,其中有一个包含 150 万个 CV19 美国数据单元格的电子表格,并搜索/替换了 ' 文本前缀,尝试将文本转换为每日日期的单元格编号(带有一些选项文本到值),它仍然在运行(是的),显然我使用了错误的方法。

如果无法改变操作系统利用率,那么我是否应该重写这个问题,将 400 个文本条目转换为日期 '1\20\2020 的值,然后将其重新格式化为我喜欢的值。

  • 该文本文件是从 JHU CV19 美国县每日死亡累计总数的 GitHub 存储库下载的,并使用文本到列的转换导入到 SCALC。

SCALC 仍在运行!”,根据 PERFMON 使用 11 个线程,运行率为 12.5%。

问题始于在 150 万个单元格的电子表格中搜索和替换 1 个字符。我选择了“相似性选项”,这是一个错误,但问题不在于 Excel 或 Open Office Apps,许多应用程序都是多线程的,但平均只能使用 1/N 个 CPU,而且没有办法改变这种情况。我可以用图像证明这一点,但你们中的一些人会知道这是真的。

其他人不明白这个问题。是的,可以编写代码或让 Windows 执行此操作,但不能让罐装应用程序执行此操作。

示例 1 大型文件进程的简单启动恢复仅花费了几秒钟,峰值超过 20%。当内存吞吐量受到限制时,它的平均峰值可以达到一秒钟内超过 12.5%,但我认为不会持续。(所以我想没有什么可以改善这种情况?)

在此处输入图片描述

在这里搜索在 150 万个单元格中用 0 替换 在我截取屏幕截图之前,平均值正好是 12.5%。

在此处输入图片描述

这里几乎正好有 1/N 或 12.5% 的 CPU 工作负载专用于具有多个线程的 1 个应用程序。

我可以在具有此架构的 Windows 下对许多其他应用程序重复此测试。那么是架构 - 内存缓存总线受限吗?有什么解决方法吗?

正如其他人在这个论坛上所写的,1/N CPU 的限制或 12.50%

这就是证明。

在此处输入图片描述

多线程 MS App 上的更多证明 i=仅使用 1/N CPU % 平均 MAX

在此处输入图片描述

更新

使用 QUattro Pro 安装了 WordPerfect 2020,并运行了完全相同的多线程进程,得到了完全相同的结果:所有 8 个 CPU 的最大 CPU 使用率 = 1/8 = 12.5% 在此处输入图片描述

示例 #4

  • 多线程进程再次利用了所有 CPu,但总共只有 1/N CPU 或 12.5% 是 Mark Russinovich 的 Process Explorer(又名 PROCMON.exe)。它独立于所有其他进程,仅使用很少的资源。

我怀疑马克是否有编写多线程程序的能力。:)(MS Fellow)

在此处输入图片描述 在此处输入图片描述

我的 CPU 延迟最高 在此处输入图片描述

答案1

并非所有任务本质上都能够被拆分成能够同时在 CPU 的每个核心上运行的任务。

CPU 中的每个核心都是一个功能齐全的处理器。它能够维护一个硬件“线程”的执行状态信息。每个核心都有自己的缓存和数据处理功能,独立于其他核心。它们可能共享一个缓存和内存总线,但除此之外,它们是完全独立的。

该线程大致翻译为软件中所谓的线程。

您看到的问题是,该软件中执行工作的特定任务本质上是单线程的。

单线程一次只能在一个核心上执行。在 8 核处理器上,这意味着单线程最多可使用处理器的 1/8,或根据任务管理器的 12.5%。在 4 核处理器上,则为 1/4 或 25%。

一个程序可以有多个线程,但这些线程只能处理完全不相关的任务。一个线程可能处理场景数据的更新,另一个线程可能处理 GUI 更新等等。

线程无法做的是在彼此不通信的情况下同时处理完全相同的数据,这就是您所看到的限制。

为了使用多个 CPU 核心,必须将正在执行的任务拆分并分配到多个线程。拆分是一个编程问题,由软件工程师来实现。任何给定任务是否是多线程的取决于该任务的复杂性以及是否可以拆分

  • 该任务是否包含可以拆分成独立数据集以便由单独的线程处理的数据?
  • 软件是否已经将该特定任务拆分为单独的线程?

如果数据完全依赖于以特定方式处理,那么它就不可能使用多个核心。

如果数据可以分割,但需要做更多的工作来分割和重新合并,那么软件工程师可能会认为这不值得付出努力,而是坚持使用一个线程/核心。

如果数据可以分割,并且软件设计成可以分割数据然后您将会看到有超过 1 个核心正在被使用。

我知道对于许多任务来说 Excel 支持多核计算,但它完全依赖于彼此之间完全没有依赖关系的数据。

相关内容