首页 文章

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

提问于
浏览
2

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

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

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

enter image description here

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

enter image description here

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)

这是自下而上的部分:

enter image description here

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

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

enter image description here

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

评论中要求的OpenMP直方图:

减少区域:

enter image description here

unkwown地区abbout initInterTab2d

enter image description here

UPDATE:

使用TBB和OpenMP禁用构建OpenCV删除了这个奇怪的并行区域 iniInterTab2D . 所以这肯定与OpenCV有关,但我不知道怎么做 .

1 回答

相关问题