工作偷窃和deques

时间:2015-01-07 23:43:17

标签: parallel-processing task-parallel-library deque work-stealing

为什么我们需要一个deque来偷工作? (例如在Cilk中)主人在顶部工作,小偷从底部偷窃。为什么有用?

我们可能有多个盗贼从底部窃取。那么,我们不需要锁吗? 我在某处读到了较大的工作(例如在树中创建)被添加到底部。因此,从底部窃取更有效(沟通更少,因为窃贼通过窃取他们变得更加忙碌)。是吗?

3 个答案:

答案 0 :(得分:1)

THE协议的细节在" Cilk-5多线程语言的实现"的第5节中描述。这可以从麻省理工学院获得:http://supertech.csail.mit.edu/papers/cilk5.pdf

答案 1 :(得分:1)

你不需要偷工具来偷工作。有可能(并且人们已经这样做)使用并发数据结构来存储任务池。但问题是工人的推/弹操作和盗贼的窃取请求都必须同步。

由于预计抢断是相对罕见的事件,因此有可能设计一种数据结构,以便在窃取尝试期间执行同步,甚至可能在从数据中弹出项目时可能存在冲突结构体。这正是为什么在Cilk中使用deques的原因 - 以最小化同步。工作人员将自己的deques视为堆栈,从底部推送和弹出线程,但将另一个忙工作者的双端队列视为队列,只有在没有本地线程执行时才从顶部窃取线程。由于窃取操作是同步的,因此可以让多个小偷试图从同一个受害者那里偷窃。

在分而治之的风格算法中,较大的工作被添加到底部是常见的,但不是全部。在盗窃期间,有多种策略可供处理。窃取一项任务,几项任务,一半任务,等等。这些变体中的每一个都适用于某些应用程序,而在其他应用程序中效果不佳。

答案 2 :(得分:1)

偷工作其实真的需要一个双端队列。在原始论文中,它们证明了具有P处理器的系统上的最大使用内存。限制由任何堆栈的最大大小乘以处理器数量。实际上这只能通过繁忙的叶子定理来实现。此外,工作窃取的另一个重要特征是: 当一个工人做一个产卵时,它会立即将产卵者保存在双端队列上并开始对孩子进行操作。有关其证明的更多信息,请阅读他们的原始论文,其中他们解释了我所说的一切。 http://supertech.csail.mit.edu/papers/steal.pdf

工作窃取deque访问中的并发控制与工作窃取调度程序无关,事实上,已经进行了大量研究以从deque中移除锁(通过使用无锁结构)并且最小化可能的记忆障碍。例如,在本文中(我很抱歉,如果无法访问,但你可以阅读摘要,无论如何得到这个想法):http://dl.acm.org/citation.cfm?id=1073974作者创建了一个新的deque来改进上述方面。

抢断是从工人没有工作的一方做出的,原因可能有以下几点: 因为deque作为每个工人(双端队列的所有者)的堆叠,所以"更大"工作应该在它之上(你可以通过阅读论文来理解)。当我说更大时,我想表示那些可能会有更多计算要做的事情。另外,另一个重要的方面是,通过这样做(从双方所有者的工作方面窃取)减少了争用,因为在一些新的双胞胎中,受害者和小偷可能同时在工作相同的双端队员。