這裡介紹關于opencl中program函數的寫法,program函數通常是文本形式的,然後使用clcreateprogramwithsource這樣的接口load進來。在shader程式設計中也經常使用這種形式書寫gpu上運作的代碼,是以為了表述清楚和了解友善,這裡姑且把這些program函數的源碼文本稱為opencl的shader吧
下面都是寫在shader中的一些文法
不支援:
頭檔案、函數指針、遞歸、變長數組(這個vs也不支援)
額外加入的類型:
vector 類型 char2 ushaort4 int8 這些最後都會變成長度對齊的
圖像類型 image2d_t image3d_t sampler_t ...
event類型 event_t(關聯于api中cl_event)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI2gzMyUDOwgTMxITNwMTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
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等于對每個元素分别計算
__global
__local
__private
__constant
這四個分别對應了cl架構中的存儲區域(裝置全局、work group、compute unit 、裝置constant)
前面的__也可去掉
目前global一定是constant的,也就是聲明global時必須指派 (global就等于 global constant)
不同位址空間上的指針轉化是沒有定義的
寫成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
寫成as_desttype
其中轉換前後的類型的vetctor size是要一樣的,desttype是目标類型,這個轉換會保持bit值不變,在此基礎上根據desttype重新解釋數值
as轉換和convert轉換有着本質的差別!
int4 i4=as_int4(f4)
貼個簡表
主要用于一個group内的computer item間的互動
同步函數
<code>void barrier (</code>
cl_mem_fence_flags flags<code>)</code>
一個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。