动态调度更好还是静态调度(并行编程)?

时间:2015-04-28 10:21:48

标签: multithreading parallel-processing openmp scheduling

我理解我的问题标题相当广泛,我是并行编程和openmp的新手。我尝试将C++ solution并行化为N体问题,并针对不同的计划类型和粒度进行研究。我通过针对不同情况运行程序并绘制数据来收集数据,这是我得到的(性能与线程数)(Performance可以假设与MegaFLOPS成比例。)

enter image description here

  

性能与线程数

我很惊讶地看到静态调度通常比动态调度更好地解决了这个问题?任何人都可以解释这种行为的可能原因吗?

1 个答案:

答案 0 :(得分:2)

您的结果并不令人注意到动态和静态方法调度之间的巨大差异。我发现在您想要查看并行可伸缩性行为的上下文中,测量speedup更合适。您还可以使用不同的指标,例如weak and strong scaling

使用粗粒度方法进行调度时,很难达到2的加速。这还不足以得出任何结论。此外, 你无法从细粒度的实现中分析你的结果,因为你没有平行的收益(这可以用你对每个线程的不良工作量来解释)。首先获得良好的并行可伸缩性。

通常我会选择静态或动态调度,具体取决于我正在进行的计算类型:

  • 静态调度,其中计算工作负载是规则的(每个线程相同),例如基本图像卷积,朴素矩阵计算。例如,对gaussian filter使用静态调度应该是最佳选择。

  • 动态调度,其中计算工作量是不规则的,例如Mandelbrot集。动态工作的方式稍微复杂一些(块不像静态调度那样预先计算),因此可能会出现一些开销。

  • 引导式调度与动态调度非常相似,但从大块大小开始,随着时间的推移而减少。

在你的情况下,你的nbody模拟意味着非常规律的作品。所以静态调度应该更合适。具有良好的并行可伸缩性有时是经验性的,取决于您的上下文。

我建议首先让OpenMP为您选择最佳的时间安排和块大小,然后根据需要尝试使用。