TaskGraphとSchedulerを理解する
を調べた結果、おおむねスケジューラーの全体像が見えてきましたが、 各ヴァーチャル関数の関係性や、WorkItemとの関係性が見えてきません。 ので、今回はその関係性を理解するうえで重要なDependencyGraphについて調べていこうと思います。
TOP Network について
TOP Network は /tasks 以下に TOP Network ノードを作ると使用できます。
このノード内に複数のノードを作ることはできますが、基本 1 つの処理のまとまり= TOP Network として作成します。
TOP Network 内のノードは、ノードと、WorkItem で構成されてい ます。
ノードは、GenericGenerator2 や、PythonScript2 のようなある処理を実行するための構造(処理のテンプレート的なもの)を言います。
対して、実際に実行するのは WorkItem と呼ばれる緑の〇ポチです。
この WorkItem は、実行するタスクのパラメーター(アトリビュート)の集合体です。
この WorkItem は、いわゆる関数の引数のようなもの、その引数を渡してある処理を実行する
というのが基本的なノードと WorkItem の関係性です。
この WorkItem は、関係性を定義することができます。
たとえば、前の工程の成果物を受け取り、次の工程で実行したい...というのはよくあることです。
このような、実行したときの結果を受け渡す場合、WorkItem には output / input という特殊なアトリビュートを追加することができます。
( このあたり参考)
個のアトリビュートは、WorkItem の依存関係を使用して
いい感じに受けわたしできるようになっています。
Generate
上で書いた TOP Network の WorkItem は、「Generate」することで生成されます。
Generate とは、あくまでも WorkItem を生成するだけで、実際には実行しません。
生成時は、TOP Network 内のプロセッサーノードによってノードのアトリビュートと
前ノードの接続情報 をもとに事前に生成されます。
例として GenericGenerator を使用した例。
GenericGenerator は Item Count で指定した数の WorkItem を生成します。
下流の Python ノードは、上流の WorkItem の数に応じて同数 WorkItem が生成されます。
PDG のノードは、「Generate When」という項目が用意されています。
これはその名の通りで、どのような条件で WorkItem を Generate するかを指定します。
デフォルトは Automatic になっていて、 上流の Items が Generate されたタイミングで下流の WorkItem も生成されます。
つまり、Automatic の場合というのは、Cook しなくても(実行しなくても)WorkItem は
複数のノードをまたいで生成が可能ということになります。
このような、実行前にあらかじめ生成される WorkItem のことを StaticWorkItem と呼びます。
この StaticWorkItem は、TOP Networko の Cook Controls の「Generate Static Work Items」
を押すことで生成することが可能です。
そして、この作成した TOP Network 内の StaticWorkItem は「Task Graph」と呼ばれていて
Python ファイルで保存が可能です。
(※ Generate しなければ保存はできない)
保存した TaskGraph を開くと、Python スクリプトで WorkItem をシリアライズし、
context.addWorkItem(s)
context.addWorkItemDependency(277,275,True,False)
context.addWorkItemDependency(278,276,True,False)
context.commitWorkItem(275)
context.commitWorkItem(276)
context.commitWorkItem(277)
context.commitWorkItem(278)
context に対して WorkItem を追加、そして Dependency(依存関係)を定義しています。
ここまで見たものから、PDG の構造を整理すると
こんな感じになっています。
重要なのは、この Task Graph が持っているのは PDG で Task を実行するのに必要な情報のセットが
Task Graph として用意されているだけで、この WorkItem を実行させたり管理するものは含まれていません。
あくまでも TaskGraph には情報と依存関係があるだけです。