OmnithreadLibrary是否支持"work stealing"?

5

工作窃取是在Java平台的Fork / Join框架中提供的,例如(请参见Fork / Join框架比线程池更好在哪里?) - OmniThreadLibrary能否实现类似的功能?


工作窃取:运行完任务的工作线程可以从仍在忙碌的其他线程中窃取任务。


OtlParallel单元有提到这一点,也可以参考这篇博客文章:http://www.thedelphigeek.com/2011/01/parallel-for-implementation-1-overview.html - Shambhala
Shamballa,本文描述的是ForEach抽象,而不是Fork/Join。 - gabr
1
非常抱歉,我应该更慢地阅读并更好地理解问题。 - Shambhala
1个回答

6
我不知道是否应该将这种技术称为"工作窃取",但确实在执行Fork/Join抽象时,OmniThreadLibrary会保持所有核心繁忙。
当您使用Fork/Join时,通过调用Compute将任务发送到计算池中。当您调用Value获取子计算的结果或Await等待子计算完成而子计算尚未完成其工作时,Value/Await将从计算池中获取另一个任务并执行它。当完成此新任务后,它将再次检查子计算是否已完成其工作,如果尚未完成,则处理下一个子任务。
该机制在OmniThreadLibrary wiki上有进一步描述。
编辑:
我认为不应该将Fork/Join方法称为"工作窃取"。在OmniThreadLibrary实现中,工作项直到线程开始执行它才被分配给线程。一旦线程开始执行它,就没有人可以窃取它,因为那样没有意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接