并行程序中子线性加速的原因

时间:2011-05-20 06:28:35

标签: erlang multicore parallel-processing performance

并行程序无法实现理想加速的原因是什么?

例如,我考虑过数据依赖性,线程(或参与者)之间数据传输的成本,访问相同数据结构的同步,任何其他想法(或我提到的原因的子类别)?

我对erlang actor模型中出现的问题特别感兴趣,但欢迎任何其他问题。

3 个答案:

答案 0 :(得分:5)

一些没有特别的顺序:

  1. 缓存行共享 - 同一缓存行上的多个变量可能会在处理器之间产生开销,即使理论模型表明它们应该是独立的。
  2. 上下文切换开销 - 如果线程数多于核心数,则上下文切换会产生开销。
  3. 内核可伸缩性问题:内核可能很好,例如4核,但效率低8。
  4. Lock conveying
  5. Amdahl's law - 程序并行加速的限制是可以并行化的程序的比例。

答案 1 :(得分:4)

一个原因是程序的并行化通常比想象的更困难,并且可能发生许多微妙的问题。有关此问题的非常好的讨论,请参阅Amdahl's Law

答案 2 :(得分:2)

Erlang Actor模型的主要问题是每个进程都有自己的内存堆,并且传递的消息被复制。与使用共享内存的常用方法形成对比,您可以将指针传递给进程之间的结构。

在共享内存环境中,程序员可以确保一次只有一个进程/线程在一块内存上运行。也就是说,某些进程被指定为 it ,并负责在该内存区域上做正确的事情。在Erlang中没有那么多:一个进程不能通过设计在其他进程内存区域中进行翻找,并且必须将值复制到其他进程。当我们考虑程序的健壮性时,这是非常强大的,但如果我们考虑程序执行的速度,则不是那么强大。另一方面,如果我们想要一台多台计算机的分布式环境,复制统治着王,这是在机器之间传输数据的唯一方法。

Amdahl定律发挥作用,因为您的程序的某些部分可能无法在多个核心上展开。有些问题本质上是连续的:你没有希望加速它们。通常它们是迭代的,其中每个新的迭代都依赖于前者,你无法猜测新的迭代。