2015-10-07 63 views
1

我可以向cuda nvcc編譯器指定計算能力,默認值爲2.0:-gencode = arch = compute_20,code = \「sm_20,compute_20 \」。CUDA nvcc - 使用本地卡構建最大計算能力

我有兩臺電腦。一個可以做compute_20,另一個可以做compute_30。我正在使用visual studio。有沒有指定nvcc使用最大的本地卡功能?否則,我需要在每臺計算機上都有一個單獨的項目(.vcxproj)(手動指定最大計算能力),這並不理想。

+2

是的,這是可能的。如果您查看其中一個cuda示例項目,您將看到如何爲多個目標指定編譯。基本上你可以在同一個nvcc編譯命令中使用多個gencode開關。 –

+0

我看到他們在樣本中設置了拱形的所有內容: compute_11,sm_11; compute_20,sm_20; compute_30,sm_30; compute_35,sm_35; compute_37,sm_37; compute_50,sm_50; 因此,代碼將編譯所有選項。司機是否足夠聰明地使用最高的? 有沒有辦法來驗證(哪個代碼是在運行時挑選的)? –

+0

我發佈了一個重複的主題:https://devtalk.nvidia.com/default/topic/883273/cuda-programming-and-performance/nvcc-build-with-local-card-max-compute-capablity/?offset = 3#4688796 –

回答

1

是的,你可以指定多個目標。 CUDA示例代碼給出瞭如何在Visual Studio項目中執行此操作的示例。基本思路是通過項目... CUDA ...設備下的VS項目設置來指定多個-gencode開關(在nvcc編譯命令行上)。(這也可以在逐個文件的源文件中指定)。在Visual Studio中,您只需指定開關參數,如:

compute_20,sm_20;compute_30,sm_30;compute_35,sm_35; 

和Visual Studio的支持CUDA的構建系統將是轉換爲gencode交換機像一個序列:

-gencode arch=compute20,code=sm_20 -gencode arch=compute_30,code=sm_30 ... 

其中NVCC編譯將識別併爲指定的各種目標生成單獨的設備代碼。這是一個相當複雜的主題,因此您可能需要閱讀關於nvcc manual中的fatbinary系統和nvcc編譯流程,或者研究有關此處的cuda標記上的其他問題,如this one

預見你的一些其他問題,這也涵蓋在NVCC手冊:

  1. CUDA運行時會選擇實際設備的最佳配合,根據您fatbinary可用目標。如果存在一個確切的SASS編譯二進制文件,它將使用該編譯二進制文件,否則它將採用最接近的PTX對象並針對預期的設備進行JIT編譯。

  2. 宏存在並且在設備代碼中定義。您可以使用它來專門設計各種目標的設備代碼,這會讓您有一種乏味的機制來驗證CUDA運行時在選擇要使用的對象時是否做了預期的事情。