2015-09-05 56 views
0

我在桌面上開發了一個Titan X卡(Maxwell體系結構)。但是,生產代碼在具有K40卡的服務器上運行(開普勒體系結構)。如何編譯針對Kepler和Maxwell體系結構的CUDA應用程序?

我該如何構建自己的代碼才能在兩個系統上以最優方式運行?

到目前爲止,我已經使用compute_20,sm_20但我認爲這個設置不是最優的。

+3

http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation –

回答

4

你會想要做的第一件事是建立一個脂肪二元一個包含sm_35(在K40的架構)和sm_52(泰坦X的架構)的機器代碼(SASS),加上中間代碼( PTX)爲compute_52,用於未來GPU上的JIT編譯。你可以通過-gencode開關nvcc這樣做:

nvcc -gencode arch=compute_35,code=sm_35 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52 

這確保生成的可執行代碼是最適合的,並充分利用,每個指定架構。當CUDA驅動程序或運行時在使用特定GPU運行時加載內核時,它將自動選擇具有匹配機器代碼的版本。

構建胖二進制文件不做的事情是調整代碼的各種參數,例如內核的啓動配置,以使其適用於不同的體系結構。因此,如果您需要在任一平臺上實現最佳性能,您可能需要對應用程序進行配置文件分析,並根據配置文件實驗的結果考慮機器特定的源代碼調整。

+0

我認爲你有重複的標誌'-gencode arch = compute_52,code = sm_52 -gencode arch = compute_52,代碼= compute_52'。 – Fabian

+0

@Fabian不重複:這些'-gencode'開關中的第一個將'sm_52' SASS存入fat二進制文件,第二個將'sm_52' PTX存入fat二進制文件,以便在未來GPU架構上進行JIT編譯。您可以使用'cuobjdump --dump-sass'從fat二進制文件中提取SASS版本,'cuobjdump --dump-ptx'來提取PTX版本。 – njuffa

+0

謝謝。這很有幫助。 – Fabian

1

但是,@ njuffa的answer在語義上是正確的,我想指出一些nvcc的-gencode選項的簡寫。正是我們可以縮短:

-gencode arch=compute_52,code=sm_52 -gencode arch=compute_52,code=compute_52 

到這一點:其中在Nvidia的doc描述

-gencode arch=compute_52,code=\"sm_52,compute_52\"