我没有看看使用OpenMP的一些代码,尽pipe我不太熟悉它。 (代码也没有OpenMP。)
当运行一个分析器时,我发现程序在“OMP隐式屏障”函数中花费了大约20%的挂钟时间。
是OpenMP的典型,还是(可能)意味着工作负载没有平均分配在线程之间?
谢谢
在大多数OpenMP结构for
(如C / C ++)或do
(在Fortran中), sections
和single
(但是在master
结构的末尾没有障碍)存在隐含的障碍。 如果算法允许不同的线程在工作共享指令之后运行,则可以使用nowait
子句来禁用这些隐式屏障。 另一个隐式屏障位于每个并行区域的末尾,作为fork / join执行模型的一部分。
你已经正确地猜测,隐含屏障等待时间的高百分比通常意味着工作分配远不是最佳的。 这可能是(大量的)大的single
结构,也可能是每个迭代具有不同的执行时间的并行循环( for
/ do
结构)。 如果不平衡来自每次迭代中计算时间不同的循环(规范示例绘制Mandelbrot集),则可以使用schedule(dynamic,chunk)
子句将循环调度更改为dynamic
,其中chunk
是块大小(> = 1)。 块大小越小,负载平衡越好,但动态环路调度器的开销会更高。 数据块越大,开销越低,但会出现更多的负载不平衡。 最佳值通常取决于问题类型和硬件,因此必须调整值以便在代码执行的特定系统上获得最佳性能。