Parallel processing 偷工减料

Parallel processing 偷工减料,parallel-processing,task-parallel-library,deque,work-stealing,Parallel Processing,Task Parallel Library,Deque,Work Stealing,为什么我们需要一张偷工作证?(例如在锡尔克)主人在顶部工作,小偷从底部偷窃。为什么它有用 我们可能会有多个小偷从底部偷东西。那么,我们不需要锁吗? 我在某个地方读到,较大的作业(例如在树中创建的作业)会添加到底部。因此,从底层偷盗效率更高(因为窃贼偷盗后变得更忙,所以交流更少)。是吗?该协议的详细信息在麻省理工学院提供的“Cilk-5多线程语言的实现”第5节中进行了描述:您不需要工作窃取许可证。使用并发数据结构来存储任务池是可能的(人们已经这样做了)。但问题是,来自工人的推送/弹出操作和来自小偷

为什么我们需要一张偷工作证?(例如在锡尔克)主人在顶部工作,小偷从底部偷窃。为什么它有用

我们可能会有多个小偷从底部偷东西。那么,我们不需要锁吗?
我在某个地方读到,较大的作业(例如在树中创建的作业)会添加到底部。因此,从底层偷盗效率更高(因为窃贼偷盗后变得更忙,所以交流更少)。是吗?

该协议的详细信息在麻省理工学院提供的“Cilk-5多线程语言的实现”第5节中进行了描述:

您不需要工作窃取许可证。使用并发数据结构来存储任务池是可能的(人们已经这样做了)。但问题是,来自工人的推送/弹出操作和来自小偷的窃取请求都必须同步

由于盗窃预计是相对罕见的事件,因此可以设计一种数据结构,使得同步主要在盗窃尝试期间执行,甚至在从数据结构弹出项目时可能存在冲突的情况下执行。这正是为什么在Cilk中使用DEQUE-以最小化同步。工作人员将自己的deque视为一个堆栈,从底部推送和弹出线程,但将另一个繁忙工作人员的deque视为一个队列,在没有本地线程可执行时仅从顶部窃取线程。由于盗窃操作是同步的,所以多个窃贼可以尝试从同一个受害者处盗窃


在分而治之式算法中,将较大的作业添加到底部是常见的,但并非全部。在偷窃过程中有各种各样的策略。窃取一项任务、少量任务、一半任务,依此类推。这些变体中的每一个都适用于某些应用程序,而在其他应用程序中则不太适用。

工作窃取实际上需要一个deque。在最初的论文中,他们证明了在具有P处理器的系统上使用的最大内存。该限制由任何堆栈的最大大小乘以处理器数量给出。实际上,只有遵循忙叶定理,这才有可能。此外,工作盗窃的另一个重要特征是: 当工作人员进行繁殖时,它会立即将繁殖者保存在deque上,并开始处理子对象。关于他们的证明的更多信息,请阅读他们的原始论文,其中他们解释了我所说的一切

盗用任务访问中的并发控制与盗用任务调度程序无关,事实上,已经对从任务中移除锁(通过使用无锁结构)以及尽可能减少内存障碍进行了大量研究。例如,在本文中(如果无法访问,我很抱歉,但您可以阅读摘要以获得想法):作者创建了一个新的deque,用于改进上述方面

偷窃发生在工人不工作的一侧,原因可能有几个:
由于deque充当每个工人(deque的所有者)的堆栈,“更大”的工作应该放在上面(通过阅读本文您可以理解)。当我说“更大”时,我想说的是,这些可能是需要进行更多计算的。另外,另一个重要的方面是,通过这样做(从deque所有者的相反工作方偷窃),减少了争论,因为在一些新deque中,受害者和小偷可能同时在同一个deque上工作

谢谢你的回答。大部分我都同意。只有“因为盗窃被认为是相对罕见的事件”这一部分:这在fork-join模型中是不正确的。整个模型基于偷窃。熟练工人创造就业机会,而其他人几乎一直在偷盗。是吗?@TOWI_Parallelism,是的,在某些应用程序中,盗窃会相对更频繁。但是,在偷取之后的许多应用程序中,执行任务的工作者也会产生新任务。这些任务被添加到本地队列中。因此,工作人员不需要经常从主线程中窃取。如果您还有任何问题,请告诉我,这是我的研究领域,因此我很乐意以任何方式帮助您:)谢谢您!这对于fork-join模型是绝对正确的。对于某些模型,不需要deque,例如,当您在编译时定义所有任务时。我就是这么看的。如果你不同意的话,我们来讨论一下……嗯,那是真的。但是,请注意,对于在运行时生成任务的模型,使用deque(或任何其他允许保证busy leaves属性的数据结构(如原始文件中所讨论的))是fulcral。因此不能使用队列(例如)。