opencl-Shader
4478 ワード
転載先:http://blog.csdn.net/leonwei/article/details/8956632
ここではOpenCLにおけるプログラム関数の書き方について説明しますが、プログラム関数は通常テキスト形式であり、clCreateProgramWithSourceのようなインタフェースloadを使用して入ってきます.ShaderプログラミングではGPU上で実行されるコードをこのような形で書くこともよくありますので、ここではこれらのプログラム関数のソーステキストをOpenCLのshaderと呼んでおきましょう
次はshaderに書かれた文法です
1 shaderはクラスCの言語であり、C 99標準(99年にansi Cが受け入れた標準であり、C最新の標準)から派生している.
サポートされていません:
ヘッダファイル、関数ポインタ、再帰、変長配列(このVSもサポートされていません)
追加のタイプ:
vectorタイプchar 2 ushaort 4 int 8これらは最後に長さ揃えになります
画像タイプimage 2 d_t image3d_t sampler_t ...
イベントタイプevent_t(APIにおけるCL_eventに関連付けられる)
2.work itemとwork Group関連関数
3.vector操作
vectorの前半はlo,後半はhi
int4 v=(int4) 7 =(int4)(7,7,7,7)
v=(in4)(1,2,3,4)
int2 v2=v.lo ->(1,2)
v2=v.hi ->(3,4)
v2.v.odd ->(2,4)
vectorに対して4則の演算をして、absは各要素に対してそれぞれ計算することに等しいです
4.アドレス空間記述子は、変数の一番前に書かれ、変数が存在するアドレス空間に使用されます.
__global
__local
__private
__constant
これら4つは、それぞれCLアーキテクチャにおける記憶領域(デバイスグローバル、workグループ、compute unit、デバイスconstant)に対応する
より前の_ を取り除くこともできます現在globalはconstantに違いない、すなわちglobalを宣言する際に付与しなければならない(globalはglobal constantに等しい) 異なるアドレス空間におけるポインタ変換は、定義されていない である.
5.タイプ変換
5.1 convertタイプ変換;これは変数の意味のタイプによって変換されます.
convert_と書くdestType<_sat><_roundingMode>形式、
例えばfloat 4 f 4=(float 4)(1.0 f,2.0 f,3.0 f,4.0 f)
int4 i4=convert_int4_sat_rte(f4)
destType:ターゲットタイプ
_sat:範囲外で自動的に最大または最小表示にまとめられる数
_roundingMode:
_rte:最も近い偶数を表す
_rtz:0に近づく
_rtp:朝正無限大
_rtn:朝負無限大
この中のルールは複雑です.詳しくはhttp://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/convert_T.htmlを参照してください.
5.2 as変換:bit値により再解釈されるタイプ変換
as_と書くdesttype
ここで、変換前後のタイプのvetctor sizeは同じで、desttypeはターゲットタイプであり、この変換はbit値を維持し、これに基づいてdesttypeに基づいて数値を再解釈する
as変換とconvert変換には本質的な違いがあります!
例えばfloat 4 f 4=(float 4)(1.0 f,2.0 f,3.0 f,4.0 f)
int4 i4=as_int4(f4)
6.組み込み関数:
6.1いろいろな超多の数学の関数
簡単な表を貼る.
6.2Work_グループ関数:
主にgroup内のcomputer item間のインタラクションに使用されます同期関数
cl_mem_fence_flags flags
1つのgoup内のすべてのitemは、このbarrier関数をすべて実行してから後続のことを続ける必要があります.これはすべてのitemの同期点と見なすことができます.誰が速くても遅くても、この点に着いて止まらなければなりません.みんながこの点に着いてから、続けなければなりません.
ここでのパラメータは、次の2つのケースに分けられます.
CLK_LOCAL_MEM_FENCEとCLK_GLOBAL_MEM_FENCE
このパラメータは今もよく分かりませんが、mem fenceを追加してloca memやglobalmemの同期が正常であることを保証することを意味しています.mem fenceの概念についてはopenclの説明を見てみましょう.
非同期メモリcopyおよびprefetch関数 async_work_group_copy:globalとlocalの間の非同期メモリコピーを完了します.このコピーはDMAエンジンを使用する可能性があります(DMAのデータ転送は従来のハードウェア中断を使用しないで、すぐにできます).この関数は非同期なので、イベントevent_を返します.t同期用
wait_の使用group_events関数は、同期のために上のeventが戻るのを待つ
async_work_group_strided_copy:ドキュメントではsrcからdestまでのgatherデータに使用されていますが、ドキュメントのgatherの意味はよく理解できません.よく分析すると、この関数はasync_と同じです.work_group_copyの違いはstrideであり、彼も非同期のコピーを完了しているが、srcからドメインの一部をdstに抽出することができる.例えばグラフィックでは、色、法線、テクスチャ座標などを大きな配列で表すことがよくあります.彼らは{color 1,ccolor 2,color 3,tex 0,tex 1,color 1,color 2,color 3,text 0,tex 1,....}のようにつながっています.この場合、color情報を抽出する必要があります.それでは、このstride copyを使用します.
ここではOpenCLにおけるプログラム関数の書き方について説明しますが、プログラム関数は通常テキスト形式であり、clCreateProgramWithSourceのようなインタフェースloadを使用して入ってきます.ShaderプログラミングではGPU上で実行されるコードをこのような形で書くこともよくありますので、ここではこれらのプログラム関数のソーステキストをOpenCLのshaderと呼んでおきましょう
次はshaderに書かれた文法です
1 shaderはクラスCの言語であり、C 99標準(99年にansi Cが受け入れた標準であり、C最新の標準)から派生している.
サポートされていません:
ヘッダファイル、関数ポインタ、再帰、変長配列(このVSもサポートされていません)
追加のタイプ:
vectorタイプchar 2 ushaort 4 int 8これらは最後に長さ揃えになります
画像タイプimage 2 d_t image3d_t sampler_t ...
イベントタイプevent_t(APIにおけるCL_eventに関連付けられる)
2.work itemとwork Group関連関数
3.vector操作
vectorの前半はlo,後半はhi
int4 v=(int4) 7 =(int4)(7,7,7,7)
v=(in4)(1,2,3,4)
int2 v2=v.lo ->(1,2)
v2=v.hi ->(3,4)
v2.v.odd ->(2,4)
vectorに対して4則の演算をして、absは各要素に対してそれぞれ計算することに等しいです
4.アドレス空間記述子は、変数の一番前に書かれ、変数が存在するアドレス空間に使用されます.
__global
__local
__private
__constant
これら4つは、それぞれCLアーキテクチャにおける記憶領域(デバイスグローバル、workグループ、compute unit、デバイスconstant)に対応する
5.タイプ変換
5.1 convertタイプ変換;これは変数の意味のタイプによって変換されます.
convert_と書くdestType<_sat><_roundingMode>形式、
例えばfloat 4 f 4=(float 4)(1.0 f,2.0 f,3.0 f,4.0 f)
int4 i4=convert_int4_sat_rte(f4)
destType:ターゲットタイプ
_sat:範囲外で自動的に最大または最小表示にまとめられる数
_roundingMode:
_rte:最も近い偶数を表す
_rtz:0に近づく
_rtp:朝正無限大
_rtn:朝負無限大
この中のルールは複雑です.詳しくはhttp://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/convert_T.htmlを参照してください.
5.2 as変換:bit値により再解釈されるタイプ変換
as_と書くdesttype
ここで、変換前後のタイプのvetctor sizeは同じで、desttypeはターゲットタイプであり、この変換はbit値を維持し、これに基づいてdesttypeに基づいて数値を再解釈する
as変換とconvert変換には本質的な違いがあります!
例えばfloat 4 f 4=(float 4)(1.0 f,2.0 f,3.0 f,4.0 f)
int4 i4=as_int4(f4)
6.組み込み関数:
6.1いろいろな超多の数学の関数
: http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/ Built_in Function
簡単な表を貼る.
6.2Work_グループ関数:
主にgroup内のcomputer item間のインタラクションに使用されます
void barrier (
cl_mem_fence_flags flags
)
1つのgoup内のすべてのitemは、このbarrier関数をすべて実行してから後続のことを続ける必要があります.これはすべてのitemの同期点と見なすことができます.誰が速くても遅くても、この点に着いて止まらなければなりません.みんながこの点に着いてから、続けなければなりません.
ここでのパラメータは、次の2つのケースに分けられます.
CLK_LOCAL_MEM_FENCEとCLK_GLOBAL_MEM_FENCE
このパラメータは今もよく分かりませんが、mem fenceを追加してloca memやglobalmemの同期が正常であることを保証することを意味しています.mem fenceの概念についてはopenclの説明を見てみましょう.
wait_の使用group_events関数は、同期のために上のeventが戻るのを待つ
async_work_group_strided_copy:ドキュメントではsrcからdestまでのgatherデータに使用されていますが、ドキュメントのgatherの意味はよく理解できません.よく分析すると、この関数はasync_と同じです.work_group_copyの違いはstrideであり、彼も非同期のコピーを完了しているが、srcからドメインの一部をdstに抽出することができる.例えばグラフィックでは、色、法線、テクスチャ座標などを大きな配列で表すことがよくあります.彼らは{color 1,ccolor 2,color 3,tex 0,tex 1,color 1,color 2,color 3,text 0,tex 1,....}のようにつながっています.この場合、color情報を抽出する必要があります.それでは、このstride copyを使用します.