Tuesday, September 14, 2010

Some OpenCL test. pt2.

繼續紀錄OpenCL的瑣事。

我覺得OpenCL很不錯的地方之一,在於它的一些專有名詞命名都還滿符合直覺,不會像有些想要耍帥的技術取了一堆像是warp啦,thread block啦之類很難一下子就理解的怪東西。

OpenCL的一個device就是一個cpu或一個gpu,一個device就有一個相對應的job queue可以把工作丟進去讓device執行,至於一個device有幾個核心或是一個job如何scheduling,我們不用理會,OpenCL會幫我們處理。

一整個要被執行的job大小叫做global work size,global work會被切分成一些被放在一起執行的單位叫做work group,work group的大小叫做local work size,work group裡面包含了很多的單一工作叫做work item,我們要寫的kernel,就是一個單一work item要作的工作。

個人是覺得相當直覺,看一眼就知道在幹嘛,如果有寫過shader,幾乎是一樣的流程,只是OpenCL在memory的存取上,少了一些shader的限制

1.每個work item中可以有自己的private memory,這相當於shader中的一些local register

2. 同樣work group中的work items,可以存取一小塊分享的local memory,據nVidia的文件local memory速度相當快,這有點像shader的uniform變數或constant buffer,不過shader的uniform變數是不能寫的,kernel則無此限制。

3. 所有work item都可以存取global memory,可是速度就比較慢,這可以想成是GPU的texture memory,不過在shader中是不能寫到任意貼圖記憶體位置的,kernel同樣無此限制。

4. 存取global 或local memory,都可以用一些atomic的運算,如atomic_add,來確保運算結果是正確的。

No comments: