如何解读英特尔VTune放大器&x27;s Locks&;等待 我尝试用C++与OpenMP程序中的一个热点并行,但它不缩放。虽然在1个线程上需要25秒,但在2个线程上只需要21秒。我使用“英特尔VTune放大器”进行了锁定和等待分析,但它并没有真正帮助我。它看起来像:

如何解读英特尔VTune放大器&x27;s Locks&;等待 我尝试用C++与OpenMP程序中的一个热点并行,但它不缩放。虽然在1个线程上需要25秒,但在2个线程上只需要21秒。我使用“英特尔VTune放大器”进行了锁定和等待分析,但它并没有真正帮助我。它看起来像:,c++,multithreading,openmp,intel-vtune,C++,Multithreading,Openmp,Intel Vtune,我特别不明白mkl_blas_dcopy从何而来,它叫什么(即使我删除了我的并行区域,我也有这个调用和时间线中的第二个线程) 我试图从自上而下的树中获得更多的信息,但这对我并没有真正的帮助 高级热点分析也没有给我更多的信息。 我必须如何处理此问题以确定问题 附加信息:之前我的整体运行时糟糕得多,但我对串行代码进行了大量优化,可以提高性能,但之后我的代码不再具有伸缩性 非常感谢 编辑:这里还有时间线,没有显示任何过渡,与我放大的距离无关。在本例中,我使用了另一个带有8个线程的测试用例。 您使用

我特别不明白mkl_blas_dcopy从何而来,它叫什么(即使我删除了我的并行区域,我也有这个调用和时间线中的第二个线程)

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

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

附加信息:之前我的整体运行时糟糕得多,但我对串行代码进行了大量优化,可以提高性能,但之后我的代码不再具有伸缩性

非常感谢

编辑:这里还有时间线,没有显示任何过渡,与我放大的距离无关。在本例中,我使用了另一个带有8个线程的测试用例。

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

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

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

    为什么不显示指示线程如何同步的锁定和等待图?同时,从等待和旋转时间的数量,我可以得出结论,工作线程花费了大量时间等待一项工作。嗯,如果你真的没有与他们平行的工作,这是很合理的。。不知道为什么会提到MKL,你是否将MKL链接到你的应用程序?我添加了一个时间线。在这种情况下,另一种情况,因为上面的最后一个不能再打开了。但也有同样的问题:没有显示任何转换。为什么不显示指示线程如何同步的locks&waits图?同时,从等待和旋转时间的数量,我可以得出结论,工作线程花费了大量时间等待一项工作。嗯,如果你真的没有与他们平行的工作,这是很合理的。。不知道为什么会提到MKL,你是否将MKL链接到你的应用程序?我添加了一个时间线。在这种情况下,另一种情况,因为上面的最后一个不能再打开了。