我正在研究基于任务的并行计算,并对旧项目管理问题的变化感兴趣 - 一个顶点活动(AOV)项目网络的关键路径,可以使用拓扑排序计算算法,如果没有死锁循环。这些活动在关键路径上的总时间给出了项目的最短完成时间。
但这是假设我们总是有足够的工人同时完成活动而不相互依赖。如果可用的工作人员(处理器/核心)数量有限,某些活动可以等待,因为他们依赖的某些活动尚未完成,而只是因为所有工作人员现在正在忙于其他活动。这是当今多核并行计算的简化模型。如果只有一个工人必须完成所有活动,则项目完成时间是所有活动的总时间。我们回归到单核串行计算。
是否有一种有效的算法可以在给定数量有限的工作人员的情况下提供AOV网络的最短完成时间?当可行活动超过工人数量时,我们应该如何明智地选择首先要做的活动,以便尽量减少工人的闲置时间?最短时间应介于关键路径时间(无限工人)和所有活动(一个工人)的总时间之间。它也应大于等于总时间除以工人数(无空转)。是否有算法来获得最短时间?
答案 0 :(得分:1)
我找到了一个名为" work stealing"的C ++会议视频。这几乎回答了我的问题。在18:40,如果活动不能暂停,进一步划分或从工人转移到工人,那么幻灯片上的问题就是NP难。这些限制决定了哪些工人完成哪些工作(活动)太难。因此引入工作窃取以避免事先做出这样的困难决定。相反,只要遵循某些明显的贪婪规则,它就会使这种决定不再重要。整个项目将始终在有限数量的工人或两者的关键路径或无空闲时间的约束下尽快完成。然后视频继续讨论如何制作“偷窃”的程序。通过使实现分布式和缓存友好等,使不同的工作者(处理器)之间的效率更高。
根据视频,未来的C ++共享内存并行编码将基于任务而不是基于循环。为了解决问题,程序员定义了要完成的一系列任务及其依赖关系,然后编码语言将在运行时以灵活的方式自动在多个核上调度任务。这种通过分布式任务排队系统实现灵活代码的事件驱动类似方式将在并行计算中变得非常有用。
当优化问题是NP难度时,解决它的最佳方法是找到避免它的方法。