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
秒(最佳加速比)。在某些极端情况下,它甚至比原始顺序程序花费更多的时间
为什么?最重要的是,如何提高可伸缩性?不可伸缩性的常见原因有:
openmp
,从synchronized
到atomic
的简单更改可能会导致相关差异
1.2有时,较差的顺序算法可能会提供更好的并行性机会,如果您有机会尝试其他方法,那么可能值得一试
RSFalcon7的所有建议都可以组合成一个“超级规则”:在非共享资源(L1和L2缓存)中尽可能多地执行—这意味着节约代码和数据需求—如果您需要使用共享资源,请在使用同步之前在L3中尽可能多地执行(同步所需的CPU周期是可变的,但比访问RAM慢——或慢得多)在进入磁盘之前 如果您计划使用超线程,我发现使用gcc编译的代码在优化级别为O1时会比使用O2或O3时更好地使用超线程