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

Is dynamic scheduling better or static scheduling (Parallel Programming)?

我知道我的问题标题很宽泛,我是并行编程和 openmp 的新手。我试图并行化一个 C++ solution for the N-body problem and study it for different schedule types and granularity. I collected data by running a program for different cases and plotted the data, this is what I got (Performance vs Number of threads) (Performance 可以假定为与 MegaFLOPS 成正比。)

Performance vs Number of Threads

我惊讶地发现 静态调度 在这个问题上通常比 动态调度 做得更好?任何人都可以解释这种行为的可能原因吗?

您的结果与动态和静态进近调度之间的显着差异无关。我发现测量 speedup more appropriate in your context where you want to see the behaviour of your parallel scalability. You can also use different metrics such as weak and strong scaling.

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

通常我会根据我正在处理的计算类型选择静态或动态调度:

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

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

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

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

我建议首先让 OpenMP 为您选择最佳调度和块大小,然后在需要时尝试使用一些东西。