On this page |
OpenCL COPには、レイヤに対してOpenCLを作成して実行するための一般的なインターフェースが備わっています。 このCOPは、そのカーネルのOpenCLパラメータに定数、アトリビュート、ボリュームデータをバインドすることができます。
このノードはWrangle COPよりも使いにくいですが、COPではすべての計算をGPU上で実行することが非常に重要なため、VEXの使用よりも推奨されます。
構文 ¶
利用可能な構文に関する基本情報は、VEXユーザ向けのOpenCLを参照してください。
Note
難解なことを行なうのでなければ、SignatureタブやBindingsタブを手動で編集する必要はありません。 それらは通常、“Create inputs and spare parameters”ボタンを使用してセットアップされます。
警告 ¶
-
このノードでは、OpenCLを理解している必要があります。このノードを使用して不正なコードを書いてしまうことがよくあります。
-
ジオメトリをレイヤとしてバインドすることはできません。アトリビュートやボリュームのバインドの名前によって、そのジオメトリを参照しなければなりません。
-
グローバルバインドの
@P
が存在すれば、P
バインドが重複することになるので、#bind point P port=geo float3
を使用することはできません。 代わりに、#bind point geoP name=P port=geo float3
を使用し、その@geoP
を使用してそのP
アトリビュートにアクセスする必要があります。カーネルがアトリビュートに対して実行されている場合、
@P
はバインドされていないので、この場合だと、以下のコードを使用することができます:#runover attribute #bind point &P port=geo float3
パラメータ ¶
Kernel ¶
Kernel Code
実行するOpenCLカーネル。
これは通常、カーネルへのバインドを記述した一連の#bind
コマンドと、実際のカーネル関数を含む@KERNEL
です。
カーネル関数内では@参照を使用してバインドを参照することができます。
Options ¶
Compiler Options
カーネルで必要なコンパイルフラグを指定します。
よくある使い方は、-Dフラグを使ってプリプロセッサ用の#define
ディレクティブを定義することです。
Note
Apple OSX OpenCLコンパイラは、カーネルオプション間に1個のスペースだけを必要とします。
Houdiniは、カーネルをコンパイルする時にOpenCLデバイスに応じて追加フラグを定義します。
__H_GPU__
または__H_CPU__
のフラグは、GPUとCPUのデバイスを区別し、__H_NVIDIA__
、__H_AMD__
、__H_INTEL__
、__H_APPLE_
のフラグは、ハードウェアベンダーを意味します。
Houdiniを起動する前にHOUDINI_OCL_REPORT_BUILD_LOGS
環境変数を1に設定することで、プリプロセッサフラグと一緒にコンパイルされたすべてのカーネルのダンプを取得することができます。
Tile Size
デフォルトの動作では、ソースレイヤ内のバッファエレメント毎にカーネルを実行します。 これを使用することで、バッファエレメントのNxMブロック毎にカーネルを1回実行することができ、 ブロックのサイズが決まります。 したがって、エッジブロックがバッファのエッジを超える可能性があります。
@ixy
は現在のタイルの開始、@tilesize
は設定されたタイルのサイズを示します。
min(@ixy+@tilesize, @res)
は、バッファ内に留まるループの終点として使用することができます。
Iterations
カーネルは、可変回数で再実行することができます。 これによって、より多くのノードを使ってループを作成する必要がなくなり、一連の評価の間にすべてのデータをビデオカード上に残せるようになります。
Include Iteration
現行反復を含む@Iteration
の整数をバインドします。
Use Write Back Kernel
カーネルを実行した後に、それにバインドされた同じパラメータのセットで2番目のカーネルを即座に実行することができます。 複数のスレッドが同じデータに書き込みたい時に、それを2回のパス処理に分けることで、競合状態を回避することができます。
2番目のカーネルは、@WRITEBACK
を使って設定されます。
Include Time
を現行評価時間に秒単位でバインドします。 ¶
Use #import for Prequel Code
いくつかの共通ヘッダが常に含まれます。
これらは、#include
または#import
ディレクティブのいずれかを使用して取り込むことができ、このオプションは後者を選択します。
#import
では、Generate Code出力の結果が乱雑になりますが、Windowsでのカーネルのキャッシュ化を高速化することができます。
Timing Messages
完了時にカーネルを同期して、タイミングが正確になるようにします。 そうでないと、各カーネルが非同期で実行され、どの処理が遅延させているのか分かりにくくなります。
Area Sampling Filter
ソースレイヤのサンプリングに使用するフィルタリングの方法。 歪みによって領域が大きく縮小したり、ノイズが目立つ場合は、エリアフィルター( Box およびそれ以降)のいずれかの使用を検討してください。
詳細は、フィルターを参照してください。
Precision
このノードの精度を制御します。
fpreal
タイプとexint
タイプは、ここで指定した精度に合うように、生成されるコード内で定義されます。
ベクトルバリアント(例えば、fpreal3
、fpreal4
など)も定義されます。
さらにFPREAL_PREC
シンボルは、halfには16、floatには32、doubleには64として定義されます。
Autoは、入力ジオメトリの優先精度を使用します。これは、Attribute Cast SOPで設定することができます。
Note
たいていのドライバでは、計算に16ビットを使用することはできません。
Signature ¶
OpenCLカーネルは複数のレイヤを同時に読み書きすることができるため、ここで入力や出力が定義される方法を設定します。
よくあるのが、Mono、UV、RGB、RGBAレイヤで同じように動作させたいケースです。これは、Varying
Type を使用すると可能です。
Note
ほとんどの場合、このタブは明示的に設定するのではなく、“Create inputs and spare parameters”ボタンを使用してセットアップします。
Inputs ¶
Input #
入力の名前。
これは、#bind
コマンドでバインドされるものです。
Type
Varying
Mono、UV、RGB、RGBAを受け入れます。 様々なタイプのすべての入力が同じタイプに設定されます。
ID
IDレイヤを受け入れます。
Mono
Monoレイヤを受け入れます。
UV
UVレイヤを受け入れます。
RGB
RGBレイヤを受け入れます。
RGBA
RGBAレイヤを受け入れます。
Geometry
ジオメトリ入力。 これらは、アトリビュートまたはボリュームバインドの名前で参照する必要があります。
Metadata
この入力は、サイズおよびメタデータ情報のみに使用され、読み込むことはできません。
Optional
入力が必須の場合、マークします。 呼応するバインドをオプションとしてマークする必要があります。
Outputs ¶
Output #
出力の名前。
これは、#bind
のターゲットです。
Type
Varying
呼応する様々な入力レイヤに一致するMono、UV、RGB、RGBAレイヤ。
ID
IDレイヤ。
Mono
Monoレイヤ。
UV
UVレイヤ。
RGB
RGBレイヤ。
RGBA
RGBAレイヤ。
Geometry
ジオメトリ出力。 OpenCLでジオメトリは作成できないため、これはジオメトリ入力と一致する必要があります。
Metadata
レイヤのメタデータを取得する場所を制御します。 これは、サイズ、ディスプレイウィンドウ、カメラトランスフォームなどが取得される場所です。
First Input
COPの1番目の入力はほとんどの場合サイズ参照のため、メタデータに使用することを推奨します。
Matching Name
この出力名に一致する名前の入力が使用されます。
Input Name
指定した名前の入力が使用されます。
Precision
レイヤは、浮動小数点レイヤでは16ビットおよび32ビットフォーマット、整数では8ビット、16ビット、32ビットフォーマットで格納することができます。
Input Precision
入力レイヤの精度を維持します。
16-bit
強制的に16ビット精度にします。
32-bit
強制的に32ビット精度にします。
Type Info
結果のレイヤのタイプ情報。 Choosing Inputは、どんなメタデータのタイプ情報でも使用します。
タイプ情報の説明に関しては、Copernicus用語集を参照してください。
Input for Metaada
メタデータを使用する入力の名前。
Bindings ¶
Bindings ¶
各パラメータでは、カーネルを呼び出す前に評価される固定定数値を指定したり、レイヤ、ボリューム、ジオメトリアトリビュートから読み/書きすることができます。
Bind# ¶
Name
パラメータの名前。
これは、Generate Kernel
ボタンおよび@バインドによって使用されます。
実際のOpenCLカーネル関数は、名前ではなく、パラメータ順で定義されます。
ただし@KERNEL
を使用する場合、これは非表示です。
Type
作成とバインドをするパラメータのタイプ。
Integer
定数の整数値。 これは、チャンネル参照や事前に計算されるエクスプレッションをバインドすることができます。
Float
定数の浮動小数点値。オプションで、これをタイムステップでスケールすることができます。
Vector2
float2
OpenCLパラメータにバインドされた、2つの浮動小数点の定数タプル。
Vector
float3
OpenCLパラメータにバインドされた、3つの浮動小数点の定数タプル。実際のところメモリでは4つの浮動小数点を使用します。
Vector4
float4
OpenCLパラメータにバインドされた、4つの浮動小数点の定数タプル。
Ramp
スカラーまたはカラーランプ。
OpenCLカーネル内のスプラインベースのランプの評価は複雑なので、代わりに、このランプが均一な浮動小数点の配列にサンプリングされます。
Ramp Size
パラメータは、使用するサンプルの数を制御します。
Layer
Copernicus内のワイヤーに呼応する2次元画像レイヤ。
Geometry
ジオメトリアトリビュートをバインドします。
Volume
ボリュームをバインドします。
VDB
VDBをバインドします。
Ramp Size
ランプを評価する浮動小数点値の数。
Data Type
バインドするランプのタイプ。
Float
スカラーランプ。
Vector
カラーランプ。
Ramp
スカラーランプ値。
Ramp
カラーランプ値。
Data Type
バインドするレイヤのタイプ。 これは、COPシステムではなく、OpenCLタイプシステムを参照します。
Integer
IDレイヤ。
Float
Monoレイヤ。
Float2
UVレイヤ。
Float3
RGBレイヤ。
Float4
RGBAレイヤ。
Float?
Mono、UV、RGB、RGBAレイヤ。
Border
入力レイヤの境界ルールを、そのメタデータを直接編集することなく上書きできます。
Input
入力の境界ルールを変更せずに使用します。
Constant
境界外に定数(ゼロ)値を強制します。
Clamp
境界外をクランプ(制限)またはストリーク(拡張)します。
Mirror
境界外を境界で反射させます。
Wrap
境界外を反対側で繰り返すことで、ラップします。
Port
ジオメトリをバインドする時、複数のジオメトリ入力がある場合があります。 これは、バインド先の入力の名前(シグネチャで指定した通り)です。
Volume
バインドするボリュームまたはVDBのプリミティブの名前または番号。
Force Alignment
カーネルを単純化するために、たいていの場合、すべてのボリュームが解像度とトランスフォームが揃っているものと仮定することができます。 Force Alignmentを設定すると、これが強制されて、ボリュームがずれているとエラーを生成します。
Voxel Resolution
ボリュームの解像度をパラメータとして追加します。
Voxel Size
ボリュームのサイズをSOP空間でパラメータとして追加します。
Transform to World
ボリュームのボクセル座標からSOP座標に変換する行列トランスフォームを追加します。
Transform to Voxel
SOP座標からボリュームのボクセル座標に変換する行列トランスフォームを追加します。
Data Type
バインドに受け入れるVDBのタイプ。
Any
任意のタイプのVDBをバインドできます。 カーネルはタイプを評価するために内部を評価する必要があります。
Float
浮動小数点VDB。
Vector
ベクトルVDB。
Attribute
バインドするアトリビュート。 オプションのフラグを設定しない限り、このアトリビュートが見つからなければエラーになります。
Attributes用に存在します。
Class
アトリビュートのタイプ。
すべてのバインドアトリビュートが同じタイプである必要はなく、同じジオメトリデータから派生している必要もありません。
Attributes用に存在します。
Data Type
バインドするアトリビュートのタイプ。
浮動小数点と整数のアトリビュートは、順番通りにすべてのエレメント値を含んだ単一配列としてバインドされます。
タプルは、交互に配置されます。つまり、P
はxyzxyzxyz
としてバインドされます。
配列アトリビュートは、2つの配列としてバインドされます。1つ目の配列には、各エレメントの配列データが含まれます。 そのため、オフセットのペアはエレメント配列の長さが異なります。 2つ目の配列は、単一配列に連結されたすべてのエレメントの配列のデータです。
Attributes用に存在します。
Tuple Size
バインドするアトリビュートのタプルサイズ。 このサイズが1以上であれば、そのタプルサイズのアトリビュートを用意しなければなりません。 0であれば、自動的にバインドされ、そのタプルサイズに格納するための追加パラメータが生成されます。
Attributes用に存在します。
Precision
このパラメータのデータと紐付ける精度を制御します。
Nodeオプションは、このノードの精度を使用するので、その設定に応じて変わり、それに呼応するカーネルコードは、fpreal
またはexint
の定義を使用します。
これは、ビデオカード上に格納されるデータの精度なので、低い精度を使用することでGPUメモリを節約することができます。
しかし、half
に相当する16ビットは、たいていの場合で計算に使用することができません。
vload_half
を使用することで、それを計算用にfloat
にプロモートすることができます。
同じアトリビュートが異なる精度にバインドされると、そのバインドが失敗します。
現在のところ、ボリュームは32ビットデータ精度にのみバインドすることができます。
Read
OpenCLカーネルがこのアトリビュートまたはボリュームから読み込むかどうかを決定します。 設定されていない場合、アトリビュート値がGPU上にコピーされなくなります。 これは、書き込み専用アトリビュートが無駄にコピーされるのを回避するのに役立ちますが、初期化されていないデータが存在することになるため注意が必要です。
Write
OpenCLカーネルがこのアトリビュートまたはボリュームに書き戻すかどうかを決定します。 CPUバージョンのアトリビュートまたはボリュームを古いとマークさせるので、次回それが必要になった時は、GPUからコピーされるようになります。
Optional
アトリビュートまたはボリュームを不要とマークします。 ジオメトリ内にアトリビュートまたはボリュームが存在しなかった場合、エラーを起こさずに、カーネルオプションに#defineを設定して、そのアトリビュートを無効にします。 これはパラメータのシグネチャまでも変更してしまうので、 Generate Code ボタンを使用して構文を確認してください。
Note
パラメータ名は#define
で使用されるので、そのパラメータ名を変更するには、そのコードを変更する必要があります。
Default Value
オプションのアトリビュートやボリュームが見つからない場合でも、パラメータ値をカーネルにバインドするべきであることをマークします。
#define
がカーネルオプションで設定され、そのアトリビュートが無効になり、単一値に切り替わります。
これはパラメータのシグネチャまでも変更してしまうので、 Generate Code ボタンを使用して構文を確認してください。
バインドされたパラメータの値は、このパラメータの整数値または浮動小数点値から取得されます。
Value
整数パラメータまたはデフォルト値に使用される整数値。
Value
浮動小数点パラメータまたはデフォルト値に使用される浮動小数点値。
Value
float2パラメータまたはデフォルト値に使用されるfloat2値。
Value
float3パラメータまたはデフォルト値に使用されるfloat3値。
Value
float4パラメータまたはデフォルト値に使用されるfloat4値。
Time Scale
指定した浮動小数点値をタイムステップでスケールする方法。 パラメータ評価の時点でtimeincを知ることができないので、カーネルを評価する前にtimeincを定数として計算して、それを浮動小数点値に適用することができます。
Generated Code ¶
Display Code
実際のコンパイラに送信される完全に展開されたコードを生成します。 これによって、コンパイラが#lineディレクティブを評価しなくてもエラーの行番号を解決することができ、さらに、@マクロの挙動を理解するのにも役立ちます。 この@マクロの実展開に依存するべきではありません。
Generated Code
すべての@バインドが展開されたコードスニペット。
Note
このパラメータは使用されず、単に情報提供が目的です。
Examples ¶
GameOfLife Example for OpenCL Copernicus node
このサンプルには、CopernicusでOpenCL COPを使用したコンウェイのライフゲームの実装が含まれています。
SimpleOpenCLCOPSnippets Example for OpenCL Copernicus node
このサンプルには、OpenCLスニペットを使用した多数のコードサンプルが含まれており、それらのコードを使用してCopernicusレイヤをどのように修正できるのかを説明しています。
See also |