OpenMP:20%的时间在“隐性障碍”?

我没有看看使用OpenMP的一些代码,尽pipe我不太熟悉它。 (代码也没有OpenMP。)

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

是OpenMP的典型,还是(可能)意味着工作负载没有平均分配在线程之间?

谢谢

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

你已经正确地猜测,隐含屏障等待时间的高百分比通常意味着工作分配远不是最佳的。 这可能是(大量的)大的single结构,也可能是每个迭代具有不同的执行时间的并行循环( for / do结构)。 如果不平衡来自每次迭代中计算时间不同的循环(规范示例绘制Mandelbrot集),则可以使用schedule(dynamic,chunk)子句将循环调度更改为dynamic ,其中chunk是块大小(> = 1)。 块大小越小,负载平衡越好,但动态环路调度器的开销会更高。 数据块越大,开销越低,但会出现更多的负载不平衡。 最佳值通常取决于问题类型和硬件,因此必须调整值以便在代码执行的特定系统上获得最佳性能。