multithreading - 添加额外的内核或 CPU 根本不会提高性能的点在哪里?

标签 multithreading concurrency parallel-processing multicore

*Adding a second core or CPU might increase the performance of your parallel program, but it is unlikely to double it. Likewise, a four-core machine is not going to execute your parallel program four times as quickly— in part because of the overhead and coordination described in the previous sections. However, the design of the computer hardware also limits its ability to scale. You can expect a significant improvement in performance, but it won’t be 100 percent per additional core, and there will almost certainly be a point at which adding additional cores or CPUs doesn’t improve the performance at all.



*

我从一本书中读到了上面的段落。但我没有得到最后一句话。
那么,添加额外的内核或 CPU 根本不会提高性能的点在哪里呢?

最佳答案

如果您采用串行程序和同一程序的并行版本,则并行程序必须执行一些串行程序不执行的操作,特别是与协调多个处理器的操作有关的操作。这些导致了通常所说的“并行开销”——并行程序必须做的额外工作。这是导致难以在 2 个处理器上实现 2 倍加速、在 4 个处理器上实现 4 倍加速或在 32000 个处理器上实现 32000 倍加速的因素之一。

如果您检查并行程序的代码,您通常会发现串行段,即仅使用一个处理器而其他处理器空闲。有一些(片段)算法是不可并行的,并且有一些操作通常不是并行的,但可能是:例如 I/O 操作,要并行化这些,您需要某种并行 I/O 系统。这个“序列分数”为您的计算提供了不可减少的最小时间。 Amdahl's Law解释了这一点,那篇文章为您进一步阅读提供了一个有用的起点。

即使您确实有一个很好并行化的程序,缩放(即加速方式随着处理器数量的增加而变化)也不等于 1。对于大多数并行程序,并行开销的大小(或处理器时间的量)专用于并行计算所需的操作)随着处理器数量的某些函数而增加。这通常意味着添加处理器会增加并行开销,并且在扩展程序和作业的某个时刻,开销的增加会抵消(甚至逆转)处理器能力的增加。关于阿姆达尔定律的文章还涵盖了与此处相关的古斯塔夫森定律。

我用非常笼统的术语表达了这一切,没有考虑当前的处理器和计算机体系结构;我所描述的是并行计算(目前理解)的特征,而不是任何特定程序或计算机的特征。

我完全不同意@Daniel Pittman 的断言,即这些问题只是理论上的问题。我们中的一些人正在非常努力地使我们的程序扩展到非常大量的处理器(1000 个)。现在几乎所有的桌面和办公室开发,以及大多数移动开发,都针对多处理器系统,使用所有这些内核是一个主要问题。

最后,回答您的问题,在什么时候添加处理器不再提高执行速度,现在这是一个与架构和程序相关的问题。令人高兴的是,它可以进行实证研究。找出并行程序的可扩展性,并确定改进它的方法,是软件工程“专业”中日益增长的利基市场。

关于multithreading - 添加额外的内核或 CPU 根本不会提高性能的点在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9799087/

相关文章:

c++ - 这个奇怪的 clang 编译错误

c# - Socket.Shutdown 和线程

multithreading - Nodejs中的单线程是什么意思

Java并行执行比顺序执行慢

algorithm - 算法应该并行化的一些提示是什么?

multithreading - Delphi [volatile]和InterlockedCompareExchange不可靠吗?

java - 是否存在具有 getAndWait() 方法的 HashMap?例如。 BlockingConcurrentHashMap 实现?

java - 使用AtomicInteger时进行同步

java - 当我尝试倒计时时同步被阻塞

c - 在进程之间传递值