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