当考虑我们的程序必须具有多线程友好性时,我的团队对是否有绝对不能在单核CPU上完成的事情感到困惑。我认为图形处理需要大量的并行处理,但是他们认为像DOOM这样的事情是在没有GPU的单核CPU上完成的。
有什么,必须在多核心处理器做什么?
假设开发和运行都有无限的时间。
当考虑我们的程序必须具有多线程友好性时,我的团队对是否有绝对不能在单核CPU上完成的事情感到困惑。我认为图形处理需要大量的并行处理,但是他们认为像DOOM这样的事情是在没有GPU的单核CPU上完成的。
有什么,必须在多核心处理器做什么?
假设开发和运行都有无限的时间。
Answers:
问题是:在什么约束下?
如果我们问“是否可以在给定的时间内在硬件X上解决此问题”这一问题,肯定会有问题,答案是否定的。
但这不是一个“面向未来”的答案:过去不可能在单个内核中完成得足够快的事情现在可能现在可以了,而且我们无法预测未来的硬件将具备什么样的能力。
在可计算性方面,我们知道单带Turing Machine能够计算与单核或多核计算机相同的所有功能,因此,除了运行时,多核计算机可以解决以下问题没有任何问题:单核不能。
就图形而言,实际上,GPU上的所有内容都可以在CPU上完成...如果您愿意等待足够长的时间。
正如其他答案所指出的那样,单个CPU总是可以通过划分时间并扮演每个虚拟CPU的角色来模拟多个CPU。这种仿真肯定会计算出正确的答案。
在现实世界中,执行时间可能很重要。这可能意味着平庸的帧速率和出色的视觉体验之间的差异。或交易盈亏之间的差额。
一种病理性情况下的多处理器是远远比单处理器更快的是,在此处理是数据管道,上下文切换是昂贵的,并且对于每个流水线阶段的机器代码的CPU的缓存刚好适合。
让我用一些数字来说明。假设您有一个数据管道(3D渲染等),该管道具有4个处理阶段,每个阶段具有256 KiB的程序代码,并且您方便地拥有4个具有256 KiB的L2缓存的CPU。如果您尝试在单个CPU上运行此处理,则在4个任务之间切换会很昂贵,并且会导致大量的高速缓存未命中。另一方面,如果您在4核系统上运行它,则计算可能会非常顺利,缓存未命中率将降至最低,并且上下文切换将不存在。(作为附带说明,这与将某些应用程序固定到某些核心的概念有关,例如,仅在一个核心中执行OS内核操作或TCP / IP处理等。)
用单个CPU来开发真正有害的数据竞赛要困难得多。我的意思是,可以肯定的是,如果中断单个CPU,您可以在字词之间扯开关系,但是您可以构建没有单一线程交错的异国情调吗?
好的,也许犯下潜伏的错误并不算是对多代码改进的有效使用。事实证明,mutli-core在没有给定时间的情况下能做的事情并不多。原因很简单。如果您尝试避免这些有害的数据争用,则必须在代码中具有同步点。如果您将代码建模为一个计算网格,其中输入必须完整且同步,然后才能计算和产生输出,所以很容易看到单个CPU可以沿着网格工作,计算下一个可用的工作块。
实际上,如果您可以证明您的算法可以由Turing机器解决(这实际上是我们关心的每个算法),那么可以证明该算法不仅可以由单个核心CPU来完成,而且实际上可以状态机上有一块很长的磁带用于存储!
在象棋比赛探测器实际利用此找到比赛的情况下。它运行单线程的所有内容,并系统地探索线程之间的所有可能的交错,以尝试查找由于竞争情况而导致测试失败的情况。CHESS 取决于您可以在单个内核上运行任何多线程应用程序这一事实。
当您开始扩展硬件限制时,就会出现需要多核的情况。一个明显的例子是您有时间限制。实时时间限制的某些问题无法实现单核,因为它们根本无法足够快地驱动单核的时钟。有一个原因是CPU会上升到4Ghz,然后稳定下来,而以较低的速度选择更多的内核。
这种时序约束的更奇特的版本是在硬实时系统中。在某些硬实时系统中,中断的服务要求如此之高,以至于您实际上必须选择一个多核CPU,以使您可以在各个内核之间划分中断,或者遇到时序限制。
数据总线带来了另一个限制。以蓝色基因/ P为例。JUGENE是一台特定的Blue Gene / P超级计算机,具有144 TB的内存。他们根本不会制造出可以访问所有内存的单CPU计算机。
如果您需要观察在单个处理元素上运行的流程而又不干扰其实时行为(或尽可能少),例如基准测试或活动日志记录,则可能需要单独的处理资源。
从CS pov来看,“多核”在理论上与“分布式计算”没有太大不同。基本概念是“独立的计算元素(并行计算)。因此,稍微改写问题(“多核”实际上并不是CS中的理论概念)会导致其他可能性。在其他答案中指出,顺序编程是等价于CS视角的并行编程。这可以追溯到用于计算的理论系统的定义,即图灵机.CS性能的理论分析最终是根据TM进行的,而并行与顺序的区别实际上并没有应用(尽管多带TM有点类似)。
但是对于该问题的考虑不是那么抽象,对于某些涉及容错的问题,分布式计算的确确实是优越的,甚至可能甚至需要。在这一领域中,有一个概念适用于/在独立计算元素被认为具有某种程度的不可靠性的情况下 (这并不是在所有情况下都普遍适用的假设)。在某些情况下,使用甚至不需要独立的计算元素就可以提高容错能力。
考虑到每个处理器在计算期间都有独立的[[x]%]失败机会。可以设计一个系统,通过通信,系统的整体容错能力优于单个组件。这在数十年前就已应用,例如在航天飞机系统中。最近,有一些基本协议旨在利用它,例如Paxos,它解决了所谓的共识问题。一个更实际的例子是Google,该公司拥有许多专有算法,这些算法本质上是由个别不可靠的元素结合容错算法来构建其超级计算机。
比特币涉及分布式交易来计算总账,而不仅仅是由于处理负荷问题。该算法经过精心设计,可以阻止损坏的节点。简而言之,它“解决” /实现了拜占庭将军问题,这不仅涉及最大化并行性能,还涉及独立实体彼此“检查”,并“通过算法/密码学/安全地”拒绝无效的计算,又称“作弊”或“腐败”。
对并行性的经典分析得出的结论是,大约有7种“基本”问题模式类型分解为特定的并行执行故障。参见并行计算研究的前景:伯克利的观点
这里有一个开放的理论问题的一个要素,其中大多数其他答案都涉及性能考量。是否存在并行比顺序并行“固有更快”的问题也大致称为P =?NC问题,其中NC被认为是“高效并行”算法的类别,而P是“高效[顺序]算法” ”