动态将作业分配给一组共享资源上的处理器

时间:2014-08-22 12:12:06

标签: multithreading algorithm parallel-processing scheduling job-scheduling

问题

我有一组我想并行处理的对象。每个对象由一组子对象组成。限制是不能同时处理共享公共子对象的两个对象。

我认为这应该是一个标准问题。如果有人可以引导我找到对我来说足够好的正确读数。

实施例

对象: {AB},{CD},{EF},{BD},{FA}

因此,{AB}和{BD}不能并行运行,因为它们共享资源B.

天真的想法

贪心思想:

主线程保留一组当前活动/进程中的子对象。如果要处理的下一个对象不共享活动集中的任何资源,则分配工作或者将工作包推送到对象队列的后面,以便以后可以处理它。必须锁定主线程集和所有内容。

分区思路

我想过将对象分成几组,以确保集合之间的对象是互斥的。例如,创建依赖关系图,因此创建边缘btw AB - > BD因为他们共享资源。然后并行处理所有断开连接的子图。 但这不会非常负载平衡,可能效率不高。

  • 这是否有标准的平行模式?
  • 在处理之前锁定子对象的每个线程应该是微不足道的。我正在寻找可以最小化锁定的东西。

提前致谢:)

1 个答案:

答案 0 :(得分:1)

一种方法是使用 :: flow::graph,其中对象由queue_nodes表示,任务由function_nodes表示,依赖关系通过{{连接3}}类似于join_nodes how solved,它看起来像是一般问题陈述的一个子集。下图表示[AB] [BC] [CD] [DA]:

等任务

Dinning Philosophers using TBB Flow Graph

  

pictire取自Dinning Philosophers problem