【CUDA學習筆記(四)】GPU設備執行函數、(CUDA 工具手冊 v10.2.89版本)(歡迎大家在評論區交流)

CUDA中對於語言C++的編程擴展有很詳細的說明,我採用的就是C++編程,根據之前提到過的異構編程思想,首先C++語言提供必要的串行代碼,但是並行代碼部分如何編寫?並行代碼部分主要靠CUDA中C++擴展的函數來實現。這裏首先介紹如何定義GPU設備上執行的函數,然後詳細介紹主機和設備之間內存開闢和數據傳輸問題。

1.函數執行空間說明符

函數執行空間說明符表示一個函數是在主機上執行還是在設備上執行,以及它是可以從主機上調用還是從設備上調用。這裏涉及兩個問題,一個是執行、一個是調用。

1.1__global__

代碼的執行空間說明符__global__將一個函數聲明爲內核。這樣的函數可以:

1)在設備上執行;
2)在主機上調用;
3)在設備上調用;

一個__global__函數必須具有void返回類型,並且不能是一個類的成員。
對一個__global__函數的調用是異步的,這意味着它在設備完成執行之前返回。因此這樣的函數在主函數中需要同步語句。

1.2__device__

__device__執行空間說明符聲明瞭一個函數:

1)在設備上執行;
2)只能從設備上調用;

不能同時使用__global__和__device__執行空間說明符。

1.3__host__

__host__執行空間指定符聲明瞭一個函數:

1)在主機上執行
2)只能從主機調用
它等價於只使用__host__執行空間說明符來聲明一個函數,或者不使用任何__host__、__global__和__device__執行空間說明符來聲明它;在這兩種情況下,函數都只爲主機編譯

host、__global__執行空間指定符不能同時使用。
但是,可以同時使用__device__和__host__執行空間說明符

1.4__noinline__ 和__forceinline__

當認爲合適時,編譯器會內聯任意的__device__函數。
可以使用__noinline__ 函數限定符作爲提示,讓編譯器儘可能不內聯函數。
可以使用__forceinline__函數限定符強制編譯器內聯函數。
函數限定符不能同時使用,而且兩個函數限定符都不能應用於內聯函數。

2.變量內存空間說明符

變量內存空間說明符表示變量在設備上的內存位置。
在設備代碼中聲明的一個自動變量,在本節中描述的內存空間說明符中沒有使用任何__device__或者__shared__ 或者__constant__說明符 ,通常存在於寄存器中。但是,在某些情況下,編譯器可能會選擇將它放在本地內存中,這可能會產生不良的性能後果。

2.1__device__

__device__內存空間說明符聲明瞭一個存在於設備上的變量。

在接下面介紹的__constant__或者__shared__或者__managed__內存空間說明符中,最多有一個可以與__device__一起使用,以進一步指示變量屬於哪個內存空間。如果它們都不存在,變量:
1)存在於全局內存空間中;
2)在它創建後具有CUDA環境的生存週期;
3)每個設備有一個不同的對象;
4)可以從Grid內的所有線程訪問,或者通過runtime庫(cudaGetSymbolAddress() / cudaGetSymbolSize() / cudaMemcpyToSymbol() / cudaMemcpyFromSymbol())從主機訪問。

2.2__constant__

__constant__內存空間說明符,可選地與__device__說明符一起使用,聲明瞭一個變量:
1)存在於常量內存空間中;
2)在它創建後具有CUDA環境的生存週期;
3)每個設備有一個不同的對象;
4)可以從Grid內的所有線程訪問,或者通過runtime庫(cudaGetSymbolAddress() / cudaGetSymbolSize() / cudaMemcpyToSymbol() / cudaMemcpyFromSymbol())從主機訪問。

2.3__shared__

__shared__內存空間說明符,可選地與__device__說明符一起使用,聲明瞭一個變量:
1)存在於線程塊(block)的共享內存空間中,
2)具有和塊(block)一樣的生命週期,
3)每個block有一個不同的對象,
4)只能從塊內的所有線程訪問,
5)沒有固定地址。

2.4__managed__

__shared__內存空間說明符,可選地與__device__說明符一起使用,聲明瞭一個變量:
1)可以從設備和主機代碼中引用,例如,它的地址可以被獲取,也可以直接從設備或主機函數中讀取或寫入。
2)具有應用程序的生存期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章