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



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

例如,我

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

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

一些没有特别的顺序:

  1. 高速缓存行共享 - 同一高速缓存行上的多个变量可能会在处理器之间产生开销,即使理论模型说它们应该是独立的。
  2. 上下文切换开销 - 如果线程数多于内核数,则上下文切换将产生开销。
  3. 内核
  4. 可扩展性问题:内核在 4 个内核时可能很好,但在 8 个内核时效率较低。
  5. 锁具输送
  6. 阿姆达尔定律 - 程序并行加速的极限是可以并行的程序的比例。

一个原因是并行化程序通常比人们想象的要困难得多,并且可能发生许多微妙的问题。有关这方面的很好的讨论,请参阅阿姆达尔定律。

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

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

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

最新更新