將test.cu**進行分離,利用cudafe.exe 去分離cpu**和gpu**,我們可以在生成的中間檔案可以看到test.cudafe1.cpp和test.cudafe1.gpu
cicc.exe 將根據編譯選項-arch=compute_xx將gpu**編譯成對應架構的test.ptx檔案
ptxas.exe 編譯 test.ptx 到test.cubin,這個是根據編譯選項-code=sm_xx定義的,比如test.sm_30.cubin.(這一步叫做ptx離線編譯,主要的目的是為了將**編譯成乙個確定的計算能力和sm版本,對應的版本資訊儲存在cubin中)
呼叫系統的gcc/g++將host**(test.cudafe1.cpp)和fatbin(text.fatbin.c)編譯成對應的目標檔案test.o 和test._dlink.o。
用c++編譯器將目標檔案鏈結起來生成可執行檔案。
nvcc --cuda test.cu --keep --dryrun
nvcc -o test test.cu -arch=compute_35 -code=sm_70 --keep --verbose具體小步驟
cicc *** -arch compute_35 -o test.ptx// 可以看出ptx是根據arch來設定的一般都是只使用乙個-arch, 這樣預設你的arch和code是同乙個架構算力,比如-arch=sm_70。感覺英偉達這搞得一點也不規範,都出亂編,也沒個統一的標準。ptxas -arch=sm_70 -m64 「test.ptx」 -o 「test.cubin」//本地二進位制檔案是根據sm_70來設定,至於為用的是arch,這就是nvcc瞎寫
fatbinary --create=「test.fatbin」 -64 「–image=profile=sm_70,file=test.cubin」 --embedded-fatbin=「test.fatbin.c」 --cuda(這裡面沒有將ptx放進去不知道什麼情況,當只有arch乙個引數的時候ptx和cubin都會放入fatbin.c裡面)
fatbinary機制。exe二進位制檔案中會包含乙個或多個體繫結構的二進位制**以及ptx**來完全避免jit成本。cuda執行時會在二進位制檔案中查詢當前gpu架構的**,並在找到時執行它。如果找不到二進位制**,但ptx可用,則驅動程式將編譯ptx**。這樣,部署的cuda應用程式可以在新gpu出現時支援它們。nvcc x.cu -arch=compute_10 -code=compute_10,sm_10,sm_13,比如這一段程式,編譯出來的**就會有10,13兩個二進位制,實際遇到了這類gpu就直接使用,否則就把compute_10.ptx執行時編譯一波。
快取機制。 如果在code中沒有指示出來實際執行的gpu, 理論來說你在a這個gpu上執行的時候,每次都要jit,為此cuda做了乙個優化,就是將它第一次接觸過得gpu卡即時編譯後快取一起,也就是說第一次在a卡編譯後,下次再執行就直接可以呼叫快取裡面的二進位制了,理論上來說就是放在-code=sm_10, a,sm_20,不過a是在遇到a之後才編譯的-arch 的配置一定要低於-code ,想想看,你乙個-arch=compute_70的 **.ptx很難去編譯出乙個code=sm_30的二進位制**,因為很多架構是70的機器上的特性,在30的機器上壓根都沒有,比如tensorcore什麼的,所以這個要注意。
CUDA學習(一) NVCC的編譯過程
nvcc的編譯過程總體可以用乙個圖進行描述 nvcc的編譯過程分為離線編譯和即時編譯兩部分組成 離線編譯 綠色虛線框內 cuda源程式 即 cu檔案 在編譯前的預處理會被分為主機端 和裝置段 即圖中的左右分支 1.如圖右分支 在裝置端 會被編譯成ptx檔案 可以看作是用於裝置端的彙編檔案 或是直接可...
cuda編譯錯誤
error lnk2019 無法解析的外部符號 cudadevicesynchronize error lnk2019 無法解析的外部符號 cudaconfigurecall error lnk2019 無法解析的外部符號 cudasetupargument error lnk2019 無法解析的外...
ffmpeg編譯支援cuda編譯碼
今天在ffmpeg4.1下成功編譯出支援cuda編碼的版本,記錄一下編譯過程。編譯增加選項 enable cuda enable cuvid enable nvenc 如果遇到提示錯誤 error cuda requested,but not all dependencies are satisfi...