我写了一些代码,提供了一个帮助线程池,当我的(大部分是串行的)应用程序具有可从并行化中受益的任务时,可以调用该线程。它是这样的:
仅创建一次线程池,该线程池等于(计算机上的#cores-1)。
为此设置一个等待循环,以使它们阻塞在主线程当前持有的“繁忙”关键部分上,每个线程都有其自己的部分。 (即在Windows EnterCriticalSection上)
当请求帮助时,请在主线程中执行一些设置,然后释放“繁忙”的关键部分(在Windows LeaveCriticalSection上)。
然后,母版和选定的子代工作直到完成,母版等待子代完成。使用相同主/从逻辑的第二个每个线程“空闲”关键部分将处理“等待完成”过程。
这一切在Linux和Windows上都可以很好地工作,并且实际上似乎比OpenMP有了显着的性能改进,并且使用起来更加容易。但是,令我感到困惑的是,当我离开关键部分(即Windows上的RtlLeaveCriticalSection)时,我的分析器(我正在使用Intel的VTune Amplifier)显示出明显的旋转时间。
为什么?当然,离开关键部分是一项无人参与的操作吗?
更重要的是,我有什么可以做的吗?我尝试使用自旋锁计数,但是虽然我可以减少自旋时间,但同时也减少了等待某个部分的线程进入睡眠状态的时间,因此最终我会花费更多的时间。