gpt4 book ai didi

c++ - 如何解读英特尔 VTune Amplifier 的 Locks&Waits

转载 作者:行者123 更新时间:2023-11-30 01:16:14 24 4
gpt4 key购买 nike

我尝试使用 OpenMP 并行化我的 C++ 程序的一个热点,但它无法扩展。虽然在 1 个线程上需要 25 秒,但我在 2 个线程上只需要 21 秒。我使用英特尔 VTune 放大器进行了 Locks & Wait 分析,但它并没有真正帮助我。看起来像:

Result of the VTune Amplifier

我特别不明白 mkl_blas_dcopy 的来源以及它调用它的原因(即使我删除了我的并行区域,我也有这个调用和时间线中的第二个线程)。

我试图从自上而下的树中获取更多信息,但这对我并没有多大帮助。

enter image description here

Advanced Hotspots Analyses 也没有给我更多的信息。我必须如何处理此问题才能确定问题所在?

附加信息:之前我的整体运行时间更糟,但我在串行代码中做了很多优化并且可以提高性能,但在那之后我的代码不再扩展。

非常感谢!

编辑:这里还有时间轴,其中没有显示转换,独立于我放大的程度。在这种情况下,我使用了另一个具有 8 个线程的测试用例。 enter image description here

最佳答案

  1. 您使用哪个版本的 VTune?看起来不是最新的 - 当前版本中删除了屏幕截图上的 OpenMP 区域的帧速率。值得尝试新的 2015 更新 1,对 OpenMP 分析进行了一些修复和改进。
  2. 您使用什么编译器和 OpenMP 运行时?如果是 Intel OpenMP(和编译器),VTune 分析将为 OpenMP 区域提供更多信息。只需将自下而上的分组从“Funcion/callstack”更改为“OpenMP region/...”——您会发现很多有趣的事情。
  3. 您看到 mkl_blas_dcopy 是因为您似乎在代码中使用了 MKL 函数。 mkl_blas_dcopy 只是一个内部 MKL 函数。当在 Bottom-up 中选择“mkl_blas_dcopy”热点时,您可以在右侧的堆栈面板中找到代码中的实际 MKL 调用 - 您应该能够看到直到 main() 的调用链。
  4. MKL 已与 OpenMP 并行化。您可以将 MKL 调用放在您自己的 OpenMP 区域内。如果是这种情况,则不是最优的 - 嵌套时 OpenMP 不好。您应该选择使用不带 OpenMP 的 MKL 并行版本,或 OpenMP 并行区域中的串行 MKL 库。您可以通过链接控制串行/并行 MKL 设置,请参阅 MKL 链接顾问:https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor
  5. 屏幕截图中时间轴中的每一帧都可能是来自 MKL 的 OpenMP 区域。似乎有许多持续时间较短的并行区域,这可能表明 MKL 是从循环中调用的。因此每次迭代它都会启动、执行和停止 OpenMP 并行区域。 Start 和 Stop 操作有一些开销,这会占用您大量的等待时间。因此可能值得在外部 OpenMP 循环内尝试串行 MKL 版本,以避免多个并行区域重新进入。

关于c++ - 如何解读英特尔 VTune Amplifier 的 Locks&Waits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27034950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com