如何解读英特尔VTune放大器的锁定和等待

时间:2014-11-20 08:31:14

标签: c++ multithreading openmp vtune

我尝试使用OpenMP在C ++中并行化我的程序的一个热点,但它不能扩展。虽然它在1个线程上需要25秒,但我只用2个线程实现21秒。我做了一个Locks&使用英特尔VTune Amplifier进行等待分析,但这对我没有帮助。它看起来像:

Result of the VTune Amplifier

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

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

enter image description here

高级热点分析也没有给我更多信息。 我如何处理此问题以确定问题?

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

非常感谢提前!

编辑:这里也是没有显示过渡的时间线,与我放大的距离无关。在这种情况下,我使用了另一个包含8个线程的测试用例。 enter image description here

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

显示同步对象的转换。在这种情况下,等待时间可能来自MKL库中的OpenMP运行时。在VTune中,您将在更新的版本中将此时间视为开销和旋转时间。