Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么将多线程应用程序限制为一个核心会使其运行更快? 我有一个用C++编写的本地多线程Win32应用程序,它有大约3个比较繁忙的线程和4到6个线程,它们并没有那么多。当它在正常模式下运行时,8核机器上的CPU总使用率加起来约为15%,应用程序在大约30秒内完成。当我通过将关联掩码设置为0x01将应用程序限制为仅一个核心时,它完成得更快,只需23秒_Windows_Multithreading_Cpu_Scheduler_Affinity - Fatal编程技术网

Windows 为什么将多线程应用程序限制为一个核心会使其运行更快? 我有一个用C++编写的本地多线程Win32应用程序,它有大约3个比较繁忙的线程和4到6个线程,它们并没有那么多。当它在正常模式下运行时,8核机器上的CPU总使用率加起来约为15%,应用程序在大约30秒内完成。当我通过将关联掩码设置为0x01将应用程序限制为仅一个核心时,它完成得更快,只需23秒

Windows 为什么将多线程应用程序限制为一个核心会使其运行更快? 我有一个用C++编写的本地多线程Win32应用程序,它有大约3个比较繁忙的线程和4到6个线程,它们并没有那么多。当它在正常模式下运行时,8核机器上的CPU总使用率加起来约为15%,应用程序在大约30秒内完成。当我通过将关联掩码设置为0x01将应用程序限制为仅一个核心时,它完成得更快,只需23秒,windows,multithreading,cpu,scheduler,affinity,Windows,Multithreading,Cpu,Scheduler,Affinity,我猜这与同步在一个物理内核和/或一些并发内存访问问题上更便宜有关 我运行的是Windows7x64,应用程序是32位的。CPU为Xeon X5570,具有4个内核,并启用HT 有人能详细解释一下这种行为吗?为什么会发生这种情况,以及如何提前预测这种行为 更新:我想我的问题不是很清楚。我想知道为什么在一个物理内核上速度更快,而不是为什么在多个内核上速度没有超过15%。这个问题非常模糊,所以只是一些基于典型线程问题的随机猜测 一个明显的候选者是争用,线程争夺锁,实际上是串行而不是并行运行。您最终将为

我猜这与同步在一个物理内核和/或一些并发内存访问问题上更便宜有关

我运行的是Windows7x64,应用程序是32位的。CPU为Xeon X5570,具有4个内核,并启用HT

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


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

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

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

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

只有当程序实际执行受限时,才能从多个执行核心中获益。如果其内存受限,则无法获得好处。您的机器仍然只有一条内存总线,如果您处理的数据无法满足cpu缓存,这将是一个严重的瓶颈。核心将简单地暂停,等待公共汽车赶上。它仍然被计算为cpu时间,因此在cpu使用统计数据中不可见,但实际完成的工作很少


显然,您需要一个好的探查器来追踪此类问题。

就问题而言,线程在多个内核上运行时彼此通信,导致进程执行速度相对较慢。然而,将线程限制为单个物理核心并不需要线程之间的任何交互通信,因此进程会加快


这也可能取决于正在执行的任务:如果线程需要较低的资源,这可能是真的,否则将物理内核限制为一个内核可能不会在所有情况下都有效。

如果不说明应用程序,很难猜测是什么导致应用程序运行缓慢。如果你想进行详细的分析,我们可以考虑以下因素-<
  • 处理器间通信:应用程序中的线程之间的通信量。如果他们经常交流,那么您将由于这种行为而产生开销

  • 处理器缓存体系结构:这是另一个需要考虑的重要因素。您应该知道由于线程在不同的处理器上运行,处理器的缓存将受到怎样的影响。在共享缓存中将发生多少振荡

  • 页面错误:由于程序的顺序性,在单处理器上运行可能会导致页面错误数量减少

  • 锁定:锁定代码中的开销?这不应导致经济放缓。但是除了上述因素之外,这可能会增加一些开销

  • 处理器上的NoC:当然,如果您将不同的线程分配给不同的处理器内核,并且它们正在通信,那么您需要知道它们所采用的路径。它们之间有专用连接吗?也许你应该看看这个

  • 处理器负载:最后但并非最不重要的一点是,我希望您没有在其他处理器内核上运行其他任务,从而导致大量上下文切换。上下文切换通常非常昂贵

  • <> >强>温度:你应该考虑的一个效果是如果CPU核心升温,处理器时钟会减速。我想,你不会有这种效果,但它也很大程度上取决于环境温度


考虑到内存延迟对性能的巨大影响,几乎可以肯定这与缓存有关

由于在单核上,第一级和第二级缓存会保持特别热—比在多核上分布时更热

第三级缓存将在所有内核之间共享,因此不会有任何不同,但速度当然要慢得多,因此通过将局部性移动到第一级和第二级缓存,您可以获得很多好处。

“当它在正常模式下运行时,8核机器上的CPU总使用率加起来约为15%。”


只有15%的使用率给了我另一种可能的解释:你的线程不做I/O吗?我的猜测是,I/O操作决定了应用程序的总时间,而不是CPU使用率。在大多数情况下,当I/O作业是多线程的时,I/O密集型应用程序的速度会变慢(只需考虑同时复制两个文件,而不是一个接一个文件)。

当您使用单核时,可能内核对相同的变量使用了单独的存储区域,它不需要将单独的区域合并到原始区域中。可能一级缓存和二级缓存在同一个核心上支付红利,并且您的数据集非常小,可以容纳在其中。