在我的C++程序中,我使用boost库进行并行编程。在程序的一部分中,有几个线程在其他线程上进行join()。
对于某些输入,程序运行得相当慢。为了改进我的程序,我尝试使用Intel VTune查找热点。最耗时的热点显示是由boost::this_thread::interruptible_wait引起的

当我检查源代码中出现此热点的部分时,它显示了对join()的调用。我的印象是等待线程不会占用CPU时间。有人能帮我解释一下为什么线程join()操作占用这么多CPU时间吗?
任何关于如何修复这样一个热点的见解也将非常有帮助!我能想到的修复这样一个热点的一种方法是以某种方式detach()线程而不是join()它们。
提前感谢!
发布于 2018-04-19 20:53:50
我的印象是等待线程不会占用
时间
这真的取决于线程如何等待。他们可能是busy waiting (也就是旋转),以尽可能快地对他们等待的任何东西做出反应。在每次检查之后产生执行的替代方案意味着来自操作系统调度(和线程切换开销)的潜在更高的延迟。
VTune会毫不留情地占用你所有的线程库开销,你需要适当地过滤,以找出你的串行热点在哪里,以及你的并行化是否减轻了它们。
如果您的线程在连接上花费大量时间等待,则您的并行区可能不是很平衡。如果没有更多关于你的问题的信息,就很难说出原因是什么,或者如何减轻它,但你可能应该尝试更均匀地分配工作。
另一方面,最近的spectre/meltdown修复似乎增加了VTune的分析开销。我会小心地从表面上看结果(您的程序在分析和不分析的情况下运行的时间是否相同?)。
编辑:相关材料here和here。按照linked页面中的说明禁用内核保护对我的情况很有帮助,尽管我还没有在最新的VTune更新上对其进行测试。
https://stackoverflow.com/questions/49921445
复制相似问题