概要
HDK は実質的に主流ではなく、現在は OpenCL と VEX が高速処理の中心。
最適化も容易で、今後は OpenCL ベースで実装していく。
ここでは OpenCL の使い方、バインド、WriteBack、基本的な実装方法を整理する。
OpenCL の基本的な使い方
OpenCL は「属性やパラメータを GPU に公開し、並列処理する」仕組み。
Houdini では Bindings を使って属性やパラメータを正しく GPU と接続する必要がある。
Bindings の考え方
P のような属性を扱う場合は、Bindings で以下を設定する。
Parameter Type → Attribute
Attribute →
PType → Float
Size → 3
Writable → ON
Writable を ON にすることで GPU から書き込み可能になる。
WriteBack の仕組み
GPU では並列にデータを書き換えるため、競合が起こりやすい。
これを避けるため、Houdini の OpenCL は WriteBack 方式を使う。
一時バッファに書き、後で元の属性へ戻すことで安全に並列化する。
コンパイルと Iteration
OpenCL はカーネルをコンパイルして高速化できる。
ただし、より高速なのは カーネル内部の Iteration(ループ)。
Houdini ノード側でループを回すより、カーネル内でまとめて処理した方が速い。
実装例
Jeff Lait 氏の例を基に、最も基本的な移動処理を実装してみた。
// bind writable position:
#bind point &P float3
// bind parameters:
#bind parm freq float val=1
#bind parm phase float val=0
@KERNEL
{
float3 pos = @P;
pos.y += sin(length(pos) * @freq + @phase);
@P.set(pos);
}
OpenCL は VEX と同じようにパラメータを自動生成してくれる。
Bindings の初期化
Bindings はノード内部に残り続けるため、
コードを変更したときは Clear が必要。
Bindings が残っていると、UI では正常に見えても内部で不整合が起きる。
パラメータのRangeなどはVEXと同じように編集可能

Tips
Bindings を修正する場合は 必ず Clear を実行してからやり直す。
古いバインドが残ると正しくパラメータが生成されない。
チェック項目(最重要だけ抜粋)
Code Snippet = ON
属性は明示的にバインド
型(float3 など)を正確に
Writable を ON
Kernel Name を正確に
引数とバインドの整合性
Run Over を正しく設定
まとめ
OpenCL を使ううえで重要なのは以下の 3 点だけ。
Bindings を正しく設定する(型・Size・Writable)
WriteBack により安全な並列処理が行われていることを理解する
**Iteration とコンパイルで高速化する