代码之家  ›  专栏  ›  技术社区  ›  Il-Bhima

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

  •  10
  • Il-Bhima  · 技术社区  · 15 年前

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

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

    对于这个特殊的问题,我对每个任务的大小都有很好的估计。盗用工作并没有利用这些信息,我想知道是否有任何调度程序能够提供比盗用这些信息更好的负载平衡(显然效率相同)。

    铌。这个问题与前一个问题有关 question .

    2 回复  |  直到 10 年前
        1
  •  2
  •   Georg Schölly Crazy Developer    15 年前

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

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

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

        2
  •  1
  •   guilhermemtr    10 年前

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

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

    是的,在某些情况下,窃取工作并没有达到最佳效果(例如,不平衡树搜索和其他特殊情况)。但对于这些情况,已经进行了优化(例如,允许窃取受害者一半的deque,而不是只执行一个任务: http://dl.acm.org/citation.cfm?id=571876 )