我正在使用英特尔VTune放大器来查看我的并行应用程序如何扩展。
注意我没有使用任何显式锁机制
它在我的4核笔记本电脑上可以很好地扩展(考虑到有部分算法无法并行化):
但是,当我在Knights Landing(KNL)上进行测试时,它会出现可怕的扩展:
请注意,我只是故意使用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)
这是自下而上的部分:
这可能是因为reduction
吗?我知道它非常有效(使用divide-et-impere合并方法)。
在这里看看最昂贵的函数如何很好地并行化(大多数):
评论中要求的OpenMP直方图:
减少区域:
unkwown region abbout initInterTab2d
:
更新
使用TBB和OpenMP禁用构建OpenCV会删除这个奇怪的并行区域iniInterTab2D
。所以这肯定与OpenCV有关,但我不知道如何。
答案 0 :(得分:2)
您需要学习更好地使用VTune。 它具有特定的OpenMP分析,可以避免您不必询问OpenMP运行时的内部。请查看https://software.intel.com/en-us/node/544172和https://software.intel.com/en-us/openmp-analysis-lin作为介绍。
P.S。在任何地方使用schedule(dynamic,1)
可能是一个坏主意。
p.p.s。在绘制缩放结果之前,请先阅读my blog about how to to that。
完全披露:我在英特尔工作,有时在OpenMP运行时工作。