在多核CPU上必须做些什么?


45

当考虑我们的程序必须具有多线程友好性时,我的团队对是否有绝对不能在单核CPU上完成的事情感到困惑。我认为图形处理需要大量的并行处理,但是他们认为像DOOM这样的事情是在没有GPU的单核CPU上完成的。

有什么,必须在多核心处理器做什么?

假设开发和运行都有无限的时间。


8
尽管下面的答案似乎在很大程度上是“否”,但从历史上看,有些系统实际上没有协处理器来处理某些任务就无法工作。我知道的一个很好的例子是Nintendo DS,它包括一个67MHz的ARM9 CPU和一个33MHz的ARM7 CPU(在玩GBA游戏时也用于反向兼容)。对于DS游戏,ARM7可以处理音频和Wi-Fi通信,因为ARM9无法在屏幕上处理和记录任何笔记,同时又无法将音频直接馈送到声音芯片。因此,@ jmite指出“在什么约束下”,缺乏速度可能会要求多个CPU。
Slipp D. Thompson

10
在我的工作中,我们使用多核Xeons和Xenomai实时Linux扩展来进行低延迟音频处理。我们有一个三阶段的音频处理管道,每个阶段都有自己的专用核心,它使用约70%的周期。非实时任务将使用第四个核心,而前三个会剩下任何周期。如果单核CPU的速度是当前4核CPU的3倍以上,则只有在单核CPU上才有可能。鉴于当前的CPU运行在2GHz,这可能很难实现。
杰里米·弗里斯纳

19
单核CPU上的软件可以模拟多核CPU。区别几乎完全是速度。
user253751'3

24
在多核系统上必须做的一件事就是测试多线程软件。因为某些缺陷(几乎)永远不会在单核系统上发生。我不确定这是否可以作为答案,但是……
nikie

13
@nikie一个单核系统也可以模拟内存排序和过时的缓存-但我想这会非常低效(例如10倍速度下降)
Nayuki 2016年

Answers:


47

如果您不关心运行时间,那么您可以在多核计算机上进行任何操作,也可以在单核计算机上进行操作。多核计算机只是加快某些计算速度的一种方式。

TnTn


3
我不完全确定那是绝对正确的。我不认为可能在单个内核上生成内存一致性错误(是的,可以在单核上模拟多缓存系统,但是这种间接是一种作弊行为。)。(也许等效于通过VLIW中的move ops利用有保证的|| ism实现reg。swap)。我想即使在单线程内核上,仍然可以从多线程时序可变性中提取熵,但是熵每单位时间会更小(实际上,就像其他差异一样,这只是性能问题)。
保罗·克莱顿

6
@ PaulA.Clayton内存一致性错误通常是不需要的,并且编写良好的软件不应显示这些错误。但是,如果您确实愿意,可以在单个CPU上模拟它们。(尽管可能很慢)
user253751 '16

4
nn

11
“单核计算机可以使用时间分割/分时仿真多核计算机。” 自“现代”操作系统问世以来,确实如此。
与莫妮卡(Monica)

1
@ PaulA.Clayton我认为如果您要使用两个不同的进程来修改同一共享内存,则可能会遇到内存一致性问题(例如非原子增量)。您只需要抢先式多任务处理即可。当然,这通常就是为什么现代OS除非明确要求,否则它们的进程不会共享相同的可写内存。
Patrick M

58

问题是:在什么约束下?

如果我们问“是否可以在给定的时间内在硬件X上解决此问题”这一问题,肯定会有问题,答案是否定的。

但这不是一个“面向未来”的答案:过去不可能在单个内核中完成得足够快的事情现在可能现在可以了,而且我们无法预测未来的硬件将具备什么样的能力。

在可计算性方面,我们知道单带Turing Machine能够计算与单核或多核计算机相同的所有功能,因此,除了运行时,多核计算机可以解决以下问题没有任何问题:单核不能。

就图形而言,实际上,GPU上的所有内容可以在CPU上完成...如果您愿意等待足够长的时间。


3
@JanDvorak我实际上会说这根本不是通过GPU完成的;)
TomTom

15
如果时间不受限制,则可以手动,笔和纸进行所有计算。
mathreadler's

2
@mathreadler是的,因为大脑图灵完成了。事情变成了关于物理堆栈交换的漫长辩论
JBentley '16

