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関連関数
opencl-Shader_第1张图片
 
 
 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いろいろな超多の数学の関数
    http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/ Built_in Function  

    簡単な表を貼る.
    opencl-Shader_第2张图片
    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の説明を見てみましょう.
           
  • 非同期メモリ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を使用します.