こんにちは、篠島です。今回はH16で追加されたコンパイルブロックについて説明します。
コンパイルブロックはコンパイル可能なSOPを一つにまとめてコンパイルすることで、並列処理により高速に処理をできるようになりました。コンパイルをすることで複数のノードが内部的に一つのノードの様に処理されます。Forループ等の処理をこのコンパイルブロック内で行うことによりそれぞれのイテレーションを異なるスレッドに振り分けて高速化をします。
メモリの観点でも効率化されています。普段はそれぞれのノードが処理される毎にジオメトリのキャッシュがメモリ上に作られてしまいますが、コンパイルブロックを使うことで一つのノードとして振る舞うので、複数のキャッシュが作られることがなくなり、メモリの節約にもなります。
コンパイルブロックによって全てが簡単に高速化されるわけではなく、コンパイルするにはコンパイル対応ノードしか使えません。以前の記事でも説明しましたが、このコンパイルの機能の為に Group SOP と Copy SOP に変更が加えられ複数のSOPになりました。
コンパイルブロックを使う上で以下のように注意することがたくさんあります。
- コンパイル可能ノードしか使えない。
- stamp() エクスプレッションが使えない。
- ローカル変数が使えない、コンポーネントのエクスプレッションが使えない。
- 内部のジオメトリを参照できない。”/obj/geo1″ の様にオブジェクトを参照できません。
- point(0, …) や npoints(0) などでインプットジオメトリのデータにアクセスできない。
細かい注意事項に関してはヘルプを参照しましょう。英語のヘルプが読めない・・・という方は Houdini を Indyzone から購入して新しいH16対応日本語ヘルプを手に入れましょう!Houdini の50%キャンペーンが2017年5月31日とあと数日で終わってしまうので、日本語マニュアルにアクセスが無い方はこの機会に是非!
コンパイルによって高速処理ができるからと言って、あらゆる所でコンパイルするのも良くありません。例えば2重Forループがあったとして、両方にコンパイルすると、2つのループが同時に並列処理をするのでごちゃごちゃになり高速化にはあまりならないそうです。なので一番外側のForループに対してコンパイルします。他にもコンパイルブロックの制限からネットワーク全てをコンパイルしようとしても逆に後から色々と変更しようとしたときに作業が大変になります。
なのでコンパイルブロクは処理が非常に遅い部分のノード、Forループなどで大量のイテレーションをこなす時に有効です。
次回は実際にコンパイルブロックの使い方です。