4
其实,@JanDvorak,产生VGA非常简单,可以在软件中做一个卑微的16 MHz的微控制器上,作为该项目显示:pyroelectro.com/tutorials/arduino_basic_vga
axello

3
@mathreadler这实际上是一个比最初出现的问题还要复杂的问题。一个简短的答案可能是“是”,因为一台专用机器可以构建计算机而无需使用任何完整的工具来完成。较长的答案可能是“否”,因为构造图腾机的能力可能暗示一个人拥有处于“初始化”状态的更大的图腾机,在此状态下它构造其余的状态机。完整的答案更加复杂,因为我们从未构建过Turing Complete设备。我们已经针对以下机器开发了抽象的想法:
Cort Ammon

17

正如其他答案所指出的那样,单个CPU总是可以通过划分时间并扮演每个虚拟CPU的角色来模拟多个CPU。这种仿真肯定会计算出正确的答案。

在现实世界中,执行时间可能很重要。这可能意味着平庸的帧速率和出色的视觉体验之间的差异。或交易盈亏之间的差额。

一种病理性情况下的多处理器是远远比单处理器更快的是,在此处理是数据管道,上下文切换是昂贵的,并且对于每个流水线阶段的机器代码的CPU的缓存刚好适合。

让我用一些数字来说明。假设您有一个数据管道(3D渲染等),该管道具有4个处理阶段,每个阶段具有256 KiB的程序代码,并且您方便地拥有4个具有256 KiB的L2缓存的CPU。如果您尝试在单个CPU上运行此处理,则在4个任务之间切换会很昂贵,并且会导致大量的高速缓存未命中。另一方面,如果您在4核系统上运行它,则计算可能会非常顺利,缓存未命中率将降至最低,并且上下文切换将不存在。(作为附带说明,这与将某些应用程序固定到某些核心的概念有关,例如,仅在一个核心中执行OS内核操作或TCP / IP处理等。)


7

用单个CPU来开发真正有害的数据竞赛要困难得多。我的意思是,可以肯定的是,如果中断单个CPU,您可以在字词之间扯开关系,但是您可以构建没有单一线程交错的异国情调吗?

好的,也许犯下潜伏的错误并不算是对多代码改进的有效使用。事实证明,mutli-core在没有给定时间的情况下能做的事情并不多。原因很简单。如果您尝试避免这些有害的数据争用,则必须在代码中具有同步点。如果您将代码建模为一个计算网格,其中输入必须完整且同步,然后才能计算和产生输出,所以很容易看到单个CPU可以沿着网格工作,计算下一个可用的工作块。

实际上,如果您可以证明您的算法可以由Turing机器解决(这实际上是我们关心的每个算法),那么可以证明该算法不仅可以由单个核心CPU来完成,而且实际上可以状态机上有一块很长的磁带用于存储!

象棋比赛探测器实际利用此找到比赛的情况下。它运行单线程的所有内容,并系统地探索线程之间的所有可能的交错,以尝试查找由于竞争情况而导致测试失败的情况。CHESS 取决于您可以在单个内核上运行任何多线程应用程序这一事实。

当您开始扩展硬件限制时,就会出现需要多核的情况。一个明显的例子是您有时间限制。实时时间限制的某些问题无法实现单核,因为它们根本无法足够快地驱动单核的时钟。有一个原因是CPU会上升到4Ghz,然后稳定下来,而以较低的速度选择更多的内核。

这种时序约束的更奇特的版本是在硬实时系统中。在某些硬实时系统中,中断的服务要求如此之高,以至于您实际上必须选择一个多核CPU,以使您可以在各个内核之间划分中断,或者遇到时序限制。

数据总线带来了另一个限制。以蓝色基因/ P为例。JUGENE是一台特定的Blue Gene / P超级计算机,具有144 TB的内存。他们根本不会制造出可以访问所有内存的单CPU计算机。


1
关于,他们根本不会制造出可以访问[那么多]内存的单CPU计算机。 “不要”与“不能”不同。您可以设计和构建具有144 TB或更多主内存的单处理器。人们之所以不会这样做,是因为收益递减:在单处理器设计中增加更多内存的增量,实用价值在某个时候达到顶峰,然后随着内存大小的增加而下降,而增量成本却保持不变。
所罗门慢速

