OpenMP:“隐式屏障”中有 20% 的时间?

Posted

技术标签:

【中文标题】OpenMP:“隐式屏障”中有 20% 的时间?【英文标题】:OpenMP: 20% time in "implicit barrier"? 【发布时间】:2012-12-27 14:51:22 【问题描述】:

我正在研究一些使用 OpenMP 的代码,尽管我对它不太熟悉。 (代码也不是 OpenMP。)

当针对它运行分析器时,我发现该程序在“OMP 隐式屏障”函数中花费了大约 20% 的挂钟时间。

这是 OpenMP 的典型特征,还是(可能)意味着工作负载在线程之间分布不均?

谢谢

【问题讨论】:

这完全取决于应用程序在障碍之间的作用。即,如果它做的很少那么确定,它将把所有时间都花在 MP 上。 这很不寻常,正如您所建议的那样,这是负载不平衡的症状。如果您能找到特定的隐含障碍,我们可能会提供更多建议——例如,如果它位于 omp for 工作共享结构的末尾,您可以尝试使用 schedule(dynamic) 看看是否有帮助。 【参考方案1】:

在大多数 OpenMP 结构的末尾都有隐式障碍,例如 for(在 C/C++ 中)或 do(在 Fortran 中)、sectionssingle(但是,在末尾没有障碍master 构造)。 nowait 子句可用于禁用这些隐式屏障,如果算法允许不同的线程在工作共享指令之后不同步运行。另一个隐式屏障位于每个并行区域的末尾,作为 fork/join 执行模型的一部分。

您猜对了,隐式障碍等待时间的高百分比通常意味着工作共享远非最佳。可能存在(大量)大型 single 构造,也可能存在并行循环(for/do 构造),每次迭代的执行时间不同。如果不平衡来自每次迭代中计算时间不同的循环(典型示例是绘制 Mandelbrot 集),则可以使用schedule(dynamic,chunk) 子句将循环调度更改为dynamic,其中chunk 是块大小( >= 1)。块大小越小,负载平衡越好,但动态循环调度程序的开销会更高。块大小越大,开销越低,但会出现更多的负载不平衡。最佳值通常取决于问题的类型和硬件,因此必须调整该值才能在执行代码的特定系统上获得最佳性能。

【讨论】:

以上是关于OpenMP:“隐式屏障”中有 20% 的时间?的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 多线程更新同一个数组

OpenMP入门教程

OpenMP 运行时看不到我的 GPU 设备

在运行时本地启用/禁用 OpenMP

仅在将参数传递给程序时使用 openMP

使用 openmp 时运行的线程数不一致