如果你把一个串行程序和同一程序的并行版本,然后并行程序必须做一些操作的串行程序不对,特别是涉及协调多个处理器的运算操作。这些贡献于通常所说的“并行开销” - 并行程序必须做的额外工作。这是导致难以在2个处理器上获得2倍加速的因素之一,在32000处理器上4倍或32000倍。
如果您检查并行程序的代码,你会经常发现片段,其序列,也就是只使用一个处理器,而其他是空闲的。有一些(不完整)算法是可以并行化的,有些操作通常不是并行化的,但可能是:I/O操作,例如为了平行化,需要某种并行I/O系统。这个“序列分数”为您的计算提供了不可简化的最短时间。 Amdahl's Law解释了这一点,该文章为您的进一步阅读提供了一个有用的起点。
即使你确实有一个很好并行的程序,缩放比例(即加速度随处理器数量的增加而变化的方式)也不等于1.对于大多数并行程序来说,并行开销的大小(或者用于并行计算仅需要的操作的处理器时间量)随着处理器数量的一些函数而增加。这通常意味着添加处理器会增加并行开销,并且在程序和作业扩展的某个时刻,开销的增加会消除(甚至反转)处理器能力的增加。关于阿姆达尔定律的文章也涵盖了与此相关的古斯塔夫森定律。
我已经说过这一切的一般条款,没有考虑当前的处理器和计算机体系结构;我所描述的是并行计算的特性(目前我们可以理解),而不是任何特定的程序或计算机。
我不同意@丹尼尔皮特曼的断言,这些问题只是理论上的问题。我们中的一些人正在努力使我们的程序扩展到大量的处理器(1000s)。现在几乎所有的桌面和办公室开发以及大多数移动开发都针对多处理器系统,并且使用所有这些内核是一个主要问题。
最后,要回答你的问题,在什么时候添加处理器不再提高执行速度,现在这是一个与架构和程序相关的问题。令人高兴的是,这是一种适合于实证调查的方法。确定并行程序的可扩展性,并找出改进方法,是软件工程“专业”中的一个增长点。
我同意内存带宽限制,这是目标共享内存多处理器体系结构时的一个严重问题。但是,我坚决不同意你的观点,即这些问题只是理论上的。高性能计算中的大部分努力旨在利用这些限制,并且经常成功地将可扩展性限制推到数百/数千个内核之外。 – Francesco 2012-03-21 08:29:42
-1“但这是一个非常理论化的问题。几乎没有任何规模足够好,可以继续利用更少的核心。很少有应用程序可以从4,少于8,几乎不会从64核心中受益,远低于任何理论上的性能限制。“这仅仅是无稽之谈,我的八个Xeon内核中有两个可以最大化整个系统的主内存带宽。鞭打不会在理论上扩大规模,也不会在实践中扩展,这不是“一个非常理论上的问题”,它决定了我如何编写我的应用程序。 – 2012-06-02 10:51:23