具有已知依赖关系的并行任务的最优调度

计算科学 优化 并行计算 图论
2021-12-05 11:37:11

这可能是一个微不足道的问题,但我被这个问题困住了。

假设我们有一个通用图:

G=(V,E)

每条边代表一个任务,每个顶点代表该任务的一个数据(因此每个任务使用两个顶点)。

当两个具有公共顶点的任务并行运行时,会损失一些计算时间,因为两个任务不能同时使用同一个顶点(一个必须等​​待)。

我正在考虑以下方法:

  • 创建一个锁表,说明顶点是可以自由使用还是锁定。运行所有任务和每个任务将等待直到所需数据可用(也许将等待任务的优先级设置为低就足够了)。
  • 选择没有公共顶点的最大边数(比贪心算法更好的方法?),然后在不锁定的情况下运行所有​​相应的任务。重复直到有剩余的边缘。

我不确定哪种方法更有效。任何想法/见解?我对并行编程完全陌生......

1个回答

我研究类似的问题,即基于任务的并行性,并使用与您的第一种方法类似的东西。这通常被称为“动态调度”或“数据相关执行”与“静态调度”,即您的第二种方法。

这种方法的效率很大程度上取决于您如何实现锁,以及如果无法计算任务,线程会做什么。我使用原子比较和交换操作来实现锁,并使用快速任务队列来查找具有空闲锁的任务。

每个线程也值得寻找需要它以前拥有的资源(顶点)的任务,因为这可以改善缓存行为。