Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/indyadmin/web/houdinifx/blog/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524
この記事では、TOPsのfor-eachブロックを使用して、ワークアイテムに対するループ処理を行う方法について紹介します。
TOPs Feedback Loopブロックを使用すると、複数のイテレーションに対して連続して実行される一連のステップを実行できます。
概要
TOPネットワークは、デフォルトではループは並列で処理するように動作します。スケジューラの設定に基づいて、できるだけ多くのワークアイテムを同時に実行します。「異なる入力で同じアクションを繰り返すこと」に関してはPDGが自動で並列ループを構成してくれるのでループ構成の必要はありません。
ただし、場合によっては、一連のステップを並列ではなく直列に実行し、前のワークアイテムの出力を後続のワークアイテムの入力として使用したいことがあります。単純なシミュレーションにおいては、これはすでにROPフェッチノードによって実装されています。このノードは、一度に1フレームずつ、単一のジョブとして実行されるバッチを作成できます。しかし、複数のノードにまたがるループや、フィードバックループのサイズが完全にはわからない場合など、より複雑なユースケースには、フィードバックループを使用します。
Feedback Loopブロックでは、ネットワークはノードごとにワークアイテムを実行し、後のワークアイテムは前のワークアイテムに応じて順次実行させます。ブロックで複数のイテレーションが指定されている場合は、一回のイテレーションの作業が完了したときに、ループの最初に戻り、次のループを実行します。設定に応じて、フィードバックループブロックは複数のシリアルループを並列に実行することもできます。
たとえば、ビー玉を瓶に詰めるRBDシミュレーションを想像してみてください。プロセス全体を単一のシミュレーションとして実行することもできますが、瓶の下部にあるビー玉は不安定になり、シミュレートされるオブジェクトの数は増え続けます。これを管理する1つの方法は、まず、最初の数個のビー玉に対してRBDシミュレーションを実行し、その結果を2番目の次のビー玉のシミュレーションで静的オブジェクトとして使用することです。 2番目のシミュレーションと最初のシミュレーションを組み合わせた結果は、3番目のシミュレーションでは静的オブジェクトになります。ループブロック内のROPジオメトリを含むフィードバックループを使用して、TOPでこのようなことを実現することができます。
(フィードバックループは、コマンドを一度に1つずつ順番にサーバーに送信する必要があるコマンドサーバーチェーンの実装にも使用されます。)
使用方法
- TOPネットワークエディタで、⇥Tabを押して “For-Loop with Feedback”を選択します。
このツールは、Block Begin FeedbackノードとBlock End Feedbackノードを配置します。 - Beginノードを選択します。パラメータエディタで、イテレーション回数の指定方法を選択します。
デフォルトでは、Iterationsパラメーターに指定された回数のイテレーションが実行されます。Beginノードに上流アイテムがある場合、ループは各入力アイテムに対してイテレーションを実行します。- たとえば、一定数のイテレーションにわたってシーンを反復的に構築するループがあるかもしれません(概要の「瓶にビー玉を詰める」の例など)。その後、Beginノードに配線したWedgeノードによって生成された各アイテムに対してループを繰り返すことができます。
- 開始ノードに静的ワークアイテムがある場合は、上流アイテムからのイテレーションを有効にできます。これは、イテレーション数を上流のアイテムの数に設定します。これにより、各入力アイテムについてブロック内の一連のステップが1回繰り返されます。
- たとえば、ファイルパターンノードを使用してディレクトリ内のすべてのファイルを一覧表示し、ループブロックを使用してファイルを繰り返し処理してその内容を一時ファイルに追加する、などの用途があります
- Beginノードが動的にアイテムを生成する場合は、EndノードでもUse dynamic partitioningをオンにする必要があります。
- BeginノードとEndノードの間にノードを配線して、それらをループの一部にします。
ブロック内のノードを視覚的に区別できるようにデフォルトではオレンジの境界が作成されます。
ループ内のワークアイテムに基づいて並列「サイドタスク」を作成する
ループの内側のノードからループの外側のプロセッサ(つまり、ループのEndノードに接続されていないプロセッサ)に配線すると、そのプロセッサのワークアイテムはループ内のワークアイテムに基づいて生成されますが、並行実行される通常のタスクとしてスケジュールされます。
これは、ループ内のアイテムに基づいているがループでは必要とされない「サイドタスク」の実行に役立ちます。 たとえば、ループに画像の生成と操作が含まれる場合は、画像のサムネイルを生成をサイドタスクとし、ループの外側で実行する場合などがあります。
Tips
- フィードバックループでは任意のプロセッサノードを使用できます。ただし、現時点では、フィードバックループ内で動的partitioner またはmapperを使用することはできません。にpartitionに同じループイテレーションからのワークアイテムしか含まれていない場合は、静的partitionerを使用できます。異なるイテレーションからのワークアイテムが何らかの形で一緒にpartitionされている場合は、Partition ノードはエラーを出力します。
- ブロックの関係性を明確にするために、ブロックのBeginノードとEndノードには同じ色を付ける必要があります。 For-Loopツールによって配置されたデフォルトのノードはオレンジ色に着色されていますが、ノードの色を変更することができます。これは多重ループを区別する際に非常に有効です。
ブロックの周囲の境界線は、Endノードの色になります。 - Beginノードは、ループイテレーションワークアイテムを生成するプロセッサです。
- 各ワークアイテムは、同じループの前のアイテムに依存し、繰り返しとループ番号を識別するためのアトリビュートを持ちます。
Endノードは、関連付けられているループのイテレーションに基づいてワークアイテムを分割するパーティショナです。フィードバックループ内のノードは必要なだけ多くの追加アイテムに自由にファンアウトでき、パーティショナがそれらを収集するようになっております。Beginノードの2番目のループイテレーションアイテムは、最初のループイテレーションのパーティションによって異なります。ループ開始がワークアイテムを動的に生成している場合は、End ノードのuse dynamic partitioningをセットする必要があります。 - フィードバックブロックの外側から複数の入力を持つブロックの内側のノードにノードを配線することもできます。