为什么单线程分布在CPU上?


24

我很好奇为什么调度程序会不断在CPU之间移动应用程序,而不是始终将其保持在一个状态。拥有4个25%的内核而不是100%的1个内核看起来有点愚蠢。

它与热量有关吗,还是效率更高?其他操作系统是否有所不同?

深入了解或链接到深入的东西会很好。(自己找不到很多。)

更新:

“散布”并不是说它一次在多个cpu上执行,而是每秒从一个cpu移到另一个cpu,从而使它看起来散布开来。


3
即使“什么也没有执行”,总会有系统线程在争夺CPU。例如,O / S具有将回收的内存页面归零的线程,因此当需要内存时,它将准备好一些页面。当您的线程再次执行时,这些线程之一可能正在使用您所使用的cpu。操作系统应该怎么做?等待它还是将您转移到新的CPU?无论执行什么操作,在某些情况下都会导致不良行为。
Tony Lee

这是一个古巴。SMB,而不是LBP。:)
Macke

在我的“答案”中,我展示了一个单线程程序,其行为与您描述的完全相同,即“每秒从一个线程移到另一个线程,从而使效果看起来很分散”。
埃文·罗西卡

Answers:


8

我认为wierob已经很好地说明了这一点。
这是一篇较旧的文章,讨论processor affinity了四核QX6800的设置
(链接指向该文章的第二页)。

如果您不强制与内核建立进程亲和性,那么您的性能会有所下降吗?

  • 尽管Windows调度程序需要确定这种相似性以避免与缓存发生冲突,
    处理器设计本身也考虑了此类问题。
  • 英特尔QX6800四核(因为我在本回答中前面提到过)
    具有在其4个核之间共享8MB L3缓存

应该注意的是,尽管您可能选择只在系统上运行一个单线程进程,但OS本身将要运行其他几个任务,这些任务也需要安排。调度程序会在可用处理器池(或内核)之间平衡所有这些活动。


展望未来,借助Nehalem体系结构和NUMA
跨多个插槽的处理器也将能够更好地解决访问问题。
这是NUMA上ArsTechnica页面上的快速图片。

在此处输入图片说明

如果Nehalem并使i7您感兴趣,那么我在此答案上还有更多链接


是什么使您认为“使用Nehalem体系结构和NUMA,跨多个套接字的处理器也将能够更好地解决访问问题。” ?如我所见,NUMA使内存更加本地化,​​并且与特定处理器相关,从而使垃圾回收的效果恶化。
罗兰·皮拉卡斯

@RolandPihlakas,距离这个答案已有一段时间了,但是看看arstechnica文章和这些要点,我认为我正在考虑新平台具有更好的内存连接能力以及利用该功能的软件的能力(与当时有多个套接字配置;即在Nehalem之前)。
尼克

6

调度程序仅执行准备在“空闲”内核/ CPU上执行的下一个线程。

您可以通过Windows任务管理器将进程分配给特定的CPU。

以25%的速度拥有4个内核意味着同时执行4个线程。而x%的一个内核意味着仅执行一个线程。因此,在某些情况下,前者效率更高。

但是在执行过程中,CPU的缓存中填充了线程访问的数据。因此,如果线程在另一个CPU上执行,它将遇到更多的高速缓存未命中,这代价很高,因为数据不在此CPU的高速缓存中。

你的线程做什么?如果线程“睡眠”了很短的时间,则之前在其上执行的内核可能会被另一个威胁占用,因此您的线程将在下一个可用的内核上执行。如果您仅指定流程要使用的一个核心(例如,任务管理器),会发生什么?


3
afaik Windows调度程序在将线程保持在同一CPU /核心上的过程中做得很好,从而避免了该问题。
Paxxi

@Pär:我的线程似乎实际上在每个内核上执行。
Macke

是的,可能是操作系统进程使我的线程陷入困境。如何接受两个答案?:)
Macke

从我的经验来看,@PärBjörklund至少Windows XP没有。我认为“高速缓存弹跳”问题已在Vista或更高版本中得以解决
Waxhead,2016年

1
“拥有25%的4个内核意味着同时执行4个线程。” 不,这意味着一个线程被执行,一个线程在一个内核上执行,然后在另一个内核上执行,依此类推。正如任务管理器显示的平均使用率一样,每个核心将显示25%(在4核心系统上,在两个核心上将显示50%)。这意味着四分之一的时间核心已被充分利用,而其余时间则处于空闲状态。
大卫·巴拉西奇(DavidBalažic)

