takumi3d
BACK TO NOTES
Unknown |
#Houdini#HDK#Opencl#Tips

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

OpenCL_001.png

Writable を ON にすることで GPU から書き込み可能になる。


WriteBack の仕組み

GPU では並列にデータを書き換えるため、競合が起こりやすい。
これを避けるため、Houdini の OpenCL は WriteBack 方式を使う。

OpenCL_002.png

一時バッファに書き、後で元の属性へ戻すことで安全に並列化する。


コンパイルと Iteration

OpenCL はカーネルをコンパイルして高速化できる。
ただし、より高速なのは カーネル内部の Iteration(ループ)

OpenCL_003.png

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_004.png OpenCL_005.png OpenCL_006.png

OpenCL は VEX と同じようにパラメータを自動生成してくれる。


Bindings の初期化

Bindings はノード内部に残り続けるため、
コードを変更したときは Clear が必要。

OpenCL_007.png OpenCL_008.png

Bindings が残っていると、UI では正常に見えても内部で不整合が起きる。


パラメータのRangeなどはVEXと同じように編集可能 OpenCL_009.png


Tips


Bindings を修正する場合は 必ず Clear を実行してからやり直す。
古いバインドが残ると正しくパラメータが生成されない。

チェック項目(最重要だけ抜粋)

  • Code Snippet = ON

  • 属性は明示的にバインド

  • 型(float3 など)を正確に

  • Writable を ON

  • Kernel Name を正確に

  • 引数とバインドの整合性

  • Run Over を正しく設定


まとめ

OpenCL を使ううえで重要なのは以下の 3 点だけ。

  1. Bindings を正しく設定する(型・Size・Writable)

  2. WriteBack により安全な並列処理が行われていることを理解する

  3. **Iteration とコンパイルで高速化する