Iは、エッジと仮定するを意味uは前に実行されなければならないVを。そうでない場合は、すべてのエッジを回してください。さらに、依存関係が与えられた適切な実行戦略よりも、パス(DAGによって既に与えられているもの)にあまり興味がないと仮定します。(u 、v )あなたはv
トポロジカルソート手順を簡単に適用できます。追加する代わりに、同じ「深さ」のすべてのアイテムを1つのセットにマージします。セットのリストを取得します。各セットには、並行して実行/インストールできるアイテムが含まれています。形式的に、セットはグラフG = (V 、E )に対して定義されます:S私G = (V、E)
S0S私 + 1= { V ∈ V| ∀ U ∈ V。(U 、V )∉ E}= { V ∈ V| ∀ U ∈ V。( U 、V )∈ E→ U ∈ ⋃k = 0私Sk}
その後、次のようにタスクを実行できます(セットがあると仮定しましょう):k
for i=0 to k
parallel foreach T in S_k
execute T
S0
parallel foreach T in S_0
recursive_execute T
どこ
recursive_execute T {
atomic { if T.count++ < T.indeg then return }
execute T
parallel foreach T' in T.succ
recursive_execute T'
}
そしてT.count
、T
すでに実行された先行の数、先行のT.indeg
数、および後続T.succ
のセットを保持する単純なカウンターです。