CUDA學習(一) NVCC的編譯過程

2021-09-20 10:30:50 字數 1568 閱讀 6660

nvcc的編譯過程總體可以用乙個圖進行描述:

nvcc的編譯過程分為離線編譯和即時編譯兩部分組成:

離線編譯(綠色虛線框內):

cuda源程式(即***.cu檔案)在編譯前的預處理會被分為主機端**和裝置段**(即圖中的左右分支):

1.如圖右分支:在裝置端**會被編譯成ptx檔案(可以看作是用於裝置端的彙編檔案)或是直接可執行的二進位制檔案***.cubin,然後將起.ptx/.cubin檔案放在fatbinary檔案中。

2.如圖左分支:在主機端**進行預處理,並將其嵌入到fatbinary檔案中,並將cuda特定的c++擴充套件轉換成標準c++結構(通過cudafe++和cudafe1.stub.c合成為。cudafe1.cpp),然後c++主機編譯器將所合成的主機**與嵌入的fatbinary編譯成主機.o/.obj檔案。

在主機裝置啟動**時,cuda run-time系統會對fatbinary檔案進行檢測,以獲得乙個對於gpu裝置合適的映像(之後還會提及):

1.如果之前的cubin檔案與當前gpu相匹配,run-time系統通過nvlink對多個裝置端檔案進行鏈結,最後通過host linker鏈結主機端檔案成可執行檔案。

2.如果cubin檔案所表示的虛擬裝置與當前gpu不符或者fatbinary檔案中只包含ptx檔案,將會對fatbinary檔案中的ptx檔案進行即時編譯,並對其進行鏈結(nvlink)最後通過host linker鏈結主機端檔案成可執行檔案。

nvcc極大的考慮到了應用的向後相容性,(如最上面圖的綠色實線寬內)將輸入裝置端**根據虛擬gpu結構(virtual architecture)編譯成ptx,以及通過當前的真實gpu結構將其編譯成cubin檔案,到時進行直接執行即可。(如圖1:virtual architecture)

由於ptx的存在,可以提高其相容性,通過在執行時對ptx進行即時編譯成cubin檔案並執行。(圖2:just-in-time compilation)

nvcc可以通過命令進行設定相應的virtual compute architecture和real sm architecture

nvcc ***.cu -arch=compute_30 -code=sm_30
其中 -arch=compute_30 是指對虛擬gpu體系結構配置為計算能力為3.0,生成相應的ptx;-code=sm_30則是將ptx檔案編譯成sm為3.0的cubin二進位制檔案。

注意:-arch 的配置一定要低於-code ,否者是無法進行編譯的。

由於nvcc編譯是支援向後編譯的,ptx是由虛擬體系結構進行編譯的,而現實版本比虛擬gpu體系結構還要低,這會導致無法執行。

nvcc編譯過程第二篇:

CUDA中NVCC的編譯器選項

cuda bin path nvcc.exe ccbin vcinstalldir bin c d debug dwin32 d console d mbcs xcompiler ehsc,w3,nologo,wp64,od,zi,rtc1,mtd i cuda inc path i.i.commo...

CUDA編譯器nvcc的用法用例與問題簡答

書寫makefile時,使用 fopenmp命令選項時會報nvcc fatal unknown option fopenmp 錯誤。正確的編譯選項是 xcompiler fopenmp在核心中呼叫原子函式 例如atomicadd 時,如果編譯的時候出現 error identifier atomic...

cuda學習筆記(一)儲存

1.乙個gpu 上有很多的sm stream multiprocessor 每個 sm中包括了8個 sp stream processor 標量流處理器,商業宣傳中所說的數百個 核 大多指的是 sp的數量。隸屬於同乙個sm的 sp共用同一套取指與發射單元。cuda 中的kernel 是以block ...