1

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

VTune 放大器的结果

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

我试图从 Top-Down Tree 中获取更多信息,但这对我并没有真正的帮助。

在此处输入图像描述

高级热点分析也没有给我更多信息。为了确定问题,我必须如何解决这个问题?

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

提前谢谢了!

编辑:这里还有时间线,没有显示任何过渡,与我放大的距离无关。在这种情况下,我使用了另一个具有 8 个线程的测试用例。 在此处输入图像描述

4

2 回答 2

4
  1. 您使用什么版本的 VTune?看起来不是最新的 - 当前版本中删除了屏幕截图上的 OpenMP 区域的帧速率。值得尝试新的 2015 更新 1,对 OpenMP 分析进行了一些修复和改进。
  2. 您使用什么编译器和 OpenMP 运行时?如果是英特尔 OpenMP(和编译器),VTune 分析将为 OpenMP 区域提供更多信息。只需将自下而上的分组从“Funion/callstack”更改为“OpenMP region/...” - 你会发现很多有趣的事情。
  3. 您看到 mkl_blas_dcopy 是因为您似乎在代码中使用了 MKL 函数。mkl_blas_dcopy 只是一个内部 MKL 函数。当在自下而上选择“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 并行区域的每次迭代。启动和停止操作有一些开销,这会影响您的大等待时间。因此,可能值得在外部 OpenMP 循环内尝试串行 MKL 版本,以避免多个并行区域重新进入。
于 2014-11-20T13:11:00.587 回答
1

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

于 2014-11-20T13:14:03.593 回答