CUDA C語言

yyfn風辰發表於2010-01-10
     前一節,我已經說了怎樣在ubuntu linux上構建CUDA開發環境了,對一個語言來說,最簡單的,也是用得最多的當然是它的語法了,下面我簡單的介紹一下CUDA的語法。 CUDA C不是C語言,而是對C語言進行擴充套件。CUDA對C的擴充套件主要包括以下四個方面: 函式型別限定符,用來確定函式是在CPU還是在GPU上執行,以及這個函式是從CPU呼叫還是從GPU呼叫。   __device__,__device__表示從GPU上呼叫,在GPU上執行;   __global__,__global__表示在CPU上呼叫,在GPU上執行,也就是所謂的核心(kernel)函式;核心主要用來執行多執行緒呼叫。 __host__,__host__表明在CPU上呼叫,在CPU上執行,這是預設時的情況,也就是傳統的C函式。CUDA支援__host__和__device__的聯用,表示同時為主機和裝置編譯。此時這個函式不能出現多執行緒語句。   變數型別限定符,用來規定變數儲存什麼位置上。在傳統的CPU程式上,這個任務由編譯器承擔。在CUDA中,不僅要使用主機端的記憶體,還要使用裝置端的視訊記憶體和GPU片上的暫存器、共享儲存器和快取。在CUDA儲存器模型中,一共抽象出來了8種不同的儲存器。複雜的儲存器模型使得必須要使用限定符要說明變數的儲存位置。  __device__,__device__表明宣告的資料存放在視訊記憶體中,所有的執行緒都可以訪問,而且主機也可以通過執行時庫訪問; __shared__,__shared__表示資料存放在共享儲存器在,只有在所在的塊內的執行緒可以訪問,其它塊內的執行緒不能訪問; __constant__,__constant__表明資料存放在常量儲存器中,可以被所有的執行緒訪問,也可以被主機通過執行時庫訪問; texture,texture表明其繫結的資料可以被紋理快取加速存取,其實資料本身的存放位置並沒有改變,紋理是來源於圖形學的一介概念,CUDA使用它的原因一部分在於支援圖形處理,另一方面也可以利用它的一些特殊功能。 如果在GPU上執行的函式內部的變數沒有限定符,那表示它存放在暫存器或者本地儲存器中,在暫存器中的資料只歸執行緒所有,其它執行緒不可見。 如果SM的暫存器用完,那麼編譯器就會將本應放到暫存器中的變數放到本地儲存器中。 執行配置運算子<<< >>>,用來傳遞核心函式的執行引數。執行配置有四個引數,第一個引數宣告網格的大小,第二個引數宣告塊的大小,第三個引數宣告動態分配的共享儲存器大小,預設為0,最後一個引數宣告執行的流,預設為0。 五個內建變數,用於在執行時獲得網格和塊的尺寸及執行緒索引等資訊 gridDim, gridDim是一個包含三個元素x,y,z的結構體,分別表示網格在x,y,z三個方向上的尺寸,雖然其有三維,但是目前只能使用二維; blockDim, blockDim也是一個包含三個元素x,y,z的結構體,分別表示塊在x,y,z三個方向上的尺寸,對應於執行配置中的第一個引數,對應於執行配置的第二個引數; blockIdx, blockIdx也是一個包含三個元素x,y,z的結構體,分別表示當前執行緒所在塊在網格中x,y,z三個方向上的索引; threadIdx, threadIdx也是一個包含三個元素x,y,z的結構體,分別表示當前執行緒在其所在塊中x,y,z三個方向上的索引; warpSize,warpSize表明warp的尺寸,在計算能力為1.0的裝置中,這個值是24,在1.0以上的裝置中,這個值是32。 其它的還有數學函式,原子函式,紋理讀取、繫結函式,內建柵欄,記憶體fence函式等。一般而言,知道這些就應該能夠寫出CUDA程式了,當然要寫好的話,必須知道很多其它的細節。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23057064/viewspace-624774/,如需轉載,請註明出處,否則將追究法律責任。

相關文章