【发布时间】:2015-07-23 13:37:35
【问题描述】:
每当有人并行化应用程序时,预期的结果是一个不错的加速,但并非总是如此。
通常情况下,在x 秒内运行的程序并行使用 8 个内核将无法达到x/8 秒(最佳加速)。在某些极端情况下,它甚至比原来的顺序程序需要更多的时间。
为什么?最重要的是,我如何提高可扩展性?
【问题讨论】:
标签: parallel-processing scalability shared-memory
每当有人并行化应用程序时,预期的结果是一个不错的加速,但并非总是如此。
通常情况下,在x 秒内运行的程序并行使用 8 个内核将无法达到x/8 秒(最佳加速)。在某些极端情况下,它甚至比原来的顺序程序需要更多的时间。
为什么?最重要的是,我如何提高可扩展性?
【问题讨论】:
标签: parallel-processing scalability shared-memory
不可扩展性有几个常见的原因:
1.1。确保为您的算法使用尽可能少的同步。以openmp 为例,从synchronized 到atomic 的简单更改可能会导致相关差异。
1.2 有时,更差的顺序算法可能会提供更好的并行机会,如果您有机会尝试其他方法,可能值得一试。
2.1 优化局部性:这意味着了解您的应用程序将在哪里运行、可用的缓存内存有哪些以及如何更改数据结构以最大限度地利用缓存。
【讨论】:
RSFalcon7 的所有建议都可以组合成一条“超级规则”:尽可能多地使用非共享资源(L1 和 L2 缓存)——这意味着节省代码和数据需求——如果您需要使用共享资源,请执行在进入磁盘之前,在进入 RAM 之前尽可能在 L3 中进行(同步所需的 CPU 周期是可变的,但比访问 RAM 慢 - 或慢得多)。
如果您打算使用超线程,我发现使用 gcc 编译的代码在优化级别为 O1 时会比使用 O2 或 O3 时更好地使用超线程。
【讨论】: