windows - 为什么将多线程应用程序限制在一个核心使其运行得更快?

标签 windows multithreading cpu scheduler affinity

我有一个用 C++ 编写的 native 多线程 Win32 应用程序,它有大约 3 个相对繁忙的线程和 4 到 6 个不那么多的线程。当它以正常模式运行时,总 CPU 使用率在 8 核机器上加起来约为 15%,应用程序在大约 30 秒内完成。当我通过将 affinity mask 设置为 0x01 将应用程序限制为只有一个核心时,它可以在 23 秒内更快地完成。

我猜这与限制在一个物理核心和/或某些并发内存访问问题时同步成本较低有关。

我运行的是 Windows 7 x64,应用程序是 32 位的。 CPU为Xeon X5570,4核,超线程。

谁能详细解释一下这种行为?为什么会发生这种情况以及如何提前预测这种行为?

更新:我想我的问题不是很清楚。我想知道为什么它在一个物理核心上变得更快,而不是为什么它在多个核心上没有超过 15%。

最佳答案

这个问题非常模糊,所以只是一些基于典型线程问题的随机猜测。

一个明显的候选者是争用,线程争夺锁并且实际上运行串行而不是并行。您最终会为线程上下文切换付费,而不会获得任何好处。这是一个在 C++ 中很容易遗漏的问题,在 CRT 和 C++ 标准库中有很多低级锁定。两者最初的设计均未考虑线程。

在 x86 和 x64 等具有强大内存模型的 cpu 核心上常见的问题是“错误共享”。当多个线程更新同一 L1 高速缓存行内的内存位置时,就会发生这种情况。然后,处理器会花费大量马力来保持核心缓存同步。

如果程序实际上是执行绑定(bind)的,那么您只能从多个执行核心中获益。如果它的内存受限,您将无法获得好处。你的机器仍然只有一个内存总线,如果你操作的数据不能容纳 cpu 缓存,它就会成为一个强大的瓶颈。核心将简单地停止,等待总线 catch 。它仍被计为 CPU 时间,因此在 CPU 使用情况统计中不可见,但几乎没有真正完成工作。

很明显,您需要一个好的分析器来解决这类问题。

关于windows - 为什么将多线程应用程序限制在一个核心使其运行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320754/

相关文章:

windows - OS线程调度与cpu使用关系

windows - 为 Windows 提供可用性

java - 在 Java 中运行动态数量的线程并返回值

c++ - "real-time"约束是否会阻止使用任务计划程序?

java - 计算 Java 函数的 CPU 周期

ubuntu - 了解 CPU 架构缩写

.net - Windows 8.1 无法安装 .NET Framework 3.5 0*800F0906

windows - Powershell区分大小写重命名

python - 与实时解释器一起运行 python 应用程序

c++ - 服务 DLL 的 CPU 使用率?