我正在使用英特尔 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 相关,但我不知道如何。