- cplusplus/
- 如何解读英特尔VTune放大器&x27;s Locks&;等待
我尝试用C++与OpenMP程序中的一个热点并行,但它不缩放。虽然在1个线程上需要25秒,但在2个线程上只需要21秒。我使用“英特尔VTune放大器”进行了锁定和等待分析,但它并没有真正帮助我。它看起来像:
如何解读英特尔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链接到你的应用程序?我添加了一个时间线。在这种情况下,另一种情况,因为上面的最后一个不能再打开了。