Parallel processing 共享内存程序不可伸缩的常见原因是什么?

Parallel processing 共享内存程序不可伸缩的常见原因是什么?,parallel-processing,scalability,shared-memory,Parallel Processing,Scalability,Shared Memory,每当有人并行化一个应用程序时,预期的结果是相当不错的加速,但并非总是如此 通常情况下,一个在x秒内运行的程序,如果并行化以使用8个内核,将无法达到x/8秒(最佳加速比)。在某些极端情况下,它甚至比原始顺序程序花费更多的时间 为什么?最重要的是,如何提高可伸缩性?不可伸缩性的常见原因有: 太多同步:一些问题(有时是太多保守的程序员)需要在并行任务之间进行大量同步,这消除了算法中的大部分并行性,使其速度变慢 1.1。确保对算法使用尽可能少的同步。例如,使用openmp,从synchronized到a

每当有人并行化一个应用程序时,预期的结果是相当不错的加速,但并非总是如此

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


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

不可伸缩性的常见原因有:

  • 太多同步:一些问题(有时是太多保守的程序员)需要在并行任务之间进行大量同步,这消除了算法中的大部分并行性,使其速度变慢
  • 1.1。确保对算法使用尽可能少的同步。例如,使用
    openmp
    ,从
    synchronized
    atomic
    的简单更改可能会导致相关差异

    1.2有时,较差的顺序算法可能会提供更好的并行性机会,如果您有机会尝试其他方法,那么可能值得一试

  • 内存带宽限制:算法最“琐碎”的实现没有针对局部性进行优化是很常见的,这意味着处理器和主内存之间的通信成本很高
  • 2.1局部优化:这意味着了解应用程序将运行在哪里,可用的缓存内存是什么,以及如何更改数据结构以最大限度地利用缓存

  • 太多的并行化开销:有时并行任务太“小”,以至于与并行区域总时间相比,线程/进程创建的开销太大,这会导致较差的加速甚至减速

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

    如果您计划使用超线程,我发现使用gcc编译的代码在优化级别为O1时会比使用O2或O3时更好地使用超线程