我正在使用英特尔VTune放大器来查看我的并行应用程序如何扩展 .
注意我不使用任何显式锁机制
它在我的4核笔记本电脑上可以很好地扩展(考虑到有部分算法无法并行化):
但是,当我在Knights Landing(KNL)上进行测试时,它会出现可怕的扩展:
Notice that I'm using only 64 cores on purpose (说到这个,如果你're interested on thread affinity I'已经开了另一个question的话题) .
为什么有这么多空闲时间?什么是 _kmp_fork_barrier
?阅读"Imbalance or Serial Spinning (OpenMP)"似乎这是关于负载不 balancer ,但我已经在所有 omp
区域使用 schedule(dynamic,1)
.
如何判断这是否实际上是负载不 balancer ?否则,可能是什么原因?
注意我有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地区abbout initInterTab2d
:
UPDATE:
使用TBB和OpenMP禁用构建OpenCV删除了这个奇怪的并行区域 iniInterTab2D
. 所以这肯定与OpenCV有关,但我不知道怎么做 .
1 回答
您需要学习更好地使用VTune . 它具有特定的OpenMP分析,可以避免您不必询问OpenMP运行时的内部 . 请看https://software.intel.com/en-us/node/544172和https://software.intel.com/en-us/openmp-analysis-lin作为介绍 .
附:到处使用
schedule(dynamic,1)
可能是一个坏主意 .p.p.s.在绘制缩放结果之前,请阅读my blog about how to to that .
完全披露:我在英特尔工作,有时在OpenMP运行时工作 .