CUDA nvcc編譯步驟簡單講解

2021-08-21 16:47:02 字數 2775 閱讀 7142

主頁: www.gamecoding.cn

1. 乙個編譯例子

隨意找乙個包含 kernel 以及 kernel 呼叫的 .cu 檔案,如 x.cu 。進入命令列 : 敲打 nvcc –cuda x.cu –keep 將得到如下結果, -cuda 是將 .cu 編譯成 .cu.cpp , -keep 保留中間結果。(如果提示找不到 nvcc 請在 path 中新增 %cuda_bin_path% )

開啟 .cu 檔案所在目錄(此處是 ptx ) , 你會驚訝的發現多出了一大堆檔案,是的,很煩,不過很快你將會喜歡上他們,因為他們把 nvcc 的工作流程完美的記錄下來了。好吧,那我們開始吧。

2. virtual architecture vs gpufeature

首先定位到檔案 x.cu, x.ptx, x.sm_10.cubin 這三個檔案上來,他們按照下圖流程依次生成, x.cubin,x.ptx 最終會被巢狀到 x.cu.cpp 中。

virtual compute architecture 對應 nvcc 的 -arch 編譯選項,他的值如下表所示。他的意思

是 nvcc 將針對哪個型別的 virtual compute architecture 生成 ptx 彙編**。如果是 compute_10

則 x.cu 中無法使用 atomic 等不支援的操作,否則會出現編譯錯誤。

real sm architecture 指的是真實 gpu 的架構,這個選項對應於 nvcc 的 -code 編譯選項,

他可以選的值如下表所示。他的意思是根據此目標 gpu 架構將 x.ptx 編譯成 x.cubin ,一般

來說, real sm architecture 必須等於或者高於對應的 virtual compute architecture 。比如:

nvcc –cuda x.cu –arch compute_13 –code sm_10 是行不通的。

到這裡,你或許會說 「 你講錯了吧 」 , nvcc 的 -arch 選項可以取 sm_13 呢, cudarule 都這麼取的,沒錯,是可以怎麼做,因為有些特殊機制的支援:

_ -code 可以有多個值,將生成多個版本的 cubin ,最終全部巢狀在 exe 中,見下節

_ -code 裡面可以包含 compute_xy, 對應的 ptx 會被巢狀在 exe 中,見下節

_ 省略 -arch, 則自動選擇最接近的

nvcc x.cu –code=sm_13 _ nvcc x.cu –arch=compute_13 –code=sm_13

_ 省略 -code

nvcc x.cu –arch=sm_13 _ nvcc x.cu –arch=compute_13 –code=compute_13 sm_13

nvcc x.cu –arch=compute_10 _ nvcc x.cu –arch=compute_10 –code=compute_10

_ 省略 -arch –code

nvcc x.cu _ nvcc x.cu –arch=compute_10 –code=sm_10

3. cubinptx是如何組織到exe中,又是如何被載入到驅動中去的

好的,現在我們已經能夠用 -code –arch 去控制 nvcc 生成對應 virtual or gpu architecture 的 ptx 及 cubin 檔案了。接下來我們講更徹底去了解,這些 ptx, cubin 是怎麼集中到 exe 中,又是如何被執行的。開啟 x.cu.cpp ,搜尋 「

__devicetext_co

mput

e10 com

pute

10

」, 找到了嗎?沒錯,這就是 compute_10 下的 ptx **的二進位制形式,接著往下看,你可以找到 「

__devicetext_sm10s

m1

0」 ,這是 sm_10 下的 cubin **。好吧,再接著看吧:

static __cu****tptxentry __ptxentries

static __cu****tcubinentry __cubinentries

static __cu****tdebugentry __debugentries

他們分別是 ptx 陣列, cubin 陣列以及 debug 陣列, 結尾的原因不用多說了吧,再找找 __cu****tptxentry 在哪定 義 的吧 cuda2.1include__cu****tformat.h ,好好的讀一下這個檔案的說 明 ,你會 長嘆 一 聲 「 你 丫 原來 藏 在這裡 」 。 ok ,全文 引 用如下:

4. 回頭來解決剩下的中間檔案

其 實 nvcc 只 是個編譯 器 驅動,他會呼叫很多 cuda tools 去完成 各 個編譯步驟,最 後 呼叫

系統 的 c/cpp 編譯 器 (cl,gcc) 以及 鏈 接 器 。他的流程如下圖所示:

1 , cudafe.exe 去分 離 host code, device code ,生成 .gpu 等

2 , nvopencc( 我想應 該 就是 nvcc.exe 完成的 ) 編譯 .gpu 到 .ptx

3 , ptxas.exe 編譯 .ptx 到 .cubin

4 , fatbin.exe 編譯 .cubin 到 .fatbin.c ,最終集 合 到 .cu.cpp 或者 .cu.c 中。

CUDA nvcc編譯引數示例

nvcc中有控制程式相容性的引數,本節主要講這些引數,如果對原理想有了解見cuda nvcc編譯過程和相容性詳解 cmake中的引數寫法和命令列的寫法都有。這種編譯要編譯成唯一的結果,即確定gpu物件,寫法如下 set cuda nvcc flags arch compute 60 code sm ...

CUDA nvcc編譯引數示例

cuda nvcc編譯引數示例 前言nvcc中有控制程式相容性的引數,本節主要講這些引數,如果對原理想有了解見cuda nvcc編譯過程和相容性詳解 cmake中的引數寫法和命令列的寫法都有。多種編譯寫法 虛擬架構 真實框架 這種編譯要編譯成唯一的結果,即確定gpu物件,寫法如下 set cuda ...

voreen編譯步驟

3 修改config default.txt為 config.txt。4 通過vs2008的qt外掛程式開啟voreen.pro。開啟之後編譯如果不成功,繼續下面的步驟。5 開啟vs2008的命令提示,進入到d voreen 2.5目錄,修改 qmake default.bat為 qmake.bat...