什么是_kmp_fork_barrier以及如何查看是否存在负载不平衡?

时间:2017-04-28 10:48:11

标签: parallel-processing intel xeon-phi vtune knights-landing

我正在使用英特尔VTune放大器来查看我的并行应用程序如何扩展。

注意我没有使用任何显式锁机制

它在我的4核笔记本电脑上可以很好地扩展(考虑到有部分算法无法并行化):

enter image description here

但是,当我在Knights Landing(KNL)上进行测试时,它会出现可怕的扩展:

enter image description here

请注意,我只是故意使用64个核心(说到这一点,如果你对线程关联感兴趣,我已经在主题上打开了另一个question。< / p>

为什么有这么多空闲时间?什么是_kmp_fork_barrier?阅读“不平衡或串行旋转(OpenMP)”,这似乎是关于负载不平衡,但我已经在所有schedule(dynamic,1)区域使用omp

如何判断这是否实际上是负载不平衡?否则,可能是什么原因?

注意我有3个并行的omp并行区域:

#pragma omp parallel for collapse(2) schedule(dynamic,1)

#pragma omp declare reduction(mergeFindAffineShapeArgs : std::vector<FindAffineShapeArgs> : omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end()))
#pragma omp parallel for collapse(2) schedule(dynamic,1) reduction(mergeFindAffineShapeArgs : findAffineShapeArgs)

#pragma omp declare reduction(mergeFindAffineShapeArgs : std::vector<FindAffineShapeArgs> : omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end()))
#pragma omp parallel for collapse(2) schedule(dynamic,1) reduction(mergeFindAffineShapeArgs : findAffineShapeArgs)

这是自下而上的部分:

enter image description here

这可能是因为reduction吗?我知道它非常有效(使用divide-et-impere合并方法)。

在这里看看最昂贵的函数如何很好地并行化(大多数):

enter image description here

放大纺纱部分(按照推荐的要求)enter image description here

评论中要求的OpenMP直方图:

减少区域:

enter image description here

unkwown region abbout initInterTab2d

enter image description here

更新

使用TBB和OpenMP禁用构建OpenCV会删除这个奇怪的并行区域iniInterTab2D。所以这肯定与OpenCV有关,但我不知道如何。

1 个答案:

答案 0 :(得分:2)

您需要学习更好地使用VTune。 它具有特定的OpenMP分析,可以避免您不必询问OpenMP运行时的内部。请查看https://software.intel.com/en-us/node/544172https://software.intel.com/en-us/openmp-analysis-lin作为介绍。

P.S。在任何地方使用schedule(dynamic,1)可能是一个坏主意。

p.p.s。在绘制缩放结果之前,请先阅读my blog about how to to that

完全披露:我在英特尔工作,有时在OpenMP运行时工作。