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

2021-10-03 12:26:59 字數 2796 閱讀 3790

shader是類c的語言派生自c99標準99年ansi c接受的標準也是c最新的標準

work item和 work group相關函式

3vector 操作

4定址空間描述符寫在變數的最前面用於變數所處於的位址空間

5型別轉換

51convert型別轉換這是按照變數語意的型別轉換

2 as轉換這是根據bit值重新解釋的型別轉換

內建函式

1各種各樣超多的數學函式

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)

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:朝負無窮大

這裡面的規則比較複雜,詳見

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各種各樣超多的數學函式

:詳見的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的描述

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中。例如在圖形學中我們經常用乙個大陣列表示顏色、法向、紋理座標等等,他們是連在一起的,如,這時我們需要抽取其中的color資訊出來,那就要用到這個stride copy。

從零開始學習PHP(四) 函式

函式是乙個系統組成的基礎部分,函式的作用完成一種功能或者完成乙個流程,返回結果 substr array merge 等php內建的函式,用法參考官方文件 顧名思義是沒有引數的函式 結果與上面一致 function add a,b add 10,20 匿名函式是乙個比較特殊的函式,匿名函式沒有函式名...

從零開始學習idea開發vue

使用webpack腳手架開發vue必須基於nodejs 安裝軟體安裝步驟進行,直到結束。測試nodejs是否安裝成功 node v npm config set registry 配置npm映象站 npm config list 顯示所有配置資訊 idea下建立vue工程 在idea中新建stati...

從零開始學習web前端開發

之前半個月一直在學習深度學習,但是感覺自己的能力還沒到那個程度所以就想擱置一下,從程式設計師基礎的前端開發來學。廢話不多說直接開記 我所使用的前端開發軟體就是業內很流行的vscode,作為小白的我當然也是用的這個 具體的安裝教程,外掛程式教程網上都有詳細的介紹,在此處不多講 在vscode中輸入 就...