【发布时间】:2019-07-17 19:30:50
【问题描述】:
假设我有一个带有顶点和边的有向无环图 (DAG)。
顶点可以是以下两种类型之一:
- 计算任务 (T)
- 资源 (R)
一条边代表一个依赖。它总是起源于某个计算任务的顶点 T,结束于某个资源的顶点 R。
对图结构的限制:
- 任务顶点仅依赖于资源顶点(不依赖于其他任务)。 这意味着计算任务只有传出边, 并且只有传入的边缘进入资源。
- 一个任务顶点不能有多个边到同一个资源顶点。
- 资源顶点不依赖于任何东西(没有出边)。
- 每个计算任务顶点可以有最少 3 条出边,最多 4 条出边。这意味着,一项计算任务至少依赖 3 个资源,最多依赖 4 个资源。
语义:
- 上图是一个任务依赖图。每当任务 Tx 运行时, 它会阻塞它所依赖的所有资源,直到完成为止。
- 在任何给定时间,每个资源都不能被超过 1 个任务使用。所以, 任务可以暂时阻止其他任务运行,直到它们 完成。
问题:
鉴于上图,我可以使用什么算法来计算我可以并行运行的所有可能的任务,以使它们不会相互阻塞? 即在任何给定时间,我都希望能够实现最大的并行化。我将使用该算法来发现所有不会相互阻塞的任务,并运行它们。每当任务完成时,我都想重新评估图表,看看我是否可以分拆更多未阻塞的任务。
我正在寻找可以用于这种计算的算法。这听起来像是一个难题,但我怀疑这种问题并不是全新的......
示例:
在提供的示例中,我可以先运行 T1 和 T3。完成这些后,我可以运行 T2 和 T4。
【问题讨论】:
-
你原来的前提被打破了,因为它假设所有任务一直同时使用它的所有资源,这是极不可能的。例如;可能(在特定时间点)T4 仅使用 R7,T1 仅使用 R2,T2 使用 R3 和 R4;也许你可以并行运行所有四个任务。
-
请注意,如果 T1、T2 和 T4 始终使用 R3,则 T1、T2 和 T4 永远不能同时运行;那么使用三个线程是没有意义的,你只会有一个依赖于 R1、R2、R3、R4 和 R7 的“T124”线程;但是如果“T124”和T3总是使用R7,那么“T124”和T3就没有意义了,所以你只有一个“T1234”线程。
-
另请注意,如果目标是在任务仅在某些时候使用资源的可能情况下最大化并行性;那么它必须是自适应的(例如,当且仅当它确实需要时才使用互斥锁来阻止任务),以便可以在任何特定时间点运行最大数量的线程。当然,在这种情况下,你最终会得到
max_tasks_running_in_parallel = min(total_tasks, total_CPUs),这有点太琐碎了。 -
您完全误解了问题陈述。这里的资源不是 CPU,完全有可能让一个任务并行使用它的所有资源(如 stmt 中所述)。请将“任务”和“资源”视为抽象,不要将它们与线程/CPU 联系起来。
-
我知道资源不是 CPU,我认为我没有误解任何内容。
标签: optimization graph graph-algorithm job-scheduling directed-acyclic-graphs