2012-10-02 63 views
5

如何通過#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和沒有選擇的代碼分支?

回答

15

是的。首先,最好了解當您使用-gencode時會發生什麼情況。 NVCC將多次編譯您的輸入設備代碼,每個設備目標體系結構一次。因此,在您的示例中,NVCC將爲compute_20運行編譯階段1,併爲compute_13運行一次。

當nvcc編譯.cu文件時,它定義了兩個預處理器宏__CUDACC____CUDA_ARCH____CUDACC__沒有值,只是在cudacc是編譯器時才定義,如果不是定義則不定義。

__CUDA_ARCH__被定義爲表示正在編譯的SM版本的整數值。

  • 100 = compute_10
  • 110 = compute_11
  • 200 = compute_20

等引述包括在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 
+0

非常感謝!它的工作:)這是什麼意思:CUDA_VERSION?它是否等於CUDA Toolkit的版本號? – Alex

+1

是的,[請參閱此處](http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__TYPES_g3c09bba9b1547aa69f1e346b82bcdb50.html)。實際上,這是主版本1000 +次版本乘以10,所以4.2 - > 4020。 – harrism

相關問題