哪些是共享内存程序不可扩展的常见原因?

时间:2015-07-23 13:37:35

标签: parallel-processing scalability shared-memory

每当有人对应用程序进行并行处理时,预期结果都是一个不错的加速,但情况并非总是如此。

通常,在x秒内运行并且使用8个内核的程序将达不到x/8秒(最佳加速)。在某些极端情况下,它甚至比原始顺序程序花费更多时间。

为什么?,最重要的是,如何提高可扩展性?

2 个答案:

答案 0 :(得分:2)

导致不可扩展性的原因有几个:

  1. 同步太多:有些问题(有时太多保守的程序员)需要在并行任务之间进行大量同步,这会消除算法中的大部分并行性,使其变慢。
  2. 1.1。确保使用算法可能的最小同步。例如,使用openmp,从synchronizedatomic的简单更改可能会产生相关差异。

    1.2有时,较差的顺序算法可能会提供更好的并行机会,如果你有机会尝试别的东西,它可能值得一试。

    1. 内存带宽限制:非常普遍的是,算法的最“平凡”实现并未针对局部性进行优化,这意味着处理器与主内存之间的通信成本很高。
    2. 2.1优化局部性:这意味着要了解应用程序的运行位置,可用的缓存内容以及如何更改数据结构以最大化缓存使用率。

      1. 并行化开销太多:有时并行任务是如此“小”,以至于线程/进程创建的开销与并行区域总时间相比太大,导致加速不佳甚至减速。

答案 1 :(得分:0)

所有RSFalcon7的建议都可以合并为一个“超级规则”:尽可能多地在非共享资源(L1和L2缓存)中执行 - 意味着节省代码和数据要求 - 如果您需要转到共享资源在进入RAM之前,在进入RAM之前尽可能多地做L3(在进入磁盘之前,同步所需的CPU周期是可变的,但比访问RAM要慢或者慢得多)。

如果你计划利用超线程,我发现使用gcc编译的代码将优化级别O1使用超线程,而不是O2或O3。