【发布时间】:2017-10-27 10:35:39
【问题描述】:
我已经使用 OpenMP 并行化了用于计算机视觉应用程序的现有代码。我认为我设计得很好,因为:
- 工作负载均衡
- 没有同步/锁定机制
- 我并行化了最外层的循环
- 所有核心大部分时间都在使用(没有空闲核心)
- 每个线程都有足够的工作量
现在,应用程序在使用多个内核时无法扩展,例如在 15 个内核之后它不能很好地扩展。
代码使用外部库(即 OpenCV 和 IPP),其中代码已经过优化和矢量化,而我尽可能手动地对代码的某些部分进行矢量化。然而,根据 Intel Advisor 的说法,代码没有很好地矢量化,但没有什么可做的:我已经尽可能地矢量化了代码,但我无法改进外部库。
所以我的问题是:矢量化是否可能是代码在某些时候无法很好扩展的原因?如果有,为什么?
【问题讨论】:
-
您计算过使用了多少内存带宽吗?如果您使内存总线饱和,则更多内核将无济于事。重构可以;如果您的数据在多次传递中往返于内存中,则每次传递更多,从而更少传递可以摆脱瓶颈。
-
@Yakk 感谢您的回答,我没有考虑到这一点。您知道如何使用一些英特尔工具(如英特尔顾问/VTune Amplifier 等)进行此类分析吗?
-
不,我不知道有一些简单的工具可以检测内存带宽使用情况。通常,当我注意到症状时,我只是粗略地计算一下。
标签: c++ opencv parallel-processing vectorization intel-ipp