线程等待如何影响程序的执行时间?

时间:2018-04-19 12:42:57

标签: c++ multithreading boost-thread condition-variable vtune

在我的C ++程序中,我使用boost库进行并行编程。在程序的一部分中,在join()的其他线程上创建了几个线程。

对于某些输入,程序运行速度很慢......为了尝试改进我的程序,我尝试使用Intel VTune查找热点。由于boost::this_thread::interruptible_wait

,显示最耗时的热点

enter image description here

当我检查发生此热点的源代码部分时,它会显示对join()的调用。我的印象是等待线程不占用CPU时间。有人可以帮我理解为什么线程join()操作占用了这么多CPU时间吗?

有关如何修复此类热点的任何见解也将非常有用!我可以想到修复这样一个热点的一种方法是以某种方式detach()线程而不是join()它们。

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

我的印象是等待线程不占用CPU时间

这实际上取决于线程如何等待。它们可能是busy waiting(即旋转),以尽可能快地对他们正在等待的任何事物作出反应。每次检查后产生执行的替代方法意味着操作系统调度(以及线程切换开销)可能导致更高的延迟。

VTune将毫不留情地收集所有线程库开销,您需要适当地过滤以确定串行热点的位置以及并行化是否已经减轻了它们。

如果你的线程花费了大量时间等待连接,那么你的并行部分可能不是很平衡。如果没有关于您的问题的更多信息,很难说出原因是什么或如何减轻它,但您应该尝试更均匀地分配工作。

另一方面,最近的幽灵/熔毁修复似乎增加了VTune的分析开销。我会小心地将结果用于面值(你的程序是否运行接近相同的时间,有没有分析?)。

修改:相关资料herehere。按照linked页面中有关禁用内核保护的说明,在我的案例中有帮助,尽管我没有在最新的VTune更新中测试它。

相关问题