如何通過#define在編譯時獲得CUDA Compute功能(版本)? 例如,如果我使用__ballot與編譯可以通過#define在編譯時獲得CUDA計算功能(版本)嗎?
nvcc -c -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_13,code=sm_13
source.cu
我可以在我的代碼獲得計算能力的版本通過#定義與__ballot和沒有選擇的代碼分支?
如何通過#define在編譯時獲得CUDA Compute功能(版本)? 例如,如果我使用__ballot與編譯可以通過#define在編譯時獲得CUDA計算功能(版本)嗎?
nvcc -c -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_13,code=sm_13
source.cu
我可以在我的代碼獲得計算能力的版本通過#定義與__ballot和沒有選擇的代碼分支?
是的。首先,最好了解當您使用-gencode
時會發生什麼情況。 NVCC將多次編譯您的輸入設備代碼,每個設備目標體系結構一次。因此,在您的示例中,NVCC將爲compute_20運行編譯階段1,併爲compute_13運行一次。
當nvcc編譯.cu文件時,它定義了兩個預處理器宏__CUDACC__
和__CUDA_ARCH__
。 __CUDACC__
沒有值,只是在cudacc是編譯器時才定義,如果不是定義則不定義。
__CUDA_ARCH__
被定義爲表示正在編譯的SM版本的整數值。
等引述包括在CUDA工具包的NVCC文檔:
架構識別宏
__CUDA_ARCH__
在每個nvcc c期間被分配一個三位數值字符串xy0
(以文字0結尾)編制爲compute_xy
的編制階段1。該宏可用於GPU功能的實現,以確定當前正在編譯的虛擬體系結構。主機代碼(非GPU代碼)不能依賴於它。
所以,在你想使用__ballot()
你的情況,你可以這樣做:
....
#if __CUDA_ARCH__ >= 200
int b = __ballot();
int p = popc(b & lanemask);
#else
// do something else for earlier architectures
#endif
非常感謝!它的工作:)這是什麼意思:CUDA_VERSION?它是否等於CUDA Toolkit的版本號? – Alex
是的,[請參閱此處](http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__TYPES_g3c09bba9b1547aa69f1e346b82bcdb50.html)。實際上,這是主版本1000 +次版本乘以10,所以4.2 - > 4020。 – harrism