OpenCLを使ってみた
概要
HDK は実質的に主流ではなく、現在は OpenCL と VEX が高速処理の中心。
最適化も容易で、今後は OpenCL ベースで実装していく。
ここでは OpenCL の使い方、バインド、WriteBack、基本的な実装方法を整理する。
OpenCL の基本的な使い方
OpenCL は「属性やパラメータを GPU に公開し、並列処理する」仕組み。
Houdini では Bindings を使って属性やパラメータを正しく GPU と接続する必要がある。
Bindings の考え方
P のような属性を扱う場合は、Bindings で以下を設定する。
-
Parameter Type → Attribute
-
Attribute →
P -
Type → Float
-
Size → 3
-
Writable → ON

Writable を ON にすることで GPU から書き込み可能になる。
WriteBack の仕組み
GPU では並列にデータを書き換えるため、競合が起こりやすい。
これを避けるため、Houdini の OpenCL は WriteBack 方式を使う。

一時バッファに書き、後で元の属性へ戻すことで安全に並列化する。
コンパイルと Iteration
OpenCL はカーネルをコンパイルして高速化できる。
ただし、より高速なのは カーネル内部の Iteration(ループ)。

Houdini ノード側でループを回すより、カーネル内でまとめて処理した方が速い。
実装例
Jeff Lait 氏の例を基に、最も基本的な移動処理を実装してみた。
text// 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
古いバインドが残ると正しくパラメータが生成されない。
チェック項目(最重要だけ抜粋)
-
Code Snippet = ON
-
属性は明示的にバインド
-
型(float3 など)を正確に
-
Writable を ON
-
Kernel Name を正確に
-
引数とバインドの整合性
-
Run Over を正しく設定
まとめ
OpenCL を使ううえで重要なのは以下の 3 点だけ。
-
Bindings を正しく設定する(型・Size・Writable)
-
WriteBack により安全な並列処理が行われていることを理解する
-
**Iteration とコンパイルで高速化する