從零開始學習OpenCL開發(四)shader

  1. shader是類C的語言派生自C99標準99年ansi C接受的標準也是C最新的標準
  2. work item和 work Group相關函數
  3.  3vector 操作
  4.  4尋址空間描述符寫在變量的最前面用於變量所處於的地址空間
  5.  5類型轉換
    1.   51convert類型轉換這是按照變量語意的類型轉換
    2. 2 as轉換這是根據bit值重新解釋的類型轉換
  6. 內建函數
    1. 1各種各樣超多的數學函數
    2. 2Work_group函數

 

      這裏介紹關於OpenCL中program函數的寫法,program函數通常是文本形式的,然後使用clCreateProgramWithSource這樣的接口load進來。在Shader編程中也經常使用這種形式書寫GPU上運行的代碼,所以爲了表述清楚和理解方便,這裏姑且把這些program函數的源碼文本稱爲OpenCL的shader吧

 下面都是寫在shader中的一些語法

 

1 shader是類C的語言,派生自C99標準(99年ansi C接受的標準,也是C最新的標準)

不支持:

   頭文件、函數指針、遞歸、變長數組(這個VS也不支持)

額外加入的類型:

   vector 類型 char2 ushaort4 int8  這些最後都會變成長度對齊的

   圖像類型 image2d_t image3d_t  sampler_t ...

   event類型 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做四則運算、abs等於對每個元素分別計算

 

 4.尋址空間描述符,寫在變量的最前面,用於變量所處於的地址空間

__global

__local

__private

__constant

這四個分別對應了CL架構中的存儲區域(設備全局、work group、compute unit 、設備constant)

 

  • 前面的__也可去掉
  • 目前global一定是constant的,也就是聲明global時必須賦值 (global就等於 global constant)
  • 不同地址空間上的指針轉化是沒有定義的

 5.類型轉換

  5.1convert類型轉換;這是按照變量語意的類型轉換

寫成convert_destType<_sat><_roundingMode>形式,

如float4 f4=(float4)(1.0f,2.0f,3.0f,4.0f)

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轉換有着本質的區別!

如float4 f4=(float4)(1.0f,2.0f,3.0f,4.0f)

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函數:

主要用於一個group內的computer item間的交互

            一個goup內的所有item必須全部執行完這個barrier函數之後才能繼續進行後續的事情,也可看做這是所有item的一個同步點,不管誰快誰慢,必須到這個點停一下,大家都到了這個點之後,再繼續進行。

        這裏的參數分兩種情況:

          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:文檔上說它用於gather數據從src到dest,但是文檔中gather的意思不能讓人很好的理解,仔細的分析一下,這個函數同  async_work_group_copy的差異在於stride,他也是完成異步的拷貝,但是它可以從src抽取一部分域出來到dst中。例如在圖形學中我們經常用一個大數組表示顏色、法向、紋理座標等等,他們是連在一起的,如{color1,ccolor2,color3,tex0,tex1,color1,color2,color3,text0,tex1,....},這時我們需要抽取其中的color信息出來,那就要用到這個stride copy。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章