@jameslarge这就是为什么该句子出现在我的答案中讨论现实生活中的实用硬件的部分,以及为什么它没有出现在讨论理论能力的答案的前2/3中。
Cort Ammon

我的地下室中有两个系统来说明“不要”与“不能”。如果我可以在其硬件配置中物理地增加这么多的内存,则他们的CPU“可以”访问每个字节。但是我做不到,所以他们“做不到”。CPU的功能无法实现。
user2338816

我在想这样的答案。在单核环境中,竞争条件似乎是不可能的(或100%的时间发生)。对于实际应用,我认为软件开发人员可以通过编码一些奇怪的竞争条件测试来设计某种独特形式的复制保护,这些竞争条件测试将始终在特定目标硬件上通过,但在单核运行的仿真硬件上将失败。在这种情况下,多核系统的仿真有时可能会通过,但并不可靠。
丹·亨德森

6

如果您需要观察在单个处理元素上运行的流程而又不干扰其实时行为(或尽可能少),例如基准测试或活动日志记录,则可能需要单独的处理资源。


一个很好的简洁示例,如果没有多个处理器,则需要精确的仿真
Ben Leggiero

嘿,是您的帐户吗?Mayby您想合并吗?
邪恶的

4

其他答案则坚持将并行性视为“分布式并发”的观点。这给出了一些答案:在一个纯净的图灵计算模型中,多核没有优势。您可能获得的唯一优势是效率。

多个处理单元(PU)可以做一件事情是一个处理者不能做到的:并行执行操作,即同时执行操作。

如果您同时运行多个程序,这将非常有用。诚然,除了并发执行之外,您绝对不需要更多的东西,而且大多数用途都会降低效率。但是,就是这种差异。

假设您需要实时处理来自多个源的数据传感器数据。无论这对您的应用程序意味着什么,一个PU只能同时处理这么多输入流,而不会违反其响应时间限制。因此,对于当前的PU一代而言,一旦传感器太多,就需要多个PU。

k

kkk


0

从CS pov来看,“多核”在理论上与“分布式计算”没有太大不同。基本概念是“独立的计算元素(并行计算)。因此,稍微改写问题(“多核”实际上并不是CS中的理论概念)会导致其他可能性。在其他答案中指出,顺序编程是等价于CS视角的并行编程。这可以追溯到用于计算的理论系统的定义,即图灵机.CS性能的理论分析最终是根据TM进行的,而并行与顺序的区别实际上并没有应用(尽管多带TM有点类似)。

但是对于该问题的考虑不是那么抽象,对于某些涉及容错的问题,分布式计算的确确实是优越的,甚至可能甚至需要。在这一领域中,有一个概念适用于/在独立计算元素被认为具有某种程度的不可靠性的情况下 (这并不是在所有情况下都普遍适用的假设)。在某些情况下,使用甚至不需要独立的计算元素就可以提高容错能力。

  • 考虑到每个处理器在计算期间都有独立的[[x]%]失败机会。可以设计一个系统,通过通信,系统的整体容错能力优于单个组件。这在数十年前就已应用,例如在航天飞机系统中。最近,有一些基本协议旨在利用它,例如Paxos,它解决了所谓的共识问题。一个更实际的例子是Google,该公司拥有许多专有算法,这些算法本质上是由个别不可靠的元素结合容错算法来构建其超级计算机。

  • 比特币涉及分布式交易来计算总账,而不仅仅是由于处理负荷问题。该算法经过精心设计,可以阻止损坏的节点。简而言之,它“解决” /实现了拜占庭将军问题,这不仅涉及最大化并行性能,还涉及独立实体彼此“检查”,并“通过算法/密码学/安全地”拒绝无效的计算,又称“作弊”或“腐败”。

  • 对并行性的经典分析得出的结论是,大约有7种“基本”问题模式类型分解为特定的并行执行故障。参见并行计算研究的前景:伯克利的观点

  • 这里有一个开放的理论问题的一个要素,其中大多数其他答案都涉及性能考量。是否存在并行比顺序并行“固有更快”的问题也大致称为P =?NC问题,其中NC被认为是“高效并行”算法的类别,而P是“高效[顺序]算法” ”


1
我喜欢这个答案!我从您的例子中学到了很多:D
Ben Leggiero

+1为具有辐射的关键任务环境中的容错能力,+ 1为缺乏上限和冗余性。
Cees Timmerman
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.