0

不是。一个线程只能在一个处理器上运行。但是,某些进程具有多个线程,这些线程可以扩展。

无论您信不信,推理都从未考虑过它的外观。该系统试图分散线程,因为它无法知道何时会出现峰值。


1
请参阅我的补充说明。这是一个全速运行的线程,该线程迅速移动,因此随着时间的流逝,每个核心(前端)都占25%的繁忙。(所有其他进程/线程都是可忽略的)
Macke,

0

操作系统跨CPU内核迁移线程(每秒几次,一次)。始终在同一内核上运行它效率更高。这可以通过任务管理器中的“设置相似性”上下文菜单项来强制实施。

请注意,通常(典型的家庭使用)差异在百分之几的范围内。

正如任务管理器显示的平均使用率一样,“每个4个内核的使用率均为25%”表示每个内核已充分利用了四分之一的时间,而其余时间则得到了释放。

该说明适用于Windows,但在其他操作系统上也类似。


-1

如果有人还在读,我也注意到了这一点,并进行了很多测试以查看它是否只是a幸。事实并非如此!我认为在多个内核上分配单个线程会更有效率,原因有以下几个:

  1. 在所有内核上分布一个线程可以降低功耗。大多数处理器会降低频率,更重要的是会根据负载降低电压,因此,例如,Core 2 Quad将通过在所有4个内核上分配一个线程而不是使用一个内核来消耗更少的功率并产生更少的热量。导致所有核心上的电压增加,因为只有一个稳压器*-效率很低)。
  2. 它确保线程始终以最大/恒定速度运行。如果线程突然请求更多处理能力,则一个内核可能会变得超载,并且执行会有所延迟。通过将其分布在各个核心上,任何突发的峰值都将得到平稳处理,而不会出现延迟和延迟。

另外,由于以上两个观察,我已经相信Turbo Boost和IDA无效。它们在较旧的操作系统上可能很有用,但是Linux和Windows 7非常有效地将所有内容分布在所有内核上。因此,Core 2 Quad q9100 @ 2.26 GHz几乎(总是会有例外:-)总是比Core 2 Duo X9100 @ 3.06GHz快,而且我很少见到它使用IDA(基本上是Turbo Boost的前身,仅针对单线程应用增加一个或两个内核的频率)。

  • 由于有两个物理裸片,因此Core 2 Quad具有两个时钟域,因此两个内核可以全频运行,而两个内核则处于最低频率。不过,我不知道是否有两个稳压器-我注意到所有4个内核的电压均一,因此整个封装必须只有一个稳压器。

3
这听起来有些可疑,原因有几个。请提供您的“事实”参考。首先,为什么四个内核上25%的计算消耗的功率少于一个内核上100%的计算能力?(我可以同意热量会更均匀地散布,但是...)而且,我所考虑的线程正以全倾斜(100%)运行,因此它不会“请求更多的处理能力”,因为它已经在做越多越好。
Macke

好吧,这只是从我自己的观察得出的结果-我对IDA和TurboBoost感兴趣,因此决定进行一些测试。相当早以前,但我得出了上述结论。处理器功耗更低,因为所有内核都以较低的电压运行-降低0.1V可以节省大约6-10瓦的功耗(如果一个内核100%负载,则所有内核都在更高的电压下运行,无论它们是否处于空闲状态)或不)。在具有SLFM模式的Core2Duo中尤其如此。您对线程全速运行是正确的,而不要求任何其他处理器节拍,但是确实有一些应用程序可以执行此操作。
JakL 2011年

没有“传播线程”之类的东西(不,甚至五年后也没有)。只有一个线程,在一个内核上执行。然后再来。等等。在每个时刻,一个内核以100%的速度运行,而其他内核则处于空闲状态。因此,没有任何节省。特别是正如您提到的,无论何时所有内核始终处于满电压状态(如您所说,它们共享电压)。同样,如前所述,位于同一内核上可确保线程获得所有可用的处理能力。由于该内核已被100%使用,因此操作系统会将其他线程调度到其他利用率较低的内核。
DavidBalažic'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.