我最近開始瞭解NVCC如何爲不同的計算架構編譯CUDA設備代碼。在Nvidia的NVCC編譯器中使用多個「拱形」標誌的目的是什麼?
根據我的理解,使用NVCC的-gencode選項時,「arch」是程序員應用程序所需的最小計算體系結構,也是NVCC的JIT編譯器將編譯PTX代碼的最小設備計算體系結構。
我也明白,-gencode的「code」參數是NVCC完全編譯應用程序的計算體系結構,因此不需要JIT編譯。
各種CUDA項目生成文件的檢查後,我發現下面經常發生:
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
和一些閱讀後,我發現,多種設備的架構可以在一個單一的二進制文件編譯爲 - 中這種情況sm_20,sm_21。
我的問題是爲什麼有這麼多的拱/碼對是必要的?上面所用的「拱」的所有值都是?
是什麼,之間的區別說:
-arch compute_20
-code sm_20
-code sm_21
是在自動選擇了「拱」領域最早的虛擬架構,或者是有一些其他的模糊的行爲呢?
是否有其他編譯和運行時行爲,我應該知道?
我已閱讀手冊,http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation,我仍然不清楚編譯或運行時會發生什麼情況。
乾杯,
詹姆斯。
道歉這麼晚纔回復,感謝你的。我理解PTX爲許多真正的架構進行JIT編譯的目的,但是是否有必要包含所有這些較舊的PTX架構,或僅包含最低規格的PTX?例如,如果我希望代碼能夠在儘可能多的GPU上運行,那麼我會包含-arch compute_11,12 13 ... 30,35還是僅包含-arch compute_11? 最好, 詹姆斯。 –
您可以指定'-arch compute_11',並且您將生成cc 1.1 PTX代碼。現在和未來的所有GPU應該能夠從此版PTX到某些有用的機器代碼(除cc 1.0設備之外)進行JIT編譯。但是,通過指定其他PTX版本,您可以通過添加一個「更新的」PTX,爲更好地利用新架構提供機會,從而使您的代碼在cc3.0設備上運行得更快,如果您還指定了'compute_30'。這是代碼大小/編譯時間和最佳性能之間的折衷。你的旅費可能會改變。 –
現在都清楚,很好的答案。謝謝你的時間! –