【问题标题】:Is Work Stealing always the most appropriate user-level thread scheduling algorithm?Work Stealing 总是最合适的用户级线程调度算法吗?
【发布时间】:2011-02-04 08:50:08
【问题描述】:

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

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

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

注意。这个问题与之前的 question 相关。

【问题讨论】:

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


【解决方案1】:

我会预先分配任务。使用它们的估计运行时间信息,您可以将它们分配到单独的队列中,每个线程一个。

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

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

【讨论】:

  • 另一个可能适用也可能不适用的复杂情况是如何处理底层并行执行框架部分可用性的变化。当您在小型专用主机(或集群)上运行时,这并不重要,但是对于大型集群,您不能依赖节点保持正常运行。最简单的解决方法是在发生变化时重新运行调度程序,并记住重新调度已经开始在故障节点上运行的工作负载;做两次工作总比失去它好。
  • @Donal:关于节点可用性的观点很好,尽管在这种情况下(单个进程中的线程)我不必考虑太多。 @Georg:这就是我正在考虑的。在锁定和 CAS 调用方面,仅预先分配任务应该更便宜。我担心的是实际负载平衡的质量。
  • 不用担心就太好了。 :-) 虽然无法根据给出的信息来判断,所以感谢您的澄清。 (我知道有人为他们的博士学位研究过更普遍的问题,这真的很难。特别是如果你也有优先级和固定保留。)
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多