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

det*_*zed 3 windows cpu multithreading scheduler affinity

我有一个用C++编写的本机多线程Win32应用程序,它有大约3个相对繁忙的线程和4到6个线程,但没有那么多.当它以正常模式运行时,在8核计算机上总CPU使用率增加约15%,应用程序在大约30秒内完成.当我通过设置亲和力掩码将应用程序限制为仅一个核心时,0x01它在23秒内完成得更快.

我猜它与限制一个物理核心和/或某些并发内存访问问题时同步更便宜有关.

我正在运行Windows 7 x64,应用程序是32位.CPU是Xeon X5570,具有4个内核并启用了HT.

任何人都可以详细解释这种行为吗?为什么会发生这种情况以及如何提前预测这种行为?

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

Han*_*ant 7

问题非常模糊,所以只是根据典型的线程问题进行一些随机猜测.

一个明显的候选者是争用,线程争夺锁定,实际上是运行串行而不是并行.您最终将支付线程上下文切换并且没有任何好处.这是C++中容易遗漏的问题,CRT和C++标准库中存在大量的低级锁定.两者最初的设计都没有考虑到螺纹加工.

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

如果程序实际上是执行绑定的,那么您只能从多个执行核心中获益.如果内存受限,你就无法获益.如果您操作的数据不适合cpu缓存,您的机器仍然只有一个内存总线,并且它是一个强大的瓶颈.核心将停滞不前,等待总线迎头赶上.它仍被视为CPU时间,因此在cpu使用统计中不可见,但实际工作很少.

显然,你需要一个好的剖析器来追逐这些问题.