我有一组我想并行处理的对象。每个对象由一组子对象组成。限制是不能同时处理共享公共子对象的两个对象。
我认为这应该是一个标准问题。如果有人可以引导我找到对我来说足够好的正确读数。
对象: {AB},{CD},{EF},{BD},{FA}
因此,{AB}和{BD}不能并行运行,因为它们共享资源B.
贪心思想:
主线程保留一组当前活动/进程中的子对象。如果要处理的下一个对象不共享活动集中的任何资源,则分配工作或者将工作包推送到对象队列的后面,以便以后可以处理它。必须锁定主线程集和所有内容。
分区思路
我想过将对象分成几组,以确保集合之间的对象是互斥的。例如,创建依赖关系图,因此创建边缘btw AB - > BD因为他们共享资源。然后并行处理所有断开连接的子图。 但这不会非常负载平衡,可能效率不高。
提前致谢:)
答案 0 :(得分:1)
一种方法是使用tbb :: flow::graph,其中对象由queue_nodes表示,任务由function_nodes表示,依赖关系通过{{连接3}}类似于join_nodes how solved,它看起来像是一般问题陈述的一个子集。下图表示[AB] [BC] [CD] [DA]:
等任务
pictire取自Dinning Philosophers problem