工作窃取始终是最合适的用户级线程调度算法吗?

时间:2010-04-05 08:03:04

标签: multithreading algorithm scheduling load-balancing work-stealing

我一直在调查我正在实现的线程池的不同调度算法。由于我正在解决的问题的性质,我可以假设并行运行的任务是独立的,不会产生任何新任务。任务可以有不同的大小。

我立即使用针对本地作业队列的无锁令牌来进行最流行的调度算法“偷窃”,我对这种方法比较满意。但是,我想知道是否有任何常见的情况,工作窃取不是最好的方法。

对于这个特殊问题,我对每项任务的大小有一个很好的估计。工作窃取不会利用这些信息,我想知道是否有任何调度程序可以提供更好的负载平衡,而不是工作窃取这些信息(显然具有相同的效率)。

NB。这个问题与之前的question有关。

2 个答案:

答案 0 :(得分:2)

我会提前分发任务。根据他们估计的运行时间信息,您可以将它们分配到每个线程中的各个队列中。

分配任务基本上是knapsack problem,每个队列应该花费相同的时间。

您应该添加一些逻辑来在运行时修改队列。例如,在估计的运行时间与实际运行时间相差一定量之后,应该进行重新分配。

答案 1 :(得分:1)

工作窃取调度程序确实不使用该信息,但这是因为它不依赖于它来提供它所具有的理论限制(例如,它使用的内存,工作者之间预期的总体通信和还有执行完全严格计算的预期时间,你可以在这里阅读:http://supertech.csail.mit.edu/papers/steal.pdf

一篇有趣的论文(我希望你可以访问:http://dl.acm.org/citation.cfm?id=2442538)实际上使用有限的执行时间来提供形式证明(试图尽可能接近原始的工作窃取范围)。

是的,有些情况下工作窃取不能最佳地执行(例如,不平衡的树搜索和其他特定情况)。但是对于那些情况,已经进行了优化(例如,允许窃取一半受害者的双端队列,而不是只执行一项任务:http://dl.acm.org/citation.cfm?id=571876)。