4

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

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

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

在此处输入图像描述

但是,当我在 Knights Landing (KNL) 上对其进行测试时,它的扩展非常可怕:

在此处输入图像描述

请注意,我故意只使用 64 个内核(说到这一点,如果您对线程亲和力感兴趣,我已经打开了关于该主题的另一个问题)。

为什么有这么多空闲时间?什么是_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)

这是自下而上的部分:

在此处输入图像描述

这可能是因为reduction? 我知道它非常有效(使用分而治之合并方法)。

在这里查看最昂贵的函数如何很好地并行化(其中大部分):

在此处输入图像描述

放大旋转部分(根据推荐)在此处输入图像描述

评论中要求的 OpenMP 直方图:

还原区域:

在此处输入图像描述

未知区域简介initInterTab2d

在此处输入图像描述

更新:

在禁用 TBB 和 OpenMP 的情况下构建 OpenCV 删除了这个奇怪的并行区域iniInterTab2D。所以这肯定与 OpenCV 相关,但我不知道如何。

4

1 回答 1

3

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

psschedule(dynamic,1)到处使用可能是个坏主意。

pps 在绘制缩放结果之前,请阅读我的博客以了解如何做到这一点

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

于 2017-05-02T08:45:36.703 回答