【问题标题】:Can bad vectorized code impact on scalability?糟糕的矢量化代码会影响可伸缩性吗?
【发布时间】:2017-10-27 10:35:39
【问题描述】:

我已经使用 OpenMP 并行化了用于计算机视觉应用程序的现有代码。我认为我设计得很好,因为:

  • 工作负载均衡
  • 没有同步/锁定机制
  • 我并行化了最外层的循环
  • 所有核心大部分时间都在使用(没有空闲核心)
  • 每个线程都有足够的工作量

现在,应用程序在使用多个内核时无法扩展,例如在 15 个内核之后它不能很好地扩展。

代码使用外部库(即 OpenCV 和 IPP),其中代码已经过优化和矢量化,而我尽可能手动地对代码的某些部分进行矢量化。然而,根据 Intel Advisor 的说法,代码没有很好地矢量化,但没有什么可做的:我已经尽可能地矢量化了代码,但我无法改进外部库。

所以我的问题是:矢量化是否可能是代码在某些时候无法很好扩展的原因?如果有,为什么?

【问题讨论】:

  • 您计算过使用了多少内存带宽吗?如果您使内存总线饱和,则更多内核将无济于事。重构可以;如果您的数据在多次传递中往返于内存中,则每次传递更多,从而更少传递可以摆脱瓶颈。
  • @Yakk 感谢您的回答,我没有考虑到这一点。您知道如何使用一些英特尔工具(如英特尔顾问/VTune Amplifier 等)进行此类分析吗?
  • 不,我不知道有一些简单的工具可以检测内存带宽使用情况。通常,当我注意到症状时,我只是粗略地计算一下。

标签: c++ opencv parallel-processing vectorization intel-ipp


【解决方案1】:

与 Adam Nevraumont 的 cmets 一致,VTune Amplifier 可以做很多工作来查明内存带宽问题:https://software.intel.com/en-us/vtune-amplifier-help-memory-access-analysis

不过,从更高级别的分析开始可能会很有用,例如查看热点。如果事实证明您的大部分时间都花在了 OpenCV 或您所关心的类似内容上,那么与直接挖掘内存瓶颈相比,尽早发现可能会节省一些时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多