CUDA函式字首與儲存器字首討論

2021-06-18 14:17:21 字數 2113 閱讀 6264

**:

在cuda c語言對c語言的擴充套件之一就是加入了一些函式字首和儲存器字首,它們是:

函式字首:

__device__ , __global__, __host__

儲存器型別字首:

__device__, __shared__, __constant__(constant, 不是const)

其中__是兩條下劃線。

值得注意的是函式字首和儲存器字首中都有__device__,但表達的意思不同。

在早期版本的cuda中曾經還有__local__字首用於限定將某些變數放在local memory中,但是後來的版本決定由編譯器決定將變數放在local memory還是register中。

下面詳細介紹一下函式字首和儲存器型別字首的意義和使用方法。

函式字首用於在定義函式時限定該函式的呼叫和執行方式,例如:

__host__ int foo(int a){}與c或者c++中的foo(int a){}相同,是由cpu呼叫,由cpu執行的函式

__global__ int foo(int a){}表示乙個核心函式,是一組由gpu執行的平行計算任務,以foo<<>>(a)的形式或者driver api的形式呼叫。目前__global__函式必須由cpu呼叫,並將平行計算任務發射到gpu的任務呼叫單元。隨著gpu可

程式設計能力的進一步提高,未來可能可以由gpu呼叫。

__device__ int foo(int a){}則表示乙個由gpu中乙個執行緒呼叫的函式。由於tesla架構的gpu允許執行緒呼叫函式,因此實際上是將__device__ 函式以__inline形式展開後直接編譯到二進位制**中實現的,並不是真正的函式。而fermi則允許gpu執行緒呼叫函式,__device__也就成了名副其實的函式了。

__host__和__device__關鍵字可以連用,例如

__host__ __device__ int foo(int a){}會被編譯成兩個版本,分別可以由cpu和gpu執行緒呼叫。

資料型別字首__device__, __shared__和 __constant__使用場合有:

定義視訊記憶體中的乙個陣列或者常數儲存器中的乙個陣列時,例如__device__ a[100], __constant__ b[100] = , __shared__ a。呼叫以這種方式宣告的陣列時需要注意陣列的作用範圍,必須對呼叫它的核函式可見。

__shared__有一些特別的地方,__shared__陣列在定義時不能賦值,並且只能在__global__函式內部定義。

定義乙個指標的型別時,例如__device__ a*, __device__ b*等。在定義__global__和__device__函式時有時也要在引數前加上資料型別字首。

隨著fermi引入統一編址,未來不需要在指標型別前加資料型別字首也可以工作。

cuda字首與opencl字首的對應關係:

函式字首:

opencl中只有__kernel函式字首與cuda的__global__函式字首對應

而所有的由cpu和gpu執行緒呼叫的函式都等同於cuda中的__host__ __device__字首,視需要編譯出兩個版本。

儲存器型別字首:

__local = __shared__

__global = __device__

__constant = __constant__

__private = 不帶字首的私有變數,register/local memory

值得注意的是__local(work group本地共享儲存器)和cuda中曾經短暫存在的__local__(視訊記憶體中的執行緒私有儲存器)意義不同。__global和__global__ ,__device__也很微妙。

此外,__local和__shared__的意義和使用方法基本相同,但是如果需要在呼叫核心函式時動態分配每個sm使用的共享儲存器的大小,仍然有少許不同。假設我們需要在kernel中動態的定義幾個__shared__陣列的大小,那麼

cuda c語言中的方式是開闢一塊不在kernel內指定大小extern __shared__ type a陣列以及與需要的陣列相應的幾個__shared__指標,然後根據外部分配的大小使__shared__指標指向的a中的對應位置。

opencl的方式則是直接在呼叫函式時以引數的形式傳入__local memory指標及大小,似乎比較靈活一些。

瀏覽器核心與字首

各瀏覽器渲染引擎 chrome和safari webkit引擎 firefox gecko引擎 ie trident引擎 opera presto引擎,後改為webkit引擎 以webkit為引擎的移動瀏覽器最為流行。瀏覽器引擎字首有哪些?moz firefox等使用mozilla引擎的瀏覽器 we...

瀏覽器核心與字首

各瀏覽器渲染引擎 chrome和safari webkit引擎 firefox gecko引擎 ie trident引擎 opera presto引擎,後改為webkit引擎 以webkit為引擎的移動瀏覽器最為流行。瀏覽器引擎字首有哪些?moz firefox等使用mozilla引擎的瀏覽器 we...

瀏覽器核心與字首

各瀏覽器渲染引擎 chrome和safari webkit引擎 firefox gecko引擎 ie trident引擎 opera presto引擎,後改為webkit引擎 以webkit為引擎的移動瀏覽器最為流行。瀏覽器引擎字首有哪些?moz firefox等使用mozilla引擎的瀏覽器 we...